< 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,59 **** #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() { --- 48,57 ----
*** 464,474 **** if (!is_visible()) { return; } cairo_t* context; ! context = gdk_cairo_create(GDK_DRAWABLE(gdk_window)); cairo_surface_t* cairo_surface; cairo_surface = cairo_image_surface_create_for_data( (unsigned char*)data, CAIRO_FORMAT_ARGB32, --- 462,472 ---- if (!is_visible()) { return; } cairo_t* context; ! 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,608 **** 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); } } gdk_window_set_cursor(gdk_window, cursor); } --- 596,606 ---- 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, TRUE); } } gdk_window_set_cursor(gdk_window, cursor); }
*** 718,728 **** return gdk_atom_intern(extents_str, TRUE); } void WindowContextTop::request_frame_extents() { ! Display *display = GDK_WINDOW_XDISPLAY(gdk_window); Atom rfeAtom = XInternAtom(display, "_NET_REQUEST_FRAME_EXTENTS", True); if (rfeAtom != None) { XClientMessageEvent clientMessage; memset(&clientMessage, 0, sizeof(clientMessage)); --- 716,726 ---- return gdk_atom_intern(extents_str, TRUE); } void WindowContextTop::request_frame_extents() { ! 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,747 **** XFlush(display); } } void WindowContextTop::activate_window() { ! Display *display = GDK_WINDOW_XDISPLAY(gdk_window); Atom navAtom = XInternAtom(display, "_NET_ACTIVE_WINDOW", True); if (navAtom != None) { XClientMessageEvent clientMessage; memset(&clientMessage, 0, sizeof(clientMessage)); --- 735,745 ---- XFlush(display); } } void WindowContextTop::activate_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,877 **** --- 866,876 ---- 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,912 **** --- 902,913 ---- 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,1178 **** --- 1170,1181 ---- 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,1253 **** sizeHints->min_width = 1; sizeHints->min_height = 1; sizeHints->max_width = INT_MAX; sizeHints->max_height = INT_MAX; ! XSetWMNormalHints(GDK_WINDOW_XDISPLAY(gdk_window), GDK_WINDOW_XID(gdk_window), sizeHints); ! XConfigureWindow(GDK_WINDOW_XDISPLAY(gdk_window), 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), GDK_WINDOW_XID(gdk_window), sizeHints); XFree(sizeHints); return; } } ! XConfigureWindow(GDK_WINDOW_XDISPLAY(gdk_window), GDK_WINDOW_XID(gdk_window), windowChangesMask, windowChanges); } --- 1224,1256 ---- sizeHints->min_width = 1; sizeHints->min_height = 1; sizeHints->max_width = INT_MAX; sizeHints->max_height = INT_MAX; ! XSetWMNormalHints(display, GDK_WINDOW_XID(gdk_window), sizeHints); ! 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(display, GDK_WINDOW_XID(gdk_window), sizeHints); XFree(sizeHints); return; } } ! XConfigureWindow(display, GDK_WINDOW_XID(gdk_window), windowChangesMask, windowChanges); }
*** 1255,1286 **** { 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); ! } ! } } 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); } 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. --- 1258,1276 ---- { if (frame_type != TRANSPARENT) { return; } ! 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 ! 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 >