Alexandre Julliard : winex11: Check if _NET_WM_MOVERESIZE is supported before using it.

Alexandre Julliard julliard at winehq.org
Wed Mar 12 17:23:56 CDT 2008


Module: wine
Branch: master
Commit: cf76c7d65c7cb6d930c735f4fe5b7755e7f8d73f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=cf76c7d65c7cb6d930c735f4fe5b7755e7f8d73f

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Mar 12 17:29:28 2008 +0100

winex11: Check if _NET_WM_MOVERESIZE is supported before using it.

---

 dlls/winex11.drv/winpos.c      |   37 +++++++++++++++++++++++++++++++++++++
 dlls/winex11.drv/x11drv.h      |    1 +
 dlls/winex11.drv/x11drv_main.c |    1 +
 3 files changed, 39 insertions(+), 0 deletions(-)

diff --git a/dlls/winex11.drv/winpos.c b/dlls/winex11.drv/winpos.c
index c30ef71..f215f41 100644
--- a/dlls/winex11.drv/winpos.c
+++ b/dlls/winex11.drv/winpos.c
@@ -639,6 +639,37 @@ void X11DRV_ConfigureNotify( HWND hwnd, XEvent *xev )
 
 
 /***********************************************************************
+ *              is_netwm_supported
+ */
+static BOOL is_netwm_supported( Display *display, Atom atom )
+{
+    static Atom *net_supported;
+    static int net_supported_count = -1;
+    int i;
+
+    wine_tsx11_lock();
+    if (net_supported_count == -1)
+    {
+        Atom type;
+        int format;
+        unsigned long count, remaining;
+
+        if (!XGetWindowProperty( display, DefaultRootWindow(display), x11drv_atom(_NET_SUPPORTED), 0,
+                                 ~0UL, False, XA_ATOM, &type, &format, &count,
+                                 &remaining, (unsigned char **)&net_supported ))
+            net_supported_count = count * (format / 8) / sizeof(Atom);
+        else
+            net_supported_count = 0;
+    }
+    wine_tsx11_unlock();
+
+    for (i = 0; i < net_supported_count; i++)
+        if (net_supported[i] == atom) return TRUE;
+    return FALSE;
+}
+
+
+/***********************************************************************
  *           SysCommandSizeMove   (X11DRV.@)
  *
  * Perform SC_MOVE and SC_SIZE commands.
@@ -656,6 +687,12 @@ BOOL X11DRV_SysCommandSizeMove( HWND hwnd, WPARAM wparam )
     if (!(data = X11DRV_get_win_data( hwnd ))) return FALSE;
     if (!data->whole_window || !data->managed) return FALSE;
 
+    if (!is_netwm_supported( display, x11drv_atom(_NET_WM_MOVERESIZE) ))
+    {
+        TRACE( "_NET_WM_MOVERESIZE not supported\n" );
+        return FALSE;
+    }
+
     if (syscommand == SC_MOVE)
     {
         if (!hittest) dir = _NET_WM_MOVERESIZE_MOVE_KEYBOARD;
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index bdf6657..a685e64 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -567,6 +567,7 @@ enum x11drv_atoms
     XATOM__ICC_PROFILE,
     XATOM__MOTIF_WM_HINTS,
     XATOM__KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR,
+    XATOM__NET_SUPPORTED,
     XATOM__NET_SYSTEM_TRAY_OPCODE,
     XATOM__NET_SYSTEM_TRAY_S0,
     XATOM__NET_WM_MOVERESIZE,
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
index 9162857..0ea3a1b 100644
--- a/dlls/winex11.drv/x11drv_main.c
+++ b/dlls/winex11.drv/x11drv_main.c
@@ -131,6 +131,7 @@ static const char * const atom_names[NB_XATOMS - FIRST_XATOM] =
     "_ICC_PROFILE",
     "_MOTIF_WM_HINTS",
     "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR",
+    "_NET_SUPPORTED",
     "_NET_SYSTEM_TRAY_OPCODE",
     "_NET_SYSTEM_TRAY_S0",
     "_NET_WM_MOVERESIZE",




More information about the wine-cvs mailing list