diff --git a/clutter/clutter/clutter-backend-private.h b/clutter/clutter/clutter-backend-private.h index d75c6a210..a97bf9e85 100644 --- a/clutter/clutter/clutter-backend-private.h +++ b/clutter/clutter/clutter-backend-private.h @@ -24,7 +24,6 @@ #include #include -#include #include #include @@ -60,8 +59,6 @@ struct _ClutterBackend ClutterStageWindow *stage_window; ClutterInputMethod *input_method; - - ClutterKeymap *keymap; }; struct _ClutterBackendClass @@ -96,8 +93,6 @@ struct _ClutterBackendClass gpointer native, ClutterEvent *event); - ClutterKeymap * (* get_keymap) (ClutterBackend *backend); - ClutterSeat * (* get_default_seat) (ClutterBackend *backend); /* signals */ diff --git a/clutter/clutter/clutter-backend.c b/clutter/clutter/clutter-backend.c index 8f44822ec..3e9ba7a86 100644 --- a/clutter/clutter/clutter-backend.c +++ b/clutter/clutter/clutter-backend.c @@ -540,18 +540,6 @@ clutter_backend_real_get_device_manager (ClutterBackend *backend) return backend->device_manager; } -static ClutterKeymap * -clutter_backend_real_get_keymap (ClutterBackend *backend) -{ - if (G_UNLIKELY (backend->keymap == NULL)) - { - g_critical ("No keymap available, expect broken keyboard input"); - return NULL; - } - - return backend->keymap; -} - static void clutter_backend_class_init (ClutterBackendClass *klass) { @@ -618,7 +606,6 @@ clutter_backend_class_init (ClutterBackendClass *klass) klass->get_device_manager = clutter_backend_real_get_device_manager; klass->create_context = clutter_backend_real_create_context; klass->get_features = clutter_backend_real_get_features; - klass->get_keymap = clutter_backend_real_get_keymap; } static void @@ -1037,20 +1024,6 @@ clutter_backend_set_input_method (ClutterBackend *backend, g_set_object (&backend->input_method, method); } -/** - * clutter_backend_get_keymap: - * @backend: the #ClutterBackend - * - * Gets the keymap used by Clutter - * - * Returns: (transfer none): the keymap - **/ -ClutterKeymap * -clutter_backend_get_keymap (ClutterBackend *backend) -{ - return CLUTTER_BACKEND_GET_CLASS (backend)->get_keymap (backend); -} - ClutterStageWindow * clutter_backend_get_stage_window (ClutterBackend *backend) { diff --git a/clutter/clutter/clutter-backend.h b/clutter/clutter/clutter-backend.h index 2d24ffd41..14f6c24d4 100644 --- a/clutter/clutter/clutter-backend.h +++ b/clutter/clutter/clutter-backend.h @@ -79,9 +79,6 @@ ClutterInputMethod * clutter_backend_get_input_method (Clutter CLUTTER_EXPORT void clutter_backend_set_input_method (ClutterBackend *backend, ClutterInputMethod *method); -CLUTTER_EXPORT -ClutterKeymap * clutter_backend_get_keymap (ClutterBackend *backend); - CLUTTER_EXPORT ClutterSeat * clutter_backend_get_default_seat (ClutterBackend *backend); diff --git a/clutter/clutter/clutter-seat.c b/clutter/clutter/clutter-seat.c index c4f1f0744..6295b2145 100644 --- a/clutter/clutter/clutter-seat.c +++ b/clutter/clutter/clutter-seat.c @@ -214,3 +214,17 @@ clutter_seat_bell_notify (ClutterSeat *seat) { CLUTTER_SEAT_GET_CLASS (seat)->bell_notify (seat); } + +/** + * clutter_seat_get_keymap: + * @seat: a #ClutterSeat + * + * Returns the seat keymap + * + * Returns: (transfer none): the seat keymap + **/ +ClutterKeymap * +clutter_seat_get_keymap (ClutterSeat *seat) +{ + return CLUTTER_SEAT_GET_CLASS (seat)->get_keymap (seat); +} diff --git a/clutter/clutter/clutter-seat.h b/clutter/clutter/clutter-seat.h index 62130dd87..425099102 100644 --- a/clutter/clutter/clutter-seat.h +++ b/clutter/clutter/clutter-seat.h @@ -28,6 +28,7 @@ #endif #include "clutter/clutter-types.h" +#include "clutter/clutter-keymap.h" #define CLUTTER_TYPE_SEAT (clutter_seat_get_type ()) @@ -47,6 +48,8 @@ struct _ClutterSeatClass GList * (* list_devices) (ClutterSeat *seat); void (* bell_notify) (ClutterSeat *seat); + + ClutterKeymap * (* get_keymap) (ClutterSeat *seat); }; CLUTTER_EXPORT @@ -58,4 +61,7 @@ GList * clutter_seat_list_devices (ClutterSeat *seat); CLUTTER_EXPORT void clutter_seat_bell_notify (ClutterSeat *seat); +CLUTTER_EXPORT +ClutterKeymap * clutter_seat_get_keymap (ClutterSeat *seat); + #endif /* CLUTTER_SEAT_H */ diff --git a/clutter/clutter/clutter-text.c b/clutter/clutter/clutter-text.c index a7c09d47c..8efbfa07c 100644 --- a/clutter/clutter/clutter-text.c +++ b/clutter/clutter/clutter-text.c @@ -760,9 +760,11 @@ clutter_text_create_layout_no_cache (ClutterText *text, if (clutter_actor_has_key_focus (CLUTTER_ACTOR (text))) { + ClutterSeat *seat; ClutterKeymap *keymap; - keymap = clutter_backend_get_keymap (backend); + seat = clutter_backend_get_default_seat (backend); + keymap = clutter_seat_get_keymap (seat); pango_dir = clutter_keymap_get_direction (keymap); } else diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c index 12db4b686..4497f4279 100644 --- a/src/backends/meta-backend.c +++ b/src/backends/meta-backend.c @@ -181,9 +181,11 @@ meta_backend_finalize (GObject *object) if (priv->keymap_state_changed_id) { + ClutterSeat *seat; ClutterKeymap *keymap; - keymap = clutter_backend_get_keymap (priv->clutter_backend); + seat = clutter_backend_get_default_seat (priv->clutter_backend); + keymap = clutter_seat_get_keymap (seat); g_clear_signal_handler (&priv->keymap_state_changed_id, keymap); } @@ -499,7 +501,8 @@ meta_backend_real_post_init (MetaBackend *backend) { MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); ClutterDeviceManager *device_manager = clutter_device_manager_get_default (); - ClutterKeymap *keymap = clutter_backend_get_keymap (priv->clutter_backend); + ClutterSeat *seat = clutter_backend_get_default_seat (priv->clutter_backend); + ClutterKeymap *keymap = clutter_seat_get_keymap (seat); priv->stage = meta_stage_new (backend); clutter_actor_realize (priv->stage); diff --git a/src/backends/meta-input-settings.c b/src/backends/meta-input-settings.c index 28dc387ef..1ddfb86e5 100644 --- a/src/backends/meta-input-settings.c +++ b/src/backends/meta-input-settings.c @@ -2642,6 +2642,7 @@ void meta_input_settings_maybe_save_numlock_state (MetaInputSettings *input_settings) { MetaInputSettingsPrivate *priv; + ClutterSeat *seat; ClutterKeymap *keymap; gboolean numlock_state; @@ -2650,7 +2651,8 @@ meta_input_settings_maybe_save_numlock_state (MetaInputSettings *input_settings) if (!g_settings_get_boolean (priv->keyboard_settings, "remember-numlock-state")) return; - keymap = clutter_backend_get_keymap (clutter_get_default_backend ()); + seat = clutter_backend_get_default_seat (clutter_get_default_backend ()); + keymap = clutter_seat_get_keymap (seat); numlock_state = clutter_keymap_get_num_lock_state (keymap); if (numlock_state == g_settings_get_boolean (priv->keyboard_settings, "numlock-state")) diff --git a/src/backends/native/meta-clutter-backend-native.c b/src/backends/native/meta-clutter-backend-native.c index cae9c6728..f00c00918 100644 --- a/src/backends/native/meta-clutter-backend-native.c +++ b/src/backends/native/meta-clutter-backend-native.c @@ -45,7 +45,6 @@ #include "backends/meta-backend-private.h" #include "backends/meta-renderer.h" #include "backends/native/meta-device-manager-native.h" -#include "backends/native/meta-keymap-native.h" #include "backends/native/meta-seat-native.h" #include "backends/native/meta-stage-native.h" #include "clutter/clutter.h" @@ -58,7 +57,6 @@ struct _MetaClutterBackendNative MetaSeatNative *main_seat; MetaStageNative *stage_native; - MetaKeymapNative *keymap; MetaDeviceManagerNative *device_manager; }; @@ -111,21 +109,12 @@ meta_clutter_backend_native_get_device_manager (ClutterBackend *backend) return CLUTTER_DEVICE_MANAGER (backend_native->device_manager); } -static ClutterKeymap * -meta_clutter_backend_native_get_keymap (ClutterBackend *backend) -{ - MetaClutterBackendNative *backend_native = META_CLUTTER_BACKEND_NATIVE (backend); - - return CLUTTER_KEYMAP (backend_native->keymap); -} - static void meta_clutter_backend_native_init_events (ClutterBackend *backend) { MetaClutterBackendNative *backend_native = META_CLUTTER_BACKEND_NATIVE (backend); const gchar *seat_id = evdev_seat_id ? evdev_seat_id : "seat0"; - backend_native->keymap = g_object_new (META_TYPE_KEYMAP_NATIVE, NULL); backend_native->main_seat = g_object_new (META_TYPE_SEAT_NATIVE, "backend", backend, "seat-id", seat_id, @@ -155,7 +144,6 @@ meta_clutter_backend_native_class_init (MetaClutterBackendNativeClass *klass) clutter_backend_class->get_renderer = meta_clutter_backend_native_get_renderer; clutter_backend_class->create_stage = meta_clutter_backend_native_create_stage; clutter_backend_class->get_device_manager = meta_clutter_backend_native_get_device_manager; - clutter_backend_class->get_keymap = meta_clutter_backend_native_get_keymap; clutter_backend_class->init_events = meta_clutter_backend_native_init_events; clutter_backend_class->get_default_seat = meta_clutter_backend_native_get_default_seat; } diff --git a/src/backends/native/meta-device-manager-native.c b/src/backends/native/meta-device-manager-native.c index 299b4bcda..50a1b3c13 100644 --- a/src/backends/native/meta-device-manager-native.c +++ b/src/backends/native/meta-device-manager-native.c @@ -320,11 +320,11 @@ meta_device_manager_native_set_keyboard_map (ClutterDeviceManager *evdev, g_return_if_fail (META_IS_DEVICE_MANAGER_NATIVE (evdev)); - keymap = clutter_backend_get_keymap (clutter_get_default_backend ()); + manager_evdev = META_DEVICE_MANAGER_NATIVE (evdev); + keymap = clutter_seat_get_keymap (CLUTTER_SEAT (manager_evdev->priv->main_seat)); meta_keymap_native_set_keyboard_map (META_KEYMAP_NATIVE (keymap), xkb_keymap); - manager_evdev = META_DEVICE_MANAGER_NATIVE (evdev); meta_seat_native_update_xkb_state (manager_evdev->priv->main_seat); } @@ -428,7 +428,7 @@ meta_device_manager_native_set_keyboard_numlock (ClutterDeviceManager *evdev, manager_evdev = META_DEVICE_MANAGER_NATIVE (evdev); priv = manager_evdev->priv; - keymap = clutter_backend_get_keymap (clutter_get_default_backend ()); + keymap = clutter_seat_get_keymap (CLUTTER_SEAT (priv->main_seat)); xkb_keymap = meta_keymap_native_get_keyboard_map (META_KEYMAP_NATIVE (keymap)); numlock = (1 << xkb_keymap_mod_get_index (xkb_keymap, "Mod2")); diff --git a/src/backends/native/meta-input-settings-native.c b/src/backends/native/meta-input-settings-native.c index 4c980cbab..a202012e3 100644 --- a/src/backends/native/meta-input-settings-native.c +++ b/src/backends/native/meta-input-settings-native.c @@ -28,6 +28,7 @@ #include "backends/meta-logical-monitor.h" #include "backends/native/meta-backend-native.h" +#include "backends/native/meta-device-manager-native.h" #include "backends/native/meta-input-device-native.h" #include "backends/native/meta-input-device-tool-native.h" #include "backends/native/meta-input-settings-native.h" diff --git a/src/backends/native/meta-keymap-native.h b/src/backends/native/meta-keymap-native.h index 3f30f287a..27364984c 100644 --- a/src/backends/native/meta-keymap-native.h +++ b/src/backends/native/meta-keymap-native.h @@ -18,6 +18,8 @@ * * Author: Carlos Garnacho */ +#ifndef META_KEYMAP_NATIVE_H +#define META_KEYMAP_NATIVE_H #include "backends/native/meta-xkb-utils.h" #include "clutter/clutter.h" @@ -30,3 +32,5 @@ G_DECLARE_FINAL_TYPE (MetaKeymapNative, meta_keymap_native, void meta_keymap_native_set_keyboard_map (MetaKeymapNative *keymap, struct xkb_keymap *xkb_keymap); struct xkb_keymap * meta_keymap_native_get_keyboard_map (MetaKeymapNative *keymap); + +#endif /* META_KEYMAP_NATIVE_H */ diff --git a/src/backends/native/meta-seat-native.c b/src/backends/native/meta-seat-native.c index 7f12bc6b5..68415b22c 100644 --- a/src/backends/native/meta-seat-native.c +++ b/src/backends/native/meta-seat-native.c @@ -333,10 +333,7 @@ meta_seat_native_notify_key (MetaSeatNative *seat, if (update_keys && (changed_state & XKB_STATE_LEDS)) { - ClutterBackend *backend; - - backend = clutter_get_default_backend (); - g_signal_emit_by_name (clutter_backend_get_keymap (backend), "state-changed"); + g_signal_emit_by_name (seat->keymap, "state-changed"); meta_seat_native_sync_leds (seat); meta_input_device_native_a11y_maybe_notify_toggle_keys (META_INPUT_DEVICE_NATIVE (seat->core_keyboard)); } @@ -2329,6 +2326,7 @@ meta_seat_native_constructed (GObject *object) ClutterStage *stage; MetaEventSource *source; struct udev *udev; + struct xkb_keymap *xkb_keymap; device = meta_input_device_native_new_virtual ( seat, CLUTTER_POINTER_DEVICE, @@ -2378,6 +2376,21 @@ meta_seat_native_constructed (GObject *object) source = meta_event_source_new (seat); seat->event_source = source; + seat->keymap = g_object_new (META_TYPE_KEYMAP_NATIVE, NULL); + xkb_keymap = meta_keymap_native_get_keyboard_map (seat->keymap); + + if (xkb_keymap) + { + seat->xkb = xkb_state_new (xkb_keymap); + + seat->caps_lock_led = + xkb_keymap_led_get_index (xkb_keymap, XKB_LED_NAME_CAPS); + seat->num_lock_led = + xkb_keymap_led_get_index (xkb_keymap, XKB_LED_NAME_NUM); + seat->scroll_lock_led = + xkb_keymap_led_get_index (xkb_keymap, XKB_LED_NAME_SCROLL); + } + if (G_OBJECT_CLASS (meta_seat_native_parent_class)->constructed) G_OBJECT_CLASS (meta_seat_native_parent_class)->constructed (object); } @@ -2512,6 +2525,14 @@ meta_seat_native_bell_notify (ClutterSeat *seat) meta_bell_notify (display, NULL); } +static ClutterKeymap * +meta_seat_native_get_keymap (ClutterSeat *seat) +{ + MetaSeatNative *seat_native = META_SEAT_NATIVE (seat); + + return CLUTTER_KEYMAP (seat_native->keymap); +} + static void meta_seat_native_class_init (MetaSeatNativeClass *klass) { @@ -2528,6 +2549,7 @@ meta_seat_native_class_init (MetaSeatNativeClass *klass) seat_class->get_keyboard = meta_seat_native_get_keyboard; seat_class->list_devices = meta_seat_native_list_devices; seat_class->bell_notify = meta_seat_native_bell_notify; + seat_class->get_keymap = meta_seat_native_get_keymap; props[PROP_SEAT_ID] = g_param_spec_string ("seat-id", @@ -2571,9 +2593,6 @@ meta_seat_native_stage_removed_cb (ClutterStageManager *manager, static void meta_seat_native_init (MetaSeatNative *seat) { - ClutterKeymap *keymap; - struct xkb_keymap *xkb_keymap; - seat->stage_manager = clutter_stage_manager_get_default (); g_object_ref (seat->stage_manager); @@ -2600,21 +2619,6 @@ meta_seat_native_init (MetaSeatNative *seat) seat->repeat = TRUE; seat->repeat_delay = 250; /* ms */ seat->repeat_interval = 33; /* ms */ - - keymap = clutter_backend_get_keymap (clutter_get_default_backend ()); - xkb_keymap = meta_keymap_native_get_keyboard_map (META_KEYMAP_NATIVE (keymap)); - - if (xkb_keymap) - { - seat->xkb = xkb_state_new (xkb_keymap); - - seat->caps_lock_led = - xkb_keymap_led_get_index (xkb_keymap, XKB_LED_NAME_CAPS); - seat->num_lock_led = - xkb_keymap_led_get_index (xkb_keymap, XKB_LED_NAME_NUM); - seat->scroll_lock_led = - xkb_keymap_led_get_index (xkb_keymap, XKB_LED_NAME_SCROLL); - } } ClutterInputDevice * @@ -2794,10 +2798,8 @@ meta_seat_native_update_xkb_state (MetaSeatNative *seat) xkb_mod_mask_t latched_mods; xkb_mod_mask_t locked_mods; struct xkb_keymap *xkb_keymap; - ClutterKeymap *keymap; - keymap = clutter_backend_get_keymap (clutter_get_default_backend ()); - xkb_keymap = meta_keymap_native_get_keyboard_map (META_KEYMAP_NATIVE (keymap)); + xkb_keymap = meta_keymap_native_get_keyboard_map (seat->keymap); latched_mods = xkb_state_serialize_mods (seat->xkb, XKB_STATE_MODS_LATCHED); diff --git a/src/backends/native/meta-seat-native.h b/src/backends/native/meta-seat-native.h index c15cab8d9..41895523e 100644 --- a/src/backends/native/meta-seat-native.h +++ b/src/backends/native/meta-seat-native.h @@ -26,6 +26,7 @@ #include #include +#include "backends/native/meta-keymap-native.h" #include "backends/native/meta-xkb-utils.h" #include "clutter/clutter.h" @@ -114,6 +115,8 @@ struct _MetaSeatNative GSList *event_filters; + MetaKeymapNative *keymap; + /* keyboard repeat */ gboolean repeat; uint32_t repeat_delay; diff --git a/src/backends/native/meta-virtual-input-device-native.c b/src/backends/native/meta-virtual-input-device-native.c index 48856677c..829570b03 100644 --- a/src/backends/native/meta-virtual-input-device-native.c +++ b/src/backends/native/meta-virtual-input-device-native.c @@ -282,13 +282,15 @@ pick_keycode_for_keyval_in_current_group (ClutterVirtualInputDevice *virtual_dev { MetaVirtualInputDeviceNative *virtual_evdev = META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device); + ClutterBackend *backend; ClutterKeymap *keymap; struct xkb_keymap *xkb_keymap; struct xkb_state *state; guint keycode, layout; xkb_keycode_t min_keycode, max_keycode; - keymap = clutter_backend_get_keymap (clutter_get_default_backend ()); + backend = clutter_get_default_backend (); + keymap = clutter_seat_get_keymap (clutter_backend_get_default_seat (backend)); xkb_keymap = meta_keymap_native_get_keyboard_map (META_KEYMAP_NATIVE (keymap)); state = virtual_evdev->seat->xkb; diff --git a/src/backends/x11/meta-clutter-backend-x11.c b/src/backends/x11/meta-clutter-backend-x11.c index 4be8c2b28..7a24de416 100644 --- a/src/backends/x11/meta-clutter-backend-x11.c +++ b/src/backends/x11/meta-clutter-backend-x11.c @@ -42,7 +42,6 @@ struct _MetaClutterBackendX11 { ClutterBackendX11 parent; - MetaKeymapX11 *keymap; MetaDeviceManagerX11 *device_manager; MetaSeatX11 *core_seat; }; @@ -88,14 +87,6 @@ meta_clutter_backend_x11_get_device_manager (ClutterBackend *backend) return CLUTTER_DEVICE_MANAGER (backend_x11->device_manager); } -static ClutterKeymap * -meta_clutter_backend_x11_get_keymap (ClutterBackend *backend) -{ - MetaClutterBackendX11 *backend_x11 = META_CLUTTER_BACKEND_X11 (backend); - - return CLUTTER_KEYMAP (backend_x11->keymap); -} - static gboolean meta_clutter_backend_x11_translate_event (ClutterBackend *backend, gpointer native, @@ -110,9 +101,6 @@ meta_clutter_backend_x11_translate_event (ClutterBackend *backend, if (clutter_backend_class->translate_event (backend, native, event)) return TRUE; - if (meta_keymap_x11_handle_event (backend_x11->keymap, native)) - return FALSE; - stage_x11 = META_STAGE_X11 (clutter_backend_get_stage_window (backend)); if (meta_stage_x11_translate_event (stage_x11, native, event)) return TRUE; @@ -180,7 +168,6 @@ meta_clutter_backend_x11_class_init (MetaClutterBackendX11Class *klass) clutter_backend_class->get_renderer = meta_clutter_backend_x11_get_renderer; clutter_backend_class->create_stage = meta_clutter_backend_x11_create_stage; clutter_backend_class->get_device_manager = meta_clutter_backend_x11_get_device_manager; - clutter_backend_class->get_keymap = meta_clutter_backend_x11_get_keymap; clutter_backend_class->translate_event = meta_clutter_backend_x11_translate_event; clutter_backend_class->init_events = meta_clutter_backend_x11_init_events; clutter_backend_class->get_default_seat = meta_clutter_backend_x11_get_default_seat; diff --git a/src/backends/x11/meta-keymap-x11.c b/src/backends/x11/meta-keymap-x11.c index acc6682ed..ac2b1d787 100644 --- a/src/backends/x11/meta-keymap-x11.c +++ b/src/backends/x11/meta-keymap-x11.c @@ -516,22 +516,26 @@ meta_keymap_x11_get_caps_lock_state (ClutterKeymap *keymap) } static PangoDirection -meta_keymap_x11_get_direction (MetaKeymapX11 *keymap) +meta_keymap_x11_get_direction (ClutterKeymap *keymap) { + MetaKeymapX11 *keymap_x11; + g_return_val_if_fail (META_IS_KEYMAP_X11 (keymap), PANGO_DIRECTION_NEUTRAL); - if (keymap->use_xkb) + keymap_x11 = META_KEYMAP_X11 (keymap); + + if (keymap_x11->use_xkb) { - if (!keymap->has_direction) + if (!keymap_x11->has_direction) { XkbStateRec state_rec; XkbGetState (clutter_x11_get_default_display (), XkbUseCoreKbd, &state_rec); - update_direction (keymap, XkbStateGroup (&state_rec)); + update_direction (keymap_x11, XkbStateGroup (&state_rec)); } - return keymap->current_direction; + return keymap_x11->current_direction; } else { diff --git a/src/backends/x11/meta-seat-x11.c b/src/backends/x11/meta-seat-x11.c index b2c2d7815..52be5b480 100644 --- a/src/backends/x11/meta-seat-x11.c +++ b/src/backends/x11/meta-seat-x11.c @@ -47,6 +47,7 @@ struct _MetaSeatX11 GList *devices; GHashTable *devices_by_id; GHashTable *tools_by_serial; + MetaKeymapX11 *keymap; int pointer_id; int keyboard_id; @@ -1246,6 +1247,20 @@ translate_coords (MetaStageX11 *stage_x11, *y_out = CLAMP (event_y, 0, stage_height); } +static void +on_keymap_state_change (MetaKeymapX11 *keymap_x11, + gpointer data) +{ + ClutterSeat *seat = CLUTTER_SEAT (data); + ClutterKbdA11ySettings kbd_a11y_settings; + + /* On keymaps state change, just reapply the current settings, it'll + * take care of enabling/disabling mousekeys based on NumLock state. + */ + clutter_seat_get_kbd_a11y_settings (seat, &kbd_a11y_settings); + meta_seat_x11_apply_kbd_a11y_settings (seat, &kbd_a11y_settings); +} + static void meta_seat_x11_set_property (GObject *object, guint prop_id, @@ -1371,6 +1386,14 @@ meta_seat_x11_constructed (GObject *object) XSync (xdisplay, False); + seat_x11->keymap = g_object_new (META_TYPE_KEYMAP_X11, + "backend", backend, + NULL); + g_signal_connect (seat_x11->keymap, + "state-changed", + G_CALLBACK (on_keymap_state_change), + seat_x11); + if (G_OBJECT_CLASS (meta_seat_x11_parent_class)->constructed) G_OBJECT_CLASS (meta_seat_x11_parent_class)->constructed (object); } @@ -1427,6 +1450,12 @@ meta_seat_x11_bell_notify (ClutterSeat *seat) meta_bell_notify (display, NULL); } +static ClutterKeymap * +meta_seat_x11_get_keymap (ClutterSeat *seat) +{ + return CLUTTER_KEYMAP (META_SEAT_X11 (seat)->keymap); +} + static void meta_seat_x11_class_init (MetaSeatX11Class *klass) { @@ -1442,6 +1471,7 @@ meta_seat_x11_class_init (MetaSeatX11Class *klass) seat_class->get_keyboard = meta_seat_x11_get_keyboard; seat_class->list_devices = meta_seat_x11_list_devices; seat_class->bell_notify = meta_seat_x11_bell_notify; + seat_class->get_keymap = meta_seat_x11_get_keymap; props[PROP_OPCODE] = g_param_spec_int ("opcode", @@ -1523,6 +1553,9 @@ meta_seat_x11_translate_event (MetaSeatX11 *seat, XGenericEventCookie *cookie; XIEvent *xi_event; + if (meta_keymap_x11_handle_event (seat->keymap, xevent)) + return FALSE; + cookie = &xevent->xcookie; if (cookie->type != GenericEvent || @@ -1592,7 +1625,7 @@ meta_seat_x11_translate_event (MetaSeatX11 *seat, case XI_KeyRelease: { XIDeviceEvent *xev = (XIDeviceEvent *) xi_event; - MetaKeymapX11 *keymap_x11 = META_KEYMAP_X11 (clutter_backend_get_keymap (backend)); + MetaKeymapX11 *keymap_x11 = seat->keymap; MetaEventX11 *event_x11; char buffer[7] = { 0, }; gunichar n; diff --git a/src/backends/x11/meta-virtual-input-device-x11.c b/src/backends/x11/meta-virtual-input-device-x11.c index 5d96b8193..beeae72b9 100644 --- a/src/backends/x11/meta-virtual-input-device-x11.c +++ b/src/backends/x11/meta-virtual-input-device-x11.c @@ -131,7 +131,8 @@ meta_virtual_input_device_x11_notify_keyval (ClutterVirtualInputDevice *virtual_ ClutterKeyState key_state) { ClutterBackend *backend = clutter_get_default_backend (); - MetaKeymapX11 *keymap = META_KEYMAP_X11 (clutter_backend_get_keymap (backend)); + ClutterSeat *seat = clutter_backend_get_default_seat (backend); + MetaKeymapX11 *keymap = META_KEYMAP_X11 (clutter_seat_get_keymap (seat)); uint32_t keycode, level; if (!meta_keymap_x11_keycode_for_keyval (keymap, keyval, &keycode, &level)) diff --git a/src/backends/x11/meta-xkb-a11y-x11.c b/src/backends/x11/meta-xkb-a11y-x11.c index 2baed9808..c8e07b300 100644 --- a/src/backends/x11/meta-xkb-a11y-x11.c +++ b/src/backends/x11/meta-xkb-a11y-x11.c @@ -198,6 +198,7 @@ meta_device_manager_x11_apply_kbd_a11y_settings (ClutterDeviceManager *device_ ClutterKbdA11ySettings *kbd_a11y_settings) { ClutterBackend *backend; + ClutterSeat *seat; Display *xdisplay = clutter_x11_get_default_display (); XkbDescRec *desc; gboolean enable_accessX; @@ -207,6 +208,7 @@ meta_device_manager_x11_apply_kbd_a11y_settings (ClutterDeviceManager *device_ return; backend = clutter_get_default_backend (); + seat = clutter_backend_get_default_seat (backend); /* general */ enable_accessX = kbd_a11y_settings->controls & CLUTTER_A11Y_KEYBOARD_ENABLED; @@ -245,7 +247,7 @@ meta_device_manager_x11_apply_kbd_a11y_settings (ClutterDeviceManager *device_ } /* mouse keys */ - if (clutter_keymap_get_num_lock_state (clutter_backend_get_keymap (backend))) + if (clutter_keymap_get_num_lock_state (clutter_seat_get_keymap (seat))) { /* Disable mousekeys when NumLock is ON */ desc->ctrls->enabled_ctrls &= ~(XkbMouseKeysMask | XkbMouseKeysAccelMask); diff --git a/src/wayland/meta-wayland-keyboard.c b/src/wayland/meta-wayland-keyboard.c index d74ef0dfa..552e9707a 100644 --- a/src/wayland/meta-wayland-keyboard.c +++ b/src/wayland/meta-wayland-keyboard.c @@ -404,6 +404,7 @@ meta_wayland_keyboard_update_xkb_state (MetaWaylandKeyboard *keyboard) MetaBackend *backend = meta_get_backend (); xkb_layout_index_t layout_idx; ClutterKeymap *keymap; + ClutterSeat *seat; /* Preserve latched/locked modifiers state */ if (xkb_info->state) @@ -417,7 +418,8 @@ meta_wayland_keyboard_update_xkb_state (MetaWaylandKeyboard *keyboard) latched = locked = 0; } - keymap = clutter_backend_get_keymap (clutter_get_default_backend ()); + seat = clutter_backend_get_default_seat (clutter_get_default_backend ()); + keymap = clutter_seat_get_keymap (seat); numlock = (1 << xkb_keymap_mod_get_index (xkb_info->keymap, "Mod2")); if (clutter_keymap_get_num_lock_state (keymap))