< prev index next >

modules/graphics/src/main/native-glass/gtk/glass_window.cpp

Print this page
rev 9734 : 8087516: Conditional support for GTK 3 on Linux
Reviewed-by:

@@ -48,12 +48,10 @@
 #include <algorithm>
 
 WindowContext * WindowContextBase::sm_grab_window = NULL;
 WindowContext * WindowContextBase::sm_mouse_drag_window = NULL;
 
-GdkAtom atom_net_wm_state = gdk_atom_intern_static_string("_NET_WM_STATE");
-
 GdkWindow* WindowContextBase::get_gdk_window(){
     return gdk_window;
 }
 
 jobject WindowContextBase::get_jview() {

@@ -464,11 +462,11 @@
     if (!is_visible()) {
         return;
     }
 
     cairo_t* context;
-    context = gdk_cairo_create(GDK_DRAWABLE(gdk_window));
+    context = gdk_cairo_create(gdk_window);
 
     cairo_surface_t* cairo_surface;
     cairo_surface = cairo_image_surface_create_for_data(
             (unsigned char*)data,
             CAIRO_FORMAT_ARGB32,

@@ -598,11 +596,11 @@
         if (WindowContextBase::sm_mouse_drag_window) {
             glass_gdk_mouse_devices_grab_with_cursor(
                     WindowContextBase::sm_mouse_drag_window->get_gdk_window(), cursor, FALSE);
         } else if (WindowContextBase::sm_grab_window) {
             glass_gdk_mouse_devices_grab_with_cursor(
-                    WindowContextBase::sm_grab_window->get_gdk_window(), cursor);
+                    WindowContextBase::sm_grab_window->get_gdk_window(), cursor, TRUE);
         }
     }
     gdk_window_set_cursor(gdk_window, cursor);
 }
 

@@ -718,11 +716,11 @@
     return gdk_atom_intern(extents_str, TRUE);
 }
 
 void
 WindowContextTop::request_frame_extents() {
-    Display *display = GDK_WINDOW_XDISPLAY(gdk_window);
+    Display *display = GDK_DISPLAY_XDISPLAY (gdk_window_get_display (gdk_window));
     Atom rfeAtom = XInternAtom(display, "_NET_REQUEST_FRAME_EXTENTS", True);
     if (rfeAtom != None) {
         XClientMessageEvent clientMessage;
         memset(&clientMessage, 0, sizeof(clientMessage));
 

@@ -737,11 +735,11 @@
         XFlush(display);
     }
 }
 
 void WindowContextTop::activate_window() {
-    Display *display = GDK_WINDOW_XDISPLAY(gdk_window);
+    Display *display = GDK_DISPLAY_XDISPLAY (gdk_window_get_display (gdk_window));
     Atom navAtom = XInternAtom(display, "_NET_ACTIVE_WINDOW", True);
     if (navAtom != None) {
         XClientMessageEvent clientMessage;
         memset(&clientMessage, 0, sizeof(clientMessage));
 

@@ -868,10 +866,11 @@
 
 void WindowContextTop::process_net_wm_property() {
     // Workaround for https://bugs.launchpad.net/unity/+bug/998073
 
     static GdkAtom atom_atom = gdk_atom_intern_static_string("ATOM");
+    static GdkAtom atom_net_wm_state = gdk_atom_intern_static_string("_NET_WM_STATE");
     static GdkAtom atom_net_wm_state_hidden = gdk_atom_intern_static_string("_NET_WM_STATE_HIDDEN");
     static GdkAtom atom_net_wm_state_above = gdk_atom_intern_static_string("_NET_WM_STATE_ABOVE");
 
     gint length;
 

@@ -903,10 +902,12 @@
         notify_on_top(is_above);
     }
 }
 
 void WindowContextTop::process_property_notify(GdkEventProperty* event) {
+    static GdkAtom atom_net_wm_state = gdk_atom_intern_static_string("_NET_WM_STATE");
+
     if (event->atom == atom_net_wm_state && event->window == gdk_window) {
         process_net_wm_property();
     } else if (event->atom == get_net_frame_extents_atom() &&
             event->window == gdk_window) {
         int top, left, bottom, right;

@@ -1169,10 +1170,12 @@
         unsigned int windowChangesMask) {
     if (windowChangesMask == 0) {
         return;
     }
 
+    Display *display = GDK_DISPLAY_XDISPLAY (gdk_window_get_display (gdk_window));
+
     if (!gtk_widget_get_visible(gtk_widget)) {
         // not visible yet, synchronize with gtk only
         if (windowChangesMask & (CWX | CWY)) {
             gint newX, newY;
             gtk_window_get_position(GTK_WINDOW(gtk_widget), &newX, &newY);

@@ -1221,33 +1224,33 @@
 
             sizeHints->min_width = 1;
             sizeHints->min_height = 1;
             sizeHints->max_width = INT_MAX;
             sizeHints->max_height = INT_MAX;
-            XSetWMNormalHints(GDK_WINDOW_XDISPLAY(gdk_window),
+            XSetWMNormalHints(display,
                     GDK_WINDOW_XID(gdk_window),
                     sizeHints);
 
-            XConfigureWindow(GDK_WINDOW_XDISPLAY(gdk_window),
+            XConfigureWindow(display,
                     GDK_WINDOW_XID(gdk_window),
                     windowChangesMask,
                     windowChanges);
 
             sizeHints->min_width = fixedWidth;
             sizeHints->min_height = fixedHeight;
             sizeHints->max_width = fixedWidth;
             sizeHints->max_height = fixedHeight;
-            XSetWMNormalHints(GDK_WINDOW_XDISPLAY(gdk_window),
+            XSetWMNormalHints(display,
                     GDK_WINDOW_XID(gdk_window),
                     sizeHints);
 
             XFree(sizeHints);
             return;
         }
     }
 
-    XConfigureWindow(GDK_WINDOW_XDISPLAY(gdk_window),
+    XConfigureWindow(display,
             GDK_WINDOW_XID(gdk_window),
             windowChangesMask,
             windowChanges);
 }
 

@@ -1255,32 +1258,19 @@
 {
     if (frame_type != TRANSPARENT) {
         return;
     }
 
-    GdkPixbuf* pixbuf = gdk_pixbuf_new_from_data((guchar *) data,
-            GDK_COLORSPACE_RGB, TRUE, 8, width, height, width * 4, NULL, NULL);
-
-    if (GDK_IS_PIXBUF(pixbuf)) {
-        GdkBitmap* mask = NULL;
-        gdk_pixbuf_render_pixmap_and_mask(pixbuf, NULL, &mask, 128);
-
-        gdk_window_input_shape_combine_mask(gdk_window, mask, 0, 0);
-
-        g_object_unref(pixbuf);
-        if (mask) {
-            g_object_unref(mask);
-        }
-    }
+    glass_window_apply_shape_mask(gtk_widget, data, width, height);
 }
 
 void WindowContextTop::set_minimized(bool minimize) {
     is_iconified = minimize;
     if (minimize) {
         if (frame_type == TRANSPARENT) {
             // https://bugs.launchpad.net/ubuntu/+source/unity/+bug/1245571
-            gdk_window_input_shape_combine_mask(gdk_window, NULL, 0, 0);
+            glass_window_reset_input_shape_mask(gtk_widget);
         }
 
         if ((gdk_windowManagerFunctions & GDK_FUNC_MINIMIZE) == 0) {
             // in this case - the window manager will not support the programatic
             // request to iconify - so we need to disable this until we are restored.
< prev index next >