meta-weston-launch: Call VT_ACTIVATE ourselves

We don't need any special permissions, so we don't need to go through
weston-launch to do so...
This commit is contained in:
Jasper St. Pierre 2013-12-31 17:44:35 -05:00
parent a3de799939
commit ebe6e3180e
7 changed files with 19 additions and 85 deletions

View File

@ -56,6 +56,9 @@
#ifdef HAVE_WAYLAND #ifdef HAVE_WAYLAND
#include "meta-wayland-private.h" #include "meta-wayland-private.h"
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/vt.h>
#endif #endif
#define SCHEMA_COMMON_KEYBINDINGS "org.gnome.desktop.wm.keybindings" #define SCHEMA_COMMON_KEYBINDINGS "org.gnome.desktop.wm.keybindings"
@ -4083,6 +4086,18 @@ handle_set_spew_mark (MetaDisplay *display,
} }
#ifdef HAVE_WAYLAND #ifdef HAVE_WAYLAND
static gboolean
activate_vt (int vt)
{
int tty, reply;
tty = open ("/dev/tty", O_RDWR | O_NOCTTY | O_CLOEXEC);
reply = ioctl (tty, VT_ACTIVATE, vt);
close (tty);
return (reply == 0);
}
static void static void
handle_switch_vt (MetaDisplay *display, handle_switch_vt (MetaDisplay *display,
MetaScreen *screen, MetaScreen *screen,
@ -4091,28 +4106,10 @@ handle_switch_vt (MetaDisplay *display,
MetaKeyBinding *binding, MetaKeyBinding *binding,
gpointer dummy) gpointer dummy)
{ {
gint vt = binding->handler->data; gint vt = binding->handler->data;
MetaWaylandCompositor *compositor;
MetaLauncher *launcher;
compositor = meta_wayland_compositor_get_default (); if (!activate_vt (vt))
launcher = meta_wayland_compositor_get_launcher (compositor); g_warning ("Failed to switch VT");
if (launcher)
{
GError *error;
error = NULL;
if (!meta_launcher_activate_vt (launcher, 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 #endif

View File

@ -99,7 +99,6 @@ void meta_wayland_compositor_set_input_focus (MetaWaylandComp
gboolean meta_wayland_compositor_handle_event (MetaWaylandCompositor *compositor, gboolean meta_wayland_compositor_handle_event (MetaWaylandCompositor *compositor,
const ClutterEvent *event); const ClutterEvent *event);
MetaLauncher *meta_wayland_compositor_get_launcher (MetaWaylandCompositor *compositor);
gboolean meta_wayland_compositor_is_native (MetaWaylandCompositor *compositor); gboolean meta_wayland_compositor_is_native (MetaWaylandCompositor *compositor);
MetaWaylandBuffer * meta_wayland_buffer_from_resource (struct wl_resource *resource); MetaWaylandBuffer * meta_wayland_buffer_from_resource (struct wl_resource *resource);

View File

@ -754,12 +754,6 @@ meta_wayland_finalize (void)
g_clear_object (&compositor->launcher); g_clear_object (&compositor->launcher);
} }
MetaLauncher *
meta_wayland_compositor_get_launcher (MetaWaylandCompositor *compositor)
{
return compositor->launcher;
}
gboolean gboolean
meta_wayland_compositor_is_native (MetaWaylandCompositor *compositor) meta_wayland_compositor_is_native (MetaWaylandCompositor *compositor)
{ {

View File

@ -437,17 +437,3 @@ meta_launcher_new (void)
{ {
return g_object_new (META_TYPE_LAUNCHER, NULL); return g_object_new (META_TYPE_LAUNCHER, NULL);
} }
gboolean
meta_launcher_activate_vt (MetaLauncher *launcher,
int vt,
GError **error)
{
struct weston_launcher_activate_vt message;
message.header.opcode = WESTON_LAUNCHER_ACTIVATE_VT;
message.vt = vt;
return send_message_to_wl (launcher, &message, sizeof (message), NULL, NULL, error);
}

View File

@ -37,10 +37,6 @@ GType meta_launcher_get_type (void) G_GNUC_CONST;
MetaLauncher *meta_launcher_new (void); MetaLauncher *meta_launcher_new (void);
gboolean meta_launcher_activate_vt (MetaLauncher *self,
int number,
GError **error);
gboolean meta_launcher_set_drm_fd (MetaLauncher *self, gboolean meta_launcher_set_drm_fd (MetaLauncher *self,
int drm_fd, int drm_fd,
GError **error); GError **error);

View File

@ -269,40 +269,6 @@ out:
return 0; return 0;
} }
static int
handle_activate_vt(struct weston_launch *wl, struct msghdr *msg, ssize_t len)
{
struct weston_launcher_reply reply;
struct weston_launcher_activate_vt *message;
reply.header.opcode = WESTON_LAUNCHER_ACTIVATE_VT;
reply.ret = -1;
if (len != sizeof(*message)) {
error(0, 0, "missing value in activate_vt request");
goto out;
}
message = msg->msg_iov->iov_base;
reply.ret = ioctl(wl->tty, VT_ACTIVATE, message->vt);
if (reply.ret < 0)
reply.ret = -errno;
if (wl->verbose)
fprintf(stderr, "mutter-launch: activate VT, ret: %d\n", reply.ret);
out:
do {
len = send(wl->sock[0], &reply, sizeof reply, 0);
} while (len < 0 && errno == EINTR);
if (len < 0)
return -1;
return 0;
}
static int static int
handle_open(struct weston_launch *wl, struct msghdr *msg, ssize_t len) handle_open(struct weston_launch *wl, struct msghdr *msg, ssize_t len)
{ {
@ -419,9 +385,6 @@ handle_socket_msg(struct weston_launch *wl)
case WESTON_LAUNCHER_CONFIRM_VT_SWITCH: case WESTON_LAUNCHER_CONFIRM_VT_SWITCH:
ret = handle_confirm_vt_switch(wl, &msg, len); ret = handle_confirm_vt_switch(wl, &msg, len);
break; break;
case WESTON_LAUNCHER_ACTIVATE_VT:
ret = handle_activate_vt(wl, &msg, len);
break;
} }
return ret; return ret;

View File

@ -32,8 +32,7 @@ enum weston_launcher_message_type {
enum weston_launcher_opcode { enum weston_launcher_opcode {
WESTON_LAUNCHER_OPEN = (1 << 1 | WESTON_LAUNCHER_REQUEST), WESTON_LAUNCHER_OPEN = (1 << 1 | WESTON_LAUNCHER_REQUEST),
WESTON_LAUNCHER_DRM_SET_FD = (2 << 1 | WESTON_LAUNCHER_REQUEST), WESTON_LAUNCHER_DRM_SET_FD = (2 << 1 | WESTON_LAUNCHER_REQUEST),
WESTON_LAUNCHER_ACTIVATE_VT = (3 << 1 | WESTON_LAUNCHER_REQUEST), WESTON_LAUNCHER_CONFIRM_VT_SWITCH = (3 << 1 | WESTON_LAUNCHER_REQUEST),
WESTON_LAUNCHER_CONFIRM_VT_SWITCH = (4 << 1 | WESTON_LAUNCHER_REQUEST),
}; };
enum weston_launcher_server_opcode { enum weston_launcher_server_opcode {