compositor-drm: Fix vt switching
Don't take input or render while switched away, drop and set master correctly.
This commit is contained in:
@@ -627,6 +627,26 @@ drm_destroy(struct wlsc_compositor *ec)
|
|||||||
free(d);
|
free(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
vt_func(struct wlsc_compositor *compositor, int event)
|
||||||
|
{
|
||||||
|
struct drm_compositor *ec = (struct drm_compositor *) compositor;
|
||||||
|
|
||||||
|
switch (event) {
|
||||||
|
case TTY_ENTER_VT:
|
||||||
|
compositor->focus = 1;
|
||||||
|
drmSetMaster(ec->drm.fd);
|
||||||
|
compositor->state = WLSC_COMPOSITOR_ACTIVE;
|
||||||
|
wlsc_compositor_damage_all(compositor);
|
||||||
|
break;
|
||||||
|
case TTY_LEAVE_VT:
|
||||||
|
compositor->focus = 0;
|
||||||
|
compositor->state = WLSC_COMPOSITOR_SLEEPING;
|
||||||
|
drmDropMaster(ec->drm.fd);
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
static struct wlsc_compositor *
|
static struct wlsc_compositor *
|
||||||
drm_compositor_create(struct wl_display *display, int connector)
|
drm_compositor_create(struct wl_display *display, int connector)
|
||||||
{
|
{
|
||||||
@@ -699,7 +719,7 @@ drm_compositor_create(struct wl_display *display, int connector)
|
|||||||
ec->drm_source =
|
ec->drm_source =
|
||||||
wl_event_loop_add_fd(loop, ec->drm.fd,
|
wl_event_loop_add_fd(loop, ec->drm.fd,
|
||||||
WL_EVENT_READABLE, on_drm_input, ec);
|
WL_EVENT_READABLE, on_drm_input, ec);
|
||||||
ec->tty = tty_create(&ec->base);
|
ec->tty = tty_create(&ec->base, vt_func);
|
||||||
|
|
||||||
ec->udev_monitor = udev_monitor_new_from_netlink(ec->udev, "udev");
|
ec->udev_monitor = udev_monitor_new_from_netlink(ec->udev, "udev");
|
||||||
if (ec->udev_monitor == NULL) {
|
if (ec->udev_monitor == NULL) {
|
||||||
|
|||||||
@@ -341,8 +341,15 @@ wlsc_switcher_init(struct wlsc_compositor *compositor);
|
|||||||
void
|
void
|
||||||
evdev_input_add_devices(struct wlsc_compositor *c, struct udev *udev);
|
evdev_input_add_devices(struct wlsc_compositor *c, struct udev *udev);
|
||||||
|
|
||||||
|
enum {
|
||||||
|
TTY_ENTER_VT,
|
||||||
|
TTY_LEAVE_VT
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef void (*tty_vt_func_t)(struct wlsc_compositor *compositor, int event);
|
||||||
|
|
||||||
struct tty *
|
struct tty *
|
||||||
tty_create(struct wlsc_compositor *compositor);
|
tty_create(struct wlsc_compositor *compositor, tty_vt_func_t vt_func);
|
||||||
|
|
||||||
void
|
void
|
||||||
tty_destroy(struct tty *tty);
|
tty_destroy(struct tty *tty);
|
||||||
|
|||||||
+6
-2
@@ -41,6 +41,7 @@ struct tty {
|
|||||||
struct wl_event_source *input_source;
|
struct wl_event_source *input_source;
|
||||||
struct wl_event_source *enter_vt_source;
|
struct wl_event_source *enter_vt_source;
|
||||||
struct wl_event_source *leave_vt_source;
|
struct wl_event_source *leave_vt_source;
|
||||||
|
tty_vt_func_t vt_func;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int on_enter_vt(int signal_number, void *data)
|
static int on_enter_vt(int signal_number, void *data)
|
||||||
@@ -48,7 +49,7 @@ static int on_enter_vt(int signal_number, void *data)
|
|||||||
struct tty *tty = data;
|
struct tty *tty = data;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
fprintf(stderr, "enter vt\n");
|
tty->vt_func(tty->compositor, TTY_ENTER_VT);
|
||||||
|
|
||||||
ioctl(tty->fd, VT_RELDISP, VT_ACKACQ);
|
ioctl(tty->fd, VT_RELDISP, VT_ACKACQ);
|
||||||
ret = ioctl(tty->fd, KDSETMODE, KD_GRAPHICS);
|
ret = ioctl(tty->fd, KDSETMODE, KD_GRAPHICS);
|
||||||
@@ -70,6 +71,8 @@ on_leave_vt(int signal_number, void *data)
|
|||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"failed to set KD_TEXT mode on console: %m\n");
|
"failed to set KD_TEXT mode on console: %m\n");
|
||||||
|
|
||||||
|
tty->vt_func(tty->compositor, TTY_LEAVE_VT);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,7 +89,7 @@ on_tty_input(int fd, uint32_t mask, void *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct tty *
|
struct tty *
|
||||||
tty_create(struct wlsc_compositor *compositor)
|
tty_create(struct wlsc_compositor *compositor, tty_vt_func_t vt_func)
|
||||||
{
|
{
|
||||||
struct termios raw_attributes;
|
struct termios raw_attributes;
|
||||||
struct vt_mode mode = { 0 };
|
struct vt_mode mode = { 0 };
|
||||||
@@ -100,6 +103,7 @@ tty_create(struct wlsc_compositor *compositor)
|
|||||||
|
|
||||||
memset(tty, 0, sizeof *tty);
|
memset(tty, 0, sizeof *tty);
|
||||||
tty->compositor = compositor;
|
tty->compositor = compositor;
|
||||||
|
tty->vt_func = vt_func;
|
||||||
tty->fd = open("/dev/tty0", O_RDWR | O_NOCTTY);
|
tty->fd = open("/dev/tty0", O_RDWR | O_NOCTTY);
|
||||||
if (tty->fd <= 0) {
|
if (tty->fd <= 0) {
|
||||||
fprintf(stderr, "failed to open active tty: %m\n");
|
fprintf(stderr, "failed to open active tty: %m\n");
|
||||||
|
|||||||
Reference in New Issue
Block a user