summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--win/tkWinMenu.c21
2 files changed, 24 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 0c42c86..7ca2d4d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-09-20 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * win/tkWinMenu.c (TkpPostMenu): disable menu animation in menus
+ with images to avoid clipping bug. [Bug 1329198]
+
2006-09-21 Donal K. Fellows <dkf@users.sf.net>
* generic/tkImgBmap.c (ImgBmapPostscript): Change 0 to NULL, since
diff --git a/win/tkWinMenu.c b/win/tkWinMenu.c
index 5b037dd..432e8db 100644
--- a/win/tkWinMenu.c
+++ b/win/tkWinMenu.c
@@ -10,7 +10,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkWinMenu.c,v 1.48 2006/05/25 23:50:31 hobbs Exp $
+ * RCS: @(#) $Id: tkWinMenu.c,v 1.49 2006/09/21 00:13:36 hobbs Exp $
*/
#define OEMRESOURCE
@@ -35,6 +35,10 @@
#define ALIGN_BITMAP_TOP 0x00000004
#define ALIGN_BITMAP_BOTTOM 0x00000008
+#ifndef TPM_NOANIMATION
+#define TPM_NOANIMATION 0x4000L
+#endif
+
/*
* Platform-specific menu flags:
*
@@ -721,11 +725,12 @@ TkpPostMenu(interp, menuPtr, x, y)
int y;
{
HMENU winMenuHdl = (HMENU) menuPtr->platformData;
- int result, flags;
+ int i, result, flags;
RECT noGoawayRect;
POINT point;
Tk_Window parentWindow = Tk_Parent(menuPtr->tkwin);
int oldServiceMode = Tcl_GetServiceMode();
+ TkMenuEntry *mePtr;
ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
@@ -788,6 +793,18 @@ TkpPostMenu(interp, menuPtr, x, y)
}
}
+ /*
+ * Disable menu animation if an image is present, as clipping isn't
+ * handled correctly with temp DCs. [Bug 1329198]
+ */
+ for (i = 0; i < menuPtr->numEntries; i++) {
+ mePtr = menuPtr->entries[i];
+ if (mePtr->image != NULL) {
+ flags |= TPM_NOANIMATION;
+ break;
+ }
+ }
+
TrackPopupMenu(winMenuHdl, flags, x, y, 0,
tsdPtr->menuHWND, &noGoawayRect);
Tcl_SetServiceMode(oldServiceMode);