summaryrefslogtreecommitdiffstats
path: root/win/tkWinWm.c
diff options
context:
space:
mode:
authorhobbs <hobbs>2007-12-05 19:18:08 (GMT)
committerhobbs <hobbs>2007-12-05 19:18:08 (GMT)
commita05cae50c0a6c2f7e000833763210c1835d9d127 (patch)
treed6987c498f41a1e9e755b3e5031da0856ec5decb /win/tkWinWm.c
parent1fc7c9b35eee3280cb516dcd7b12d876948e94fe (diff)
downloadtk-a05cae50c0a6c2f7e000833763210c1835d9d127.zip
tk-a05cae50c0a6c2f7e000833763210c1835d9d127.tar.gz
tk-a05cae50c0a6c2f7e000833763210c1835d9d127.tar.bz2
* win/tkWinInt.h: remove CS_CLASSDC (not recommended for any apps now)
* win/tkWinX.c: and simplify WNDCLASS to one style. * win/tkWinWm.c: Reduce wrapper update for exStyle to toolwindow change only and set WS_EX_LAYERED as sticky (once set on a window, do not remove it) to reduce alpha transition flicker.
Diffstat (limited to 'win/tkWinWm.c')
-rw-r--r--win/tkWinWm.c90
1 files changed, 31 insertions, 59 deletions
diff --git a/win/tkWinWm.c b/win/tkWinWm.c
index 72f1cb2..2cc885c 100644
--- a/win/tkWinWm.c
+++ b/win/tkWinWm.c
@@ -12,7 +12,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkWinWm.c,v 1.54.2.27 2007/06/10 00:15:35 hobbs Exp $
+ * RCS: @(#) $Id: tkWinWm.c,v 1.54.2.28 2007/12/05 19:18:09 hobbs Exp $
*/
#include "tkWinInt.h"
@@ -871,20 +871,7 @@ InitWindowClass(WinIconPtr titlebaricon)
*/
ZeroMemory(&class, sizeof(WNDCLASS));
- /*
- * When threads are enabled, we cannot use CLASSDC because
- * threads will then write into the same device context.
- *
- * This is a hack; we should add a subsystem that manages
- * device context on a per-thread basis. See also tkWinX.c,
- * which also initializes a WNDCLASS structure.
- */
-
-#ifdef TCL_THREADS
class.style = CS_HREDRAW | CS_VREDRAW;
-#else
- class.style = CS_HREDRAW | CS_VREDRAW | CS_CLASSDC;
-#endif
class.hInstance = Tk_GetHINSTANCE();
Tcl_WinUtfToTChar(TK_WIN_TOPLEVEL_CLASS_NAME, -1, &classString);
class.lpszClassName = (LPCTSTR) Tcl_DStringValue(&classString);
@@ -908,22 +895,6 @@ InitWindowClass(WinIconPtr titlebaricon)
Tcl_Panic("Unable to register TkTopLevel class");
}
-#ifndef TCL_THREADS
- /*
- * Use of WS_EX_LAYERED disallows CS_CLASSDC, as does
- * TCL_THREADS usage, so only create this if necessary.
- */
- if (setLayeredWindowAttributesProc != NULL) {
- class.style = CS_HREDRAW | CS_VREDRAW;
- Tcl_DStringFree(&classString);
- Tcl_WinUtfToTChar(TK_WIN_TOPLEVEL_NOCDC_CLASS_NAME,
- -1, &classString);
- class.lpszClassName = (LPCTSTR) Tcl_DStringValue(&classString);
- if (!(*tkWinProcs->registerClass)(&class)) {
- Tcl_Panic("Unable to register TkTopLevelNoCDC class");
- }
- }
-#endif
Tcl_DStringFree(&classString);
}
Tcl_MutexUnlock(&winWmMutex);
@@ -1845,15 +1816,6 @@ TkWinWmCleanup(hInstance)
tsdPtr->initialized = 0;
UnregisterClass(TK_WIN_TOPLEVEL_CLASS_NAME, hInstance);
-#ifndef TCL_THREADS
- /*
- * Clean up specialized class created for layered windows.
- */
- if (setLayeredWindowAttributesProc != NULL) {
- UnregisterClass(TK_WIN_TOPLEVEL_NOCDC_CLASS_NAME, hInstance);
- setLayeredWindowAttributesProc = NULL;
- }
-#endif
}
/*
@@ -2053,6 +2015,10 @@ UpdateWrapper(winPtr)
* Compute the geometry of the parent and child windows.
*/
+ if ((wmPtr->flags & WM_UPDATE_PENDING)) {
+ Tcl_CancelIdleCall(UpdateGeometryInfo, (ClientData) winPtr);
+ }
+
wmPtr->flags |= WM_CREATE_PENDING|WM_MOVE_PENDING;
UpdateGeometryInfo((ClientData)winPtr);
wmPtr->flags &= ~(WM_CREATE_PENDING|WM_MOVE_PENDING);
@@ -2083,17 +2049,7 @@ UpdateWrapper(winPtr)
tsdPtr->createWindow = winPtr;
Tcl_WinUtfToTChar(((wmPtr->title != NULL) ?
wmPtr->title : winPtr->nameUid), -1, &titleString);
-#ifndef TCL_THREADS
- /*
- * Transparent windows require a non-CS_CLASSDC window class.
- */
- if ((wmPtr->exStyleConfig & WS_EX_LAYERED)
- && setLayeredWindowAttributesProc != NULL) {
- Tcl_WinUtfToTChar(TK_WIN_TOPLEVEL_NOCDC_CLASS_NAME,
- -1, &classString);
- } else
-#endif
- Tcl_WinUtfToTChar(TK_WIN_TOPLEVEL_CLASS_NAME, -1, &classString);
+ Tcl_WinUtfToTChar(TK_WIN_TOPLEVEL_CLASS_NAME, -1, &classString);
wmPtr->wrapper = (*tkWinProcs->createWindowEx)(wmPtr->exStyle,
(LPCTSTR) Tcl_DStringValue(&classString),
(LPCTSTR) Tcl_DStringValue(&titleString),
@@ -2885,7 +2841,7 @@ WmAttributesCmd(tkwin, winPtr, interp, objc, objv)
register WmInfo *wmPtr = winPtr->wmInfoPtr;
LONG style, exStyle, styleBit, *stylePtr;
char *string;
- int i, boolean, length;
+ int i, boolean, length, updatewrapper = 0;
if ((objc < 3) || ((objc > 5) && ((objc%2) == 0))) {
configArgs:
@@ -2941,6 +2897,12 @@ WmAttributesCmd(tkwin, winPtr, interp, objc, objv)
&& (strncmp(string, "-toolwindow", length) == 0)) {
stylePtr = &exStyle;
styleBit = WS_EX_TOOLWINDOW;
+ if (objc != 4) {
+ /*
+ * Changes to toolwindow style require an update
+ */
+ updatewrapper = 1;
+ }
} else if ((length > 3)
&& (strncmp(string, "-topmost", length) == 0)) {
stylePtr = &exStyle;
@@ -3010,10 +2972,14 @@ WmAttributesCmd(tkwin, winPtr, interp, objc, objv)
}
}
+ /*
+ * Only ever add the WS_EX_LAYERED bit, as it can cause
+ * flashing to change this window style. This allows things
+ * like fading tooltips to avoid flash ugliness without
+ * forcing all window to be layered.
+ */
if ((wmPtr->alpha < 1.0) || (wmPtr->crefObj != NULL)) {
*stylePtr |= styleBit;
- } else {
- *stylePtr &= ~styleBit;
}
if ((setLayeredWindowAttributesProc != NULL)
&& (wmPtr->wrapper != NULL)) {
@@ -3023,6 +2989,10 @@ WmAttributesCmd(tkwin, winPtr, interp, objc, objv)
* wants an int (transparent) 0..255 (opaque), so do the
* translation. Add the 0.5 to round the value.
*/
+ if (!(wmPtr->exStyleConfig & WS_EX_LAYERED)) {
+ SetWindowLongPtr(wmPtr->wrapper, GWL_EXSTYLE,
+ *stylePtr);
+ }
setLayeredWindowAttributesProc((HWND) wmPtr->wrapper,
wmPtr->colorref, (BYTE) (wmPtr->alpha * 255 + 0.5),
LWA_ALPHA | (wmPtr->crefObj ? LWA_COLORKEY : 0));
@@ -3067,13 +3037,15 @@ WmAttributesCmd(tkwin, winPtr, interp, objc, objv)
}
}
if (wmPtr->exStyleConfig != exStyle) {
- /*
- * UpdateWrapper ensure that all effects are properly handled,
- * such as TOOLWINDOW disappearing from the taskbar.
- */
wmPtr->exStyleConfig = exStyle;
- if (!(wmPtr->flags & WM_NEVER_MAPPED)) {
- UpdateWrapper(winPtr);
+ if (updatewrapper) {
+ /*
+ * UpdateWrapper ensure that all effects are properly handled,
+ * such as TOOLWINDOW disappearing from the taskbar.
+ */
+ if (!(wmPtr->flags & WM_NEVER_MAPPED)) {
+ UpdateWrapper(winPtr);
+ }
}
}
return TCL_OK;