diff options
Diffstat (limited to 'eel')
-rw-r--r-- | eel/eel-canvas.c | 113 | ||||
-rw-r--r-- | eel/eel-canvas.h | 18 |
2 files changed, 125 insertions, 6 deletions
diff --git a/eel/eel-canvas.c b/eel/eel-canvas.c index 1e45224d..ae4faaa7 100644 --- a/eel/eel-canvas.c +++ b/eel/eel-canvas.c @@ -342,7 +342,11 @@ eel_canvas_item_dispose (GObject *object) } #if GTK_CHECK_VERSION(3, 0, 0) +#if GTK_CHECK_VERSION(3, 20, 0) + eel_canvas_item_ungrab (item); +#else eel_canvas_item_ungrab (item, GDK_CURRENT_TIME); +#endif #else if (item == item->canvas->grabbed_item) { @@ -873,12 +877,40 @@ eel_canvas_item_hide (EelCanvasItem *item) } } +#if GTK_CHECK_VERSION(3, 20, 0) +/* + * Prepare the window for grabbing, i.e. show it. + */ +static void +seat_grab_prepare_window (GdkSeat *seat, + GdkWindow *window, + gpointer user_data) +{ + gdk_window_show (window); +} /** * eel_canvas_item_grab: * @item: A canvas item. * @event_mask: Mask of events that will be sent to this item. * @cursor: If non-NULL, the cursor that will be used while the grab is active. + * @event: The event, triggering the grab, if any. + * + * Specifies that all events that match the specified event mask should be sent + * to the specified item, and also grabs the seat by calling gdk_seat_grab(). + * If @cursor is not NULL, then that cursor is used while the grab is active. + * + * Return value: If an item was already grabbed, it returns %GDK_GRAB_ALREADY_GRABBED. If + * the specified item was hidden by calling eel_canvas_item_hide(), then it + * returns %GDK_GRAB_NOT_VIEWABLE. Else, it returns the result of calling + * gdk_seat_grab(). + **/ +#else +/** + * eel_canvas_item_grab: + * @item: A canvas item. + * @event_mask: Mask of events that will be sent to this item. + * @cursor: If non-NULL, the cursor that will be used while the grab is active. * @etime: The timestamp required for grabbing the mouse, or GDK_CURRENT_TIME. * * Specifies that all events that match the specified event mask should be sent @@ -892,17 +924,26 @@ eel_canvas_item_hide (EelCanvasItem *item) * returns %GDK_GRAB_NOT_VIEWABLE. Else, it returns the result of calling * gdk_pointer_grab(). **/ +#endif #if GTK_CHECK_VERSION(3, 0, 0) GdkGrabStatus eel_canvas_item_grab (EelCanvasItem *item, GdkEventMask event_mask, GdkCursor *cursor, +#if GTK_CHECK_VERSION(3, 20, 0) + const GdkEvent *event) +{ + GdkGrabStatus retval; + GdkDisplay *display; + GdkSeat *seat; +#else guint32 timestamp) { GdkGrabStatus retval; GdkDisplay *display; GdkDeviceManager *manager; GdkDevice *device; +#endif g_return_val_if_fail (EEL_IS_CANVAS_ITEM (item), GDK_GRAB_NOT_VIEWABLE); g_return_val_if_fail (gtk_widget_get_mapped (GTK_WIDGET (item->canvas)), @@ -915,6 +956,18 @@ eel_canvas_item_grab (EelCanvasItem *item, return GDK_GRAB_NOT_VIEWABLE; display = gtk_widget_get_display (GTK_WIDGET (item->canvas)); +#if GTK_CHECK_VERSION(3, 20, 0) + seat = gdk_display_get_default_seat (display); + + retval = gdk_seat_grab (seat, + gtk_layout_get_bin_window (GTK_LAYOUT (item->canvas)), + GDK_SEAT_CAPABILITY_ALL_POINTING, + FALSE, + cursor, + event, + seat_grab_prepare_window, + NULL); +#else manager = gdk_display_get_device_manager (display); device = gdk_device_manager_get_client_pointer (manager); @@ -925,6 +978,7 @@ eel_canvas_item_grab (EelCanvasItem *item, event_mask, cursor, timestamp); +#endif #else int eel_canvas_item_grab (EelCanvasItem *item, guint event_mask, GdkCursor *cursor, guint32 etime) @@ -959,7 +1013,15 @@ eel_canvas_item_grab (EelCanvasItem *item, guint event_mask, GdkCursor *cursor, return retval; } - +#if GTK_CHECK_VERSION(3, 20, 0) +/** + * eel_canvas_item_ungrab: + * @item: A canvas item that holds a grab. + * + * Ungrabs the item, which must have been grabbed in the canvas, and ungrabs the + * seat. + **/ +#else /** * eel_canvas_item_ungrab: * @item: A canvas item that holds a grab. @@ -968,14 +1030,32 @@ eel_canvas_item_grab (EelCanvasItem *item, guint event_mask, GdkCursor *cursor, * Ungrabs the item, which must have been grabbed in the canvas, and ungrabs the * mouse. **/ +#endif +#if GTK_CHECK_VERSION(3, 0, 0) void +#if GTK_CHECK_VERSION(3, 20, 0) +eel_canvas_item_ungrab (EelCanvasItem *item) +{ + GdkDisplay *display; + GdkSeat *seat; + + g_return_if_fail (EEL_IS_CANVAS_ITEM (item)); + + if (item->canvas->grabbed_item != item) + return; + + display = gtk_widget_get_display (GTK_WIDGET (item->canvas)); + seat = gdk_display_get_default_seat (display); + + item->canvas->grabbed_item = NULL; + gdk_seat_ungrab (seat); +} +#else eel_canvas_item_ungrab (EelCanvasItem *item, guint32 etime) { GdkDisplay *display; -#if GTK_CHECK_VERSION(3, 0, 0) GdkDeviceManager *manager; GdkDevice *device; -#endif g_return_if_fail (EEL_IS_CANVAS_ITEM (item)); @@ -983,17 +1063,29 @@ eel_canvas_item_ungrab (EelCanvasItem *item, guint32 etime) return; display = gtk_widget_get_display (GTK_WIDGET (item->canvas)); -#if GTK_CHECK_VERSION(3, 0, 0) manager = gdk_display_get_device_manager (display); device = gdk_device_manager_get_client_pointer (manager); item->canvas->grabbed_item = NULL; gdk_device_ungrab (device, etime); +} +#endif #else +void +eel_canvas_item_ungrab (EelCanvasItem *item, guint32 etime) +{ + GdkDisplay *display; + + g_return_if_fail (EEL_IS_CANVAS_ITEM (item)); + + if (item->canvas->grabbed_item != item) + return; + + display = gtk_widget_get_display (GTK_WIDGET (item->canvas)); item->canvas->grabbed_item = NULL; gdk_display_pointer_ungrab (display, etime); -#endif } +#endif /** * eel_canvas_item_w2i: @@ -2324,7 +2416,9 @@ shutdown_transients (EelCanvas *canvas) if (canvas->grabbed_item) { -#if GTK_CHECK_VERSION(3, 0, 0) +#if GTK_CHECK_VERSION(3, 20, 0) + eel_canvas_item_ungrab (canvas->grabbed_item); +#elif GTK_CHECK_VERSION(3, 0, 0) eel_canvas_item_ungrab (canvas->grabbed_item, GDK_CURRENT_TIME); #else GdkDisplay *display = gtk_widget_get_display (GTK_WIDGET (canvas)); @@ -2732,24 +2826,31 @@ emit_event (EelCanvas *canvas, GdkEvent *event) break; case GDK_MOTION_NOTIFY: +#if !GTK_CHECK_VERSION(3, 20, 0) eel_canvas_window_to_world (canvas, ev.motion.x, ev.motion.y, &ev.motion.x, &ev.motion.y); break; +#endif case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: case GDK_3BUTTON_PRESS: +#if GTK_CHECK_VERSION(3, 20, 0) + case GDK_BUTTON_RELEASE: +#endif eel_canvas_window_to_world (canvas, ev.motion.x, ev.motion.y, &ev.motion.x, &ev.motion.y); break; +#if !GTK_CHECK_VERSION(3, 20, 0) case GDK_BUTTON_RELEASE: eel_canvas_window_to_world (canvas, ev.motion.x, ev.motion.y, &ev.motion.x, &ev.motion.y); break; +#endif default: break; diff --git a/eel/eel-canvas.h b/eel/eel-canvas.h index f641087a..fcb4cb3d 100644 --- a/eel/eel-canvas.h +++ b/eel/eel-canvas.h @@ -250,25 +250,43 @@ extern "C" { */ void eel_canvas_item_hide (EelCanvasItem *item); +#if GTK_CHECK_VERSION(3, 20, 0) + /* Grab the seat for the specified item. Only the events in event_mask will be + * reported. If cursor is non-NULL, it will be used during the duration of the + * grab. event is the event, triggering the grab. Returns the same values as gdk_seat_grab(). + */ +#else /* Grab the mouse for the specified item. Only the events in event_mask will be * reported. If cursor is non-NULL, it will be used during the duration of the * grab. Time is a proper X event time parameter. Returns the same values as * XGrabPointer(). */ +#endif #if GTK_CHECK_VERSION (3, 0, 0) GdkGrabStatus eel_canvas_item_grab (EelCanvasItem *item, GdkEventMask event_mask, GdkCursor *cursor, +#if GTK_CHECK_VERSION(3, 20, 0) + const GdkEvent* event); +#else guint32 etime); +#endif #else int eel_canvas_item_grab (EelCanvasItem *item, unsigned int event_mask, GdkCursor *cursor, guint32 etime); #endif +#if GTK_CHECK_VERSION(3, 20, 0) + /* Ungrabs the seat -- the specified item must be the same that was passed to + * eel_canvas_item_grab(). + */ + void eel_canvas_item_ungrab (EelCanvasItem *item); +#else /* Ungrabs the mouse -- the specified item must be the same that was passed to * eel_canvas_item_grab(). Time is a proper X event time parameter. */ void eel_canvas_item_ungrab (EelCanvasItem *item, guint32 etime); +#endif /* These functions convert from a coordinate system to another. "w" is world * coordinates and "i" is item coordinates. |