summaryrefslogtreecommitdiffstats
path: root/x11-toolkits/gtk20/files/patch-DND-vnc-fix
blob: 35ee2fae954004149a1107483c21ed45e7144bba (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
--- gdk/x11/gdkdnd-x11.c
+++ gdk/x11/gdkdnd-x11.c
@@ -683,11 +683,16 @@ is_pointer_within_shape (GdkDisplay    *display,
       GdkDisplayX11 *display_x11 = GDK_DISPLAY_X11 (display);
       GdkRegion *input_shape;
 
-      child->shape = _xwindow_get_shape (display_x11->xdisplay,
-                                         child->xid, ShapeBounding);
+      child->shape = NULL;
+      if (gdk_display_supports_shapes (display))
+        child->shape = _xwindow_get_shape (display_x11->xdisplay,
+                                           child->xid, ShapeBounding);
 #ifdef ShapeInput
-      input_shape = _xwindow_get_shape (display_x11->xdisplay,
-                                        child->xid, ShapeInput);
+      input_shape = NULL;
+      if (gdk_display_supports_input_shapes (display))
+        input_shape = _xwindow_get_shape (display_x11->xdisplay,
+                                          child->xid, ShapeInput);
+
       if (child->shape && input_shape)
         {
           gdk_region_intersect (child->shape, input_shape);
diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c
index c2c32f0..f32246e 100644
--- gdk/x11/gdkwindow-x11.c
+++ gdk/x11/gdkwindow-x11.c
@@ -4659,17 +4659,24 @@ _xwindow_get_shape (Display *xdisplay,
   shape = NULL;
   rn = 0;
 
-  xrl = XShapeGetRectangles (xdisplay,
-                window,
-                shape_type, &rn, &ord);
+  /* Note that XShapeGetRectangles returns NULL in two situations:
+   * - the server doesn't support the SHAPE extension
+   * - the shape is empty
+   *
+   * Since we can't discriminate these here, we always return
+   * an empty shape. It is the callers responsibility to check
+   * whether the server supports the SHAPE extensions beforehand.
+   */
+  xrl = XShapeGetRectangles (xdisplay, window, shape_type, &rn, &ord);
 
-  if (xrl == NULL || rn == 0)
+  if (rn == 0)
     return gdk_region_new (); /* Empty */
 
   if (ord != YXBanded)
     {
       /* This really shouldn't happen with any xserver, as they
-    generally convert regions to YXBanded internally */
+       * generally convert regions to YXBanded internally
+       */
       g_warning ("non YXBanded shape masks not supported");
       XFree (xrl);
       return NULL;
@@ -4684,10 +4691,10 @@ _xwindow_get_shape (Display *xdisplay,
       rl[i].height = xrl[i].height;
     }
   XFree (xrl);
-  
+
   shape = _gdk_region_new_from_yxbanded_rects (rl, rn);
   g_free (rl);
-  
+
   return shape;
 }
 
@@ -4736,10 +4743,10 @@ _gdk_windowing_window_get_input_shape (GdkWindow *window)
 {
 #if defined(ShapeInput)
   if (!GDK_WINDOW_DESTROYED (window) &&
-      gdk_display_supports_shapes (GDK_WINDOW_DISPLAY (window)))
+      gdk_display_supports_input_shapes (GDK_WINDOW_DISPLAY (window)))
     return _xwindow_get_shape (GDK_WINDOW_XDISPLAY (window),
-                 GDK_WINDOW_XID (window),
-                 ShapeInput);
+                              GDK_WINDOW_XID (window),
+                              ShapeInput);
 #endif
 
   return NULL;