ecore-drm: Fix drm VT switching to work again

This commit fixes VT switching in the ecore_drm library code to work
again. Previously we were not dup'ing the stdin fd which lead to
inappropriate ioctls for that fd. Fix that by adding the missing dup
call. This also adds more error messages during ioctl function calls,
and cleans up the switching handler code (for keyboard events).

@fix

Signed-off-by: Chris Michael <cp.michael@samsung.com>
This commit is contained in:
Chris Michael 2014-09-15 15:45:31 -04:00
parent d91e607dd6
commit 42a97a98c2
1 changed files with 43 additions and 52 deletions

View File

@ -30,10 +30,8 @@ _ecore_drm_tty_cb_vt_switch(void *data, int type EINA_UNUSED, void *event)
{
vt = (keycode - KEY_F1 + 1);
/* make a vt #vt active */
ioctl(dev->tty.fd, VT_ACTIVATE, vt);
return ECORE_CALLBACK_DONE;
if (ioctl(dev->tty.fd, VT_ACTIVATE, vt) < 0)
ERR("Failed to activate vt: %m");
}
return ECORE_CALLBACK_PASS_ON;
@ -49,9 +47,6 @@ _ecore_drm_tty_cb_signal(void *data, int type EINA_UNUSED, void *event)
dev = data;
ev = event;
/* FIXME: this sigdata doesn't have pid or uid info
* si_code is single value to get from sigdata
*/
sigdata = ev->data;
if (sigdata.si_code != SI_KERNEL) return ECORE_CALLBACK_RENEW;
@ -62,8 +57,6 @@ _ecore_drm_tty_cb_signal(void *data, int type EINA_UNUSED, void *event)
Ecore_Drm_Sprite *sprite;
Eina_List *l;
DBG("Release VT");
/* disable inputs (suspends) */
EINA_LIST_FOREACH(dev->inputs, l, input)
ecore_drm_inputs_disable(input);
@ -76,36 +69,25 @@ _ecore_drm_tty_cb_signal(void *data, int type EINA_UNUSED, void *event)
EINA_LIST_FOREACH(dev->sprites, l, sprite)
ecore_drm_sprites_fb_set(sprite, 0, 0);
/* close input fds ?? */
/* 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");
/* remove switch handler */
if (dev->tty.switch_hdlr)
{
ecore_event_handler_del(dev->tty.switch_hdlr);
dev->tty.switch_hdlr = NULL;
}
}
else
ERR("Could not drop drm master: %m");
}
else if (ev->number == 2)
{
Ecore_Drm_Output *output;
Ecore_Drm_Input *input;
Eina_List *l;
DBG("Acquire VT");
/* 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");
@ -117,12 +99,6 @@ _ecore_drm_tty_cb_signal(void *data, int type EINA_UNUSED, void *event)
/* enable inputs */
EINA_LIST_FOREACH(dev->inputs, l, input)
ecore_drm_inputs_enable(input);
/* listen key event for vt switch */
if (!dev->tty.switch_hdlr)
ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
_ecore_drm_tty_cb_vt_switch, dev);
}
else
ERR("Could not acquire VT: %m");
@ -135,7 +111,7 @@ static Eina_Bool
_ecore_drm_tty_setup(Ecore_Drm_Device *dev)
{
struct stat st;
int kb_mode;
int kmode;
struct vt_mode vtmode = { 0 };
if (fstat(dev->tty.fd, &st) == -1)
@ -144,9 +120,21 @@ _ecore_drm_tty_setup(Ecore_Drm_Device *dev)
return EINA_FALSE;
}
if (ioctl(dev->tty.fd, KDGKBMODE, &kb_mode))
if (ioctl(dev->tty.fd, KDGETMODE, &kmode))
{
ERR("Could not get tty keyboard mode: %m");
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;
}
@ -158,10 +146,13 @@ _ecore_drm_tty_setup(Ecore_Drm_Device *dev)
/* return EINA_FALSE; */
/* } */
if (ioctl(dev->tty.fd, KDSETMODE, KD_GRAPHICS))
if (kmode != KD_GRAPHICS)
{
ERR("Could not set graphics mode: %m");
return EINA_FALSE;
if (ioctl(dev->tty.fd, KDSETMODE, KD_GRAPHICS))
{
ERR("Could not set graphics mode: %m");
return EINA_FALSE;
}
}
vtmode.mode = VT_PROCESS;
@ -174,18 +165,6 @@ _ecore_drm_tty_setup(Ecore_Drm_Device *dev)
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; */
/* } */
return EINA_TRUE;
}
@ -224,7 +203,7 @@ ecore_drm_tty_open(Ecore_Drm_Device *dev, const char *name)
if ((env = getenv("ECORE_DRM_TTY")))
snprintf(tty, sizeof(tty), "%s", env);
else
dev->tty.fd = STDIN_FILENO;
dev->tty.fd = dup(STDIN_FILENO);
}
else // FIXME: NB: This should Really check for format of name (/dev/xyz)
snprintf(tty, sizeof(tty), "%s", name);
@ -241,7 +220,7 @@ ecore_drm_tty_open(Ecore_Drm_Device *dev, const char *name)
}
}
DBG("Opened Tty %s : %d", tty, dev->tty.fd);
/* DBG("Opened Tty %s : %d", tty, dev->tty.fd); */
/* save tty name */
dev->tty.name = eina_stringshare_add(tty);
@ -289,6 +268,10 @@ ecore_drm_tty_close(Ecore_Drm_Device *dev)
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;
@ -314,7 +297,11 @@ ecore_drm_tty_release(Ecore_Drm_Device *dev)
if ((!dev) || (!dev->drm.name) || (dev->tty.fd < 0)) return EINA_FALSE;
/* send ioctl for vt release */
if (ioctl(dev->tty.fd, VT_RELDISP, 1) < 0) return EINA_FALSE;
if (ioctl(dev->tty.fd, VT_RELDISP, 1) < 0)
{
ERR("Could not release VT: %m");
return EINA_FALSE;
}
return EINA_TRUE;
}
@ -335,7 +322,11 @@ ecore_drm_tty_acquire(Ecore_Drm_Device *dev)
if ((!dev) || (!dev->drm.name) || (dev->tty.fd < 0)) return EINA_FALSE;
/* send ioctl for vt acquire */
if (ioctl(dev->tty.fd, VT_RELDISP, VT_ACKACQ) < 0) return EINA_FALSE;
if (ioctl(dev->tty.fd, VT_RELDISP, VT_ACKACQ) < 0)
{
ERR("Could not acquire VT: %m");
return EINA_FALSE;
}
return EINA_TRUE;
}