summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordiscomfitor <michael.blumenkrantz@gmail.com>2013-10-26 18:02:20 +0100
committerMike Blumenkrantz <m.blumenkran@samsung.com>2013-10-28 13:23:33 +0000
commit88bab55551b7631cd048f851291af150218e0c86 (patch)
treeb2fe42a4f7074d23aaf2aadc1ce593f3e26601d6
parenta43b61ef464e303633b03b6bf310eae0bcd36c6a (diff)
downloadenlightenment-88bab55551b7631cd048f851291af150218e0c86.tar.gz
feature: add PIN-style desklock for lokker module
requires that the user configure the PIN through the lokker config dialog, which is separate from the main desklock config dialog: B- for usability.
-rw-r--r--data/themes/edc/desklock.edc121
-rw-r--r--data/themes/edc/syscon.edc1
-rw-r--r--src/bin/e_config.c1
-rw-r--r--src/bin/e_config.h1
-rw-r--r--src/modules/Makefile_lokker.mk1
-rw-r--r--src/modules/lokker/e_mod_config.c124
-rw-r--r--src/modules/lokker/e_mod_main.c9
-rw-r--r--src/modules/lokker/e_mod_main.h9
-rw-r--r--src/modules/lokker/lokker.c240
9 files changed, 491 insertions, 16 deletions
diff --git a/data/themes/edc/desklock.edc b/data/themes/edc/desklock.edc
index 45cbbc9aa4..a7577a89a5 100644
--- a/data/themes/edc/desklock.edc
+++ b/data/themes/edc/desklock.edc
@@ -299,3 +299,124 @@ group { name: "e/desklock/login_box";
}
}
}
+
+group { name: "e/desklock/pin_box";
+ parts {
+ part { name: "e.text.title"; type: TEXT;
+ effect: SHADOW BOTTOM;
+ scale: 1;
+ description { state: "default" 0.0;
+ rel1.offset: 3 3;
+ rel1.relative: 0.0 1.0;
+ rel1.to_y: "e.swallow.buttons";
+ rel2.offset: -4 -3;
+ color: 255 255 255 255;
+ color3: 0 0 0 128;
+ align: 0.5 0.0;
+ text { font: "Sans:style=Bold"; size: 10;
+ min: 0 1;
+ align: 0.5 0.5;
+ text_class: "desklock_title";
+ text: "Please enter your PIN";
+ }
+ fixed: 0 1;
+ }
+ }
+ part { name: "selection"; type: RECT; mouse_events: 0;
+ description { state: "default" 0.0;
+ rel1.to: "e.text.password";
+ rel2.to: "e.text.password";
+ color: 51 153 255 255;
+ visible: 0;
+ }
+ description { state: "active" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part { name: "e.text.password"; type: TEXT;
+ effect: SHADOW BOTTOM;
+ scale: 1;
+ description { state: "default" 0.0;
+ rel1.relative: 0.5 0.0;
+ rel1.offset: 3 2;
+ rel2.relative: 0.5 0.0;
+ rel2.offset: 3 -2;
+ color: 255 255 255 255;
+ color3: 0 0 0 128;
+ color_class: "desklock_passwd";
+ text { font: "Sans"; size: 10;
+ min: 1 1;
+ align: 1.0 0.5;
+ text_class: "desklock_passwd";
+ }
+ fixed: 1 1;
+ }
+ }
+ part { name: "cursor"; mouse_events: 0;
+ description { state: "default" 0.0;
+ rel1.to: "e.text.password";
+ rel1.relative: 1.0 0.0;
+ rel1.offset: -4 -4;
+ rel2.to: "e.text.password";
+ rel2.offset: 3 3;
+ image.normal: "white_bar_vert_glow.png";
+ image.border: 4 4 4 4;
+ fill.smooth: 0;
+ color: 255 255 255 0;
+ min: 9 10;
+ fixed: 1 1;
+ }
+ description { state: "visible" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 255;
+ }
+ }
+ part { name: "button_clip"; type: RECT;
+ description { state: "default";
+ color: 255 255 255 255;
+ }
+ }
+ part { name: "e.swallow.buttons"; type: SWALLOW;
+ clip_to: "button_clip";
+ description { state: "default";
+ rel1.relative: 0 1.0;
+ rel1.to_y: "e.text.password";
+ rel1.offset: 0 2;
+ align: 0.5 1.0;
+ }
+ }
+ }
+ programs {
+ program { name: "cursor_show";
+ signal: "show"; source: "";
+ action: STATE_SET "visible" 0.0;
+ target: "cursor";
+ after: "cursor_show_timer";
+ }
+ program { name: "cursor_hide";
+ action: STATE_SET "default" 0.0;
+ target: "cursor";
+ transition: SINUSOIDAL 0.2;
+ after: "cursor_hide_timer";
+ }
+ program { name: "cursor_show_timer";
+ in: 0.5 0.0;
+ after: "cursor_hide";
+ }
+ program { name: "cursor_hide_timer";
+ in: 0.2 0.0;
+ after: "cursor_show";
+ }
+ program {
+ signal: "e,state,selected"; source: "e";
+ action: STATE_SET "active" 0.0;
+ target: "selection";
+ }
+ program {
+ signal: "e,state,unselected"; source: "e";
+ action: STATE_SET "default" 0.0;
+ target: "selection";
+ }
+ }
+}
diff --git a/data/themes/edc/syscon.edc b/data/themes/edc/syscon.edc
index 3f5cc8ceab..a41d39dc03 100644
--- a/data/themes/edc/syscon.edc
+++ b/data/themes/edc/syscon.edc
@@ -116,6 +116,7 @@ group { name: "e/widgets/syscon/main";
}
group { name: "e/widgets/syscon/item/button";
+ alias: "e/desklock/pin_button";
images.image: "button_normal.png" COMP;
images.image: "button_clicked.png" COMP;
parts {
diff --git a/src/bin/e_config.c b/src/bin/e_config.c
index 91e57ceb78..35808ffe56 100644
--- a/src/bin/e_config.c
+++ b/src/bin/e_config.c
@@ -569,6 +569,7 @@ _e_config_edd_init(Eina_Bool old)
E_CONFIG_LIST(D, T, shelves, _e_config_shelf_edd);
E_CONFIG_VAL(D, T, font_hinting, INT); /**/
E_CONFIG_VAL(D, T, desklock_passwd, INT);
+ E_CONFIG_VAL(D, T, desklock_pin, INT);
E_CONFIG_LIST(D, T, desklock_backgrounds, _e_config_desklock_bg_edd); /**/
E_CONFIG_VAL(D, T, desklock_auth_method, INT);
E_CONFIG_VAL(D, T, desklock_login_box_zone, INT);
diff --git a/src/bin/e_config.h b/src/bin/e_config.h
index 9d8bc725dc..8a11fb0638 100644
--- a/src/bin/e_config.h
+++ b/src/bin/e_config.h
@@ -207,6 +207,7 @@ struct _E_Config
int font_hinting; // GUI
int desklock_passwd; // GUI // hashed
+ int desklock_pin; // GUI // hashed
Eina_List *desklock_backgrounds; // GUI
int desklock_auth_method; // GUI
int desklock_login_box_zone; // GUI
diff --git a/src/modules/Makefile_lokker.mk b/src/modules/Makefile_lokker.mk
index 7e7a763909..ba79573bf1 100644
--- a/src/modules/Makefile_lokker.mk
+++ b/src/modules/Makefile_lokker.mk
@@ -15,6 +15,7 @@ src_modules_lokker_module_la_LIBADD = $(MOD_LIBS) \
src_modules_lokker_module_la_LDFLAGS = $(MOD_LDFLAGS)
src_modules_lokker_module_la_SOURCES = src/modules/lokker/e_mod_main.c \
+src/modules/lokker/e_mod_config.c \
src/modules/lokker/lokker.c \
src/modules/lokker/e_mod_main.h
diff --git a/src/modules/lokker/e_mod_config.c b/src/modules/lokker/e_mod_config.c
new file mode 100644
index 0000000000..e71fc8fdd4
--- /dev/null
+++ b/src/modules/lokker/e_mod_config.c
@@ -0,0 +1,124 @@
+#include "e_mod_main.h"
+
+struct _E_Config_Dialog_Data
+{
+ char *pin_str;
+ int desklock_auth_method;
+ Evas_Object *passwd_entry;
+};
+
+static int
+_basic_apply(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
+{
+ if (cfdata->desklock_auth_method == E_DESKLOCK_AUTH_METHOD_PIN)
+ {
+ int test;
+ char *pp;
+
+ if ((!cfdata->pin_str) || (!cfdata->pin_str[0]))
+ {
+ if (e_config->desklock_pin)
+ {
+ e_config->desklock_auth_method = cfdata->desklock_auth_method;
+ return 1;
+ }
+ return 0;
+ }
+
+ errno = 0;
+ test = strtol(cfdata->pin_str, &pp, 10);
+ if (errno) return 0; //NAN
+ if (pp && pp[0]) return 0;
+ if (test < 1) return 0;
+ e_config->desklock_pin = eina_hash_djb2(cfdata->pin_str, strlen(cfdata->pin_str));
+ }
+ e_config->desklock_auth_method = cfdata->desklock_auth_method;
+ return 1;
+}
+
+static void
+_login_method_change(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ E_Config_Dialog_Data *cfdata = data;
+
+ e_widget_disabled_set(cfdata->passwd_entry,
+ (cfdata->desklock_auth_method != E_DESKLOCK_AUTH_METHOD_PIN));
+ if (!e_widget_disabled_get(cfdata->passwd_entry))
+ {
+ e_widget_entry_select_all(cfdata->passwd_entry);
+ e_widget_focus_set(cfdata->passwd_entry, 1);
+ }
+}
+
+static Evas_Object *
+_basic_create(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_Dialog_Data *cfdata)
+{
+ Evas_Object *ol, *ow, *of;
+ E_Radio_Group *rg;
+
+ ol = e_widget_list_add(evas, 0, 0);
+
+ rg = e_widget_radio_group_new(&(cfdata->desklock_auth_method));
+ ow = e_widget_radio_add(evas, _("Use System Authentication"), E_DESKLOCK_AUTH_METHOD_SYSTEM, rg);
+ evas_object_smart_callback_add(ow, "changed", _login_method_change, cfdata);
+ e_widget_list_object_append(ol, ow, 1, 1, 0.5);
+ ow = e_widget_radio_add(evas, _("Use Personal Screenlock Password"), E_DESKLOCK_AUTH_METHOD_PERSONAL, rg);
+ evas_object_smart_callback_add(ow, "changed", _login_method_change, cfdata);
+ e_widget_list_object_append(ol, ow, 1, 1, 0.5);
+ ow = e_widget_radio_add(evas, _("Use External Screenlock Command"), E_DESKLOCK_AUTH_METHOD_EXTERNAL, rg);
+ evas_object_smart_callback_add(ow, "changed", _login_method_change, cfdata);
+ e_widget_list_object_append(ol, ow, 1, 1, 0.5);
+ ow = e_widget_radio_add(evas, _("Use PIN authentication"), E_DESKLOCK_AUTH_METHOD_PIN, rg);
+ evas_object_smart_callback_add(ow, "changed", _login_method_change, cfdata);
+ e_widget_list_object_append(ol, ow, 1, 1, 0.5);
+
+ of = e_widget_framelist_add(evas, _("PIN Entry"), 0);
+ cfdata->passwd_entry = ow = e_widget_entry_add(evas, &(cfdata->pin_str), NULL, NULL, NULL);
+ e_widget_entry_password_set(ow, 1);
+ e_widget_framelist_object_append(of, ow);
+ e_widget_list_object_append(ol, of, 1, 1, 0.5);
+
+ e_widget_disabled_set(cfdata->passwd_entry,
+ (cfdata->desklock_auth_method != E_DESKLOCK_AUTH_METHOD_PIN));
+
+ return ol;
+}
+
+static void *
+_create_data(E_Config_Dialog *cfd EINA_UNUSED)
+{
+ E_Config_Dialog_Data *cfdata;
+
+ cfdata = E_NEW(E_Config_Dialog_Data, 1);
+ cfdata->desklock_auth_method = e_config->desklock_auth_method;
+ return cfdata;
+}
+
+static void
+_free_data(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
+{
+ free(cfdata->pin_str);
+ free(cfdata);
+}
+
+E_Config_Dialog *
+e_int_config_lokker(E_Comp *comp, const char *params EINA_UNUSED)
+{
+ E_Config_Dialog *cfd;
+ E_Config_Dialog_View *v;
+
+ if (e_config_dialog_find("E", "screen/screen_lock_advanced")) return NULL;
+ v = E_NEW(E_Config_Dialog_View, 1);
+ if (!v) return NULL;
+
+ v->create_cfdata = _create_data;
+ v->free_cfdata = _free_data;
+ v->basic.create_widgets = _basic_create;
+ v->basic.apply_cfdata = _basic_apply;
+ v->override_auto_apply = 1;
+
+ cfd = e_config_dialog_new(comp, _("Screen Lock Externals"), "E",
+ "screen/screen_lock_advanced", "preferences-system-lock-screen",
+ 0, v, NULL);
+ return cfd;
+}
diff --git a/src/modules/lokker/e_mod_main.c b/src/modules/lokker/e_mod_main.c
index 740a5e0538..e9d946cf32 100644
--- a/src/modules/lokker/e_mod_main.c
+++ b/src/modules/lokker/e_mod_main.c
@@ -7,6 +7,12 @@ EAPI E_Module_Api e_modapi = {E_MODULE_API_VERSION, "Lokker"};
EAPI void *
e_modapi_init(E_Module *m)
{
+ e_configure_registry_category_add("screen", 30, _("Screen"), NULL,
+ "preferences-desktop-display");
+ e_configure_registry_item_add("screen/screen_lock_advanced", 30,
+ _("Screen Lock Externals"), NULL,
+ "preferences-system-lock-screen",
+ e_int_config_lokker);
_e_lokker_log_dom = eina_log_domain_register("lokker", EINA_COLOR_ORANGE);
eina_log_domain_level_set("lokker", EINA_LOG_LEVEL_DBG);
@@ -28,5 +34,8 @@ e_modapi_shutdown(E_Module *m EINA_UNUSED)
eina_log_domain_unregister(_e_lokker_log_dom);
_e_lokker_log_dom = -1;
+ e_configure_registry_item_del("screen/screen_lock_advanced");
+ e_configure_registry_category_del("screen");
+
return 1;
}
diff --git a/src/modules/lokker/e_mod_main.h b/src/modules/lokker/e_mod_main.h
index 7b885254c1..c1c9726a04 100644
--- a/src/modules/lokker/e_mod_main.h
+++ b/src/modules/lokker/e_mod_main.h
@@ -18,7 +18,14 @@
#define ERR(...) EINA_LOG_DOM_ERR(_e_lokker_log_dom, __VA_ARGS__)
#define CRIT(...) EINA_LOG_DOM_CRIT(_e_lokker_log_dom, __VA_ARGS__)
+
+typedef enum
+{
+ E_DESKLOCK_AUTH_METHOD_PIN = 3,
+ E_DESKLOCK_AUTH_METHOD_LINES = 4,
+} E_Desklock_Auth_Method2;
+
EINTERN Eina_Bool lokker_lock(void);
EINTERN void lokker_unlock(void);
-
+EAPI E_Config_Dialog *e_int_config_lokker(E_Comp *comp, const char *params EINA_UNUSED);
#endif
diff --git a/src/modules/lokker/lokker.c b/src/modules/lokker/lokker.c
index d42c0b9d29..a4f8b08986 100644
--- a/src/modules/lokker/lokker.c
+++ b/src/modules/lokker/lokker.c
@@ -34,6 +34,14 @@ static E_Zone *last_active_zone = NULL;
static Lokker_Data *edd = NULL;
+static int _lokker_check_auth(void);
+
+static Eina_Bool
+lokker_is_pin(void)
+{
+ return e_config->desklock_auth_method == E_DESKLOCK_AUTH_METHOD_PIN;
+}
+
static int
_zone_count_get(void)
{
@@ -156,6 +164,147 @@ _lokker_delete(void)
_lokker_backspace();
}
+static Eina_Bool
+_pin_mouse_button_down(Lokker_Popup *lp, int t EINA_UNUSED, Ecore_Event_Mouse_Button *ev)
+{
+ Evas *e;
+
+ if (ev->buttons != 1) return ECORE_CALLBACK_DONE;
+ e = e_comp_get(lp->zone)->evas;
+ evas_event_feed_mouse_move(e,
+ e_comp_canvas_x_root_adjust(lp->zone->comp, ev->root.x),
+ e_comp_canvas_y_root_adjust(lp->zone->comp, ev->root.y),
+ 0, NULL);
+ evas_event_feed_mouse_down(e, 1, 0, 0, NULL);
+ return ECORE_CALLBACK_RENEW;
+}
+
+static Eina_Bool
+_pin_mouse_button_up(Lokker_Popup *lp, int t EINA_UNUSED, Ecore_Event_Mouse_Button *ev)
+{
+ if (ev->buttons != 1) return ECORE_CALLBACK_DONE;
+ evas_event_feed_mouse_up(evas_object_evas_get(lp->comp_object), 1, 0, 0, NULL);
+ return ECORE_CALLBACK_RENEW;
+}
+
+static void
+_pin_click(void *data EINA_UNUSED, Evas_Object *obj, const char *sig EINA_UNUSED, const char *src EINA_UNUSED)
+{
+ const char *name;
+ int num;
+
+ name = edje_object_part_text_get(obj, "e.text.label");
+ if (!name) //wtf
+ return;
+ if (!e_util_strcmp(name, "Login"))
+ {
+ _lokker_check_auth();
+ return;
+ }
+ if (!e_util_strcmp(name, "Delete"))
+ {
+ _lokker_backspace();
+ return;
+ }
+ num = strtol(name, NULL, 10);
+ if (num < 0) return;
+ if (num > 9) return;
+ if (edd->selected)
+ {
+ _lokker_null();
+ _lokker_unselect();
+ }
+ if ((strlen(edd->passwd) < (PASSWD_LEN - strlen(name))))
+ {
+ strcat(edd->passwd, name);
+ _text_passwd_update();
+ }
+}
+
+static void
+_pin_box_add(Lokker_Popup *lp)
+{
+ int mw, mh;
+ Evas *evas;
+ Evas_Object *table, *o, *o2;
+ int x, a = 0, b = 0;
+
+ evas = evas_object_evas_get(lp->bg_object);
+ lp->login_box = edje_object_add(evas);
+ evas_object_name_set(lp->login_box, "desklock->login_box");
+ e_theme_edje_object_set(lp->login_box,
+ "base/theme/desklock",
+ "e/desklock/pin_box");
+ edje_object_part_text_set(lp->login_box, "e.text.title",
+ _("Please enter your PIN"));
+ table = e_table_add(evas);
+ e_comp_object_util_del_list_append(lp->login_box, table);
+ e_table_homogenous_set(table, 1);
+ e_table_freeze(table);
+ for (x = 1; x < 11; x++)
+ {
+ char buf[8];
+
+ o = edje_object_add(evas);
+ e_comp_object_util_del_list_append(lp->login_box, o);
+ e_theme_edje_object_set(o, "base/theme/desklock", "e/desklock/pin_button");
+ snprintf(buf, sizeof(buf), "%d", x % 10);
+ edje_object_part_text_set(o, "e.text.label", buf);
+ evas_object_show(o);
+ edje_object_signal_callback_add(o, "e,action,click", "*", _pin_click, lp);
+ if (x == 10) a = 1;
+ e_table_pack(table, o, a, b, 1, 1);
+ e_table_pack_options_set(o, 1, 1, 0, 0, 0.5, 0.5,
+ 48 * e_scale, 48 * e_scale, 48 * e_scale, 48 * e_scale);
+ if (++a >= 3)
+ {
+ a = 0;
+ b++;
+ }
+ }
+
+ /* delete */
+ o = edje_object_add(evas);
+ e_comp_object_util_del_list_append(lp->login_box, o);
+ e_theme_edje_object_set(o, "base/theme/desklock", "e/desklock/pin_button");
+ edje_object_part_text_set(o, "e.text.label", "Delete");
+ o2 = e_icon_add(evas);
+ e_comp_object_util_del_list_append(lp->login_box, o2);
+ e_util_icon_theme_set(o2, "list-remove");
+ edje_object_part_swallow(o, "e.swallow.icon", o2);
+ evas_object_show(o2);
+ evas_object_show(o);
+ edje_object_signal_callback_add(o, "e,action,click", "*", _pin_click, lp);
+ e_table_pack(table, o, 0, 3, 1, 1);
+ e_table_pack_options_set(o, 1, 1, 0, 0, 0.5, 0.5,
+ 48 * e_scale, 48 * e_scale, 48 * e_scale, 48 * e_scale);
+
+ /* login */
+ o = edje_object_add(evas);
+ e_comp_object_util_del_list_append(lp->login_box, o);
+ e_theme_edje_object_set(o, "base/theme/desklock", "e/desklock/pin_button");
+ edje_object_part_text_set(o, "e.text.label", "Login");
+ o2 = e_icon_add(evas);
+ e_comp_object_util_del_list_append(lp->login_box, o2);
+ e_util_icon_theme_set(o2, "preferences-applications-screen-unlock");
+ edje_object_part_swallow(o, "e.swallow.icon", o2);
+ evas_object_show(o2);
+ evas_object_show(o);
+ edje_object_signal_callback_add(o, "e,action,click", "*", _pin_click, lp);
+ e_table_pack(table, o, 2, 3, 1, 1);
+ e_table_pack_options_set(o, 1, 1, 0, 0, 0.5, 0.5,
+ 48 * e_scale, 48 * e_scale, 48 * e_scale, 48 * e_scale);
+
+ e_table_thaw(table);
+ evas_object_show(table);
+ e_table_size_min_get(table, &mw, &mh);
+ edje_extern_object_min_size_set(table, mw, mh);
+ edje_extern_object_max_size_set(table, mw, mh);
+ edje_object_part_swallow(lp->login_box, "e.swallow.buttons", table);
+ edje_object_size_min_calc(lp->login_box, &mw, &mh);
+ edje_extern_object_min_size_set(lp->login_box, mw, mh);
+ edje_extern_object_max_size_set(lp->login_box, mw, mh);
+}
static void
_text_login_box_add(Lokker_Popup *lp)
@@ -205,10 +354,13 @@ _text_login_box_add(Lokker_Popup *lp)
static void
_lokker_popup_add(E_Zone *zone)
{
+ E_Zone *current_zone;
+ int total_zone_num;
Lokker_Popup *lp;
E_Config_Desklock_Background *cbg;
Eina_Stringshare *bg;
Evas *evas;
+ int nocreate = 0;
lp = E_NEW(Lokker_Popup, 1);
cbg = eina_list_nth(e_config->desklock_backgrounds, zone->num);
@@ -265,7 +417,37 @@ _lokker_popup_add(E_Zone *zone)
evas_object_layer_set(lp->comp_object, E_LAYER_DESKLOCK);
evas_object_clip_set(lp->comp_object, lp->zone->bg_clip_object);
- _text_login_box_add(lp);
+ last_active_zone = current_zone = e_util_zone_current_get(e_manager_current_get());
+ total_zone_num = _zone_count_get();
+ if (total_zone_num > 1)
+ {
+ if ((e_config->desklock_login_box_zone == -2) && (zone != current_zone))
+ nocreate = 1;
+ else if ((e_config->desklock_login_box_zone > -1) && (e_config->desklock_login_box_zone != (int)eina_list_count(edd->elock_wnd_list)))
+ nocreate = 1;
+ }
+
+ if (!nocreate)
+ {
+ switch (e_config->desklock_auth_method)
+ {
+ case E_DESKLOCK_AUTH_METHOD_SYSTEM:
+ case E_DESKLOCK_AUTH_METHOD_PERSONAL:
+ _text_login_box_add(lp);
+ break;
+ case E_DESKLOCK_AUTH_METHOD_PIN:
+ _pin_box_add(lp);
+ edje_object_part_swallow(lp->bg_object, "e.swallow.login_box", lp->login_box);
+
+ evas_object_clip_set(lp->login_box, lp->zone->bg_clip_object);
+
+ E_LIST_HANDLER_APPEND(edd->handlers, ECORE_EVENT_MOUSE_BUTTON_DOWN, _pin_mouse_button_down, lp);
+ E_LIST_HANDLER_APPEND(edd->handlers, ECORE_EVENT_MOUSE_BUTTON_UP, _pin_mouse_button_up, lp);
+ break;
+ case E_DESKLOCK_AUTH_METHOD_EXTERNAL: //handled by e_desklock
+ default: break;
+ }
+ }
evas_event_thaw(evas);
@@ -436,8 +618,7 @@ static int
_lokker_check_auth(void)
{
if (!edd) return 0;
-#ifdef HAVE_PAM
- if (e_config->desklock_auth_method == 0)
+ if (e_desklock_is_system())
{
int ret;
@@ -446,22 +627,32 @@ _lokker_check_auth(void)
_lokker_null();
return ret;
}
- else if (e_config->desklock_auth_method == 1)
+ else if (e_desklock_is_personal())
{
-#endif
- if ((e_config->desklock_passwd) && (edd->passwd && edd->passwd[0]) &&
- (e_config->desklock_passwd == eina_hash_djb2(edd->passwd, strlen(edd->passwd))))
+ if ((e_config->desklock_passwd) && (edd->passwd && edd->passwd[0]) &&
+ (e_config->desklock_passwd == eina_hash_djb2(edd->passwd, strlen(edd->passwd))))
+ {
+ /* password ok */
+ /* security - null out passwd string once we are done with it */
+ _lokker_null();
+ e_desklock_hide();
+ return 1;
+ }
+ }
+ else if (lokker_is_pin())
{
- /* password ok */
- /* security - null out passwd string once we are done with it */
- _lokker_null();
- e_desklock_hide();
- return 1;
+ if (edd->passwd && edd->passwd[0])
+ {
+ if (eina_hash_djb2(edd->passwd, strlen(edd->passwd)) ==
+ e_config->desklock_pin)
+ {
+ _lokker_null();
+ e_desklock_hide();
+ return 1;
+ }
+ }
}
-#ifdef HAVE_PAM
-}
-#endif
/* password is definitely wrong */
_lokker_state_set(LOKKER_STATE_INVALID);
_lokker_null();
@@ -518,6 +709,16 @@ _lokker_cb_key_down(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
/* here we have to grab a password */
if (ev->compose)
{
+ if (lokker_is_pin())
+ {
+ /* block non-digits */
+ const char *c;
+
+ for (c = ev->compose; c[0]; c++)
+ {
+ if (!isdigit(c[0])) return ECORE_CALLBACK_RENEW;
+ }
+ }
if (edd->selected)
{
_lokker_null();
@@ -542,6 +743,15 @@ lokker_lock(void)
E_Comp *comp;
if (edd) return EINA_TRUE;
+
+ if (lokker_is_pin())
+ {
+ if (!e_config->desklock_pin)
+ {
+ e_configure_registry_call("screen/screen_lock_advanced", NULL, NULL);
+ return EINA_FALSE;
+ }
+ }
edd = E_NEW(Lokker_Data, 1);
if (!edd) return EINA_FALSE;