diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 786adfcbe..a8d65b6ef 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -670,8 +670,7 @@ e_border_zone_set(E_Border *bd, E_Zone *zone) ecore_event_add(E_EVENT_BORDER_ZONE_SET, ev, _e_border_event_border_zone_set_free, NULL); ecore_x_window_prop_card32_set(bd->client.win, E_ATOM_ZONE, &bd->zone->num, 1); - if (bd->remember) - e_remember_update(bd->remember, bd); + e_remember_update(bd); } EAPI void @@ -713,8 +712,7 @@ e_border_desk_set(E_Border *bd, E_Desk *desk) e_border_desk_set(child, bd->desk); } } - if (bd->remember) - e_remember_update(bd->remember, bd); + e_remember_update(bd); } EAPI void @@ -1311,8 +1309,7 @@ e_border_raise(E_Border *bd) } ecore_event_add(E_EVENT_BORDER_STACK, ev, _e_border_event_border_stack_free, NULL); - if (bd->remember) - e_remember_update(bd->remember, bd); + e_remember_update(bd); } EAPI void @@ -1397,8 +1394,7 @@ e_border_lower(E_Border *bd) } ecore_event_add(E_EVENT_BORDER_STACK, ev, _e_border_event_border_stack_free, NULL); - if (bd->remember) - e_remember_update(bd->remember, bd); + e_remember_update(bd); } EAPI void @@ -1452,8 +1448,7 @@ e_border_stack_above(E_Border *bd, E_Border *above) } ecore_event_add(E_EVENT_BORDER_STACK, ev, _e_border_event_border_stack_free, NULL); - if (bd->remember) - e_remember_update(bd->remember, bd); + e_remember_update(bd); } EAPI void @@ -1507,8 +1502,7 @@ e_border_stack_below(E_Border *bd, E_Border *below) } ecore_event_add(E_EVENT_BORDER_STACK, ev, _e_border_event_border_stack_free, NULL); - if (bd->remember) - e_remember_update(bd->remember, bd); + e_remember_update(bd); } EAPI void @@ -1918,8 +1912,7 @@ e_border_shade(E_Border *bd, E_Direction dir) } } - if (bd->remember) - e_remember_update(bd->remember, bd); + e_remember_update(bd); } EAPI void @@ -2027,8 +2020,7 @@ e_border_unshade(E_Border *bd, E_Direction dir) } } - if (bd->remember) - e_remember_update(bd->remember, bd); + e_remember_update(bd); } EAPI void @@ -2188,8 +2180,7 @@ e_border_maximize(E_Border *bd, E_Maximize max) bd->maximized & E_MAXIMIZE_VERTICAL); } - if (bd->remember) - e_remember_update(bd->remember, bd); + e_remember_update(bd); } EAPI void @@ -2284,8 +2275,7 @@ e_border_unmaximize(E_Border *bd, E_Maximize max) e_hints_window_maximized_set(bd, bd->maximized & E_MAXIMIZE_HORIZONTAL, bd->maximized & E_MAXIMIZE_VERTICAL); } - if (bd->remember) - e_remember_update(bd->remember, bd); + e_remember_update(bd); } EAPI void @@ -2379,8 +2369,7 @@ e_border_fullscreen(E_Border *bd, E_Fullscreen policy) bd->client.border.changed = 1; bd->changed = 1; } - if (bd->remember) - e_remember_update(bd->remember, bd); + e_remember_update(bd); } EAPI void @@ -2414,8 +2403,7 @@ e_border_unfullscreen(E_Border *bd) bd->client.border.changed = 1; bd->changed = 1; } - if (bd->remember) - e_remember_update(bd->remember, bd); + e_remember_update(bd); } EAPI void @@ -2454,8 +2442,7 @@ e_border_iconify(E_Border *bd) e_border_iconify(child); } } - if (bd->remember) - e_remember_update(bd->remember, bd); + e_remember_update(bd); } EAPI void @@ -2497,8 +2484,7 @@ e_border_uniconify(E_Border *bd) e_border_uniconify(child); } } - if (bd->remember) - e_remember_update(bd->remember, bd); + e_remember_update(bd); } EAPI void @@ -2531,8 +2517,7 @@ e_border_stick(E_Border *bd) e_object_ref(E_OBJECT(bd)); // e_object_breadcrumb_add(E_OBJECT(bd), "border_stick_event"); ecore_event_add(E_EVENT_BORDER_STICK, ev, _e_border_event_border_stick_free, NULL); - if (bd->remember) - e_remember_update(bd->remember, bd); + e_remember_update(bd); } EAPI void @@ -2566,8 +2551,7 @@ e_border_unstick(E_Border *bd) ecore_event_add(E_EVENT_BORDER_UNSTICK, ev, _e_border_event_border_unstick_free, NULL); e_border_desk_set(bd, e_desk_current_get(bd->zone)); - if (bd->remember) - e_remember_update(bd->remember, bd); + e_remember_update(bd); } EAPI void @@ -6346,8 +6330,8 @@ _e_border_eval0(E_Border *bd) } } - if ((bd->remember) && (rem_change)) - e_remember_update(bd->remember, bd); + if (rem_change) + e_remember_update(bd); if (change_urgent) { @@ -7226,8 +7210,8 @@ _e_border_eval(E_Border *bd) bd->need_fullscreen = 0; } - if ((bd->remember) && (rem_change)) - e_remember_update(bd->remember, bd); + if (rem_change) + e_remember_update(bd); if (send_event) // FIXME: send only if a property changed - above need to // check on that. for now - always send. diff --git a/src/bin/e_int_border_locks.c b/src/bin/e_int_border_locks.c index 59bb7e03a..e5a20b0bb 100644 --- a/src/bin/e_int_border_locks.c +++ b/src/bin/e_int_border_locks.c @@ -192,8 +192,8 @@ _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) if (cfdata->border->remember) { cfdata->border->remember->apply |= E_REMEMBER_APPLY_LOCKS; - cfdata->border->remember->match = e_remember_default_match(cfdata->border); - e_remember_update(cfdata->border->remember, cfdata->border); + e_remember_default_match_set(cfdata->border->remember, cfdata->border); + e_remember_update(cfdata->border); } } else @@ -252,8 +252,8 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) if (cfdata->border->remember) { cfdata->border->remember->apply |= E_REMEMBER_APPLY_LOCKS; - cfdata->border->remember->match = e_remember_default_match(cfdata->border); - e_remember_update(cfdata->border->remember, cfdata->border); + e_remember_default_match_set(cfdata->border->remember, cfdata->border); + e_remember_update(cfdata->border); } } else diff --git a/src/bin/e_int_border_menu.c b/src/bin/e_int_border_menu.c index d814980bf..e92364752 100644 --- a/src/bin/e_int_border_menu.c +++ b/src/bin/e_int_border_menu.c @@ -674,7 +674,7 @@ _e_border_menu_cb_skip_winlist(void *data, E_Menu *m, E_Menu_Item *mi) else bd->user_skip_winlist = 0; bd->changed = 1; - if (bd->remember) e_remember_update(bd->remember, bd); + e_remember_update(bd); } static void @@ -689,7 +689,7 @@ _e_border_menu_cb_skip_pager(void *data, E_Menu *m, E_Menu_Item *mi) else bd->client.netwm.state.skip_pager = 0; bd->changed = 1; - if (bd->remember) e_remember_update(bd->remember, bd); + e_remember_update(bd); } static void @@ -704,7 +704,7 @@ _e_border_menu_cb_skip_taskbar(void *data, E_Menu *m, E_Menu_Item *mi) else bd->client.netwm.state.skip_taskbar = 0; bd->changed = 1; - if (bd->remember) e_remember_update(bd->remember, bd); + e_remember_update(bd); } static void diff --git a/src/bin/e_int_border_remember.c b/src/bin/e_int_border_remember.c index 96cf07cc3..ac2b729f2 100644 --- a/src/bin/e_int_border_remember.c +++ b/src/bin/e_int_border_remember.c @@ -435,7 +435,7 @@ _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) if (rem) { - rem->match = e_remember_default_match(cfdata->border); + e_remember_default_match_set(rem, cfdata->border); if (cfdata->mode == MODE_GEOMETRY) rem->apply = E_REMEMBER_APPLY_POS | E_REMEMBER_APPLY_SIZE; @@ -453,10 +453,12 @@ _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) cfdata->remember.apply_desktop_file = 0; _remember_update(rem, cfdata); _check_matches(cfdata, 1); - e_remember_update(rem, cfdata->border); + + cfdata->border->remember = rem; + e_remember_update(cfdata->border); } - cfdata->border->remember = rem; + e_config_save_queue(); return 1; /* Apply was OK */ @@ -583,10 +585,10 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) if (cfdata->remember.set_focus_on_start) rem->apply |= E_REMEMBER_SET_FOCUS_ON_START; _remember_update(rem, cfdata); - cfdata->border->remember = rem; _check_matches(cfdata, 1); rem->keep_settings = 0; - e_remember_update(rem, cfdata->border); + cfdata->border->remember = rem; + e_remember_update(cfdata->border); rem->keep_settings = cfdata->remember.keep_settings; } diff --git a/src/bin/e_remember.c b/src/bin/e_remember.c index 37e43d9a5..92ae028bc 100644 --- a/src/bin/e_remember.c +++ b/src/bin/e_remember.c @@ -135,6 +135,8 @@ e_remember_del(E_Remember *rem) } return; } + else + _e_remember_free(rem); } EAPI E_Remember * @@ -192,40 +194,67 @@ e_remember_match_update(E_Remember *rem) } EAPI int -e_remember_default_match(E_Border *bd) +e_remember_default_match_set(E_Remember *rem, E_Border *bd) { + const char *title, *clasz, *name, *role; + + 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); + rem->name = NULL; + rem->class = NULL; + rem->title = NULL; + rem->role = NULL; + + name = bd->client.icccm.name; + if (!name || name[0] == 0) name = NULL; + clasz = bd->client.icccm.class; + if (!clasz || clasz[0] == 0) clasz = NULL; + role = bd->client.icccm.window_role; + if (!role || role[0] == 0) role = NULL; + int match = E_REMEMBER_MATCH_TRANSIENT; - if ((bd->client.icccm.name) && - (bd->client.icccm.class) && - (bd->client.icccm.name[0] != 0) && - (bd->client.icccm.class[0] != 0)) - match |= E_REMEMBER_MATCH_NAME | E_REMEMBER_MATCH_CLASS; - else - if ((e_border_name_get(bd))[0] != 0) - match |= E_REMEMBER_MATCH_TITLE; - - if ((bd->client.icccm.window_role) && - (bd->client.icccm.window_role[0] != 0)) - match |= E_REMEMBER_MATCH_ROLE; - - if (bd->client.netwm.type != ECORE_X_WINDOW_TYPE_UNKNOWN) - match |= E_REMEMBER_MATCH_TYPE; + if (name && clasz) + { + match |= E_REMEMBER_MATCH_NAME | E_REMEMBER_MATCH_CLASS; + rem->name = eina_stringshare_add(name); + rem->class = eina_stringshare_add(clasz); + } + else if ((title = e_border_name_get(bd)) && title[0]) + { + match |= E_REMEMBER_MATCH_TITLE; + rem->title = eina_stringshare_add(title); + } + if (role) + { + match |= E_REMEMBER_MATCH_ROLE; + rem->role = eina_stringshare_add(role); + } + rem->match = match; + return match; } EAPI void -e_remember_update(E_Remember *rem, E_Border *bd) +e_remember_update(E_Border *bd) { - if (!rem) return; + E_Remember *rem; + if (bd->new_client) return; + if (!bd->remember) return; + if (bd->remember->keep_settings) return; + + rem = bd->remember; - if (bd->remember && bd->remember->keep_settings) - return; - - if (rem->prop.border) eina_stringshare_del(rem->prop.border); - rem->prop.border = NULL; - + if (!(rem->name || rem->class || + rem->title || rem->role)) + { + e_remember_del(rem); + return; + } + e_remember_match_update(rem); rem->type = bd->client.netwm.type; @@ -252,15 +281,9 @@ e_remember_update(E_Remember *rem, E_Border *bd) 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; - - if (bd->bordername) - rem->prop.border = eina_stringshare_add(bd->bordername); - rem->prop.fullscreen = bd->fullscreen; } @@ -720,7 +743,7 @@ _e_remember_cb_hook_eval_post_new_border(void *data, E_Border *bd) rem->match |= E_REMEMBER_MATCH_TRANSIENT; rem->apply = E_REMEMBER_APPLY_POS | E_REMEMBER_APPLY_SIZE | E_REMEMBER_APPLY_BORDER; e_remember_use(rem); - e_remember_update(rem, bd); + e_remember_update(bd); } } } diff --git a/src/bin/e_remember.h b/src/bin/e_remember.h index 1b6113470..fa8ea779b 100644 --- a/src/bin/e_remember.h +++ b/src/bin/e_remember.h @@ -108,8 +108,8 @@ EAPI void e_remember_del(E_Remember *rem); EAPI E_Remember *e_remember_find(E_Border *bd); EAPI E_Remember *e_remember_find_usable(E_Border *bd); EAPI void e_remember_match_update(E_Remember *rem); -EAPI void e_remember_update(E_Remember *rem, E_Border *bd); -EAPI int e_remember_default_match(E_Border *bd); +EAPI void e_remember_update(E_Border *bd); +EAPI int e_remember_default_match_set(E_Remember *rem, E_Border *bd); #endif #endif diff --git a/src/modules/conf_borders/e_int_config_borders.c b/src/modules/conf_borders/e_int_config_borders.c index bbedb2dc3..37c527466 100644 --- a/src/modules/conf_borders/e_int_config_borders.c +++ b/src/modules/conf_borders/e_int_config_borders.c @@ -151,17 +151,22 @@ _basic_apply_border(E_Config_Dialog_Data *cfdata) } if (cfdata->remember_border) { - if (!cfdata->border->remember) + E_Remember *rem = cfdata->border->remember; + + if (!rem) { - cfdata->border->remember = e_remember_new(); - if (cfdata->border->remember) - e_remember_use(cfdata->border->remember); + rem = e_remember_new(); + if (rem) + e_remember_use(rem); } - if (cfdata->border->remember) + if (rem) { - cfdata->border->remember->apply |= E_REMEMBER_APPLY_BORDER; - cfdata->border->remember->match = e_remember_default_match(cfdata->border); - e_remember_update(cfdata->border->remember, cfdata->border); + rem->apply |= E_REMEMBER_APPLY_BORDER; + e_remember_default_match_set(rem, cfdata->border); + if (rem->prop.border) eina_stringshare_del(rem->prop.border); + rem->prop.border = eina_stringshare_add(cfdata->border->bordername); + cfdata->border->remember = rem; + e_remember_update(cfdata->border); } } else