[mutter/wip/wayland-display: 52/93] Add keybindings for switching VTs
- From: Giovanni Campagna <gcampagna src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wip/wayland-display: 52/93] Add keybindings for switching VTs
- Date: Mon, 12 Aug 2013 18:06:32 +0000 (UTC)
commit a83c4aa535d043d2ba8e64d2f41dd3b7d5abed80
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/core/keybindings.c | 92 +++++++++++++++++++++++++++++++++++
src/org.gnome.mutter.gschema.xml.in | 29 +++++++++++
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 ++
6 files changed, 145 insertions(+), 5 deletions(-)
---
diff --git a/src/core/keybindings.c b/src/core/keybindings.c
index 135dac5..d9633ab 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"
@@ -4098,6 +4102,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
+
void
meta_set_keybindings_disabled (gboolean setting)
{
@@ -4430,6 +4468,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 9d83cf3..81566cf 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 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 7d111ec..7f99493 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 8ef9a18..f865c81 100644
--- a/src/wayland/meta-wayland.c
+++ b/src/wayland/meta-wayland.c
@@ -1604,3 +1604,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]