diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | generic/tkCmds.c | 16 | ||||
-rw-r--r-- | generic/tkInt.h | 12 | ||||
-rw-r--r-- | unix/tkUnixWm.c | 44 | ||||
-rw-r--r-- | win/tkWinWm.c | 141 |
5 files changed, 158 insertions, 63 deletions
@@ -1,9 +1,15 @@ 2002-06-14 Jeff Hobbs <jeffh@ActiveState.com> + * generic/tkInt.h: + * generic/tkCmds.c (Tk_WmObjCmd): + * unix/tkUnixWm.c (Tk_WmCmd): + * win/tkWinWm.c (Tk_WmCmd): changed wmTracing from being an int to + just a bit in the flags variable (TK_DISPLAY_WM_TRACING) + * generic/tkEvent.c (Tk_HandleEvent): * unix/tkUnixEvent.c (OpenIM): * unix/tkUnixKey.c (TkpGetString): - * generic/tkInt.h: added TK_USE_XIM_SPOT flag bit for TkDisplay + * generic/tkInt.h: added TK_DISPLAY_XIM_SPOT flag bit for TkDisplay and used this to allow a runtime check to see if over-the-spot XIM is possible. If not it will try and fallback to the old-style input context, which handles things like dead keys input. diff --git a/generic/tkCmds.c b/generic/tkCmds.c index 1ef3361..16739c2 100644 --- a/generic/tkCmds.c +++ b/generic/tkCmds.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkCmds.c,v 1.24 2002/06/14 22:25:12 jenglish Exp $ + * RCS: @(#) $Id: tkCmds.c,v 1.25 2002/06/15 01:54:47 hobbs Exp $ */ #include "tkPort.h" @@ -1629,6 +1629,7 @@ Tk_WmObjCmd(clientData, interp, objc, objv) } if (index == TKWM_TRACING) { + int wmTracing; TkDisplay *dispPtr = ((TkWindow *) tkwin)->dispPtr; if ((objc != 2) && (objc != 3)) { @@ -1636,10 +1637,19 @@ Tk_WmObjCmd(clientData, interp, objc, objv) return TCL_ERROR; } if (objc == 2) { - Tcl_SetObjResult(interp, Tcl_NewBooleanObj(dispPtr->wmTracing)); + Tcl_SetObjResult(interp, + Tcl_NewBooleanObj(dispPtr->flags & TK_DISPLAY_WM_TRACING)); return TCL_OK; } - return Tcl_GetBooleanFromObj(interp, objv[2], &dispPtr->wmTracing); + if (Tcl_GetBooleanFromObj(interp, objv[2], &wmTracing) != TCL_OK) { + return TCL_ERROR; + } + if (wmTracing) { + dispPtr->flags |= TK_DISPLAY_WM_TRACING; + } else { + dispPtr->flags &= ~TK_DISPLAY_WM_TRACING; + } + return TCL_OK; } if (objc < 3) { diff --git a/generic/tkInt.h b/generic/tkInt.h index f0c80a3..f7b260a 100644 --- a/generic/tkInt.h +++ b/generic/tkInt.h @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: $Id: tkInt.h,v 1.46 2002/06/15 01:09:36 hobbs Exp $ + * RCS: $Id: tkInt.h,v 1.47 2002/06/15 01:54:47 hobbs Exp $ */ #ifndef _TKINT @@ -432,11 +432,6 @@ typedef struct TkDisplay { * Information used by tkUnixWm.c and tkWinWm.c only: */ - int wmTracing; /* Used to enable or disable tracing in - * this module. If tracing is enabled, - * then information is printed on - * standard output about interesting - * interactions with the window manager. */ struct TkWmInfo *firstWmPtr; /* Points to first top-level window. */ struct TkWmInfo *foregroundWmPtr; /* Points to the foreground window. */ @@ -501,12 +496,13 @@ typedef struct TkDisplay { * Flag values for TkDisplay flags. * TK_DISPLAY_COLLAPSE_MOTION_EVENTS: (default on) * Indicates that we should collapse motion events on this display - * TK_USE_INPUT_METHODS: (default off) + * TK_DISPLAY_XIM_SPOT: (default off) * Indicates that we should use over-the-spot XIM on this display */ #define TK_DISPLAY_COLLAPSE_MOTION_EVENTS (1 << 0) -#define TK_USE_XIM_SPOT (1 << 1) +#define TK_DISPLAY_XIM_SPOT (1 << 1) +#define TK_DISPLAY_WM_TRACING (1 << 2) /* * One of the following structures exists for each error handler diff --git a/unix/tkUnixWm.c b/unix/tkUnixWm.c index ad0b662..55f8c4d 100644 --- a/unix/tkUnixWm.c +++ b/unix/tkUnixWm.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: tkUnixWm.c,v 1.22 2002/06/14 22:25:12 jenglish Exp $ + * RCS: @(#) $Id: tkUnixWm.c,v 1.23 2002/06/15 01:54:47 hobbs Exp $ */ #include "tkPort.h" @@ -886,17 +886,27 @@ Tk_WmCmd(clientData, interp, argc, argv) length = strlen(argv[1]); if ((c == 't') && (strncmp(argv[1], "tracing", length) == 0) && (length >= 3)) { + int wmTracing; if ((argc != 2) && (argc != 3)) { Tcl_AppendResult(interp, "wrong # arguments: must be \"", argv[0], " tracing ?boolean?\"", (char *) NULL); return TCL_ERROR; } if (argc == 2) { - Tcl_SetResult(interp, ((dispPtr->wmTracing) ? "on" : "off"), + Tcl_SetResult(interp, + ((dispPtr->flags & TK_DISPLAY_WM_TRACING) ? "on" : "off"), TCL_STATIC); return TCL_OK; } - return Tcl_GetBoolean(interp, argv[2], &dispPtr->wmTracing); + if (Tcl_GetBoolean(interp, argv[2], &wmTracing) != TCL_OK) { + return TCL_ERROR; + } + if (wmTracing) { + dispPtr->flags |= TK_DISPLAY_WM_TRACING; + } else { + dispPtr->flags &= ~TK_DISPLAY_WM_TRACING; + } + return TCL_OK; } if (argc < 3) { @@ -2403,7 +2413,7 @@ ConfigureEvent(wmPtr, configEventPtr) if (((wrapperPtr->changes.width != configEventPtr->width) || (wrapperPtr->changes.height != configEventPtr->height)) && !(wmPtr->flags & WM_SYNC_PENDING)){ - if (dispPtr->wmTracing) { + if (dispPtr->flags & TK_DISPLAY_WM_TRACING) { printf("TopLevelEventProc: user changed %s size to %dx%d\n", winPtr->pathName, configEventPtr->width, configEventPtr->height); @@ -2467,7 +2477,7 @@ ConfigureEvent(wmPtr, configEventPtr) wmPtr->configHeight = configEventPtr->height; } - if (dispPtr->wmTracing) { + if (dispPtr->flags & TK_DISPLAY_WM_TRACING) { printf("ConfigureEvent: %s x = %d y = %d, width = %d, height = %d\n", winPtr->pathName, configEventPtr->x, configEventPtr->y, configEventPtr->width, configEventPtr->height); @@ -2497,7 +2507,7 @@ ConfigureEvent(wmPtr, configEventPtr) * there is a parent shrink-wrapped around the window. */ - if (dispPtr->wmTracing) { + if (dispPtr->flags & TK_DISPLAY_WM_TRACING) { printf(" %s parent == %p, above %p\n", winPtr->pathName, (void *) wmPtr->reparent, (void *) configEventPtr->above); @@ -2606,7 +2616,7 @@ ReparentEvent(wmPtr, reparentEventPtr) && (actualType == XA_WINDOW))) { if ((actualFormat == 32) && (numItems == 1)) { vRoot = wmPtr->vRoot = *virtualRootPtr; - } else if (dispPtr->wmTracing) { + } else if (dispPtr->flags & TK_DISPLAY_WM_TRACING) { printf("%s format %d numItems %ld\n", "ReparentEvent got bogus VROOT property:", actualFormat, numItems); @@ -2615,7 +2625,7 @@ ReparentEvent(wmPtr, reparentEventPtr) } Tk_DeleteErrorHandler(handler); - if (dispPtr->wmTracing) { + if (dispPtr->flags & TK_DISPLAY_WM_TRACING) { printf("ReparentEvent: %s (%p) reparented to 0x%x, vRoot = 0x%x\n", wmPtr->winPtr->pathName, wmPtr->winPtr, (unsigned int) reparentEventPtr->parent, (unsigned int) vRoot); @@ -2781,7 +2791,7 @@ ComputeReparentGeometry(wmPtr) wrapperPtr->changes.x = x + wmPtr->xInParent; wrapperPtr->changes.y = y + wmPtr->yInParent; - if (dispPtr->wmTracing) { + if (dispPtr->flags & TK_DISPLAY_WM_TRACING) { printf("wrapperPtr %p coords %d,%d\n", wrapperPtr, wrapperPtr->changes.x, wrapperPtr->changes.y); printf(" wmPtr %p coords %d,%d, offsets %d %d\n", @@ -2835,7 +2845,7 @@ WrapperEventProc(clientData, eventPtr) Tk_DestroyWindow((Tk_Window) wmPtr->winPtr); Tk_DeleteErrorHandler(handler); } - if (dispPtr->wmTracing) { + if (dispPtr->flags & TK_DISPLAY_WM_TRACING) { printf("TopLevelEventProc: %s deleted\n", wmPtr->winPtr->pathName); } } else if (eventPtr->type == ConfigureNotify) { @@ -3099,7 +3109,7 @@ UpdateGeometryInfo(clientData) } wmPtr->configWidth = width; wmPtr->configHeight = height; - if (winPtr->dispPtr->wmTracing) { + if (winPtr->dispPtr->flags & TK_DISPLAY_WM_TRACING) { printf("UpdateGeometryInfo moving to %d %d, resizing to %d x %d,\n", x, y, width, height); } @@ -3120,7 +3130,7 @@ UpdateGeometryInfo(clientData) } wmPtr->configWidth = width; wmPtr->configHeight = height; - if (winPtr->dispPtr->wmTracing) { + if (winPtr->dispPtr->flags & TK_DISPLAY_WM_TRACING) { printf("UpdateGeometryInfo resizing %p to %d x %d\n", (void *)wmPtr->wrapperPtr->window, width, height); } @@ -3321,7 +3331,7 @@ WaitForConfigureNotify(winPtr, serial) code = WaitForEvent(winPtr->display, wmPtr, ConfigureNotify, &event); wmPtr->flags &= ~WM_SYNC_PENDING; if (code != TCL_OK) { - if (winPtr->dispPtr->wmTracing) { + if (winPtr->dispPtr->flags & TK_DISPLAY_WM_TRACING) { printf("WaitForConfigureNotify giving up on %s\n", winPtr->pathName); } @@ -3333,7 +3343,7 @@ WaitForConfigureNotify(winPtr, serial) } } wmPtr->flags &= ~WM_MOVE_PENDING; - if (winPtr->dispPtr->wmTracing) { + if (winPtr->dispPtr->flags & TK_DISPLAY_WM_TRACING) { printf("WaitForConfigureNotify finished with %s, serial %ld\n", winPtr->pathName, serial); } @@ -3510,14 +3520,14 @@ WaitForMapNotify(winPtr, mapped) * just quit. */ - if (winPtr->dispPtr->wmTracing) { + if (winPtr->dispPtr->flags & TK_DISPLAY_WM_TRACING) { printf("WaitForMapNotify giving up on %s\n", winPtr->pathName); } break; } } wmPtr->flags &= ~WM_MOVE_PENDING; - if (winPtr->dispPtr->wmTracing) { + if (winPtr->dispPtr->flags & TK_DISPLAY_WM_TRACING) { printf("WaitForMapNotify finished with %s (winPtr %p, wmPtr %p)\n", winPtr->pathName, winPtr, wmPtr); } @@ -4039,7 +4049,7 @@ UpdateVRootGeometry(wmPtr) (unsigned int *) &wmPtr->vRootWidth, (unsigned int *) &wmPtr->vRootHeight, (unsigned int *) &bd, &dummy); - if (winPtr->dispPtr->wmTracing) { + if (winPtr->dispPtr->flags & TK_DISPLAY_WM_TRACING) { printf("UpdateVRootGeometry: x = %d, y = %d, width = %d, ", wmPtr->vRootX, wmPtr->vRootY, wmPtr->vRootWidth); printf("height = %d, status = %d\n", wmPtr->vRootHeight, status); diff --git a/win/tkWinWm.c b/win/tkWinWm.c index 46390da..0858d10 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.40 2002/06/14 22:25:12 jenglish Exp $ + * RCS: @(#) $Id: tkWinWm.c,v 1.41 2002/06/15 01:54:48 hobbs Exp $ */ #include "tkWinInt.h" @@ -103,10 +103,10 @@ typedef struct { DWORD dwImageOffset; /* where in the file is this image */ } ICONDIRENTRY, *LPICONDIRENTRY; typedef struct { - WORD idReserved; /* Reserved */ - WORD idType; /* resource type (1 for icons) */ - WORD idCount; /* how many images? */ - ICONDIRENTRY idEntries[1]; /* the entries for each image */ + WORD idReserved; /* Reserved */ + WORD idType; /* resource type (1 for icons) */ + WORD idCount; /* how many images? */ + ICONDIRENTRY idEntries[1]; /* the entries for each image */ } ICONDIR, *LPICONDIR; /* @@ -225,6 +225,8 @@ typedef struct TkWmInfo { * to eliminate redundant resize operations. */ HMENU hMenu; /* the hMenu associated with this menu */ DWORD style, exStyle; /* Style flags for the wrapper window. */ + LONG styleConfig; /* Extra user requested style bits */ + LONG exStyleConfig; /* Extra user requested extended style bits */ /* * List of children of the toplevel which have private colormaps. @@ -1398,12 +1400,13 @@ TkWmNewWindow(winPtr) register WmInfo *wmPtr; wmPtr = (WmInfo *) ckalloc(sizeof(WmInfo)); + + /* + * Initialize full structure, then set what isn't NULL + */ + ZeroMemory(wmPtr, sizeof(WmInfo)); winPtr->wmInfoPtr = wmPtr; wmPtr->winPtr = winPtr; - wmPtr->wrapper = NULL; - wmPtr->titleUid = NULL; - wmPtr->iconName = NULL; - wmPtr->masterPtr = NULL; wmPtr->hints.flags = InputHint | StateHint; wmPtr->hints.input = True; wmPtr->hints.initial_state = NormalState; @@ -1412,23 +1415,16 @@ TkWmNewWindow(winPtr) wmPtr->hints.icon_x = wmPtr->hints.icon_y = 0; wmPtr->hints.icon_mask = None; wmPtr->hints.window_group = None; - wmPtr->leaderName = NULL; - wmPtr->icon = NULL; - wmPtr->iconFor = NULL; - wmPtr->sizeHintsFlags = 0; /* * Default the maximum dimensions to the size of the display. */ wmPtr->defMinWidth = wmPtr->defMinHeight = 0; - wmPtr->defMaxWidth = DisplayWidth(winPtr->display, - winPtr->screenNum); - wmPtr->defMaxHeight = DisplayHeight(winPtr->display, - winPtr->screenNum); + wmPtr->defMaxWidth = DisplayWidth(winPtr->display, winPtr->screenNum); + wmPtr->defMaxHeight = DisplayHeight(winPtr->display, winPtr->screenNum); wmPtr->minWidth = wmPtr->minHeight = 1; wmPtr->maxWidth = wmPtr->maxHeight = 0; - wmPtr->gridWin = NULL; wmPtr->widthInc = wmPtr->heightInc = 1; wmPtr->minAspect.x = wmPtr->minAspect.y = 1; wmPtr->maxAspect.x = wmPtr->maxAspect.y = 1; @@ -1436,23 +1432,12 @@ TkWmNewWindow(winPtr) wmPtr->gravity = NorthWestGravity; wmPtr->width = -1; wmPtr->height = -1; - wmPtr->hMenu = NULL; wmPtr->x = winPtr->changes.x; wmPtr->y = winPtr->changes.y; - wmPtr->borderWidth = 0; - wmPtr->borderHeight = 0; - - wmPtr->cmapList = NULL; - wmPtr->cmapCount = 0; - wmPtr->numTransients = 0; wmPtr->configWidth = -1; wmPtr->configHeight = -1; - wmPtr->protPtr = NULL; - wmPtr->cmdArgv = NULL; - wmPtr->clientMachine = NULL; wmPtr->flags = WM_NEVER_MAPPED; - wmPtr->iconPtr = NULL; wmPtr->nextPtr = winPtr->dispPtr->firstWmPtr; winPtr->dispPtr->firstWmPtr = wmPtr; @@ -1553,6 +1538,9 @@ UpdateWrapper(winPtr) wmPtr->exStyle = EX_TOPLEVEL_STYLE; } + wmPtr->style |= wmPtr->styleConfig; + wmPtr->exStyle |= wmPtr->exStyleConfig; + if ((wmPtr->flags & WM_WIDTH_NOT_RESIZABLE) && (wmPtr->flags & WM_HEIGHT_NOT_RESIZABLE)) { wmPtr->style &= ~ (WS_MAXIMIZEBOX | WS_SIZEBOX); @@ -2110,17 +2098,27 @@ Tk_WmCmd(clientData, interp, argc, argv) length = strlen(argv[1]); if ((c == 't') && (strncmp(argv[1], "tracing", length) == 0) && (length >= 3)) { + int wmTracing; if ((argc != 2) && (argc != 3)) { Tcl_AppendResult(interp, "wrong # arguments: must be \"", argv[0], " tracing ?boolean?\"", (char *) NULL); return TCL_ERROR; } if (argc == 2) { - Tcl_SetResult(interp, ((dispPtr->wmTracing) ? "on" : "off"), + Tcl_SetResult(interp, + ((dispPtr->flags & TK_DISPLAY_WM_TRACING) ? "on" : "off"), TCL_STATIC); return TCL_OK; } - return Tcl_GetBoolean(interp, argv[2], &dispPtr->wmTracing); + if (Tcl_GetBoolean(interp, argv[2], &wmTracing) != TCL_OK) { + return TCL_ERROR; + } + if (wmTracing) { + dispPtr->flags |= TK_DISPLAY_WM_TRACING; + } else { + dispPtr->flags &= ~TK_DISPLAY_WM_TRACING; + } + return TCL_OK; } if (argc < 3) { @@ -2136,7 +2134,81 @@ Tk_WmCmd(clientData, interp, argc, argv) return TCL_ERROR; } wmPtr = winPtr->wmInfoPtr; - if ((c == 'a') && (strncmp(argv[1], "aspect", length) == 0)) { + if ((c == 'a') && (strncmp(argv[1], "attributes", length) == 0) + && (length >= 2)) { + LONG style, exStyle, styleBit, *stylePtr; + char buf[TCL_INTEGER_SPACE]; + int i, boolean; + + if (argc < 3) { + configArgs: + Tcl_AppendResult(interp, "wrong # arguments: must be \"", + argv[0], " attributes window", + " ?-disabled ?bool??", + " ?-toolwindow ?bool??", + " ?-topmost ?bool??\"", + (char *) NULL); + return TCL_ERROR; + } + exStyle = wmPtr->exStyleConfig; + style = wmPtr->styleConfig; + if (argc == 3) { + sprintf(buf, "%d", ((style & WS_DISABLED) != 0)); + Tcl_AppendResult(interp, "-disabled ", buf, (char *) NULL); + sprintf(buf, "%d", ((exStyle & WS_EX_TOOLWINDOW) != 0)); + Tcl_AppendResult(interp, " -toolwindow ", buf, (char *) NULL); + sprintf(buf, "%d", ((exStyle & WS_EX_TOPMOST) != 0)); + Tcl_AppendResult(interp, " -topmost ", buf, (char *) NULL); + return TCL_OK; + } + for (i = 3; i < argc; i += 2) { + length = strlen(argv[i]); + if ((length < 2) || (argv[i][0] != '-')) { + goto configArgs; + } + if ((i < argc-1) && + (Tcl_GetBoolean(interp, argv[i+1], &boolean) != TCL_OK)) { + return TCL_ERROR; + } + if (strncmp(argv[i], "-disabled", length) == 0) { + stylePtr = &style; + styleBit = WS_DISABLED; + } else if ((strncmp(argv[i], "-toolwindow", length) == 0) + && (length >= 3)) { + stylePtr = &exStyle; + styleBit = WS_EX_TOOLWINDOW; + } else if ((strncmp(argv[i], "-topmost", length) == 0) + && (length >= 3)) { + stylePtr = &exStyle; + styleBit = WS_EX_TOPMOST; + if ((i < argc-1) && + (winPtr->flags & TK_EMBEDDED)) { + Tcl_AppendResult(interp, "can't set topmost flag on ", + winPtr->pathName, ": it is an embedded window", + (char *) NULL); + return TCL_ERROR; + } + } else { + goto configArgs; + } + if (i == argc-1) { + Tcl_SetIntObj(Tcl_GetObjResult(interp), + ((*stylePtr & styleBit) != 0)); + } else if (boolean) { + *stylePtr |= styleBit; + } else { + *stylePtr &= ~styleBit; + } + } + if ((wmPtr->styleConfig != style) || + (wmPtr->exStyleConfig != exStyle)) { + wmPtr->styleConfig = style; + wmPtr->exStyleConfig = exStyle; + UpdateWrapper(winPtr); + } + return TCL_OK; + } else if ((c == 'a') && (strncmp(argv[1], "aspect", length) == 0) + && (length >= 2)) { int numer1, denom1, numer2, denom2; if ((argc != 3) && (argc != 7)) { @@ -3675,7 +3747,7 @@ TopLevelReqProc(dummy, tkwin) WmInfo *wmPtr; wmPtr = winPtr->wmInfoPtr; - if (winPtr->flags & TK_EMBEDDED) { + if ((winPtr->flags & TK_EMBEDDED) && (wmPtr->wrapper != NULL)) { SendMessage(wmPtr->wrapper, TK_GEOMETRYREQ, Tk_ReqWidth(tkwin), Tk_ReqHeight(tkwin)); } @@ -3726,7 +3798,8 @@ UpdateGeometryInfo(clientData) * state of the window changes. */ - if (IsIconic(wmPtr->wrapper) || IsZoomed(wmPtr->wrapper)) { + if ((wmPtr->wrapper == NULL) + || IsIconic(wmPtr->wrapper) || IsZoomed(wmPtr->wrapper)) { return; } |