From 01a120b17e89f7513f91642b1241acf658cc19dd Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Sat, 21 Nov 2009 19:22:41 +0000 Subject: [PATCH] Add config dialog for keyboard (working nicely now) SVN revision: 43879 --- src/modules/illume-keyboard/e_mod_config.c | 180 +++++++++++++++++++++ src/modules/illume-keyboard/e_mod_config.h | 3 + src/modules/illume-keyboard/e_mod_main.c | 97 +++++++++-- src/modules/illume-keyboard/e_mod_main.h | 2 +- 4 files changed, 272 insertions(+), 10 deletions(-) diff --git a/src/modules/illume-keyboard/e_mod_config.c b/src/modules/illume-keyboard/e_mod_config.c index 4d255a781..a248f95b3 100644 --- a/src/modules/illume-keyboard/e_mod_config.c +++ b/src/modules/illume-keyboard/e_mod_config.c @@ -2,8 +2,17 @@ #include "e_mod_main.h" #include "e_mod_config.h" +/* local function prototypes */ +static void *_il_kbd_config_create(E_Config_Dialog *cfd); +static void _il_kbd_config_free(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); +static Evas_Object *_il_kbd_config_ui(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); +static void _il_kbd_config_changed(void *data, Evas_Object *obj, void *event); +static int _il_kbd_config_change_timeout(void *data); + EAPI Il_Kbd_Config *il_kbd_cfg = NULL; static E_Config_DD *conf_edd = NULL; +Ecore_Timer *_il_kbd_config_change_timer = NULL; +int external = 0; /* public functions */ EAPI int @@ -42,12 +51,21 @@ il_kbd_config_init(E_Module *m) } il_kbd_cfg->mod_dir = eina_stringshare_add(m->dir); + + e_configure_registry_category_add("illume", 0, _("Illume"), NULL, + "enlightenment/display"); + e_configure_registry_generic_item_add("illume/keyboard", 0, _("Keyboard"), + NULL, "enlightenment/keyboard", + il_kbd_config_show); return 1; } EAPI int il_kbd_config_shutdown(void) { + e_configure_registry_item_del("illume/keyboard"); + e_configure_registry_category_del("illume"); + if (il_kbd_cfg->mod_dir) eina_stringshare_del(il_kbd_cfg->mod_dir); if (il_kbd_cfg->run_keyboard) eina_stringshare_del(il_kbd_cfg->run_keyboard); if (il_kbd_cfg->dict) eina_stringshare_del(il_kbd_cfg->dict); @@ -65,3 +83,165 @@ il_kbd_config_save(void) e_config_domain_save("module.illume-keyboard", conf_edd, il_kbd_cfg); return 1; } + +EAPI void +il_kbd_config_show(E_Container *con, const char *params) +{ + E_Config_Dialog *cfd; + E_Config_Dialog_View *v; + + if (e_config_dialog_find("E", "_config_illume_keyboard_settings")) return; + + v = E_NEW(E_Config_Dialog_View, 1); + v->create_cfdata = _il_kbd_config_create; + v->free_cfdata = _il_kbd_config_free; + v->basic.create_widgets = _il_kbd_config_ui; + v->basic_only = 1; + v->normal_win = 1; + v->scroll = 1; + + cfd = e_config_dialog_new(con, _("Keyboard Settings"), "E", + "_config_illume_keyboard_settings", + "enlightenment/keyboard_settings", 0, v, NULL); + e_dialog_resizable_set(cfd->dia, 1); + il_kbd_cfg->cfd = cfd; +} + +/* local function prototypes */ +static void * +_il_kbd_config_create(E_Config_Dialog *cfd) +{ + return NULL; +} + +static void +_il_kbd_config_free(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +{ + +} + +static Evas_Object * +_il_kbd_config_ui(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) +{ + Evas_Object *list, *of, *ow; + E_Radio_Group *rg; + Eina_List *l; + + list = e_widget_list_add(evas, 0, 0); + if (!il_kbd_cfg->run_keyboard) + { + if (il_kbd_cfg->use_internal) external = 1; + else external = 0; + } + else + { + Eina_List *kbds; + Efreet_Desktop *desktop; + int nn = 0; + + external = 0; + kbds = efreet_util_desktop_category_list("Keyboard"); + if (kbds) + { + nn = 2; + EINA_LIST_FOREACH(kbds, l, desktop) + { + const char *dname; + + dname = ecore_file_file_get(desktop->orig_path); + if (dname) + { + if (!strcmp(il_kbd_cfg->run_keyboard, dname)) + { + external = nn; + break; + } + } + nn++; + } + } + } + + of = e_widget_framelist_add(evas, _("Keyboards"), 0); + rg = e_widget_radio_group_new(&(external)); + ow = e_widget_radio_add(evas, _("None"), 0, rg); + e_widget_framelist_object_append(of, ow); + evas_object_smart_callback_add(ow, "changed", _il_kbd_config_changed, NULL); + ow = e_widget_radio_add(evas, _("Default"), 1, rg); + e_widget_framelist_object_append(of, ow); + evas_object_smart_callback_add(ow, "changed", _il_kbd_config_changed, NULL); + { + Eina_List *kbds; + Efreet_Desktop *desktop; + int nn = 2; + + kbds = efreet_util_desktop_category_list("Keyboard"); + EINA_LIST_FOREACH(kbds, l, desktop) + { + const char *dname; + + dname = ecore_file_file_get(desktop->orig_path); + ow = e_widget_radio_add(evas, desktop->name, nn, rg); + e_widget_framelist_object_append(of, ow); + evas_object_smart_callback_add(ow, "changed", + _il_kbd_config_changed, NULL); + nn++; + } + } + e_widget_list_object_append(list, of, 1, 0, 0.0); + return list; +} + +static void +_il_kbd_config_changed(void *data, Evas_Object *obj, void *event) +{ + if (_il_kbd_config_change_timer) + ecore_timer_del(_il_kbd_config_change_timer); + _il_kbd_config_change_timer = + ecore_timer_add(0.5, _il_kbd_config_change_timeout, data); +} + +static int +_il_kbd_config_change_timeout(void *data) +{ + Eina_List *l; + + il_kbd_cfg->use_internal = 0; + if (il_kbd_cfg->run_keyboard) + eina_stringshare_del(il_kbd_cfg->run_keyboard); + il_kbd_cfg->run_keyboard = NULL; + if (external == 0) + il_kbd_cfg->use_internal = 0; + else if (external == 1) + il_kbd_cfg->use_internal = 1; + else + { + Eina_List *kbds; + Efreet_Desktop *desktop; + int nn; + + kbds = efreet_util_desktop_category_list("Keyboard"); + if (kbds) + { + nn = 2; + EINA_LIST_FOREACH(kbds, l, desktop) + { + const char *dname; + + dname = ecore_file_file_get(desktop->orig_path); + if (nn == external) + { + if (dname) + il_kbd_cfg->run_keyboard = eina_stringshare_add(dname); + break; + } + nn++; + } + } + } + + il_kbd_cfg_update(); + e_config_save_queue(); + _il_kbd_config_change_timer = NULL; + return 0; +} diff --git a/src/modules/illume-keyboard/e_mod_config.h b/src/modules/illume-keyboard/e_mod_config.h index 288aebbac..e50950b81 100644 --- a/src/modules/illume-keyboard/e_mod_config.h +++ b/src/modules/illume-keyboard/e_mod_config.h @@ -15,12 +15,15 @@ struct _Il_Kbd_Config // Not User Configurable. Placeholders const char *mod_dir; + E_Config_Dialog *cfd; }; EAPI int il_kbd_config_init(E_Module *m); EAPI int il_kbd_config_shutdown(void); EAPI int il_kbd_config_save(void); +EAPI void il_kbd_config_show(E_Container *con, const char *params); + extern EAPI Il_Kbd_Config *il_kbd_cfg; #endif diff --git a/src/modules/illume-keyboard/e_mod_main.c b/src/modules/illume-keyboard/e_mod_main.c index 3f8829383..9f53f1cfb 100644 --- a/src/modules/illume-keyboard/e_mod_main.c +++ b/src/modules/illume-keyboard/e_mod_main.c @@ -3,8 +3,15 @@ #include "e_mod_config.h" #include "e_kbd_int.h" +/* local function prototypes */ +static void _il_kbd_stop(void); +static void _il_kbd_start(void); +static int _il_kbd_cb_exit(void *data, int type, void *event); + /* local variables */ static E_Kbd_Int *ki = NULL; +static Ecore_Exe *_kbd_exe = NULL; +static Ecore_Event_Handler *_kbd_exe_exit_handler = NULL; EAPI E_Module_Api e_modapi = { E_MODULE_API_VERSION, "Illume Keyboard" }; @@ -12,21 +19,14 @@ EAPI void * e_modapi_init(E_Module *m) { if (!il_kbd_config_init(m)) return NULL; - - ki = e_kbd_int_new(il_kbd_cfg->mod_dir, - il_kbd_cfg->mod_dir, il_kbd_cfg->mod_dir); - + _il_kbd_start(); return m; } EAPI int e_modapi_shutdown(E_Module *m) { - if (ki) - { - e_kbd_int_free(ki); - ki = NULL; - } + _il_kbd_stop(); il_kbd_config_shutdown(); return 1; } @@ -36,3 +36,82 @@ e_modapi_save(E_Module *m) { return il_kbd_config_save(); } + +EAPI void +il_kbd_cfg_update(void) +{ + _il_kbd_stop(); + _il_kbd_start(); +} + +static void +_il_kbd_stop(void) +{ + if (ki) e_kbd_int_free(ki); + ki = NULL; + if (_kbd_exe) ecore_exe_interrupt(_kbd_exe); + _kbd_exe = NULL; + if (_kbd_exe_exit_handler) ecore_event_handler_del(_kbd_exe_exit_handler); + _kbd_exe_exit_handler = NULL; +} + +static void +_il_kbd_start(void) +{ + if (il_kbd_cfg->use_internal) + { + ki = e_kbd_int_new(il_kbd_cfg->mod_dir, + il_kbd_cfg->mod_dir, il_kbd_cfg->mod_dir); + } + else if (il_kbd_cfg->run_keyboard) + { + E_Exec_Instance *inst; + Efreet_Desktop *desktop; + + desktop = efreet_util_desktop_file_id_find(il_kbd_cfg->run_keyboard); + if (!desktop) + { + Eina_List *kbds, *l; + + kbds = efreet_util_desktop_category_list("Keyboard"); + if (kbds) + { + EINA_LIST_FOREACH(kbds, l, desktop) + { + const char *dname; + + dname = ecore_file_file_get(desktop->orig_path); + if (dname) + { + if (!strcmp(dname, il_kbd_cfg->run_keyboard)) + break; + } + } + } + } + if (desktop) + { + E_Zone *zone; + + zone = e_util_container_zone_number_get(0, 0); + inst = e_exec(zone, desktop, NULL, NULL, "illume-keyboard"); + if (inst) + { + _kbd_exe = inst->exe; + _kbd_exe_exit_handler = + ecore_event_handler_add(ECORE_EXE_EVENT_DEL, + _il_kbd_cb_exit, NULL); + } + } + } +} + +static int +_il_kbd_cb_exit(void *data, int type, void *event) +{ + Ecore_Exe_Event_Del *ev; + + ev = event; + if (ev->exe == _kbd_exe) _kbd_exe = NULL; + return 1; +} diff --git a/src/modules/illume-keyboard/e_mod_main.h b/src/modules/illume-keyboard/e_mod_main.h index 2ac97c3f8..fa2561413 100644 --- a/src/modules/illume-keyboard/e_mod_main.h +++ b/src/modules/illume-keyboard/e_mod_main.h @@ -7,6 +7,6 @@ EAPI void *e_modapi_init(E_Module *m); EAPI int e_modapi_shutdown(E_Module *m); EAPI int e_modapi_save(E_Module *m); -extern EAPI const char *mod_dir; +EAPI void il_kbd_cfg_update(void); #endif