diff options
author | hobbs <hobbs> | 2006-10-31 01:42:25 (GMT) |
---|---|---|
committer | hobbs <hobbs> | 2006-10-31 01:42:25 (GMT) |
commit | 68d670bcf4084b9b910f9a94115271a454e20d49 (patch) | |
tree | 61d5e957eccfcba57b0dd27ebc73db085385834e /win/ttkWinMonitor.c | |
parent | 6c14c5897ab231a04b7e4edae08cb6f2cccbf7a1 (diff) | |
download | tk-68d670bcf4084b9b910f9a94115271a454e20d49.zip tk-68d670bcf4084b9b910f9a94115271a454e20d49.tar.gz tk-68d670bcf4084b9b910f9a94115271a454e20d49.tar.bz2 |
* doc/ttk_Geometry.3, doc/ttk_Theme.3, doc/ttk_button.n:
* doc/ttk_checkbutton.n, doc/ttk_combobox.n, doc/ttk_dialog.n:
* doc/ttk_entry.n, doc/ttk_frame.n, doc/ttk_image.n:
* doc/ttk_intro.n, doc/ttk_label.n, doc/ttk_labelframe.n:
* doc/ttk_menubutton.n, doc/ttk_notebook.n, doc/ttk_panedwindow.n:
* doc/ttk_progressbar.n, doc/ttk_radiobutton.n, doc/ttk_scrollbar.n:
* doc/ttk_separator.n, doc/ttk_sizegrip.n, doc/ttk_style.n:
* doc/ttk_treeview.n, doc/ttk_widget.n,:
* generic/ttk/ttk.decls, generic/ttk/ttkBlink.c:
* generic/ttk/ttkButton.c, generic/ttk/ttkCache.c:
* generic/ttk/ttkClamTheme.c, generic/ttk/ttkClassicTheme.c:
* generic/ttk/ttkDecls.h, generic/ttk/ttkDefaultTheme.c:
* generic/ttk/ttkElements.c, generic/ttk/ttkEntry.c:
* generic/ttk/ttkFrame.c, generic/ttk/ttkImage.c:
* generic/ttk/ttkInit.c, generic/ttk/ttkLabel.c:
* generic/ttk/ttkLayout.c, generic/ttk/ttkManager.c:
* generic/ttk/ttkManager.h, generic/ttk/ttkNotebook.c:
* generic/ttk/ttkPanedwindow.c, generic/ttk/ttkProgress.c:
* generic/ttk/ttkScale.c, generic/ttk/ttkScroll.c:
* generic/ttk/ttkScrollbar.c, generic/ttk/ttkSeparator.c:
* generic/ttk/ttkSquare.c, generic/ttk/ttkState.c:
* generic/ttk/ttkStubInit.c, generic/ttk/ttkStubLib.c:
* generic/ttk/ttkTagSet.c, generic/ttk/ttkTheme.c:
* generic/ttk/ttkTheme.h, generic/ttk/ttkThemeInt.h:
* generic/ttk/ttkTrace.c, generic/ttk/ttkTrack.c:
* generic/ttk/ttkTreeview.c, generic/ttk/ttkWidget.c:
* generic/ttk/ttkWidget.h:
* library/demos/ttk_demo.tcl, library/demos/ttk_iconlib.tcl:
* library/demos/ttk_repeater.tcl:
* library/ttk/altTheme.tcl, library/ttk/aquaTheme.tcl:
* library/ttk/button.tcl, library/ttk/clamTheme.tcl:
* library/ttk/classicTheme.tcl, library/ttk/combobox.tcl:
* library/ttk/cursors.tcl, library/ttk/defaults.tcl:
* library/ttk/dialog.tcl, library/ttk/entry.tcl:
* library/ttk/fonts.tcl, library/ttk/icons.tcl:
* library/ttk/keynav.tcl, library/ttk/menubutton.tcl:
* library/ttk/notebook.tcl, library/ttk/panedwindow.tcl:
* library/ttk/progress.tcl, library/ttk/scale.tcl:
* library/ttk/scrollbar.tcl, library/ttk/sizegrip.tcl:
* library/ttk/treeview.tcl, library/ttk/ttk.tcl:
* library/ttk/utils.tcl, library/ttk/winTheme.tcl:
* library/ttk/xpTheme.tcl:
* macosx/ttkMacOSXTheme.c:
* tests/ttk/all.tcl, tests/ttk/bwidget.test, tests/ttk/combobox.test:
* tests/ttk/entry.test, tests/ttk/image.test:
* tests/ttk/labelframe.test, tests/ttk/layout.test:
* tests/ttk/misc.test, tests/ttk/notebook.test:
* tests/ttk/panedwindow.test, tests/ttk/progressbar.test:
* tests/ttk/scrollbar.test, tests/ttk/treetags.test:
* tests/ttk/treeview.test, tests/ttk/ttk.test, tests/ttk/validate.test:
* win/ttkWinMonitor.c, win/ttkWinTheme.c, win/ttkWinXPTheme.c:
First import of Ttk themed Tk widgets as branched from tile 0.7.8
* generic/tkInt.h, generic/tkWindow.c: add Ttk_Init call, copy
tk classic widgets to ::tk namespace.
* library/tk.tcl: add source of ttk/ttk.tcl, define $::ttk::library.
* unix/Makefile.in, win/Makefile.in: add Ttk build bits
* win/configure, win/configure.in: check for uxtheme.h (XP theme).
Diffstat (limited to 'win/ttkWinMonitor.c')
-rw-r--r-- | win/ttkWinMonitor.c | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/win/ttkWinMonitor.c b/win/ttkWinMonitor.c new file mode 100644 index 0000000..b13c36d --- /dev/null +++ b/win/ttkWinMonitor.c @@ -0,0 +1,164 @@ +/* $Id: ttkWinMonitor.c,v 1.1 2006/10/31 01:42:28 hobbs Exp $ + */ + +#ifdef _MSC_VER +#define WIN32_LEAN_AND_MEAN +#endif + +#include <windows.h> +#include <tcl.h> +#include <tk.h> +#include <tkPlatDecls.h> +#include "ttk/ttkTheme.h" + +#if !defined(WM_THEMECHANGED) +#define WM_THEMECHANGED 0x031A +#endif + +static LRESULT WINAPI WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp); + +/* + * RegisterSystemColors -- + * Register all known Windows system colors (as per GetSysColor) + * as Tk named colors. + */ + +typedef struct { + const char *name; + int index; +} SystemColorEntry; + +static SystemColorEntry sysColors[] = { + { "System3dDarkShadow", COLOR_3DDKSHADOW }, + { "System3dLight", COLOR_3DLIGHT }, + { "SystemActiveBorder", COLOR_ACTIVEBORDER }, + { "SystemActiveCaption", COLOR_ACTIVECAPTION }, + { "SystemAppWorkspace", COLOR_APPWORKSPACE }, + { "SystemBackground", COLOR_BACKGROUND }, + { "SystemButtonFace", COLOR_BTNFACE }, + { "SystemButtonHighlight", COLOR_BTNHIGHLIGHT }, + { "SystemButtonShadow", COLOR_BTNSHADOW }, + { "SystemButtonText", COLOR_BTNTEXT }, + { "SystemCaptionText", COLOR_CAPTIONTEXT }, + { "SystemDisabledText", COLOR_GRAYTEXT }, + { "SystemGrayText", COLOR_GRAYTEXT }, + { "SystemHighlight", COLOR_HIGHLIGHT }, + { "SystemHighlightText", COLOR_HIGHLIGHTTEXT }, + { "SystemInactiveBorder", COLOR_INACTIVEBORDER }, + { "SystemInactiveCaption", COLOR_INACTIVECAPTION }, + { "SystemInactiveCaptionText", COLOR_INACTIVECAPTIONTEXT }, + { "SystemInfoBackground", COLOR_INFOBK }, + { "SystemInfoText", COLOR_INFOTEXT }, + { "SystemMenu", COLOR_MENU }, + { "SystemMenuText", COLOR_MENUTEXT }, + { "SystemScrollbar", COLOR_SCROLLBAR }, + { "SystemWindow", COLOR_WINDOW }, + { "SystemWindowFrame", COLOR_WINDOWFRAME }, + { "SystemWindowText", COLOR_WINDOWTEXT }, + { NULL, 0 } +}; + +static void RegisterSystemColors(Tcl_Interp *interp) +{ + Ttk_ResourceCache cache = Ttk_GetResourceCache(interp); + SystemColorEntry *sysColor; + + for (sysColor = sysColors; sysColor->name; ++sysColor) { + DWORD pixel = GetSysColor(sysColor->index); + XColor colorSpec; + colorSpec.red = GetRValue(pixel) * 257; + colorSpec.green = GetGValue(pixel) * 257; + colorSpec.blue = GetBValue(pixel) * 257; + Ttk_RegisterNamedColor(cache, sysColor->name, &colorSpec); + } +} + +static HWND +CreateThemeMonitorWindow(HINSTANCE hinst, Tcl_Interp *interp) +{ + WNDCLASSEX wc; + HWND hwnd = NULL; + CHAR title[32] = "TtkMonitorWindow"; + CHAR name[32] = "TtkMonitorClass"; + + wc.cbSize = sizeof(WNDCLASSEX); + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = (WNDPROC)WndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hinst; + wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); + wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = (HBRUSH)COLOR_WINDOW; + wc.lpszMenuName = name; + wc.lpszClassName = name; + + if (RegisterClassEx(&wc)) { + hwnd = CreateWindow( name, title, WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + NULL, NULL, hinst, NULL ); + SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG)interp); + ShowWindow(hwnd, SW_HIDE); + UpdateWindow(hwnd); + } + return hwnd; +} + +static void +DestroyThemeMonitorWindow(void *clientData) +{ + HWND hwnd = (HWND)clientData; + DestroyWindow(hwnd); +} + +static LRESULT WINAPI +WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) +{ + Tcl_Interp *interp = (Tcl_Interp *)GetWindowLongPtr(hwnd, GWLP_USERDATA); + Ttk_Theme theme; + + switch (msg) { + case WM_DESTROY: + break; + + case WM_SYSCOLORCHANGE: + RegisterSystemColors(interp); + break; + + case WM_THEMECHANGED: + /* + * Reset the application theme to 'xpnative' if present, + * which will in turn fall back to 'winnative' if XP theming + * is disabled. + */ + theme = Ttk_GetTheme(interp, "xpnative"); + if (theme) { + Ttk_UseTheme(interp, theme); + /* @@@ What to do about errors here? */ + } + break; + } + return DefWindowProc(hwnd, msg, wp, lp); +} + +/* + * Windows-specific platform initialization: + */ + +extern int WinTheme_Init(Tcl_Interp *, HWND hwnd); +extern int XPTheme_Init(Tcl_Interp *, HWND hwnd); + +int Ttk_WinPlatformInit(Tcl_Interp *interp) +{ + HWND hwnd; + + hwnd = CreateThemeMonitorWindow(Tk_GetHINSTANCE(), interp); + Ttk_RegisterCleanup(interp, (ClientData)hwnd, DestroyThemeMonitorWindow); + + WinTheme_Init(interp, hwnd); + XPTheme_Init(interp, hwnd); + + return TCL_OK; +} + |