devilhorns pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=e6970f4f8b13177c64f7020e26d46a65a527a126

commit e6970f4f8b13177c64f7020e26d46a65a527a126
Author: Chris Michael <[email protected]>
Date:   Thu Jan 22 12:37:16 2015 -0500

    ecore-drm: Cleanup tty code and handle vt signal trapping
    
    Summary: This cleans up the tty code a bit, and makes it the
    responsibility of the tty code to handle VT switching signals
    
    @fix
    
    Signed-off-by: Chris Michael <[email protected]>
---
 src/lib/ecore_drm/ecore_drm_tty.c | 62 ++++++++++++++++++++++++++++-----------
 1 file changed, 45 insertions(+), 17 deletions(-)

diff --git a/src/lib/ecore_drm/ecore_drm_tty.c 
b/src/lib/ecore_drm/ecore_drm_tty.c
index fe338f5..f88d9f1 100644
--- a/src/lib/ecore_drm/ecore_drm_tty.c
+++ b/src/lib/ecore_drm/ecore_drm_tty.c
@@ -1,12 +1,4 @@
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
 #include "ecore_drm_private.h"
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <linux/vt.h>
-#include <linux/kd.h>
 
 #ifndef KDSKBMUTE
 # define KDSKBMUTE 0x4B51
@@ -14,6 +6,35 @@
 
 static int kbd_mode = 0;
 
+static Eina_Bool 
+_ecore_drm_tty_cb_vt_signal(void *data, int type EINA_UNUSED, void *event)
+{
+   Ecore_Drm_Device *dev;
+   Ecore_Event_Signal_User *ev;
+   siginfo_t sig;
+
+   ev = event;
+   sig = ev->data;
+   if (sig.si_code != SI_KERNEL) return ECORE_CALLBACK_RENEW;
+   if (!(dev = data)) return ECORE_CALLBACK_RENEW;
+
+   switch (ev->number)
+     {
+      case 1:
+        ecore_drm_device_master_drop(dev);
+        ioctl(dev->tty.fd, VT_RELDISP, 1);
+        break;
+      case 2:
+        ioctl(dev->tty.fd, VT_RELDISP, VT_ACKACQ);
+        ecore_drm_device_master_set(dev);
+        break;
+      default:
+        break;
+     }
+
+   return ECORE_CALLBACK_RENEW;
+}
+
 Eina_Bool
 _ecore_drm_tty_switch(Ecore_Drm_Device *dev, int activate_vt)
 {
@@ -29,7 +50,8 @@ _ecore_drm_tty_setup(Ecore_Drm_Device *dev)
    int kmode;
    struct vt_mode vtmode = { 0 };
 
-   if (fstat(dev->tty.fd, &st) == -1)
+   if ((fstat(dev->tty.fd, &st) == -1) || 
+       (major(st.st_rdev) != TTY_MAJOR) || (minor(st.st_rdev) == 0))
      {
         ERR("Failed to get stats for tty: %m");
         return EINA_FALSE;
@@ -41,6 +63,12 @@ _ecore_drm_tty_setup(Ecore_Drm_Device *dev)
         return EINA_FALSE;
      }
 
+   if (kmode != KD_TEXT)
+     {
+        WRN("Virtual Terminal already in KD_GRAPHICS mode");
+        return EINA_FALSE;
+     }
+
    if (ioctl(dev->tty.fd, VT_ACTIVATE, minor(st.st_rdev)) < 0)
      {
         ERR("Failed to activate vt: %m");
@@ -66,13 +94,10 @@ _ecore_drm_tty_setup(Ecore_Drm_Device *dev)
         return EINA_FALSE;
      }
 
-   if (kmode != KD_GRAPHICS)
+   if (ioctl(dev->tty.fd, KDSETMODE, KD_GRAPHICS))
      {
-        if (ioctl(dev->tty.fd, KDSETMODE, KD_GRAPHICS))
-          {
-             ERR("Could not set graphics mode: %m");
-             goto err_kmode;
-          }
+        ERR("Could not set graphics mode: %m");
+        goto err_kmode;
      }
 
    vtmode.mode = VT_PROCESS;
@@ -136,7 +161,7 @@ ecore_drm_tty_open(Ecore_Drm_Device *dev, const char *name)
      {
         DBG("Trying to Open Tty: %s", tty);
 
-        dev->tty.fd = open(tty, O_RDWR | O_NOCTTY);
+        dev->tty.fd = open(tty, (O_RDWR | O_CLOEXEC)); //O_RDWR | O_NOCTTY);
         if (dev->tty.fd < 0)
           {
              DBG("Failed to Open Tty: %m");
@@ -149,7 +174,6 @@ ecore_drm_tty_open(Ecore_Drm_Device *dev, const char *name)
    /* save tty name */
    dev->tty.name = eina_stringshare_add(tty);
 
-   /* FIXME */
    if (!_ecore_drm_tty_setup(dev))
      {
         close(dev->tty.fd);
@@ -162,6 +186,10 @@ ecore_drm_tty_open(Ecore_Drm_Device *dev, const char *name)
         return EINA_FALSE;
      }
 
+   dev->tty.event_hdlr = 
+     ecore_event_handler_add(ECORE_EVENT_SIGNAL_USER, 
+                             _ecore_drm_tty_cb_vt_signal, dev);
+
    /* set current tty into env */
    setenv("ECORE_DRM_TTY", tty, 1);
 

-- 


Reply via email to