From 9ab2777707c56ff8a74aa2f93434ca098d70efd5 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Fri, 3 Mar 2006 06:00:18 +0000 Subject: [PATCH] desklock lets you auto-lock if the screensaver kicks in and set the timeout for the screensaver (optionally). SVN revision: 20937 --- src/bin/e_config.c | 12 ++ src/bin/e_config.h | 6 +- src/bin/e_desklock.c | 38 +++-- src/bin/e_int_config_desklock.c | 274 ++++++++++++++++++-------------- src/bin/e_manager.c | 22 +++ 5 files changed, 209 insertions(+), 143 deletions(-) diff --git a/src/bin/e_config.c b/src/bin/e_config.c index 777394eeb..d83daf074 100644 --- a/src/bin/e_config.c +++ b/src/bin/e_config.c @@ -462,6 +462,10 @@ e_config_init(void) E_CONFIG_VAL(D, T, desklock_personal_passwd, STR); E_CONFIG_VAL(D, T, desklock_background, STR); E_CONFIG_VAL(D, T, desklock_login_box_zone, INT); + E_CONFIG_VAL(D, T, desklock_autolock, INT); + E_CONFIG_VAL(D, T, desklock_use_timeout, INT); + E_CONFIG_VAL(D, T, desklock_timeout, DOUBLE); + E_CONFIG_VAL(D, T, desklock_disable_screensaver, INT); e_config = e_config_domain_load("e", _e_config_edd); if (e_config) @@ -618,6 +622,10 @@ e_config_init(void) e_config->desklock_personal_passwd = NULL; e_config->desklock_background = NULL; e_config->desklock_login_box_zone = -1; + e_config->desklock_autolock = 0; + e_config->desklock_use_timeout = 0; + e_config->desklock_timeout = 300.0; + e_config->desklock_disable_screensaver = 0; /* FIXME: fill up default gadcons! */ { @@ -1680,6 +1688,10 @@ e_config_init(void) E_CONFIG_LIMIT(e_config->cfgdlg_default_mode, 0, 1); E_CONFIG_LIMIT(e_config->font_hinting, 0, 2); E_CONFIG_LIMIT(e_config->desklock_login_box_zone, -2, 1000); + E_CONFIG_LIMIT(e_config->desklock_autolock, 0, 1); + E_CONFIG_LIMIT(e_config->desklock_use_timeout, 0, 1); + E_CONFIG_LIMIT(e_config->desklock_timeout, 1.0, 600.0); + E_CONFIG_LIMIT(e_config->desklock_disable_screensaver, 0, 1); return 1; } diff --git a/src/bin/e_config.h b/src/bin/e_config.h index 81e825ab3..e96b25db0 100644 --- a/src/bin/e_config.h +++ b/src/bin/e_config.h @@ -214,7 +214,11 @@ struct _E_Config char *desklock_personal_passwd; // GUI char *desklock_background; // GUI - int desklock_login_box_zone; //GUI + int desklock_login_box_zone; // GUI + int desklock_autolock; // GUI + int desklock_use_timeout; // GUI + double desklock_timeout; // GUI + int desklock_disable_screensaver; }; struct _E_Config_Module diff --git a/src/bin/e_desklock.c b/src/bin/e_desklock.c index d4e6365e7..3ea6c4799 100644 --- a/src/bin/e_desklock.c +++ b/src/bin/e_desklock.c @@ -49,6 +49,8 @@ e_desklock_show(void) int zone_counter; int total_zone_num; + if (edd) return 0; + if (!e_config->desklock_personal_passwd) { E_Zone *zone; @@ -114,8 +116,8 @@ e_desklock_show(void) evas_event_freeze(edp->popup_wnd->evas); edp->bg_object = edje_object_add(edp->popup_wnd->evas); - if (!e_config->desklock_background || - !strcmp(e_config->desklock_background, "theme_desklock_background")) + if ((!e_config->desklock_background) || + (!strcmp(e_config->desklock_background, "theme_desklock_background"))) { e_theme_edje_object_set(edp->bg_object, "base/theme/desklock", @@ -123,9 +125,9 @@ e_desklock_show(void) } else if (!strcmp(e_config->desklock_background, "theme_background")) { - e_theme_edje_object_set(edp->bg_object, - "base/theme/backgrounds", - "desktop/background"); + e_theme_edje_object_set(edp->bg_object, + "base/theme/backgrounds", + "desktop/background"); } else { @@ -152,13 +154,12 @@ e_desklock_show(void) evas_object_move(edp->bg_object, 0, 0); evas_object_resize(edp->bg_object, zone->w, zone->h); evas_object_show(edp->bg_object); - /*edje_object_part_text_set(edp->bg_object, "title", - _("Please enter your unlock password"));*/ - - /**/ edp->login_box = edje_object_add(edp->popup_wnd->evas); e_theme_edje_object_set(edp->login_box, - "base/theme/desklock", "desklock/login_box"); + "base/theme/desklock", + "desklock/login_box"); + edje_object_part_text_set(edp->login_box, "title", + _("Please enter your unlock password")); edje_object_part_swallow(edp->bg_object, "login_box", edp->login_box); edje_object_size_min_calc(edp->login_box, &mw, &mh); evas_object_move(edp->login_box, (int)((zone->w - mw)/2), @@ -362,16 +363,13 @@ _e_desklock_idler(void *data) 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 - + if (e_config->desklock_disable_screensaver) + ecore_x_screensaver_timeout_set(0); + else + { + if (e_config->desklock_use_timeout) + ecore_x_screensaver_timeout_set(e_config->desklock_timeout); + } return 1; } diff --git a/src/bin/e_int_config_desklock.c b/src/bin/e_int_config_desklock.c index f9965a50a..74686004e 100644 --- a/src/bin/e_int_config_desklock.c +++ b/src/bin/e_int_config_desklock.c @@ -46,35 +46,35 @@ static void _e_desklock_cb_lb_show_on_specific_screen(void *data, Evas_Object *o struct _E_Config_Dialog_Data { - char *desklock_passwd; - char *desklock_passwd_cp; - int show_password; // local - - int login_box_zone; // in e_config; - int specific_lb_zone; // local variable - int specific_lb_zone_backup; // used to have smart iface - - int zone_count; // local variable; - - char *cur_bg; // local variable; - Evas *evas; // local variable - Evas_Object *preview_image; // local variable - - /*double vertical_lb_align; - double horizontal_lb_align;*/ - - - struct { - Evas_Object *passwd_field; - Evas_Object *bg_list; - - struct { - Evas_Object *show_all_screens; - Evas_Object *show_current_screen; - Evas_Object *show_specific_screen; - Evas_Object *screen_slider; - } loginbox_obj; - } gui; + char *desklock_passwd; + char *desklock_passwd_cp; + int show_password; // local + + int autolock; // in e_config; + int use_timeout; // in e_config; + double timeout; // in e_config; + + int login_box_zone; // in e_config; + int specific_lb_zone; // local variable + int specific_lb_zone_backup; // used to have smart iface + + int zone_count; // local variable; + + char *cur_bg; // local variable; + Evas *evas; // local variable + Evas_Object *preview_image; // local variable + + struct { + Evas_Object *passwd_field; + Evas_Object *bg_list; + + struct { + Evas_Object *show_all_screens; + Evas_Object *show_current_screen; + Evas_Object *show_specific_screen; + Evas_Object *screen_slider; + } loginbox_obj; + } gui; }; typedef struct _E_Widget_Entry_Data E_Widget_Entry_Data; @@ -135,43 +135,47 @@ e_int_config_desklock(E_Container *con) static void _fill_desklock_data(E_Config_Dialog_Data *cfdata) { - // we have to read it from e_config->... - if (e_config->desklock_personal_passwd) - { - cfdata->desklock_passwd = strdup(e_config->desklock_personal_passwd); - cfdata->desklock_passwd_cp = strdup(e_config->desklock_personal_passwd); - } - else - { - cfdata->desklock_passwd = strdup(""); - cfdata->desklock_passwd_cp = strdup(""); - } - - /* should be taken from e_config */ - //cfdata->login_box_on_zone = -1; - - if (e_config->desklock_login_box_zone >= 0) - { - cfdata->login_box_zone = LOGINBOX_SHOW_SPECIFIC_SCREEN; - cfdata->specific_lb_zone_backup = cfdata->specific_lb_zone = - e_config->desklock_login_box_zone; - } - else - { - cfdata->login_box_zone = e_config->desklock_login_box_zone; - cfdata->specific_lb_zone_backup = cfdata->specific_lb_zone = 0; - } - - cfdata->zone_count = _e_desklock_zone_num_get(); - - cfdata->show_password = 0; - - if (!e_config->desklock_background) - cfdata->cur_bg = strdup(DEF_DESKLOCK_BACKGROUND); - else - cfdata->cur_bg = strdup(e_config->desklock_background); - - //vertical_lb_align = e_config->desklock_login + // we have to read it from e_config->... + if (e_config->desklock_personal_passwd) + { + cfdata->desklock_passwd = strdup(e_config->desklock_personal_passwd); + cfdata->desklock_passwd_cp = strdup(e_config->desklock_personal_passwd); + } + else + { + cfdata->desklock_passwd = strdup(""); + cfdata->desklock_passwd_cp = strdup(""); + } + + cfdata->autolock = e_config->desklock_autolock; + cfdata->use_timeout = e_config->desklock_use_timeout; + cfdata->timeout = e_config->desklock_timeout; + + /* should be taken from e_config */ + //cfdata->login_box_on_zone = -1; + + if (e_config->desklock_login_box_zone >= 0) + { + cfdata->login_box_zone = LOGINBOX_SHOW_SPECIFIC_SCREEN; + cfdata->specific_lb_zone_backup = cfdata->specific_lb_zone = + e_config->desklock_login_box_zone; + } + else + { + cfdata->login_box_zone = e_config->desklock_login_box_zone; + cfdata->specific_lb_zone_backup = cfdata->specific_lb_zone = 0; + } + + cfdata->zone_count = _e_desklock_zone_num_get(); + + cfdata->show_password = 0; + + if (!e_config->desklock_background) + cfdata->cur_bg = strdup(DEF_DESKLOCK_BACKGROUND); + else + cfdata->cur_bg = strdup(e_config->desklock_background); + + //vertical_lb_align = e_config->desklock_login } static void * @@ -202,50 +206,71 @@ _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) { - if (cfdata->desklock_passwd_cp) - { - if (e_config->desklock_personal_passwd) - { - if (strcmp(e_config->desklock_personal_passwd, cfdata->desklock_passwd_cp) == 0) - return 1; + if (cfdata->desklock_passwd_cp) + { + if (e_config->desklock_personal_passwd) evas_stringshare_del(e_config->desklock_personal_passwd); - } - e_config->desklock_personal_passwd = (char *)evas_stringshare_add(cfdata->desklock_passwd_cp); - e_config_save_queue(); - } + } + e_config->desklock_personal_passwd = (char *)evas_stringshare_add(cfdata->desklock_passwd_cp); + e_config->desklock_autolock = cfdata->autolock; + e_config->desklock_use_timeout = cfdata->use_timeout; + e_config->desklock_timeout = cfdata->timeout; + if (e_config->desklock_use_timeout) + { + ecore_x_screensaver_timeout_set(e_config->desklock_timeout); + printf("%3.3f\n", e_config->desklock_timeout); + } + e_config_save_queue(); return 1; } static Evas_Object * _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) { - Evas_Object *o, *of, *ob; - E_Widget_Check_Data *wd; + Evas_Object *o, *of, *ob; + E_Widget_Check_Data *wd; + + //_fill_desklock_data(cfdata); + + o = e_widget_list_add(evas, 0, 0); + + of = e_widget_framelist_add(evas, _("Personalized Password:"), 0); + + cfdata->gui.passwd_field = ob = e_widget_entry_add(evas, &(cfdata->desklock_passwd)); + _e_desklock_passwd_cb_change(cfdata, ob); + e_widget_entry_on_change_callback_set(ob, _e_desklock_passwd_cb_change, cfdata); + e_widget_min_size_set(ob, 200, 25); + e_widget_framelist_object_append(of, ob); + + ob = e_widget_check_add(evas, _("Show Password"), &(cfdata->show_password)); + e_widget_framelist_object_append(of, ob); + + wd = (E_Widget_Check_Data*)e_widget_data_get(ob); + edje_object_signal_callback_add(wd->o_check,"toggle_on", "", _e_desklock_cb_show_passwd, cfdata); + edje_object_signal_callback_add(wd->o_check,"toggle_off", "", _e_desklock_cb_show_passwd, cfdata); + e_widget_list_object_append(o, of, 1, 1, 0.5); + + of = e_widget_framelist_add(evas, _("Automatic Locking"), 0); + + ob = e_widget_check_add(evas, _("Lock when the Screensaver starts"), &(cfdata->autolock)); + e_widget_framelist_object_append(of, ob); - //_fill_desklock_data(cfdata); - - o = e_widget_list_add(evas, 0, 0); - - of = e_widget_framelist_add(evas, _("Personalized Password:"), 0); - - cfdata->gui.passwd_field = ob = e_widget_entry_add(evas, &(cfdata->desklock_passwd)); - _e_desklock_passwd_cb_change(cfdata, ob); - e_widget_entry_on_change_callback_set(ob, _e_desklock_passwd_cb_change, cfdata); - e_widget_min_size_set(ob, 200, 25); - e_widget_framelist_object_append(of, ob); - - ob = e_widget_check_add(evas, _("Show Password"), &(cfdata->show_password)); - wd = (E_Widget_Check_Data*)e_widget_data_get(ob); - - edje_object_signal_callback_add(wd->o_check,"toggle_on", "", _e_desklock_cb_show_passwd, cfdata); - edje_object_signal_callback_add(wd->o_check,"toggle_off", "", _e_desklock_cb_show_passwd, cfdata); - - e_widget_framelist_object_append(of, ob); - - e_widget_list_object_append(o, of, 1, 1, 0.5); - e_dialog_resizable_set(cfd->dia, 0); - - return o; + ob = e_widget_check_add(evas, _("Set the screensaver timeout"), &(cfdata->use_timeout)); + e_widget_framelist_object_append(of, ob); + + ob = e_widget_label_add(evas, _("Time until screensaver starts")); + e_widget_framelist_object_append(of, ob); + ob = e_widget_slider_add(evas, 1, 0, _("%1.0f seconds"), + 1.0, 600.0, + 1.0, 0, &(cfdata->timeout), NULL, + 200); + e_widget_framelist_object_append(of, ob); + + e_widget_list_object_append(o, of, 1, 1, 0.5); + + e_dialog_resizable_set(cfd->dia, 0); + + return o; } /* advanced window */ @@ -253,27 +278,31 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf static int _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) { - if (!cfdata) return 0; + if (!cfdata) return 0; + + if (cfdata->cur_bg) + { + if (e_config->desklock_background) + evas_stringshare_del(e_config->desklock_background); + e_config->desklock_background = (char *)evas_stringshare_add(cfdata->cur_bg); + } + + if (_e_desklock_zone_num_get() > 1) + { + if (cfdata->login_box_zone >= 0) + e_config->desklock_login_box_zone = cfdata->specific_lb_zone; + else + e_config->desklock_login_box_zone = cfdata->login_box_zone; + } + else + e_config->desklock_login_box_zone = LOGINBOX_SHOW_ALL_SCREENS; - if (cfdata->cur_bg) - { - if (e_config->desklock_background) - evas_stringshare_del(e_config->desklock_background); - e_config->desklock_background = (char *)evas_stringshare_add(cfdata->cur_bg); - } - - if (_e_desklock_zone_num_get() > 1) - { - if (cfdata->login_box_zone >= 0) - e_config->desklock_login_box_zone = cfdata->specific_lb_zone; - else - e_config->desklock_login_box_zone = cfdata->login_box_zone; - } - else - e_config->desklock_login_box_zone = LOGINBOX_SHOW_ALL_SCREENS; - - e_config_save_queue(); - return 1; + e_config->desklock_autolock = cfdata->autolock; + e_config->desklock_use_timeout = cfdata->use_timeout; + e_config->desklock_timeout = cfdata->timeout; + + e_config_save_queue(); + return 1; } static Evas_Object * @@ -282,6 +311,7 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data Evas_Object *o, *of, *of1, *ob; E_Widget_Radio_Data *wd; + /* FIXME: this dialog is broken. advanced options should ALSO INCLUDE basic options */ E_Radio_Group *rg, *rg_bkg; Evas_Object *ot; diff --git a/src/bin/e_manager.c b/src/bin/e_manager.c index fbbde0fd9..018d6fcbe 100644 --- a/src/bin/e_manager.c +++ b/src/bin/e_manager.c @@ -12,6 +12,7 @@ static int _e_manager_cb_key_up(void *data, int ev_type, void *ev); static int _e_manager_cb_key_down(void *data, int ev_type, void *ev); static int _e_manager_cb_frame_extents_request(void *data, int ev_type, void *ev); static int _e_manager_cb_ping(void *data, int ev_type, void *ev); +static int _e_manager_cb_screensaver_notify(void *data, int ev_type, void *ev); static Evas_Bool _e_manager_frame_extents_free_cb(Evas_Hash *hash __UNUSED__, const char *key __UNUSED__, @@ -47,6 +48,7 @@ static Evas_Hash *frame_extents = NULL; EAPI int e_manager_init(void) { + ecore_x_screensaver_event_listen_set(1); return 1; } @@ -110,6 +112,7 @@ e_manager_new(Ecore_X_Window root, int num) { man->win = man->root; } + h = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW_REQUEST, _e_manager_cb_window_show_request, man); if (h) man->handlers = evas_list_append(man->handlers, h); h = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CONFIGURE, _e_manager_cb_window_configure, man); @@ -119,8 +122,11 @@ e_manager_new(Ecore_X_Window root, int num) h = ecore_event_handler_add(ECORE_X_EVENT_KEY_UP, _e_manager_cb_key_up, man); if (h) man->handlers = evas_list_append(man->handlers, h); h = ecore_event_handler_add(ECORE_X_EVENT_FRAME_EXTENTS_REQUEST, _e_manager_cb_frame_extents_request, man); + if (h) man->handlers = evas_list_append(man->handlers, h); h = ecore_event_handler_add(ECORE_X_EVENT_PING, _e_manager_cb_ping, man); if (h) man->handlers = evas_list_append(man->handlers, h); + h = ecore_event_handler_add(ECORE_X_EVENT_SCREENSAVER_NOTIFY, _e_manager_cb_screensaver_notify, man); + if (h) man->handlers = evas_list_append(man->handlers, h); man->pointer = e_pointer_window_new(man->root); @@ -716,6 +722,22 @@ _e_manager_cb_ping(void *data, int ev_type __UNUSED__, void *ev) return 1; } +static int +_e_manager_cb_screensaver_notify(void *data, int ev_type __UNUSED__, void *ev) +{ + E_Manager *man; + Ecore_X_Event_Screensaver_Notify *e; + + man = data; + e = ev; + + if (e->on) + { + if (e_config->desklock_autolock) e_desklock_show(); + } + return 1; +} + static Evas_Bool _e_manager_frame_extents_free_cb(Evas_Hash *hash __UNUSED__, const char *key __UNUSED__, void *data, void *fdata __UNUSED__)