summaryrefslogtreecommitdiffstats
path: root/unix/tkUnixWm.c
diff options
context:
space:
mode:
authorhobbs <hobbs>2001-08-28 19:41:55 (GMT)
committerhobbs <hobbs>2001-08-28 19:41:55 (GMT)
commitbb2e83f1a03683e1eab6fe2a31cf5c181caeee97 (patch)
treefb60f055996e578cc807a9f91e9bc65343346d74 /unix/tkUnixWm.c
parentab3740cf60e35ad20ac9a37728fa26fcf2fdf2f6 (diff)
downloadtk-bb2e83f1a03683e1eab6fe2a31cf5c181caeee97.zip
tk-bb2e83f1a03683e1eab6fe2a31cf5c181caeee97.tar.gz
tk-bb2e83f1a03683e1eab6fe2a31cf5c181caeee97.tar.bz2
* unix/tkUnixWm.c (TkWmRestackToplevel): reworked how
ConfigureNotify requests were handled in relation to the parent to avoid the problem with potential 'raise' delays on some wms. [Bug #220260] (baker) wms that were affected should notice the difference in tests unixWm-51.* not failing that failed before.
Diffstat (limited to 'unix/tkUnixWm.c')
-rw-r--r--unix/tkUnixWm.c35
1 files changed, 19 insertions, 16 deletions
diff --git a/unix/tkUnixWm.c b/unix/tkUnixWm.c
index 5eca42a..9fff250 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.8 2000/03/27 18:02:59 ericm Exp $
+ * RCS: @(#) $Id: tkUnixWm.c,v 1.9 2001/08/28 19:41:55 hobbs Exp $
*/
#include "tkPort.h"
@@ -300,7 +300,7 @@ static Tk_GeomMgr menubarMgrType = {
typedef struct WaitRestrictInfo {
Display *display; /* Window belongs to this display. */
- Window window; /* We're waiting for events on this window. */
+ WmInfo *wmInfoPtr;
int type; /* We only care about this type of event. */
XEvent *eventPtr; /* Where to store the event when it's found. */
int foundEvent; /* Non-zero means that an event of the
@@ -335,7 +335,7 @@ static void UpdateWmProtocols _ANSI_ARGS_((WmInfo *wmPtr));
static void WaitForConfigureNotify _ANSI_ARGS_((TkWindow *winPtr,
unsigned long serial));
static int WaitForEvent _ANSI_ARGS_((Display *display,
- Window window, int type, XEvent *eventPtr));
+ WmInfo *wmInfoPtr, int type, XEvent *eventPtr));
static void WaitForMapNotify _ANSI_ARGS_((TkWindow *winPtr,
int mapped));
static Tk_RestrictAction
@@ -2411,6 +2411,8 @@ ReparentEvent(wmPtr, reparentEventPtr)
wmPtr->xInParent = wmPtr->yInParent = 0;
wrapperPtr->changes.x = reparentEventPtr->x;
wrapperPtr->changes.y = reparentEventPtr->y;
+ wmPtr->winPtr->changes.x = reparentEventPtr->x;
+ wmPtr->winPtr->changes.y = reparentEventPtr->y + wmPtr->menuHeight;
return;
}
@@ -2851,7 +2853,8 @@ UpdateGeometryInfo(clientData)
serial = NextRequest(winPtr->display);
height += wmPtr->menuHeight;
if (wmPtr->flags & WM_MOVE_PENDING) {
- if ((x == winPtr->changes.x) && (y == winPtr->changes.y)
+ if ((x + wmPtr->xInParent == winPtr->changes.x) &&
+ (y + wmPtr->yInParent + wmPtr->menuHeight == winPtr->changes.y)
&& (width == wmPtr->wrapperPtr->changes.width)
&& (height == wmPtr->wrapperPtr->changes.height)) {
/*
@@ -3084,8 +3087,7 @@ WaitForConfigureNotify(winPtr, serial)
while (!gotConfig) {
wmPtr->flags |= WM_SYNC_PENDING;
- code = WaitForEvent(winPtr->display, wmPtr->wrapperPtr->window,
- ConfigureNotify, &event);
+ code = WaitForEvent(winPtr->display, wmPtr, ConfigureNotify, &event);
wmPtr->flags &= ~WM_SYNC_PENDING;
if (code != TCL_OK) {
if (winPtr->dispPtr->wmTracing) {
@@ -3131,9 +3133,9 @@ WaitForConfigureNotify(winPtr, serial)
*/
static int
-WaitForEvent(display, window, type, eventPtr)
+WaitForEvent(display, wmInfoPtr, type, eventPtr)
Display *display; /* Display event is coming from. */
- Window window; /* Window for which event is desired. */
+ WmInfo *wmInfoPtr; /* Window for which event is desired. */
int type; /* Type of event that is wanted. */
XEvent *eventPtr; /* Place to store event. */
{
@@ -3149,7 +3151,7 @@ WaitForEvent(display, window, type, eventPtr)
*/
info.display = display;
- info.window = window;
+ info.wmInfoPtr = wmInfoPtr;
info.type = type;
info.eventPtr = eventPtr;
info.foundEvent = 0;
@@ -3203,7 +3205,8 @@ WaitRestrictProc(clientData, eventPtr)
if (eventPtr->type == ReparentNotify) {
return TK_PROCESS_EVENT;
}
- if ((eventPtr->xany.window != infoPtr->window)
+ if (((eventPtr->xany.window != infoPtr->wmInfoPtr->wrapperPtr->window)
+ && (eventPtr->xany.window != infoPtr->wmInfoPtr->reparent))
|| (eventPtr->xany.display != infoPtr->display)) {
return TK_DEFER_EVENT;
}
@@ -3265,7 +3268,7 @@ WaitForMapNotify(winPtr, mapped)
break;
}
wmPtr->flags |= WM_SYNC_PENDING;
- code = WaitForEvent(winPtr->display, wmPtr->wrapperPtr->window,
+ code = WaitForEvent(winPtr->display, wmPtr,
mapped ? MapNotify : UnmapNotify, &event);
wmPtr->flags &= ~WM_SYNC_PENDING;
if (code != TCL_OK) {
@@ -4104,8 +4107,6 @@ TkWmRestackToplevel(winPtr, aboveBelow, otherPtr)
int desiredIndex = 0; /* Initialized to stop gcc warnings. */
int ourIndex = 0; /* Initialized to stop gcc warnings. */
unsigned long serial;
- XEvent event;
- int diff;
Tk_ErrorHandler handler;
TkWindow *wrapperPtr;
@@ -4258,9 +4259,12 @@ TkWmRestackToplevel(winPtr, aboveBelow, otherPtr)
if (window == wrapperPtr->window) {
WaitForConfigureNotify(winPtr, serial);
} else {
+ XEvent event;
+ int diff;
+
while (1) {
- if (WaitForEvent(winPtr->display, window, ConfigureNotify,
- &event) != TCL_OK) {
+ if (WaitForEvent(winPtr->display, winPtr->wmInfoPtr,
+ ConfigureNotify, &event) != TCL_OK) {
break;
}
diff = event.xconfigure.serial - serial;
@@ -4268,7 +4272,6 @@ TkWmRestackToplevel(winPtr, aboveBelow, otherPtr)
break;
}
}
-
/*
* Ignore errors that occur when we are de-selecting events on
* window, since it's possible that the window doesn't exist