2 #include "e_mod_main.h"
4 static void *_create_data(E_Config_Dialog *cfd);
5 static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
6 static void _fill_data(E_Config_Dialog_Data *cfdata);
7 static int _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
8 static int _basic_check_changed(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
9 static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
11 static void _cb_method_change(void *data, Evas_Object *obj, void *event_info);
12 static void _cb_login_change(void *data, Evas_Object *obj);
13 static int _zone_count_get(void);
15 static void _cb_bg_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event);
16 static void _cb_ask_presentation_changed(void *data, Evas_Object *obj);
18 typedef enum _E_Desklock_Background_Method {
19 E_DESKLOCK_BACKGROUND_METHOD_THEME_DESKLOCK = 0,
20 E_DESKLOCK_BACKGROUND_METHOD_THEME,
21 E_DESKLOCK_BACKGROUND_METHOD_WALLPAPER,
22 E_DESKLOCK_BACKGROUND_METHOD_CUSTOM,
23 } E_Desklock_Background_Method;
25 struct _E_Config_Dialog_Data
27 E_Config_Dialog *cfd, *bg_fsel;
40 char *custom_lock_cmd;
45 double post_screensaver_time;
48 E_Desklock_Background_Method bg_method;
53 double ask_presentation_timeout;
57 Evas_Object *loginbox_slider;
58 Evas_Object *post_screensaver_slider;
59 Evas_Object *auto_lock_slider;
60 Evas_Object *ask_presentation_slider;
67 e_int_config_desklock(E_Container *con, const char *params __UNUSED__)
70 E_Config_Dialog_View *v;
72 if (e_config_dialog_find("E", "screen/screen_lock")) return NULL;
73 v = E_NEW(E_Config_Dialog_View, 1);
76 v->create_cfdata = _create_data;
77 v->free_cfdata = _free_data;
78 v->basic.create_widgets = _basic_create;
79 v->basic.apply_cfdata = _basic_apply;
80 v->basic.check_changed = _basic_check_changed;
81 v->override_auto_apply = 1;
83 cfd = e_config_dialog_new(con, _("Screen Lock Settings"), "E",
84 "screen/screen_lock", "preferences-system-lock-screen",
90 e_int_config_desklock_fsel_done(E_Config_Dialog *cfd, Evas_Object *bg, const char *bg_file)
92 E_Config_Dialog_Data *cfdata;
96 if (!(cfdata = cfd->cfdata)) return;
97 cfdata->bg_fsel = NULL;
99 e_widget_preview_file_get(bg, &cbg, NULL);
100 l = eina_list_data_find_list(cfdata->bgs, cbg);
102 eina_stringshare_replace((const char**)&l->data, bg_file);
104 eina_list_data_set(l, eina_stringshare_add(bg_file));
105 e_widget_preview_edje_set(bg, bg_file, "e/desktop/background");
109 _fill_data(E_Config_Dialog_Data *cfdata)
112 E_Config_Desklock_Background *bg;
115 cfdata->zone_count = _zone_count_get();
116 EINA_LIST_FOREACH(e_config->desklock_backgrounds, l, bg)
117 cfdata->bgs = eina_list_append(cfdata->bgs, eina_stringshare_ref(bg->file));
119 for (x = 0; x < cfdata->zone_count; x++)
120 cfdata->bgs = eina_list_append(cfdata->bgs, eina_stringshare_add("theme_desklock_background"));
122 if (!e_util_strcmp(eina_list_data_get(cfdata->bgs), "theme_desklock_background"))
123 cfdata->bg_method = E_DESKLOCK_BACKGROUND_METHOD_THEME_DESKLOCK;
124 else if (!e_util_strcmp(eina_list_data_get(cfdata->bgs), "theme_background"))
125 cfdata->bg_method = E_DESKLOCK_BACKGROUND_METHOD_THEME;
126 else if (!e_util_strcmp(eina_list_data_get(cfdata->bgs), "user_background"))
127 cfdata->bg_method = E_DESKLOCK_BACKGROUND_METHOD_WALLPAPER;
129 cfdata->bg_method = E_DESKLOCK_BACKGROUND_METHOD_CUSTOM;
131 cfdata->bg_method_prev = cfdata->bg_method;
132 cfdata->use_xscreensaver = ecore_x_screensaver_event_available_get();
134 cfdata->custom_lock = e_config->desklock_use_custom_desklock;
135 if (e_config->desklock_custom_desklock_cmd)
136 cfdata->custom_lock_cmd = strdup(e_config->desklock_custom_desklock_cmd);
138 cfdata->start_locked = e_config->desklock_start_locked;
139 cfdata->lock_on_suspend = e_config->desklock_on_suspend;
140 cfdata->auto_lock = e_config->desklock_autolock_idle;
141 cfdata->screensaver_lock = e_config->desklock_autolock_screensaver;
142 cfdata->idle_time = e_config->desklock_autolock_idle_timeout / 60;
143 cfdata->post_screensaver_time = e_config->desklock_post_screensaver_time;
144 if (e_config->desklock_login_box_zone >= 0)
146 cfdata->login_zone = 0;
147 cfdata->zone = e_config->desklock_login_box_zone;
151 cfdata->login_zone = e_config->desklock_login_box_zone;
155 cfdata->ask_presentation = e_config->desklock_ask_presentation;
156 cfdata->ask_presentation_timeout =
157 e_config->desklock_ask_presentation_timeout;
161 _create_data(E_Config_Dialog *cfd)
163 E_Config_Dialog_Data *cfdata;
165 cfdata = E_NEW(E_Config_Dialog_Data, 1);
172 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
176 e_object_del(E_OBJECT(cfdata->bg_fsel));
177 E_FREE(cfdata->custom_lock_cmd);
178 EINA_LIST_FREE(cfdata->bgs, bg)
179 eina_stringshare_del(bg);
184 _basic_auto_lock_cb_changed(void *data, Evas_Object *o __UNUSED__)
186 E_Config_Dialog_Data *cfdata;
189 if (!(cfdata = data)) return;
190 disable = ((!cfdata->use_xscreensaver) || (!cfdata->auto_lock));
191 e_widget_disabled_set(cfdata->gui.auto_lock_slider, disable);
195 _basic_screensaver_lock_cb_changed(void *data, Evas_Object *o __UNUSED__)
197 E_Config_Dialog_Data *cfdata;
200 if (!(cfdata = data)) return;
201 disable = ((!cfdata->use_xscreensaver) || (!cfdata->screensaver_lock));
202 e_widget_disabled_set(cfdata->gui.post_screensaver_slider, disable);
206 _basic_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
208 Evas_Object *otb, *ol, *ow, *of, *ot;
209 Eina_List *l, *ll, *lll;
214 int screen_count, x = 0;
216 screen_count = ecore_x_xinerama_screen_count_get();
218 otb = e_widget_toolbook_add(evas, (24 * e_scale), (24 * e_scale));
221 ol = e_widget_list_add(evas, 0, 0);
222 ow = e_widget_check_add(evas, _("Lock on Startup"), &cfdata->start_locked);
223 e_widget_disabled_set(ow, !cfdata->use_xscreensaver);
224 e_widget_list_object_append(ol, ow, 1, 1, 0.5);
225 ow = e_widget_check_add(evas, _("Lock on Suspend"), &cfdata->lock_on_suspend);
226 e_widget_disabled_set(ow, !cfdata->use_xscreensaver);
227 e_widget_list_object_append(ol, ow, 1, 1, 0.5);
229 of = e_widget_framelist_add(evas, _("Custom Screenlock Command"), 0);
230 ow = e_widget_entry_add(evas, &(cfdata->custom_lock_cmd), NULL, NULL, NULL);
231 e_widget_framelist_object_append(of, ow);
233 ow = e_widget_check_add(evas, _("Use Custom Screenlock Command"), &cfdata->custom_lock);
234 e_widget_framelist_object_append(of, ow);
235 e_widget_list_object_append(ol, of, 1, 1, 0.5);
236 e_widget_toolbook_page_append(otb, NULL, _("Locking"), ol,
237 1, 0, 1, 0, 0.5, 0.0);
240 ol = e_widget_list_add(evas, 0, 0);
241 rg = e_widget_radio_group_new(&(cfdata->login_zone));
242 ow = e_widget_radio_add(evas, _("Show on all screens"), -1, rg);
243 e_widget_on_change_hook_set(ow, _cb_login_change, cfdata);
244 e_widget_disabled_set(ow, (screen_count <= 0));
245 e_widget_list_object_append(ol, ow, 1, 1, 0.5);
247 ow = e_widget_radio_add(evas, _("Show on current screen"), -2, rg);
248 e_widget_on_change_hook_set(ow, _cb_login_change, cfdata);
249 e_widget_disabled_set(ow, (screen_count <= 0));
250 e_widget_list_object_append(ol, ow, 1, 1, 0.5);
252 ow = e_widget_radio_add(evas, _("Show on screen #:"), 0, rg);
253 e_widget_on_change_hook_set(ow, _cb_login_change, cfdata);
254 e_widget_disabled_set(ow, (screen_count <= 0));
255 e_widget_list_object_append(ol, ow, 1, 1, 0.5);
257 cfdata->gui.loginbox_slider =
258 e_widget_slider_add(evas, 1, 0, _("%1.0f"), 0.0, (cfdata->zone_count - 1),
259 1.0, 0, NULL, &(cfdata->zone), 100);
260 e_widget_disabled_set(cfdata->gui.loginbox_slider, (screen_count <= 0));
261 e_widget_list_object_append(ol, cfdata->gui.loginbox_slider, 1, 1, 0.5);
262 e_widget_toolbook_page_append(otb, NULL, _("Login Box"), ol,
263 1, 0, 1, 0, 0.5, 0.0);
266 ol = e_widget_list_add(evas, 0, 0);
267 ow = e_widget_check_add(evas, _("Lock after X screensaver activates"),
268 &cfdata->screensaver_lock);
269 e_widget_on_change_hook_set(ow, _basic_screensaver_lock_cb_changed, cfdata);
270 e_widget_disabled_set(ow, !cfdata->use_xscreensaver);
271 e_widget_list_object_append(ol, ow, 1, 1, 0.5);
273 ow = e_widget_slider_add(evas, 1, 0, _("%1.0f seconds"), 0.0, 300.0, 10.0, 0,
274 &(cfdata->post_screensaver_time), NULL, 100);
275 cfdata->gui.post_screensaver_slider = ow;
276 e_widget_disabled_set(ow, !cfdata->use_xscreensaver);
277 e_widget_list_object_append(ol, ow, 1, 1, 0.5);
279 ow = e_widget_check_add(evas, _("Lock when idle time exceeded"),
281 e_widget_on_change_hook_set(ow, _basic_auto_lock_cb_changed, cfdata);
282 e_widget_list_object_append(ol, ow, 1, 1, 0.5);
284 ow = e_widget_slider_add(evas, 1, 0, _("%1.0f minutes"), 1.0, 90.0, 1.0, 0,
285 &(cfdata->idle_time), NULL, 100);
286 cfdata->gui.auto_lock_slider = ow;
287 e_widget_disabled_set(ow, !cfdata->use_xscreensaver);
288 e_widget_list_object_append(ol, ow, 1, 1, 0.5);
289 e_widget_toolbook_page_append(otb, NULL, _("Timers"), ol,
290 1, 0, 1, 0, 0.5, 0.0);
293 ol = e_widget_list_add(evas, 0, 0);
294 ow = e_widget_check_add(evas, _("Suggest if deactivated before"),
295 &(cfdata->ask_presentation));
296 e_widget_on_change_hook_set(ow, _cb_ask_presentation_changed, cfdata);
297 e_widget_list_object_append(ol, ow, 1, 1, 0.5);
298 ow = e_widget_slider_add(evas, 1, 0, _("%1.0f seconds"), 1.0, 300.0, 10.0, 0,
299 &(cfdata->ask_presentation_timeout), NULL, 100);
300 cfdata->gui.ask_presentation_slider = ow;
301 e_widget_disabled_set(ow, (!cfdata->ask_presentation));
302 e_widget_list_object_append(ol, ow, 1, 1, 0.5);
303 e_widget_toolbook_page_append(otb, NULL, _("Presentation Mode"), ol,
304 1, 0, 1, 0, 0.5, 0.0);
307 ol = e_widget_list_add(evas, 0, 0);
308 of = e_widget_table_add(evas, 1);
309 rg = e_widget_radio_group_new((int *)&(cfdata->bg_method));
310 ow = e_widget_radio_add(evas, _("Theme Defined"),
311 E_DESKLOCK_BACKGROUND_METHOD_THEME_DESKLOCK, rg);
312 evas_object_smart_callback_add(ow, "changed", _cb_method_change, cfdata);
313 e_widget_table_object_append(of, ow, 0, 0, 1, 1, 1, 0, 1, 0);
314 ow = e_widget_radio_add(evas, _("Theme Wallpaper"),
315 E_DESKLOCK_BACKGROUND_METHOD_THEME, rg);
316 evas_object_smart_callback_add(ow, "changed", _cb_method_change, cfdata);
317 e_widget_table_object_append(of, ow, 0, 1, 1, 1, 1, 0, 1, 0);
318 ow = e_widget_radio_add(evas, _("Current Wallpaper"),
319 E_DESKLOCK_BACKGROUND_METHOD_WALLPAPER, rg);
320 evas_object_smart_callback_add(ow, "changed", _cb_method_change, cfdata);
321 e_widget_table_object_append(of, ow, 1, 0, 1, 1, 1, 0, 1, 0);
322 ow = e_widget_radio_add(evas, _("Custom"),
323 E_DESKLOCK_BACKGROUND_METHOD_CUSTOM, rg);
324 evas_object_smart_callback_add(ow, "changed", _cb_method_change, cfdata);
325 e_widget_table_object_append(of, ow, 1, 1, 1, 1, 1, 0, 1, 0);
326 e_widget_list_object_append(ol, of, 1, 1, 0.5);
328 cfdata->gui.o_table = ot = e_widget_table_add(evas, 1);
330 EINA_LIST_FOREACH(e_manager_list(), l, man)
331 EINA_LIST_FOREACH(man->containers, ll, con)
332 EINA_LIST_FOREACH(con->zones, lll, zone)
334 ow = e_widget_preview_add(evas, 100, 140);
335 cfdata->gui.bgs = eina_list_append(cfdata->gui.bgs, ow);
336 evas_object_data_set(ow, "zone", zone);
337 e_widget_disabled_set(ow,
338 (cfdata->bg_method < E_DESKLOCK_BACKGROUND_METHOD_CUSTOM));
339 evas_object_event_callback_add(ow, EVAS_CALLBACK_MOUSE_DOWN, _cb_bg_mouse_down, cfdata);
340 e_widget_table_object_append(cfdata->gui.o_table, ow, x++, 0, 1, 1, 1, 1, 1, 1);
342 _cb_method_change(cfdata, NULL, NULL);
343 e_widget_list_object_append(ol, cfdata->gui.o_table, 1, 1, 0.5);
344 e_widget_toolbook_page_append(otb, NULL, _("Wallpaper"), ol,
345 1, 0, 1, 0, 0.5, 0.0);
347 e_widget_toolbook_page_show(otb, 0);
349 _basic_auto_lock_cb_changed(cfdata, NULL);
350 _basic_screensaver_lock_cb_changed(cfdata, NULL);
356 _basic_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
360 E_Config_Desklock_Background *cbg;
362 e_config->desklock_start_locked = cfdata->start_locked;
363 e_config->desklock_on_suspend = cfdata->lock_on_suspend;
364 e_config->desklock_autolock_idle = cfdata->auto_lock;
365 e_config->desklock_post_screensaver_time = cfdata->post_screensaver_time;
366 e_config->desklock_autolock_screensaver = cfdata->screensaver_lock;
367 e_config->desklock_autolock_idle_timeout = (cfdata->idle_time * 60);
368 e_config->desklock_ask_presentation = cfdata->ask_presentation;
369 e_config->desklock_ask_presentation_timeout =
370 cfdata->ask_presentation_timeout;
374 EINA_LIST_FREE(e_config->desklock_backgrounds, cbg)
376 e_filereg_deregister(cbg->file);
377 eina_stringshare_del(cbg->file);
380 EINA_LIST_FOREACH(cfdata->bgs, l, bg)
382 cbg = E_NEW(E_Config_Desklock_Background, 1);
383 cbg->file = eina_stringshare_ref(bg);
384 e_config->desklock_backgrounds = eina_list_append(e_config->desklock_backgrounds, cbg);
385 e_filereg_register(bg);
389 if (cfdata->login_zone < 0)
390 e_config->desklock_login_box_zone = cfdata->login_zone;
392 e_config->desklock_login_box_zone = cfdata->zone;
394 e_config->desklock_use_custom_desklock = cfdata->custom_lock;
395 if (cfdata->custom_lock_cmd)
396 eina_stringshare_replace(&e_config->desklock_custom_desklock_cmd,
397 cfdata->custom_lock_cmd);
399 cfdata->bg_method_prev = cfdata->bg_method;
400 e_config_save_queue();
405 _basic_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
408 E_Config_Desklock_Background *cbg;
409 if (e_config->desklock_start_locked != cfdata->start_locked)
412 if (e_config->desklock_on_suspend != cfdata->lock_on_suspend)
415 if (e_config->desklock_autolock_idle != cfdata->auto_lock)
418 if (e_config->desklock_autolock_screensaver != cfdata->screensaver_lock)
421 if (e_config->desklock_post_screensaver_time !=
422 cfdata->post_screensaver_time)
425 if (e_config->desklock_autolock_idle_timeout != cfdata->idle_time * 60)
428 if (cfdata->bg_method_prev != (int)cfdata->bg_method) return 1;
430 EINA_LIST_FOREACH(e_config->desklock_backgrounds, l, cbg)
433 if (cbg->file != ll->data) return 1;
437 if (cfdata->login_zone < 0)
439 if (e_config->desklock_login_box_zone != cfdata->login_zone)
444 if (e_config->desklock_login_box_zone != cfdata->zone)
448 if (e_config->desklock_use_custom_desklock != cfdata->custom_lock)
451 if (e_config->desklock_custom_desklock_cmd && cfdata->custom_lock_cmd)
453 if (strcmp(e_config->desklock_custom_desklock_cmd, cfdata->custom_lock_cmd) != 0)
456 else if (e_config->desklock_custom_desklock_cmd != cfdata->custom_lock_cmd)
459 return (e_config->desklock_ask_presentation != cfdata->ask_presentation) ||
460 (e_config->desklock_ask_presentation_timeout != cfdata->ask_presentation_timeout);
464 _cb_method_change(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
466 E_Config_Dialog_Data *cfdata;
469 const char *theme = NULL;
472 if (!(cfdata = data)) return;
473 EINA_LIST_FOREACH(cfdata->gui.bgs, l, bg)
474 e_widget_disabled_set(bg,
475 (cfdata->bg_method < E_DESKLOCK_BACKGROUND_METHOD_CUSTOM));
477 switch (cfdata->bg_method)
479 case E_DESKLOCK_BACKGROUND_METHOD_THEME_DESKLOCK:
480 EINA_LIST_FREE(cfdata->bgs, theme)
481 eina_stringshare_del(theme);
482 for (x = 0; x < cfdata->zone_count; x++)
483 cfdata->bgs = eina_list_append(cfdata->bgs, eina_stringshare_add("theme_desklock_background"));
484 theme = e_theme_edje_file_get("base/theme/desklock",
485 "e/desklock/background");
487 EINA_LIST_FOREACH(cfdata->gui.bgs, l, bg)
488 e_widget_preview_edje_set(bg, theme, "e/desklock/background");
491 case E_DESKLOCK_BACKGROUND_METHOD_THEME:
492 theme = e_theme_edje_file_get("base/theme/backgrounds",
493 "e/desktop/background");
496 EINA_LIST_FOREACH(cfdata->gui.bgs, l, bg)
497 e_widget_preview_edje_set(bg, theme, "e/desktop/background");
498 EINA_LIST_FREE(cfdata->bgs, theme)
499 eina_stringshare_del(theme);
500 for (x = 0; x < cfdata->zone_count; x++)
501 cfdata->bgs = eina_list_append(cfdata->bgs, eina_stringshare_add("theme_background"));
505 case E_DESKLOCK_BACKGROUND_METHOD_WALLPAPER:
506 if (e_config->desktop_backgrounds)
508 E_Config_Desktop_Background *cdb;
510 if (eina_str_has_extension(e_config->desktop_default_background, "edj"))
512 EINA_LIST_FOREACH(cfdata->gui.bgs, l, bg)
513 e_widget_preview_edje_set(bg, e_config->desktop_default_background, "e/desktop/background");
514 EINA_LIST_FREE(cfdata->bgs, theme)
515 eina_stringshare_del(theme);
516 for (y = 0; y < cfdata->zone_count; y++)
517 cfdata->bgs = eina_list_append(cfdata->bgs, eina_stringshare_add("user_background"));
519 /* attempt to set wallpaper from desktop 0,0 on each zone as a desklock bg */
520 EINA_LIST_FOREACH(e_config->desktop_backgrounds, l, cdb)
521 if ((!cdb->desk_x) && (!cdb->desk_y))
524 ll = eina_list_nth_list(cfdata->bgs, cdb->zone);
527 theme = eina_list_data_get(ll);
528 eina_stringshare_replace(&theme, cdb->file);
529 eina_list_data_set(ll, theme);
532 cfdata->bgs = eina_list_append(cfdata->bgs, cdb->file);
533 bg = eina_list_nth(cfdata->gui.bgs, cdb->zone);
535 e_widget_preview_edje_set(bg, cdb->file, "e/desktop/background");
538 else if (e_config->desktop_default_background && eina_str_has_extension(e_config->desktop_default_background, "edj"))
540 EINA_LIST_FOREACH(cfdata->gui.bgs, l, bg)
541 e_widget_preview_edje_set(bg, e_config->desktop_default_background, "e/desktop/background");
542 EINA_LIST_FREE(cfdata->bgs, theme)
543 eina_stringshare_del(theme);
544 for (x = 0; x < cfdata->zone_count; x++)
545 cfdata->bgs = eina_list_append(cfdata->bgs, eina_stringshare_add("user_background"));
549 case E_DESKLOCK_BACKGROUND_METHOD_CUSTOM:
552 E_Config_Desklock_Background *cbg;
554 EINA_LIST_FREE(cfdata->bgs, theme)
555 eina_stringshare_del(theme);
556 ll = cfdata->gui.bgs;
557 EINA_LIST_FOREACH(e_config->desklock_backgrounds, l, cbg)
560 e_widget_preview_edje_set(ll->data, cbg->file, "e/desktop/background");
561 cfdata->bgs = eina_list_append(cfdata->bgs, eina_stringshare_ref(cbg->file));
573 _cb_login_change(void *data, Evas_Object *obj __UNUSED__)
575 E_Config_Dialog_Data *cfdata;
577 if (!(cfdata = data)) return;
578 e_widget_disabled_set(cfdata->gui.loginbox_slider, (cfdata->login_zone < 0));
582 _zone_count_get(void)
588 EINA_LIST_FOREACH(e_manager_list(), ml, m)
593 EINA_LIST_FOREACH(m->containers, cl, con)
594 num += eina_list_count(con->zones);
600 _cb_bg_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event __UNUSED__)
602 E_Config_Dialog_Data *cfdata;
604 if (e_widget_disabled_get(obj)) return;
605 if (!(cfdata = data)) return;
607 e_win_raise(cfdata->bg_fsel->dia->win);
609 cfdata->bg_fsel = e_int_config_desklock_fsel(cfdata->cfd, obj);
613 _cb_ask_presentation_changed(void *data, Evas_Object *obj __UNUSED__)
615 E_Config_Dialog_Data *cfdata;
618 if (!(cfdata = data)) return;
619 disable = (!cfdata->ask_presentation);
620 e_widget_disabled_set(cfdata->gui.ask_presentation_slider, disable);