From 2db6ed09456e433877c5be191a18c84d216ae3f6 Mon Sep 17 00:00:00 2001 From: Seunghun Lee Date: Mon, 5 Jan 2015 09:08:27 -0500 Subject: [PATCH] ecore-drm: remove duplicated code from logind and tty. Summary: integrates the code used in common. Reviewers: devilhorns Reviewed By: devilhorns Subscribers: cedric Differential Revision: https://phab.enlightenment.org/D1796 --- src/lib/ecore_drm/ecore_drm_launcher.c | 142 +++++++++++++-- src/lib/ecore_drm/ecore_drm_logind.c | 228 +------------------------ src/lib/ecore_drm/ecore_drm_private.h | 2 + src/lib/ecore_drm/ecore_drm_tty.c | 119 +------------ 4 files changed, 147 insertions(+), 344 deletions(-) diff --git a/src/lib/ecore_drm/ecore_drm_launcher.c b/src/lib/ecore_drm/ecore_drm_launcher.c index dbe7303854..e6309328a5 100644 --- a/src/lib/ecore_drm/ecore_drm_launcher.c +++ b/src/lib/ecore_drm/ecore_drm_launcher.c @@ -3,6 +3,111 @@ static Eina_Bool logind = EINA_FALSE; +static Eina_Bool +_ecore_drm_launcher_cb_vt_switch(void *data, int type EINA_UNUSED, void *event) +{ + Ecore_Drm_Device *dev; + Ecore_Event_Key *ev; + int keycode; + int vt; + + dev = data; + ev = event; + keycode = ev->keycode - 8; + + if ((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) && + (ev->modifiers & ECORE_EVENT_MODIFIER_ALT) && + (keycode >= KEY_F1) && (keycode <= KEY_F8)) + { + vt = (keycode - KEY_F1 + 1); + + if (!_ecore_drm_tty_switch(dev, vt)) + ERR("Failed to activate vt: %m"); + } + + return ECORE_CALLBACK_PASS_ON; +} + + +static Eina_Bool +_ecore_drm_launcher_cb_vt_signal(void *data, int type EINA_UNUSED, void *event) +{ + Ecore_Drm_Device *dev; + Ecore_Event_Signal_User *ev; + siginfo_t sigdata; + + dev = data; + ev = event; + + sigdata = ev->data; + if (sigdata.si_code != SI_KERNEL) return ECORE_CALLBACK_RENEW; + + if (ev->number == 1) + { + if (!logind) + { + Ecore_Drm_Input *input; + Ecore_Drm_Output *output; + Ecore_Drm_Sprite *sprite; + Eina_List *l; + + /* disable inputs (suspends) */ + EINA_LIST_FOREACH(dev->inputs, l, input) + ecore_drm_inputs_disable(input); + + /* disable hardware cursor */ + EINA_LIST_FOREACH(dev->outputs, l, output) + ecore_drm_output_cursor_size_set(output, 0, 0, 0); + + /* disable sprites */ + EINA_LIST_FOREACH(dev->sprites, l, sprite) + ecore_drm_sprites_fb_set(sprite, 0, 0); + + /* drop drm master */ + ecore_drm_device_master_drop(dev); + + _ecore_drm_event_activate_send(EINA_FALSE); + } + + /* issue ioctl to release vt */ + if (!ecore_drm_tty_release(dev)) + ERR("Could not release VT: %m"); + } + else if (ev->number == 2) + { + if (!logind) + { + Ecore_Drm_Output *output; + Ecore_Drm_Input *input; + Eina_List *l; + + /* set drm master */ + if (!ecore_drm_device_master_set(dev)) + ERR("Could not set drm master: %m"); + + /* set output mode */ + EINA_LIST_FOREACH(dev->outputs, l, output) + ecore_drm_output_enable(output); + + /* enable inputs */ + EINA_LIST_FOREACH(dev->inputs, l, input) + ecore_drm_inputs_enable(input); + + if (ecore_drm_tty_acquire(dev)) + _ecore_drm_event_activate_send(EINA_TRUE); + else + ERR("Could not acquire VT: %m"); + } + else + { + if (!ecore_drm_tty_acquire(dev)) + ERR("Could not acquire VT: %m"); + } + } + + return ECORE_CALLBACK_RENEW; +} + EAPI Eina_Bool ecore_drm_launcher_connect(Ecore_Drm_Device *dev) { @@ -10,20 +115,30 @@ ecore_drm_launcher_connect(Ecore_Drm_Device *dev) { DBG("Launcher: Not Support logind\n"); if (geteuid() == 0) - { - DBG("Launcher: Try to keep going with root privilege\n"); - if (!ecore_drm_tty_open(dev, NULL)) - { - ERR("Launcher: failed to open tty with root privilege\n"); - return EINA_FALSE; - } - } + DBG("Launcher: Try to keep going with root privilege\n"); else { ERR("Launcher: Need Root Privilege or logind\n"); return EINA_FALSE; } } + + if (!ecore_drm_tty_open(dev, NULL)) + { + ERR("Launcher: failed to open tty\n"); + return EINA_FALSE; + } + + /* setup handler for signals */ + dev->tty.event_hdlr = + ecore_event_handler_add(ECORE_EVENT_SIGNAL_USER, + _ecore_drm_launcher_cb_vt_signal, dev); + + /* setup handler for key event of vt switch */ + dev->tty.switch_hdlr = + ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, + _ecore_drm_launcher_cb_vt_switch, dev); + DBG("Launcher: Success Connect\n"); return EINA_TRUE; @@ -37,8 +152,15 @@ ecore_drm_launcher_disconnect(Ecore_Drm_Device *dev) logind = EINA_FALSE; _ecore_drm_logind_disconnect(dev); } - else - ecore_drm_tty_close(dev); + + if (!ecore_drm_tty_close(dev)) + ERR("Launcher: failed to close tty\n"); + + if (dev->tty.event_hdlr) ecore_event_handler_del(dev->tty.event_hdlr); + dev->tty.event_hdlr = NULL; + + if (dev->tty.switch_hdlr) ecore_event_handler_del(dev->tty.switch_hdlr); + dev->tty.switch_hdlr = NULL; } static int diff --git a/src/lib/ecore_drm/ecore_drm_logind.c b/src/lib/ecore_drm/ecore_drm_logind.c index 2e1110261c..9a8d7f1357 100644 --- a/src/lib/ecore_drm/ecore_drm_logind.c +++ b/src/lib/ecore_drm/ecore_drm_logind.c @@ -13,58 +13,6 @@ static Ecore_Event_Handler *active_hdl; static char *sid; -static Eina_Bool -_ecore_drm_logind_cb_vt_switch(void *data, int type EINA_UNUSED, void *event) -{ - Ecore_Drm_Device *dev; - Ecore_Event_Key *ev; - int keycode; - int vt; - - dev = data; - ev = event; - keycode = ev->keycode - 8; - - if ((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) && - (ev->modifiers & ECORE_EVENT_MODIFIER_ALT) && - (keycode >= KEY_F1) && (keycode <= KEY_F8)) - { - vt = (keycode - KEY_F1 + 1); - - if (ioctl(dev->tty.fd, VT_ACTIVATE, vt) < 0) - ERR("Failed to activate vt: %m"); - } - - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_ecore_drm_logind_cb_vt_signal(void *data, int type EINA_UNUSED, void *event) -{ - Ecore_Drm_Device *dev; - Ecore_Event_Signal_User *ev; - siginfo_t sigdata; - - dev = data; - ev = event; - - sigdata = ev->data; - if (sigdata.si_code != SI_KERNEL) return ECORE_CALLBACK_RENEW; - - if (ev->number == 1) - { - if (!ecore_drm_tty_release(dev)) - ERR("Could not release VT: %m"); - } - else if (ev->number == 2) - { - if (!ecore_drm_tty_acquire(dev)) - ERR("Could not acquire VT: %m"); - } - - return ECORE_CALLBACK_PASS_ON; -} - static Eina_Bool _ecore_drm_logind_cb_activate(void *data, int type EINA_UNUSED, void *event) { @@ -100,163 +48,6 @@ _ecore_drm_logind_cb_activate(void *data, int type EINA_UNUSED, void *event) return ECORE_CALLBACK_PASS_ON; } -static Eina_Bool -_ecore_drm_logind_tty_setup(Ecore_Drm_Device *dev) -{ - struct stat st; - int kmode; - struct vt_mode vtmode = { 0 }; - - if (fstat(dev->tty.fd, &st) == -1) - { - ERR("Failed to get stats for tty: %m"); - return EINA_FALSE; - } - - if (ioctl(dev->tty.fd, KDGETMODE, &kmode)) - { - ERR("Could not get tty mode: %m"); - return EINA_FALSE; - } - - if (ioctl(dev->tty.fd, VT_ACTIVATE, minor(st.st_rdev)) < 0) - { - ERR("Failed to activate vt: %m"); - return EINA_FALSE; - } - - if (ioctl(dev->tty.fd, VT_WAITACTIVE, minor(st.st_rdev)) < 0) - { - ERR("Failed to wait active: %m"); - return EINA_FALSE; - } - - /* NB: Don't set this. This Turns OFF keyboard on the VT */ - /* if (ioctl(dev->tty.fd, KDSKBMUTE, 1) && */ - /* ioctl(dev->tty.fd, KDSKBMODE, K_OFF)) */ - /* { */ - /* ERR("Could not set K_OFF keyboard mode: %m"); */ - /* return EINA_FALSE; */ - /* } */ - - if (kmode != KD_GRAPHICS) - { - if (ioctl(dev->tty.fd, KDSETMODE, KD_GRAPHICS)) - { - ERR("Could not set graphics mode: %m"); - goto err_kmode; - } - } - - vtmode.mode = VT_PROCESS; - vtmode.waitv = 0; - vtmode.relsig = SIGUSR1; - vtmode.acqsig = SIGUSR2; - if (ioctl(dev->tty.fd, VT_SETMODE, &vtmode) < 0) - { - ERR("Could not set Terminal Mode: %m"); - goto err_setmode; - } - - return EINA_TRUE; -err_setmode: - ioctl(dev->tty.fd, KDSETMODE, KD_TEXT); -err_kmode: - return EINA_FALSE; -} - -static Eina_Bool -_ecore_drm_logind_vt_open(Ecore_Drm_Device *dev, const char *name) -{ - char tty[32] = ""; - - /* check for valid device */ - if ((!dev) || (!dev->drm.name)) return EINA_FALSE; - - /* assign default tty fd of -1 */ - dev->tty.fd = -1; - - if (!name) - { - char *env; - - if ((env = getenv("ECORE_DRM_TTY"))) - snprintf(tty, sizeof(tty), "%s", env); - else - dev->tty.fd = dup(STDIN_FILENO); - } - else - snprintf(tty, sizeof(tty), "%s", name); - - if (dev->tty.fd < 0) - { - DBG("Trying to Open Tty: %s", tty); - - dev->tty.fd = open(tty, O_RDWR | O_NOCTTY); - if (dev->tty.fd < 0) - { - DBG("Failed to Open Tty: %m"); - return EINA_FALSE; - } - } - - /* save tty name */ - dev->tty.name = eina_stringshare_add(tty); - - /* FIXME */ - if (!_ecore_drm_logind_tty_setup(dev)) - { - close(dev->tty.fd); - dev->tty.fd = -1; - if (dev->tty.name) - { - eina_stringshare_del(dev->tty.name); - dev->tty.name = NULL; - } - return EINA_FALSE; - } - - /* setup handler for signals */ - dev->tty.event_hdlr = - ecore_event_handler_add(ECORE_EVENT_SIGNAL_USER, - _ecore_drm_logind_cb_vt_signal, dev); - - /* setup handler for key event of vt switch */ - dev->tty.switch_hdlr = - ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, - _ecore_drm_logind_cb_vt_switch, dev); - - active_hdl = - ecore_event_handler_add(ECORE_DRM_EVENT_ACTIVATE, - _ecore_drm_logind_cb_activate, dev); - - /* set current tty into env */ - setenv("ECORE_DRM_TTY", tty, 1); - - return EINA_TRUE; -} - -static void -_ecore_drm_logind_vt_close(Ecore_Drm_Device *dev) -{ - struct vt_mode mode = { 0 }; - - ioctl(dev->tty.fd, KDSETMODE, KD_TEXT); - mode.mode = VT_AUTO; - ioctl(dev->tty.fd, VT_SETMODE, &mode); - - if (dev->tty.event_hdlr) ecore_event_handler_del(dev->tty.event_hdlr); - dev->tty.event_hdlr = NULL; - - if (dev->tty.switch_hdlr) ecore_event_handler_del(dev->tty.switch_hdlr); - dev->tty.switch_hdlr = NULL; - - if (dev->tty.name) eina_stringshare_del(dev->tty.name); - dev->tty.name = NULL; - - unsetenv("ECORE_DRM_TTY"); -} - Eina_Bool _ecore_drm_logind_connect(Ecore_Drm_Device *dev) { @@ -267,24 +58,21 @@ _ecore_drm_logind_connect(Ecore_Drm_Device *dev) /* try to init dbus */ if (!_ecore_drm_dbus_init(sid)) - goto dbus_err; + { + free(sid); + return EINA_FALSE; + } - if (!_ecore_drm_logind_vt_open(dev, NULL)) - goto vt_err; + active_hdl = + ecore_event_handler_add(ECORE_DRM_EVENT_ACTIVATE, + _ecore_drm_logind_cb_activate, dev); return EINA_TRUE; - -vt_err: - _ecore_drm_dbus_shutdown(); -dbus_err: - free(sid); - return EINA_FALSE; } void -_ecore_drm_logind_disconnect(Ecore_Drm_Device *dev) +_ecore_drm_logind_disconnect(Ecore_Drm_Device *dev EINA_UNUSED) { - _ecore_drm_logind_vt_close(dev); _ecore_drm_dbus_shutdown(); if (active_hdl) diff --git a/src/lib/ecore_drm/ecore_drm_private.h b/src/lib/ecore_drm/ecore_drm_private.h index 151303fe53..8b907b5311 100644 --- a/src/lib/ecore_drm/ecore_drm_private.h +++ b/src/lib/ecore_drm/ecore_drm_private.h @@ -235,6 +235,8 @@ Eina_Bool _ecore_drm_launcher_device_open(const char *device, Ecore_Drm_Open_Cb int _ecore_drm_launcher_device_open_no_pending(const char *device, int flags); void _ecore_drm_launcher_device_close(const char *device, int fd); +Eina_Bool _ecore_drm_tty_switch(Ecore_Drm_Device *dev, int activate_vt); + void _ecore_drm_inputs_update_output(Ecore_Drm_Device *dev, int w, int h); Ecore_Drm_Evdev *_ecore_drm_evdev_device_create(Ecore_Drm_Seat *seat, struct libinput_device *device); diff --git a/src/lib/ecore_drm/ecore_drm_tty.c b/src/lib/ecore_drm/ecore_drm_tty.c index 11a074e0d6..2bf7027f9f 100644 --- a/src/lib/ecore_drm/ecore_drm_tty.c +++ b/src/lib/ecore_drm/ecore_drm_tty.c @@ -12,103 +12,12 @@ # define KDSKBMUTE 0x4B51 #endif -static Eina_Bool -_ecore_drm_tty_cb_vt_switch(void *data, int type EINA_UNUSED, void *event) +Eina_Bool +_ecore_drm_tty_switch(Ecore_Drm_Device *dev, int activate_vt) { - Ecore_Drm_Device *dev; - Ecore_Event_Key *ev; - int keycode; - int vt; - - dev = data; - ev = event; - keycode = ev->keycode - 8; - - if ((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) && - (ev->modifiers & ECORE_EVENT_MODIFIER_ALT) && - (keycode >= KEY_F1) && (keycode <= KEY_F8)) - { - vt = (keycode - KEY_F1 + 1); - - if (ioctl(dev->tty.fd, VT_ACTIVATE, vt) < 0) - ERR("Failed to activate vt: %m"); - } - - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_ecore_drm_tty_cb_signal(void *data, int type EINA_UNUSED, void *event) -{ - Ecore_Drm_Device *dev; - Ecore_Event_Signal_User *ev; - siginfo_t sigdata; - - dev = data; - ev = event; - - sigdata = ev->data; - if (sigdata.si_code != SI_KERNEL) return ECORE_CALLBACK_RENEW; - - if (ev->number == 1) - { - Ecore_Drm_Input *input; - Ecore_Drm_Output *output; - Ecore_Drm_Sprite *sprite; - Eina_List *l; - - /* disable inputs (suspends) */ - EINA_LIST_FOREACH(dev->inputs, l, input) - ecore_drm_inputs_disable(input); - - /* disable hardware cursor */ - EINA_LIST_FOREACH(dev->outputs, l, output) - ecore_drm_output_cursor_size_set(output, 0, 0, 0); - - /* disable sprites */ - EINA_LIST_FOREACH(dev->sprites, l, sprite) - ecore_drm_sprites_fb_set(sprite, 0, 0); - - /* drop drm master */ - if (ecore_drm_device_master_drop(dev)) - { - /* issue ioctl to release vt */ - if (!ecore_drm_tty_release(dev)) - ERR("Could not release VT: %m"); - } - else - ERR("Could not drop drm master: %m"); - - _ecore_drm_event_activate_send(EINA_FALSE); - } - else if (ev->number == 2) - { - /* issue ioctl to acquire vt */ - if (ecore_drm_tty_acquire(dev)) - { - Ecore_Drm_Output *output; - Ecore_Drm_Input *input; - Eina_List *l; - - /* set drm master */ - if (!ecore_drm_device_master_set(dev)) - ERR("Could not set drm master: %m"); - - /* set output mode */ - EINA_LIST_FOREACH(dev->outputs, l, output) - ecore_drm_output_enable(output); - - /* enable inputs */ - EINA_LIST_FOREACH(dev->inputs, l, input) - ecore_drm_inputs_enable(input); - - _ecore_drm_event_activate_send(EINA_TRUE); - } - else - ERR("Could not acquire VT: %m"); - } - - return ECORE_CALLBACK_RENEW; + if (!ioctl(dev->tty.fd, VT_ACTIVATE, activate_vt) < 0) + return EINA_FALSE; + return EINA_TRUE; } static Eina_Bool @@ -246,16 +155,6 @@ ecore_drm_tty_open(Ecore_Drm_Device *dev, const char *name) return EINA_FALSE; } - /* setup handler for signals */ - dev->tty.event_hdlr = - ecore_event_handler_add(ECORE_EVENT_SIGNAL_USER, - _ecore_drm_tty_cb_signal, dev); - - /* setup handler for key event of vt switch */ - dev->tty.switch_hdlr = - ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, - _ecore_drm_tty_cb_vt_switch, dev); - /* set current tty into env */ setenv("ECORE_DRM_TTY", tty, 1); @@ -301,14 +200,6 @@ ecore_drm_tty_close(Ecore_Drm_Device *dev) dev->tty.fd = -1; - /* destroy the event handler */ - if (dev->tty.event_hdlr) ecore_event_handler_del(dev->tty.event_hdlr); - dev->tty.event_hdlr = NULL; - - /* destroy the event handler */ - if (dev->tty.switch_hdlr) ecore_event_handler_del(dev->tty.switch_hdlr); - dev->tty.switch_hdlr = NULL; - /* clear the tty name */ if (dev->tty.name) eina_stringshare_del(dev->tty.name); dev->tty.name = NULL;