From 2a0ef6c39615f46d99a47b1fb636ecb5cae151c2 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 7 Feb 2013 09:23:29 +0000 Subject: [PATCH] add edit button to window remembers config dialog ticket #789 SVN revision: 83724 --- ChangeLog | 1 + NEWS | 2 + src/bin/e_int_border_remember.c | 231 +++++++++++------- src/bin/e_int_border_remember.h | 1 + .../e_int_config_remembers.c | 51 +++- 5 files changed, 186 insertions(+), 100 deletions(-) diff --git a/ChangeLog b/ChangeLog index 300dd7bb7..67716295d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,7 @@ 2013-02-07 Mike Blumenkrantz * added option for remembering filemanager windows globally + * added edit functionality to window remembers dialog 2013-02-07 Carsten Haitzler diff --git a/NEWS b/NEWS index 887c7038a..c4c07b744 100644 --- a/NEWS +++ b/NEWS @@ -25,6 +25,7 @@ Additions: * add e_border_pointer_warp_to_center_now() * e_widget_check_widget_disable_on_* * e_widget_on_disable_hook_set + * e_int_border_remember_edit Config: * Added option for disabling icons in menus * Added option for disabling pointer warping when performing directional focus changes using winlist @@ -97,6 +98,7 @@ Improvements: * unify all pointer warp animators * clock listens to /etc/timezone changes now too * enable image preloading for all e_widget_preview using edje + * window remember dialog now allows editing of remembers Fixes: * IBar menu didn't allow to configure different icon sources, show contents menu even on empty IBar. diff --git a/src/bin/e_int_border_remember.c b/src/bin/e_int_border_remember.c index 6ffc6610c..6c08a13df 100644 --- a/src/bin/e_int_border_remember.c +++ b/src/bin/e_int_border_remember.c @@ -22,6 +22,7 @@ static Evas_Object *_advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E struct _E_Config_Dialog_Data { E_Border *border; + E_Remember *rem; /*- BASIC -*/ int mode; int warned; @@ -66,6 +67,25 @@ struct _E_Config_Dialog_Data }; /* a nice easy setup function that does the dirty work */ +EAPI E_Config_Dialog * +e_int_border_remember_edit(E_Remember *rem) +{ + E_Config_Dialog_View *v; + + v = E_NEW(E_Config_Dialog_View, 1); + /* methods */ + v->create_cfdata = _create_data; + v->free_cfdata = _free_data; + v->basic.apply_cfdata = _advanced_apply_data; + v->basic.create_widgets = _advanced_create_widgets; + v->override_auto_apply = 1; + + /* create config dialog for bd object/data */ + return e_config_dialog_new(NULL, _("Window Remember"), + "E", "_border_remember_edit_dialog", + NULL, 0, v, rem); +} + EAPI void e_int_border_remember(E_Border *bd) { @@ -114,7 +134,10 @@ _fill_data(E_Config_Dialog_Data *cfdata) E_Remember *rem; bd = cfdata->border; - rem = bd->remember; + if (bd) + rem = bd->remember; + else + rem = cfdata->rem; if (rem) { @@ -134,68 +157,71 @@ _fill_data(E_Config_Dialog_Data *cfdata) cfdata->remember.apply_desktop_file = 1; } - if (!cfdata->name && - bd->client.icccm.name && - bd->client.icccm.name[0]) - cfdata->name = strdup(bd->client.icccm.name); - if (!cfdata->class && - bd->client.icccm.class && - bd->client.icccm.class[0]) - cfdata->class = strdup(bd->client.icccm.class); - if (!cfdata->role && - bd->client.icccm.window_role && - bd->client.icccm.window_role[0]) - cfdata->role = strdup(bd->client.icccm.window_role); - if (!cfdata->title) + if (bd) { - const char *title = e_border_name_get(bd); - if (title && title[0]) - cfdata->title = strdup(title); - } - if (!cfdata->desktop && bd->desktop) - cfdata->desktop = strdup(bd->desktop->name); - - if (!cfdata->command && - (bd->client.icccm.command.argc > 0) && - (bd->client.icccm.command.argv)) - { - char buf[4096]; - int i, j, k; - - buf[0] = 0; - k = 0; - for (i = 0; i < bd->client.icccm.command.argc; i++) + if (!cfdata->name && + bd->client.icccm.name && + bd->client.icccm.name[0]) + cfdata->name = strdup(bd->client.icccm.name); + if (!cfdata->class && + bd->client.icccm.class && + bd->client.icccm.class[0]) + cfdata->class = strdup(bd->client.icccm.class); + if (!cfdata->role && + bd->client.icccm.window_role && + bd->client.icccm.window_role[0]) + cfdata->role = strdup(bd->client.icccm.window_role); + if (!cfdata->title) { - if (i > 0) + const char *title = e_border_name_get(bd); + if (title && title[0]) + cfdata->title = strdup(title); + } + if (!cfdata->desktop && bd->desktop) + cfdata->desktop = strdup(bd->desktop->name); + + if (!cfdata->command && + (bd->client.icccm.command.argc > 0) && + (bd->client.icccm.command.argv)) + { + char buf[4096]; + int i, j, k; + + buf[0] = 0; + k = 0; + for (i = 0; i < bd->client.icccm.command.argc; i++) { - buf[k] = ' '; - k++; - } - for (j = 0; bd->client.icccm.command.argv[i][j]; j++) - { - if (k >= (int)(sizeof(buf) - 10)) + if (i > 0) { - buf[k] = 0; - goto done; - } - if ((bd->client.icccm.command.argv[i][j] == ' ') || - (bd->client.icccm.command.argv[i][j] == '\t') || - (bd->client.icccm.command.argv[i][j] == '\\') || - (bd->client.icccm.command.argv[i][j] == '\"') || - (bd->client.icccm.command.argv[i][j] == '\'') || - (bd->client.icccm.command.argv[i][j] == '$') || - (bd->client.icccm.command.argv[i][j] == '%')) - { - buf[k] = '\\'; + buf[k] = ' '; + k++; + } + for (j = 0; bd->client.icccm.command.argv[i][j]; j++) + { + if (k >= (int)(sizeof(buf) - 10)) + { + buf[k] = 0; + goto done; + } + if ((bd->client.icccm.command.argv[i][j] == ' ') || + (bd->client.icccm.command.argv[i][j] == '\t') || + (bd->client.icccm.command.argv[i][j] == '\\') || + (bd->client.icccm.command.argv[i][j] == '\"') || + (bd->client.icccm.command.argv[i][j] == '\'') || + (bd->client.icccm.command.argv[i][j] == '$') || + (bd->client.icccm.command.argv[i][j] == '%')) + { + buf[k] = '\\'; + k++; + } + buf[k] = bd->client.icccm.command.argv[i][j]; k++; } - buf[k] = bd->client.icccm.command.argv[i][j]; - k++; } + buf[k] = 0; + done: + cfdata->command = strdup(buf); } - buf[k] = 0; -done: - cfdata->command = strdup(buf); } if (rem) @@ -265,7 +291,10 @@ _create_data(E_Config_Dialog *cfd) E_Config_Dialog_Data *cfdata; cfdata = E_NEW(E_Config_Dialog_Data, 1); - cfdata->border = cfd->data; + if (!strcmp(cfd->class, "_border_remember_dialog")) + cfdata->border = cfd->data; + else + cfdata->rem = cfd->data; cfdata->applied = 1; return cfdata; } @@ -281,14 +310,17 @@ _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) free(cfdata->command); free(cfdata->desktop); - if (!cfdata->applied && cfdata->border->remember) + if (cfdata->border) { - e_remember_unuse(cfdata->border->remember); - e_remember_del(cfdata->border->remember); - e_config_save_queue(); - } + if (!cfdata->applied && cfdata->border->remember) + { + e_remember_unuse(cfdata->border->remember); + e_remember_del(cfdata->border->remember); + e_config_save_queue(); + } - cfdata->border->border_remember_dialog = NULL; + cfdata->border->border_remember_dialog = NULL; + } free(cfdata); } @@ -425,7 +457,10 @@ static int _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) { E_Border *bd = cfdata->border; - E_Remember *rem = bd->remember; + E_Remember *rem; + + if (bd) rem = bd->remember; + else rem = cfdata->rem; if (!rem) { @@ -475,19 +510,22 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) rem->match |= E_REMEMBER_MATCH_ROLE; rem->role = eina_stringshare_add(cfdata->role); } - if (cfdata->remember.match_type) + if (bd) { - rem->match |= E_REMEMBER_MATCH_TYPE; - rem->type = bd->client.netwm.type; - } + if (cfdata->remember.match_type) + { + rem->match |= E_REMEMBER_MATCH_TYPE; + rem->type = bd->client.netwm.type; + } - if (cfdata->remember.match_transient) - { - rem->match |= E_REMEMBER_MATCH_TRANSIENT; - if (bd->client.icccm.transient_for != 0) - rem->transient = 1; - else - rem->transient = 0; + if (cfdata->remember.match_transient) + { + rem->match |= E_REMEMBER_MATCH_TRANSIENT; + if (bd->client.icccm.transient_for != 0) + rem->transient = 1; + else + rem->transient = 0; + } } if (!rem->match) @@ -507,7 +545,8 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) e_dialog_button_add(dia, _("OK"), NULL, NULL, NULL); e_win_centered_set(dia->win, 1); e_dialog_show(dia); - cfdata->border->remember = rem; + if (bd) + cfdata->border->remember = rem; return 0; } @@ -566,7 +605,7 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) if (cfdata->remember.offer_resistance) rem->apply |= E_REMEMBER_APPLY_OFFER_RESISTANCE; - if (!rem->apply && !rem->prop.desktop_file) + if (bd && (!rem->apply && !rem->prop.desktop_file)) { e_remember_unuse(rem); e_remember_del(rem); @@ -575,13 +614,16 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) return 1; } - _check_matches(rem, 1); - rem->keep_settings = 0; - cfdata->border->remember = rem; - e_remember_update(cfdata->border); + if (bd) + { + _check_matches(rem, 1); + rem->keep_settings = 0; + cfdata->border->remember = rem; + e_remember_update(cfdata->border); + cfdata->applied = 1; + } rem->keep_settings = cfdata->remember.keep_settings; - cfdata->applied = 1; e_config_save_queue(); return 1; /* Apply was OK */ } @@ -670,21 +712,24 @@ _advanced_create_widgets(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_D { cfdata->remember.match_role = 0; } - if (cfdata->border->client.netwm.type != ECORE_X_WINDOW_TYPE_UNKNOWN) + if (cfdata->border) { - ob = e_widget_check_add(evas, _("Window type"), - &(cfdata->remember.match_type)); + if (cfdata->border->client.netwm.type != ECORE_X_WINDOW_TYPE_UNKNOWN) + { + ob = e_widget_check_add(evas, _("Window type"), + &(cfdata->remember.match_type)); + e_widget_list_object_append(of, ob, 1, 0, 0.5); + } + else + { + cfdata->remember.match_type = 0; + } + ob = e_widget_label_add(evas, _("wildcard matches are allowed")); + e_widget_list_object_append(of, ob, 1, 0, 0.5); + ob = e_widget_check_add(evas, _("Transience"), + &(cfdata->remember.match_transient)); e_widget_list_object_append(of, ob, 1, 0, 0.5); } - else - { - cfdata->remember.match_type = 0; - } - ob = e_widget_label_add(evas, _("wildcard matches are allowed")); - e_widget_list_object_append(of, ob, 1, 0, 0.5); - ob = e_widget_check_add(evas, _("Transience"), - &(cfdata->remember.match_transient)); - e_widget_list_object_append(of, ob, 1, 0, 0.5); e_widget_toolbook_page_append(o, NULL, _("Identifiers"), of, 1, 1, 1, 1, 0.5, 0.0); of = e_widget_table_add(evas, 0); diff --git a/src/bin/e_int_border_remember.h b/src/bin/e_int_border_remember.h index cb77669fb..460036fc2 100644 --- a/src/bin/e_int_border_remember.h +++ b/src/bin/e_int_border_remember.h @@ -4,6 +4,7 @@ #define E_INT_BORDER_REMEMBER_H EAPI void e_int_border_remember(E_Border *bd); +EAPI E_Config_Dialog *e_int_border_remember_edit(E_Remember *rem); #endif #endif diff --git a/src/modules/conf_window_remembers/e_int_config_remembers.c b/src/modules/conf_window_remembers/e_int_config_remembers.c index 599ef6e28..57642204b 100644 --- a/src/modules/conf_window_remembers/e_int_config_remembers.c +++ b/src/modules/conf_window_remembers/e_int_config_remembers.c @@ -7,15 +7,17 @@ static int _basic_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Conf static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); static void _fill_remembers(E_Config_Dialog_Data *cfdata); +static void _cb_edit(void *data, void *data2 __UNUSED__); static void _cb_delete(void *data, void *data2); static void _cb_list_change(void *data, Evas_Object *obj); struct _E_Config_Dialog_Data { - Evas_Object *list, *btn, *name, *class, *title, *role; + Evas_Object *list, *btn, *btn2, *name, *class, *title, *role; int remember_dialogs; int remember_fm_wins; int remember_internal_fm_windows_globally; + Eina_List *cfds; }; E_Config_Dialog * @@ -89,8 +91,10 @@ _create_data(E_Config_Dialog *cfd __UNUSED__) } static void -_free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) +_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) { + EINA_LIST_FREE(cfdata->cfds, cfd) + E_OBJECT_DEL_SET(cfd, NULL); free(cfdata); } @@ -133,10 +137,6 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) e_widget_check_widget_disable_on_unchecked_add(oc, ow); e_widget_list_object_append(ol, ow, 1, 0, 0.0); - ow = e_widget_button_add(evas, _("Delete"), "list-remove", - _cb_delete, cfdata, NULL); - cfdata->btn = ow; - ow = e_widget_ilist_add(evas, 1, 1, NULL); cfdata->list = ow; e_widget_ilist_multi_select_set(ow, 1); @@ -179,7 +179,14 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) e_widget_list_object_append(ol, cfdata->list, 1, 1, 0.0); e_widget_list_object_append(ol, of2, 1, 0, 0.0); - e_widget_list_object_append(ol, cfdata->btn, 1, 0, 0.0); + + of2 = e_widget_list_add(evas, 1, 1); + + cfdata->btn = ow = e_widget_button_add(evas, _("Edit"), "edit-rename", _cb_edit, cfdata, NULL); + e_widget_list_object_append(of2, ow, 1, 1, 0.5); + cfdata->btn2 = ow = e_widget_button_add(evas, _("Delete"), "list-remove", _cb_delete, cfdata, NULL); + e_widget_list_object_append(of2, ow, 1, 1, 0.5); + e_widget_list_object_append(ol, of2, 1, 1, 0.5); _cb_list_change(cfdata, NULL); return ol; @@ -276,6 +283,36 @@ _fill_remembers(E_Config_Dialog_Data *cfdata) e_widget_disabled_set(cfdata->btn, 1); } +static void +_cb_edit_del(void *obj) +{ + E_Config_Dialog_Data *cfdata; + + cfdata = e_object_data_get(obj); + cfdata->cfds = eina_list_remove(cfdata->cfds, obj); + _fill_remembers(cfdata); +} + +static void +_cb_edit(void *data, void *data2 __UNUSED__) +{ + E_Config_Dialog_Data *cfdata = data; + const Eina_List *l; + E_Ilist_Item *ili; + + EINA_LIST_FOREACH(e_widget_ilist_selected_items_get(cfdata->list), l, ili) + { + E_Remember *rem; + E_Config_Dialog *cfd; + + rem = e_widget_ilist_item_data_get(ili); + cfd = e_int_border_remember_edit(rem); + e_object_data_set(E_OBJECT(cfd), cfdata); + E_OBJECT_DEL_SET(cfd, _cb_edit_del); + cfdata->cfds = eina_list_append(cfdata->cfds, cfd); + } +} + static void _cb_delete(void *data, void *data2 __UNUSED__) {