[gnome-flashback] input-sources: add input source switching keybindings



commit c37e9fe4ef06f88145cec8a96f051615606d7d42
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Sun Sep 20 03:19:31 2015 +0300

    input-sources: add input source switching keybindings

 gnome-flashback/libinput-sources/Makefile.am       |    3 +
 .../libinput-sources/gf-input-source-manager.c     |  118 ++++++++++++++++++++
 2 files changed, 121 insertions(+), 0 deletions(-)
---
diff --git a/gnome-flashback/libinput-sources/Makefile.am b/gnome-flashback/libinput-sources/Makefile.am
index da42f95..2231201 100644
--- a/gnome-flashback/libinput-sources/Makefile.am
+++ b/gnome-flashback/libinput-sources/Makefile.am
@@ -8,6 +8,8 @@ libinput_sources_la_CFLAGS = \
        $(INPUT_SOURCES_CFLAGS) \
        $(WARN_CFLAGS) \
        $(AM_CFLAGS) \
+       -I$(srcdir)/../../gnome-flashback \
+       -I$(top_builddir)/gnome-flashback \
        -I$(top_builddir)/gnome-flashback/libinput-sources \
        $(NULL)
 
@@ -30,6 +32,7 @@ libinput_sources_la_LDFLAGS = \
        $(NULL)
 
 libinput_sources_la_LIBADD = \
+       $(top_builddir)/gnome-flashback/libcommon/libcommon.la \
        $(INPUT_SOURCES_LIBS) \
        $(NULL)
 
diff --git a/gnome-flashback/libinput-sources/gf-input-source-manager.c 
b/gnome-flashback/libinput-sources/gf-input-source-manager.c
index 24eb74d..0df2e32 100644
--- a/gnome-flashback/libinput-sources/gf-input-source-manager.c
+++ b/gnome-flashback/libinput-sources/gf-input-source-manager.c
@@ -17,14 +17,27 @@
 
 #include "config.h"
 
+#include <gio/gio.h>
+#include <libcommon/gf-keybindings.h>
+
 #include "gf-input-source-manager.h"
 #include "gf-input-source-settings.h"
 #include "gf-ibus-manager.h"
 
+#define DESKTOP_WM_KEYBINDINGS_SCHEMA "org.gnome.desktop.wm.keybindings"
+
+#define KEY_SWITCH_INPUT_SOURCE "switch-input-source"
+#define KEY_SWITCH_INPUT_SOURCE_BACKWARD "switch-input-source-backward"
+
 struct _GfInputSourceManager
 {
   GObject                parent;
 
+  GSettings             *wm_keybindings;
+  GfKeybindings         *keybindings;
+  guint                  switch_source_action;
+  guint                  switch_source_backward_action;
+
   GfInputSourceSettings *settings;
 
   GfIBusManager         *ibus_manager;
@@ -44,6 +57,107 @@ enum
 static GParamSpec *properties[LAST_PROP] = { NULL };
 
 static void
+switch_input_changed_cb (GSettings *settings,
+                         gchar     *key,
+                         gpointer   user_data)
+{
+  GfInputSourceManager *manager;
+  guint action;
+  gchar **keybindings;
+  gint i;
+
+  manager = GF_INPUT_SOURCE_MANAGER (user_data);
+  action = manager->switch_source_action;
+
+  if (action != 0)
+    {
+      gf_keybindings_ungrab (manager->keybindings, action);
+      action = 0;
+    }
+
+  keybindings = g_settings_get_strv (settings, KEY_SWITCH_INPUT_SOURCE);
+
+  /* There might be multiple keybindings set, but we will grab only one. */
+  for (i = 0; keybindings[i] != NULL; i++)
+    {
+      action = gf_keybindings_grab (manager->keybindings, keybindings[i]);
+
+      if (action != 0)
+        break;
+    }
+
+  g_free (keybindings);
+
+  manager->switch_source_action = action;
+}
+
+static void
+switch_input_backward_changed_cb (GSettings *settings,
+                                  gchar     *key,
+                                  gpointer   user_data)
+{
+  GfInputSourceManager *manager;
+  guint action;
+  gchar **keybindings;
+  gint i;
+
+  manager = GF_INPUT_SOURCE_MANAGER (user_data);
+  action = manager->switch_source_backward_action;
+
+  if (action != 0)
+    {
+      gf_keybindings_ungrab (manager->keybindings, action);
+      action = 0;
+    }
+
+  keybindings = g_settings_get_strv (settings, KEY_SWITCH_INPUT_SOURCE);
+
+  /* There might be multiple keybindings set, but we will grab only one. */
+  for (i = 0; keybindings[i] != NULL; i++)
+    {
+      action = gf_keybindings_grab (manager->keybindings, keybindings[i]);
+
+      if (action != 0)
+        break;
+    }
+
+  g_free (keybindings);
+
+  manager->switch_source_backward_action = action;
+}
+
+static void
+accelerator_activated_cb (GfKeybindings *keybindings,
+                          guint          action,
+                          GVariant      *parameters,
+                          gpointer       user_data)
+{
+}
+
+static void
+keybindings_init (GfInputSourceManager *manager)
+{
+  manager->wm_keybindings = g_settings_new (DESKTOP_WM_KEYBINDINGS_SCHEMA);
+  manager->keybindings = gf_keybindings_new ();
+
+  g_signal_connect (manager->wm_keybindings,
+                    "changed::" KEY_SWITCH_INPUT_SOURCE,
+                    G_CALLBACK (switch_input_changed_cb),
+                    manager);
+
+  g_signal_connect (manager->wm_keybindings,
+                    "changed::" KEY_SWITCH_INPUT_SOURCE_BACKWARD,
+                    G_CALLBACK (switch_input_backward_changed_cb),
+                    manager);
+
+  g_signal_connect (manager->keybindings, "accelerator-activated",
+                    G_CALLBACK (accelerator_activated_cb), manager);
+
+  switch_input_changed_cb (manager->wm_keybindings, NULL, manager);
+  switch_input_backward_changed_cb (manager->wm_keybindings, NULL, manager);
+}
+
+static void
 sources_changed_cb (GfInputSourceSettings *settings,
                     gpointer               user_data)
 {
@@ -81,6 +195,9 @@ gf_input_source_manager_dispose (GObject *object)
 
   manager = GF_INPUT_SOURCE_MANAGER (object);
 
+  g_clear_object (&manager->wm_keybindings);
+  g_clear_object (&manager->keybindings);
+
   g_clear_object (&manager->settings);
 
   G_OBJECT_CLASS (gf_input_source_manager_parent_class)->dispose (object);
@@ -154,6 +271,7 @@ gf_input_source_manager_class_init (GfInputSourceManagerClass *manager_class)
 static void
 gf_input_source_manager_init (GfInputSourceManager *manager)
 {
+  keybindings_init (manager);
   input_source_settings_init (manager);
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]