diff --git a/src/bin/e_int_border_remember.c b/src/bin/e_int_border_remember.c
index 80cd31d26..95712e780 100644
--- a/src/bin/e_int_border_remember.c
+++ b/src/bin/e_int_border_remember.c
@@ -57,6 +57,8 @@ struct _E_Config_Dialog_Data
int set_focus_on_start;
int keep_settings;
} remember;
+
+ int applied;
};
/* a nice easy setup function that does the dirty work */
@@ -97,55 +99,47 @@ _fill_data(E_Config_Dialog_Data *cfdata)
bd = cfdata->border;
rem = bd->remember;
- if (!bd->remember) cfdata->mode = MODE_NOTHING;
- else if ((cfdata->remember.apply_pos) && (cfdata->remember.apply_size) &&
- (cfdata->remember.apply_locks) && (cfdata->remember.apply_layer) &&
- (cfdata->remember.apply_border) && (cfdata->remember.apply_sticky) &&
- (cfdata->remember.apply_desktop) && (cfdata->remember.apply_shade) &&
- (cfdata->remember.apply_zone) && (cfdata->remember.apply_skip_winlist) &&
- (cfdata->remember.apply_skip_pager) && (cfdata->remember.apply_fullscreen) &&
- (cfdata->remember.apply_skip_taskbar))
- cfdata->mode = MODE_ALL;
- else if ((cfdata->remember.apply_pos) && (cfdata->remember.apply_size) &&
- (cfdata->remember.apply_locks))
- cfdata->mode = MODE_GEOMETRY_LOCKS;
- else if ((cfdata->remember.apply_pos) && (cfdata->remember.apply_size))
- cfdata->mode = MODE_GEOMETRY;
- else if ((cfdata->remember.apply_locks))
- cfdata->mode = MODE_LOCKS;
- else cfdata->mode = MODE_NOTHING;
-
- if (bd->remember)
+ if (rem)
{
- if (bd->remember->name)
- cfdata->name = strdup(bd->remember->name);
- if (bd->remember->class)
- cfdata->class = strdup(bd->remember->class);
- if (bd->remember->title)
- cfdata->title = strdup(bd->remember->title);
- if (bd->remember->prop.desktop_file)
- cfdata->desktop = strdup(bd->remember->prop.desktop_file);
+ if (rem->name && rem->name[0])
+ cfdata->name = strdup(rem->name);
+ if (rem->class && rem->class[0])
+ cfdata->class = strdup(rem->class);
+ if (rem->title && rem->title[0])
+ cfdata->title = strdup(rem->title);
+ if (rem->role && rem->role[0])
+ cfdata->role = strdup(rem->role);
+ if (rem->prop.command && rem->prop.command[0])
+ cfdata->command = strdup(rem->prop.command);
+ if (rem->prop.desktop_file && rem->prop.desktop_file[0])
+ cfdata->desktop = strdup(rem->prop.desktop_file);
if (cfdata->desktop)
cfdata->remember.apply_desktop_file = 1;
}
- if (!cfdata->name && bd->client.icccm.name && bd->client.icccm.name[0])
+ 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])
+ if (!cfdata->class &&
+ bd->client.icccm.class &&
+ bd->client.icccm.class[0])
cfdata->class = strdup(bd->client.icccm.class);
- if (bd->client.icccm.window_role && bd->client.icccm.window_role[0])
+ 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->client.netwm.name && bd->client.netwm.name[0])
- cfdata->title = strdup(bd->client.netwm.name);
- else if (bd->client.icccm.title && bd->client.icccm.title[0])
- cfdata->title = strdup(bd->client.icccm.title);
+ 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 ((bd->client.icccm.command.argc > 0) &&
+ if (!cfdata->command &&
+ (bd->client.icccm.command.argc > 0) &&
(bd->client.icccm.command.argv))
{
char buf[4096];
@@ -190,30 +184,79 @@ _fill_data(E_Config_Dialog_Data *cfdata)
if (rem)
{
if (rem->apply_first_only) cfdata->remember.apply_first_only = 1;
- if (rem->keep_settings) cfdata->remember.keep_settings = 1;
- if (rem->match & E_REMEMBER_MATCH_NAME) cfdata->remember.match_name = 1;
- if (rem->match & E_REMEMBER_MATCH_CLASS) cfdata->remember.match_class = 1;
- if (rem->match & E_REMEMBER_MATCH_TITLE) cfdata->remember.match_title = 1;
- if (rem->match & E_REMEMBER_MATCH_ROLE) cfdata->remember.match_role = 1;
- if (rem->match & E_REMEMBER_MATCH_TYPE) cfdata->remember.match_type = 1;
- if (rem->match & E_REMEMBER_MATCH_TRANSIENT) cfdata->remember.match_transient = 1;
- if (rem->apply & E_REMEMBER_APPLY_POS) cfdata->remember.apply_pos = 1;
- if (rem->apply & E_REMEMBER_APPLY_SIZE) cfdata->remember.apply_size = 1;
- if (rem->apply & E_REMEMBER_APPLY_LAYER) cfdata->remember.apply_layer = 1;
- if (rem->apply & E_REMEMBER_APPLY_LOCKS) cfdata->remember.apply_locks = 1;
- if (rem->apply & E_REMEMBER_APPLY_BORDER) cfdata->remember.apply_border = 1;
- if (rem->apply & E_REMEMBER_APPLY_STICKY) cfdata->remember.apply_sticky = 1;
- if (rem->apply & E_REMEMBER_APPLY_DESKTOP) cfdata->remember.apply_desktop = 1;
- if (rem->apply & E_REMEMBER_APPLY_SHADE) cfdata->remember.apply_shade = 1;
- if (rem->apply & E_REMEMBER_APPLY_FULLSCREEN) cfdata->remember.apply_fullscreen = 1;
- if (rem->apply & E_REMEMBER_APPLY_ZONE) cfdata->remember.apply_zone = 1;
- if (rem->apply & E_REMEMBER_APPLY_SKIP_WINLIST) cfdata->remember.apply_skip_winlist = 1;
- if (rem->apply & E_REMEMBER_APPLY_SKIP_PAGER) cfdata->remember.apply_skip_pager = 1;
- if (rem->apply & E_REMEMBER_APPLY_SKIP_TASKBAR) cfdata->remember.apply_skip_taskbar = 1;
- if (rem->apply & E_REMEMBER_APPLY_RUN) cfdata->remember.apply_run = 1;
- if (rem->apply & E_REMEMBER_APPLY_ICON_PREF) cfdata->remember.apply_icon_pref = 1;
- if (rem->apply & E_REMEMBER_SET_FOCUS_ON_START) cfdata->remember.set_focus_on_start = 1;
+ if (rem->keep_settings) cfdata->remember.keep_settings = 1;
+
+ if (rem->match & E_REMEMBER_MATCH_NAME)
+ cfdata->remember.match_name = 1;
+ if (rem->match & E_REMEMBER_MATCH_CLASS)
+ cfdata->remember.match_class = 1;
+ if (rem->match & E_REMEMBER_MATCH_TITLE)
+ cfdata->remember.match_title = 1;
+ if (rem->match & E_REMEMBER_MATCH_ROLE)
+ cfdata->remember.match_role = 1;
+ if (rem->match & E_REMEMBER_MATCH_TYPE)
+ cfdata->remember.match_type = 1;
+ if (rem->match & E_REMEMBER_MATCH_TRANSIENT)
+ cfdata->remember.match_transient = 1;
+ if (rem->apply & E_REMEMBER_APPLY_POS)
+ cfdata->remember.apply_pos = 1;
+ if (rem->apply & E_REMEMBER_APPLY_SIZE)
+ cfdata->remember.apply_size = 1;
+ if (rem->apply & E_REMEMBER_APPLY_LAYER)
+ cfdata->remember.apply_layer = 1;
+ if (rem->apply & E_REMEMBER_APPLY_LOCKS)
+ cfdata->remember.apply_locks = 1;
+ if (rem->apply & E_REMEMBER_APPLY_BORDER)
+ cfdata->remember.apply_border = 1;
+ if (rem->apply & E_REMEMBER_APPLY_STICKY)
+ cfdata->remember.apply_sticky = 1;
+ if (rem->apply & E_REMEMBER_APPLY_DESKTOP)
+ cfdata->remember.apply_desktop = 1;
+ if (rem->apply & E_REMEMBER_APPLY_SHADE)
+ cfdata->remember.apply_shade = 1;
+ if (rem->apply & E_REMEMBER_APPLY_FULLSCREEN)
+ cfdata->remember.apply_fullscreen = 1;
+ if (rem->apply & E_REMEMBER_APPLY_ZONE)
+ cfdata->remember.apply_zone = 1;
+ if (rem->apply & E_REMEMBER_APPLY_SKIP_WINLIST)
+ cfdata->remember.apply_skip_winlist = 1;
+ if (rem->apply & E_REMEMBER_APPLY_SKIP_PAGER)
+ cfdata->remember.apply_skip_pager = 1;
+ if (rem->apply & E_REMEMBER_APPLY_SKIP_TASKBAR)
+ cfdata->remember.apply_skip_taskbar = 1;
+ if (rem->apply & E_REMEMBER_APPLY_RUN)
+ cfdata->remember.apply_run = 1;
+ if (rem->apply & E_REMEMBER_APPLY_ICON_PREF)
+ cfdata->remember.apply_icon_pref = 1;
+ if (rem->apply & E_REMEMBER_SET_FOCUS_ON_START)
+ cfdata->remember.set_focus_on_start = 1;
}
+
+ if (!rem) cfdata->mode = MODE_NOTHING;
+ else if ((cfdata->remember.apply_pos) &&
+ (cfdata->remember.apply_size) &&
+ (cfdata->remember.apply_locks) &&
+ (cfdata->remember.apply_layer) &&
+ (cfdata->remember.apply_border) &&
+ (cfdata->remember.apply_sticky) &&
+ (cfdata->remember.apply_desktop) &&
+ (cfdata->remember.apply_shade) &&
+ (cfdata->remember.apply_zone) &&
+ (cfdata->remember.apply_skip_winlist) &&
+ (cfdata->remember.apply_skip_pager) &&
+ (cfdata->remember.apply_fullscreen) &&
+ (cfdata->remember.apply_skip_taskbar))
+ cfdata->mode = MODE_ALL;
+ else if ((cfdata->remember.apply_pos) &&
+ (cfdata->remember.apply_size) &&
+ (cfdata->remember.apply_locks))
+ cfdata->mode = MODE_GEOMETRY_LOCKS;
+ else if ((cfdata->remember.apply_pos) &&
+ (cfdata->remember.apply_size))
+ cfdata->mode = MODE_GEOMETRY;
+ else if ((cfdata->remember.apply_locks))
+ cfdata->mode = MODE_LOCKS;
+ else cfdata->mode = MODE_NOTHING;
}
@@ -228,6 +271,7 @@ _create_data(E_Config_Dialog *cfd)
cfdata = E_NEW(E_Config_Dialog_Data, 1);
cfdata->border = cfd->data;
+ cfdata->applied = 1;
_fill_data(cfdata);
return cfdata;
}
@@ -236,87 +280,92 @@ static void
_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
{
/* Free the cfdata */
- if (cfdata->name) free(cfdata->name);
- if (cfdata->class) free(cfdata->class);
- if (cfdata->title) free(cfdata->title);
- if (cfdata->role) free(cfdata->role);
+ if (cfdata->name) free(cfdata->name);
+ if (cfdata->class) free(cfdata->class);
+ if (cfdata->title) free(cfdata->title);
+ if (cfdata->role) free(cfdata->role);
if (cfdata->command) free(cfdata->command);
if (cfdata->desktop) free(cfdata->desktop);
+ 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;
free(cfdata);
}
-/**--APPLY--**/
+static void
+_warning_dialog_show(E_Container *con)
+{
+ E_Dialog *dia;
+
+ dia = e_dialog_new(con, "E", "_border_remember_error_multi_dialog");
+ e_dialog_title_set(dia, _("Window properties are not a unique match"));
+ e_dialog_text_set
+ (dia,
+ _("You are trying to ask Enlightenment to remember to apply
"
+ "properties (such as size, location, border style etc.) to
"
+ "a window that does not have unique properties.
"
+ "
"
+ "This means it shares Name/Class, Transience, Role etc. properties
"
+ "with more than 1 other window on the screen and remembering
"
+ "properties for this window will apply to all other windows
"
+ "that match these properties.
"
+ "
"
+ "This is just a warning in case you did not intend this to happen.
"
+ "If you did, simply press Apply or OK buttons
"
+ "and your settings will be accepted. Press Cancel if you
"
+ "are not sure and nothing will be affected.")
+ );
+ e_dialog_button_add(dia, _("OK"), NULL, NULL, NULL);
+ e_win_centered_set(dia->win, 1);
+ e_dialog_show(dia);
+}
+
static int
-_check_matches(E_Config_Dialog_Data *cfdata, int update)
+_check_matches(E_Remember *rem, int update)
{
Eina_List *l;
E_Border *bd;
const char *title;
- int matchflags = 0;
- int required_matches = 0;
int n = 0;
- if (cfdata->remember.match_name)
- {
- matchflags |= E_REMEMBER_MATCH_NAME;
- required_matches++;
- }
- if (cfdata->remember.match_class)
- {
- matchflags |= E_REMEMBER_MATCH_CLASS;
- required_matches++;
- }
- if (cfdata->remember.match_title)
- {
- matchflags |= E_REMEMBER_MATCH_TITLE;
- required_matches++;
- }
- if (cfdata->remember.match_role)
- {
- matchflags |= E_REMEMBER_MATCH_ROLE;
- required_matches++;
- }
- if (cfdata->remember.match_type)
- {
- matchflags |= E_REMEMBER_MATCH_TYPE;
- required_matches++;
- }
-
- if (cfdata->remember.match_transient)
- {
- matchflags |= E_REMEMBER_MATCH_TRANSIENT;
- required_matches++;
- }
-
EINA_LIST_FOREACH(e_border_client_list(), l, bd)
{
- int matches = 0;
-
+ int match = rem->match;
title = e_border_name_get(bd);
- if ((matchflags & E_REMEMBER_MATCH_NAME) &&
- (e_util_glob_match(bd->client.icccm.name, cfdata->name)))
- matches++;
- if ((matchflags & E_REMEMBER_MATCH_CLASS) &&
- (e_util_glob_match(bd->client.icccm.class, cfdata->class)))
- matches++;
- if ((matchflags & E_REMEMBER_MATCH_TITLE) &&
- (e_util_glob_match(title, cfdata->title)))
- matches++;
- if ((matchflags & E_REMEMBER_MATCH_ROLE) &&
- ((!e_util_strcmp(cfdata->role, bd->client.icccm.window_role)) ||
- (e_util_both_str_empty(cfdata->role, bd->client.icccm.window_role))))
- matches++;
- if ((matchflags & E_REMEMBER_MATCH_TYPE) &&
- (cfdata->border->client.netwm.type == bd->client.netwm.type))
- matches++;
- if ((matchflags & E_REMEMBER_MATCH_TRANSIENT) &&
- ((cfdata->remember.match_transient && bd->client.icccm.transient_for != 0) ||
- (!cfdata->remember.match_transient && (bd->client.icccm.transient_for == 0))))
- matches++;
- if (matches >= required_matches) n++;
+ if ((match & E_REMEMBER_MATCH_NAME) &&
+ (e_util_glob_match(bd->client.icccm.name, rem->name)))
+ match &= ~E_REMEMBER_MATCH_NAME;
+
+ if ((match & E_REMEMBER_MATCH_CLASS) &&
+ (e_util_glob_match(bd->client.icccm.class, rem->class)))
+ match &= ~E_REMEMBER_MATCH_CLASS;
+
+ if ((match & E_REMEMBER_MATCH_TITLE) &&
+ (e_util_glob_match(title, rem->title)))
+ match &= ~E_REMEMBER_MATCH_TITLE;
+
+ if ((match & E_REMEMBER_MATCH_ROLE) &&
+ ((!e_util_strcmp(rem->role, bd->client.icccm.window_role)) ||
+ (e_util_both_str_empty(rem->role, bd->client.icccm.window_role))))
+ match &= ~E_REMEMBER_MATCH_ROLE;
+
+ if ((match & E_REMEMBER_MATCH_TYPE) &&
+ (rem->type == bd->client.netwm.type))
+ match &= ~E_REMEMBER_MATCH_TYPE;
+
+ if ((match & E_REMEMBER_MATCH_TRANSIENT) &&
+ ((rem->transient && bd->client.icccm.transient_for != 0) ||
+ (!rem->transient && (bd->client.icccm.transient_for == 0))))
+ match &= ~E_REMEMBER_MATCH_TRANSIENT;
+
+ if (match == 0) n++;
if (update)
{
@@ -328,138 +377,63 @@ _check_matches(E_Config_Dialog_Data *cfdata, int update)
return n;
}
-static void
-_remember_update(E_Remember *rem, E_Config_Dialog_Data *cfdata)
-{
- if (rem->name) eina_stringshare_del(rem->name);
- if (rem->class) eina_stringshare_del(rem->class);
- if (rem->title) eina_stringshare_del(rem->title);
- if (rem->role) eina_stringshare_del(rem->role);
- if (rem->prop.command) eina_stringshare_del(rem->prop.command);
- if (rem->prop.desktop_file) eina_stringshare_del(rem->prop.desktop_file);
- rem->name = NULL;
- rem->class = NULL;
- rem->title = NULL;
- rem->role = NULL;
- rem->prop.command = NULL;
- rem->prop.desktop_file = NULL;
- if (cfdata->name && cfdata->name[0])
- rem->name = eina_stringshare_add(cfdata->name);
- if (cfdata->class && cfdata->class[0])
- rem->class = eina_stringshare_add(cfdata->class);
- if (cfdata->title && cfdata->title[0])
- rem->title = eina_stringshare_add(cfdata->title);
- if (cfdata->role && cfdata->role[0])
- rem->role = eina_stringshare_add(cfdata->role);
- if (cfdata->command && cfdata->command[0])
- rem->prop.command = eina_stringshare_add(cfdata->command);
-
- if (cfdata->remember.apply_desktop_file && cfdata->desktop)
- rem->prop.desktop_file = eina_stringshare_add(cfdata->desktop);
-
-}
-
static int
_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
{
/* Actually take our cfdata settings and apply them in real life */
- E_Remember *rem;
-
+ E_Border *bd = cfdata->border;
+ E_Remember *rem = bd->remember;;
+
if (cfdata->mode == MODE_NOTHING)
{
- if (cfdata->border->remember)
+ if (rem)
{
- rem = cfdata->border->remember;
- cfdata->border->remember = NULL;
e_remember_unuse(rem);
e_remember_del(rem);
}
e_config_save_queue();
return 1;
}
- if (!cfdata->warned)
- {
- int matches = 0;
- cfdata->remember.match_role = 1;
- cfdata->remember.match_type = 1;
- cfdata->remember.match_transient = 1;
-
- if ((cfdata->name) && (cfdata->class))
- {
- cfdata->remember.match_name = 1;
- cfdata->remember.match_class = 1;
- }
- else
- cfdata->remember.match_title = 1;
-
- matches = _check_matches(cfdata, 0);
-
- if (matches > 1)
- {
- E_Dialog *dia;
-
- dia = e_dialog_new(cfd->con, "E", "_border_remember_error_multi_dialog");
- e_dialog_title_set(dia, _("Window properties are not a unique match"));
- e_dialog_text_set
- (dia,
- _("You are trying to ask Enlightenment to remember to apply
"
- "properties (such as size, location, border style etc.) to
"
- "a window that does not have unique properties.
"
- "
"
- "This means it shares Name/Class, Transience, Role etc. properties
"
- "with more than 1 other window on the screen and remembering
"
- "properties for this window will apply to all other windows
"
- "that match these properties.
"
- "
"
- "This is just a warning in case you did not intend this to happen.
"
- "If you did, simply press Apply or OK buttons
"
- "and your settings will be accepted. Press Cancel if you
"
- "are not sure and nothing will be affected.")
- );
- e_dialog_button_add(dia, _("OK"), NULL, NULL, NULL);
- e_win_centered_set(dia->win, 1);
- e_dialog_show(dia);
- cfdata->warned = 1;
- return 0;
- }
- }
-
- rem = cfdata->border->remember;
if (!rem)
{
rem = e_remember_new();
if (rem)
- e_remember_use(rem);
+ {
+ bd->remember = rem;
+ cfdata->applied = 0;
+ }
+ else
+ return 0;
}
+
+ e_remember_default_match_set(rem, cfdata->border);
- if (rem)
+ if ((!cfdata->warned) && (_check_matches(rem, 0) > 1))
{
- e_remember_default_match_set(rem, cfdata->border);
-
- if (cfdata->mode == MODE_GEOMETRY)
- rem->apply = E_REMEMBER_APPLY_POS | E_REMEMBER_APPLY_SIZE;
- else if (cfdata->mode == MODE_LOCKS)
- rem->apply = E_REMEMBER_APPLY_LOCKS;
- else if (cfdata->mode == MODE_GEOMETRY_LOCKS)
- rem->apply = E_REMEMBER_APPLY_POS | E_REMEMBER_APPLY_SIZE | E_REMEMBER_APPLY_LOCKS;
- else if (cfdata->mode == MODE_ALL)
- rem->apply = E_REMEMBER_APPLY_POS | E_REMEMBER_APPLY_SIZE | E_REMEMBER_APPLY_LAYER |
- E_REMEMBER_APPLY_LOCKS | E_REMEMBER_APPLY_BORDER | E_REMEMBER_APPLY_STICKY |
- E_REMEMBER_APPLY_DESKTOP | E_REMEMBER_APPLY_SHADE | E_REMEMBER_APPLY_ZONE |
- E_REMEMBER_APPLY_SKIP_WINLIST | E_REMEMBER_APPLY_SKIP_PAGER | E_REMEMBER_APPLY_SKIP_TASKBAR |
- E_REMEMBER_APPLY_FULLSCREEN | E_REMEMBER_APPLY_ICON_PREF;
- rem->apply_first_only = 0;
- cfdata->remember.apply_desktop_file = 0;
- _remember_update(rem, cfdata);
- _check_matches(cfdata, 1);
-
- cfdata->border->remember = rem;
- e_remember_update(cfdata->border);
+ _warning_dialog_show(cfd->con);
+ cfdata->warned = 1;
+ return 0;
}
+
+ if (cfdata->mode == MODE_GEOMETRY)
+ rem->apply = E_REMEMBER_APPLY_POS | E_REMEMBER_APPLY_SIZE;
+ else if (cfdata->mode == MODE_LOCKS)
+ rem->apply = E_REMEMBER_APPLY_LOCKS;
+ else if (cfdata->mode == MODE_GEOMETRY_LOCKS)
+ rem->apply = E_REMEMBER_APPLY_POS | E_REMEMBER_APPLY_SIZE | E_REMEMBER_APPLY_LOCKS;
+ else if (cfdata->mode == MODE_ALL)
+ rem->apply = E_REMEMBER_APPLY_POS | E_REMEMBER_APPLY_SIZE | E_REMEMBER_APPLY_LAYER |
+ E_REMEMBER_APPLY_LOCKS | E_REMEMBER_APPLY_BORDER | E_REMEMBER_APPLY_STICKY |
+ E_REMEMBER_APPLY_DESKTOP | E_REMEMBER_APPLY_SHADE | E_REMEMBER_APPLY_ZONE |
+ E_REMEMBER_APPLY_SKIP_WINLIST | E_REMEMBER_APPLY_SKIP_PAGER |
+ E_REMEMBER_APPLY_SKIP_TASKBAR | E_REMEMBER_APPLY_FULLSCREEN | E_REMEMBER_APPLY_ICON_PREF;
+ rem->apply_first_only = 0;
-
+ e_remember_use(rem);
+ e_remember_update(bd);
+ cfdata->applied = 1;
e_config_save_queue();
return 1; /* Apply was OK */
}
@@ -467,33 +441,73 @@ _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
static int
_advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
{
- /* Actually take our cfdata settings and apply them in real life */
E_Border *bd = cfdata->border;
E_Remember *rem = bd->remember;
- if (!((cfdata->remember.apply_pos) || (cfdata->remember.apply_size) ||
- (cfdata->remember.apply_locks) || (cfdata->remember.apply_layer) ||
- (cfdata->remember.apply_border) || (cfdata->remember.apply_sticky) ||
- (cfdata->remember.apply_desktop) || (cfdata->remember.apply_shade) ||
- (cfdata->remember.apply_zone) || (cfdata->remember.apply_skip_winlist) ||
- (cfdata->remember.apply_skip_pager) || (cfdata->remember.apply_skip_taskbar) ||
- (cfdata->remember.apply_run) || (cfdata->remember.apply_icon_pref) ||
- (cfdata->remember.set_focus_on_start) || (cfdata->remember.apply_fullscreen) ||
- (cfdata->remember.apply_desktop_file)))
+ if (!rem)
{
+ cfdata->applied = 0;
+ rem = e_remember_new();
if (rem)
- {
- e_remember_unuse(rem);
- e_remember_del(rem);
- cfdata->border->remember = NULL;
- }
- e_config_save_queue();
- return 1;
+ e_remember_use(rem);
+ else
+ return 0;
+ }
+ else
+ {
+ if (rem->name) eina_stringshare_del(rem->name);
+ if (rem->class) eina_stringshare_del(rem->class);
+ if (rem->title) eina_stringshare_del(rem->title);
+ if (rem->role) eina_stringshare_del(rem->role);
+ if (rem->prop.command) eina_stringshare_del(rem->prop.command);
+ if (rem->prop.desktop_file) eina_stringshare_del(rem->prop.desktop_file);
+ rem->name = NULL;
+ rem->class = NULL;
+ rem->title = NULL;
+ rem->role = NULL;
+ rem->prop.command = NULL;
+ rem->prop.desktop_file = NULL;
+ }
+
+ rem->match = 0;
+ rem->apply_first_only = cfdata->remember.apply_first_only;
+
+ if (cfdata->remember.match_name && cfdata->name && cfdata->name[0])
+ {
+ rem->match |= E_REMEMBER_MATCH_NAME;
+ rem->name = eina_stringshare_add(cfdata->name);
+ }
+ if (cfdata->remember.match_class && cfdata->class && cfdata->class[0])
+ {
+ rem->match |= E_REMEMBER_MATCH_CLASS;
+ rem->class = eina_stringshare_add(cfdata->class);
+ }
+ if (cfdata->remember.match_title && cfdata->title && cfdata->title[0])
+ {
+ rem->match |= E_REMEMBER_MATCH_TITLE;
+ rem->title = eina_stringshare_add(cfdata->title);
+ }
+ if (cfdata->remember.match_role && cfdata->role && cfdata->role[0])
+ {
+ rem->match |= E_REMEMBER_MATCH_ROLE;
+ rem->role = eina_stringshare_add(cfdata->role);
+ }
+ 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_name) || (cfdata->remember.match_class) ||
- (cfdata->remember.match_title) || (cfdata->remember.match_role) ||
- (cfdata->remember.match_type) || (cfdata->remember.match_transient)))
+ if (!rem->match)
{
E_Dialog *dia;
@@ -510,93 +524,79 @@ _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;
return 0;
}
+
+ /* TODO warn when match doesnt match the current window
+ * (when using globs) */
+
if (!cfdata->warned)
{
if ((!cfdata->remember.apply_first_only) &&
- (_check_matches(cfdata, 0) > 1))
+ (_check_matches(rem, 0) > 1))
{
- E_Dialog *dia;
-
- dia = e_dialog_new(cfd->con, "E", "_border_remember_error_no_remember_dialog");
- e_dialog_title_set(dia, _("No match properties set"));
- e_dialog_text_set
- (dia,
- _("You are trying to ask Enlightenment to remember to apply
"
- "properties (such as size, location, border style etc.) to
"
- "a window that does not have unique properties.
"
- "
"
- "This means it shares Name/Class, Transience, Role etc. properties
"
- "with more than 1 other window on the screen and remembering
"
- "properties for this window will apply to all other windows
"
- "that match these properties.
"
- "
"
- "You may wish to enable the Match only one window option if
"
- "you only intend one instance of this window to be modified, with
"
- "additional instances not being modified.
"
- "
"
- "This is just a warning in case you did not intend this to happen.
"
- "If you did, simply press Apply or OK buttons
"
- "and your settings will be accepted. Press Cancel if you
"
- "are not sure and nothing will be affected.")
- );
- e_dialog_button_add(dia, _("OK"), NULL, NULL, NULL);
- e_win_centered_set(dia->win, 1);
- e_dialog_show(dia);
+ _warning_dialog_show(cfd->con);
cfdata->warned = 1;
return 0;
}
}
+
+ if (cfdata->command && cfdata->command[0])
+ rem->prop.command = eina_stringshare_add(cfdata->command);
+ if (cfdata->remember.apply_desktop_file && cfdata->desktop)
+ rem->prop.desktop_file = eina_stringshare_add(cfdata->desktop);
- if (!rem)
+ rem->apply = 0;
+ if (cfdata->remember.apply_pos)
+ rem->apply |= E_REMEMBER_APPLY_POS;
+ if (cfdata->remember.apply_size)
+ rem->apply |= E_REMEMBER_APPLY_SIZE;
+ if (cfdata->remember.apply_layer)
+ rem->apply |= E_REMEMBER_APPLY_LAYER;
+ if (cfdata->remember.apply_locks)
+ rem->apply |= E_REMEMBER_APPLY_LOCKS;
+ if (cfdata->remember.apply_border)
+ rem->apply |= E_REMEMBER_APPLY_BORDER;
+ if (cfdata->remember.apply_sticky)
+ rem->apply |= E_REMEMBER_APPLY_STICKY;
+ if (cfdata->remember.apply_desktop)
+ rem->apply |= E_REMEMBER_APPLY_DESKTOP;
+ if (cfdata->remember.apply_shade)
+ rem->apply |= E_REMEMBER_APPLY_SHADE;
+ if (cfdata->remember.apply_fullscreen)
+ rem->apply |= E_REMEMBER_APPLY_FULLSCREEN;
+ if (cfdata->remember.apply_zone)
+ rem->apply |= E_REMEMBER_APPLY_ZONE;
+ if (cfdata->remember.apply_skip_winlist)
+ rem->apply |= E_REMEMBER_APPLY_SKIP_WINLIST;
+ if (cfdata->remember.apply_skip_pager)
+ rem->apply |= E_REMEMBER_APPLY_SKIP_PAGER;
+ if (cfdata->remember.apply_skip_taskbar)
+ rem->apply |= E_REMEMBER_APPLY_SKIP_TASKBAR;
+ if (cfdata->remember.apply_run)
+ rem->apply |= E_REMEMBER_APPLY_RUN;
+ if (cfdata->remember.apply_icon_pref)
+ rem->apply |= E_REMEMBER_APPLY_ICON_PREF;
+ if (cfdata->remember.set_focus_on_start)
+ rem->apply |= E_REMEMBER_SET_FOCUS_ON_START;
+
+ if (!rem->apply && !rem->prop.desktop_file)
{
- rem = e_remember_new();
- if (rem)
- e_remember_use(rem);
+ e_remember_unuse(rem);
+ e_remember_del(rem);
+ if (cfdata->border->remember)
+ e_config_save_queue();
+ return 1;
}
- if (rem)
- {
- rem->apply = 0;
- rem->match = 0;
- rem->apply_first_only = cfdata->remember.apply_first_only;
- if (cfdata->remember.match_name) rem->match |= E_REMEMBER_MATCH_NAME;
- if (cfdata->remember.match_class) rem->match |= E_REMEMBER_MATCH_CLASS;
- if (cfdata->remember.match_title) rem->match |= E_REMEMBER_MATCH_TITLE;
- if (cfdata->remember.match_role) rem->match |= E_REMEMBER_MATCH_ROLE;
- if (cfdata->remember.match_type) rem->match |= E_REMEMBER_MATCH_TYPE;
- if (cfdata->remember.match_transient) rem->match |= E_REMEMBER_MATCH_TRANSIENT;
- if (cfdata->remember.apply_pos) rem->apply |= E_REMEMBER_APPLY_POS;
- if (cfdata->remember.apply_size) rem->apply |= E_REMEMBER_APPLY_SIZE;
- if (cfdata->remember.apply_layer) rem->apply |= E_REMEMBER_APPLY_LAYER;
- if (cfdata->remember.apply_locks) rem->apply |= E_REMEMBER_APPLY_LOCKS;
- if (cfdata->remember.apply_border) rem->apply |= E_REMEMBER_APPLY_BORDER;
- if (cfdata->remember.apply_sticky) rem->apply |= E_REMEMBER_APPLY_STICKY;
- if (cfdata->remember.apply_desktop) rem->apply |= E_REMEMBER_APPLY_DESKTOP;
- if (cfdata->remember.apply_shade) rem->apply |= E_REMEMBER_APPLY_SHADE;
- if (cfdata->remember.apply_fullscreen) rem->apply |= E_REMEMBER_APPLY_FULLSCREEN;
- if (cfdata->remember.apply_zone) rem->apply |= E_REMEMBER_APPLY_ZONE;
- if (cfdata->remember.apply_skip_winlist) rem->apply |= E_REMEMBER_APPLY_SKIP_WINLIST;
- if (cfdata->remember.apply_skip_pager) rem->apply |= E_REMEMBER_APPLY_SKIP_PAGER;
- if (cfdata->remember.apply_skip_taskbar) rem->apply |= E_REMEMBER_APPLY_SKIP_TASKBAR;
- if (cfdata->remember.apply_run) rem->apply |= E_REMEMBER_APPLY_RUN;
- if (cfdata->remember.apply_icon_pref) rem->apply |= E_REMEMBER_APPLY_ICON_PREF;
- if (cfdata->remember.set_focus_on_start) rem->apply |= E_REMEMBER_SET_FOCUS_ON_START;
-
- if (bd->client.icccm.transient_for != 0)
- rem->transient = 1;
- else
- rem->transient = 0;
-
- _remember_update(rem, cfdata);
- _check_matches(cfdata, 1);
- rem->keep_settings = 0;
- cfdata->border->remember = rem;
- e_remember_update(cfdata->border);
- rem->keep_settings = cfdata->remember.keep_settings;
- }
+ _check_matches(rem, 1);
+ rem->keep_settings = 0;
+ cfdata->border->remember = rem;
+ e_remember_update(cfdata->border);
+ rem->keep_settings = cfdata->remember.keep_settings;
+ cfdata->applied = 1;
e_config_save_queue();
return 1; /* Apply was OK */
}
@@ -635,7 +635,8 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
of = e_widget_framelist_add(evas, _("Remember using"), 0);
if (cfdata->name)
{
- ob = e_widget_check_add(evas, _("Window name"), &(cfdata->remember.match_name));
+ ob = e_widget_check_add(evas, _("Window name"),
+ &(cfdata->remember.match_name));
e_widget_framelist_object_append(of, ob);
ob = e_widget_entry_add(evas, &cfdata->name, NULL, NULL, NULL);
e_widget_framelist_object_append(of, ob);
@@ -646,7 +647,8 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
}
if (cfdata->class)
{
- ob = e_widget_check_add(evas, _("Window class"), &(cfdata->remember.match_class));
+ ob = e_widget_check_add(evas, _("Window class"),
+ &(cfdata->remember.match_class));
e_widget_framelist_object_append(of, ob);
ob = e_widget_entry_add(evas, &cfdata->class, NULL, NULL, NULL);
e_widget_framelist_object_append(of, ob);
@@ -657,7 +659,8 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
}
if (cfdata->title)
{
- ob = e_widget_check_add(evas, _("Title"), &(cfdata->remember.match_title));
+ ob = e_widget_check_add(evas, _("Title"),
+ &(cfdata->remember.match_title));
e_widget_framelist_object_append(of, ob);
ob = e_widget_entry_add(evas, &cfdata->title, NULL, NULL, NULL);
e_widget_framelist_object_append(of, ob);
@@ -668,7 +671,8 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
}
if (cfdata->role)
{
- ob = e_widget_check_add(evas, _("Window Role"), &(cfdata->remember.match_role));
+ ob = e_widget_check_add(evas, _("Window Role"),
+ &(cfdata->remember.match_role));
e_widget_framelist_object_append(of, ob);
ob = e_widget_entry_add(evas, &cfdata->role, NULL, NULL, NULL);
e_widget_framelist_object_append(of, ob);
@@ -679,7 +683,8 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
}
if (cfdata->border->client.netwm.type != ECORE_X_WINDOW_TYPE_UNKNOWN)
{
- ob = e_widget_check_add(evas, _("Window type"), &(cfdata->remember.match_type));
+ ob = e_widget_check_add(evas, _("Window type"),
+ &(cfdata->remember.match_type));
e_widget_framelist_object_append(of, ob);
}
else
@@ -688,58 +693,78 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
}
ob = e_widget_label_add(evas, _("wildcard matches are allowed"));
e_widget_framelist_object_append(of, ob);
- ob = e_widget_check_add(evas, _("Transience"), &(cfdata->remember.match_transient));
+ ob = e_widget_check_add(evas, _("Transience"),
+ &(cfdata->remember.match_transient));
e_widget_framelist_object_append(of, ob);
e_widget_table_object_append(o, of, 0, 0, 1, 1, 1, 1, 1, 1);
of = e_widget_frametable_add(evas, _("Properties to remember"), 0);
- ob = e_widget_check_add(evas, _("Position"), &(cfdata->remember.apply_pos));
+ ob = e_widget_check_add(evas, _("Position"),
+ &(cfdata->remember.apply_pos));
e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 1, 1, 1);
- ob = e_widget_check_add(evas, _("Size"), &(cfdata->remember.apply_size));
+ ob = e_widget_check_add(evas, _("Size"),
+ &(cfdata->remember.apply_size));
e_widget_frametable_object_append(of, ob, 0, 1, 1, 1, 1, 1, 1, 1);
- ob = e_widget_check_add(evas, _("Stacking"), &(cfdata->remember.apply_layer));
+ ob = e_widget_check_add(evas, _("Stacking"),
+ &(cfdata->remember.apply_layer));
e_widget_frametable_object_append(of, ob, 0, 2, 1, 1, 1, 1, 1, 1);
- ob = e_widget_check_add(evas, _("Locks"), &(cfdata->remember.apply_locks));
+ ob = e_widget_check_add(evas, _("Locks"),
+ &(cfdata->remember.apply_locks));
e_widget_frametable_object_append(of, ob, 0, 3, 1, 1, 1, 1, 1, 1);
- ob = e_widget_check_add(evas, _("Border style"), &(cfdata->remember.apply_border));
+ ob = e_widget_check_add(evas, _("Border style"),
+ &(cfdata->remember.apply_border));
e_widget_frametable_object_append(of, ob, 0, 4, 1, 1, 1, 1, 1, 1);
- ob = e_widget_check_add(evas, _("Icon Preference"), &(cfdata->remember.apply_icon_pref));
+ ob = e_widget_check_add(evas, _("Icon Preference"),
+ &(cfdata->remember.apply_icon_pref));
e_widget_frametable_object_append(of, ob, 0, 5, 1, 1, 1, 1, 1, 1);
- ob = e_widget_check_add(evas, _("Stickiness"), &(cfdata->remember.apply_sticky));
+ ob = e_widget_check_add(evas, _("Stickiness"),
+ &(cfdata->remember.apply_sticky));
e_widget_frametable_object_append(of, ob, 0, 6, 1, 1, 1, 1, 1, 1);
- ob = e_widget_check_add(evas, _("Virtual Desktop"), &(cfdata->remember.apply_desktop));
+ ob = e_widget_check_add(evas, _("Virtual Desktop"),
+ &(cfdata->remember.apply_desktop));
e_widget_frametable_object_append(of, ob, 1, 0, 1, 1, 1, 1, 1, 1);
- ob = e_widget_check_add(evas, _("Shaded state"), &(cfdata->remember.apply_shade));
+ ob = e_widget_check_add(evas, _("Shaded state"),
+ &(cfdata->remember.apply_shade));
e_widget_frametable_object_append(of, ob, 1, 1, 1, 1, 1, 1, 1, 1);
- ob = e_widget_check_add(evas, _("Fullscreen state"), &(cfdata->remember.apply_fullscreen));
+ ob = e_widget_check_add(evas, _("Fullscreen state"),
+ &(cfdata->remember.apply_fullscreen));
e_widget_frametable_object_append(of, ob, 1, 2, 1, 1, 1, 1, 1, 1);
- ob = e_widget_check_add(evas, _("Current Screen"), &(cfdata->remember.apply_zone));
+ ob = e_widget_check_add(evas, _("Current Screen"),
+ &(cfdata->remember.apply_zone));
e_widget_frametable_object_append(of, ob, 1, 3, 1, 1, 1, 1, 1, 1);
- ob = e_widget_check_add(evas, _("Skip Window List"), &(cfdata->remember.apply_skip_winlist));
+ ob = e_widget_check_add(evas, _("Skip Window List"),
+ &(cfdata->remember.apply_skip_winlist));
e_widget_frametable_object_append(of, ob, 1, 4, 1, 1, 1, 1, 1, 1);
- ob = e_widget_check_add(evas, _("Skip Pager"), &(cfdata->remember.apply_skip_pager));
+ ob = e_widget_check_add(evas, _("Skip Pager"),
+ &(cfdata->remember.apply_skip_pager));
e_widget_frametable_object_append(of, ob, 1, 5, 1, 1, 1, 1, 1, 1);
- ob = e_widget_check_add(evas, _("Skip Taskbar"), &(cfdata->remember.apply_skip_taskbar));
+ ob = e_widget_check_add(evas, _("Skip Taskbar"),
+ &(cfdata->remember.apply_skip_taskbar));
e_widget_frametable_object_append(of, ob, 1, 6, 1, 1, 1, 1, 1, 1);
- ob = e_widget_check_add(evas, _("Application file or name (.desktop)"), &(cfdata->remember.apply_desktop_file));
+ ob = e_widget_check_add(evas, _("Application file or name (.desktop)"),
+ &(cfdata->remember.apply_desktop_file));
e_widget_frametable_object_append(of, ob, 0, 7, 2, 1, 1, 1, 1, 1);
ob = e_widget_entry_add(evas, &cfdata->desktop, NULL, NULL, NULL);
e_widget_frametable_object_append(of, ob, 0, 8, 2, 1, 1, 1, 1, 1);
e_widget_table_object_append(o, of, 1, 0, 1, 2, 1, 1, 1, 1);
of = e_widget_frametable_add(evas, _("Options"), 0);
- ob = e_widget_check_add(evas, _("Match only one window"), &(cfdata->remember.apply_first_only));
+ ob = e_widget_check_add(evas, _("Match only one window"),
+ &(cfdata->remember.apply_first_only));
e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 1, 1, 1);
- ob = e_widget_check_add(evas, _("Always focus on start"), &(cfdata->remember.set_focus_on_start));
+ ob = e_widget_check_add(evas, _("Always focus on start"),
+ &(cfdata->remember.set_focus_on_start));
e_widget_frametable_object_append(of, ob, 0, 1, 1, 1, 1, 1, 1, 1);
- ob = e_widget_check_add(evas, _("Keep current properties"), &(cfdata->remember.keep_settings));
+ ob = e_widget_check_add(evas, _("Keep current properties"),
+ &(cfdata->remember.keep_settings));
e_widget_frametable_object_append(of, ob, 0, 2, 1, 1, 1, 1, 1, 1);
if (cfdata->command)
{
- ob = e_widget_check_add(evas, _("Start this program on login"), &(cfdata->remember.apply_run));
+ ob = e_widget_check_add(evas, _("Start this program on login"),
+ &(cfdata->remember.apply_run));
e_widget_frametable_object_append(of, ob, 0, 3, 1, 1, 1, 1, 1, 1);
}
e_widget_table_object_append(o, of, 0, 1, 1, 1, 1, 1, 1, 1);
diff --git a/src/bin/e_remember.c b/src/bin/e_remember.c
index e0fcf5166..55c634e7a 100644
--- a/src/bin/e_remember.c
+++ b/src/bin/e_remember.c
@@ -8,7 +8,6 @@
/* local subsystem functions */
static void _e_remember_free(E_Remember *rem);
-static int _e_remember_sort_list(const void * d1, const void * d2);
static E_Remember *_e_remember_find(E_Border *bd, int check_usable);
static void _e_remember_cb_hook_pre_post_fetch(void *data, void *bd);
static void _e_remember_cb_hook_eval_post_new_border(void *data, void *bd);
@@ -24,7 +23,6 @@ e_remember_init(E_Startup_Mode mode)
{
Eina_List *l = NULL;
E_Remember *rem;
- int not_updated = 0;
E_Border_Hook *h;
if (mode == E_STARTUP_START)
@@ -43,31 +41,6 @@ e_remember_init(E_Startup_Mode mode)
_e_remember_cb_hook_eval_post_new_border, NULL);
if (h) hooks = eina_list_append(hooks, h);
-#if 1
- EINA_LIST_FOREACH(e_config->remembers, l, rem)
- {
- /* Code to bring up old configs to scratch. Can be removed
- * after X amount of time, where X is a figure that will be
- * decided by whoever remembers to take this out. */
- if (!rem->max_score)
- {
- int max_count = 0;
- if (rem->match & E_REMEMBER_MATCH_NAME) max_count += 2;
- if (rem->match & E_REMEMBER_MATCH_CLASS) max_count += 2;
- if (rem->match & E_REMEMBER_MATCH_TITLE) max_count += 2;
- if (rem->match & E_REMEMBER_MATCH_ROLE) max_count += 2;
- if (rem->match & E_REMEMBER_MATCH_TYPE) max_count += 2;
- if (rem->match & E_REMEMBER_MATCH_TRANSIENT) max_count +=2;
- if (rem->apply_first_only) max_count++;
- rem->max_score = max_count;
- not_updated = 1;
- }
- }
-
- if (not_updated)
- e_config->remembers = eina_list_sort(e_config->remembers, -1,
- _e_remember_sort_list);
-#endif
return 1;
}
@@ -115,20 +88,17 @@ e_remember_unuse(E_Remember *rem)
EAPI void
e_remember_del(E_Remember *rem)
{
- if (rem->used_count != 0)
- {
- Eina_List *l = NULL;
- E_Border *bd;
+ Eina_List *l = NULL;
+ E_Border *bd;
- EINA_LIST_FOREACH(e_border_client_list(), l, bd)
- {
- if (bd->remember == rem)
- {
- bd->remember = NULL;
- e_remember_unuse(rem);
- }
- }
+ EINA_LIST_FOREACH(e_border_client_list(), l, bd)
+ {
+ if (bd->remember != rem) continue;
+
+ bd->remember = NULL;
+ e_remember_unuse(rem);
}
+
_e_remember_free(rem);
}
@@ -208,6 +178,11 @@ e_remember_default_match_set(E_Remember *rem, E_Border *bd)
if (!role || role[0] == 0) role = NULL;
int match = E_REMEMBER_MATCH_TRANSIENT;
+ if (bd->client.icccm.transient_for != 0)
+ rem->transient = 1;
+ else
+ rem->transient = 0;
+
if (name && clasz)
{
match |= E_REMEMBER_MATCH_NAME | E_REMEMBER_MATCH_CLASS;
@@ -224,11 +199,11 @@ e_remember_default_match_set(E_Remember *rem, E_Border *bd)
match |= E_REMEMBER_MATCH_ROLE;
rem->role = eina_stringshare_add(role);
}
-
- if (bd->client.icccm.transient_for != 0)
- rem->transient = 1;
- else
- rem->transient = 0;
+ if (bd->client.netwm.type != ECORE_X_WINDOW_TYPE_UNKNOWN)
+ {
+ match |= E_REMEMBER_MATCH_TYPE;
+ rem->type = bd->client.netwm.type;
+ }
rem->match = match;
@@ -245,81 +220,90 @@ e_remember_update(E_Border *bd)
if (bd->remember->keep_settings) return;
rem = bd->remember;
-
- if (!(rem->name || rem->class ||
- rem->title || rem->role))
- {
- e_remember_del(rem);
- return;
- }
- e_remember_match_update(rem);
+ /* e_remember_match_update(rem); */
- rem->type = bd->client.netwm.type;
-
- if (bd->fullscreen)
+ if (rem->apply & E_REMEMBER_APPLY_POS ||
+ rem->apply & E_REMEMBER_APPLY_SIZE)
{
- rem->prop.fullscreen = bd->fullscreen;
- rem->prop.pos_x = bd->saved.x;
- rem->prop.pos_y = bd->saved.y;
- rem->prop.pos_w = bd->saved.w;
- rem->prop.pos_h = bd->saved.h;
- rem->prop.layer = bd->saved.layer;
+ if (bd->fullscreen)
+ {
+ rem->prop.pos_x = bd->saved.x;
+ rem->prop.pos_y = bd->saved.y;
+ rem->prop.pos_w = bd->saved.w;
+ rem->prop.pos_h = bd->saved.h;
+ }
+ else
+ {
+ rem->prop.pos_x = bd->x - bd->zone->x;
+ rem->prop.pos_y = bd->y - bd->zone->y;
+ rem->prop.res_x = bd->zone->w;
+ rem->prop.res_y = bd->zone->h;
+ rem->prop.pos_w = bd->client.w;
+ rem->prop.pos_h = bd->client.h;
+ rem->prop.w = bd->client.w;
+ rem->prop.h = bd->client.h;
+ }
}
- else
+ if (rem->apply & E_REMEMBER_APPLY_LAYER)
{
- rem->prop.pos_x = bd->x - bd->zone->x;
- rem->prop.pos_y = bd->y - bd->zone->y;
- rem->prop.res_x = bd->zone->w;
- rem->prop.res_y = bd->zone->h;
- rem->prop.pos_w = bd->client.w;
- rem->prop.pos_h = bd->client.h;
- rem->prop.w = bd->client.w;
- rem->prop.h = bd->client.h;
- rem->prop.layer = bd->layer;
- rem->prop.fullscreen = bd->fullscreen;
+ if (bd->fullscreen)
+ rem->prop.layer = bd->saved.layer;
+ else
+ rem->prop.layer = bd->layer;
+ }
+ if (rem->apply & E_REMEMBER_APPLY_LOCKS)
+ {
+ rem->prop.lock_user_location = bd->lock_user_location;
+ rem->prop.lock_client_location = bd->lock_client_location;
+ rem->prop.lock_user_size = bd->lock_user_size;
+ rem->prop.lock_client_size = bd->lock_client_size;
+ rem->prop.lock_user_stacking = bd->lock_user_stacking;
+ rem->prop.lock_client_stacking = bd->lock_client_stacking;
+ rem->prop.lock_user_iconify = bd->lock_user_iconify;
+ rem->prop.lock_client_iconify = bd->lock_client_iconify;
+ rem->prop.lock_user_desk = bd->lock_user_desk;
+ rem->prop.lock_client_desk = bd->lock_client_desk;
+ rem->prop.lock_user_sticky = bd->lock_user_sticky;
+ rem->prop.lock_client_sticky = bd->lock_client_sticky;
+ rem->prop.lock_user_shade = bd->lock_user_shade;
+ rem->prop.lock_client_shade = bd->lock_client_shade;
+ rem->prop.lock_user_maximize = bd->lock_user_maximize;
+ rem->prop.lock_client_maximize = bd->lock_client_maximize;
+ rem->prop.lock_user_fullscreen = bd->lock_user_fullscreen;
+ rem->prop.lock_client_fullscreen = bd->lock_client_fullscreen;
+ rem->prop.lock_border = bd->lock_border;
+ rem->prop.lock_close = bd->lock_close;
+ rem->prop.lock_focus_in = bd->lock_focus_in;
+ rem->prop.lock_focus_out = bd->lock_focus_out;
+ rem->prop.lock_life = bd->lock_life;
}
-
- rem->prop.lock_user_location = bd->lock_user_location;
- rem->prop.lock_client_location = bd->lock_client_location;
- rem->prop.lock_user_size = bd->lock_user_size;
- rem->prop.lock_client_size = bd->lock_client_size;
- rem->prop.lock_user_stacking = bd->lock_user_stacking;
- rem->prop.lock_client_stacking = bd->lock_client_stacking;
- rem->prop.lock_user_iconify = bd->lock_user_iconify;
- rem->prop.lock_client_iconify = bd->lock_client_iconify;
- rem->prop.lock_user_desk = bd->lock_user_desk;
- rem->prop.lock_client_desk = bd->lock_client_desk;
- rem->prop.lock_user_sticky = bd->lock_user_sticky;
- rem->prop.lock_client_sticky = bd->lock_client_sticky;
- rem->prop.lock_user_shade = bd->lock_user_shade;
- rem->prop.lock_client_shade = bd->lock_client_shade;
- rem->prop.lock_user_maximize = bd->lock_user_maximize;
- rem->prop.lock_client_maximize = bd->lock_client_maximize;
- rem->prop.lock_user_fullscreen = bd->lock_user_fullscreen;
- rem->prop.lock_client_fullscreen = bd->lock_client_fullscreen;
- rem->prop.lock_border = bd->lock_border;
- rem->prop.lock_close = bd->lock_close;
- rem->prop.lock_focus_in = bd->lock_focus_in;
- rem->prop.lock_focus_out = bd->lock_focus_out;
- rem->prop.lock_life = bd->lock_life;
-
- rem->prop.sticky = bd->sticky;
-
- if (bd->shaded)
- rem->prop.shaded = (100 + bd->shade.dir);
- else
- rem->prop.shaded = (50 + bd->shade.dir);
-
- rem->prop.skip_winlist = bd->user_skip_winlist;
- rem->prop.skip_pager = bd->client.netwm.state.skip_pager;
- rem->prop.skip_taskbar = bd->client.netwm.state.skip_taskbar;
- rem->prop.icon_preference = bd->icon_preference;
-
- e_desk_xy_get(bd->desk, &rem->prop.desk_x, &rem->prop.desk_y);
-
- rem->prop.zone = bd->zone->num;
- rem->prop.head = bd->zone->container->manager->num;
+ if (rem->apply & E_REMEMBER_APPLY_SHADE)
+ {
+ if (bd->shaded)
+ rem->prop.shaded = (100 + bd->shade.dir);
+ else
+ rem->prop.shaded = (50 + bd->shade.dir);
+ }
+ if (rem->apply & E_REMEMBER_APPLY_ZONE)
+ {
+ rem->prop.zone = bd->zone->num;
+ rem->prop.head = bd->zone->container->manager->num;
+ }
+ if (rem->apply & E_REMEMBER_APPLY_SKIP_WINLIST)
+ rem->prop.skip_winlist = bd->user_skip_winlist;
+ if (rem->apply & E_REMEMBER_APPLY_STICKY)
+ rem->prop.sticky = bd->sticky;
+ if (rem->apply & E_REMEMBER_APPLY_SKIP_PAGER)
+ rem->prop.skip_pager = bd->client.netwm.state.skip_pager;
+ if (rem->apply & E_REMEMBER_APPLY_SKIP_TASKBAR)
+ rem->prop.skip_taskbar = bd->client.netwm.state.skip_taskbar;
+ if (rem->apply & E_REMEMBER_APPLY_ICON_PREF)
+ rem->prop.icon_preference = bd->icon_preference;
+ if (rem->apply & E_REMEMBER_APPLY_DESKTOP)
+ e_desk_xy_get(bd->desk, &rem->prop.desk_x, &rem->prop.desk_y);
+ if (rem->apply & E_REMEMBER_APPLY_FULLSCREEN)
+ rem->prop.fullscreen = bd->fullscreen;
e_config_save_queue();
}
@@ -435,22 +419,10 @@ _e_remember_free(E_Remember *rem)
if (rem->role) eina_stringshare_del(rem->role);
if (rem->prop.border) eina_stringshare_del(rem->prop.border);
if (rem->prop.command) eina_stringshare_del(rem->prop.command);
+ if (rem->prop.desktop_file) eina_stringshare_del(rem->prop.desktop_file);
free(rem);
}
-static int
-_e_remember_sort_list(const void * d1, const void * d2)
-{
- const E_Remember *r1, *r2;
-
- r1 = d1;
- r2 = d2;
- if (r1->max_score >= r2->max_score)
- return -1;
- else
- return 1;
-}
-
static void
_e_remember_cb_hook_pre_post_fetch(void *data, void *border)
{
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 393545788..e78089270 100644
--- a/src/modules/conf_window_remembers/e_int_config_remembers.c
+++ b/src/modules/conf_window_remembers/e_int_config_remembers.c
@@ -166,7 +166,7 @@ _fill_remembers(E_Config_Dialog_Data *cfdata)
if ((rem->name) && (!strcmp(rem->name, "E"))) continue;
/* Filter out the module config remembers */
if ((rem->class) && (rem->class[0] == '_')) continue;
-
+
if (rem->name)
e_widget_ilist_append(cfdata->list, NULL, rem->name, NULL, rem, NULL);
else if (rem->class)
@@ -187,8 +187,8 @@ _fill_remembers(E_Config_Dialog_Data *cfdata)
if (!(rem = l->data)) continue;
/* Garuntee we add only E's internal remembers */
- if ((rem->name) && (strcmp(rem->name, "E"))) continue;
-
+ if ((!rem->name) || (strcmp(rem->name, "E"))) continue;
+
e_widget_ilist_append(cfdata->list, NULL, rem->class, NULL, rem, NULL);
}
@@ -202,9 +202,9 @@ _fill_remembers(E_Config_Dialog_Data *cfdata)
if (!(rem = l->data)) continue;
/* Filter out E's own remember */
- if ((rem->name) && (!strcmp(rem->name, "E"))) continue;
+ if ((!rem->name) || (!strcmp(rem->name, "E"))) continue;
/* Filter out everything except the module config remembers */
- if ((rem->class) && (rem->class[0] != '_')) continue;
+ if ((!rem->class) || (rem->class[0] != '_')) continue;
e_widget_ilist_append(cfdata->list, NULL, rem->name, NULL, rem, NULL);
}