diff --git a/src/Makefile.am b/src/Makefile.am index a333113c3..a6606eeb4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -153,8 +153,6 @@ libmutter_la_SOURCES = \ meta/gradient.h \ core/meta-gesture-tracker.c \ core/meta-gesture-tracker-private.h \ - core/xkbcommon-hacks.c \ - core/xkbcommon-hacks.h \ core/keybindings.c \ core/keybindings-private.h \ core/main.c \ diff --git a/src/core/keybindings.c b/src/core/keybindings.c index 0766eda21..ba6a39990 100644 --- a/src/core/keybindings.c +++ b/src/core/keybindings.c @@ -39,7 +39,6 @@ #include "screen-private.h" #include #include "meta-accel-parse.h" -#include "xkbcommon-hacks.h" #include @@ -190,6 +189,7 @@ reload_modmap (MetaKeyBindingManager *keys) { MetaBackend *backend = meta_get_backend (); struct xkb_keymap *keymap = meta_backend_get_keymap (backend); + struct xkb_state *scratch_state; xkb_mod_mask_t scroll_lock_mask; /* Modifiers to find. */ @@ -203,6 +203,8 @@ reload_modmap (MetaKeyBindingManager *keys) { "Super", &keys->super_mask }, }; + scratch_state = xkb_state_new (keymap); + gsize i; for (i = 0; i < G_N_ELEMENTS (mods); i++) { @@ -210,11 +212,16 @@ reload_modmap (MetaKeyBindingManager *keys) xkb_mod_index_t idx = xkb_keymap_mod_get_index (keymap, mods[i].name); if (idx != XKB_MOD_INVALID) - *mask_p = my_xkb_keymap_mod_get_mask (keymap, idx); + { + xkb_state_update_mask (scratch_state, 1 << idx, 0, 0, 0, 0, 0); + *mask_p = xkb_state_serialize_mods (scratch_state, XKB_STATE_MODS_DEPRESSED); + } else *mask_p = 0; } + xkb_state_unref (scratch_state); + keys->ignored_modifier_mask = (scroll_lock_mask | Mod2Mask | LockMask); meta_topic (META_DEBUG_KEYBINDINGS, diff --git a/src/core/xkbcommon-hacks.c b/src/core/xkbcommon-hacks.c deleted file mode 100644 index 330f0f76d..000000000 --- a/src/core/xkbcommon-hacks.c +++ /dev/null @@ -1,112 +0,0 @@ -/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ - -/* - * Copyright (C) 2014 Red Hat - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Written by: - * Jasper St. Pierre - */ - -#include "config.h" - -#include "xkbcommon-hacks.h" - -/* Terrible, gross hackery to provide an implementation for xkb_keymap_mod_get_mask. - * Delete when https://github.com/xkbcommon/libxkbcommon/pull/10 is pushed. */ - -/* The structures here have been pulled from libxkbcommon. */ - -enum xkb_action_controls { - CONTROL_REPEAT = (1 << 0), - CONTROL_SLOW = (1 << 1), - CONTROL_DEBOUNCE = (1 << 2), - CONTROL_STICKY = (1 << 3), - CONTROL_MOUSEKEYS = (1 << 4), - CONTROL_MOUSEKEYS_ACCEL = (1 << 5), - CONTROL_AX = (1 << 6), - CONTROL_AX_TIMEOUT = (1 << 7), - CONTROL_AX_FEEDBACK = (1 << 8), - CONTROL_BELL = (1 << 9), - CONTROL_IGNORE_GROUP_LOCK = (1 << 10), - CONTROL_ALL = \ - (CONTROL_REPEAT | CONTROL_SLOW | CONTROL_DEBOUNCE | CONTROL_STICKY | \ - CONTROL_MOUSEKEYS | CONTROL_MOUSEKEYS_ACCEL | CONTROL_AX | \ - CONTROL_AX_TIMEOUT | CONTROL_AX_FEEDBACK | CONTROL_BELL | \ - CONTROL_IGNORE_GROUP_LOCK) -}; - -typedef uint32_t xkb_atom_t; - -/* Don't allow more modifiers than we can hold in xkb_mod_mask_t. */ -#define XKB_MAX_MODS ((xkb_mod_index_t) (sizeof(xkb_mod_mask_t) * 8)) - -/* These should all go away. */ -enum mod_type { - MOD_REAL = (1 << 0), - MOD_VIRT = (1 << 1), - MOD_BOTH = (MOD_REAL | MOD_VIRT), -}; - -struct xkb_mod { - xkb_atom_t name; - enum mod_type type; - xkb_mod_mask_t mapping; /* vmod -> real mod mapping */ -}; - -struct xkb_mod_set { - struct xkb_mod mods[XKB_MAX_MODS]; - unsigned int num_mods; -}; - -/* Common keyboard description structure */ -struct xkb_keymap_real { - struct xkb_context *ctx; - - int refcnt; - enum xkb_keymap_compile_flags flags; - enum xkb_keymap_format format; - - enum xkb_action_controls enabled_ctrls; - - xkb_keycode_t min_key_code; - xkb_keycode_t max_key_code; - void *keys; - - /* aliases in no particular order */ - unsigned int num_key_aliases; - void *key_aliases; - - void *types; - unsigned int num_types; - - unsigned int num_sym_interprets; - void *sym_interprets; - - struct xkb_mod_set mods; -}; - -xkb_mod_mask_t -my_xkb_keymap_mod_get_mask(struct xkb_keymap *_keymap, xkb_mod_index_t idx) -{ - struct xkb_keymap_real *keymap = (struct xkb_keymap_real *) _keymap; - - if (idx >= keymap->mods.num_mods) - return 0; - - return keymap->mods.mods[idx].mapping; -} diff --git a/src/core/xkbcommon-hacks.h b/src/core/xkbcommon-hacks.h deleted file mode 100644 index 9b641180d..000000000 --- a/src/core/xkbcommon-hacks.h +++ /dev/null @@ -1,34 +0,0 @@ -/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ - -/* - * Copyright (C) 2014 Red Hat - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Written by: - * Jasper St. Pierre - */ - - -#ifndef XKBCOMMON_HACKS_H -#define XKBCOMMON_HACKS_H - -#include - -xkb_mod_mask_t -my_xkb_keymap_mod_get_mask(struct xkb_keymap *keymap, xkb_mod_index_t idx); - -#endif /* XKBCOMMON_HACKS_H */