diff options
Diffstat (limited to 'mate-screenshot')
-rw-r--r-- | mate-screenshot/src/screenshot-utils.c | 50 |
1 files changed, 49 insertions, 1 deletions
diff --git a/mate-screenshot/src/screenshot-utils.c b/mate-screenshot/src/screenshot-utils.c index 093c1041..dadd0dcd 100644 --- a/mate-screenshot/src/screenshot-utils.c +++ b/mate-screenshot/src/screenshot-utils.c @@ -228,12 +228,23 @@ GdkWindow * screenshot_find_current_window () { GdkWindow *current_window; +#if GTK_CHECK_VERSION (3, 20, 0) + GdkDisplay *display; + GdkSeat *seat; +#else GdkDeviceManager *manager; +#endif GdkDevice *device; current_window = screenshot_find_active_window (); +#if GTK_CHECK_VERSION (3, 20, 0) + display = gdk_window_get_display (current_window); + seat = gdk_display_get_default_seat (display); + device = gdk_seat_get_pointer (seat); +#else manager = gdk_display_get_device_manager (gdk_display_get_default ()); device = gdk_device_manager_get_client_pointer (manager); +#endif /* If there's no active window, we fall back to returning the * window that the cursor is in. @@ -446,8 +457,12 @@ screenshot_select_area_async (SelectAreaCallback callback) { GdkDisplay *display; GdkCursor *cursor; +#if GTK_CHECK_VERSION (3, 20, 0) + GdkSeat *seat; +#else GdkDeviceManager *manager; GdkDevice *pointer, *keyboard; +#endif GdkGrabStatus res; select_area_filter_data data; GdkRectangle *rectangle; @@ -471,11 +486,32 @@ screenshot_select_area_async (SelectAreaCallback callback) display = gdk_display_get_default (); cursor = gdk_cursor_new_for_display (display, GDK_CROSSHAIR); +#if GTK_CHECK_VERSION (3, 20, 0) + seat = gdk_display_get_default_seat (display); + + res = gdk_seat_grab (seat, + gtk_widget_get_window (data.window), + GDK_SEAT_CAPABILITY_ALL, + FALSE, + cursor, + NULL, + NULL, + NULL); + + if (res != GDK_GRAB_SUCCESS) + { + g_object_unref (cursor); + goto out; + } + + gtk_main (); + + gdk_seat_ungrab (seat); +#else manager = gdk_display_get_device_manager (display); pointer = gdk_device_manager_get_client_pointer (manager); keyboard = gdk_device_get_associated_device (pointer); - res = gdk_device_grab (pointer, gtk_widget_get_window (data.window), GDK_OWNERSHIP_NONE, FALSE, GDK_POINTER_MOTION_MASK | @@ -505,6 +541,7 @@ screenshot_select_area_async (SelectAreaCallback callback) gdk_device_ungrab (keyboard, GDK_CURRENT_TIME); gdk_device_ungrab (pointer, GDK_CURRENT_TIME); +#endif gtk_widget_destroy (data.window); g_object_unref (cursor); @@ -847,13 +884,24 @@ screenshot_get_pixbuf (GdkWindow *window, if (cursor_pixbuf != NULL) { +#if GTK_CHECK_VERSION (3, 20, 0) + GdkDisplay *display; + GdkSeat *seat; +#else GdkDeviceManager *manager; +#endif GdkDevice *device; GdkRectangle r1, r2; gint cx, cy, xhot, yhot; +#if GTK_CHECK_VERSION (3, 20, 0) + display = gdk_window_get_display (window); + seat = gdk_display_get_default_seat (display); + device = gdk_seat_get_pointer (seat); +#else manager = gdk_display_get_device_manager (gdk_display_get_default ()); device = gdk_device_manager_get_client_pointer (manager); +#endif gdk_window_get_device_position (window, device, &cx, &cy, NULL); sscanf (gdk_pixbuf_get_option (cursor_pixbuf, "x_hot"), "%d", &xhot); sscanf (gdk_pixbuf_get_option (cursor_pixbuf, "y_hot"), "%d", &yhot); |