A compositor may want to control the vt switching, for example to
ensure to have a lock screen before it. To enable that add a vfunc
that will be called when CTRL+ALT+FN is pressed. The default behavior
is to do the switching, but the user can change it by using the new
weston_compositor_set_vt_switcher() function, so that it can delay the
switching to later, by calling weston_compositor_activate_vt().

Signed-off-by: Giulio Camuffo <giuliocamu...@gmail.com>
---
 Makefile.am                  |  2 +-
 src/compositor.c             | 18 ++++++++++++++++++
 src/compositor.h             | 39 +++++++++++++++++++++++++++++++++++++++
 src/launcher-direct.c        | 12 ++++++++++++
 src/launcher-impl.h          |  2 ++
 src/launcher-logind.c        |  8 ++++++++
 src/launcher-util.c          | 11 ++++++++++-
 src/launcher-weston-launch.c | 12 ++++++++++++
 src/main.c                   |  1 +
 9 files changed, 103 insertions(+), 2 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 2358000..f6e0ee9 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -66,7 +66,7 @@ libweston_la_CPPFLAGS = $(AM_CPPFLAGS) -DIN_WESTON
 libweston_la_CFLAGS = $(AM_CFLAGS) $(COMPOSITOR_CFLAGS) $(LIBUNWIND_CFLAGS)
 libweston_la_LIBADD = $(COMPOSITOR_LIBS) $(LIBUNWIND_LIBS) \
        $(DLOPEN_LIBS) -lm $(CLOCK_GETTIME_LIBS) \
-       $(LIBINPUT_BACKEND_LIBS) libshared.la
+       $(LIBINPUT_BACKEND_LIBS) libshared.la libsession-helper.la
 libweston_la_LDFLAGS = -release ${LIBWESTON_ABI_VERSION}
 
 libweston_la_SOURCES =                                 \
diff --git a/src/compositor.c b/src/compositor.c
index bf8e5aa..938894b 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -54,6 +54,8 @@
 #include "timeline.h"
 
 #include "compositor.h"
+#include "launcher-impl.h"
+#include "launcher-util.h"
 #include "scaler-server-protocol.h"
 #include "presentation-time-server-protocol.h"
 #include "shared/helpers.h"
@@ -4492,6 +4494,22 @@ compositor_bind(struct wl_client *client,
 }
 
 WL_EXPORT int
+weston_compositor_activate_vt(struct weston_compositor *compositor, int vt)
+{
+       if (compositor->launcher)
+               return weston_launcher_activate_vt(compositor->launcher, vt);
+       return -1;
+}
+
+WL_EXPORT void
+weston_compositor_set_vt_switcher(struct weston_compositor *compositor,
+                                 weston_compositor_vt_switcher_func_t switcher)
+{
+       if (compositor->launcher)
+               compositor->launcher->vt_switcher = switcher;
+}
+
+WL_EXPORT int
 weston_environment_get_fd(const char *env)
 {
        char *e, *end;
diff --git a/src/compositor.h b/src/compositor.h
index f934aab..472e482 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -1369,6 +1369,45 @@ void
 weston_compositor_set_default_pointer_grab(struct weston_compositor 
*compositor,
                        const struct weston_pointer_grab_interface *interface);
 
+/**
+ * Request a vt switch for the compositor.
+ *
+ * This will only work if the compositor is running as the owner of
+ * the session.
+ *
+ * \param launcher The compositor instance.
+ * \param vt The vt to switch to.
+ *
+ * Returns 0 on success, -1 otherwise.
+ *
+ * \sa weston_compositor_set_vt_switcher
+ */
+int
+weston_compositor_activate_vt(struct weston_compositor *compositor, int vt);
+
+typedef void (*weston_compositor_vt_switcher_func_t)(
+               struct weston_compositor *compositor, int vt);
+/**
+ * Set the vt switcher for the compositor.
+ *
+ * If the compositor is the owner of the session, the CTRL+ALT+FN key
+ * combinations will trigger a vt switch. The default behavior is to do
+ * the switching immediately, but some compositors may want to make sure to
+ * e.g. draw a lock screen before doing the switch.
+ * This function allows to register a custom vt switcher so that the actual
+ * vt switch can be controlled by calling \a weston_compositor_activate_vt.
+ *
+ * \param compositor The compositor instance.
+ * \param switcher The vt switcher function, which will be called when a
+ *                 CTRL+ALT+FN key combination is pressed, carrying the
+ *                 requested vt.
+ *
+ * \sa weston_compositor_activate_vt
+ */
+void
+weston_compositor_set_vt_switcher(struct weston_compositor *compositor,
+                                 weston_compositor_vt_switcher_func_t 
switcher);
+
 int
 weston_environment_get_fd(const char *env);
 
diff --git a/src/launcher-direct.c b/src/launcher-direct.c
index 29d9c28..0ff99a4 100644
--- a/src/launcher-direct.c
+++ b/src/launcher-direct.c
@@ -305,6 +305,17 @@ launcher_direct_destroy(struct weston_launcher 
*launcher_base)
        free(launcher);
 }
 
+static int
+launcher_direct_get_vt(struct weston_launcher *base)
+{
+       struct launcher_direct *launcher = wl_container_of(base, launcher, 
base);
+       struct stat s;
+       if (fstat(launcher->tty, &s) < 0)
+               return -1;
+
+       return minor(s.st_rdev);
+}
+
 struct launcher_interface launcher_direct_iface = {
        launcher_direct_connect,
        launcher_direct_destroy,
@@ -312,4 +323,5 @@ struct launcher_interface launcher_direct_iface = {
        launcher_direct_close,
        launcher_direct_activate_vt,
        launcher_direct_restore,
+       launcher_direct_get_vt,
 };
diff --git a/src/launcher-impl.h b/src/launcher-impl.h
index 742721b..8b0531d 100644
--- a/src/launcher-impl.h
+++ b/src/launcher-impl.h
@@ -34,10 +34,12 @@ struct launcher_interface {
        void (* close) (struct weston_launcher *launcher, int fd);
        int (* activate_vt) (struct weston_launcher *launcher, int vt);
        void (* restore) (struct weston_launcher *launcher);
+       int (* get_vt) (struct weston_launcher *launcher);
 };
 
 struct weston_launcher {
        struct launcher_interface *iface;
+       weston_compositor_vt_switcher_func_t vt_switcher;
 };
 
 extern struct launcher_interface launcher_logind_iface;
diff --git a/src/launcher-logind.c b/src/launcher-logind.c
index f755ec3..4680402 100644
--- a/src/launcher-logind.c
+++ b/src/launcher-logind.c
@@ -829,6 +829,13 @@ launcher_logind_destroy(struct weston_launcher *launcher)
        free(wl);
 }
 
+static int
+launcher_logind_get_vt(struct weston_launcher *launcher)
+{
+       struct launcher_logind *wl = wl_container_of(launcher, wl, base);
+       return wl->vtnr;
+}
+
 struct launcher_interface launcher_logind_iface = {
        launcher_logind_connect,
        launcher_logind_destroy,
@@ -836,4 +843,5 @@ struct launcher_interface launcher_logind_iface = {
        launcher_logind_close,
        launcher_logind_activate_vt,
        launcher_logind_restore,
+       launcher_logind_get_vt,
 };
diff --git a/src/launcher-util.c b/src/launcher-util.c
index 03b9d63..7bd91ae 100644
--- a/src/launcher-util.c
+++ b/src/launcher-util.c
@@ -97,8 +97,17 @@ switch_vt_binding(struct weston_keyboard *keyboard,
                  uint32_t time, uint32_t key, void *data)
 {
        struct weston_compositor *compositor = data;
+       struct weston_launcher *launcher = compositor->launcher;
+       int vt = key - KEY_F1 + 1;
+       weston_compositor_vt_switcher_func_t switcher = launcher->vt_switcher;
 
-       weston_launcher_activate_vt(compositor->launcher, key - KEY_F1 + 1);
+       if (vt == launcher->iface->get_vt(launcher))
+               return;
+
+       if (switcher)
+               launcher->vt_switcher(compositor, vt);
+       else
+               weston_launcher_activate_vt(launcher, vt);
 }
 
 WL_EXPORT void
diff --git a/src/launcher-weston-launch.c b/src/launcher-weston-launch.c
index ad919f1..b74975a 100644
--- a/src/launcher-weston-launch.c
+++ b/src/launcher-weston-launch.c
@@ -290,6 +290,17 @@ launcher_weston_launch_destroy(struct weston_launcher 
*launcher_base)
        free(launcher);
 }
 
+static int
+launcher_weston_launch_get_vt(struct weston_launcher *base)
+{
+       struct launcher_weston_launch *launcher = wl_container_of(base, 
launcher, base);
+       struct stat s;
+       if (fstat(launcher->tty, &s) < 0)
+               return -1;
+
+       return minor(s.st_rdev);
+}
+
 struct launcher_interface launcher_weston_launch_iface = {
        launcher_weston_launch_connect,
        launcher_weston_launch_destroy,
@@ -297,4 +308,5 @@ struct launcher_interface launcher_weston_launch_iface = {
        launcher_weston_launch_close,
        launcher_weston_launch_activate_vt,
        launcher_weston_launch_restore,
+       launcher_weston_launch_get_vt,
 };
diff --git a/src/main.c b/src/main.c
index d17d941..1cba49a 100644
--- a/src/main.c
+++ b/src/main.c
@@ -54,6 +54,7 @@
 #include "git-version.h"
 #include "version.h"
 #include "weston.h"
+#include "launcher-util.h"
 
 #include "compositor-drm.h"
 #include "compositor-headless.h"
-- 
2.8.3

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to