From 0d754cef108ed25a4904b84dcc6bd85b63bb4b29 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Sun, 13 Sep 2009 12:26:29 +0000 Subject: [PATCH] more work on e_remember. SVN revision: 42458 --- src/bin/e_int_border_remember.c | 717 +++++++++--------- src/bin/e_remember.c | 224 +++--- .../e_int_config_remembers.c | 10 +- 3 files changed, 474 insertions(+), 477 deletions(-) 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); }