ecore-drm: Add event to notify session activation state.

Summary:
this event is to notify session activation state to compositor.
thus compositor can change composite state by this event.

Reviewers: devilhorns

Subscribers: torori, cedric

Differential Revision: https://phab.enlightenment.org/D1767
This commit is contained in:
Seunghun Lee 2014-12-10 12:12:21 -05:00 committed by Chris Michael
parent 5d767aff32
commit 5720a350f9
6 changed files with 85 additions and 39 deletions

View File

@ -108,6 +108,11 @@ struct _Ecore_Drm_Device
unsigned int window;
};
struct _Ecore_Drm_Event_Activate
{
Eina_Bool active;
};
/* opaque structure to represent a drm device */
typedef struct _Ecore_Drm_Device Ecore_Drm_Device;
@ -129,6 +134,11 @@ typedef struct _Ecore_Drm_Seat Ecore_Drm_Seat;
/* opaque structure to represent a drm sprite */
typedef struct _Ecore_Drm_Sprite Ecore_Drm_Sprite;
/* sturcture to inform drm activation state */
typedef struct _Ecore_Drm_Event_Activate Ecore_Drm_Event_Activate;
EAPI extern int ECORE_DRM_EVENT_ACTIVATE;
/**
* @file
* @brief Ecore functions for dealing with drm, virtual terminals

View File

@ -2,6 +2,7 @@
# include "config.h"
#endif
#include "Ecore_Drm.h"
#include "ecore_drm_private.h"
/* local variables */
@ -10,6 +11,24 @@ static int _ecore_drm_init_count = 0;
/* external variables */
int _ecore_drm_log_dom = -1;
EAPI int ECORE_DRM_EVENT_ACTIVATE = 0;
static void
_ecore_drm_event_activate_free(void *data EINA_UNUSED, void *event)
{
free(event);
}
void
_ecore_drm_event_activate_send(Eina_Bool active)
{
Ecore_Drm_Event_Activate *e;
e = calloc(1, sizeof(Ecore_Drm_Event_Activate));
e->active = active;
ecore_event_add(ECORE_DRM_EVENT_ACTIVATE, e, _ecore_drm_event_activate_free, NULL);
}
/**
* @defgroup Ecore_Drm_Init_Group Drm Library Init and Shutdown Functions
*
@ -67,6 +86,8 @@ ecore_drm_init(void)
/* try to init eeze */
if (!eeze_init()) goto eeze_err;
ECORE_DRM_EVENT_ACTIVATE = ecore_event_type_new();
/* return init count */
return _ecore_drm_init_count;

View File

@ -68,10 +68,8 @@ _cb_device_paused(void *ctxt EINA_UNUSED, const Eldbus_Message *msg)
_ecore_drm_dbus_device_pause_done(maj, min);
}
/* if (maj == DRM_MAJOR) */
/* { */
/* // emit paused to compositor */
/* } */
if (maj == DRM_MAJOR)
_ecore_drm_event_activate_send(EINA_FALSE);
}
}
@ -90,10 +88,8 @@ _cb_device_resumed(void *ctxt EINA_UNUSED, const Eldbus_Message *msg)
if (eldbus_message_arguments_get(msg, "uuh", &maj, &min, &fd))
{
/* if (maj == DRM_MAJOR) */
/* { */
/* // emit active to compositor */
/* } */
if (maj == DRM_MAJOR)
_ecore_drm_event_activate_send(EINA_TRUE);
}
}

View File

@ -10,6 +10,7 @@
# define KDSKBMUTE 0x4B51
#endif
Ecore_Event_Handler *active_hdl;
static char *sid;
static Eina_Bool
@ -52,15 +53,40 @@ _ecore_drm_logind_cb_vt_signal(void *data, int type EINA_UNUSED, void *event)
if (ev->number == 1)
{
Ecore_Drm_Input *input;
Ecore_Drm_Output *output;
Ecore_Drm_Sprite *sprite;
Eina_List *l;
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");
}
/* disable inputs (suspends) */
EINA_LIST_FOREACH(dev->inputs, l, input)
ecore_drm_inputs_disable(input);
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_ecore_drm_logind_cb_activate(void *data, int type EINA_UNUSED, void *event)
{
Ecore_Drm_Event_Activate *e;
Ecore_Drm_Device *dev;
Ecore_Drm_Sprite *sprite;
Ecore_Drm_Output *output;
Eina_List *l;
if ((!event) || (!data)) return ECORE_CALLBACK_RENEW;
e = event;
dev = data;
if (e->active)
{
/* set output mode */
EINA_LIST_FOREACH(dev->outputs, l, output)
ecore_drm_output_enable(output);
}
else
{
/* disable hardware cursor */
EINA_LIST_FOREACH(dev->outputs, l, output)
ecore_drm_output_cursor_size_set(output, 0, 0, 0);
@ -68,34 +94,12 @@ _ecore_drm_logind_cb_vt_signal(void *data, int type EINA_UNUSED, void *event)
/* disable sprites */
EINA_LIST_FOREACH(dev->sprites, l, sprite)
ecore_drm_sprites_fb_set(sprite, 0, 0);
if (!ecore_drm_tty_release(dev))
ERR("Could not release VT: %m");
}
else if (ev->number == 2)
{
if (ecore_drm_tty_acquire(dev))
{
Ecore_Drm_Output *output;
Ecore_Drm_Input *input;
Eina_List *l;
/* 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);
}
else
ERR("Could not acquire VT: %m");
}
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
static Eina_Bool
_ecore_drm_logind_tty_setup(Ecore_Drm_Device *dev)
{
struct stat st;
@ -160,7 +164,6 @@ err_kmode:
return EINA_FALSE;
}
static Eina_Bool
_ecore_drm_logind_vt_open(Ecore_Drm_Device *dev, const char *name)
{
@ -222,6 +225,10 @@ _ecore_drm_logind_vt_open(Ecore_Drm_Device *dev, const char *name)
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);
@ -278,6 +285,12 @@ _ecore_drm_logind_disconnect(Ecore_Drm_Device *dev)
{
_ecore_drm_logind_vt_close(dev);
_ecore_drm_dbus_shutdown();
if (active_hdl)
{
ecore_event_handler_del(active_hdl);
active_hdl = NULL;
}
}
Eina_Bool

View File

@ -229,6 +229,8 @@ struct _Ecore_Drm_Sprite
typedef void (*Ecore_Drm_Open_Cb)(void *data, int fd, Eina_Bool b);
void _ecore_drm_event_activate_send(Eina_Bool active);
Eina_Bool _ecore_drm_launcher_device_open(const char *device, Ecore_Drm_Open_Cb callback, void *data, int flags);
int _ecore_drm_launcher_device_open_no_pending(const char *device, int flags);
void _ecore_drm_launcher_device_close(const char *device, int fd);

View File

@ -78,6 +78,8 @@ _ecore_drm_tty_cb_signal(void *data, int type EINA_UNUSED, void *event)
}
else
ERR("Could not drop drm master: %m");
_ecore_drm_event_activate_send(EINA_FALSE);
}
else if (ev->number == 2)
{
@ -99,6 +101,8 @@ _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);
_ecore_drm_event_activate_send(EINA_TRUE);
}
else
ERR("Could not acquire VT: %m");