enlightenment/src/bin/e_manager.c

205 lines
5.1 KiB
C

#include "e.h"
EAPI int E_EVENT_MANAGER_KEYS_GRAB = -1;
static Eina_List *managers = NULL;
static Ecore_Timer *timer_post_screensaver_lock = NULL;
static void
_e_manager_free(E_Manager *man)
{
E_FREE_LIST(man->handlers, ecore_event_handler_del);
managers = eina_list_remove(managers, man);
free(man);
}
static Eina_Bool
_e_manager_cb_key_down(void *data, int ev_type EINA_UNUSED, Ecore_Event_Key *ev)
{
E_Manager *man = data;
if (ev->event_window != man->root)
{
E_Client *ec;
ec = e_client_focused_get();
/* *block actions when no client is focused (probably something else did a grab here so we'll play nice)
* *block actions when client menu is up
* *block actions when event (grab) window isn't comp window
* *other cases?
*/
if (!ec) return ECORE_CALLBACK_RENEW;
if ((ec->border_menu) || (ev->event_window != man->comp->ee_win))
return ECORE_CALLBACK_PASS_ON;
}
if (ev->root_window != man->root) man = e_manager_find_by_root(ev->root_window);
if (!man) man = eina_list_data_get(managers);
return !e_bindings_key_down_event_handle(E_BINDING_CONTEXT_MANAGER, E_OBJECT(man), ev);
}
static Eina_Bool
_e_manager_cb_key_up(void *data, int ev_type EINA_UNUSED, Ecore_Event_Key *ev)
{
E_Manager *man = data;
if (ev->event_window != man->root) return ECORE_CALLBACK_PASS_ON;
if (ev->root_window != man->root) man = e_manager_find_by_root(ev->root_window);
if (!man) man = eina_list_data_get(managers);
return !e_bindings_key_up_event_handle(E_BINDING_CONTEXT_MANAGER, E_OBJECT(man), ev);
}
static Eina_Bool
_e_manager_cb_timer_post_screensaver_lock(void *data EINA_UNUSED)
{
e_desklock_show_autolocked();
timer_post_screensaver_lock = NULL;
return ECORE_CALLBACK_CANCEL;
}
static Eina_Bool
_e_manager_cb_screensaver_on(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev EINA_UNUSED)
{
if (e_config->desklock_autolock_screensaver)
{
E_FREE_FUNC(timer_post_screensaver_lock, ecore_timer_del);
if (e_config->desklock_post_screensaver_time <= 1.0)
e_desklock_show_autolocked();
else
timer_post_screensaver_lock = ecore_timer_add
(e_config->desklock_post_screensaver_time,
_e_manager_cb_timer_post_screensaver_lock, NULL);
}
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_e_manager_cb_screensaver_off(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev EINA_UNUSED)
{
E_FREE_FUNC(timer_post_screensaver_lock, ecore_timer_del);
return ECORE_CALLBACK_PASS_ON;
}
/* externally accessible functions */
EINTERN int
e_manager_init(void)
{
E_EVENT_MANAGER_KEYS_GRAB = ecore_event_type_new();
return 1;
}
EINTERN int
e_manager_shutdown(void)
{
E_FREE_LIST(managers, e_object_del);
E_FREE_FUNC(timer_post_screensaver_lock, ecore_timer_del);
return 1;
}
EAPI Eina_List *
e_manager_list(void)
{
return managers;
}
EAPI E_Manager *
e_manager_new(Ecore_Window root, E_Comp *c, int w, int h)
{
E_Manager *man;
man = E_OBJECT_ALLOC(E_Manager, E_MANAGER_TYPE, _e_manager_free);
if (!man) return NULL;
man->root = root;
man->num = c->num;
man->w = w;
man->h = h;
man->comp = c;
managers = eina_list_append(managers, man);
E_LIST_HANDLER_APPEND(man->handlers, ECORE_EVENT_KEY_DOWN,
_e_manager_cb_key_down, man);
E_LIST_HANDLER_APPEND(man->handlers, ECORE_EVENT_KEY_UP,
_e_manager_cb_key_up, man);
E_LIST_HANDLER_APPEND(man->handlers, E_EVENT_SCREENSAVER_ON,
_e_manager_cb_screensaver_on, man);
E_LIST_HANDLER_APPEND(man->handlers, E_EVENT_SCREENSAVER_OFF,
_e_manager_cb_screensaver_off, man);
return man;
}
EAPI void
e_manager_resize(E_Manager *man, int w, int h)
{
E_OBJECT_CHECK(man);
E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
man->w = w;
man->h = h;
ecore_evas_resize(man->comp->ee, w, h);
}
EAPI E_Manager *
e_manager_current_get(void)
{
Eina_List *l;
E_Manager *man;
int x, y;
if (!managers) return NULL;
if (eina_list_count(managers) == 1)
return eina_list_data_get(managers);
EINA_LIST_FOREACH(managers, l, man)
{
ecore_evas_pointer_xy_get(man->comp->ee, &x, &y);
if (x == -1 && y == -1)
continue;
if (E_INSIDE(x, y, man->x, man->y, man->w, man->h))
return man;
}
return eina_list_data_get(managers);
}
EAPI E_Manager *
e_manager_number_get(int num)
{
Eina_List *l;
E_Manager *man;
if (!managers) return NULL;
EINA_LIST_FOREACH(managers, l, man)
{
if (man->num == num)
return man;
}
return NULL;
}
EAPI void
e_managers_keys_grab(void)
{
Eina_List *l;
E_Manager *man;
EINA_LIST_FOREACH(managers, l, man)
{
if (man->root)
e_bindings_key_grab(E_BINDING_CONTEXT_ANY, man->root);
}
ecore_event_add(E_EVENT_MANAGER_KEYS_GRAB, NULL, NULL, NULL);
}
EAPI void
e_managers_keys_ungrab(void)
{
Eina_List *l;
E_Manager *man;
EINA_LIST_FOREACH(managers, l, man)
{
if (man->root)
e_bindings_key_ungrab(E_BINDING_CONTEXT_ANY, man->root);
}
}