summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiovanni Campagna <gcampagn@redhat.com>2013-07-16 14:37:49 +0200
committerGiovanni Campagna <gcampagn@redhat.com>2013-08-14 09:43:38 +0200
commit0e0e0a4c7eb8c0b20e146c70d8cfef9cf2382b20 (patch)
tree4eef0ec7aa2d51830630858e0634bd691768943e
parentc96fd23e7955c5d1843c1d64951f1e0c3ea1fd27 (diff)
downloadmutter-0e0e0a4c7eb8c0b20e146c70d8cfef9cf2382b20.tar.gz
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
-rw-r--r--src/core/keybindings.c92
-rw-r--r--src/org.gnome.mutter.gschema.xml.in29
-rw-r--r--src/wayland/meta-tty.c17
-rw-r--r--src/wayland/meta-tty.h4
-rw-r--r--src/wayland/meta-wayland-private.h2
-rw-r--r--src/wayland/meta-wayland.c6
6 files changed, 145 insertions, 5 deletions
diff --git a/src/core/keybindings.c b/src/core/keybindings.c
index 8439ea830..bfc06c3c6 100644
--- a/src/core/keybindings.c
+++ b/src/core/keybindings.c
@@ -53,6 +53,10 @@
#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"
@@ -4081,6 +4085,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
@@ -4405,6 +4443,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_keybindings,
+ META_KEY_BINDING_NONE,
+ META_KEYBINDING_ACTION_NONE,
+ handle_switch_vt, 1);
+
+ add_builtin_keybinding (display,
+ "switch-to-session-2",
+ mutter_keybindings,
+ META_KEY_BINDING_NONE,
+ META_KEYBINDING_ACTION_NONE,
+ handle_switch_vt, 2);
+
+ add_builtin_keybinding (display,
+ "switch-to-session-3",
+ mutter_keybindings,
+ META_KEY_BINDING_NONE,
+ META_KEYBINDING_ACTION_NONE,
+ handle_switch_vt, 3);
+
+ add_builtin_keybinding (display,
+ "switch-to-session-4",
+ mutter_keybindings,
+ META_KEY_BINDING_NONE,
+ META_KEYBINDING_ACTION_NONE,
+ handle_switch_vt, 4);
+
+ add_builtin_keybinding (display,
+ "switch-to-session-5",
+ mutter_keybindings,
+ META_KEY_BINDING_NONE,
+ META_KEYBINDING_ACTION_NONE,
+ handle_switch_vt, 5);
+
+ add_builtin_keybinding (display,
+ "switch-to-session-6",
+ mutter_keybindings,
+ META_KEY_BINDING_NONE,
+ META_KEYBINDING_ACTION_NONE,
+ handle_switch_vt, 6);
+
+ add_builtin_keybinding (display,
+ "switch-to-session-7",
+ mutter_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.gschema.xml.in b/src/org.gnome.mutter.gschema.xml.in
index 9d83cf3aa..81566cf2b 100644
--- a/src/org.gnome.mutter.gschema.xml.in
+++ b/src/org.gnome.mutter.gschema.xml.in
@@ -116,5 +116,34 @@
<_summary>Cancel tab popup</_summary>
</key>
+ <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 0ac342a46..859f9cadc 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 2c3bf2adc..f5a24644b 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 7d111ec42..7f99493c9 100644
--- a/src/wayland/meta-wayland-private.h
+++ b/src/wayland/meta-wayland-private.h
@@ -359,6 +359,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 3cd71f248..01ad4379b 100644
--- a/src/wayland/meta-wayland.c
+++ b/src/wayland/meta-wayland.c
@@ -1589,3 +1589,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;
+}