backends/native: Shuffle xkb_keymap creation
Push it a little bit down to the MetaSeatNative. As both the UI thread and the input thread are interested in dealing with the xkb_keymap and it is not meant to be used in different threads, keep 2 separate copies around. The keyboard map will always be set from the UI thread, so the xkb_keymap owned by the MetaSeatNative (owned by the UI thread) can be considered canonical. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1403>
This commit is contained in:

committed by
Marge Bot

parent
40665b0fb1
commit
23f95348fd
@ -29,6 +29,7 @@
|
||||
#include "backends/native/meta-seat-native.h"
|
||||
|
||||
#include "backends/meta-cursor-tracker-private.h"
|
||||
#include "backends/meta-keymap-utils.h"
|
||||
#include "backends/native/meta-barrier-native.h"
|
||||
#include "backends/native/meta-event-native.h"
|
||||
#include "backends/native/meta-input-device-native.h"
|
||||
@ -170,6 +171,8 @@ meta_seat_native_constructed (GObject *object)
|
||||
seat->core_pointer = meta_seat_impl_get_pointer (seat->impl);
|
||||
seat->core_keyboard = meta_seat_impl_get_keyboard (seat->impl);
|
||||
|
||||
meta_seat_native_set_keyboard_map (seat, "us", "", "");
|
||||
|
||||
if (G_OBJECT_CLASS (meta_seat_native_parent_class)->constructed)
|
||||
G_OBJECT_CLASS (meta_seat_native_parent_class)->constructed (object);
|
||||
}
|
||||
@ -220,6 +223,8 @@ meta_seat_native_finalize (GObject *object)
|
||||
MetaSeatNative *seat = META_SEAT_NATIVE (object);
|
||||
GList *iter;
|
||||
|
||||
if (seat->xkb_keymap)
|
||||
xkb_keymap_unref (seat->xkb_keymap);
|
||||
g_clear_object (&seat->core_pointer);
|
||||
g_clear_object (&seat->core_keyboard);
|
||||
g_clear_object (&seat->impl);
|
||||
@ -506,6 +511,28 @@ meta_seat_native_reclaim_devices (MetaSeatNative *seat)
|
||||
seat->released = FALSE;
|
||||
}
|
||||
|
||||
static struct xkb_keymap *
|
||||
create_keymap (const char *layouts,
|
||||
const char *variants,
|
||||
const char *options)
|
||||
{
|
||||
struct xkb_rule_names names;
|
||||
struct xkb_keymap *keymap;
|
||||
struct xkb_context *context;
|
||||
|
||||
names.rules = DEFAULT_XKB_RULES_FILE;
|
||||
names.model = DEFAULT_XKB_MODEL;
|
||||
names.layout = layouts;
|
||||
names.variant = variants;
|
||||
names.options = options;
|
||||
|
||||
context = meta_create_xkb_context ();
|
||||
keymap = xkb_keymap_new_from_names (context, &names, XKB_KEYMAP_COMPILE_NO_FLAGS);
|
||||
xkb_context_unref (context);
|
||||
|
||||
return keymap;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_seat_native_set_keyboard_map: (skip)
|
||||
* @seat: the #ClutterSeat created by the evdev backend
|
||||
@ -517,13 +544,30 @@ meta_seat_native_reclaim_devices (MetaSeatNative *seat)
|
||||
* is pressed when calling this function.
|
||||
*/
|
||||
void
|
||||
meta_seat_native_set_keyboard_map (MetaSeatNative *seat,
|
||||
struct xkb_keymap *xkb_keymap)
|
||||
meta_seat_native_set_keyboard_map (MetaSeatNative *seat,
|
||||
const char *layouts,
|
||||
const char *variants,
|
||||
const char *options)
|
||||
{
|
||||
g_return_if_fail (META_IS_SEAT_NATIVE (seat));
|
||||
g_return_if_fail (xkb_keymap != NULL);
|
||||
struct xkb_keymap *keymap, *impl_keymap;
|
||||
|
||||
meta_seat_impl_set_keyboard_map (seat->impl, xkb_keymap);
|
||||
keymap = create_keymap (layouts, variants, options);
|
||||
impl_keymap = create_keymap (layouts, variants, options);
|
||||
|
||||
if (keymap == NULL)
|
||||
{
|
||||
g_warning ("Unable to load configured keymap: rules=%s, model=%s, layout=%s, variant=%s, options=%s",
|
||||
DEFAULT_XKB_RULES_FILE, DEFAULT_XKB_MODEL, layouts,
|
||||
variants, options);
|
||||
return;
|
||||
}
|
||||
|
||||
if (seat->xkb_keymap)
|
||||
xkb_keymap_unref (seat->xkb_keymap);
|
||||
seat->xkb_keymap = keymap;
|
||||
|
||||
meta_seat_impl_set_keyboard_map (seat->impl, impl_keymap);
|
||||
xkb_keymap_unref (impl_keymap);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -539,7 +583,7 @@ meta_seat_native_get_keyboard_map (MetaSeatNative *seat)
|
||||
{
|
||||
g_return_val_if_fail (META_IS_SEAT_NATIVE (seat), NULL);
|
||||
|
||||
return meta_seat_impl_get_keyboard_map (seat->impl);
|
||||
return seat->xkb_keymap;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -555,6 +599,7 @@ meta_seat_native_set_keyboard_layout_index (MetaSeatNative *seat,
|
||||
{
|
||||
g_return_if_fail (META_IS_SEAT_NATIVE (seat));
|
||||
|
||||
seat->xkb_layout_index = idx;
|
||||
meta_seat_impl_set_keyboard_layout_index (seat->impl, idx);
|
||||
}
|
||||
|
||||
@ -564,7 +609,7 @@ meta_seat_native_set_keyboard_layout_index (MetaSeatNative *seat,
|
||||
xkb_layout_index_t
|
||||
meta_seat_native_get_keyboard_layout_index (MetaSeatNative *seat)
|
||||
{
|
||||
return meta_seat_impl_get_keyboard_layout_index (seat->impl);
|
||||
return seat->xkb_layout_index;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user