forked from enlightenment/enlightenment
343 lines
8.9 KiB
C
343 lines
8.9 KiB
C
|
|
#include "e.h"
|
|
|
|
#define ELOCK_POPUP_LAYER 10000
|
|
|
|
#define PASSWD_LEN 256
|
|
|
|
static Ecore_X_Window elock_wnd = 0;
|
|
static Evas_List *handlers = NULL;
|
|
static E_Popup *elock_wnd_popup = NULL;
|
|
|
|
static Evas_Object *bg_object = NULL;
|
|
static Evas_Object *passwd_entry = NULL;
|
|
|
|
static char passwd[PASSWD_LEN]="";
|
|
|
|
static int _e_desklock_cb_key_down(void *data, int type, void *event);
|
|
static int _e_desklock_cb_mouse_down(void *data, int type, void *event);
|
|
static int _e_desklock_cb_mouse_up(void *data, int type, void *event);
|
|
static int _e_desklock_cb_mouse_wheel(void *data, int type, void *event);
|
|
//static int _e_desklock_idler(void *data);
|
|
|
|
static void _e_desklock_passwd_update();
|
|
static void _e_desklock_backspace();
|
|
static void _e_desklock_delete();
|
|
|
|
EAPI int
|
|
e_desklock_show(void)
|
|
{
|
|
//Evas_List *managers, *l, *l2, *l3;
|
|
Evas_Object *eo;
|
|
int x, y, w, h;
|
|
//Evas_List *elock_wnd_list = NULL;
|
|
|
|
E_Zone *zone = NULL;
|
|
|
|
/*e_error_dialog_show(_("Enlightenment Desktop Lock!"),
|
|
_("The Desktop Lock mechanism is not complitely working yet.\n"
|
|
"It is just a simple development version of Desktop Locking.\n"
|
|
"To return to E, just hit Enter"));*/
|
|
|
|
zone = e_zone_current_get(e_container_current_get(e_manager_current_get()));
|
|
{
|
|
elock_wnd = ecore_x_window_input_new(zone->container->win, 0, 0, 1, 1);
|
|
ecore_x_window_show(elock_wnd);
|
|
e_grabinput_get(elock_wnd, 0, elock_wnd);
|
|
|
|
x = zone->x;
|
|
y = zone->y;
|
|
w = zone->w;
|
|
h = zone->h;
|
|
|
|
elock_wnd_popup = e_popup_new(zone, x, y, w, h);
|
|
evas_event_feed_mouse_move(elock_wnd_popup->evas, -1000000, -1000000,
|
|
ecore_x_current_time_get(), NULL);
|
|
|
|
e_popup_layer_set(elock_wnd_popup, ELOCK_POPUP_LAYER);
|
|
|
|
evas_event_freeze(elock_wnd_popup->evas);
|
|
bg_object = edje_object_add(elock_wnd_popup->evas);
|
|
|
|
// this option should be made as a user option.
|
|
/*e_theme_edje_object_set(bg_object, "base/theme/background", "desktop/background");
|
|
|
|
passwd_entry = edje_object_add(elock_wnd_popup->evas);
|
|
e_theme_edje_object_set(passwd_entry, "base/theme/desklock", "widgets/desklock/main");
|
|
edje_object_part_text_set(passwd_entry, "passwd", passwd);
|
|
|
|
edje_object_part_swallow(bg_object, "passwd_entry", passwd_entry);
|
|
evas_object_move(passwd_entry, x + 200, y + 200);
|
|
evas_object_show(passwd_entry);*/
|
|
e_theme_edje_object_set(bg_object, "base/theme/desklock", "widgets/desklock/main");
|
|
|
|
|
|
e_popup_move_resize(elock_wnd_popup, x, y, w, h);
|
|
evas_object_move(bg_object, 0, 0);
|
|
evas_object_resize(bg_object, w, h);
|
|
evas_object_show(bg_object);
|
|
e_popup_edje_bg_object_set(elock_wnd_popup, bg_object);
|
|
|
|
evas_event_thaw(elock_wnd_popup->evas);
|
|
|
|
/* handlers */
|
|
handlers = evas_list_append(handlers,
|
|
ecore_event_handler_add(ECORE_X_EVENT_KEY_DOWN,
|
|
_e_desklock_cb_key_down, NULL));
|
|
handlers = evas_list_append(handlers,
|
|
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_DOWN,
|
|
_e_desklock_cb_mouse_down, NULL));
|
|
handlers = evas_list_append(handlers,
|
|
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP,
|
|
_e_desklock_cb_mouse_up, NULL));
|
|
handlers = evas_list_append(handlers,
|
|
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_WHEEL,
|
|
_e_desklock_cb_mouse_wheel,
|
|
NULL));
|
|
|
|
//elock_wnd_idler = ecore_idler_add(_e_desklock_idler, NULL);
|
|
|
|
e_popup_show(elock_wnd_popup);
|
|
}
|
|
|
|
/*
|
|
// TODO: I think that creation of the elock_wnd can be moved into the e_main.c.
|
|
// Actually this lock wnd can be created just once. And then used.
|
|
managers = e_manager_list();
|
|
|
|
for (l = managers; l; l = l->next)
|
|
{
|
|
E_Manager *man;
|
|
|
|
man = l->data;
|
|
for (l2 = man->containers; l2; l2 = l2->next)
|
|
{
|
|
E_Container *con;
|
|
|
|
con = l2->data;
|
|
for (l3 = con->zones; l3; l3 = l3->next)
|
|
{
|
|
E_Zone *zone;
|
|
|
|
zone = l3->data;
|
|
|
|
input_window = ecore_x_window_input_new(zone->container->win, 0, 0, 1, 1);
|
|
ecore_x_window_show(input_window);
|
|
//e_grabinput_get(input_window, 0, input_window);
|
|
|
|
x = zone->x + 20;
|
|
y = zone->y + 20 + ((zone->h - 20 - 20 - 20)/ 2);
|
|
w = zone->w - 20 - 20;
|
|
h = 20;
|
|
|
|
elock_wnd = e_popup_new(zone, 100, 100, 400, 300);
|
|
evas_event_feed_mouse_move(elock_wnd->evas, -1000000, -1000000,
|
|
ecore_x_current_time_get(), NULL);
|
|
|
|
e_popup_layer_set(elock_wnd, ELOCK_POPUP_LAYER);
|
|
|
|
evas_event_freeze(elock_wnd->evas);
|
|
eo = edje_object_add(elock_wnd->evas);
|
|
|
|
evas_object_move(eo, 0, 0);
|
|
evas_object_resize(eo, 400, 300);
|
|
|
|
// this option should be made as a user option.
|
|
e_theme_edje_object_set(eo, "base/theme/background", "desktop/background");
|
|
evas_object_show(eo);
|
|
|
|
e_popup_edje_bg_object_set(elock_wnd, eo);
|
|
|
|
evas_event_thaw(elock_wnd->evas);
|
|
|
|
handlers = evas_list_append(handlers,
|
|
ecore_event_handler_add(ECORE_X_EVENT_KEY_DOWN,
|
|
_e_desklock_cb_key_down, NULL));
|
|
handlers = evas_list_append(handlers,
|
|
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_DOWN,
|
|
_e_desklock_cb_mouse_down, NULL));
|
|
handlers = evas_list_append(handlers,
|
|
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP,
|
|
_e_desklock_cb_mouse_up, NULL));
|
|
handlers = evas_list_append(handlers,
|
|
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_WHEEL,
|
|
_e_desklock_cb_mouse_wheel,
|
|
NULL));
|
|
|
|
//elock_wnd_idler = ecore_idler_add(_e_desklock_idler, NULL);
|
|
|
|
e_popup_show(elock_wnd);
|
|
}
|
|
}
|
|
}*/
|
|
|
|
|
|
/* e_error_dialog_show(_("Enlightenment IPC setup error!"),
|
|
_("Enlightenment cannot set up the IPC socket.\n"
|
|
"It likely is already in use by an existing copy of Enlightenment.\n"
|
|
"Double check to see if Enlightenment is not already on this display,\n"
|
|
"but if that fails try deleting all files in ~/.ecore/enlightenment-*\n"
|
|
"and try running again."));*/
|
|
_e_desklock_passwd_update();
|
|
|
|
return 1;
|
|
}
|
|
|
|
EAPI void
|
|
e_desklock_hide(void)
|
|
{
|
|
if (!elock_wnd_popup) return;
|
|
|
|
evas_event_freeze(elock_wnd_popup->evas);
|
|
|
|
e_popup_hide(elock_wnd_popup);
|
|
evas_object_del(bg_object);
|
|
bg_object = NULL;
|
|
|
|
evas_event_thaw(elock_wnd_popup->evas);
|
|
e_object_del(E_OBJECT(elock_wnd_popup));
|
|
elock_wnd_popup = NULL;
|
|
|
|
while (handlers)
|
|
{
|
|
ecore_event_handler_del(handlers->data);
|
|
handlers = evas_list_remove_list(handlers, handlers);
|
|
}
|
|
ecore_x_window_del(elock_wnd);
|
|
e_grabinput_release(elock_wnd, elock_wnd);
|
|
elock_wnd = 0;
|
|
|
|
memset(passwd, 0, sizeof(char) * PASSWD_LEN);
|
|
}
|
|
|
|
static int
|
|
_e_desklock_cb_key_down(void *data, int type, void *event)
|
|
{
|
|
Ecore_X_Event_Key_Down *ev;
|
|
|
|
ev = event;
|
|
if (ev->win != elock_wnd) return 1;
|
|
|
|
if (!strcmp(ev->keysymbol, "Escape"))
|
|
;
|
|
else if (!strcmp(ev->keysymbol, "KP_Enter"))
|
|
{
|
|
// here we have to go to auth
|
|
if (1 || strcmp(passwd, "password") == 0)
|
|
e_desklock_hide(); // Actually, escape MUST be ignored.
|
|
else
|
|
; // report about invalid password
|
|
memset(passwd, 0, sizeof(char) * PASSWD_LEN);
|
|
_e_desklock_passwd_update();
|
|
}
|
|
else if (!strcmp(ev->keysymbol, "Return"))
|
|
{
|
|
// here we have to go to auth
|
|
if (1 || strcmp(passwd, "password") == 0)
|
|
e_desklock_hide(); // Actually, escape MUST be ignored.
|
|
else
|
|
; // report about invalid password
|
|
memset(passwd, 0, sizeof(char) * PASSWD_LEN);
|
|
_e_desklock_passwd_update();
|
|
}
|
|
else if (!strcmp(ev->keysymbol, "BackSpace"))
|
|
_e_desklock_backspace();
|
|
else if (!strcmp(ev->keysymbol, "Delete"))
|
|
_e_desklock_delete();
|
|
else
|
|
{
|
|
// here we have to grab a password
|
|
if (ev->key_compose)
|
|
{
|
|
if ((strlen(passwd) < (PASSWD_LEN - strlen(ev->key_compose))))
|
|
{
|
|
strcat(passwd, ev->key_compose);
|
|
_e_desklock_passwd_update();
|
|
}
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
_e_desklock_cb_mouse_down(void *data, int type, void *event)
|
|
{
|
|
return 1;
|
|
}
|
|
static int
|
|
_e_desklock_cb_mouse_up(void *data, int type, void *event)
|
|
{
|
|
return 1;
|
|
}
|
|
static int
|
|
_e_desklock_cb_mouse_wheel(void *data, int type, void *event)
|
|
{
|
|
return 1;
|
|
}
|
|
static int
|
|
_e_desklock_idler(void *data)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
EAPI int
|
|
e_desklock_init(void)
|
|
{
|
|
// desklock_edd = E_CONFIG_DD_NEW("E_Desklock", E_Decklock);
|
|
//#undef T
|
|
//#undef D
|
|
//#define T E_Desklock
|
|
//#define D desklock_edd
|
|
//E_CONFIG_VAL(D, T, path, STR);
|
|
|
|
//#undef T
|
|
//#undef D
|
|
|
|
return 1;
|
|
}
|
|
|
|
EAPI int
|
|
e_desklock_shutdown(void)
|
|
{
|
|
e_desklock_hide();
|
|
return 1;
|
|
}
|
|
|
|
static void
|
|
_e_desklock_passwd_update()
|
|
{
|
|
int ii;
|
|
char passwd_hidden[PASSWD_LEN * 3]="";
|
|
|
|
for (ii = 0; ii < strlen(passwd); ii ++)
|
|
{
|
|
strcat(passwd_hidden, "*");
|
|
}
|
|
edje_object_part_text_set(bg_object, "passwd", passwd_hidden);
|
|
/*edje_object_part_text_set(bg_object, "passwd", passwd);*/
|
|
return;
|
|
}
|
|
|
|
static void
|
|
_e_desklock_backspace()
|
|
{
|
|
int len, val, pos;
|
|
|
|
len = strlen(passwd);
|
|
if (len > 0)
|
|
{
|
|
pos = evas_string_char_prev_get(passwd, len, &val);
|
|
if ((pos < len) && (pos >= 0))
|
|
{
|
|
passwd[pos] = 0;
|
|
_e_desklock_passwd_update();
|
|
}
|
|
}
|
|
}
|
|
static void
|
|
_e_desklock_delete()
|
|
{
|
|
_e_desklock_backspace();
|
|
}
|