From 8485831ab5c4cd6bdec4ceaab67aec766587c4bf Mon Sep 17 00:00:00 2001 From: Michael Webster Date: Wed, 9 Apr 2025 10:24:50 -0400 Subject: [PATCH 1/2] Adapt to keyboard layout modernization, remove libgnomekbd dep. --- debian/cinnamon-settings-daemon.install | 1 - .../a11y-settings/csd-a11y-settings-manager.c | 1 - plugins/keyboard/csd-input-sources-switcher.c | 599 ------------------ plugins/keyboard/csd-keyboard-manager.c | 552 +++++++++++----- plugins/keyboard/csd-keyboard-manager.h | 26 +- plugins/keyboard/csd-keyboard-xkb.c | 555 ---------------- plugins/keyboard/csd-keyboard-xkb.h | 39 -- plugins/keyboard/delayed-dialog.c | 128 ---- plugins/keyboard/delayed-dialog.h | 32 - plugins/keyboard/gkbd-configuration.c | 350 ---------- plugins/keyboard/gkbd-configuration.h | 65 -- plugins/keyboard/kbd-capslock-off.png | Bin 1650 -> 0 bytes plugins/keyboard/kbd-capslock-on.png | Bin 1488 -> 0 bytes plugins/keyboard/kbd-numlock-off.png | Bin 1742 -> 0 bytes plugins/keyboard/kbd-numlock-on.png | Bin 1591 -> 0 bytes plugins/keyboard/kbd-scrolllock-off.png | Bin 1467 -> 0 bytes plugins/keyboard/kbd-scrolllock-on.png | Bin 1337 -> 0 bytes plugins/keyboard/main.c | 3 - plugins/keyboard/meson.build | 21 - .../csd-settings-remap-manager.c | 4 +- 20 files changed, 385 insertions(+), 1991 deletions(-) delete mode 100644 plugins/keyboard/csd-input-sources-switcher.c delete mode 100644 plugins/keyboard/csd-keyboard-xkb.c delete mode 100644 plugins/keyboard/csd-keyboard-xkb.h delete mode 100644 plugins/keyboard/delayed-dialog.c delete mode 100644 plugins/keyboard/delayed-dialog.h delete mode 100644 plugins/keyboard/gkbd-configuration.c delete mode 100644 plugins/keyboard/gkbd-configuration.h delete mode 100644 plugins/keyboard/kbd-capslock-off.png delete mode 100644 plugins/keyboard/kbd-capslock-on.png delete mode 100644 plugins/keyboard/kbd-numlock-off.png delete mode 100644 plugins/keyboard/kbd-numlock-on.png delete mode 100644 plugins/keyboard/kbd-scrolllock-off.png delete mode 100644 plugins/keyboard/kbd-scrolllock-on.png diff --git a/debian/cinnamon-settings-daemon.install b/debian/cinnamon-settings-daemon.install index 2f0bbebb..913b9604 100644 --- a/debian/cinnamon-settings-daemon.install +++ b/debian/cinnamon-settings-daemon.install @@ -4,7 +4,6 @@ usr/lib/*/cinnamon-settings-daemon*/*.so usr/lib/*/cinnamon-settings-daemon/ usr/libexec usr/share/applications/* -usr/share/cinnamon-settings-daemon usr/share/dbus-1/*/org.cinnamon.SettingsDaemon.* usr/share/glib-2.0/*/org.cinnamon.settings-daemon.* usr/share/icons/*/*/*/csd* diff --git a/plugins/a11y-settings/csd-a11y-settings-manager.c b/plugins/a11y-settings/csd-a11y-settings-manager.c index 09ecdc52..f1edf0bd 100644 --- a/plugins/a11y-settings/csd-a11y-settings-manager.c +++ b/plugins/a11y-settings/csd-a11y-settings-manager.c @@ -187,7 +187,6 @@ bind_keys (CsdA11ySettingsManager *manager, static void bind_cinnamon_gnome_a11y_settings (CsdA11ySettingsManager *manager) { - bind_keys (manager, CINNAMON_A11Y_APP_SCHEMA, "screen-keyboard-enabled", GNOME_A11Y_APP_SCHEMA, "screen-keyboard-enabled"); bind_keys (manager, CINNAMON_A11Y_APP_SCHEMA, "screen-reader-enabled", GNOME_A11Y_APP_SCHEMA, "screen-reader-enabled"); bind_keys (manager, CINNAMON_DESKTOP_SCHEMA, "toolkit-accessibility", GNOME_DESKTOP_SCHEMA, "toolkit-accessibility"); diff --git a/plugins/keyboard/csd-input-sources-switcher.c b/plugins/keyboard/csd-input-sources-switcher.c deleted file mode 100644 index f65bc542..00000000 --- a/plugins/keyboard/csd-input-sources-switcher.c +++ /dev/null @@ -1,599 +0,0 @@ -/* - * Copyright (C) 2012 Red Hat, Inc. - * - * Written by: Rui Matos - * - * 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, 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., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -#include -#include -#include - -#include - -#include "csd-enums.h" -#include "csd-keygrab.h" - -#define GNOME_DESKTOP_INPUT_SOURCES_DIR "org.cinnamon.desktop.input-sources" -#define KEY_CURRENT_INPUT_SOURCE "current" -#define KEY_INPUT_SOURCES "sources" - -#define CSD_KEYBOARD_DIR "org.cinnamon.settings-daemon.peripherals.keyboard" -#define KEY_SWITCHER "input-sources-switcher" - -static GSettings *input_sources_settings; - -static Key *the_keys = NULL; -static guint n_keys = 0; - -static guint master_keyboard_id = 0; - -static gboolean includes_caps = FALSE; - -static void -do_switch (void) -{ - GVariant *sources; - gint i, n; - - /* FIXME: this is racy with the c-s-d media-keys plugin. Instead we - should have a DBus API on c-s-d and poke it from here.*/ - sources = g_settings_get_value (input_sources_settings, KEY_INPUT_SOURCES); - - n = g_variant_n_children (sources); - if (n < 2) - goto out; - - i = g_settings_get_uint (input_sources_settings, KEY_CURRENT_INPUT_SOURCE) + 1; - if (i >= n) - i = 0; - - g_settings_set_uint (input_sources_settings, KEY_CURRENT_INPUT_SOURCE, i); - - out: - g_variant_unref (sources); -} - -static void -init_keys (void) -{ - GSettings *settings; - - settings = g_settings_new (CSD_KEYBOARD_DIR); - - switch (g_settings_get_enum (settings, KEY_SWITCHER)) - { - case CSD_INPUT_SOURCES_SWITCHER_SHIFT_L: - n_keys = 1; - the_keys = g_new0 (Key, n_keys); - - the_keys[0].keysym = GDK_KEY_Shift_L; - the_keys[0].state = 0; - break; - - case CSD_INPUT_SOURCES_SWITCHER_ALT_L: - n_keys = 1; - the_keys = g_new0 (Key, n_keys); - - the_keys[0].keysym = GDK_KEY_Alt_L; - the_keys[0].state = 0; - break; - - case CSD_INPUT_SOURCES_SWITCHER_CTRL_L: - n_keys = 1; - the_keys = g_new0 (Key, n_keys); - - the_keys[0].keysym = GDK_KEY_Control_L; - the_keys[0].state = 0; - break; - - case CSD_INPUT_SOURCES_SWITCHER_SHIFT_R: - n_keys = 1; - the_keys = g_new0 (Key, n_keys); - - the_keys[0].keysym = GDK_KEY_Shift_R; - the_keys[0].state = 0; - break; - - case CSD_INPUT_SOURCES_SWITCHER_ALT_R: - n_keys = 2; - the_keys = g_new0 (Key, n_keys); - - the_keys[0].keysym = GDK_KEY_Alt_R; - the_keys[0].state = 0; - the_keys[1].keysym = GDK_KEY_ISO_Level3_Shift; - the_keys[1].state = 0; - break; - - case CSD_INPUT_SOURCES_SWITCHER_CTRL_R: - n_keys = 1; - the_keys = g_new0 (Key, n_keys); - - the_keys[0].keysym = GDK_KEY_Control_R; - the_keys[0].state = 0; - break; - - case CSD_INPUT_SOURCES_SWITCHER_ALT_SHIFT_L: - n_keys = 2; - the_keys = g_new0 (Key, n_keys); - - the_keys[0].keysym = GDK_KEY_Shift_L; - the_keys[0].state = GDK_MOD1_MASK; - the_keys[1].keysym = GDK_KEY_Alt_L; - the_keys[1].state = GDK_SHIFT_MASK; - break; - - case CSD_INPUT_SOURCES_SWITCHER_ALT_SHIFT_R: - n_keys = 4; - the_keys = g_new0 (Key, n_keys); - - the_keys[0].keysym = GDK_KEY_Shift_R; - the_keys[0].state = GDK_MOD1_MASK; - the_keys[1].keysym = GDK_KEY_Alt_R; - the_keys[1].state = GDK_SHIFT_MASK; - the_keys[2].keysym = GDK_KEY_Shift_R; - the_keys[2].state = GDK_MOD5_MASK; - the_keys[3].keysym = GDK_KEY_ISO_Level3_Shift; - the_keys[3].state = GDK_SHIFT_MASK; - break; - - case CSD_INPUT_SOURCES_SWITCHER_CTRL_SHIFT_L: - n_keys = 2; - the_keys = g_new0 (Key, n_keys); - - the_keys[0].keysym = GDK_KEY_Shift_L; - the_keys[0].state = GDK_CONTROL_MASK; - the_keys[1].keysym = GDK_KEY_Control_L; - the_keys[1].state = GDK_SHIFT_MASK; - break; - - case CSD_INPUT_SOURCES_SWITCHER_CTRL_SHIFT_R: - n_keys = 2; - the_keys = g_new0 (Key, n_keys); - - the_keys[0].keysym = GDK_KEY_Shift_R; - the_keys[0].state = GDK_CONTROL_MASK; - the_keys[1].keysym = GDK_KEY_Control_R; - the_keys[1].state = GDK_SHIFT_MASK; - break; - - case CSD_INPUT_SOURCES_SWITCHER_SHIFT_L_SHIFT_R: - n_keys = 2; - the_keys = g_new0 (Key, n_keys); - - the_keys[0].keysym = GDK_KEY_Shift_L; - the_keys[0].state = GDK_SHIFT_MASK; - the_keys[1].keysym = GDK_KEY_Shift_R; - the_keys[1].state = GDK_SHIFT_MASK; - break; - - case CSD_INPUT_SOURCES_SWITCHER_ALT_L_ALT_R: - n_keys = 4; - the_keys = g_new0 (Key, n_keys); - - the_keys[0].keysym = GDK_KEY_Alt_L; - the_keys[0].state = GDK_MOD1_MASK; - the_keys[1].keysym = GDK_KEY_Alt_R; - the_keys[1].state = GDK_MOD1_MASK; - the_keys[2].keysym = GDK_KEY_Alt_L; - the_keys[2].state = GDK_MOD5_MASK; - the_keys[3].keysym = GDK_KEY_ISO_Level3_Shift; - the_keys[3].state = GDK_MOD1_MASK; - break; - - case CSD_INPUT_SOURCES_SWITCHER_CTRL_L_CTRL_R: - n_keys = 2; - the_keys = g_new0 (Key, n_keys); - - the_keys[0].keysym = GDK_KEY_Control_L; - the_keys[0].state = GDK_CONTROL_MASK; - the_keys[1].keysym = GDK_KEY_Control_R; - the_keys[1].state = GDK_CONTROL_MASK; - break; - - case CSD_INPUT_SOURCES_SWITCHER_ALT_SHIFT: - n_keys = 7; - the_keys = g_new0 (Key, n_keys); - - the_keys[0].keysym = GDK_KEY_Shift_L; - the_keys[0].state = GDK_MOD1_MASK; - the_keys[1].keysym = GDK_KEY_Shift_L; - the_keys[1].state = GDK_MOD5_MASK; - the_keys[2].keysym = GDK_KEY_Shift_R; - the_keys[2].state = GDK_MOD1_MASK; - the_keys[3].keysym = GDK_KEY_Shift_R; - the_keys[3].state = GDK_MOD5_MASK; - the_keys[4].keysym = GDK_KEY_Alt_L; - the_keys[4].state = GDK_SHIFT_MASK; - the_keys[5].keysym = GDK_KEY_Alt_R; - the_keys[5].state = GDK_SHIFT_MASK; - the_keys[6].keysym = GDK_KEY_ISO_Level3_Shift; - the_keys[6].state = GDK_SHIFT_MASK; - break; - - case CSD_INPUT_SOURCES_SWITCHER_CTRL_SHIFT: - n_keys = 4; - the_keys = g_new0 (Key, n_keys); - - the_keys[0].keysym = GDK_KEY_Shift_L; - the_keys[0].state = GDK_CONTROL_MASK; - the_keys[1].keysym = GDK_KEY_Shift_R; - the_keys[1].state = GDK_CONTROL_MASK; - the_keys[2].keysym = GDK_KEY_Control_L; - the_keys[2].state = GDK_SHIFT_MASK; - the_keys[3].keysym = GDK_KEY_Control_R; - the_keys[3].state = GDK_SHIFT_MASK; - break; - - case CSD_INPUT_SOURCES_SWITCHER_ALT_CTRL: - n_keys = 7; - the_keys = g_new0 (Key, n_keys); - - the_keys[0].keysym = GDK_KEY_Control_L; - the_keys[0].state = GDK_MOD1_MASK; - the_keys[1].keysym = GDK_KEY_Control_L; - the_keys[1].state = GDK_MOD5_MASK; - the_keys[2].keysym = GDK_KEY_Control_R; - the_keys[2].state = GDK_MOD1_MASK; - the_keys[3].keysym = GDK_KEY_Control_R; - the_keys[3].state = GDK_MOD5_MASK; - the_keys[4].keysym = GDK_KEY_Alt_L; - the_keys[4].state = GDK_CONTROL_MASK; - the_keys[5].keysym = GDK_KEY_Alt_R; - the_keys[5].state = GDK_CONTROL_MASK; - the_keys[6].keysym = GDK_KEY_ISO_Level3_Shift; - the_keys[6].state = GDK_CONTROL_MASK; - break; - - case CSD_INPUT_SOURCES_SWITCHER_CAPS: - includes_caps = TRUE; - n_keys = 1; - the_keys = g_new0 (Key, n_keys); - - the_keys[0].keysym = GDK_KEY_Caps_Lock; - the_keys[0].state = 0; - break; - - case CSD_INPUT_SOURCES_SWITCHER_SHIFT_CAPS: - includes_caps = TRUE; - n_keys = 3; - the_keys = g_new0 (Key, n_keys); - - the_keys[0].keysym = GDK_KEY_Caps_Lock; - the_keys[0].state = GDK_SHIFT_MASK; - the_keys[1].keysym = GDK_KEY_Shift_L; - the_keys[1].state = GDK_LOCK_MASK; - the_keys[2].keysym = GDK_KEY_Shift_R; - the_keys[2].state = GDK_LOCK_MASK; - break; - - case CSD_INPUT_SOURCES_SWITCHER_ALT_CAPS: - includes_caps = TRUE; - n_keys = 5; - the_keys = g_new0 (Key, n_keys); - - the_keys[0].keysym = GDK_KEY_Caps_Lock; - the_keys[0].state = GDK_MOD1_MASK; - the_keys[1].keysym = GDK_KEY_Caps_Lock; - the_keys[1].state = GDK_MOD5_MASK; - the_keys[2].keysym = GDK_KEY_Alt_L; - the_keys[2].state = GDK_LOCK_MASK; - the_keys[3].keysym = GDK_KEY_Alt_R; - the_keys[3].state = GDK_LOCK_MASK; - the_keys[4].keysym = GDK_KEY_ISO_Level3_Shift; - the_keys[4].state = GDK_LOCK_MASK; - break; - - case CSD_INPUT_SOURCES_SWITCHER_CTRL_CAPS: - includes_caps = TRUE; - n_keys = 3; - the_keys = g_new0 (Key, n_keys); - - the_keys[0].keysym = GDK_KEY_Caps_Lock; - the_keys[0].state = GDK_CONTROL_MASK; - the_keys[1].keysym = GDK_KEY_Control_L; - the_keys[1].state = GDK_LOCK_MASK; - the_keys[2].keysym = GDK_KEY_Control_R; - the_keys[2].state = GDK_LOCK_MASK; - break; - } - - g_object_unref (settings); -} - -static void -free_keys (void) -{ - gint i; - - for (i = 0; i < n_keys; ++i) - g_free (the_keys[i].keycodes); - - g_free (the_keys); -} - -static gboolean -match_caps_locked (const Key *key, - XIDeviceEvent *xev) -{ - if (key->state & xev->mods.effective && - key->keysym == XkbKeycodeToKeysym (xev->display, xev->detail, 0, 0)) - return TRUE; - - return FALSE; -} - -static gboolean -match_modifier (const Key *key, - XIEvent *xiev) -{ - Key meta; - - /* When the grab is established with Caps Lock as the modifier - (i.e. key->state == GDK_LOCK_MASK) we can't use match_xi2_key() - as this modifier is black listed there, so we do the match - ourselves. */ - if (key->state == GDK_LOCK_MASK) - return match_caps_locked (key, (XIDeviceEvent *) xiev); - - meta = *key; - - switch (key->keysym) - { - case GDK_KEY_Shift_L: - case GDK_KEY_Shift_R: - if (xiev->evtype == XI_KeyRelease) - meta.state |= GDK_SHIFT_MASK; - break; - - case GDK_KEY_Control_L: - case GDK_KEY_Control_R: - if (xiev->evtype == XI_KeyRelease) - meta.state |= GDK_CONTROL_MASK; - break; - - case GDK_KEY_ISO_Level3_Shift: - if (xiev->evtype == XI_KeyRelease) - meta.state |= GDK_MOD5_MASK; - break; - - case GDK_KEY_Alt_L: - case GDK_KEY_Alt_R: - if (key->state == GDK_SHIFT_MASK) - meta.keysym = key->keysym == GDK_KEY_Alt_L ? GDK_KEY_Meta_L : GDK_KEY_Meta_R; - - if (xiev->evtype == XI_KeyRelease) - meta.state |= GDK_MOD1_MASK; - break; - } - - return match_xi2_key (&meta, (XIDeviceEvent *) xiev); -} - -static gboolean -matches_key (XIEvent *xiev) -{ - gint i; - - for (i = 0; i < n_keys; ++i) - if (match_modifier (&the_keys[i], xiev)) - return TRUE; - - return FALSE; -} - -/* Owen magic, ported to XI2 */ -static GdkFilterReturn -filter (XEvent *xevent, - GdkEvent *event, - gpointer data) -{ - XIEvent *xiev; - XIDeviceEvent *xev; - XIGrabModifiers mods; - XIEventMask evmask; - unsigned char mask[(XI_LASTEVENT + 7)/8] = { 0 }; - - if (xevent->type != GenericEvent) - return GDK_FILTER_CONTINUE; - - xiev = (XIEvent *) xevent->xcookie.data; - - if (xiev->evtype != XI_ButtonPress && - xiev->evtype != XI_KeyPress && - xiev->evtype != XI_KeyRelease) - return GDK_FILTER_CONTINUE; - - xev = (XIDeviceEvent *) xiev; - - mods.modifiers = XIAnyModifier; - XISetMask (mask, XI_ButtonPress); - evmask.deviceid = XIAllMasterDevices; - evmask.mask_len = sizeof (mask); - evmask.mask = mask; - - if (xiev->evtype != XI_ButtonPress && - matches_key (xiev)) - { - if (xiev->evtype == XI_KeyPress) - { - if (includes_caps) - { - do_switch (); - XIUngrabDevice (xev->display, - master_keyboard_id, - xev->time); - XkbLockModifiers (xev->display, XkbUseCoreKbd, LockMask, 0); - } - else - { - XIAllowEvents (xev->display, - xev->deviceid, - XISyncDevice, - xev->time); - XIGrabButton (xev->display, - XIAllMasterDevices, - XIAnyButton, - xev->root, - None, - GrabModeSync, - GrabModeSync, - False, - &evmask, - 1, - &mods); - } - } - else - { - do_switch (); - XIUngrabDevice (xev->display, - master_keyboard_id, - xev->time); - XIUngrabButton (xev->display, - XIAllMasterDevices, - XIAnyButton, - xev->root, - 1, - &mods); - } - } - else - { - XIAllowEvents (xev->display, - xev->deviceid, - XIReplayDevice, - xev->time); - XIUngrabDevice (xev->display, - master_keyboard_id, - xev->time); - XIUngrabButton (xev->display, - XIAllMasterDevices, - XIAnyButton, - xev->root, - 1, - &mods); - } - - return GDK_FILTER_CONTINUE; -} - -static void -grab_key (Key *key, - GdkDisplay *display, - GSList *screens) -{ - GdkKeymapKey *keys; - gboolean has_entries; - GArray *keycodes; - gint n, i; - - has_entries = gdk_keymap_get_entries_for_keyval (gdk_keymap_get_default (), - key->keysym, - &keys, - &n); - if (!has_entries) - return; - - keycodes = g_array_sized_new (TRUE, TRUE, sizeof (guint), n); - for (i = 0; i < n; ++i) - g_array_append_val (keycodes, keys[i].keycode); - - key->keycodes = (guint *) g_array_free (keycodes, FALSE); - - gdk_x11_display_error_trap_push (display); - - grab_key_unsafe (key, CSD_KEYGRAB_ALLOW_UNMODIFIED | CSD_KEYGRAB_SYNCHRONOUS, screens); - - gdk_x11_display_error_trap_pop_ignored (display); - - g_free (keys); -} - -static guint -get_master_keyboard_id (GdkDisplay *display) -{ - XIDeviceInfo *info; - guint id; - int i, n; - - id = 0; - info = XIQueryDevice (GDK_DISPLAY_XDISPLAY (display), XIAllMasterDevices, &n); - for (i = 0; i < n; ++i) - if (info[i].use == XIMasterKeyboard && info[i].enabled) - { - id = info[i].deviceid; - break; - } - XIFreeDeviceInfo (info); - - return id; -} - -static void -set_input_sources_switcher (void) -{ - GdkDisplay *display; - gint n_screens; - GSList *screens, *l; - gint i; - - display = gdk_display_get_default (); - n_screens = gdk_display_get_n_screens (display); - screens = NULL; - for (i = 0; i < n_screens; ++i) - screens = g_slist_prepend (screens, gdk_display_get_screen (display, i)); - - for (i = 0; i < n_keys; ++i) - grab_key (&the_keys[i], display, screens); - - for (l = screens; l; l = l->next) - { - GdkScreen *screen; - - screen = (GdkScreen *) l->data; - gdk_window_add_filter (gdk_screen_get_root_window (screen), - (GdkFilterFunc) filter, - screen); - } - - g_slist_free (screens); - - master_keyboard_id = get_master_keyboard_id (display); -} - -int -main (int argc, char *argv[]) -{ - gtk_init (&argc, &argv); - - init_keys (); - if (n_keys == 0) - { - g_warning ("No shortcut defined, exiting"); - return -1; - } - input_sources_settings = g_settings_new (GNOME_DESKTOP_INPUT_SOURCES_DIR); - - set_input_sources_switcher (); - gtk_main (); - - g_object_unref (input_sources_settings); - free_keys (); - - return 0; -} diff --git a/plugins/keyboard/csd-keyboard-manager.c b/plugins/keyboard/csd-keyboard-manager.c index 17a309d1..c95e4e95 100644 --- a/plugins/keyboard/csd-keyboard-manager.c +++ b/plugins/keyboard/csd-keyboard-manager.c @@ -15,8 +15,7 @@ * 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., 51 Franklin Street - Suite 500, Boston, MA 02110-1335, USA. + * along with this program; if not, see . * */ @@ -38,175 +37,134 @@ #include #include -#include -#include - #include "cinnamon-settings-profile.h" #include "csd-keyboard-manager.h" +#include "csd-input-helper.h" #include "csd-enums.h" - -#include "csd-keyboard-xkb.h" #include "migrate-settings.h" -#define CSD_KEYBOARD_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CSD_TYPE_KEYBOARD_MANAGER, CsdKeyboardManagerPrivate)) - -#ifndef HOST_NAME_MAX -# define HOST_NAME_MAX 255 -#endif - #define CSD_KEYBOARD_DIR "org.cinnamon.settings-daemon.peripherals.keyboard" #define KEY_CLICK "click" #define KEY_CLICK_VOLUME "click-volume" -#define KEY_NUMLOCK_STATE "numlock-state" #define KEY_BELL_VOLUME "bell-volume" #define KEY_BELL_PITCH "bell-pitch" #define KEY_BELL_DURATION "bell-duration" #define KEY_BELL_MODE "bell-mode" +#define KEY_BELL_CUSTOM_FILE "bell-custom-file" -struct CsdKeyboardManagerPrivate -{ - guint start_idle_id; - GSettings *settings; - gboolean have_xkb; - gint xkb_event_base; - CsdNumLockState old_state; -}; +#define CINNAMON_DESKTOP_INTERFACE_DIR "org.cinnamon.desktop.interface" -static void csd_keyboard_manager_finalize (GObject *object); +#define KEY_GTK_IM_MODULE "gtk-im-module" +#define GTK_IM_MODULE_SIMPLE "gtk-im-context-simple" +#define GTK_IM_MODULE_IBUS "ibus" -G_DEFINE_TYPE (CsdKeyboardManager, csd_keyboard_manager, G_TYPE_OBJECT) +#define CINNAMON_DESKTOP_INPUT_SOURCES_DIR "org.gnome.desktop.input-sources" -static gpointer manager_object = NULL; +#define KEY_INPUT_SOURCES "sources" +#define KEY_KEYBOARD_OPTIONS "xkb-options" -static void -numlock_xkb_init (CsdKeyboardManager *manager) -{ - Display *dpy = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); - gboolean have_xkb; - int opcode, error_base, major, minor; - - have_xkb = XkbQueryExtension (dpy, - &opcode, - &manager->priv->xkb_event_base, - &error_base, - &major, - &minor) - && XkbUseExtension (dpy, &major, &minor); - - if (have_xkb) { - XkbSelectEventDetails (dpy, - XkbUseCoreKbd, - XkbStateNotifyMask, - XkbModifierLockMask, - XkbModifierLockMask); - } else { - g_warning ("XKB extension not available"); - } +#define INPUT_SOURCE_TYPE_XKB "xkb" +#define INPUT_SOURCE_TYPE_IBUS "ibus" - manager->priv->have_xkb = have_xkb; -} +#define DEFAULT_LAYOUT "us" -static unsigned -numlock_NumLock_modifier_mask (void) -{ - Display *dpy = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); - return XkbKeysymToModifiers (dpy, XK_Num_Lock); -} +#define CINNAMON_A11Y_APPLICATIONS_INTERFACE_DIR "org.cinnamon.desktop.a11y.applications" +#define KEY_OSK_ENABLED "screen-keyboard-enabled" -static void -numlock_set_xkb_state (CsdNumLockState new_state) +struct _CsdKeyboardManager { - unsigned int num_mask; - Display *dpy = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); - if (new_state != CSD_NUM_LOCK_STATE_ON && new_state != CSD_NUM_LOCK_STATE_OFF) - return; - num_mask = numlock_NumLock_modifier_mask (); - XkbLockModifiers (dpy, XkbUseCoreKbd, num_mask, new_state == CSD_NUM_LOCK_STATE_ON ? num_mask : 0); -} + GObject parent; -static GdkFilterReturn -numlock_xkb_callback (GdkXEvent *xev_, - GdkEvent *gdkev_, - gpointer user_data) -{ - XEvent *xev = (XEvent *) xev_; - XkbEvent *xkbev = (XkbEvent *) xev; - CsdKeyboardManager *manager = (CsdKeyboardManager *) user_data; + guint start_idle_id; + GSettings *settings; + GSettings *input_sources_settings; + GSettings *a11y_settings; + GDBusProxy *localed; + GCancellable *cancellable; + + GdkDeviceManager *device_manager; + guint device_added_id; + guint device_removed_id; +}; + +static void csd_keyboard_manager_class_init (CsdKeyboardManagerClass *klass); +static void csd_keyboard_manager_init (CsdKeyboardManager *keyboard_manager); +static void csd_keyboard_manager_finalize (GObject *object); + +static void update_gtk_im_module (CsdKeyboardManager *manager); + +G_DEFINE_TYPE (CsdKeyboardManager, csd_keyboard_manager, G_TYPE_OBJECT) - if (xev->type != manager->priv->xkb_event_base) - return GDK_FILTER_CONTINUE; +static gpointer manager_object = NULL; - if (xkbev->any.xkb_type != XkbStateNotify) - return GDK_FILTER_CONTINUE; +static gboolean +session_is_wayland (void) +{ + static gboolean session_is_wayland = FALSE; + static gsize once_init = 0; - if (xkbev->state.changed & XkbModifierLockMask) { - unsigned num_mask = numlock_NumLock_modifier_mask (); - unsigned locked_mods = xkbev->state.locked_mods; - CsdNumLockState numlock_state; + if (g_once_init_enter (&once_init)) { + const gchar *env = g_getenv ("XDG_SESSION_TYPE"); + if (env && g_strcmp0 (env, "wayland") == 0) { + session_is_wayland = TRUE; + } - numlock_state = (num_mask & locked_mods) ? CSD_NUM_LOCK_STATE_ON : CSD_NUM_LOCK_STATE_OFF; + g_debug ("Session is Wayland? %d", session_is_wayland); - if (numlock_state != manager->priv->old_state) { - g_settings_set_enum (manager->priv->settings, - KEY_NUMLOCK_STATE, - numlock_state); - manager->priv->old_state = numlock_state; - } - } + g_once_init_leave (&once_init, 1); + } - return GDK_FILTER_CONTINUE; + return session_is_wayland; } static void -numlock_install_xkb_callback (CsdKeyboardManager *manager) +init_builder_with_sources (GVariantBuilder *builder, + GSettings *settings) { - if (!manager->priv->have_xkb) - return; + const gchar *type; + const gchar *id; + GVariantIter iter; + GVariant *sources; - gdk_window_add_filter (NULL, - numlock_xkb_callback, - manager); -} + sources = g_settings_get_value (settings, KEY_INPUT_SOURCES); -static guint -_csd_settings_get_uint (GSettings *settings, - const char *key) -{ - guint value; + g_variant_builder_init (builder, G_VARIANT_TYPE ("a(ss)")); + + g_variant_iter_init (&iter, sources); + while (g_variant_iter_next (&iter, "(&s&s)", &type, &id)) + g_variant_builder_add (builder, "(ss)", type, id); - g_settings_get (settings, key, "u", &value); - return value; + g_variant_unref (sources); } static void -apply_settings (GSettings *settings, - const char *key, - CsdKeyboardManager *manager) +apply_bell (CsdKeyboardManager *manager) { + GSettings *settings; XKeyboardControl kbdcontrol; gboolean click; - int click_volume; int bell_volume; int bell_pitch; int bell_duration; CsdBellMode bell_mode; - gboolean rnumlock; + int click_volume; - if (g_strcmp0 (key, KEY_NUMLOCK_STATE) == 0) + if (session_is_wayland ()) return; + g_debug ("Applying the bell settings"); + settings = manager->settings; click = g_settings_get_boolean (settings, KEY_CLICK); click_volume = g_settings_get_int (settings, KEY_CLICK_VOLUME); + bell_pitch = g_settings_get_int (settings, KEY_BELL_PITCH); bell_duration = g_settings_get_int (settings, KEY_BELL_DURATION); bell_mode = g_settings_get_enum (settings, KEY_BELL_MODE); bell_volume = (bell_mode == CSD_BELL_MODE_ON) ? 50 : 0; - gdk_x11_display_error_trap_push (gdk_display_get_default ()); - /* as percentage from 0..100 inclusive */ if (click_volume < 0) { click_volume = 0; @@ -217,27 +175,277 @@ apply_settings (GSettings *settings, kbdcontrol.bell_percent = bell_volume; kbdcontrol.bell_pitch = bell_pitch; kbdcontrol.bell_duration = bell_duration; + + gdk_error_trap_push (); XChangeKeyboardControl (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), KBKeyClickPercent | KBBellPercent | KBBellPitch | KBBellDuration, &kbdcontrol); - if (g_strcmp0 (key, "remember-numlock-state") == 0 || key == NULL) { - rnumlock = g_settings_get_boolean (settings, "remember-numlock-state"); + XSync (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), FALSE); + gdk_error_trap_pop_ignored (); +} - manager->priv->old_state = g_settings_get_enum (manager->priv->settings, KEY_NUMLOCK_STATE); +static void +apply_all_settings (CsdKeyboardManager *manager) +{ + apply_bell (manager); +} - if (manager->priv->have_xkb && rnumlock) - numlock_set_xkb_state (manager->priv->old_state); - } +static void +settings_changed (GSettings *settings, + const char *key, + CsdKeyboardManager *manager) +{ + if (g_strcmp0 (key, KEY_CLICK) == 0|| + g_strcmp0 (key, KEY_CLICK_VOLUME) == 0 || + g_strcmp0 (key, KEY_BELL_PITCH) == 0 || + g_strcmp0 (key, KEY_BELL_DURATION) == 0 || + g_strcmp0 (key, KEY_BELL_MODE) == 0) { + g_debug ("Bell setting '%s' changed, applying bell settings", key); + apply_bell (manager); + } else if (g_strcmp0 (key, KEY_BELL_CUSTOM_FILE) == 0){ + g_debug ("Ignoring '%s' setting change", KEY_BELL_CUSTOM_FILE); + } else { + g_warning ("Unhandled settings change, key '%s'", key); + } - XSync (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), FALSE); - gdk_x11_display_error_trap_pop_ignored (gdk_display_get_default ()); } -void -csd_keyboard_manager_apply_settings (CsdKeyboardManager *manager) +static void +device_added_cb (GdkDeviceManager *device_manager, + GdkDevice *device, + CsdKeyboardManager *manager) +{ + GdkInputSource source; + + source = gdk_device_get_source (device); + if (source == GDK_SOURCE_TOUCHSCREEN) { + update_gtk_im_module (manager); + } +} + +static void +device_removed_cb (GdkDeviceManager *device_manager, + GdkDevice *device, + CsdKeyboardManager *manager) +{ + GdkInputSource source; + + source = gdk_device_get_source (device); + if (source == GDK_SOURCE_TOUCHSCREEN) + update_gtk_im_module (manager); +} + +static void +set_devicepresence_handler (CsdKeyboardManager *manager) +{ + GdkDeviceManager *device_manager; + + if (session_is_wayland ()) + return; + + device_manager = gdk_display_get_device_manager (gdk_display_get_default ()); + + manager->device_added_id = g_signal_connect (G_OBJECT (device_manager), "device-added", + G_CALLBACK (device_added_cb), manager); + manager->device_removed_id = g_signal_connect (G_OBJECT (device_manager), "device-removed", + G_CALLBACK (device_removed_cb), manager); + manager->device_manager = device_manager; +} + +static gboolean +need_ibus (GVariant *sources) +{ + GVariantIter iter; + const gchar *type; + + g_variant_iter_init (&iter, sources); + while (g_variant_iter_next (&iter, "(&s&s)", &type, NULL)) + if (g_str_equal (type, INPUT_SOURCE_TYPE_IBUS)) + return TRUE; + + return FALSE; +} + +static gboolean +need_osk (CsdKeyboardManager *manager) +{ + gboolean has_touchscreen = FALSE; + GList *devices; + GdkSeat *seat; + + if (g_settings_get_boolean (manager->a11y_settings, + KEY_OSK_ENABLED)) + return TRUE; + + seat = gdk_display_get_default_seat (gdk_display_get_default ()); + devices = gdk_seat_get_slaves (seat, GDK_SEAT_CAPABILITY_TOUCH); + + has_touchscreen = devices != NULL; + + g_list_free (devices); + + return has_touchscreen; +} + +static void +set_gtk_im_module (CsdKeyboardManager *manager, + GSettings *settings, + GVariant *sources) +{ + const gchar *new_module; + gchar *current_module; + + if (need_ibus (sources) || need_osk (manager)) + new_module = GTK_IM_MODULE_IBUS; + else + new_module = GTK_IM_MODULE_SIMPLE; + + current_module = g_settings_get_string (settings, KEY_GTK_IM_MODULE); + if (!g_str_equal (current_module, new_module)) + g_settings_set_string (settings, KEY_GTK_IM_MODULE, new_module); + g_free (current_module); +} + +static void +update_gtk_im_module (CsdKeyboardManager *manager) +{ + GSettings *interface_settings; + GVariant *sources; + + /* Gtk+ uses the IM module advertised in XSETTINGS so, if we + * have IBus input sources, we want it to load that + * module. Otherwise we can use the default "simple" module + * which is builtin gtk+ + */ + interface_settings = g_settings_new (CINNAMON_DESKTOP_INTERFACE_DIR); + sources = g_settings_get_value (manager->input_sources_settings, + KEY_INPUT_SOURCES); + set_gtk_im_module (manager, interface_settings, sources); + g_object_unref (interface_settings); + g_variant_unref (sources); +} + +static void +get_sources_from_xkb_config (CsdKeyboardManager *manager) +{ + GVariantBuilder builder; + GVariant *v; + gint i, n; + gchar **layouts = NULL; + gchar **variants = NULL; + + v = g_dbus_proxy_get_cached_property (manager->localed, "X11Layout"); + if (v) { + const gchar *s = g_variant_get_string (v, NULL); + if (*s) + layouts = g_strsplit (s, ",", -1); + g_variant_unref (v); + } + + init_builder_with_sources (&builder, manager->input_sources_settings); + + if (!layouts) { + g_variant_builder_add (&builder, "(ss)", INPUT_SOURCE_TYPE_XKB, DEFAULT_LAYOUT); + goto out; + } + + v = g_dbus_proxy_get_cached_property (manager->localed, "X11Variant"); + if (v) { + const gchar *s = g_variant_get_string (v, NULL); + if (*s) + variants = g_strsplit (s, ",", -1); + g_variant_unref (v); + } + + if (variants && variants[0]) + n = MIN (g_strv_length (layouts), g_strv_length (variants)); + else + n = g_strv_length (layouts); + + for (i = 0; i < n && layouts[i][0]; ++i) { + gchar *id; + + if (variants && variants[i] && variants[i][0]) + id = g_strdup_printf ("%s+%s", layouts[i], variants[i]); + else + id = g_strdup (layouts[i]); + + g_variant_builder_add (&builder, "(ss)", INPUT_SOURCE_TYPE_XKB, id); + g_free (id); + } + +out: + g_settings_set_value (manager->input_sources_settings, KEY_INPUT_SOURCES, g_variant_builder_end (&builder)); + + g_strfreev (layouts); + g_strfreev (variants); +} + +static void +get_options_from_xkb_config (CsdKeyboardManager *manager) +{ + GVariant *v; + gchar **options = NULL; + + v = g_dbus_proxy_get_cached_property (manager->localed, "X11Options"); + if (v) { + const gchar *s = g_variant_get_string (v, NULL); + if (*s) + options = g_strsplit (s, ",", -1); + g_variant_unref (v); + } + + if (!options) + return; + + g_settings_set_strv (manager->input_sources_settings, KEY_KEYBOARD_OPTIONS, (const gchar * const*) options); + + g_strfreev (options); +} + +static void +maybe_create_initial_settings (CsdKeyboardManager *manager) +{ + GSettings *settings; + GVariant *sources; + gchar **options; + + settings = manager->input_sources_settings; + + /* if we still don't have anything do some educated guesses */ + sources = g_settings_get_value (settings, KEY_INPUT_SOURCES); + if (g_variant_n_children (sources) < 1) + get_sources_from_xkb_config (manager); + g_variant_unref (sources); + + options = g_settings_get_strv (settings, KEY_KEYBOARD_OPTIONS); + if (g_strv_length (options) < 1) + get_options_from_xkb_config (manager); + g_strfreev (options); +} + +static void +localed_proxy_ready (GObject *source, + GAsyncResult *res, + gpointer data) { - apply_settings (manager->priv->settings, NULL, manager); + CsdKeyboardManager *manager = data; + GDBusProxy *proxy; + GError *error = NULL; + + proxy = g_dbus_proxy_new_finish (res, &error); + if (!proxy) { + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_error_free (error); + return; + } + g_warning ("Failed to contact localed: %s", error->message); + g_error_free (error); + } + + manager->localed = proxy; + maybe_create_initial_settings (manager); } static gboolean @@ -247,25 +455,45 @@ start_keyboard_idle_cb (CsdKeyboardManager *manager) g_debug ("Starting keyboard manager"); - manager->priv->have_xkb = 0; - manager->priv->settings = g_settings_new (CSD_KEYBOARD_DIR); + manager->settings = g_settings_new (CSD_KEYBOARD_DIR); - /* Essential - xkb initialization should happen before */ - csd_keyboard_xkb_init (manager); + set_devicepresence_handler (manager); - numlock_xkb_init (manager); + manager->input_sources_settings = g_settings_new (CINNAMON_DESKTOP_INPUT_SOURCES_DIR); + g_signal_connect_swapped (manager->input_sources_settings, + "changed::" KEY_INPUT_SOURCES, + G_CALLBACK (update_gtk_im_module), manager); - /* apply current settings before we install the callback */ - csd_keyboard_manager_apply_settings (manager); + manager->a11y_settings = g_settings_new (CINNAMON_A11Y_APPLICATIONS_INTERFACE_DIR); + g_signal_connect_swapped (manager->a11y_settings, + "changed::" KEY_OSK_ENABLED, + G_CALLBACK (update_gtk_im_module), manager); + update_gtk_im_module (manager); - g_signal_connect (G_OBJECT (manager->priv->settings), "changed", - G_CALLBACK (apply_settings), manager); + manager->cancellable = g_cancellable_new (); - numlock_install_xkb_callback (manager); + g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "org.freedesktop.locale1", + "/org/freedesktop/locale1", + "org.freedesktop.locale1", + manager->cancellable, + localed_proxy_ready, + manager); + + if (!session_is_wayland ()) { + /* apply current settings before we install the callback */ + g_debug ("Started the keyboard plugin, applying all settings"); + apply_all_settings (manager); + + g_signal_connect (G_OBJECT (manager->settings), "changed", + G_CALLBACK (settings_changed), manager); + } cinnamon_settings_profile_end (NULL); - manager->priv->start_idle_id = 0; + manager->start_idle_id = 0; return FALSE; } @@ -276,7 +504,8 @@ csd_keyboard_manager_start (CsdKeyboardManager *manager, { cinnamon_settings_profile_start (NULL); - manager->priv->start_idle_id = g_idle_add ((GSourceFunc) start_keyboard_idle_cb, manager); + manager->start_idle_id = g_idle_add ((GSourceFunc) start_keyboard_idle_cb, manager); + g_source_set_name_by_id (manager->start_idle_id, "[gnome-settings-daemon] start_keyboard_idle_cb"); cinnamon_settings_profile_end (NULL); @@ -286,36 +515,21 @@ csd_keyboard_manager_start (CsdKeyboardManager *manager, void csd_keyboard_manager_stop (CsdKeyboardManager *manager) { - CsdKeyboardManagerPrivate *p = manager->priv; - g_debug ("Stopping keyboard manager"); - if (p->settings != NULL) { - g_object_unref (p->settings); - p->settings = NULL; - } - - if (p->have_xkb) { - gdk_window_remove_filter (NULL, - numlock_xkb_callback, - manager); - } - - csd_keyboard_xkb_shutdown (); -} - -static GObject * -csd_keyboard_manager_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_properties) -{ - CsdKeyboardManager *keyboard_manager; + g_cancellable_cancel (manager->cancellable); + g_clear_object (&manager->cancellable); - keyboard_manager = CSD_KEYBOARD_MANAGER (G_OBJECT_CLASS (csd_keyboard_manager_parent_class)->constructor (type, - n_construct_properties, - construct_properties)); + g_clear_object (&manager->settings); + g_clear_object (&manager->input_sources_settings); + g_clear_object (&manager->a11y_settings); + g_clear_object (&manager->localed); - return G_OBJECT (keyboard_manager); + if (manager->device_manager != NULL) { + g_signal_handler_disconnect (manager->device_manager, manager->device_added_id); + g_signal_handler_disconnect (manager->device_manager, manager->device_removed_id); + manager->device_manager = NULL; + } } static void @@ -323,16 +537,12 @@ csd_keyboard_manager_class_init (CsdKeyboardManagerClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - object_class->constructor = csd_keyboard_manager_constructor; object_class->finalize = csd_keyboard_manager_finalize; - - g_type_class_add_private (klass, sizeof (CsdKeyboardManagerPrivate)); } static void csd_keyboard_manager_init (CsdKeyboardManager *manager) { - manager->priv = CSD_KEYBOARD_MANAGER_GET_PRIVATE (manager); } static void @@ -345,12 +555,12 @@ csd_keyboard_manager_finalize (GObject *object) keyboard_manager = CSD_KEYBOARD_MANAGER (object); - g_return_if_fail (keyboard_manager->priv != NULL); + g_return_if_fail (keyboard_manager != NULL); - if (keyboard_manager->priv->start_idle_id != 0) { - g_source_remove (keyboard_manager->priv->start_idle_id); - keyboard_manager->priv->start_idle_id = 0; - } + csd_keyboard_manager_stop (keyboard_manager); + + if (keyboard_manager->start_idle_id != 0) + g_source_remove (keyboard_manager->start_idle_id); G_OBJECT_CLASS (csd_keyboard_manager_parent_class)->finalize (object); } diff --git a/plugins/keyboard/csd-keyboard-manager.h b/plugins/keyboard/csd-keyboard-manager.h index 863eec89..d76bfa4d 100644 --- a/plugins/keyboard/csd-keyboard-manager.h +++ b/plugins/keyboard/csd-keyboard-manager.h @@ -13,8 +13,7 @@ * 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., 51 Franklin Street - Suite 500, Boston, MA 02110-1335, USA. + * along with this program; if not, see . * */ @@ -26,33 +25,14 @@ G_BEGIN_DECLS #define CSD_TYPE_KEYBOARD_MANAGER (csd_keyboard_manager_get_type ()) -#define CSD_KEYBOARD_MANAGER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), CSD_TYPE_KEYBOARD_MANAGER, CsdKeyboardManager)) -#define CSD_KEYBOARD_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), CSD_TYPE_KEYBOARD_MANAGER, CsdKeyboardManagerClass)) -#define CSD_IS_KEYBOARD_MANAGER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), CSD_TYPE_KEYBOARD_MANAGER)) -#define CSD_IS_KEYBOARD_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), CSD_TYPE_KEYBOARD_MANAGER)) -#define CSD_KEYBOARD_MANAGER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), CSD_TYPE_KEYBOARD_MANAGER, CsdKeyboardManagerClass)) -typedef struct CsdKeyboardManagerPrivate CsdKeyboardManagerPrivate; - -typedef struct -{ - GObject parent; - CsdKeyboardManagerPrivate *priv; -} CsdKeyboardManager; - -typedef struct -{ - GObjectClass parent_class; -} CsdKeyboardManagerClass; - -GType csd_keyboard_manager_get_type (void); +G_DECLARE_FINAL_TYPE (CsdKeyboardManager, csd_keyboard_manager, CSD, KEYBOARD_MANAGER, GObject) CsdKeyboardManager * csd_keyboard_manager_new (void); gboolean csd_keyboard_manager_start (CsdKeyboardManager *manager, GError **error); void csd_keyboard_manager_stop (CsdKeyboardManager *manager); -void csd_keyboard_manager_apply_settings (CsdKeyboardManager *manager); G_END_DECLS -#endif /* __CSD_KEYBOARD_MANAGER_H */ +#endif /* __GSD_KEYBOARD_MANAGER_H */ diff --git a/plugins/keyboard/csd-keyboard-xkb.c b/plugins/keyboard/csd-keyboard-xkb.c deleted file mode 100644 index 96700b5e..00000000 --- a/plugins/keyboard/csd-keyboard-xkb.c +++ /dev/null @@ -1,555 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- - * - * Copyright (C) 2001 Udaltsoft - * - * Written by Sergey V. Oudaltsov - * - * 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, 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., 51 Franklin Street - Suite 500, Boston, MA - * 02110-1335, USA. - */ - -#include "config.h" - -#include -#include - -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include - -#include "csd-keyboard-xkb.h" -#include "delayed-dialog.h" -#include "cinnamon-settings-profile.h" - -#define SETTINGS_KEYBOARD_DIR "org.cinnamon.settings-daemon.plugins.keyboard" - -static CsdKeyboardManager *manager = NULL; - -static XklEngine *xkl_engine; -static XklConfigRegistry *xkl_registry = NULL; - -static GkbdDesktopConfig current_config; -static GkbdKeyboardConfig current_kbd_config; - -/* never terminated */ -static GkbdKeyboardConfig initial_sys_kbd_config; - -static gboolean inited_ok = FALSE; - -static GSettings *settings_desktop = NULL; -static GSettings *settings_keyboard = NULL; - -static PostActivationCallback pa_callback = NULL; -static void *pa_callback_user_data = NULL; - -static GHashTable *preview_dialogs = NULL; - -static void -activation_error (void) -{ - char const *vendor; - GtkWidget *dialog; - - vendor = - ServerVendor (GDK_DISPLAY_XDISPLAY - (gdk_display_get_default ())); - - /* VNC viewers will not work, do not barrage them with warnings */ - if (NULL != vendor && NULL != strstr (vendor, "VNC")) - return; - - dialog = gtk_message_dialog_new_with_markup (NULL, - 0, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - _ - ("Error activating XKB configuration.\n" - "There can be various reasons for that.\n\n" - "If you report this situation as a bug, include the results of\n" - " %s\n" - " %s\n" - " %s\n" - " %s"), - "xprop -root | grep XKB", - "gsettings get org.gnome.libgnomekbd.keyboard model", - "gsettings get org.gnome.libgnomekbd.keyboard layouts", - "gsettings get org.gnome.libgnomekbd.keyboard options"); - g_signal_connect (dialog, "response", - G_CALLBACK (gtk_widget_destroy), NULL); - csd_delayed_show_dialog (dialog); -} - -static gboolean -ensure_xkl_registry (void) -{ - if (!xkl_registry) { - xkl_registry = - xkl_config_registry_get_instance (xkl_engine); - /* load all materials, unconditionally! */ - if (!xkl_config_registry_load (xkl_registry, TRUE)) { - g_object_unref (xkl_registry); - xkl_registry = NULL; - return FALSE; - } - } - - return TRUE; -} - -static void -apply_desktop_settings (void) -{ - if (!inited_ok) - return; - - csd_keyboard_manager_apply_settings (manager); - gkbd_desktop_config_load (¤t_config); - /* again, probably it would be nice to compare things - before activating them */ - gkbd_desktop_config_activate (¤t_config); -} - -static void -popup_menu_launch_capplet () -{ - GAppInfo *info; - GdkAppLaunchContext *ctx; - GError *error = NULL; - - info = - g_app_info_create_from_commandline - ("cinnamon-settings region", NULL, 0, &error); - - if (info != NULL) { - ctx = - gdk_display_get_app_launch_context - (gdk_display_get_default ()); - - if (g_app_info_launch (info, NULL, - G_APP_LAUNCH_CONTEXT (ctx), &error) == FALSE) { - g_warning - ("Could not execute keyboard properties capplet: [%s]\n", - error->message); - g_error_free (error); - } - - g_object_unref (info); - g_object_unref (ctx); - } - -} - -static void -show_layout_destroy (GtkWidget * dialog, gint group) -{ - g_hash_table_remove (preview_dialogs, GINT_TO_POINTER (group)); -} - -static void -popup_menu_show_layout () -{ - GtkWidget *dialog; - XklEngine *engine = - xkl_engine_get_instance (GDK_DISPLAY_XDISPLAY - (gdk_display_get_default ())); - XklState *xkl_state = xkl_engine_get_current_state (engine); - - gchar **group_names = gkbd_status_get_group_names (); - - gpointer p = g_hash_table_lookup (preview_dialogs, - GINT_TO_POINTER - (xkl_state->group)); - - if (xkl_state->group < 0 - || xkl_state->group >= g_strv_length (group_names)) { - return; - } - - if (p != NULL) { - /* existing window */ - gtk_window_present (GTK_WINDOW (p)); - return; - } - - if (!ensure_xkl_registry ()) - return; - - dialog = gkbd_keyboard_drawing_dialog_new (); - gkbd_keyboard_drawing_dialog_set_group (dialog, xkl_registry, xkl_state->group); - - g_signal_connect (dialog, "destroy", - G_CALLBACK (show_layout_destroy), - GINT_TO_POINTER (xkl_state->group)); - g_hash_table_insert (preview_dialogs, - GINT_TO_POINTER (xkl_state->group), dialog); - gtk_widget_show_all (dialog); -} - -static void -popup_menu_set_group (gint group_number, gboolean only_menu) -{ - - XklEngine *engine = gkbd_status_get_xkl_engine (); - - XklState *st = xkl_engine_get_current_state(engine); - Window cur; - st->group = group_number; - xkl_engine_allow_one_switch_to_secondary_group (engine); - cur = xkl_engine_get_current_window (engine); - if (cur != (Window) NULL) { - xkl_debug (150, "Enforcing the state %d for window %lx\n", - st->group, cur); - - xkl_engine_save_state (engine, - xkl_engine_get_current_window - (engine), st); -/* XSetInputFocus( GDK_DISPLAY(), cur, RevertToNone, CurrentTime );*/ - } else { - xkl_debug (150, - "??? Enforcing the state %d for unknown window\n", - st->group); - /* strange situation - bad things can happen */ - } - if (!only_menu) - xkl_engine_lock_group (engine, st->group); -} - -static void -popup_menu_set_group_cb (GtkMenuItem * item, gpointer param) -{ - gint group_number = GPOINTER_TO_INT (param); - - popup_menu_set_group(group_number, FALSE); -} - - -static GtkMenu * -create_status_menu (void) -{ - GtkMenu *popup_menu = GTK_MENU (gtk_menu_new ()); - int i = 0; - - GtkMenu *groups_menu = GTK_MENU (gtk_menu_new ()); - gchar **current_name = gkbd_status_get_group_names (); - - GtkWidget *item = gtk_menu_item_new_with_mnemonic (_("_Layouts")); - gtk_widget_show (item); - gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), item); - gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), - GTK_WIDGET (groups_menu)); - - item = gtk_menu_item_new_with_mnemonic (_("Show _Keyboard Layout...")); - gtk_widget_show (item); - g_signal_connect (item, "activate", popup_menu_show_layout, NULL); - gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), item); - - /* translators note: - * This is the name of the cinnamon-settings "region" panel */ - item = gtk_menu_item_new_with_mnemonic (_("Region and Language Settings")); - gtk_widget_show (item); - g_signal_connect (item, "activate", popup_menu_launch_capplet, NULL); - gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), item); - - for (i = 0; current_name && *current_name; i++, current_name++) { - - gchar *image_file = gkbd_status_get_image_filename (i); - - if (image_file == NULL) { - item = - gtk_menu_item_new_with_label (*current_name); - } else { - GdkPixbuf *pixbuf = - gdk_pixbuf_new_from_file_at_size (image_file, - 24, 24, - NULL); - GtkWidget *img = - gtk_image_new_from_pixbuf (pixbuf); - item = - gtk_image_menu_item_new_with_label - (*current_name); - gtk_widget_show (img); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM - (item), img); - gtk_image_menu_item_set_always_show_image - (GTK_IMAGE_MENU_ITEM (item), TRUE); - g_free (image_file); - } - gtk_widget_show (item); - gtk_menu_shell_append (GTK_MENU_SHELL (groups_menu), item); - g_signal_connect (item, "activate", - G_CALLBACK (popup_menu_set_group_cb), - GINT_TO_POINTER (i)); - } - - return popup_menu; -} - -static void -status_icon_popup_menu_cb (GtkStatusIcon * icon, guint button, guint time) -{ - GtkMenu *popup_menu = create_status_menu (); - - gtk_menu_popup (popup_menu, NULL, NULL, - gtk_status_icon_position_menu, - (gpointer) icon, button, time); -} - -static gboolean -try_activating_xkb_config_if_new (GkbdKeyboardConfig * - current_sys_kbd_config) -{ - /* Activate - only if different! */ - if (!gkbd_keyboard_config_equals - (¤t_kbd_config, current_sys_kbd_config)) { - if (gkbd_keyboard_config_activate (¤t_kbd_config)) { - if (pa_callback != NULL) { - (*pa_callback) (pa_callback_user_data); - return TRUE; - } - } else { - return FALSE; - } - } - return TRUE; -} - -static gboolean -filter_xkb_config (void) -{ - XklConfigItem *item; - gchar *lname; - gchar *vname; - gchar **lv; - gboolean any_change = FALSE; - - xkl_debug (100, "Filtering configuration against the registry\n"); - if (!ensure_xkl_registry ()) - return FALSE; - - lv = current_kbd_config.layouts_variants; - item = xkl_config_item_new (); - while (*lv) { - xkl_debug (100, "Checking [%s]\n", *lv); - if (gkbd_keyboard_config_split_items (*lv, &lname, &vname)) { - gboolean should_be_dropped = FALSE; - g_snprintf (item->name, sizeof (item->name), "%s", - lname); - if (!xkl_config_registry_find_layout - (xkl_registry, item)) { - xkl_debug (100, "Bad layout [%s]\n", - lname); - should_be_dropped = TRUE; - } else if (vname) { - g_snprintf (item->name, - sizeof (item->name), "%s", - vname); - if (!xkl_config_registry_find_variant - (xkl_registry, lname, item)) { - xkl_debug (100, - "Bad variant [%s(%s)]\n", - lname, vname); - should_be_dropped = TRUE; - } - } - if (should_be_dropped) { - gkbd_strv_behead (lv); - any_change = TRUE; - continue; - } - } - lv++; - } - g_object_unref (item); - return any_change; -} - -static void -apply_xkb_settings (void) -{ - GkbdKeyboardConfig current_sys_kbd_config; - - if (!inited_ok) - return; - - gkbd_keyboard_config_init (¤t_sys_kbd_config, xkl_engine); - - gkbd_keyboard_config_load (¤t_kbd_config, - &initial_sys_kbd_config); - - gkbd_keyboard_config_load_from_x_current (¤t_sys_kbd_config, - NULL); - - if (!try_activating_xkb_config_if_new (¤t_sys_kbd_config)) { - if (filter_xkb_config ()) { - if (!try_activating_xkb_config_if_new - (¤t_sys_kbd_config)) { - g_warning - ("Could not activate the filtered XKB configuration"); - activation_error (); - } - } else { - g_warning - ("Could not activate the XKB configuration"); - activation_error (); - } - } else - xkl_debug (100, - "Actual KBD configuration was not changed: redundant notification\n"); - - gkbd_keyboard_config_term (¤t_sys_kbd_config); - //show_hide_icon (); -} - -static void -csd_keyboard_xkb_analyze_sysconfig (void) -{ - if (!inited_ok) - return; - - gkbd_keyboard_config_init (&initial_sys_kbd_config, xkl_engine); - gkbd_keyboard_config_load_from_x_initial (&initial_sys_kbd_config, - NULL); -} - -void -csd_keyboard_xkb_set_post_activation_callback (PostActivationCallback fun, - void *user_data) -{ - pa_callback = fun; - pa_callback_user_data = user_data; -} - -static GdkFilterReturn -csd_keyboard_xkb_evt_filter (GdkXEvent * xev, GdkEvent * event) -{ - XEvent *xevent = (XEvent *) xev; - xkl_engine_filter_events (xkl_engine, xevent); - return GDK_FILTER_CONTINUE; -} - -/* When new Keyboard is plugged in - reload the settings */ -static void -csd_keyboard_new_device (XklEngine * engine) -{ - apply_desktop_settings (); - apply_xkb_settings (); -} - -void -csd_keyboard_xkb_init (CsdKeyboardManager * kbd_manager) -{ - Display *display = - GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); - cinnamon_settings_profile_start (NULL); - - gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (), - DATADIR G_DIR_SEPARATOR_S - "icons"); - - manager = kbd_manager; - cinnamon_settings_profile_start ("xkl_engine_get_instance"); - xkl_engine = xkl_engine_get_instance (display); - cinnamon_settings_profile_end ("xkl_engine_get_instance"); - if (xkl_engine) { - inited_ok = TRUE; - - gkbd_desktop_config_init (¤t_config, xkl_engine); - gkbd_keyboard_config_init (¤t_kbd_config, - xkl_engine); - xkl_engine_backup_names_prop (xkl_engine); - csd_keyboard_xkb_analyze_sysconfig (); - - settings_desktop = g_settings_new (GKBD_DESKTOP_SCHEMA); - settings_keyboard = g_settings_new (GKBD_KEYBOARD_SCHEMA); - g_signal_connect (settings_desktop, "changed", - (GCallback) apply_desktop_settings, - NULL); - g_signal_connect (settings_keyboard, "changed", - (GCallback) apply_xkb_settings, NULL); - - gdk_window_add_filter (NULL, (GdkFilterFunc) - csd_keyboard_xkb_evt_filter, NULL); - - if (xkl_engine_get_features (xkl_engine) & - XKLF_DEVICE_DISCOVERY) - g_signal_connect (xkl_engine, "X-new-device", - G_CALLBACK - (csd_keyboard_new_device), NULL); - - cinnamon_settings_profile_start ("xkl_engine_start_listen"); - xkl_engine_start_listen (xkl_engine, - XKLL_MANAGE_LAYOUTS | - XKLL_MANAGE_WINDOW_STATES); - cinnamon_settings_profile_end ("xkl_engine_start_listen"); - - cinnamon_settings_profile_start ("apply_desktop_settings"); - apply_desktop_settings (); - cinnamon_settings_profile_end ("apply_desktop_settings"); - cinnamon_settings_profile_start ("apply_xkb_settings"); - apply_xkb_settings (); - cinnamon_settings_profile_end ("apply_xkb_settings"); - } - preview_dialogs = g_hash_table_new (g_direct_hash, g_direct_equal); - - cinnamon_settings_profile_end (NULL); -} - -void -csd_keyboard_xkb_shutdown (void) -{ - if (!inited_ok) - return; - - pa_callback = NULL; - pa_callback_user_data = NULL; - manager = NULL; - - if (preview_dialogs != NULL) - g_hash_table_destroy (preview_dialogs); - - if (!inited_ok) - return; - - xkl_engine_stop_listen (xkl_engine, - XKLL_MANAGE_LAYOUTS | - XKLL_MANAGE_WINDOW_STATES); - - gdk_window_remove_filter (NULL, (GdkFilterFunc) - csd_keyboard_xkb_evt_filter, NULL); - - g_object_unref (settings_desktop); - settings_desktop = NULL; - g_object_unref (settings_keyboard); - settings_keyboard = NULL; - - if (xkl_registry) { - g_object_unref (xkl_registry); - } - - g_object_unref (xkl_engine); - - xkl_engine = NULL; - - inited_ok = FALSE; -} diff --git a/plugins/keyboard/csd-keyboard-xkb.h b/plugins/keyboard/csd-keyboard-xkb.h deleted file mode 100644 index 6f3388d1..00000000 --- a/plugins/keyboard/csd-keyboard-xkb.h +++ /dev/null @@ -1,39 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- - * cinnamon-settings-keyboard-xkb.h - * - * Copyright (C) 2001 Udaltsoft - * - * Written by Sergey V. Oudaltsov - * - * 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, 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., 51 Franklin Street - Suite 500, Boston, MA - * 02110-1335, USA. - */ - -#ifndef __CSD_KEYBOARD_XKB_H -#define __CSD_KEYBOARD_XKB_H - -#include -#include "csd-keyboard-manager.h" - -void csd_keyboard_xkb_init (CsdKeyboardManager *manager); -void csd_keyboard_xkb_shutdown (void); - -typedef void (*PostActivationCallback) (void *userData); - -void -csd_keyboard_xkb_set_post_activation_callback (PostActivationCallback fun, - void *userData); - -#endif diff --git a/plugins/keyboard/delayed-dialog.c b/plugins/keyboard/delayed-dialog.c deleted file mode 100644 index 7c1e0d32..00000000 --- a/plugins/keyboard/delayed-dialog.c +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright © 2006 Novell, Inc. - * - * 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, 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., 51 Franklin Street - Suite 500, Boston, MA - * 02110-1335, USA. - */ - -#include -#include - -#include -#include - -#include "delayed-dialog.h" - -static gboolean delayed_show_timeout (gpointer data); -static GdkFilterReturn message_filter (GdkXEvent *xevent, - GdkEvent *event, - gpointer data); - -static GSList *dialogs = NULL; - -/** - * csd_delayed_show_dialog: - * @dialog: the dialog - * - * Shows the dialog as with gtk_widget_show(), unless a window manager - * hasn't been started yet, in which case it will wait up to 5 seconds - * for that to happen before showing the dialog. - **/ -void -csd_delayed_show_dialog (GtkWidget *dialog) -{ - GdkDisplay *display = gtk_widget_get_display (dialog); - Display *xdisplay = GDK_DISPLAY_XDISPLAY (display); - GdkScreen *screen = gtk_widget_get_screen (dialog); - char selection_name[10]; - Atom selection_atom; - - /* We can't use gdk_selection_owner_get() for this, because - * it's an unknown out-of-process window. - */ - snprintf (selection_name, sizeof (selection_name), "WM_S%d", - gdk_screen_get_number (screen)); - selection_atom = XInternAtom (xdisplay, selection_name, True); - if (selection_atom && - XGetSelectionOwner (xdisplay, selection_atom) != None) { - gtk_widget_show (dialog); - return; - } - - dialogs = g_slist_prepend (dialogs, dialog); - - gdk_window_add_filter (NULL, message_filter, NULL); - - g_timeout_add (5000, delayed_show_timeout, NULL); -} - -static gboolean -delayed_show_timeout (gpointer data) -{ - GSList *l; - - for (l = dialogs; l; l = l->next) - gtk_widget_show (l->data); - g_slist_free (dialogs); - dialogs = NULL; - - /* FIXME: There's no gdk_display_remove_client_message_filter */ - - return FALSE; -} - -static GdkFilterReturn -message_filter (GdkXEvent *xevent, GdkEvent *event, gpointer data) -{ - XClientMessageEvent *evt; - char *selection_name; - int screen; - GSList *l, *next; - - if (((XEvent *)xevent)->type != ClientMessage) - return GDK_FILTER_CONTINUE; - - evt = (XClientMessageEvent *)xevent; - - if (evt->message_type != XInternAtom (evt->display, "MANAGER", FALSE)) - return GDK_FILTER_CONTINUE; - - selection_name = XGetAtomName (evt->display, evt->data.l[1]); - - if (strncmp (selection_name, "WM_S", 4) != 0) { - XFree (selection_name); - return GDK_FILTER_CONTINUE; - } - - screen = atoi (selection_name + 4); - - for (l = dialogs; l; l = next) { - GtkWidget *dialog = l->data; - next = l->next; - - if (gdk_screen_get_number (gtk_widget_get_screen (dialog)) == screen) { - gtk_widget_show (dialog); - dialogs = g_slist_remove (dialogs, dialog); - } - } - - if (!dialogs) { - gdk_window_remove_filter (NULL, message_filter, NULL); - } - - XFree (selection_name); - - return GDK_FILTER_CONTINUE; -} diff --git a/plugins/keyboard/delayed-dialog.h b/plugins/keyboard/delayed-dialog.h deleted file mode 100644 index 8bfa8284..00000000 --- a/plugins/keyboard/delayed-dialog.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright © 2006 Novell, Inc. - * - * 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, 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., 51 Franklin Street - Suite 500, Boston, MA - * 02110-1335, USA. - */ - - -#ifndef __DELAYED_DIALOG_H -#define __DELAYED_DIALOG_H - -#include - -G_BEGIN_DECLS - -void csd_delayed_show_dialog (GtkWidget *dialog); - -G_END_DECLS - -#endif diff --git a/plugins/keyboard/gkbd-configuration.c b/plugins/keyboard/gkbd-configuration.c deleted file mode 100644 index 6d8e6829..00000000 --- a/plugins/keyboard/gkbd-configuration.c +++ /dev/null @@ -1,350 +0,0 @@ -/* - * Copyright (C) 2010 Canonical Ltd. - * - * Authors: Jan Arne Petersen - * - * Based on gkbd-status.c by Sergey V. Udaltsov - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street - Suite 500, - * Boston, MA 02110-1335, USA. - */ - -#include - -#include -#include -#include - -#include -#include - -#include "gkbd-configuration.h" - -struct _GkbdConfigurationPrivate { - XklEngine *engine; - XklConfigRegistry *registry; - - GkbdDesktopConfig cfg; - GkbdIndicatorConfig ind_cfg; - GkbdKeyboardConfig kbd_cfg; - - gchar **full_group_names; - gchar **short_group_names; - - gulong state_changed_handler; - gulong config_changed_handler; -}; - -enum { - SIGNAL_CHANGED, - SIGNAL_GROUP_CHANGED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0, }; - -#define GKBD_CONFIGURATION_GET_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((o), GKBD_TYPE_CONFIGURATION, GkbdConfigurationPrivate)) - -G_DEFINE_TYPE (GkbdConfiguration, gkbd_configuration, G_TYPE_OBJECT) - -/* Should be called once for all widgets */ -static void -gkbd_configuration_cfg_changed (GSettings *settings, - const char *key, - GkbdConfiguration * configuration) -{ - GkbdConfigurationPrivate *priv = configuration->priv; - - xkl_debug (100, - "General configuration changed in GSettings - reiniting...\n"); - gkbd_desktop_config_load (&priv->cfg); - gkbd_desktop_config_activate (&priv->cfg); - - g_signal_emit (configuration, - signals[SIGNAL_CHANGED], 0); -} - -/* Should be called once for all widgets */ -static void -gkbd_configuration_ind_cfg_changed (GSettings *settings, - const char *key, - GkbdConfiguration * configuration) -{ - GkbdConfigurationPrivate *priv = configuration->priv; - xkl_debug (100, - "Applet configuration changed in GSettings - reiniting...\n"); - gkbd_indicator_config_load (&priv->ind_cfg); - - gkbd_indicator_config_free_image_filenames (&priv->ind_cfg); - gkbd_indicator_config_load_image_filenames (&priv->ind_cfg, - &priv->kbd_cfg); - - gkbd_indicator_config_activate (&priv->ind_cfg); - - g_signal_emit (configuration, - signals[SIGNAL_CHANGED], 0); -} - -static void -gkbd_configuration_load_group_names (GkbdConfiguration * configuration, - XklConfigRec * xklrec) -{ - GkbdConfigurationPrivate *priv = configuration->priv; - - if (!gkbd_desktop_config_load_group_descriptions (&priv->cfg, - priv->registry, - (const char **) xklrec->layouts, - (const char **) xklrec->variants, - &priv->short_group_names, - &priv->full_group_names)) { - /* We just populate no short names (remain NULL) - - * full names are going to be used anyway */ - gint i, total_groups = - xkl_engine_get_num_groups (priv->engine); - xkl_debug (150, "group descriptions loaded: %d!\n", - total_groups); - priv->full_group_names = - g_new0 (char *, total_groups + 1); - - if (xkl_engine_get_features (priv->engine) & - XKLF_MULTIPLE_LAYOUTS_SUPPORTED) { - for (i = 0; priv->kbd_cfg.layouts_variants[i]; i++) { - priv->full_group_names[i] = - g_strdup ((char *) priv->kbd_cfg.layouts_variants[i]); - } - } else { - for (i = total_groups; --i >= 0;) { - priv->full_group_names[i] = - g_strdup_printf ("Group %d", i); - } - } - } -} - -/* Should be called once for all widgets */ -static void -gkbd_configuration_kbd_cfg_callback (XklEngine *engine, - GkbdConfiguration *configuration) -{ - GkbdConfigurationPrivate *priv = configuration->priv; - XklConfigRec *xklrec = xkl_config_rec_new (); - xkl_debug (100, - "XKB configuration changed on X Server - reiniting...\n"); - - gkbd_keyboard_config_load_from_x_current (&priv->kbd_cfg, - xklrec); - - gkbd_indicator_config_free_image_filenames (&priv->ind_cfg); - gkbd_indicator_config_load_image_filenames (&priv->ind_cfg, - &priv->kbd_cfg); - - g_strfreev (priv->full_group_names); - priv->full_group_names = NULL; - - g_strfreev (priv->short_group_names); - priv->short_group_names = NULL; - - gkbd_configuration_load_group_names (configuration, - xklrec); - - g_signal_emit (configuration, - signals[SIGNAL_CHANGED], - 0); - - g_object_unref (G_OBJECT (xklrec)); -} - -/* Should be called once for all applets */ -static void -gkbd_configuration_state_callback (XklEngine * engine, - XklEngineStateChange changeType, - gint group, gboolean restore, - GkbdConfiguration * configuration) -{ - xkl_debug (150, "group is now %d, restore: %d\n", group, restore); - - if (changeType == GROUP_CHANGED) { - g_signal_emit (configuration, - signals[SIGNAL_GROUP_CHANGED], 0, - group); - } -} - -static void -gkbd_configuration_init (GkbdConfiguration *configuration) -{ - GkbdConfigurationPrivate *priv; - XklConfigRec *xklrec = xkl_config_rec_new (); - - priv = GKBD_CONFIGURATION_GET_PRIVATE (configuration); - configuration->priv = priv; - - priv->engine = xkl_engine_get_instance (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ())); - if (priv->engine == NULL) { - xkl_debug (0, "Libxklavier initialization error"); - return; - } - - priv->state_changed_handler = - g_signal_connect (priv->engine, "X-state-changed", - G_CALLBACK (gkbd_configuration_state_callback), - configuration); - priv->config_changed_handler = - g_signal_connect (priv->engine, "X-config-changed", - G_CALLBACK (gkbd_configuration_kbd_cfg_callback), - configuration); - - gkbd_desktop_config_init (&priv->cfg, priv->engine); - gkbd_keyboard_config_init (&priv->kbd_cfg, priv->engine); - gkbd_indicator_config_init (&priv->ind_cfg, priv->engine); - - gkbd_desktop_config_load (&priv->cfg); - gkbd_desktop_config_activate (&priv->cfg); - - priv->registry = xkl_config_registry_get_instance (priv->engine); - xkl_config_registry_load (priv->registry, - priv->cfg.load_extra_items); - - gkbd_keyboard_config_load_from_x_current (&priv->kbd_cfg, - xklrec); - - gkbd_indicator_config_load (&priv->ind_cfg); - - gkbd_indicator_config_load_image_filenames (&priv->ind_cfg, - &priv->kbd_cfg); - - gkbd_indicator_config_activate (&priv->ind_cfg); - - gkbd_configuration_load_group_names (configuration, - xklrec); - g_object_unref (G_OBJECT (xklrec)); - - gkbd_desktop_config_start_listen (&priv->cfg, - G_CALLBACK (gkbd_configuration_cfg_changed), - configuration); - gkbd_indicator_config_start_listen (&priv->ind_cfg, - G_CALLBACK (gkbd_configuration_ind_cfg_changed), - configuration); - xkl_engine_start_listen (priv->engine, - XKLL_TRACK_KEYBOARD_STATE); - - xkl_debug (100, "Initiating the widget startup process for %p\n", - configuration); -} - -static void -gkbd_configuration_finalize (GObject * obj) -{ - GkbdConfiguration *configuration = GKBD_CONFIGURATION (obj); - GkbdConfigurationPrivate *priv = configuration->priv; - - xkl_debug (100, - "Starting the gnome-kbd-configuration widget shutdown process for %p\n", - configuration); - - xkl_engine_stop_listen (priv->engine, - XKLL_TRACK_KEYBOARD_STATE); - - gkbd_desktop_config_stop_listen (&priv->cfg); - gkbd_indicator_config_stop_listen (&priv->ind_cfg); - - gkbd_indicator_config_term (&priv->ind_cfg); - gkbd_keyboard_config_term (&priv->kbd_cfg); - gkbd_desktop_config_term (&priv->cfg); - - if (g_signal_handler_is_connected (priv->engine, - priv->state_changed_handler)) { - g_signal_handler_disconnect (priv->engine, - priv->state_changed_handler); - priv->state_changed_handler = 0; - } - if (g_signal_handler_is_connected (priv->engine, - priv->config_changed_handler)) { - g_signal_handler_disconnect (priv->engine, - priv->config_changed_handler); - priv->config_changed_handler = 0; - } - - g_object_unref (priv->registry); - priv->registry = NULL; - g_object_unref (priv->engine); - priv->engine = NULL; - - G_OBJECT_CLASS (gkbd_configuration_parent_class)->finalize (obj); -} - -static void -gkbd_configuration_class_init (GkbdConfigurationClass * klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - /* Initing vtable */ - object_class->finalize = gkbd_configuration_finalize; - - /* Signals */ - signals[SIGNAL_CHANGED] = g_signal_new ("changed", - GKBD_TYPE_CONFIGURATION, - G_SIGNAL_RUN_LAST, - 0, - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, - 0); - signals[SIGNAL_GROUP_CHANGED] = g_signal_new ("group-changed", - GKBD_TYPE_CONFIGURATION, - G_SIGNAL_RUN_LAST, - 0, - NULL, NULL, - g_cclosure_marshal_VOID__INT, - G_TYPE_NONE, - 1, - G_TYPE_INT); - - g_type_class_add_private (klass, sizeof (GkbdConfigurationPrivate)); -} - -GkbdConfiguration * -gkbd_configuration_get (void) -{ - static gpointer instance = NULL; - - if (!instance) { - instance = g_object_new (GKBD_TYPE_CONFIGURATION, NULL); - g_object_add_weak_pointer (instance, &instance); - } else { - g_object_ref (instance); - } - - return instance; -} - -XklEngine * -gkbd_configuration_get_xkl_engine (GkbdConfiguration *configuration) -{ - return configuration->priv->engine; -} - -const char * const * -gkbd_configuration_get_group_names (GkbdConfiguration *configuration) -{ - return (const char * const *)configuration->priv->full_group_names; -} - -const char * const * -gkbd_configuration_get_short_group_names (GkbdConfiguration *configuration) -{ - return (const char * const *)configuration->priv->short_group_names; -} diff --git a/plugins/keyboard/gkbd-configuration.h b/plugins/keyboard/gkbd-configuration.h deleted file mode 100644 index e0309c21..00000000 --- a/plugins/keyboard/gkbd-configuration.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2010 Canonical Ltd. - * - * Authors: Jan Arne Petersen - * - * Based on gkbd-status.h by Sergey V. Udaltsov - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street - Suite 500, - * Boston, MA 02110-1335, USA. - */ - -#ifndef __GKBD_CONFIGURATION_H__ -#define __GKBD_CONFIGURATION_H__ - -#include - -#include - -G_BEGIN_DECLS - -typedef struct _GkbdConfiguration GkbdConfiguration; -typedef struct _GkbdConfigurationPrivate GkbdConfigurationPrivate; -typedef struct _GkbdConfigurationClass GkbdConfigurationClass; - -#define GKBD_TYPE_CONFIGURATION (gkbd_configuration_get_type ()) -#define GKBD_CONFIGURATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GKBD_TYPE_CONFIGURATION, GkbdConfiguration)) -#define GKBD_INDCATOR_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST ((obj), GKBD_TYPE_CONFIGURATION, GkbdConfigurationClass)) -#define GKBD_IS_CONFIGURATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GKBD_TYPE_CONFIGURATION)) -#define GKBD_IS_CONFIGURATION_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((obj), GKBD_TYPE_CONFIGURATION)) -#define GKBD_CONFIGURATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GKBD_TYPE_CONFIGURATION, GkbdConfigurationClass)) - -struct _GkbdConfiguration { - GObject parent; - - GkbdConfigurationPrivate *priv; -}; - -struct _GkbdConfigurationClass { - GObjectClass parent_class; -}; - -extern GType gkbd_configuration_get_type (void); - -extern GkbdConfiguration *gkbd_configuration_get (void); - -extern XklEngine *gkbd_configuration_get_xkl_engine (GkbdConfiguration *configuration); - -extern const char * const *gkbd_configuration_get_group_names (GkbdConfiguration *configuration); -extern const char * const *gkbd_configuration_get_short_group_names (GkbdConfiguration *configuration); - -G_END_DECLS - -#endif diff --git a/plugins/keyboard/kbd-capslock-off.png b/plugins/keyboard/kbd-capslock-off.png deleted file mode 100644 index 828cfa8e8407d1d9876f5cea374f606d7a71520a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1650 zcmV-&295cNP)W&cKOif?T@y(#VU-ow{dwq` zrKYB4cDlP7COiLRlIfoJ-v7Ots_Lp&uZ;=@&@O4Qq}h^Y1U{0~7xp9a&{aO7m zFuy?l`Ie&=27%5Zh}(c&b%;*`E29(F_GhK#tc6`bTP(6RV0R6o8^CrV%*Gk~Dp~Fu zHGJD0r4j1<^Ou1o5n{>f-xBLfuqWg--dV%&Szu127;*!cV|@xC+nhi$+lMB+ZeVKU z7;*!cYJKxDNZO|Z$#XvRs5{$?!IxnhA=DH4NwZEMyvVuSOx?Z~>~ILp35Oaruq>c_ zgC>~p8U@M37>HUev5pM29iglk5klpWCQC0N~h~8H7V?$8CooDsHHFg z=nW`DU*VCgyv`GLVJfDA;F^o!RQ+s;BMg0 z0M}nc*gXdL<_EZr`$E&H-gg(0WB^_bI8?@K1#$XY>0xY+u{^o0cD|SKX%WsyTIziN zUD7${dU-*dek?}Ps*x*Tuh&9D1$D=Tz<&j4{7Sa_5~zK&WSChKqW;eT-C{{W^$^d~q3swakc*d)mW1w+1Brl+w(Dx;Y${0d4i> zj|LFRHJmSGI}EJ#?0uHO#>bwGEW^jO7u*h)j4}VHayKSP3&@uc@iV-krSE9)cWPe?Iu-NDU%M35t(QYjKhq!Ast=d~yamcL2XSb}j+;X7ni(-)8CN3T=<1VNdVb zEM$^ilr+t`?y=h(XjJf6}<=wM`9NN_xGJ|Nui(HQU+ z$>D1GlY0dRyy4m0nL;;oGdXbbh*1BbKj?vD5!E#S%n&ChZg_4f()-9E_1g%{xZOK}JO&n6J&9l=O-*=8F_MaY3?yT0?j% zT@-pr%6gk;mr9aP*g}$7YNXqy#Slp`=T-`+A&Ls%9+FpE_fVa3PlKx@C44VXK-r#@ wa}H<(BpKnwN{X@4ygq+U$zf{hglZc64@}K!xfan(ivR!s07*qoM6N<$f?MVC#Q*>R diff --git a/plugins/keyboard/kbd-capslock-on.png b/plugins/keyboard/kbd-capslock-on.png deleted file mode 100644 index 32ea0c9d084a91dcfc49b694039ff359729691a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1488 zcmV;>1uy!EP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L00W!=00W!>ZkwS_00007bV*G`2igP~ z78nFNJ*d6_00mG3ettTD2m!ev^1&Sk_e_k4L)j%MkOH@O$7^964Uxfj*Cpl zWODv{?|=W9>rL(t1NZ;$ne&=6XU;h@lOpgVPz~GasiTb~ytWEuJ21zJmB z8E!SasFvVk&TEKA1)54I7HKj(X}oq7inJxd;SCDZmS7}WYk1QfV@q6Q4G~M-XekQs zC}A{WiEN02C=)T~n<(+eOb5*;oXr0&BL-{N%Un?DZR$xlrqsVbF z>yj<7J0i$QuRsN)BZ8$pQ61I@Oeh^X12ESqaK>qm1frv*((5(ggIa7KXms9IXuTVV zmXTc`PPztWGJTjSP zsq(ij304AGKrzzX$DAnhR2JAi7FUKe@Mtme=3rC6?DN@X{cW~dy~*LfvEYA^d4CXe z3M_XFew|;vv-ZzM0jFRN7<72q>ye*j)4ejV0^Ay0t-y;p`qU~oUJa!H1db{pVvPrL z+a@sM;V{IEEOnwurlX7dXgb2{Z}t@WuJeFr9kAO29!;jnN+%z;^YV)cv|RzTTc4(Z z?_#34!YZwob4h!sZ@O@AKj&~d!yMm;{AqpY_?>qRODgcMOG5en9 zg2-tbpj&Ye-31b>6S(TE)#D2oex=HS?wB#&?g=3D_dw6gel4e&tHjS+zd1pcx5e=ks(KmjR%ubiUk zeKB!p8zYCJYIfsEw#EcrF`KIkEpY@V@REb`NK6ZI<+&`dHmbwUGT0pL%4Kq2uHx7rlZk_*ybnnkWaWEIE=xRKJ_jW&%-EP63X+q zyy6qe@4|$#I+W*?87EFCrAt$pLN84vy*AedybNrM(aqpfL1&>0I0~!z_G z7+r$x(TVK3M7Og9o;|?C{)k<`Y~Vs44($Mz0JRbLY7<*K`ry0(%#IObF=y&2KC15n zW>%4ZX2Ow$4xqjo#6y6MMTi@L1<{GK{aKK3W?>^RBo^5aU~>l1RbUMfM&k!!k$tMJY^_f zWdIC#r2;=NTC>B`eJK`zUkt@H{p5Qz;HStC$0;^t11}j$jYX9zbFK!M4lD#_0C&W+ zpKuhg7fXw?6ovuKhC-AT9xxPm4cG;=1{`g`_rNCha4?W-1}5e8A@L*JN_UaYF#=1CR$3B)INV2^03OMZ9RYkD z$bXvGhs5?0BfjNnfvv&API4wQ@Pppzpw(CQp)(dZo6`9kcrcG2iCwFQZ|{CMir(+x zfe57Y1Dl5^VLAmi1bXk~^(C=;Ah6p3)D+|oErtj3-$vkkD7Zf5oa-te&k(2f~5T!b0QTh&V3wV*@znnk4N{-MUTETR`S<9Decjr17Y# z4Ny&dBI$DK`Z-D8U>tP=Z%X=5lI2sbGt6QbD&H#irtVp@LPc=SeFe;u)V-{BlAe_` z6F4pDclr0bPSX9l9%z$%K}9!W6-o5!?Nx1n1S{niTF>kHzniWO39(bsZ<1E0?p3V; z3Nqe{NMw>E=iFuI+>4S{NIIgPi<~shN_t;@5DYU!;fzu#GJ8N8HNfadYk_NU&TW#k z379463Hb%iNJ)Rmclj@zbN@*aa8F9LUD9`X`SC~dVeNt00FpFG(($~c7Myd3Bpu3n z4%{i}zSON#&bjjus3#fsS_+cR7!T%0AgmP2)N|o;Fp^y>rlzWGhbsX-F?%%SM>~<~ z4YIbw-4CNDL@IRhqri`?k?dLtk!@)KD`k{BC6?HpMIVU}zya^l^Dy>Lpq%2XV)m{0 zmZb&88Z8v1@(Q2qYy>_AUI3=zyZS9a9q>B6PjxQ?>tpaIK3GZ7aiP$Dqm^Q$#eXo! zTY-zf6@&8%kbr1E|?H&4Rk;|3^6~OYml_wIk&3}ow&enpcY|orK^Qzd|7Y5&pw&J z=Mz@oGfSm(+j7x~FXmhY47<_s76m@XxER=iT?tw$+VL6drBo?PUA1H9ZUCd?E79sy k-skgYPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L00W!=00W!>ZkwS_00007bV*G`2igP~ z78n&!jfhMD00p;6L_t(|+U1*VXq8nQz<;t^E~JL-=1^+Z|8qJB5ndDKm)K2C|5c_TY)xRTK)b*p zfk^?$uulpc7T7LOk?Tya5a<#Z5SU#6(?NY!;IzO_fudYuJSNa8a47<&gZgEGtpc%y z((f&h`DS1bP@BfIaci$*>4cIrV4VYA@t`N$f4x$mH^iTs5$F@xC9qzgGz9EYGj^Am zI}-xWF@ef#F<&omB?Un}0&N0i4)B#3SUo9lUJKyV#strvVt*w~?tq)Lm#|2j9peMS@(55NI`gDO+2AI0xTx8x7 z!f=3ztV{<`Z@`|fCdZrE4w_Cl78bzc0ouNiMbeC7)U3l3VNA=9%EazP7?O7@e4I^c zvIU+CaB^afi7OGP71$)OL11-6euCyKZ4H`GC@`u_XmLbPfxt@wM+L?d{ql{#8!nZs z@ffvGx=0(`srmMf2-zTTDrBrbDDb31A!xC~PHo_K%D_4Y1T+Zz7LehI3rr~A##{-( z1W-2o(^|-B$K5>+kgpLqW5JCJye{yNi8Cq$UKHrJ#*GTx;YbKQitsD^1GXtrYKtI_ z7!r6eVC+hP&#mzvIubye!rylPfP+dVr_6!UJ8wySM~D@3(KqK$f%_aKRqPdhc6;-g2}G`ji- zsSs$00aeQ2BMuPS_BJQ;G{HEZl`1Srll zo5oYQCV+7d{&IlOX887y^Bw?-t#|7eN{r!YJd6P1j`rMD>pAS%-o47ZTO838&!zwl zSgYU>nXeeNwn=%na?uIEOB`>X@V&YjcukTV#~J7Av1|(<%Ju;;<$Hb__(D7C7I+nS z7u{Fzq9U-sNaZfSR9pe~;4^_HuDjJ9@Dzyv zDge`V7)NWf@9&l;!E*%o8R*J}0Akv{aLK&~Qyx4EbO5I;C&%9|0&g27xH^SJalQil ztwf;IkuTsE#6Do3z((Lv95>ICqWgIJ)H`LzeC03Z>EpN&H4 zcyN+L4Z>BZ>IFP~awkDuI`kQ{5?n-40ilmK0rU4>}Q1TKroD`Ix{}foTQjw5v3j z!LOyo2eg45Q5=jY0!Y?J1Uen-742Z8OB=Y{5a9G^OyGHej|F}TsQH@~_}(bMO2^D= zM`M@7mjm^z30r_qEjU9!ZODXXQblJRoEj1qrT`cNhCDbEfklatfLmjIdclK_l4;`~ zmhkcTV9M0IK+_T~kZ2AIU@4Z!^rizOzl)>{u>38P^8wA@LP;O+{4JF=2=cpF+9!nk zESFbwLjGNtP^?3KUYW7{gj~8b)thM`wa{yGO~5;ZJM^4uF0aiE0=qppdLzw{C$J?T zl#Z&8nzG&)xzbENp~GaBW+GsE#uRgQN}|3ervs8T=4$JKfJ)G?eZpj{w?&nu_Oc+1 pViJ{TRit-){sM{X^M6N4-+#gJIBqTskRbp7002ovPDHLkV1gh!*Pj3Y diff --git a/plugins/keyboard/kbd-scrolllock-off.png b/plugins/keyboard/kbd-scrolllock-off.png deleted file mode 100644 index 2ff8748f77855e981fac29900b5e2351588b8e11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1467 zcmV;s1w{IZP)-idV(LF2*rJ6lUAyigwQ4948);kwp(qA%V+g^TT~lmI(){{#ap#$vn{!{@ z%bR&G^yLc=9{0{U-*e8LJ9p;H8K=kqS|pv7^uDCS#!r%78^1|O51eyzv26?v;1KW? za2Hr$>sSEp0bc{})!VO<0QLZvfN@~83a9h13Ooib1AFW3?^^%`pcj~q;B+2d0ewKB zTKip<&UZ=rPSVK=#OAdAU6Z3qMME(xX zk%tAKHwJMNaH9nA1kfFvINzRb&zXlCKvO8PCSWLsXc-tFz-YV$y9%CrImfo4AVDbc z@6A#C0%!~5L)8G=T!0_W4r9RofXNJ&3NujM9*puRTL-<#r zfIV62%M)k@rVN4LGdy4~@CR!Pokie!1fFigpI2D<1mL34cr>(8p6eR0l;K(gjz-|J z)()4ghL4Pf!522b3G4xC5x5nBufyPaoNd&~#&vg;Bm>DBKl}8HSOqFcu9VA}T}rRw zbBx8otta)rh#w;u^0}nbl6K`ZS(a4Y{M|;@7boe{v|&GIBD6w)WJVgmLEulyOPHPs z%x(4Xd&QgkfcebLv5*FMo||6xBKb?$V)uLkRF$tZ_{TCl3qVUj$)-hiCiYWc@@7fX zlCDbnLDD0m*t$+F>gIbI!THBOB9fT>CdBq4z1f&u9kVwc?}Z0r1HBwiAGz0Mvlg zLOljS69pMjsR3`jdccO>z7qiL1Ykn|S}0>1yGqnN0N$r;?SUBpNje_W7}aMGJZ@Zj zy-U(d<3^XHXQ7yZ(@GXWD@vZUmGt-oc*ozLm-M}JE@ZFhGOkV5WH}5tzr-z-3s@#u zDg)dM$?t72m&3)IwMdAZDdBt(t0YO2&?#~&A#zt*OM?w%WC}{Bi~_(p_p784NlTkF z?RU=2hU8Y_OLo$C`|UsAT_ZxllcK;$@?V1`B4naGuay)%lx_5zVN{H?_$}7n^)!}& z6A}2VwD`Ey@Pg5BG=f1#jQ}hG*Ftl7K5Jv-lGSiGFljW7u{Cx*6@(R%ZL;9yuh?5- z)8y?&1LqBa;G3f)De^Zdj-HVEJxAW=Xnx5I$@ltqLn!$6I7uZaz@5;#y?$$Z{OP6- z6F6rG1}~5xsV;vG91E$}>&`2Xux5j%f|``b5O~7lb>@}Gj8vkev5TaPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L00W!=00W!>ZkwS_00007bV*G`2igP~ z78fb_dgufI00g;7L_t(|+U=XqYgAVh$3JfrBXLBe7*KTJ-*e8r_uPAa+z8`Gpa>iXJ^&6V4PZ%W^T3@5mU-JAf&Bts3)~cVB_JDY zuLN!hd?Ro$??UesI3qAC@VX75eeJcteSxzA-FXtcAW#xmG!WX?{t!4RP-vI`s7>KV zfFFQ?7Jge!taTDLq1Xbg$H2D{l(Qc7UV%!Ak*W#I2uum|3+zrod$;R5<^HXuz_~5Z zo0afG0?(Q-R2KMBpeF!ckE2y?g858f$XfVP6RZBKz@Q=ipu=diYm_X2w+UQq0Q^{B zG{Yr0>M(u$Tol+AQut{P(3-$x2y48--DlGApz$^xL{)NDB4z}T8$BQ}>Lacd> z@SH$jj?N-|jwg-R(ng66c?{kifjv1qiSBW{X@+sARbsuKt!^%l!Y7n4=h-5ATOm~O ztoc3zruP~w2hAqjPD|ipkF_5*5dN^h6M>xuhEdxcK1s8+JWzg|G@7zE9Q`Q++LMYL zj~Z^-0-t*hIRyg-$72{T4VFT|b67g*`=LuSo8hDl#+dyI=0t%v>8bd$VC=ZfGTh10u&#R)Re@2$5?6k(=?5 z*tBv!7z^x-`~p;f)h1mhB6tya0*p}~^1Bw-(7r5!q5=aAmcgn;B+B7xLDBumPQPUo z7QY-@>q#4M!~jnVi_dBuPi2u95jdnMU{&C}(dcW5kuzGy9Rl+irN%DAlu&bNvTg$$ zEj702%|;7+mPK;Zg~(sVFvbmp_a#S5&Gzfxvq+D-N>CBFVKnu%^!UT3gDG$#ivkH( zUH(Miuz~Qt0*R5d1Tra+34P#kG<_v9l~#y!c9E1L*12VJF`}JYC>bN(xuvoWptFmm zV@l}Ea(Trjbl!ytWq0VzD>I36LY^*7RW^EQs@-dICxGvPk6QRG+?@pzdrwuC4c_`3jFK4Ep;Ny00000NkvXXu0mjfcS2iz diff --git a/plugins/keyboard/main.c b/plugins/keyboard/main.c index 5e7ae745..835e4b4e 100644 --- a/plugins/keyboard/main.c +++ b/plugins/keyboard/main.c @@ -12,9 +12,6 @@ // Setting this to TRUE makes the plugin force GDK_SCALE=1 #define FORCE_GDK_SCALE TRUE -// This plugin must run under x11/xwayland -#define FORCE_X11_BACKEND TRUE - #include "csd-keyboard-manager.h" #include "daemon-skeleton-gtk.h" diff --git a/plugins/keyboard/meson.build b/plugins/keyboard/meson.build index 25066e99..504e3cc8 100644 --- a/plugins/keyboard/meson.build +++ b/plugins/keyboard/meson.build @@ -2,19 +2,12 @@ plugin_name = 'keyboard' keyboard_sources = [ 'csd-keyboard-manager.c', - 'csd-keyboard-xkb.c', - 'delayed-dialog.c', - 'gkbd-configuration.c', 'main.c', ] keyboard_deps = [ common_dep, csd_dep, - gnomekbd, - gnomekbdui, - libnotify, - xklavier, ] executable( @@ -42,17 +35,3 @@ configure_file( configuration: desktop_conf, install_dir: autostartdir, ) - -keyboard_icons = [ - 'kbd-capslock-off.png', - 'kbd-numlock-off.png', - 'kbd-scrolllock-off.png', - 'kbd-capslock-on.png', - 'kbd-numlock-on.png', - 'kbd-scrolllock-on.png', -] - -install_data( - keyboard_icons, - install_dir: join_paths(pkgdatadir, 'icons', 'hicolor', '64x64', 'devices') -) diff --git a/plugins/settings-remap/csd-settings-remap-manager.c b/plugins/settings-remap/csd-settings-remap-manager.c index cc858db1..1c8a8621 100644 --- a/plugins/settings-remap/csd-settings-remap-manager.c +++ b/plugins/settings-remap/csd-settings-remap-manager.c @@ -61,9 +61,7 @@ static SchemaMap schemas[] = { { "org.gnome.desktop.sound", "org.cinnamon.desktop.sound" }, { "org.gnome.desktop.privacy", "org.cinnamon.desktop.privacy" }, { "org.gnome.desktop.wm.preferences", "org.cinnamon.desktop.wm.preferences" }, - { "org.gnome.settings-daemon.plugins.xsettings", "org.cinnamon.settings-daemon.plugins.xsettings" }, - { "org.gnome.desktop.a11y", "org.cinnamon.desktop.a11y.keyboard" }, - { "org.gnome.desktop.input-sources", "org.cinnamon.desktop.input-sources" }, + { "org.gnome.settings-daemon.plugins.xsettings", "org.cinnamon.settings-daemon.plugins.xsettings" } }; static gboolean From 79219cae8b87f187e8a9b26fcaf889a7b97d0b3f Mon Sep 17 00:00:00 2001 From: Michael Webster Date: Wed, 9 Apr 2025 10:37:33 -0400 Subject: [PATCH 2/2] Fix deps --- debian/control | 13 +++++++++++-- debian/rules | 3 +++ meson.build | 5 ----- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/debian/control b/debian/control index 4b3685bb..af22c834 100644 --- a/debian/control +++ b/debian/control @@ -13,7 +13,6 @@ Build-Depends: libcvc-dev (>= 3.4~), libfontconfig1-dev, libglib2.0-dev (>= 2.37.3), - libgnomekbd-dev (>= 3.6.0), libgtk-3-dev (>= 3.9.10), libgudev-1.0-dev [linux-any], liblcms2-dev, @@ -29,7 +28,6 @@ Build-Depends: libx11-dev, libxext-dev, libxi-dev, - libxklavier-dev, meson (>= 0.47), xsltproc, Build-Conflicts: @@ -65,3 +63,14 @@ Multi-Arch: same Description: Headers for building applications communicating with cinnamon-settings-daemon This package contains header files required to build applications that communicate with the Cinnamon settings daemon over D-Bus. + +Package: cinnamon-settings-daemon-dbg +Section: debug +Priority: extra +Architecture: any +Depends: + cinnamon-settings-daemon (= ${binary:Version}), + ${misc:Depends}, +Description: Debugging symbols for cinnamon-settings-daemon + . + This package contains the debugging symbols. \ No newline at end of file diff --git a/debian/rules b/debian/rules index 8dd51192..254ccf58 100755 --- a/debian/rules +++ b/debian/rules @@ -22,4 +22,7 @@ override_dh_makeshlibs: # Disabled, there are no shared libraries, but some plugins that cause this # to fail +override_dh_strip: + dh_strip --dbg-package=cinnamon-settings-daemon-dbg + override_dh_dwz: diff --git a/meson.build b/meson.build index 0f529a1d..d4e7ebef 100644 --- a/meson.build +++ b/meson.build @@ -51,13 +51,9 @@ fontconfig = dependency('fontconfig') gio = dependency('gio-2.0', version: '>= 2.40.0') gio_unix = dependency('gio-unix-2.0', version: '>= 2.40.0') glib = dependency('glib-2.0', version: '>= 2.40.0') -gnomekbd_required = '>= 3.6.0' -gnomekbd = dependency('libgnomekbd', version: gnomekbd_required) -gnomekbdui = dependency('libgnomekbdui', version: gnomekbd_required) gtk = dependency('gtk+-3.0', version: '>= 3.14.0') gudev = dependency('gudev-1.0', required: get_option('use_gudev')) libnotify = dependency('libnotify', version: '>= 0.7.3') -kbproto = dependency('kbproto') nss = dependency('nss', version: '>= 3.11.2', required: get_option('use_smartcard')) pango = dependency('pango', version: '>= 1.20.0') polkit = dependency('polkit-gobject-1', version: '>= 0.97', required: get_option('use_polkit')) @@ -69,7 +65,6 @@ x11 = dependency('x11') xext = dependency('xext') xfixes = dependency('xfixes') xi = dependency('xi') -xklavier = dependency('libxklavier', version: '>= 5.0') # currently only used for the wacom plugin librsvg = dependency('librsvg-2.0', version: '>= 2.36.2', required: wacom.found())