< 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 >