From 81a47310369ac964d5c06f876960717b04f31fc8 Mon Sep 17 00:00:00 2001 From: Chris Michael Date: Thu, 22 Jan 2015 12:40:32 -0500 Subject: [PATCH] ecore-drm: Cleanup launcher code Summary: This moves the VT switch handling code to the tty file, and sets the proper flags on the VT when opened. @fix Signed-off-by: Chris Michael --- src/lib/ecore_drm/ecore_drm_launcher.c | 170 ++++++++------------------------- 1 file changed, 41 insertions(+), 129 deletions(-) diff --git a/src/lib/ecore_drm/ecore_drm_launcher.c b/src/lib/ecore_drm/ecore_drm_launcher.c index 41f2fe1..860cc84 100644 --- a/src/lib/ecore_drm/ecore_drm_launcher.c +++ b/src/lib/ecore_drm/ecore_drm_launcher.c @@ -1,9 +1,8 @@ #include "ecore_drm_private.h" -#include "ecore_drm_logind.h" static Eina_Bool logind = EINA_FALSE; -static Eina_Bool +static Eina_Bool _ecore_drm_launcher_cb_vt_switch(void *data, int type EINA_UNUSED, void *event) { Ecore_Drm_Device *dev; @@ -28,167 +27,80 @@ _ecore_drm_launcher_cb_vt_switch(void *data, int type EINA_UNUSED, void *event) return ECORE_CALLBACK_PASS_ON; } - -static Eina_Bool -_ecore_drm_launcher_cb_vt_signal(void *data, int type EINA_UNUSED, void *event) +int +_ecore_drm_launcher_device_flags_set(int fd, int flags) { - 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); + int fl; - _ecore_drm_event_activate_send(EINA_FALSE); - } + fl = fcntl(fd, F_GETFL); + if (fl < 0) return -1; - /* 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; + if (flags & O_NONBLOCK) + fl |= O_NONBLOCK; - /* set drm master */ - if (!ecore_drm_device_master_set(dev)) - ERR("Could not set drm master: %m"); + if (fcntl(fd, F_SETFL, fl) < 0) + return -1; - /* set output mode */ - EINA_LIST_FOREACH(dev->outputs, l, output) - ecore_drm_output_enable(output); + fl = fcntl(fd, F_GETFD); + if (fl < 0) return -1; - /* enable inputs */ - EINA_LIST_FOREACH(dev->inputs, l, input) - ecore_drm_inputs_enable(input); + if (!(flags & O_CLOEXEC)) + fl &= ~FD_CLOEXEC; - 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"); - } - } + if (fcntl(fd, F_SETFD, fl) < 0) + return -1; - return ECORE_CALLBACK_RENEW; + return fd; } -EAPI Eina_Bool +EAPI Eina_Bool ecore_drm_launcher_connect(Ecore_Drm_Device *dev) { + /* try to connect to logind */ if (!(logind = _ecore_drm_logind_connect(dev))) { - DBG("Launcher: Not Support logind\n"); + DBG("Launcher: Logind not supported"); if (geteuid() == 0) - DBG("Launcher: Try to keep going with root privilege\n"); + { + DBG("Launcher: Trying to continue with root privileges"); + if (!ecore_drm_tty_open(dev, NULL)) + { + ERR("Launcher: Could not setup tty"); + return EINA_FALSE; + } + } else { - ERR("Launcher: Need Root Privilege or logind\n"); + ERR("Launcher: Root privileges needed"); 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"); + dev->tty.switch_hdlr = + ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, + _ecore_drm_launcher_cb_vt_switch, dev); return EINA_TRUE; } -EAPI void +EAPI void ecore_drm_launcher_disconnect(Ecore_Drm_Device *dev) { - 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 (!ecore_drm_tty_close(dev)) - ERR("Launcher: failed to close tty\n"); - - if (logind) + if (!logind) + { + if (!ecore_drm_tty_close(dev)) + ERR("Launcher: Could not close tty"); + } + else { - logind = EINA_FALSE; _ecore_drm_logind_disconnect(dev); + logind = EINA_FALSE; } } -static int -_device_flags_set(int fd, int flags) -{ - int fl; - - fl = fcntl(fd, F_GETFL); - if (fl < 0) return -1; - - if (flags & O_NONBLOCK) - fl |= O_NONBLOCK; - - if (fcntl(fd, F_SETFL, fl) < 0) - return -1; - - fl = fcntl(fd, F_GETFD); - if (fl < 0) return -1; - - if (!(flags & O_CLOEXEC)) - fl &= ~FD_CLOEXEC; - - if (fcntl(fd, F_SETFD, fl) < 0) - return -1; - - return fd; -} - Eina_Bool _ecore_drm_launcher_device_open(const char *device, Ecore_Drm_Open_Cb callback, void *data, int flags) { @@ -226,7 +138,7 @@ _ecore_drm_launcher_device_open_no_pending(const char *device, int flags) if (logind) { fd = _ecore_drm_logind_device_open_no_pending(device); - if ((fd = _device_flags_set(fd, flags)) == -1) + if ((fd = _ecore_drm_launcher_device_flags_set(fd, flags)) < 0) { _ecore_drm_logind_device_close(device); return -1; -- 2.7.4