More work on Desktop Locking.

* now multiple zones are supported.


SVN revision: 20806
This commit is contained in:
sndev 2006-02-26 21:42:19 +00:00 committed by sndev
parent d97cd2e101
commit 6491c0bad9
1 changed files with 132 additions and 155 deletions

View File

@ -7,22 +7,24 @@
/**************************** private data ******************************/ /**************************** private data ******************************/
static Ecore_X_Window elock_wnd = 0; typedef struct _E_Desklock_Data E_Desklock_Data;
static Evas_List *handlers = NULL; typedef struct _E_Desklock_Popup_Data E_Desklock_Popup_Data;
static E_Popup *elock_wnd_popup = NULL; struct _E_Desklock_Popup_Data
static Evas_Object *bg_object = NULL; {
E_Popup *popup_wnd;
Evas_Object *bg_object;
};
struct _E_Desklock_Data struct _E_Desklock_Data
{ {
Evas_List *elock_wnd_list;
Ecore_X_Window elock_wnd; Ecore_X_Window elock_wnd;
Evas_List *handlers; Evas_List *handlers;
Evas_List *popus_wnd; char passwd[PASSWD_LEN];
Evas_Object *bg_object;
}; };
//static Evas_Object *passwd_entry = NULL;
static char passwd[PASSWD_LEN]=""; static E_Desklock_Data *edd = NULL;
/***********************************************************************/ /***********************************************************************/
@ -39,178 +41,132 @@ static void _e_desklock_delete();
EAPI int EAPI int
e_desklock_show(void) e_desklock_show(void)
{ {
//Evas_List *managers, *l, *l2, *l3; Evas_List *managers, *l, *l2, *l3;
Evas_Object *eo; //E_Zone *zone = NULL;
int m = 0, c = 0, z = 0;
E_Zone *zone = NULL;
/*e_error_dialog_show(_("Enlightenment Desktop Lock!"), E_Desklock_Popup_Data *edp;
_("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())); if (!edd)
{ {
elock_wnd = ecore_x_window_input_new(zone->container->win, 0, 0, 1, 1); edd = E_NEW(E_Desklock_Data, 1);
ecore_x_window_show(elock_wnd); if (!edd) return 0;
e_grabinput_get(elock_wnd, 0, elock_wnd); edd->elock_wnd_list = NULL;
edd->elock_wnd = 0;
edd->handlers = NULL;
edd->passwd[0] = 0;
}
elock_wnd_popup = e_popup_new(zone, zone->x, zone->y, zone->w, zone->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, zone->x, zone->y, zone->w, zone->h);
evas_object_move(bg_object, 0, 0);
evas_object_resize(bg_object, zone->w, zone->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);
}
/*
managers = e_manager_list(); managers = e_manager_list();
for (l = managers; l; l = l->next) for (l = managers; l; l = l->next)
{ {
E_Manager *man; E_Manager *man;
m ++;
man = l->data; man = l->data;
for (l2 = man->containers; l2; l2 = l2->next) for (l2 = man->containers; l2; l2 = l2->next)
{ {
E_Container *con; E_Container *con;
c ++;
con = l2->data; con = l2->data;
for (l3 = con->zones; l3; l3 = l3->next) for (l3 = con->zones; l3; l3 = l3->next)
{ {
E_Zone *zone; E_Zone *zone;
zone = l3->data; zone = l3->data;
if (!edd->elock_wnd)
{
edd->elock_wnd = ecore_x_window_input_new(zone->container->win, 0, 0, 1, 1);
ecore_x_window_show(edd->elock_wnd);
e_grabinput_get(edd->elock_wnd, 0, edd->elock_wnd);
}
edp = E_NEW(E_Desklock_Popup_Data, 1);
if (edp)
{
edp->popup_wnd = e_popup_new(zone, 0, 0, zone->w, zone->h);
evas_event_feed_mouse_move(edp->popup_wnd->evas, -1000000, -1000000,
ecore_x_current_time_get(), NULL);
input_window = ecore_x_window_input_new(zone->container->win, 0, 0, 1, 1); e_popup_layer_set(edp->popup_wnd, ELOCK_POPUP_LAYER);
ecore_x_window_show(input_window);
//e_grabinput_get(input_window, 0, input_window);
x = zone->x + 20; evas_event_freeze(edp->popup_wnd->evas);
y = zone->y + 20 + ((zone->h - 20 - 20 - 20)/ 2); edp->bg_object = edje_object_add(edp->popup_wnd->evas);
w = zone->w - 20 - 20; //FIXME: This should come from config file
h = 20; e_theme_edje_object_set(edp->bg_object, "base/theme/desklock",
"widgets/desklock/main");
elock_wnd = e_popup_new(zone, 100, 100, 400, 300); evas_object_move(edp->bg_object, 0, 0);
evas_event_feed_mouse_move(elock_wnd->evas, -1000000, -1000000, evas_object_resize(edp->bg_object, zone->w, zone->h);
ecore_x_current_time_get(), NULL); evas_object_show(edp->bg_object);
e_popup_edje_bg_object_set(edp->popup_wnd, edp->bg_object);
evas_event_thaw(edp->popup_wnd->evas);
e_popup_layer_set(elock_wnd, ELOCK_POPUP_LAYER); e_popup_show(edp->popup_wnd);
evas_event_freeze(elock_wnd->evas); edd->elock_wnd_list = evas_list_append(edd->elock_wnd_list, edp);
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);
} }
} }
}*/ }
/* handlers */
edd->handlers = evas_list_append(edd->handlers,
ecore_event_handler_add(ECORE_X_EVENT_KEY_DOWN,
_e_desklock_cb_key_down, NULL));
edd->handlers = evas_list_append(edd->handlers,
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_DOWN,
_e_desklock_cb_mouse_down, NULL));
edd->handlers = evas_list_append(edd->handlers,
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP,
_e_desklock_cb_mouse_up, NULL));
edd->handlers = evas_list_append(edd->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_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(); _e_desklock_passwd_update();
return 1; return 1;
} }
EAPI void EAPI void
e_desklock_hide(void) e_desklock_hide(void)
{ {
if (!elock_wnd_popup) return; E_Desklock_Popup_Data *edp;
evas_event_freeze(elock_wnd_popup->evas); if (!edd) return;
e_popup_hide(elock_wnd_popup); while (edd->elock_wnd_list)
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); edp = edd->elock_wnd_list->data;
handlers = evas_list_remove_list(handlers, handlers); if (edp)
} {
ecore_x_window_del(elock_wnd); e_popup_hide(edp->popup_wnd);
e_grabinput_release(elock_wnd, elock_wnd);
elock_wnd = 0;
memset(passwd, 0, sizeof(char) * PASSWD_LEN); evas_event_freeze(edp->popup_wnd->evas);
evas_object_del(edp->bg_object);
evas_event_thaw(edp->popup_wnd->evas);
e_object_del(E_OBJECT(edp->popup_wnd));
E_FREE(edp);
}
edd->elock_wnd_list = evas_list_remove_list(edd->elock_wnd_list, edd->elock_wnd_list);
}
while (edd->handlers)
{
ecore_event_handler_del(edd->handlers->data);
edd->handlers = evas_list_remove_list(edd->handlers, edd->handlers);
}
e_grabinput_release(edd->elock_wnd, edd->elock_wnd);
ecore_x_window_del(edd->elock_wnd);
E_FREE(edd);
edd = NULL;
} }
static int static int
@ -219,28 +175,36 @@ _e_desklock_cb_key_down(void *data, int type, void *event)
Ecore_X_Event_Key_Down *ev; Ecore_X_Event_Key_Down *ev;
ev = event; ev = event;
if (ev->win != elock_wnd) return 1; if (ev->win != edd->elock_wnd) return 1;
if (!strcmp(ev->keysymbol, "Escape")) if (!strcmp(ev->keysymbol, "Escape"))
; ;
else if (!strcmp(ev->keysymbol, "KP_Enter")) else if (!strcmp(ev->keysymbol, "KP_Enter"))
{ {
// here we have to go to auth // here we have to go to auth
if (strcmp(passwd, e_config->desklock_personal_passwd) == 0) if (strcmp(edd->passwd, e_config->desklock_personal_passwd) == 0)
{
e_desklock_hide(); e_desklock_hide();
return 1;
}
else else
; // report about invalid password ; // report about invalid password
memset(passwd, 0, sizeof(char) * PASSWD_LEN);
memset(edd->passwd, 0, sizeof(char) * PASSWD_LEN);
_e_desklock_passwd_update(); _e_desklock_passwd_update();
} }
else if (!strcmp(ev->keysymbol, "Return")) else if (!strcmp(ev->keysymbol, "Return"))
{ {
// here we have to go to auth // here we have to go to auth
if (strcmp(passwd, e_config->desklock_personal_passwd) == 0) if (strcmp(edd->passwd, e_config->desklock_personal_passwd) == 0)
{
e_desklock_hide(); e_desklock_hide();
return 1;
}
else else
; // report about invalid password ; // report about invalid password
memset(passwd, 0, sizeof(char) * PASSWD_LEN);
memset(edd->passwd, 0, sizeof(char) * PASSWD_LEN);
_e_desklock_passwd_update(); _e_desklock_passwd_update();
} }
else if (!strcmp(ev->keysymbol, "BackSpace")) else if (!strcmp(ev->keysymbol, "BackSpace"))
@ -252,9 +216,9 @@ _e_desklock_cb_key_down(void *data, int type, void *event)
// here we have to grab a password // here we have to grab a password
if (ev->key_compose) if (ev->key_compose)
{ {
if ((strlen(passwd) < (PASSWD_LEN - strlen(ev->key_compose)))) if ((strlen(edd->passwd) < (PASSWD_LEN - strlen(ev->key_compose))))
{ {
strcat(passwd, ev->key_compose); strcat(edd->passwd, ev->key_compose);
_e_desklock_passwd_update(); _e_desklock_passwd_update();
} }
} }
@ -312,13 +276,22 @@ _e_desklock_passwd_update()
{ {
int ii; int ii;
char passwd_hidden[PASSWD_LEN * 3]=""; char passwd_hidden[PASSWD_LEN * 3]="";
E_Desklock_Popup_Data *edp;
Evas_List *l;
for (ii = 0; ii < strlen(passwd); ii ++) if (!edd) return;
for (ii = 0; ii < strlen(edd->passwd); ii ++)
{ {
strcat(passwd_hidden, "*"); passwd_hidden[ii] = '*';
passwd_hidden[ii+1] = 0;
} }
edje_object_part_text_set(bg_object, "passwd", passwd_hidden);
/*edje_object_part_text_set(bg_object, "passwd", passwd);*/ for (l = edd->elock_wnd_list; l; l = l->next)
{
edp = l->data;
edje_object_part_text_set(edp->bg_object, "passwd", passwd_hidden);
}
return; return;
} }
@ -327,13 +300,15 @@ _e_desklock_backspace()
{ {
int len, val, pos; int len, val, pos;
len = strlen(passwd); if (!edd) return;
len = strlen(edd->passwd);
if (len > 0) if (len > 0)
{ {
pos = evas_string_char_prev_get(passwd, len, &val); pos = evas_string_char_prev_get(edd->passwd, len, &val);
if ((pos < len) && (pos >= 0)) if ((pos < len) && (pos >= 0))
{ {
passwd[pos] = 0; edd->passwd[pos] = 0;
_e_desklock_passwd_update(); _e_desklock_passwd_update();
} }
} }
@ -343,3 +318,5 @@ _e_desklock_delete()
{ {
_e_desklock_backspace(); _e_desklock_backspace();
} }