aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/programs/Xserver/hw/nxagent/Events.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/programs/Xserver/hw/nxagent/Events.c')
-rw-r--r--nx-X11/programs/Xserver/hw/nxagent/Events.c88
1 files changed, 52 insertions, 36 deletions
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Events.c b/nx-X11/programs/Xserver/hw/nxagent/Events.c
index 5e598f5bc..dee8dd7e0 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Events.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Events.c
@@ -575,8 +575,6 @@ void nxagentInternalWindowsTree(WindowPtr pWin, int indent)
void nxagentSwitchResizeMode(ScreenPtr pScreen)
{
- XSizeHints sizeHints;
-
#ifdef DEBUG
fprintf(stderr, "nxagentSwitchResizeMode called.\n");
#endif
@@ -585,8 +583,6 @@ void nxagentSwitchResizeMode(ScreenPtr pScreen)
nxagentChangeOption(DesktopResize, !desktopResize);
- sizeHints.flags = PMaxSize;
-
if (nxagentOption(DesktopResize) == 0)
{
fprintf(stderr,"Info: Disabled desktop resize mode in agent.\n");
@@ -595,11 +591,9 @@ void nxagentSwitchResizeMode(ScreenPtr pScreen)
if (nxagentOption(Fullscreen) == 0)
{
- sizeHints.max_width = nxagentOption(RootWidth);
- sizeHints.max_height = nxagentOption(RootHeight);
-
- XSetWMNormalHints(nxagentDisplay, nxagentDefaultWindows[pScreen->myNum],
- &sizeHints);
+ nxagentSetWMNormalHintsMaxsize(pScreen,
+ nxagentOption(RootWidth),
+ nxagentOption(RootHeight));
}
}
else
@@ -608,32 +602,25 @@ void nxagentSwitchResizeMode(ScreenPtr pScreen)
nxagentLaunchDialog(DIALOG_ENABLE_DESKTOP_RESIZE_MODE);
- nxagentChangeScreenConfig(0, nxagentOption(Width), nxagentOption(Height),
- 0, 0);
+ nxagentChangeScreenConfig(0, nxagentOption(Width), nxagentOption(Height));
if (nxagentOption(ClientOs) == ClientOsWinnt)
{
NXSetExposeParameters(nxagentDisplay, 0, 0, 0);
}
- sizeHints.max_width = WidthOfScreen(DefaultScreenOfDisplay(nxagentDisplay));
- sizeHints.max_height = HeightOfScreen(DefaultScreenOfDisplay(nxagentDisplay));
-
- XSetWMNormalHints(nxagentDisplay, nxagentDefaultWindows[pScreen->myNum],
- &sizeHints);
+ nxagentSetWMNormalHintsMaxsize(pScreen,
+ WidthOfScreen(DefaultScreenOfDisplay(nxagentDisplay)),
+ HeightOfScreen(DefaultScreenOfDisplay(nxagentDisplay)));
}
}
void nxagentShadowSwitchResizeMode(ScreenPtr pScreen)
{
- XSizeHints sizeHints;
-
int desktopResize = nxagentOption(DesktopResize);
nxagentChangeOption(DesktopResize, !desktopResize);
- sizeHints.flags = PMaxSize;
-
if (nxagentOption(DesktopResize) == 0)
{
nxagentShadowSetRatio(1.0, 1.0);
@@ -641,8 +628,9 @@ void nxagentShadowSwitchResizeMode(ScreenPtr pScreen)
nxagentShadowCreateMainWindow(screenInfo.screens[DefaultScreen(nxagentDisplay)], screenInfo.screens[0]->root,
screenInfo.screens[0]->root -> drawable.width, screenInfo.screens[0]->root -> drawable.height);
- sizeHints.max_width = nxagentOption(RootWidth);
- sizeHints.max_height = nxagentOption(RootHeight);
+ nxagentSetWMNormalHintsMaxsize(pScreen,
+ nxagentOption(RootWidth),
+ nxagentOption(RootHeight));
fprintf(stderr,"Info: Disabled resize mode in shadow agent.\n");
}
@@ -657,14 +645,12 @@ void nxagentShadowSwitchResizeMode(ScreenPtr pScreen)
screenInfo.screens[0]->root, screenInfo.screens[0]->root -> drawable.width,
screenInfo.screens[0]->root -> drawable.height);
- sizeHints.max_width = WidthOfScreen(DefaultScreenOfDisplay(nxagentDisplay));
- sizeHints.max_height = HeightOfScreen(DefaultScreenOfDisplay(nxagentDisplay));
+ nxagentSetWMNormalHintsMaxsize(pScreen,
+ WidthOfScreen(DefaultScreenOfDisplay(nxagentDisplay)),
+ HeightOfScreen(DefaultScreenOfDisplay(nxagentDisplay)));
fprintf(stderr,"Info: Enabled resize mode in shadow agent.\n");
}
-
- XSetWMNormalHints(nxagentDisplay, nxagentDefaultWindows[pScreen->myNum],
- &sizeHints);
}
static void nxagentSwitchDeferMode(void)
@@ -3248,6 +3234,7 @@ int nxagentHandleConfigureNotify(XEvent* X)
pClient = wClient(pWinWindow);
+ /* FIXME: override_redirect is always FALSE here */
if (X -> xconfigure.send_event || !nxagentWMIsRunning ||
X -> xconfigure.override_redirect)
{
@@ -3354,13 +3341,26 @@ int nxagentHandleConfigureNotify(XEvent* X)
{
if (nxagentOption(AllScreens) == 0)
{
+ /*
+ * - WITHOUT window manager any position change is relevant
+ * - WITH window manager only synthetic position changes send
+ * by the window manager are relevant, see ICCCM Chapter 4,
+ * "Configuring the Window"
+ */
+ Bool updatePos = (nxagentWMIsRunning == 0 || X -> xconfigure.send_event != 0);
+ int newX = X -> xconfigure.x;
+ int newY = X -> xconfigure.y;
+
if (nxagentOption(DesktopResize) == 1)
{
if (nxagentOption(Width) != X -> xconfigure.width ||
nxagentOption(Height) != X -> xconfigure.height ||
- nxagentOption(X) != X -> xconfigure.x ||
- nxagentOption(Y) != X -> xconfigure.y)
+ (updatePos && (nxagentOption(X) != newX ||
+ nxagentOption(Y) != newY)))
{
+ #ifdef DEBUG
+ int count = 0;
+ #endif
Bool newEvents = False;
doRandR = True;
@@ -3377,8 +3377,7 @@ int nxagentHandleConfigureNotify(XEvent* X)
nxagentWaitEvents(nxagentDisplay, &timeout);
/*
- * This should also flush
- * the NX link for us.
+ * This should also flush the NX link for us.
*/
XSync(nxagentDisplay, 0);
@@ -3386,17 +3385,34 @@ int nxagentHandleConfigureNotify(XEvent* X)
while (XCheckTypedWindowEvent(nxagentDisplay, nxagentDefaultWindows[pScreen -> myNum],
ConfigureNotify, X))
{
+ #ifdef DEBUG
+ count++;
+ #endif
+
+ if (nxagentWMIsRunning == 0 || X -> xconfigure.send_event)
+ {
+ updatePos = True;
+ newX = X -> xconfigure.x;
+ newY = X -> xconfigure.y;
+ }
newEvents = True;
}
} while (newEvents);
+
+ #ifdef DEBUG
+ fprintf(stderr, "%s: accumulated %d events\n", __func__, count);
+ #endif
}
}
- if (nxagentWMIsRunning == 0 || X -> xconfigure.send_event)
+ if (updatePos)
{
- nxagentChangeOption(X, X -> xconfigure.x);
- nxagentChangeOption(Y, X -> xconfigure.y);
+ #ifdef DEBUG
+ fprintf(stderr, "%s: Updating nxagent window position [%d,%d]\n", __func__, newX, newY);
+ #endif
+ nxagentChangeOption(X, newX);
+ nxagentChangeOption(Y, newY);
}
if (nxagentOption(Shadow) == 1 && nxagentOption(DesktopResize) == 1 &&
@@ -3464,7 +3480,7 @@ int nxagentHandleConfigureNotify(XEvent* X)
#endif
nxagentChangeScreenConfig(0, nxagentOption(Width),
- nxagentOption(Height), 0, 0);
+ nxagentOption(Height));
}
}
@@ -3484,7 +3500,7 @@ int nxagentHandleConfigureNotify(XEvent* X)
nxagentChangeOption(RootHeight, X -> xconfigure.height);
nxagentChangeScreenConfig(0, nxagentOption(Width),
- nxagentOption(Height), 0, 0);
+ nxagentOption(Height));
return 1;
}