add edit button to window remembers config dialog

ticket #789


SVN revision: 83724
This commit is contained in:
Mike Blumenkrantz 2013-02-07 09:23:29 +00:00
parent 3b94f5f39e
commit 2a0ef6c396
5 changed files with 186 additions and 100 deletions

View File

@ -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

2
NEWS
View File

@ -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.

View File

@ -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);

View File

@ -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

View File

@ -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__)
{