diff --git a/src/core/display-private.h b/src/core/display-private.h index e63d22c98..59ce08563 100644 --- a/src/core/display-private.h +++ b/src/core/display-private.h @@ -97,6 +97,10 @@ typedef enum { META_EVENT_ROUTE_WINDOW_OP, } MetaEventRoute; +typedef gboolean (*MetaAlarmFilter) (MetaDisplay *display, + XSyncAlarmNotifyEvent *event, + gpointer data); + struct _MetaDisplay { GObject parent_instance; @@ -256,6 +260,9 @@ struct _MetaDisplay MetaGestureTracker *gesture_tracker; ClutterEventSequence *pointer_emulating_sequence; + MetaAlarmFilter alarm_filter; + gpointer alarm_filter_data; + int composite_event_base; int composite_error_base; int composite_major_version; @@ -453,4 +460,8 @@ void meta_display_cancel_touch (MetaDisplay *display); gboolean meta_display_windows_are_interactable (MetaDisplay *display); +gboolean meta_display_set_alarm_filter (MetaDisplay *display, + MetaAlarmFilter filter, + gpointer data); + #endif diff --git a/src/core/display.c b/src/core/display.c index a6c5612f5..38630d606 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -2954,3 +2954,14 @@ meta_display_is_pointer_emulating_sequence (MetaDisplay *display, return display->pointer_emulating_sequence == sequence; } + +gboolean +meta_display_set_alarm_filter (MetaDisplay *display, + MetaAlarmFilter filter, + gpointer data) +{ + g_return_if_fail (filter == NULL || display->alarm_filter == NULL); + + display->alarm_filter = filter; + display->alarm_filter_data = data; +} diff --git a/src/x11/events.c b/src/x11/events.c index 19fbcaa4d..97bd41fe5 100644 --- a/src/x11/events.c +++ b/src/x11/events.c @@ -1188,6 +1188,14 @@ handle_other_xevent (MetaDisplay *display, meta_window_x11_update_sync_request_counter (alarm_window, new_counter_value); bypass_gtk = TRUE; /* GTK doesn't want to see this really */ } + else + { + if (display->alarm_filter && + display->alarm_filter (display, + (XSyncAlarmNotifyEvent*)event, + display->alarm_filter_data)) + bypass_gtk = TRUE; + } goto out; }