xserver: Branch 'master' - 8 commits

Keith Packard keithp at kemper.freedesktop.org
Wed Apr 27 12:08:59 PDT 2011


 hw/xwin/InitOutput.c           |    2 -
 hw/xwin/man/XWin.man           |    3 +-
 hw/xwin/winclipboardxevents.c  |    5 +++-
 hw/xwin/winmonitors.c          |    2 -
 hw/xwin/winmultiwindowicons.c  |    3 +-
 hw/xwin/winmultiwindowwindow.c |   30 ++++++++++++++++++++------
 hw/xwin/winmultiwindowwm.c     |   46 +++++++++++++++++++++++++++++++++++++++--
 hw/xwin/winpfbdd.c             |    3 +-
 hw/xwin/winprefs.c             |   26 ++---------------------
 hw/xwin/winprefs.h             |    2 -
 hw/xwin/winscrinit.c           |    4 +++
 hw/xwin/winshaddd.c            |    3 +-
 hw/xwin/winshadddnl.c          |    3 +-
 hw/xwin/winshadgdi.c           |    3 +-
 hw/xwin/winwin32rootless.c     |   20 ++++++++---------
 15 files changed, 103 insertions(+), 52 deletions(-)

New commits:
commit f6d4e75ec55ac6812f9dead42ecdffb9614578c7
Merge: ec9ea40... 4318e6a...
Author: Keith Packard <keithp at keithp.com>
Date:   Wed Apr 27 12:08:51 2011 -0700

    Merge remote-tracking branch 'jturney/master'

commit 4318e6a147e78b2663c5e0ea6ba0d351a1e87f98
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Sat Mar 5 17:34:42 2011 +0000

    Cygwin/X: Handle failure during winScreenInit()
    
    Handle failure during winScreenInit() a bit more cleanly, rather than crashing
    
    This avoids a crash with 'XWin -fullscreen -screen 0 @2 -screen 1 @1'
    
    Also document that fullscreen may only be applied to one screen.
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>
    Reviewed-by: Colin Harrison <colin.harrison at virgin.net>
    Tested-by: Colin Harrison <colin.harrison at virgin.net>

diff --git a/hw/xwin/man/XWin.man b/hw/xwin/man/XWin.man
index e7933c9..aad29cf 100644
--- a/hw/xwin/man/XWin.man
+++ b/hw/xwin/man/XWin.man
@@ -67,7 +67,7 @@ The default behaviour is to create a single screen 0 that is roughly the
 size of useful area of the primary monitor (allowing for any window
 decorations and the task-bar).
 
-Screen specific parameters, such as \fB\-fullscreen\fP, can be applied as a
+Screen specific parameters can be applied as a
 default to all screens by placing those screen specific parameters
 before any \fB\-screen\fP parameter.  Screen specific parameters placed after
 the first \fB\-screen\fP parameter will apply only to the immediately
@@ -108,6 +108,7 @@ in \fB-multiwindow\fP or \fB-rootless\fP mode.
 .B "\-fullscreen"
 The X server window takes the full screen, covering completely the
 \fIWindows\fP desktop.
+Currently \fB\-fullscreen\fP may only be applied to one X screen.
 .TP 8
 .B \-nodecoration
 Do not give the Cygwin/X window a \fIWindows\fP window border, title bar,
diff --git a/hw/xwin/winpfbdd.c b/hw/xwin/winpfbdd.c
index c0bca71..a399020 100644
--- a/hw/xwin/winpfbdd.c
+++ b/hw/xwin/winpfbdd.c
@@ -294,7 +294,8 @@ winCloseScreenPrimaryDD (int nIndex, ScreenPtr pScreen)
 
   /* Call the wrapped CloseScreen procedure */
   WIN_UNWRAP(CloseScreen);
-  fReturn = (*pScreen->CloseScreen) (nIndex, pScreen);
+  if (pScreen->CloseScreen)
+    fReturn = (*pScreen->CloseScreen) (nIndex, pScreen);
 
   /* Delete the window property */
   RemoveProp (pScreenPriv->hwndScreen, WIN_SCR_PROP);
diff --git a/hw/xwin/winscrinit.c b/hw/xwin/winscrinit.c
index 691237e..983ff57 100644
--- a/hw/xwin/winscrinit.c
+++ b/hw/xwin/winscrinit.c
@@ -220,6 +220,10 @@ winScreenInit (int index,
   if (!((*pScreenPriv->pwinFinishScreenInit) (index, pScreen, argc, argv)))
     {
       ErrorF ("winScreenInit - winFinishScreenInit () failed\n");
+
+      /* call the engine dependent screen close procedure to clean up from a failure */
+      pScreenPriv->pwinCloseScreen(index, pScreen);
+
       return FALSE;
     }
 
diff --git a/hw/xwin/winshaddd.c b/hw/xwin/winshaddd.c
index 00d7a37..6dad278 100644
--- a/hw/xwin/winshaddd.c
+++ b/hw/xwin/winshaddd.c
@@ -728,7 +728,8 @@ winCloseScreenShadowDD (int nIndex, ScreenPtr pScreen)
 
   /* Call the wrapped CloseScreen procedure */
   WIN_UNWRAP(CloseScreen);
-  fReturn = (*pScreen->CloseScreen) (nIndex, pScreen);
+  if (pScreen->CloseScreen)
+    fReturn = (*pScreen->CloseScreen) (nIndex, pScreen);
 
   winFreeFBShadowDD(pScreen);
 
diff --git a/hw/xwin/winshadddnl.c b/hw/xwin/winshadddnl.c
index 0a0b4ae..63d48ad 100644
--- a/hw/xwin/winshadddnl.c
+++ b/hw/xwin/winshadddnl.c
@@ -802,7 +802,8 @@ winCloseScreenShadowDDNL (int nIndex, ScreenPtr pScreen)
 
   /* Call the wrapped CloseScreen procedure */
   WIN_UNWRAP(CloseScreen);
-  fReturn = (*pScreen->CloseScreen) (nIndex, pScreen);
+  if (pScreen->CloseScreen)
+    fReturn = (*pScreen->CloseScreen) (nIndex, pScreen);
 
   winFreeFBShadowDDNL(pScreen);
 
diff --git a/hw/xwin/winshadgdi.c b/hw/xwin/winshadgdi.c
index 4990376..1e7cb00 100644
--- a/hw/xwin/winshadgdi.c
+++ b/hw/xwin/winshadgdi.c
@@ -636,7 +636,8 @@ winCloseScreenShadowGDI (int nIndex, ScreenPtr pScreen)
 
   /* Call the wrapped CloseScreen procedure */
   WIN_UNWRAP(CloseScreen);
-  fReturn = (*pScreen->CloseScreen) (nIndex, pScreen);
+  if (pScreen->CloseScreen)
+    fReturn = (*pScreen->CloseScreen) (nIndex, pScreen);
 
   /* Delete the window property */
   RemoveProp (pScreenPriv->hwndScreen, WIN_SCR_PROP);
commit ce6136f8c553bbc6d3e3affa0faa2afbf8054f44
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Tue Mar 23 20:06:33 2010 +0000

    Cygwin/X: Make winOverrrideStyle() thread-safe
    
    Make winOverrrideStyle() thread-safe
    
    winOverrideStyle() is called from the internal WM client thread.
    
    Accessing server-internal data structures to get window name and
    class is not safe, as there is no lock to ensure we do not collide
    with these data structures being updated in the server thread.
    
    Rewrite so the internal client thread uses X client calls to
    obtain this data safely
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>
    Reviewed-by: Colin Harrison <colin.harrison at virgin.net>
    Tested-by: Colin Harrison <colin.harrison at virgin.net>

diff --git a/hw/xwin/winmultiwindowwm.c b/hw/xwin/winmultiwindowwm.c
index ef0c7cf..67a58a0 100644
--- a/hw/xwin/winmultiwindowwm.c
+++ b/hw/xwin/winmultiwindowwm.c
@@ -1576,7 +1576,6 @@ winApplyHints (Display *pDisplay, Window iWindow, HWND hWnd, HWND *zstyle)
   Atom			type, *pAtom = NULL;
   int			format;
   unsigned long		hint = 0, maxmin = 0, style, nitems = 0 , left = 0;
-  WindowPtr		pWin = GetProp (hWnd, WIN_WINDOW_PROP);
   MwmHints              *mwm_hint = NULL;
 
   if (!hWnd) return;
@@ -1669,7 +1668,26 @@ winApplyHints (Display *pDisplay, Window iWindow, HWND hWnd, HWND *zstyle)
   }
 
   /* Override hint settings from above with settings from config file */
-  style = winOverrideStyle((unsigned long)pWin);
+  {
+    XClassHint class_hint = {0,0};
+    char *window_name = 0;
+
+    if (XGetClassHint(pDisplay, iWindow, &class_hint))
+      {
+        XFetchName(pDisplay, iWindow, &window_name);
+
+        style = winOverrideStyle(class_hint.res_name, class_hint.res_class, window_name);
+
+        if (class_hint.res_name) XFree(class_hint.res_name);
+        if (class_hint.res_class) XFree(class_hint.res_class);
+        if (window_name) XFree(window_name);
+      }
+    else
+      {
+        style = STYLE_NONE;
+      }
+  }
+
   if (style & STYLE_TOPMOST) *zstyle = HWND_TOPMOST;
   else if (style & STYLE_MAXIMIZE) maxmin = (hint & ~HINT_MIN) | HINT_MAX;
   else if (style & STYLE_MINIMIZE) maxmin = (hint & ~HINT_MAX) | HINT_MIN;
diff --git a/hw/xwin/winprefs.c b/hw/xwin/winprefs.c
index 4ccb4ff..d941c51 100644
--- a/hw/xwin/winprefs.c
+++ b/hw/xwin/winprefs.c
@@ -813,40 +813,20 @@ LoadPreferences (void)
  * STYLES{} section in the prefs file, and return the style type
  */
 unsigned long
-winOverrideStyle (unsigned long longpWin)
+winOverrideStyle (char *res_name, char *res_class, char *wmName)
 {
-  WindowPtr pWin = (WindowPtr) longpWin;
-  char *res_name, *res_class;
   int i;
-  char *wmName;
-
-  if (pWin==NULL)
-    return STYLE_NONE;
-
-  /* If we can't find the class, we can't override from default! */
-  if (!winMultiWindowGetClassHint (pWin, &res_name, &res_class))
-    return STYLE_NONE;
-
-  winMultiWindowGetWMName (pWin, &wmName);
 
   for (i=0; i<pref.styleItems; i++) {
-    if (!strcmp(pref.style[i].match, res_name) ||
-	!strcmp(pref.style[i].match, res_class) ||
+    if ((res_name && !strcmp(pref.style[i].match, res_name)) ||
+	(res_class && !strcmp(pref.style[i].match, res_class)) ||
 	(wmName && strstr(wmName, pref.style[i].match)))
       {
-	free (res_name);
-	free (res_class);
-	free(wmName);
-
 	if (pref.style[i].type)
 	  return pref.style[i].type;
       }
   }
 
   /* Didn't find the style, fail gracefully */
-  free (res_name);
-  free (res_class);
-  free(wmName);
-
   return STYLE_NONE;
 }
diff --git a/hw/xwin/winprefs.h b/hw/xwin/winprefs.h
index 33b496d..ecd0a3f 100644
--- a/hw/xwin/winprefs.h
+++ b/hw/xwin/winprefs.h
@@ -180,7 +180,7 @@ HICON
 winOverrideIcon (unsigned long longpWin);
 
 unsigned long
-winOverrideStyle (unsigned long longpWin);
+winOverrideStyle (char *res_name, char *res_class, char *wmName);
 
 HICON
 winTaskbarIcon(void);
commit 0c603509eb7f9c83baf4e00b4558dce78f897ebf
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Fri Feb 11 13:15:40 2011 +0000

    Cygwin/X: Cosmetic fixes to logging of result from X*TextPropertyToTextList()
    
    Report XLocaleNotSupported result from X*TextPropertyToTextList()
    Fix formatting for unknown results reported for X*TextPropertyToTextList()
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>
    Reviewed-by: Colin Harrison <colin.harrison at virgin.net>
    Tested-by: Colin Harrison <colin.harrison at virgin.net>

diff --git a/hw/xwin/winclipboardxevents.c b/hw/xwin/winclipboardxevents.c
index 8b502b1..b0006a0 100644
--- a/hw/xwin/winclipboardxevents.c
+++ b/hw/xwin/winclipboardxevents.c
@@ -636,11 +636,14 @@ winClipboardFlushXEvents (HWND hwnd,
 		case XNoMemory:
 		  ErrorF ("XNoMemory\n");
 		  break;
+		case XLocaleNotSupported:
+		  ErrorF ("XLocaleNotSupported\n");
+		  break;
 		case XConverterNotFound:
 		  ErrorF ("XConverterNotFound\n");
 		  break;
 		default:
-		  ErrorF ("%d", iReturn);
+		  ErrorF ("%d\n", iReturn);
 		  break;
 		}
 	      pszReturnData = malloc (1);
commit 71550a8665d861384332d81239ca0c1586a17137
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Fri Jan 28 20:17:22 2011 +0000

    Cygwin/X: Decorate function pointers retrieved via GetProcAddress with WINAPI
    
    Decorate function pointers retrieved via GetProcAddress which are currently
    missing it with WINAPI, to ensure stdcall convention is used when calling them.
    
    This fixes a crash currently seen when compiled -O2 and the -screen option uses
    a size and monitor number e.g. -screen 0 1280x1000 at 2
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>
    Reviewed-by: Colin Harrison <colin.harrison at virgin.net>
    Tested-by: Colin Harrison <colin.harrison at virgin.net>

diff --git a/hw/xwin/InitOutput.c b/hw/xwin/InitOutput.c
index 7faed01..22ef8da 100644
--- a/hw/xwin/InitOutput.c
+++ b/hw/xwin/InitOutput.c
@@ -49,7 +49,7 @@ from The Open Group.
 #endif
 #ifdef RELOCATE_PROJECTROOT
 #include <shlobj.h>
-typedef HRESULT (*SHGETFOLDERPATHPROC)(
+typedef WINAPI HRESULT (*SHGETFOLDERPATHPROC)(
     HWND hwndOwner,
     int nFolder,
     HANDLE hToken,
diff --git a/hw/xwin/winmonitors.c b/hw/xwin/winmonitors.c
index 63af803..a9d46f9 100644
--- a/hw/xwin/winmonitors.c
+++ b/hw/xwin/winmonitors.c
@@ -53,7 +53,7 @@ wBOOL CALLBACK getMonitorInfo(HMONITOR hMonitor, HDC hdc, LPRECT rect, LPARAM _d
   return TRUE;
 }
 
-typedef wBOOL (*ENUMDISPLAYMONITORSPROC)(HDC,LPCRECT,MONITORENUMPROC,LPARAM);
+typedef WINAPI wBOOL (*ENUMDISPLAYMONITORSPROC)(HDC,LPCRECT,MONITORENUMPROC,LPARAM);
 ENUMDISPLAYMONITORSPROC _EnumDisplayMonitors;
 
 wBOOL CALLBACK getMonitorInfo(HMONITOR hMonitor, HDC hdc, LPRECT rect, LPARAM _data);
commit 38a1f5c613a48ef9fd6ba043bc3028f487750d3a
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Tue Oct 12 17:12:02 2010 +0100

    Cygwin/X: Don't make InputOnly windows visible
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>
    Reviewed-by: Colin Harrison <colin.harrison at virgin.net>
    Tested-by: Colin Harrison <colin.harrison at virgin.net>

diff --git a/hw/xwin/winmultiwindowwindow.c b/hw/xwin/winmultiwindowwindow.c
index 61305e1..21b818b 100644
--- a/hw/xwin/winmultiwindowwindow.c
+++ b/hw/xwin/winmultiwindowwindow.c
@@ -506,12 +506,16 @@ winCreateWindowsWindow (WindowPtr pWin)
   iWidth = pWin->drawable.width;
   iHeight = pWin->drawable.height;
 
-  /* ensure window actually ends up somewhere visible */
-  if (iX > GetSystemMetrics (SM_CXVIRTUALSCREEN))
-    iX = CW_USEDEFAULT;
+  /* If it's an InputOutput window, and so is going to end up being made visible,
+     make sure the window actually ends up somewhere where it will be visible */
+  if (pWin->drawable.class != InputOnly)
+    {
+      if ((iX < GetSystemMetrics (SM_XVIRTUALSCREEN)) || (iX > GetSystemMetrics (SM_CXVIRTUALSCREEN)))
+        iX = CW_USEDEFAULT;
 
-  if (iY > GetSystemMetrics (SM_CYVIRTUALSCREEN))
-    iY = CW_USEDEFAULT;
+      if ((iY < GetSystemMetrics (SM_YVIRTUALSCREEN)) || (iY > GetSystemMetrics (SM_CYVIRTUALSCREEN)))
+        iY = CW_USEDEFAULT;
+    }
 
   if (winMultiWindowGetTransientFor (pWin, &pDaddy))
     {
@@ -666,7 +670,8 @@ winUpdateWindowsWindow (WindowPtr pWin)
 	}
 
       /* Display the window without activating it */
-      ShowWindow (pWinPriv->hWnd, SW_SHOWNOACTIVATE);
+      if (pWin->drawable.class != InputOnly)
+        ShowWindow (pWinPriv->hWnd, SW_SHOWNOACTIVATE);
 
       /* Send first paint message */
       UpdateWindow (pWinPriv->hWnd);
commit bd288c3458bc1ba2cbb4c8416e5b2dfd849581e6
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Thu Jul 22 18:36:51 2010 +0100

    Cygwin/X: Fix a GDI bitmap resource leak of window icons
    
    Ensure any icon created specially for a window is destroyed when
    the window is destroyed
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>
    Reviewed-by: Colin Harrison <colin.harrison at virgin.net>
    Tested-by: Colin Harrison <colin.harrison at virgin.net>

diff --git a/hw/xwin/winmultiwindowicons.c b/hw/xwin/winmultiwindowicons.c
index 1ca3f91..44956e3 100644
--- a/hw/xwin/winmultiwindowicons.c
+++ b/hw/xwin/winmultiwindowicons.c
@@ -624,6 +624,7 @@ void winSelectIcons(WindowPtr pWin, HICON *pIcon, HICON *pSmallIcon)
     *pIcon = hIcon;
   else
     winDestroyIcon(hIcon);
+
   if (pSmallIcon)
     *pSmallIcon = hSmallIcon;
   else
@@ -632,7 +633,7 @@ void winSelectIcons(WindowPtr pWin, HICON *pIcon, HICON *pSmallIcon)
 
 void winDestroyIcon(HICON hIcon)
 {
-  /* Delete the icon if its not the default */
+  /* Delete the icon if its not one of the application defaults or an override */
   if (hIcon &&
       hIcon != g_hIconX &&
       hIcon != g_hSmallIconX &&
diff --git a/hw/xwin/winmultiwindowwindow.c b/hw/xwin/winmultiwindowwindow.c
index 7efc360..61305e1 100644
--- a/hw/xwin/winmultiwindowwindow.c
+++ b/hw/xwin/winmultiwindowwindow.c
@@ -592,7 +592,9 @@ winDestroyWindowsWindow (WindowPtr pWin)
   MSG			msg;
   winWindowPriv(pWin);
   BOOL			oldstate = winInDestroyWindowsWindow;
-  
+  HICON hIcon;
+  HICON hIconSm;
+
 #if CYGMULTIWINDOW_DEBUG
   ErrorF ("winDestroyWindowsWindow\n");
 #endif
@@ -603,13 +605,22 @@ winDestroyWindowsWindow (WindowPtr pWin)
 
   winInDestroyWindowsWindow = TRUE;
 
+  /* Store the info we need to destroy after this window is gone */
+  hIcon = (HICON)SendMessage(pWinPriv->hWnd, WM_GETICON, ICON_BIG, 0);
+  hIconSm = (HICON)SendMessage(pWinPriv->hWnd, WM_GETICON, ICON_SMALL, 0);
+
   SetProp (pWinPriv->hWnd, WIN_WINDOW_PROP, NULL);
+
   /* Destroy the Windows window */
   DestroyWindow (pWinPriv->hWnd);
 
   /* Null our handle to the Window so referencing it will cause an error */
   pWinPriv->hWnd = NULL;
 
+  /* Destroy any icons we created for this window */
+  winDestroyIcon(hIcon);
+  winDestroyIcon(hIconSm);
+
   /* Process all messages on our queue */
   while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
     {
diff --git a/hw/xwin/winwin32rootless.c b/hw/xwin/winwin32rootless.c
index 75142f1..8f9917a 100644
--- a/hw/xwin/winwin32rootless.c
+++ b/hw/xwin/winwin32rootless.c
@@ -366,8 +366,8 @@ void
 winMWExtWMDestroyFrame (RootlessFrameID wid)
 {
   win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
-  HICON			hiconClass;
-  HICON			hiconSmClass;
+  HICON			hIcon;
+  HICON			hIconSm;
   HMODULE		hInstance;
   int			iReturn;
   char			pszClass[CLASS_NAME_LENGTH];
@@ -398,8 +398,8 @@ winMWExtWMDestroyFrame (RootlessFrameID wid)
 
   /* Store the info we need to destroy after this window is gone */
   hInstance = (HINSTANCE) GetClassLongPtr (pRLWinPriv->hWnd, GCLP_HMODULE);
-  hiconClass = (HICON) GetClassLongPtr (pRLWinPriv->hWnd, GCLP_HICON);
-  hiconSmClass = (HICON) GetClassLongPtr (pRLWinPriv->hWnd, GCLP_HICONSM);
+  hIcon = (HICON)SendMessage(pRLWinPriv->hWnd, WM_GETICON, ICON_BIG, 0);
+  hIconSm = (HICON)SendMessage(pRLWinPriv->hWnd, WM_GETICON, ICON_SMALL, 0);
   iReturn = GetClassName (pRLWinPriv->hWnd, pszClass, CLASS_NAME_LENGTH);
 
   pRLWinPriv->fClose = TRUE;
@@ -415,14 +415,14 @@ winMWExtWMDestroyFrame (RootlessFrameID wid)
       winDebug ("winMWExtWMDestroyFrame - Unregistering %s: ", pszClass);
 #endif
       iReturn = UnregisterClass (pszClass, hInstance);
-      
+    }
+
 #if CYGMULTIWINDOW_DEBUG
-      winDebug ("winMWExtWMDestroyFramew - %d Deleting Icon: ", iReturn);
+  winDebug ("winMWExtWMDestroyFramew - Deleting Icon\n");
 #endif
-      
-      winDestroyIcon(hiconClass);
-      winDestroyIcon(hiconSmClass);
-    }
+
+  winDestroyIcon(hIcon);
+  winDestroyIcon(hIconSm);
 
 #if CYGMULTIWINDOW_DEBUG
   winDebug ("winMWExtWMDestroyFrame - done\n");
commit 19e764eee0c8b74d877fb2b1d6aedc933976660e
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Wed Jul 21 18:11:13 2010 +0100

    Cygwin/X: Internal WM workaround for Java AWT bug
    
    Java applications using AWT on JRE 1.6.0 break with non-reparenting WMs AWT
    doesn't explicitly know about (See sun bug #6434227)
    
    XDecoratedPeer.handleConfigureNotifyEvent() only processes non-synthetic
    ConfigureNotify events to update window location if it's identified the
    WM as a non-reparenting WM it knows about (compiz or lookingglass)
    
    Rather than tell all sorts of lies to get XWM to recognize us as one of
    those, simply send a synthetic ConfigureNotify for every non-synthetic one
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>
    Reviewed-by: Colin Harrison <colin.harrison at virgin.net>
    Tested-by: Colin Harrison <colin.harrison at virgin.net>

diff --git a/hw/xwin/winmultiwindowwm.c b/hw/xwin/winmultiwindowwm.c
index c9b1584..ef0c7cf 100644
--- a/hw/xwin/winmultiwindowwm.c
+++ b/hw/xwin/winmultiwindowwm.c
@@ -1114,6 +1114,30 @@ winMultiWindowXMsgProc (void *pArg)
                 }
             }
         }
+      else if (event.type == ConfigureNotify)
+        {
+          if (!event.xconfigure.send_event)
+            {
+              /*
+                Java applications using AWT on JRE 1.6.0 break with non-reparenting WMs AWT
+                doesn't explicitly know about (See sun bug #6434227)
+
+                XDecoratedPeer.handleConfigureNotifyEvent() only processes non-synthetic
+                ConfigureNotify events to update window location if it's identified the
+                WM as a non-reparenting WM it knows about (compiz or lookingglass)
+
+                Rather than tell all sorts of lies to get XWM to recognize us as one of
+                those, simply send a synthetic ConfigureNotify for every non-synthetic one
+               */
+              XEvent event_send = event;
+              event_send.xconfigure.send_event = TRUE;
+              event_send.xconfigure.event = event.xconfigure.window;
+              XSendEvent(event.xconfigure.display,
+                         event.xconfigure.window,
+                         True, StructureNotifyMask,
+                         &event_send);
+            }
+        }
       else if (event.type == PropertyNotify
 	       && event.xproperty.atom == atmWmName)
 	{


More information about the xorg-commit mailing list