diff options
author | discomfitor <michael.blumenkrantz@gmail.com> | 2013-10-26 18:02:20 +0100 |
---|---|---|
committer | Mike Blumenkrantz <m.blumenkran@samsung.com> | 2013-10-28 13:23:33 +0000 |
commit | 88bab55551b7631cd048f851291af150218e0c86 (patch) | |
tree | b2fe42a4f7074d23aaf2aadc1ce593f3e26601d6 | |
parent | a43b61ef464e303633b03b6bf310eae0bcd36c6a (diff) | |
download | enlightenment-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.edc | 121 | ||||
-rw-r--r-- | data/themes/edc/syscon.edc | 1 | ||||
-rw-r--r-- | src/bin/e_config.c | 1 | ||||
-rw-r--r-- | src/bin/e_config.h | 1 | ||||
-rw-r--r-- | src/modules/Makefile_lokker.mk | 1 | ||||
-rw-r--r-- | src/modules/lokker/e_mod_config.c | 124 | ||||
-rw-r--r-- | src/modules/lokker/e_mod_main.c | 9 | ||||
-rw-r--r-- | src/modules/lokker/e_mod_main.h | 9 | ||||
-rw-r--r-- | src/modules/lokker/lokker.c | 240 |
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; |