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