[mutter/wip/wayland-work: 26/44] Add keybindings for switching VTs



commit 573fa98a3887d25701826858ce8605674d7b6ddc
Author: Giovanni Campagna <gcampagn redhat com>
Date:   Tue Jul 16 14:37:49 2013 +0200

    Add keybindings for switching VTs
    
    Once mutter is started from weston-launch on its own VT, there is
    no way to change VT again (for example to actually start an application),
    because the keyboard is put in raw mode.
    So introduce some keybindings mimicking the standard X ones (Ctrl+Alt+Fn)
    that switch the VT manually when activated.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=705861

 src/Makefile.am                             |    2 +-
 src/core/keybindings.c                      |   94 +++++++++++++++++++++++++++
 src/org.gnome.mutter.wayland.gschema.xml.in |   33 +++++++++
 src/wayland/meta-tty.c                      |   17 ++++--
 src/wayland/meta-tty.h                      |    4 +
 src/wayland/meta-wayland-private.h          |    2 +
 src/wayland/meta-wayland.c                  |    6 ++
 7 files changed, 152 insertions(+), 6 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index 85a0544..ce3867a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -321,7 +321,7 @@ xml_DATA     = $(xml_in_files:.xml.in=.xml)
 
 dbus_idle_built_sources = meta-dbus-idle-monitor.c meta-dbus-idle-monitor.h
 
-gsettings_SCHEMAS = org.gnome.mutter.gschema.xml
+gsettings_SCHEMAS = org.gnome.mutter.gschema.xml org.gnome.mutter.wayland.gschema.xml
 @INTLTOOL_XML_NOMERGE_RULE@
 @GSETTINGS_RULES@
 
diff --git a/src/core/keybindings.c b/src/core/keybindings.c
index 7f58334..e2f5487 100644
--- a/src/core/keybindings.c
+++ b/src/core/keybindings.c
@@ -53,8 +53,13 @@
 #include <X11/XKBlib.h>
 #endif
 
+#ifdef HAVE_WAYLAND
+#include "meta-wayland-private.h"
+#endif
+
 #define SCHEMA_COMMON_KEYBINDINGS "org.gnome.desktop.wm.keybindings"
 #define SCHEMA_MUTTER_KEYBINDINGS "org.gnome.mutter.keybindings"
+#define SCHEMA_MUTTER_WAYLAND_KEYBINDINGS "org.gnome.mutter.wayland.keybindings"
 
 static gboolean add_builtin_keybinding (MetaDisplay          *display,
                                         const char           *name,
@@ -4098,6 +4103,40 @@ handle_set_spew_mark (MetaDisplay    *display,
   meta_verbose ("-- MARK MARK MARK MARK --\n");
 }
 
+#ifdef HAVE_WAYLAND
+static void
+handle_switch_vt (MetaDisplay    *display,
+                  MetaScreen     *screen,
+                  MetaWindow     *window,
+                  XIDeviceEvent  *event,
+                  MetaKeyBinding *binding,
+                  gpointer        dummy)
+{
+    gint vt = binding->handler->data;
+    MetaWaylandCompositor *compositor;
+    MetaTTY *tty;
+
+    compositor = meta_wayland_compositor_get_default ();
+    tty = meta_wayland_compositor_get_tty (compositor);
+
+    if (tty)
+      {
+        GError *error;
+
+        error = NULL;
+        if (!meta_tty_activate_vt (tty, vt, &error))
+          {
+            g_warning ("Failed to switch VT: %s", error->message);
+            g_error_free (error);
+          }
+      }
+    else
+      {
+        g_debug ("Ignoring VT switch keybinding, not running as VT manager");
+      }
+}
+#endif
+
 /**
  * meta_keybindings_set_custom_handler:
  * @name: The name of the keybinding to set
@@ -4161,6 +4200,7 @@ init_builtin_key_bindings (MetaDisplay *display)
                                META_KEY_BINDING_IS_REVERSED)
   GSettings *common_keybindings = g_settings_new (SCHEMA_COMMON_KEYBINDINGS);
   GSettings *mutter_keybindings = g_settings_new (SCHEMA_MUTTER_KEYBINDINGS);
+  GSettings *mutter_wayland_keybindings = g_settings_new (SCHEMA_MUTTER_WAYLAND_KEYBINDINGS);
 
   add_builtin_keybinding (display,
                           "switch-to-workspace-1",
@@ -4422,6 +4462,60 @@ init_builtin_key_bindings (MetaDisplay *display)
                           META_KEYBINDING_ACTION_SET_SPEW_MARK,
                           handle_set_spew_mark, 0);
 
+#ifdef HAVE_WAYLAND
+  if (meta_is_wayland_compositor ())
+    {
+      add_builtin_keybinding (display,
+                              "switch-to-session-1",
+                              mutter_wayland_keybindings,
+                              META_KEY_BINDING_NONE,
+                              META_KEYBINDING_ACTION_NONE,
+                              handle_switch_vt, 1);
+
+      add_builtin_keybinding (display,
+                              "switch-to-session-2",
+                              mutter_wayland_keybindings,
+                              META_KEY_BINDING_NONE,
+                              META_KEYBINDING_ACTION_NONE,
+                              handle_switch_vt, 2);
+
+      add_builtin_keybinding (display,
+                              "switch-to-session-3",
+                              mutter_wayland_keybindings,
+                              META_KEY_BINDING_NONE,
+                              META_KEYBINDING_ACTION_NONE,
+                              handle_switch_vt, 3);
+
+      add_builtin_keybinding (display,
+                              "switch-to-session-4",
+                              mutter_wayland_keybindings,
+                              META_KEY_BINDING_NONE,
+                              META_KEYBINDING_ACTION_NONE,
+                              handle_switch_vt, 4);
+
+      add_builtin_keybinding (display,
+                              "switch-to-session-5",
+                              mutter_wayland_keybindings,
+                              META_KEY_BINDING_NONE,
+                              META_KEYBINDING_ACTION_NONE,
+                              handle_switch_vt, 5);
+
+      add_builtin_keybinding (display,
+                              "switch-to-session-6",
+                              mutter_wayland_keybindings,
+                              META_KEY_BINDING_NONE,
+                              META_KEYBINDING_ACTION_NONE,
+                              handle_switch_vt, 6);
+
+      add_builtin_keybinding (display,
+                              "switch-to-session-7",
+                              mutter_wayland_keybindings,
+                              META_KEY_BINDING_NONE,
+                              META_KEYBINDING_ACTION_NONE,
+                              handle_switch_vt, 7);
+    }
+#endif
+
 #undef REVERSES_AND_REVERSED
 
   /************************ PER WINDOW BINDINGS ************************/
diff --git a/src/org.gnome.mutter.wayland.gschema.xml.in b/src/org.gnome.mutter.wayland.gschema.xml.in
new file mode 100644
index 0000000..4bb5c1d
--- /dev/null
+++ b/src/org.gnome.mutter.wayland.gschema.xml.in
@@ -0,0 +1,33 @@
+<schemalist>
+  <schema id="org.gnome.mutter.wayland.keybindings" path="/org/gnome/mutter/wayland/keybindings/"
+         gettext-domain="@GETTEXT_DOMAIN@">
+    <key name="switch-to-session-1" type="as">
+      <default><![CDATA[['<Primary><Alt>F1']]]></default>
+      <_summary>Switch to VT 1</_summary>
+    </key>
+    <key name="switch-to-session-2" type="as">
+      <default><![CDATA[['<Primary><Alt>F2']]]></default>
+      <_summary>Switch to VT 2</_summary>
+    </key>
+    <key name="switch-to-session-3" type="as">
+      <default><![CDATA[['<Primary><Alt>F3']]]></default>
+      <_summary>Switch to VT 3</_summary>
+    </key>
+    <key name="switch-to-session-4" type="as">
+      <default><![CDATA[['<Primary><Alt>F4']]]></default>
+      <_summary>Switch to VT 4</_summary>
+    </key>
+    <key name="switch-to-session-5" type="as">
+      <default><![CDATA[['<Primary><Alt>F5']]]></default>
+      <_summary>Switch to VT 5</_summary>
+    </key>
+    <key name="switch-to-session-6" type="as">
+      <default><![CDATA[['<Primary><Alt>F6']]]></default>
+      <_summary>Switch to VT 6</_summary>
+    </key>
+    <key name="switch-to-session-7" type="as">
+      <default><![CDATA[['<Primary><Alt>F7']]]></default>
+      <_summary>Switch to VT 7</_summary>
+    </key>
+  </schema>
+</schemalist>
diff --git a/src/wayland/meta-tty.c b/src/wayland/meta-tty.c
index 0ac342a..859f9ca 100644
--- a/src/wayland/meta-tty.c
+++ b/src/wayland/meta-tty.c
@@ -157,12 +157,19 @@ try_open_vt (MetaTTY  *tty,
   return fd;
 }
 
-/* FIXME? */
-static int
-tty_activate_vt (MetaTTY *tty,
-                int      vt)
+gboolean
+meta_tty_activate_vt (MetaTTY  *tty,
+                     int       vt,
+                     GError  **error)
 {
-  return ioctl(tty->fd, VT_ACTIVATE, vt);
+  if (ioctl(tty->fd, VT_ACTIVATE, vt) < 0)
+    {
+      g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno),
+                  strerror (errno));
+      return FALSE;
+    }
+  else
+    return TRUE;
 }
 
 static int
diff --git a/src/wayland/meta-tty.h b/src/wayland/meta-tty.h
index 2c3bf2a..f5a2464 100644
--- a/src/wayland/meta-tty.h
+++ b/src/wayland/meta-tty.h
@@ -38,6 +38,10 @@ GType             meta_tty_get_type                (void) G_GNUC_CONST;
 
 MetaTTY          *meta_tty_new                     (void);
 
+gboolean          meta_tty_activate_vt             (MetaTTY  *self,
+                                                   int       number,
+                                                   GError  **error);
+
 G_END_DECLS
 
 #endif /* META_TTY_H */
diff --git a/src/wayland/meta-wayland-private.h b/src/wayland/meta-wayland-private.h
index 858094b..a1b9b83 100644
--- a/src/wayland/meta-wayland-private.h
+++ b/src/wayland/meta-wayland-private.h
@@ -343,6 +343,8 @@ void                    meta_wayland_compositor_repick          (MetaWaylandComp
 void                    meta_wayland_compositor_set_input_focus (MetaWaylandCompositor *compositor,
                                                                  MetaWindow            *window);
 
+MetaTTY                *meta_wayland_compositor_get_tty         (MetaWaylandCompositor *compositor);
+
 void                    meta_wayland_surface_free               (MetaWaylandSurface    *surface);
 
 #endif /* META_WAYLAND_PRIVATE_H */
diff --git a/src/wayland/meta-wayland.c b/src/wayland/meta-wayland.c
index 01dce5b..c18efce 100644
--- a/src/wayland/meta-wayland.c
+++ b/src/wayland/meta-wayland.c
@@ -1739,3 +1739,9 @@ meta_wayland_finalize (void)
   meta_xwayland_stop (compositor);
   g_clear_object (&compositor->tty);
 }
+
+MetaTTY *
+meta_wayland_compositor_get_tty (MetaWaylandCompositor *compositor)
+{
+  return compositor->tty;
+}


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