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 *
drm_compositor_create(struct wl_display *display, int connector)
{
ec->drm_source =
wl_event_loop_add_fd(loop, ec->drm.fd,
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");
if (ec->udev_monitor == NULL) {
void
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 *
-tty_create(struct wlsc_compositor *compositor);
+tty_create(struct wlsc_compositor *compositor, tty_vt_func_t vt_func);
void
tty_destroy(struct tty *tty);
struct wl_event_source *input_source;
struct wl_event_source *enter_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)
struct tty *tty = data;
int ret;
- fprintf(stderr, "enter vt\n");
+ tty->vt_func(tty->compositor, TTY_ENTER_VT);
ioctl(tty->fd, VT_RELDISP, VT_ACKACQ);
ret = ioctl(tty->fd, KDSETMODE, KD_GRAPHICS);
fprintf(stderr,
"failed to set KD_TEXT mode on console: %m\n");
+ tty->vt_func(tty->compositor, TTY_LEAVE_VT);
+
return 1;
}
}
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 vt_mode mode = { 0 };
memset(tty, 0, sizeof *tty);
tty->compositor = compositor;
+ tty->vt_func = vt_func;
tty->fd = open("/dev/tty0", O_RDWR | O_NOCTTY);
if (tty->fd <= 0) {
fprintf(stderr, "failed to open active tty: %m\n");