2006-02-19 15:53:35 -08:00
|
|
|
#include "e.h"
|
2007-04-18 20:44:47 -07:00
|
|
|
|
2006-02-22 06:35:04 -08:00
|
|
|
/**************************** private data ******************************/
|
2006-02-19 15:53:35 -08:00
|
|
|
|
2013-01-11 02:34:29 -08:00
|
|
|
typedef struct _E_Desklock_Run E_Desklock_Run;
|
2012-07-17 06:33:21 -07:00
|
|
|
|
2010-07-18 12:06:00 -07:00
|
|
|
|
2012-07-17 06:33:21 -07:00
|
|
|
struct _E_Desklock_Run
|
|
|
|
{
|
|
|
|
E_Order *desk_run;
|
2013-01-11 02:34:29 -08:00
|
|
|
int position;
|
2012-07-17 06:33:21 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
static Ecore_Event_Handler *_e_desklock_run_handler = NULL;
|
2015-06-01 02:38:31 -07:00
|
|
|
static Ecore_Event_Handler *_e_desklock_randr_handler = NULL;
|
2012-07-17 06:33:21 -07:00
|
|
|
static Ecore_Job *job = NULL;
|
|
|
|
static Eina_List *tasks = NULL;
|
|
|
|
|
2013-12-21 07:59:23 -08:00
|
|
|
static Eina_List *show_hooks = NULL;
|
|
|
|
static Eina_List *hide_hooks = NULL;
|
2013-10-25 06:20:45 -07:00
|
|
|
|
2017-01-06 09:56:22 -08:00
|
|
|
static Evas_Object *block_rects[32] = {NULL};
|
2017-01-06 09:56:22 -08:00
|
|
|
static Eina_Bool block_zone[32] = {EINA_FALSE};
|
2013-10-25 23:50:36 -07:00
|
|
|
|
2013-12-21 07:59:23 -08:00
|
|
|
static Eina_List *desklock_ifaces = NULL;
|
|
|
|
static E_Desklock_Interface *current_iface = NULL;
|
2016-01-15 16:25:25 -08:00
|
|
|
static Eina_Bool demo = EINA_FALSE;
|
2006-02-19 15:53:35 -08:00
|
|
|
|
2018-12-15 07:54:46 -08:00
|
|
|
static Eina_Bool _e_desklock_want = EINA_FALSE;
|
|
|
|
static int _e_desklock_block = 0;
|
|
|
|
static Eina_Bool desklock_manual = EINA_FALSE;
|
|
|
|
|
2013-12-21 07:59:23 -08:00
|
|
|
/***********************************************************************/
|
2012-07-17 06:33:21 -07:00
|
|
|
static Eina_Bool _e_desklock_cb_run(void *data, int type, void *event);
|
2015-06-01 02:38:31 -07:00
|
|
|
static Eina_Bool _e_desklock_cb_randr(void *data, int type, void *event);
|
2012-07-17 06:33:21 -07:00
|
|
|
|
2012-07-09 01:03:58 -07:00
|
|
|
static Eina_Bool _e_desklock_state = EINA_FALSE;
|
2006-04-17 20:14:29 -07:00
|
|
|
|
2015-05-07 12:13:10 -07:00
|
|
|
E_API int E_EVENT_DESKLOCK = 0;
|
2007-05-28 04:08:36 -07:00
|
|
|
|
2010-11-22 07:21:32 -08:00
|
|
|
EINTERN int
|
2006-04-17 20:14:29 -07:00
|
|
|
e_desklock_init(void)
|
|
|
|
{
|
2012-09-19 06:31:35 -07:00
|
|
|
Eina_List *l;
|
|
|
|
E_Config_Desklock_Background *bg;
|
2010-03-08 16:31:44 -08:00
|
|
|
|
2012-09-19 06:31:35 -07:00
|
|
|
EINA_LIST_FOREACH(e_config->desklock_backgrounds, l, bg)
|
|
|
|
e_filereg_register(bg->file);
|
2010-03-08 16:31:44 -08:00
|
|
|
|
2007-05-28 04:15:04 -07:00
|
|
|
E_EVENT_DESKLOCK = ecore_event_type_new();
|
2007-05-28 04:08:36 -07:00
|
|
|
|
2012-07-17 06:33:21 -07:00
|
|
|
_e_desklock_run_handler = ecore_event_handler_add(E_EVENT_DESKLOCK,
|
2013-01-11 02:34:29 -08:00
|
|
|
_e_desklock_cb_run, NULL);
|
2012-07-17 06:33:21 -07:00
|
|
|
|
2015-06-01 02:38:31 -07:00
|
|
|
_e_desklock_randr_handler = ecore_event_handler_add(E_EVENT_RANDR_CHANGE,
|
|
|
|
_e_desklock_cb_randr, NULL);
|
2006-04-17 20:14:29 -07:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2010-11-22 07:21:32 -08:00
|
|
|
EINTERN int
|
2006-04-17 20:14:29 -07:00
|
|
|
e_desklock_shutdown(void)
|
|
|
|
{
|
2012-07-17 06:33:21 -07:00
|
|
|
E_Desklock_Run *task;
|
2012-09-19 06:31:35 -07:00
|
|
|
Eina_List *l;
|
|
|
|
E_Config_Desklock_Background *bg;
|
2012-06-14 06:16:28 -07:00
|
|
|
|
2013-12-21 07:59:23 -08:00
|
|
|
desklock_ifaces = eina_list_free(desklock_ifaces);
|
2011-02-15 21:20:13 -08:00
|
|
|
if (!x_fatal)
|
2012-06-14 06:16:28 -07:00
|
|
|
e_desklock_hide();
|
|
|
|
|
2012-07-17 06:33:21 -07:00
|
|
|
ecore_event_handler_del(_e_desklock_run_handler);
|
|
|
|
_e_desklock_run_handler = NULL;
|
2015-06-01 02:38:31 -07:00
|
|
|
ecore_event_handler_del(_e_desklock_randr_handler);
|
|
|
|
_e_desklock_randr_handler = NULL;
|
2012-07-17 06:33:21 -07:00
|
|
|
|
|
|
|
if (job) ecore_job_del(job);
|
|
|
|
job = NULL;
|
|
|
|
|
2012-09-19 06:31:35 -07:00
|
|
|
EINA_LIST_FOREACH(e_config->desklock_backgrounds, l, bg)
|
|
|
|
e_filereg_deregister(bg->file);
|
|
|
|
|
2012-07-17 06:33:21 -07:00
|
|
|
EINA_LIST_FREE(tasks, task)
|
|
|
|
{
|
|
|
|
e_object_del(E_OBJECT(task->desk_run));
|
|
|
|
free(task);
|
|
|
|
}
|
|
|
|
|
2006-04-17 20:14:29 -07:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2015-05-07 12:13:10 -07:00
|
|
|
E_API Eina_Stringshare *
|
2013-12-21 07:59:23 -08:00
|
|
|
e_desklock_user_wallpaper_get(E_Zone *zone)
|
2009-04-25 11:32:34 -07:00
|
|
|
{
|
|
|
|
const E_Config_Desktop_Background *cdbg;
|
|
|
|
const Eina_List *l;
|
2012-09-19 06:51:19 -07:00
|
|
|
E_Desk *desk;
|
2009-04-25 11:32:34 -07:00
|
|
|
|
2012-09-19 06:51:19 -07:00
|
|
|
desk = e_desk_current_get(zone);
|
2009-04-25 11:32:34 -07:00
|
|
|
EINA_LIST_FOREACH(e_config->desktop_backgrounds, l, cdbg)
|
2012-09-19 06:51:19 -07:00
|
|
|
{
|
|
|
|
if ((cdbg->zone > -1) && (cdbg->zone != (int)zone->num)) continue;
|
|
|
|
if ((cdbg->desk_x > -1) && (cdbg->desk_x != desk->x)) continue;
|
|
|
|
if ((cdbg->desk_y > -1) && (cdbg->desk_y != desk->y)) continue;
|
|
|
|
if (cdbg->file) return cdbg->file;
|
|
|
|
}
|
2009-04-25 11:32:34 -07:00
|
|
|
|
2012-09-19 23:57:33 -07:00
|
|
|
if (e_config->desktop_default_background)
|
|
|
|
return e_config->desktop_default_background;
|
|
|
|
|
2010-07-18 12:06:00 -07:00
|
|
|
return e_theme_edje_file_get("base/theme/desklock", "e/desklock/background");
|
2009-04-25 11:32:34 -07:00
|
|
|
}
|
|
|
|
|
2015-05-07 12:13:10 -07:00
|
|
|
E_API void
|
2013-12-21 07:59:23 -08:00
|
|
|
e_desklock_interface_append(E_Desklock_Interface *iface)
|
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(iface);
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(iface->show);
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(iface->name);
|
|
|
|
EINA_SAFETY_ON_TRUE_RETURN(iface->active); // fucking casuals
|
|
|
|
/* make sure our module is first so it gets tried last */
|
|
|
|
if (!e_util_strcmp(iface->name, "lokker"))
|
|
|
|
desklock_ifaces = eina_list_prepend(desklock_ifaces, (void*)iface);
|
|
|
|
else
|
|
|
|
desklock_ifaces = eina_list_append(desklock_ifaces, (void*)iface);
|
2014-01-14 22:01:41 -08:00
|
|
|
if (_e_desklock_state && (!current_iface))
|
|
|
|
{
|
|
|
|
if (iface->show())
|
|
|
|
{
|
|
|
|
iface->active = EINA_TRUE;
|
|
|
|
current_iface = iface;
|
|
|
|
}
|
|
|
|
}
|
2013-12-21 07:59:23 -08:00
|
|
|
}
|
|
|
|
|
2017-05-12 09:09:18 -07:00
|
|
|
EINTERN E_Desklock_Interface *
|
|
|
|
e_desklock_interface_current_get(void)
|
|
|
|
{
|
|
|
|
return current_iface;
|
|
|
|
}
|
|
|
|
|
2015-05-07 12:13:10 -07:00
|
|
|
E_API void
|
2013-12-21 07:59:23 -08:00
|
|
|
e_desklock_interface_remove(E_Desklock_Interface *iface)
|
|
|
|
{
|
|
|
|
E_Desklock_Interface *diface;
|
|
|
|
Eina_List *l;
|
|
|
|
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(iface);
|
|
|
|
if (!desklock_ifaces) return;
|
|
|
|
desklock_ifaces = eina_list_remove(desklock_ifaces, (void*)iface);
|
|
|
|
if (!iface->active) return;
|
|
|
|
/* if it was active, hide it */
|
|
|
|
if (iface->hide) iface->hide();
|
|
|
|
iface->active = EINA_FALSE;
|
|
|
|
current_iface = NULL;
|
|
|
|
/* then try to find a replacement locker */
|
|
|
|
EINA_LIST_REVERSE_FOREACH(desklock_ifaces, l, diface)
|
|
|
|
{
|
|
|
|
if (!diface->show()) continue;
|
|
|
|
diface->active = EINA_TRUE;
|
|
|
|
current_iface = diface;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
/* XXX: if none of the remaining lockers can lock, we're left with a black screen.
|
|
|
|
* I again blame the user for magically unloading the current locker module DURING
|
|
|
|
* desklock, but I refuse to unlock their system.
|
|
|
|
if (!current_iface) e_desklock_hide();
|
|
|
|
*/
|
|
|
|
}
|
|
|
|
|
2015-05-07 12:13:10 -07:00
|
|
|
E_API void
|
2013-10-25 06:20:45 -07:00
|
|
|
e_desklock_show_hook_add(E_Desklock_Show_Cb cb)
|
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(cb);
|
2013-12-21 07:59:23 -08:00
|
|
|
show_hooks = eina_list_append(show_hooks, cb);
|
2013-10-25 06:20:45 -07:00
|
|
|
}
|
|
|
|
|
2015-05-07 12:13:10 -07:00
|
|
|
E_API void
|
2013-10-25 06:20:45 -07:00
|
|
|
e_desklock_show_hook_del(E_Desklock_Show_Cb cb)
|
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(cb);
|
2013-12-21 07:59:23 -08:00
|
|
|
show_hooks = eina_list_remove(show_hooks, cb);
|
2013-10-25 06:20:45 -07:00
|
|
|
}
|
|
|
|
|
2015-05-07 12:13:10 -07:00
|
|
|
E_API void
|
2013-10-25 06:20:45 -07:00
|
|
|
e_desklock_hide_hook_add(E_Desklock_Hide_Cb cb)
|
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(cb);
|
2013-12-21 07:59:23 -08:00
|
|
|
hide_hooks = eina_list_append(hide_hooks, cb);
|
2013-10-25 06:20:45 -07:00
|
|
|
}
|
|
|
|
|
2015-05-07 12:13:10 -07:00
|
|
|
E_API void
|
2013-10-25 06:20:45 -07:00
|
|
|
e_desklock_hide_hook_del(E_Desklock_Hide_Cb cb)
|
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(cb);
|
2013-12-21 07:59:23 -08:00
|
|
|
hide_hooks = eina_list_remove(hide_hooks, cb);
|
2013-10-25 06:20:45 -07:00
|
|
|
}
|
|
|
|
|
2015-05-07 12:13:10 -07:00
|
|
|
E_API int
|
2009-04-26 19:54:43 -07:00
|
|
|
e_desklock_show_autolocked(void)
|
|
|
|
{
|
2012-07-17 06:33:21 -07:00
|
|
|
return e_desklock_show(EINA_FALSE);
|
2009-04-26 19:54:43 -07:00
|
|
|
}
|
|
|
|
|
2016-01-15 16:25:25 -08:00
|
|
|
E_API Eina_Bool
|
|
|
|
e_desklock_demo(void)
|
|
|
|
{
|
|
|
|
E_Desklock_Interface *iface;
|
|
|
|
Eina_List *l;
|
|
|
|
|
|
|
|
EINA_LIST_REVERSE_FOREACH(desklock_ifaces, l, iface)
|
|
|
|
{
|
|
|
|
if (iface->show())
|
|
|
|
{
|
|
|
|
demo = iface->active = EINA_TRUE;
|
|
|
|
current_iface = iface;
|
|
|
|
e_comp_shape_queue();
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
2018-12-15 07:54:46 -08:00
|
|
|
static int
|
|
|
|
_desklock_show_internal(Eina_Bool suspend)
|
2006-02-19 15:53:35 -08:00
|
|
|
{
|
2013-12-21 07:59:23 -08:00
|
|
|
const Eina_List *l;
|
2010-07-18 12:06:00 -07:00
|
|
|
E_Event_Desklock *ev;
|
2013-10-25 06:20:45 -07:00
|
|
|
E_Desklock_Show_Cb show_cb;
|
|
|
|
E_Desklock_Hide_Cb hide_cb;
|
2017-01-06 09:56:22 -08:00
|
|
|
E_Zone *zone;
|
2010-03-08 16:31:44 -08:00
|
|
|
|
2018-03-20 02:42:18 -07:00
|
|
|
#if !defined(HAVE_PAM) && !defined(__FreeBSD__) && !defined(__OpenBSD__)
|
2018-03-20 03:31:12 -07:00
|
|
|
if (!e_desklock_is_personal())
|
|
|
|
{
|
|
|
|
e_util_dialog_show(_("Error - no PAM support"),
|
|
|
|
_("No PAM support was built into Enlightenment, so<ps/>"
|
|
|
|
"desk locking is disabled."));
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
2018-03-20 02:42:18 -07:00
|
|
|
#endif
|
2013-10-25 06:20:45 -07:00
|
|
|
if (_e_desklock_state) return EINA_TRUE;
|
2006-02-26 22:35:56 -08:00
|
|
|
|
2013-10-26 01:59:32 -07:00
|
|
|
if (e_desklock_is_personal())
|
2006-02-26 22:35:56 -08:00
|
|
|
{
|
2013-12-21 07:59:23 -08:00
|
|
|
if (!e_config->desklock_passwd)
|
|
|
|
{
|
2015-03-13 14:47:36 -07:00
|
|
|
zone = e_zone_current_get();
|
2013-12-21 07:59:23 -08:00
|
|
|
if (zone)
|
2014-11-02 18:35:13 -08:00
|
|
|
e_configure_registry_call("screen/screen_lock", NULL, NULL);
|
2013-12-21 07:59:23 -08:00
|
|
|
return 0;
|
|
|
|
}
|
2006-02-26 22:35:56 -08:00
|
|
|
}
|
2010-03-08 16:31:44 -08:00
|
|
|
|
2012-12-30 23:47:51 -08:00
|
|
|
e_menu_hide_all();
|
2013-12-21 07:59:23 -08:00
|
|
|
EINA_LIST_FOREACH(show_hooks, l, show_cb)
|
2006-02-26 22:35:56 -08:00
|
|
|
{
|
2013-10-25 06:20:45 -07:00
|
|
|
if (!show_cb()) goto fail;
|
2006-02-26 22:35:56 -08:00
|
|
|
}
|
2013-12-21 07:59:23 -08:00
|
|
|
|
2017-01-06 09:56:22 -08:00
|
|
|
EINA_LIST_FOREACH(e_comp->zones, l, zone)
|
|
|
|
{
|
|
|
|
Evas_Object *o;
|
|
|
|
|
|
|
|
if (zone->num >= EINA_C_ARRAY_LENGTH(block_rects))
|
|
|
|
{
|
2017-02-11 22:42:12 -08:00
|
|
|
CRI("> %lu screens connected????",
|
|
|
|
(unsigned long)EINA_C_ARRAY_LENGTH(block_rects));
|
2017-01-06 09:56:22 -08:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
o = evas_object_rectangle_add(e_comp->evas);
|
|
|
|
block_rects[zone->num] = o;
|
2017-01-06 21:19:18 -08:00
|
|
|
evas_object_color_set(o, 0, 0, 0, 0);
|
2017-01-06 09:56:22 -08:00
|
|
|
evas_object_geometry_set(o, zone->x, zone->y, zone->w, zone->h);
|
|
|
|
evas_object_layer_set(o, E_LAYER_DESKLOCK);
|
2017-01-06 09:56:22 -08:00
|
|
|
if (!block_zone[zone->num])
|
|
|
|
evas_object_show(o);
|
2017-01-06 09:56:22 -08:00
|
|
|
}
|
2012-10-02 06:00:25 -07:00
|
|
|
if (e_config->desklock_language)
|
|
|
|
e_intl_language_set(e_config->desklock_language);
|
2012-10-02 07:04:04 -07:00
|
|
|
|
2013-01-31 09:50:45 -08:00
|
|
|
if (e_config->xkb.lock_layout)
|
|
|
|
e_xkb_layout_set(e_config->xkb.lock_layout);
|
2012-10-02 07:04:04 -07:00
|
|
|
|
2016-01-15 16:25:25 -08:00
|
|
|
if (demo)
|
|
|
|
{
|
|
|
|
if (current_iface->hide)
|
|
|
|
current_iface->hide();
|
|
|
|
current_iface->active = demo = EINA_FALSE;
|
|
|
|
current_iface = NULL;
|
|
|
|
}
|
|
|
|
|
2013-12-21 07:59:23 -08:00
|
|
|
{
|
|
|
|
E_Desklock_Interface *iface;
|
|
|
|
Eina_Bool success = EINA_TRUE;
|
|
|
|
|
|
|
|
EINA_LIST_REVERSE_FOREACH(desklock_ifaces, l, iface)
|
|
|
|
{
|
|
|
|
success = iface->show();
|
|
|
|
if (success)
|
|
|
|
{
|
|
|
|
iface->active = EINA_TRUE;
|
|
|
|
current_iface = iface;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* FIXME: if someone doesn't have a locking module loaded and has
|
|
|
|
* lock-on-startup, this will result in a permanent black screen.
|
|
|
|
* I blame the user in this case since lokker is a default module
|
|
|
|
* which is really hard to disable (you have to work at it or be a gentoo user).
|
|
|
|
*/
|
|
|
|
if (!success) goto lang_fail;
|
|
|
|
}
|
2007-05-28 04:15:04 -07:00
|
|
|
|
|
|
|
ev = E_NEW(E_Event_Desklock, 1);
|
|
|
|
ev->on = 1;
|
2012-07-17 06:33:21 -07:00
|
|
|
ev->suspend = suspend;
|
2007-05-28 04:15:04 -07:00
|
|
|
ecore_event_add(E_EVENT_DESKLOCK, ev, NULL, NULL);
|
2012-06-14 06:16:28 -07:00
|
|
|
|
2018-03-23 01:18:00 -07:00
|
|
|
if (getenv("E_START_MANAGER")) kill(getppid(), SIGUSR2);
|
2012-07-09 01:03:58 -07:00
|
|
|
_e_desklock_state = EINA_TRUE;
|
2016-11-18 07:18:51 -08:00
|
|
|
e_bindings_disabled_set(1);
|
2017-07-13 02:03:29 -07:00
|
|
|
e_screensaver_update();
|
2019-09-11 02:56:21 -07:00
|
|
|
e_dpms_force_update();
|
2006-02-26 22:35:56 -08:00
|
|
|
return 1;
|
2013-12-21 07:59:23 -08:00
|
|
|
lang_fail:
|
|
|
|
if (e_config->desklock_language)
|
|
|
|
e_intl_language_set(e_config->language);
|
|
|
|
|
|
|
|
if (e_config_xkb_layout_eq(e_config->xkb.current_layout, e_config->xkb.lock_layout))
|
|
|
|
{
|
|
|
|
if (e_config->xkb.sel_layout)
|
|
|
|
e_xkb_layout_set(e_config->xkb.sel_layout);
|
|
|
|
}
|
2013-10-25 06:20:45 -07:00
|
|
|
fail:
|
2013-12-21 07:59:23 -08:00
|
|
|
EINA_LIST_FOREACH(hide_hooks, l, hide_cb)
|
2013-10-25 06:20:45 -07:00
|
|
|
hide_cb();
|
|
|
|
return 0;
|
2006-02-19 15:53:35 -08:00
|
|
|
}
|
|
|
|
|
2018-12-15 07:54:46 -08:00
|
|
|
E_API int
|
|
|
|
e_desklock_show(Eina_Bool suspend)
|
|
|
|
{
|
|
|
|
_e_desklock_want = EINA_TRUE;
|
2019-01-11 03:18:42 -08:00
|
|
|
if ((_e_desklock_block > 0) && (!desklock_manual)) return EINA_FALSE;
|
2018-12-15 07:54:46 -08:00
|
|
|
return _desklock_show_internal(suspend);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_desklock_hide_internal(void)
|
2006-02-19 15:53:35 -08:00
|
|
|
{
|
2013-10-25 06:20:45 -07:00
|
|
|
Eina_List *l;
|
2010-07-18 12:06:00 -07:00
|
|
|
E_Event_Desklock *ev;
|
2013-10-25 06:20:45 -07:00
|
|
|
E_Desklock_Hide_Cb hide_cb;
|
2010-03-08 16:31:44 -08:00
|
|
|
|
2016-01-15 16:25:25 -08:00
|
|
|
if (demo && current_iface)
|
|
|
|
{
|
|
|
|
if (current_iface->hide)
|
|
|
|
current_iface->hide();
|
|
|
|
demo = current_iface->active = EINA_FALSE;
|
|
|
|
current_iface = NULL;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
demo = EINA_FALSE;
|
|
|
|
|
2020-10-09 04:25:26 -07:00
|
|
|
if (!_e_desklock_state) return;
|
2006-03-03 20:11:51 -08:00
|
|
|
|
2015-03-13 13:31:22 -07:00
|
|
|
e_comp_override_del();
|
|
|
|
e_comp_shape_queue();
|
2017-01-06 09:56:22 -08:00
|
|
|
{
|
|
|
|
unsigned int n;
|
|
|
|
|
|
|
|
for (n = 0; n < EINA_C_ARRAY_LENGTH(block_rects); n++)
|
2017-01-06 09:56:22 -08:00
|
|
|
{
|
|
|
|
E_FREE_FUNC(block_rects[n], evas_object_del);
|
|
|
|
block_zone[n] = EINA_FALSE;
|
|
|
|
}
|
2017-01-06 09:56:22 -08:00
|
|
|
}
|
2013-02-18 05:43:55 -08:00
|
|
|
//e_comp_block_window_del();
|
2012-10-02 06:00:25 -07:00
|
|
|
if (e_config->desklock_language)
|
|
|
|
e_intl_language_set(e_config->language);
|
|
|
|
|
2013-01-31 09:50:45 -08:00
|
|
|
if (e_config_xkb_layout_eq(e_config->xkb.current_layout, e_config->xkb.lock_layout))
|
2012-10-03 02:00:12 -07:00
|
|
|
{
|
2013-01-31 09:50:45 -08:00
|
|
|
if (e_config->xkb.sel_layout)
|
|
|
|
e_xkb_layout_set(e_config->xkb.sel_layout);
|
2012-10-03 02:00:12 -07:00
|
|
|
}
|
2012-10-02 07:04:04 -07:00
|
|
|
|
2012-07-09 01:03:58 -07:00
|
|
|
_e_desklock_state = EINA_FALSE;
|
2016-11-18 07:18:51 -08:00
|
|
|
e_bindings_disabled_set(0);
|
2012-07-09 00:47:54 -07:00
|
|
|
ev = E_NEW(E_Event_Desklock, 1);
|
|
|
|
ev->on = 0;
|
2012-07-17 06:33:21 -07:00
|
|
|
ev->suspend = 1;
|
2012-07-09 00:47:54 -07:00
|
|
|
ecore_event_add(E_EVENT_DESKLOCK, ev, NULL, NULL);
|
|
|
|
|
2017-07-13 02:03:29 -07:00
|
|
|
e_screensaver_update();
|
2019-09-11 02:56:21 -07:00
|
|
|
e_dpms_force_update();
|
2017-07-13 02:03:29 -07:00
|
|
|
|
2013-12-21 07:59:23 -08:00
|
|
|
EINA_LIST_FOREACH(hide_hooks, l, hide_cb)
|
2013-10-25 06:20:45 -07:00
|
|
|
hide_cb();
|
2010-03-08 16:31:44 -08:00
|
|
|
|
2013-12-21 07:59:23 -08:00
|
|
|
if (current_iface)
|
|
|
|
{
|
|
|
|
if (current_iface->hide)
|
|
|
|
current_iface->hide();
|
|
|
|
current_iface->active = EINA_FALSE;
|
|
|
|
current_iface = NULL;
|
|
|
|
}
|
2007-05-28 04:15:04 -07:00
|
|
|
|
2018-03-23 01:18:00 -07:00
|
|
|
if (getenv("E_START_MANAGER")) kill(getppid(), SIGHUP);
|
2021-01-21 09:07:15 -08:00
|
|
|
|
|
|
|
e_pointer_reset(e_comp->pointer);
|
2006-02-19 15:53:35 -08:00
|
|
|
}
|
|
|
|
|
2018-12-15 07:54:46 -08:00
|
|
|
E_API int
|
|
|
|
e_desklock_show_manual(Eina_Bool suspend)
|
|
|
|
{
|
|
|
|
desklock_manual = EINA_TRUE;
|
|
|
|
return e_desklock_show(suspend);
|
|
|
|
}
|
|
|
|
|
|
|
|
E_API Eina_Bool
|
|
|
|
e_desklock_manual_get(void)
|
|
|
|
{
|
|
|
|
return desklock_manual;
|
|
|
|
}
|
|
|
|
|
|
|
|
E_API void
|
|
|
|
e_desklock_hide(void)
|
|
|
|
{
|
|
|
|
desklock_manual = EINA_FALSE;
|
|
|
|
_e_desklock_want = EINA_FALSE;
|
|
|
|
_desklock_hide_internal();
|
|
|
|
}
|
|
|
|
|
2015-05-07 12:13:10 -07:00
|
|
|
E_API Eina_Bool
|
2012-07-09 01:03:58 -07:00
|
|
|
e_desklock_state_get(void)
|
|
|
|
{
|
|
|
|
return _e_desklock_state;
|
|
|
|
}
|
|
|
|
|
2018-12-15 07:54:46 -08:00
|
|
|
E_API void
|
|
|
|
e_desklock_block(void)
|
|
|
|
{
|
|
|
|
_e_desklock_block++;
|
|
|
|
if (_e_desklock_block == 1)
|
|
|
|
{
|
|
|
|
if (!desklock_manual)
|
|
|
|
{
|
|
|
|
if (_e_desklock_state) _desklock_hide_internal();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
E_API void
|
|
|
|
e_desklock_unblock(void)
|
|
|
|
{
|
|
|
|
_e_desklock_block--;
|
|
|
|
if (_e_desklock_block == 0)
|
|
|
|
{
|
|
|
|
if (_e_desklock_want) e_desklock_show(EINA_FALSE);
|
|
|
|
}
|
|
|
|
else if (_e_desklock_block < 0)
|
|
|
|
{
|
|
|
|
ERR("desklock block going below zero");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-17 06:33:21 -07:00
|
|
|
static Eina_Bool
|
|
|
|
_e_desklock_run(E_Desklock_Run *task)
|
|
|
|
{
|
|
|
|
Efreet_Desktop *desktop;
|
|
|
|
|
|
|
|
desktop = eina_list_nth(task->desk_run->desktops, task->position++);
|
|
|
|
if (!desktop)
|
|
|
|
{
|
|
|
|
e_object_del(E_OBJECT(task->desk_run));
|
|
|
|
free(task);
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
e_exec(NULL, desktop, NULL, NULL, NULL);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2015-03-18 15:09:09 -07:00
|
|
|
_e_desklock_job(void *data EINA_UNUSED)
|
2012-07-17 06:33:21 -07:00
|
|
|
{
|
|
|
|
E_Desklock_Run *task;
|
|
|
|
|
|
|
|
job = NULL;
|
2013-01-11 02:34:29 -08:00
|
|
|
if (!tasks) return;
|
2012-07-17 06:33:21 -07:00
|
|
|
|
|
|
|
task = eina_list_data_get(tasks);
|
|
|
|
if (!_e_desklock_run(task))
|
|
|
|
tasks = eina_list_remove_list(tasks, tasks);
|
|
|
|
|
|
|
|
if (tasks) job = ecore_job_add(_e_desklock_job, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
2015-03-18 15:09:09 -07:00
|
|
|
_e_desklock_cb_run(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
|
2012-07-17 06:33:21 -07:00
|
|
|
{
|
|
|
|
E_Desklock_Run *task;
|
|
|
|
E_Event_Desklock *ev = event;
|
|
|
|
E_Order *desk_run;
|
|
|
|
char buf[PATH_MAX];
|
|
|
|
|
|
|
|
if (!ev->suspend) return ECORE_CALLBACK_PASS_ON;
|
|
|
|
|
|
|
|
if (ev->on)
|
|
|
|
{
|
|
|
|
e_user_dir_concat_static(buf, "applications/desk-lock/.order");
|
|
|
|
if (!ecore_file_exists(buf))
|
|
|
|
e_prefix_data_concat_static(buf, "applications/desk-lock/.order");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
e_user_dir_concat_static(buf, "applications/desk-unlock/.order");
|
|
|
|
if (!ecore_file_exists(buf))
|
|
|
|
e_prefix_data_concat_static(buf, "applications/desk-unlock/.order");
|
|
|
|
}
|
|
|
|
|
|
|
|
desk_run = e_order_new(buf);
|
|
|
|
if (!desk_run) return ECORE_CALLBACK_PASS_ON;
|
|
|
|
|
|
|
|
task = calloc(1, sizeof (E_Desklock_Run));
|
|
|
|
if (!task)
|
|
|
|
{
|
|
|
|
e_object_del(E_OBJECT(desk_run));
|
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
|
|
|
}
|
|
|
|
|
|
|
|
task->desk_run = desk_run;
|
|
|
|
tasks = eina_list_append(tasks, task);
|
|
|
|
|
|
|
|
if (!job) ecore_job_add(_e_desklock_job, NULL);
|
|
|
|
|
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
|
|
|
}
|
|
|
|
|
2015-06-01 02:38:31 -07:00
|
|
|
static Eina_Bool
|
|
|
|
_e_desklock_cb_randr(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED)
|
|
|
|
{
|
|
|
|
if (!_e_desklock_state) return ECORE_CALLBACK_PASS_ON;
|
|
|
|
e_desklock_hide();
|
|
|
|
e_desklock_show(EINA_FALSE);
|
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
|
|
|
}
|
2017-01-06 09:56:22 -08:00
|
|
|
|
|
|
|
E_API void
|
|
|
|
e_desklock_zone_block_set(const E_Zone *zone, Eina_Bool block)
|
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(zone);
|
|
|
|
if (zone->num >= EINA_C_ARRAY_LENGTH(block_rects))
|
|
|
|
{
|
2017-02-11 22:42:12 -08:00
|
|
|
CRI("> %lu screens connected????",
|
|
|
|
(unsigned long)EINA_C_ARRAY_LENGTH(block_rects));
|
2017-01-06 09:56:22 -08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
block_zone[zone->num] = !!block;
|
|
|
|
if (!block_rects[zone->num]) return;
|
|
|
|
if (block)
|
|
|
|
evas_object_show(block_rects[zone->num]);
|
|
|
|
else
|
|
|
|
evas_object_hide(block_rects[zone->num]);
|
|
|
|
}
|