more work on e_remember.

SVN revision: 42458
This commit is contained in:
Hannes Janetzek 2009-09-13 12:26:29 +00:00
parent 71c60e2e11
commit 0d754cef10
3 changed files with 474 additions and 477 deletions

View File

@ -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<br>"
"properties (such as size, location, border style etc.) to<br>"
"a window that <hilight>does not have unique properties</hilight>.<br>"
"<br>"
"This means it shares Name/Class, Transience, Role etc. properties<br>"
"with more than 1 other window on the screen and remembering<br>"
"properties for this window will apply to all other windows<br>"
"that match these properties.<br>"
"<br>"
"This is just a warning in case you did not intend this to happen.<br>"
"If you did, simply press <hilight>Apply</hilight> or <hilight>OK</hilight> buttons<br>"
"and your settings will be accepted. Press <hilight>Cancel</hilight> if you<br>"
"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<br>"
"properties (such as size, location, border style etc.) to<br>"
"a window that <hilight>does not have unique properties</hilight>.<br>"
"<br>"
"This means it shares Name/Class, Transience, Role etc. properties<br>"
"with more than 1 other window on the screen and remembering<br>"
"properties for this window will apply to all other windows<br>"
"that match these properties.<br>"
"<br>"
"This is just a warning in case you did not intend this to happen.<br>"
"If you did, simply press <hilight>Apply</hilight> or <hilight>OK</hilight> buttons<br>"
"and your settings will be accepted. Press <hilight>Cancel</hilight> if you<br>"
"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<br>"
"properties (such as size, location, border style etc.) to<br>"
"a window that <hilight>does not have unique properties</hilight>.<br>"
"<br>"
"This means it shares Name/Class, Transience, Role etc. properties<br>"
"with more than 1 other window on the screen and remembering<br>"
"properties for this window will apply to all other windows<br>"
"that match these properties.<br>"
"<br>"
"You may wish to enable the <hilight>Match only one window</hilight> option if<br>"
"you only intend one instance of this window to be modified, with<br>"
"additional instances not being modified.<br>"
"<br>"
"This is just a warning in case you did not intend this to happen.<br>"
"If you did, simply press <hilight>Apply</hilight> or <hilight>OK</hilight> buttons<br>"
"and your settings will be accepted. Press <hilight>Cancel</hilight> if you<br>"
"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);

View File

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

View File

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