Compare commits
	
		
			2 Commits
		
	
	
		
			3.28.0
			...
			wip/jstpie
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 46c0795125 | ||
|   | b51b2f7aa4 | 
| @@ -95,6 +95,8 @@ struct _MetaBackendClass | ||||
|   void (* set_numlock) (MetaBackend *backend, | ||||
|                         gboolean     numlock_state); | ||||
|  | ||||
|   void (* track_position) (MetaBackend *backend, | ||||
|                            gboolean     enabled); | ||||
| }; | ||||
|  | ||||
| void meta_init_backend (GType backend_gtype); | ||||
| @@ -150,4 +152,10 @@ gboolean meta_is_stage_views_enabled (void); | ||||
|  | ||||
| MetaInputSettings *meta_backend_get_input_settings (MetaBackend *backend); | ||||
|  | ||||
| void meta_backend_update_cursor_position (MetaBackend *backend, int x, int y); | ||||
|  | ||||
| void meta_backend_cursor_position_changed (MetaBackend *backend); | ||||
| void meta_backend_track_position_ref (MetaBackend *backend); | ||||
| void meta_backend_track_position_unref (MetaBackend *backend); | ||||
|  | ||||
| #endif /* META_BACKEND_PRIVATE_H */ | ||||
|   | ||||
| @@ -78,6 +78,8 @@ struct _MetaBackendPrivate | ||||
|   int current_device_id; | ||||
|  | ||||
|   MetaPointerConstraint *client_pointer_constraint; | ||||
|  | ||||
|   uint32_t track_position_refcount; | ||||
| }; | ||||
| typedef struct _MetaBackendPrivate MetaBackendPrivate; | ||||
|  | ||||
| @@ -866,3 +868,42 @@ meta_backend_get_input_settings (MetaBackend *backend) | ||||
|  | ||||
|   return priv->input_settings; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_backend_update_cursor_position (MetaBackend *backend, int x, int y) | ||||
| { | ||||
|   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); | ||||
|  | ||||
|   meta_cursor_renderer_set_position (priv->cursor_renderer, x, y); | ||||
|  | ||||
|   meta_backend_cursor_position_changed (backend); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_backend_cursor_position_changed (MetaBackend *backend) | ||||
| { | ||||
|   meta_cursor_tracker_cursor_position_changed (backend->cursor_tracker); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_backend_track_position (MetaBackend *backend, gboolean enabled) | ||||
| { | ||||
|   if (META_BACKEND_GET_CLASS (backend)->track_position) | ||||
|     META_BACKEND_GET_CLASS (backend)->track_position (backend, enabled); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_backend_track_position_ref (MetaBackend *backend) | ||||
| { | ||||
|   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); | ||||
|   if (priv->track_position_refcount++ == 0) | ||||
|     meta_backend_track_position (backend, TRUE); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_backend_track_position_unref (MetaBackend *backend) | ||||
| { | ||||
|   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); | ||||
|   if (priv->track_position_refcount-- == 0) | ||||
|     meta_backend_track_position (backend, FALSE); | ||||
| } | ||||
|   | ||||
| @@ -61,10 +61,8 @@ void     meta_cursor_tracker_unset_window_cursor (MetaCursorTracker *tracker); | ||||
| void     meta_cursor_tracker_set_root_cursor     (MetaCursorTracker *tracker, | ||||
|                                                   MetaCursorSprite  *cursor_sprite); | ||||
|  | ||||
| void     meta_cursor_tracker_update_position (MetaCursorTracker *tracker, | ||||
| 					      int                new_x, | ||||
| 					      int                new_y); | ||||
|  | ||||
| MetaCursorSprite * meta_cursor_tracker_get_displayed_cursor (MetaCursorTracker *tracker); | ||||
|  | ||||
| void meta_backend_cursor_position_changed (MetaCursorTracker *tracker); | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -47,6 +47,7 @@ | ||||
| G_DEFINE_TYPE (MetaCursorTracker, meta_cursor_tracker, G_TYPE_OBJECT); | ||||
|  | ||||
| enum { | ||||
|   POSITION_CHANGED, | ||||
|   CURSOR_CHANGED, | ||||
|   LAST_SIGNAL | ||||
| }; | ||||
| @@ -128,6 +129,13 @@ meta_cursor_tracker_class_init (MetaCursorTrackerClass *klass) | ||||
|                                           0, | ||||
|                                           NULL, NULL, NULL, | ||||
|                                           G_TYPE_NONE, 0); | ||||
|  | ||||
|   signals[POSITION_CHANGED] = g_signal_new ("position-changed", | ||||
|                                             G_TYPE_FROM_CLASS (klass), | ||||
|                                             G_SIGNAL_RUN_LAST, | ||||
|                                             0, | ||||
|                                             NULL, NULL, NULL, | ||||
|                                             G_TYPE_NONE, 0); | ||||
| } | ||||
|  | ||||
| /** | ||||
| @@ -348,20 +356,6 @@ meta_cursor_tracker_set_root_cursor (MetaCursorTracker *tracker, | ||||
|   sync_cursor (tracker); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_cursor_tracker_update_position (MetaCursorTracker *tracker, | ||||
|                                      int                new_x, | ||||
|                                      int                new_y) | ||||
| { | ||||
|   MetaBackend *backend = meta_get_backend (); | ||||
|   MetaCursorRenderer *cursor_renderer = | ||||
|     meta_backend_get_cursor_renderer (backend); | ||||
|  | ||||
|   g_assert (meta_is_wayland_compositor ()); | ||||
|  | ||||
|   meta_cursor_renderer_set_position (cursor_renderer, new_x, new_y); | ||||
| } | ||||
|  | ||||
| static void | ||||
| get_pointer_position_gdk (int         *x, | ||||
|                           int         *y, | ||||
| @@ -435,3 +429,21 @@ meta_cursor_tracker_get_displayed_cursor (MetaCursorTracker *tracker) | ||||
| { | ||||
|   return tracker->displayed_cursor; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_cursor_tracker_position_changed (MetaCursorTracker *tracker) | ||||
| { | ||||
|   g_signal_emit (tracker, signals[POSITION_CHANGED], 0); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_cursor_tracker_enable_track_position (MetaCursorTracker *tracker) | ||||
| { | ||||
|   meta_backend_track_position_ref (meta_get_backend ()); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_cursor_tracker_disable_track_position (MetaCursorTracker *tracker) | ||||
| { | ||||
|   meta_backend_track_position_unref (meta_get_backend ()); | ||||
| } | ||||
|   | ||||
| @@ -322,7 +322,6 @@ meta_backend_native_warp_pointer (MetaBackend *backend, | ||||
| { | ||||
|   ClutterDeviceManager *manager = clutter_device_manager_get_default (); | ||||
|   ClutterInputDevice *device = clutter_device_manager_get_core_device (manager, CLUTTER_POINTER_DEVICE); | ||||
|   MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend); | ||||
|  | ||||
|   /* XXX */ | ||||
|   guint32 time_ = 0; | ||||
| @@ -331,7 +330,7 @@ meta_backend_native_warp_pointer (MetaBackend *backend, | ||||
|   clutter_evdev_warp_pointer (device, time_, x, y); | ||||
|  | ||||
|   /* Warp displayed pointer cursor. */ | ||||
|   meta_cursor_tracker_update_position (cursor_tracker, x, y); | ||||
|   meta_backend_set_cursor_position (backend, x, y); | ||||
| } | ||||
|  | ||||
| static MetaLogicalMonitor * | ||||
|   | ||||
| @@ -114,7 +114,8 @@ meta_backend_x11_cm_update_screen_size (MetaBackend *backend, | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_backend_x11_cm_select_stage_events (MetaBackend *backend) | ||||
| select_xi_stage (MetaBackend *backend, | ||||
|                  gboolean     include_motion) | ||||
| { | ||||
|   MetaBackendX11 *x11 = META_BACKEND_X11 (backend); | ||||
|   Display *xdisplay = meta_backend_x11_get_xdisplay (x11); | ||||
| @@ -132,9 +133,24 @@ meta_backend_x11_cm_select_stage_events (MetaBackend *backend) | ||||
|   XISetMask (mask.mask, XI_FocusOut); | ||||
|   XISetMask (mask.mask, XI_Motion); | ||||
|  | ||||
|   if (include_motion) | ||||
|     XISetMask (mask.mask, XI_RawMotion); | ||||
|  | ||||
|   XISelectEvents (xdisplay, xwin, &mask, 1); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_backend_x11_cm_select_stage_events (MetaBackend *backend) | ||||
| { | ||||
|   select_xi_stage (backend, FALSE); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_backend_x11_cm_track_position (MetaBackend *x11, gboolean enabled) | ||||
| { | ||||
|   select_xi_stage (backend, enabled); | ||||
| } | ||||
|  | ||||
| static void | ||||
| get_xkbrf_var_defs (Display           *xdisplay, | ||||
|                     const char        *layouts, | ||||
| @@ -386,6 +402,7 @@ meta_backend_x11_cm_class_init (MetaBackendX11CmClass *klass) | ||||
|   backend_class->select_stage_events = meta_backend_x11_cm_select_stage_events; | ||||
|   backend_class->lock_layout_group = meta_backend_x11_cm_lock_layout_group; | ||||
|   backend_class->set_keymap = meta_backend_x11_cm_set_keymap; | ||||
|   backend_class->track_position = meta_backend_x11_cm_track_position; | ||||
|  | ||||
|   backend_x11_class->handle_host_xevent = meta_backend_x11_cm_handle_host_xevent; | ||||
|   backend_x11_class->translate_device_event = meta_backend_x11_cm_translate_device_event; | ||||
|   | ||||
| @@ -207,6 +207,8 @@ handle_input_event (MetaBackendX11 *x11, | ||||
|  | ||||
|       if (input_event->evtype == XI_DeviceChanged) | ||||
|         handle_device_change (x11, input_event); | ||||
|       else if (input_event->evtype == XI_RawMotion) | ||||
|         meta_backend_cursor_position_changed (META_BACKEND (x11)); | ||||
|       else | ||||
|         maybe_spoof_event_as_stage_event (x11, input_event); | ||||
|     } | ||||
|   | ||||
| @@ -61,7 +61,8 @@ meta_backend_x11_nested_update_screen_size (MetaBackend *backend, | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_backend_x11_nested_select_stage_events (MetaBackend *backend) | ||||
| select_xi_stage (MetaBackend *backend, | ||||
|                  gboolean     include_motion) | ||||
| { | ||||
|   MetaBackendX11 *x11 = META_BACKEND_X11 (backend); | ||||
|   Display *xdisplay = meta_backend_x11_get_xdisplay (x11); | ||||
| @@ -79,6 +80,9 @@ meta_backend_x11_nested_select_stage_events (MetaBackend *backend) | ||||
|   XISetMask (mask.mask, XI_FocusOut); | ||||
|   XISetMask (mask.mask, XI_Motion); | ||||
|  | ||||
|   if (include_motion) | ||||
|     XISetMask (mask.mask, XI_RawMotion); | ||||
|  | ||||
|   /* | ||||
|    * When we're an X11 compositor, we can't take these events or else replaying | ||||
|    * events from our passive root window grab will cause them to come back to | ||||
| @@ -91,6 +95,16 @@ meta_backend_x11_nested_select_stage_events (MetaBackend *backend) | ||||
|   XISetMask (mask.mask, XI_TouchUpdate); | ||||
|  | ||||
|   XISelectEvents (xdisplay, xwin, &mask, 1); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_backend_x11_nested_select_stage_events (MetaBackend *backend) | ||||
| { | ||||
|   select_xi_stage (backend, FALSE); | ||||
|  | ||||
|   MetaBackendX11 *x11 = META_BACKEND_X11 (backend); | ||||
|   Display *xdisplay = meta_backend_x11_get_xdisplay (x11); | ||||
|   Window xwin = meta_backend_x11_get_xwindow (x11); | ||||
|  | ||||
|   /* | ||||
|    * We have no way of tracking key changes when the stage doesn't have focus, | ||||
| @@ -105,6 +119,12 @@ meta_backend_x11_nested_select_stage_events (MetaBackend *backend) | ||||
|                xwa.your_event_mask | FocusChangeMask | KeymapStateMask); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_backend_x11_nested_track_position (MetaBackend *x11, gboolean enabled) | ||||
| { | ||||
|   select_xi_stage (backend, enabled); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_backend_x11_nested_lock_layout_group (MetaBackend *backend, | ||||
|                                            guint        idx) | ||||
| @@ -178,6 +198,7 @@ meta_backend_x11_nested_class_init (MetaBackendX11NestedClass *klass) | ||||
|   backend_class->select_stage_events = meta_backend_x11_nested_select_stage_events; | ||||
|   backend_class->lock_layout_group = meta_backend_x11_nested_lock_layout_group; | ||||
|   backend_class->set_keymap = meta_backend_x11_nested_set_keymap; | ||||
|   backend_class->track_position = meta_backend_x11_nested_track_position; | ||||
|  | ||||
|   backend_x11_class->handle_host_xevent = meta_backend_x11_nested_handle_host_xevent; | ||||
|   backend_x11_class->translate_device_event = meta_backend_x11_nested_translate_device_event; | ||||
|   | ||||
| @@ -251,10 +251,7 @@ meta_display_handle_event (MetaDisplay        *display, | ||||
|         } | ||||
|       else | ||||
|         { | ||||
|           MetaCursorTracker *cursor_tracker = | ||||
|             meta_backend_get_cursor_tracker (backend); | ||||
|  | ||||
|           meta_cursor_tracker_update_position (cursor_tracker, | ||||
|           meta_backend_update_cursor_position (cursor_tracker, | ||||
|                                                event->motion.x, | ||||
|                                                event->motion.y); | ||||
|         } | ||||
|   | ||||
| @@ -53,4 +53,7 @@ void           meta_cursor_tracker_get_pointer (MetaCursorTracker   *tracker, | ||||
| void           meta_cursor_tracker_set_pointer_visible (MetaCursorTracker *tracker, | ||||
|                                                         gboolean           visible); | ||||
|  | ||||
| void           meta_cursor_tracker_enable_track_position (MetaCursorTracker *tracker); | ||||
| void           meta_cursor_tracker_disable_track_position (MetaCursorTracker *tracker); | ||||
|  | ||||
| #endif | ||||
|   | ||||
		Reference in New Issue
	
	Block a user