From f9fc3d09aa8fdc727f7f7de4c1cbb0a36c682154 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Sat, 12 Sep 2009 09:18:41 +0000 Subject: [PATCH] move applying of remember properties for new windows from e_border to e_remember SVN revision: 42433 --- src/bin/e_border.c | 269 +-------------------------- src/bin/e_int_border_remember.c | 2 + src/bin/e_remember.c | 318 +++++++++++++++++++++++++++++++- 3 files changed, 320 insertions(+), 269 deletions(-) diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 5869f918b..786adfcbe 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -5615,7 +5615,6 @@ _e_border_eval0(E_Border *bd) { int change_urgent = 0; int rem_change = 0; - int zx, zy, zw, zh; if (e_object_is_del(E_OBJECT(bd))) { @@ -5624,8 +5623,7 @@ _e_border_eval0(E_Border *bd) } _e_border_hook_call(E_BORDER_HOOK_EVAL_PRE_FETCH, bd); - if (bd->zone) - e_zone_useful_geometry_get(bd->zone, &zx, &zy, &zw, &zh); + /* fetch any info queued to be fetched */ if (bd->client.icccm.fetch.client_leader) { @@ -6154,7 +6152,6 @@ _e_border_eval0(E_Border *bd) if (bd->new_client) { - E_Remember *rem = NULL; E_Event_Border_Add *ev; ev = calloc(1, sizeof(E_Event_Border_Add)); @@ -6165,244 +6162,9 @@ _e_border_eval0(E_Border *bd) if ((!bd->lock_border) || (!bd->client.border.name)) bd->client.border.changed = 1; - if (!bd->remember) - { - rem = e_remember_find_usable(bd); - if (rem) - { - bd->remember = rem; - e_remember_use(rem); - } - } - if (bd->remember) - { - rem = bd->remember; - - if (rem->apply & E_REMEMBER_APPLY_ZONE) - { - E_Zone *zone; - - zone = e_container_zone_number_get(bd->zone->container, rem->prop.zone); - if (zone) - e_border_zone_set(bd, zone); - e_zone_useful_geometry_get(zone, &zx, &zy, &zw, &zh); - } - if (rem->apply & E_REMEMBER_APPLY_DESKTOP) - { - E_Desk *desk; - - desk = e_desk_at_xy_get(bd->zone, rem->prop.desk_x, rem->prop.desk_y); - if (desk) - { - e_border_desk_set(bd, desk); - if (e_config->desk_auto_switch) - e_desk_show(desk); - } - } - if (rem->apply & E_REMEMBER_APPLY_SIZE) - { - bd->client.w = rem->prop.w; - bd->client.h = rem->prop.h; - /* we can trust internal windows */ - if (bd->internal) - { - if (bd->zone->w != rem->prop.res_x) - { - if (bd->client.w > (bd->zone->w - 64)) - bd->client.w = bd->zone->w - 64; - } - if (bd->zone->h != rem->prop.res_y) - { - if (bd->client.h > (bd->zone->h - 64)) - bd->client.h = bd->zone->h - 64; - } - if (bd->client.icccm.min_w > bd->client.w) - bd->client.w = bd->client.icccm.min_w; - if (bd->client.icccm.max_w < bd->client.w) - bd->client.w = bd->client.icccm.max_w; - if (bd->client.icccm.min_h > bd->client.h) - bd->client.h = bd->client.icccm.min_h; - if (bd->client.icccm.max_h < bd->client.h) - bd->client.h = bd->client.icccm.max_h; - } - bd->w = bd->client.w + bd->client_inset.l + bd->client_inset.r; - bd->h = bd->client.h + bd->client_inset.t + bd->client_inset.b; - bd->changes.size = 1; - bd->changes.shape = 1; - } - if ((rem->apply & E_REMEMBER_APPLY_POS) && (!bd->re_manage)) - { - bd->x = rem->prop.pos_x; - bd->y = rem->prop.pos_y; - if (bd->zone->w != rem->prop.res_x) - { - int px; - - px = bd->x + (bd->w / 2); - if (px < ((rem->prop.res_x * 1) / 3)) - { - if (bd->zone->w >= (rem->prop.res_x / 3)) - bd->x = rem->prop.pos_x; - else - bd->x = ((rem->prop.pos_x - 0) * bd->zone->w) / - (rem->prop.res_x / 3); - } - else if (px < ((rem->prop.res_x * 2) / 3)) - { - if (bd->zone->w >= (rem->prop.res_x / 3)) - bd->x = (bd->zone->w / 2) + - (px - (rem->prop.res_x / 2)) - - (bd->w / 2); - else - bd->x = (bd->zone->w / 2) + - (((px - (rem->prop.res_x / 2)) * bd->zone->w) / - (rem->prop.res_x / 3)) - - (bd->w / 2); - } - else - { - if (bd->zone->w >= (rem->prop.res_x / 3)) - bd->x = bd->zone->w + - rem->prop.pos_x - rem->prop.res_x + - (rem->prop.w - bd->client.w); - else - bd->x = bd->zone->w + - (((rem->prop.pos_x - rem->prop.res_x) * bd->zone->w) / - (rem->prop.res_x / 3)) + - (rem->prop.w - bd->client.w); - } - if ((rem->prop.pos_x >= 0) && (bd->x < 0)) - bd->x = 0; - else if (((rem->prop.pos_x + rem->prop.w) < rem->prop.res_x) && - ((bd->x + bd->w) > bd->zone->w)) - bd->x = bd->zone->w - bd->w; - } - if (bd->zone->h != rem->prop.res_y) - { - int py; - - py = bd->y + (bd->h / 2); - if (py < ((rem->prop.res_y * 1) / 3)) - { - if (bd->zone->h >= (rem->prop.res_y / 3)) - bd->y = rem->prop.pos_y; - else - bd->y = ((rem->prop.pos_y - 0) * bd->zone->h) / - (rem->prop.res_y / 3); - } - else if (py < ((rem->prop.res_y * 2) / 3)) - { - if (bd->zone->h >= (rem->prop.res_y / 3)) - bd->y = (bd->zone->h / 2) + - (py - (rem->prop.res_y / 2)) - - (bd->h / 2); - else - bd->y = (bd->zone->h / 2) + - (((py - (rem->prop.res_y / 2)) * bd->zone->h) / - (rem->prop.res_y / 3)) - - (bd->h / 2); - } - else - { - if (bd->zone->h >= (rem->prop.res_y / 3)) - bd->y = bd->zone->h + - rem->prop.pos_y - rem->prop.res_y + - (rem->prop.h - bd->client.h); - else - bd->y = bd->zone->h + - (((rem->prop.pos_y - rem->prop.res_y) * bd->zone->h) / - (rem->prop.res_y / 3)) + - (rem->prop.h - bd->client.h); - } - if ((rem->prop.pos_y >= 0) && (bd->y < 0)) - bd->y = 0; - else if (((rem->prop.pos_y + rem->prop.h) < rem->prop.res_y) && - ((bd->y + bd->h) > bd->zone->h)) - bd->y = bd->zone->h - bd->h; - } -// if (bd->zone->w != rem->prop.res_x) -// bd->x = (rem->prop.pos_x * bd->zone->w) / rem->prop.res_x; -// if (bd->zone->h != rem->prop.res_y) -// bd->y = (rem->prop.pos_y * bd->zone->h) / rem->prop.res_y; - bd->x += bd->zone->x; - bd->y += bd->zone->y; - bd->placed = 1; - bd->changes.pos = 1; - } - if (rem->apply & E_REMEMBER_APPLY_LAYER) - { - bd->layer = rem->prop.layer; - if (bd->layer == 100) - e_hints_window_stacking_set(bd, E_STACKING_NONE); - else if (bd->layer == 150) - e_hints_window_stacking_set(bd, E_STACKING_ABOVE); - e_container_border_raise(bd); - } - if (rem->apply & E_REMEMBER_APPLY_BORDER) - { - if (rem->prop.border) - { - if (bd->bordername) eina_stringshare_del(bd->bordername); - if (rem->prop.border) bd->bordername = eina_stringshare_add(rem->prop.border); - else bd->bordername = NULL; - bd->client.border.changed = 1; - } - } - if (rem->apply & E_REMEMBER_APPLY_FULLSCREEN) - { - if (rem->prop.fullscreen) - e_border_fullscreen(bd, e_config->fullscreen_policy); - } - if (rem->apply & E_REMEMBER_APPLY_STICKY) - { - if (rem->prop.sticky) e_border_stick(bd); - } - if (rem->apply & E_REMEMBER_APPLY_SHADE) - { - if (rem->prop.shaded >= 100) - e_border_shade(bd, rem->prop.shaded - 100); - else if (rem->prop.shaded >= 50) - e_border_unshade(bd, rem->prop.shaded - 50); - } - if (rem->apply & E_REMEMBER_APPLY_LOCKS) - { - bd->lock_user_location = rem->prop.lock_user_location; - bd->lock_client_location = rem->prop.lock_client_location; - bd->lock_user_size = rem->prop.lock_user_size; - bd->lock_client_size = rem->prop.lock_client_size; - bd->lock_user_stacking = rem->prop.lock_user_stacking; - bd->lock_client_stacking = rem->prop.lock_client_stacking; - bd->lock_user_iconify = rem->prop.lock_user_iconify; - bd->lock_client_iconify = rem->prop.lock_client_iconify; - bd->lock_user_desk = rem->prop.lock_user_desk; - bd->lock_client_desk = rem->prop.lock_client_desk; - bd->lock_user_sticky = rem->prop.lock_user_sticky; - bd->lock_client_sticky = rem->prop.lock_client_sticky; - bd->lock_user_shade = rem->prop.lock_user_shade; - bd->lock_client_shade = rem->prop.lock_client_shade; - bd->lock_user_maximize = rem->prop.lock_user_maximize; - bd->lock_client_maximize = rem->prop.lock_client_maximize; - bd->lock_user_fullscreen = rem->prop.lock_user_fullscreen; - bd->lock_client_fullscreen = rem->prop.lock_client_fullscreen; - bd->lock_border = rem->prop.lock_border; - bd->lock_close = rem->prop.lock_close; - bd->lock_focus_in = rem->prop.lock_focus_in; - bd->lock_focus_out = rem->prop.lock_focus_out; - bd->lock_life = rem->prop.lock_life; - } - if (rem->apply & E_REMEMBER_APPLY_SKIP_WINLIST) - bd->user_skip_winlist = rem->prop.skip_winlist; - if (rem->apply & E_REMEMBER_APPLY_SKIP_PAGER) - bd->client.netwm.state.skip_pager = rem->prop.skip_pager; - if (rem->apply & E_REMEMBER_APPLY_SKIP_TASKBAR) - bd->client.netwm.state.skip_taskbar = rem->prop.skip_taskbar; - if (rem->apply & E_REMEMBER_APPLY_ICON_PREF) - bd->icon_preference = rem->prop.icon_preference; - if (rem->apply & E_REMEMBER_SET_FOCUS_ON_START) - bd->want_focus = 1; - } } + /* PRE_POST_FETCH calls e_remember apply for new client */ _e_border_hook_call(E_BORDER_HOOK_EVAL_PRE_POST_FETCH, bd); _e_border_hook_call(E_BORDER_HOOK_EVAL_POST_FETCH, bd); _e_border_hook_call(E_BORDER_HOOK_EVAL_PRE_BORDER_ASSIGN, bd); @@ -6771,13 +6533,11 @@ _e_border_eval(E_Border *bd) free(pnd); } - /* Recreate state */ + /* Recreate state */ e_hints_window_init(bd); - - if ((bd->client.e.state.centered) && + if ((bd->client.e.state.centered) && ((!bd->remember) || - ((bd->remember) && - (!(bd->remember->apply & E_REMEMBER_APPLY_POS))))) + ((bd->remember) && (!(bd->remember->apply & E_REMEMBER_APPLY_POS))))) { bd->x = zx + (zw - bd->w) / 2; bd->y = zy + (zh - bd->h) / 2; @@ -6785,23 +6545,6 @@ _e_border_eval(E_Border *bd) bd->placed = 1; } - if ((bd->internal) && (!bd->remember) && - (e_config->remember_internal_windows) && - (!bd->internal_no_remember)) - { - E_Remember *rem; - - rem = e_remember_new(); - if (rem) - { - rem->match = E_REMEMBER_MATCH_NAME | E_REMEMBER_MATCH_CLASS | E_REMEMBER_MATCH_ROLE | E_REMEMBER_MATCH_TYPE | E_REMEMBER_MATCH_TRANSIENT; - rem->apply = E_REMEMBER_APPLY_POS | E_REMEMBER_APPLY_SIZE | E_REMEMBER_APPLY_BORDER; - bd->remember = rem; - e_remember_use(rem); - e_remember_update(rem, bd); - } - } - if (bd->internal_ecore_evas) ecore_evas_managed_move(bd->internal_ecore_evas, bd->x + bd->fx.x + bd->client_inset.l, @@ -6838,7 +6581,7 @@ _e_border_eval(E_Border *bd) if ((zone) && (zone != bd->zone)) { e_border_zone_set(bd, zone); - e_zone_useful_geometry_get(zone, &zx, &zy, &zw, &zh); + /* e_zone_useful_geometry_get(zone, &zx, &zy, &zw, &zh); */ } } } diff --git a/src/bin/e_int_border_remember.c b/src/bin/e_int_border_remember.c index 8b38a856d..96cf07cc3 100644 --- a/src/bin/e_int_border_remember.c +++ b/src/bin/e_int_border_remember.c @@ -679,6 +679,8 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data { cfdata->remember.match_type = 0; } + 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)); e_widget_framelist_object_append(of, ob); e_widget_table_object_append(o, of, 0, 0, 1, 1, 1, 1, 1, 1); diff --git a/src/bin/e_remember.c b/src/bin/e_remember.c index f08d4aa63..37e43d9a5 100644 --- a/src/bin/e_remember.c +++ b/src/bin/e_remember.c @@ -10,6 +10,9 @@ 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, E_Border *bd); +static void _e_remember_cb_hook_eval_post_new_border(void *data, E_Border *bd); +static Eina_List *hooks = NULL; /* FIXME: match netwm window type */ @@ -22,6 +25,7 @@ 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) { @@ -32,6 +36,13 @@ e_remember_init(E_Startup_Mode mode) } } + h = e_border_hook_add(E_BORDER_HOOK_EVAL_PRE_POST_FETCH, + _e_remember_cb_hook_pre_post_fetch, NULL); + if (h) hooks = eina_list_append(hooks, h); + h = e_border_hook_add(E_BORDER_HOOK_EVAL_POST_NEW_BORDER, + _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) { @@ -54,7 +65,7 @@ e_remember_init(E_Startup_Mode mode) } if (not_updated) - e_config->remembers = eina_list_sort(e_config->remembers, -1, + e_config->remembers = eina_list_sort(e_config->remembers, -1, _e_remember_sort_list); #endif return 1; @@ -63,6 +74,11 @@ e_remember_init(E_Startup_Mode mode) EAPI int e_remember_shutdown(void) { + E_Border_Hook *h; + + EINA_LIST_FREE(hooks, h) + e_border_hook_del(h); + return 1; } @@ -158,7 +174,7 @@ e_remember_match_update(E_Remember *rem) * need to remove from list and insert back into the appropriate * loction. */ Eina_List *l = NULL; - E_Remember *r; + E_Remember *r; rem->max_score = max_count; e_config->remembers = eina_list_remove(e_config->remembers, rem); @@ -188,7 +204,7 @@ e_remember_default_match(E_Border *bd) if ((e_border_name_get(bd))[0] != 0) match |= E_REMEMBER_MATCH_TITLE; - if ((bd->client.icccm.window_role) && + if ((bd->client.icccm.window_role) && (bd->client.icccm.window_role[0] != 0)) match |= E_REMEMBER_MATCH_ROLE; @@ -206,10 +222,10 @@ e_remember_update(E_Remember *rem, E_Border *bd) if (bd->remember && bd->remember->keep_settings) return; - + if (rem->prop.border) eina_stringshare_del(rem->prop.border); rem->prop.border = NULL; - + e_remember_match_update(rem); rem->type = bd->client.netwm.type; @@ -406,7 +422,7 @@ _e_remember_free(E_Remember *rem) free(rem); } -static int +static int _e_remember_sort_list(const void * d1, const void * d2) { const E_Remember *r1, *r2; @@ -418,3 +434,293 @@ _e_remember_sort_list(const void * d1, const void * d2) else return 1; } + +static void +_e_remember_cb_hook_pre_post_fetch(void *data, E_Border *bd) +{ + E_Remember *rem = NULL; + + if (!bd->new_client) return; + + if (!bd->remember) + { + rem = e_remember_find_usable(bd); + if (rem) + { + bd->remember = rem; + e_remember_use(rem); + } + } + if (bd->remember) + { + rem = bd->remember; + + if (rem->apply & E_REMEMBER_APPLY_ZONE) + { + E_Zone *zone; + + zone = e_container_zone_number_get(bd->zone->container, rem->prop.zone); + if (zone) + e_border_zone_set(bd, zone); + } + if (rem->apply & E_REMEMBER_APPLY_DESKTOP) + { + E_Desk *desk; + + desk = e_desk_at_xy_get(bd->zone, rem->prop.desk_x, rem->prop.desk_y); + if (desk) + { + e_border_desk_set(bd, desk); + if (e_config->desk_auto_switch) + e_desk_show(desk); + } + } + if (rem->apply & E_REMEMBER_APPLY_SIZE) + { + bd->client.w = rem->prop.w; + bd->client.h = rem->prop.h; + /* we can trust internal windows */ + if (bd->internal) + { + if (bd->zone->w != rem->prop.res_x) + { + if (bd->client.w > (bd->zone->w - 64)) + bd->client.w = bd->zone->w - 64; + } + if (bd->zone->h != rem->prop.res_y) + { + if (bd->client.h > (bd->zone->h - 64)) + bd->client.h = bd->zone->h - 64; + } + if (bd->client.icccm.min_w > bd->client.w) + bd->client.w = bd->client.icccm.min_w; + if (bd->client.icccm.max_w < bd->client.w) + bd->client.w = bd->client.icccm.max_w; + if (bd->client.icccm.min_h > bd->client.h) + bd->client.h = bd->client.icccm.min_h; + if (bd->client.icccm.max_h < bd->client.h) + bd->client.h = bd->client.icccm.max_h; + } + bd->w = bd->client.w + bd->client_inset.l + bd->client_inset.r; + bd->h = bd->client.h + bd->client_inset.t + bd->client_inset.b; + bd->changes.size = 1; + bd->changes.shape = 1; + } + if ((rem->apply & E_REMEMBER_APPLY_POS) && (!bd->re_manage)) + { + bd->x = rem->prop.pos_x; + bd->y = rem->prop.pos_y; + if (bd->zone->w != rem->prop.res_x) + { + int px; + + px = bd->x + (bd->w / 2); + if (px < ((rem->prop.res_x * 1) / 3)) + { + if (bd->zone->w >= (rem->prop.res_x / 3)) + bd->x = rem->prop.pos_x; + else + bd->x = ((rem->prop.pos_x - 0) * bd->zone->w) / + (rem->prop.res_x / 3); + } + else if (px < ((rem->prop.res_x * 2) / 3)) + { + if (bd->zone->w >= (rem->prop.res_x / 3)) + bd->x = (bd->zone->w / 2) + + (px - (rem->prop.res_x / 2)) - + (bd->w / 2); + else + bd->x = (bd->zone->w / 2) + + (((px - (rem->prop.res_x / 2)) * bd->zone->w) / + (rem->prop.res_x / 3)) - + (bd->w / 2); + } + else + { + if (bd->zone->w >= (rem->prop.res_x / 3)) + bd->x = bd->zone->w + + rem->prop.pos_x - rem->prop.res_x + + (rem->prop.w - bd->client.w); + else + bd->x = bd->zone->w + + (((rem->prop.pos_x - rem->prop.res_x) * bd->zone->w) / + (rem->prop.res_x / 3)) + + (rem->prop.w - bd->client.w); + } + if ((rem->prop.pos_x >= 0) && (bd->x < 0)) + bd->x = 0; + else if (((rem->prop.pos_x + rem->prop.w) < rem->prop.res_x) && + ((bd->x + bd->w) > bd->zone->w)) + bd->x = bd->zone->w - bd->w; + } + if (bd->zone->h != rem->prop.res_y) + { + int py; + + py = bd->y + (bd->h / 2); + if (py < ((rem->prop.res_y * 1) / 3)) + { + if (bd->zone->h >= (rem->prop.res_y / 3)) + bd->y = rem->prop.pos_y; + else + bd->y = ((rem->prop.pos_y - 0) * bd->zone->h) / + (rem->prop.res_y / 3); + } + else if (py < ((rem->prop.res_y * 2) / 3)) + { + if (bd->zone->h >= (rem->prop.res_y / 3)) + bd->y = (bd->zone->h / 2) + + (py - (rem->prop.res_y / 2)) - + (bd->h / 2); + else + bd->y = (bd->zone->h / 2) + + (((py - (rem->prop.res_y / 2)) * bd->zone->h) / + (rem->prop.res_y / 3)) - + (bd->h / 2); + } + else + { + if (bd->zone->h >= (rem->prop.res_y / 3)) + bd->y = bd->zone->h + + rem->prop.pos_y - rem->prop.res_y + + (rem->prop.h - bd->client.h); + else + bd->y = bd->zone->h + + (((rem->prop.pos_y - rem->prop.res_y) * bd->zone->h) / + (rem->prop.res_y / 3)) + + (rem->prop.h - bd->client.h); + } + if ((rem->prop.pos_y >= 0) && (bd->y < 0)) + bd->y = 0; + else if (((rem->prop.pos_y + rem->prop.h) < rem->prop.res_y) && + ((bd->y + bd->h) > bd->zone->h)) + bd->y = bd->zone->h - bd->h; + } + // if (bd->zone->w != rem->prop.res_x) + // bd->x = (rem->prop.pos_x * bd->zone->w) / rem->prop.res_x; + // if (bd->zone->h != rem->prop.res_y) + // bd->y = (rem->prop.pos_y * bd->zone->h) / rem->prop.res_y; + bd->x += bd->zone->x; + bd->y += bd->zone->y; + bd->placed = 1; + bd->changes.pos = 1; + } + if (rem->apply & E_REMEMBER_APPLY_LAYER) + { + bd->layer = rem->prop.layer; + if (bd->layer == 100) + e_hints_window_stacking_set(bd, E_STACKING_NONE); + else if (bd->layer == 150) + e_hints_window_stacking_set(bd, E_STACKING_ABOVE); + e_container_border_raise(bd); + } + if (rem->apply & E_REMEMBER_APPLY_BORDER) + { + if (rem->prop.border) + { + if (bd->bordername) eina_stringshare_del(bd->bordername); + if (rem->prop.border) bd->bordername = eina_stringshare_add(rem->prop.border); + else bd->bordername = NULL; + bd->client.border.changed = 1; + } + } + if (rem->apply & E_REMEMBER_APPLY_FULLSCREEN) + { + if (rem->prop.fullscreen) + e_border_fullscreen(bd, e_config->fullscreen_policy); + } + if (rem->apply & E_REMEMBER_APPLY_STICKY) + { + if (rem->prop.sticky) e_border_stick(bd); + } + if (rem->apply & E_REMEMBER_APPLY_SHADE) + { + if (rem->prop.shaded >= 100) + e_border_shade(bd, rem->prop.shaded - 100); + else if (rem->prop.shaded >= 50) + e_border_unshade(bd, rem->prop.shaded - 50); + } + if (rem->apply & E_REMEMBER_APPLY_LOCKS) + { + bd->lock_user_location = rem->prop.lock_user_location; + bd->lock_client_location = rem->prop.lock_client_location; + bd->lock_user_size = rem->prop.lock_user_size; + bd->lock_client_size = rem->prop.lock_client_size; + bd->lock_user_stacking = rem->prop.lock_user_stacking; + bd->lock_client_stacking = rem->prop.lock_client_stacking; + bd->lock_user_iconify = rem->prop.lock_user_iconify; + bd->lock_client_iconify = rem->prop.lock_client_iconify; + bd->lock_user_desk = rem->prop.lock_user_desk; + bd->lock_client_desk = rem->prop.lock_client_desk; + bd->lock_user_sticky = rem->prop.lock_user_sticky; + bd->lock_client_sticky = rem->prop.lock_client_sticky; + bd->lock_user_shade = rem->prop.lock_user_shade; + bd->lock_client_shade = rem->prop.lock_client_shade; + bd->lock_user_maximize = rem->prop.lock_user_maximize; + bd->lock_client_maximize = rem->prop.lock_client_maximize; + bd->lock_user_fullscreen = rem->prop.lock_user_fullscreen; + bd->lock_client_fullscreen = rem->prop.lock_client_fullscreen; + bd->lock_border = rem->prop.lock_border; + bd->lock_close = rem->prop.lock_close; + bd->lock_focus_in = rem->prop.lock_focus_in; + bd->lock_focus_out = rem->prop.lock_focus_out; + bd->lock_life = rem->prop.lock_life; + } + if (rem->apply & E_REMEMBER_APPLY_SKIP_WINLIST) + bd->user_skip_winlist = rem->prop.skip_winlist; + if (rem->apply & E_REMEMBER_APPLY_SKIP_PAGER) + bd->client.netwm.state.skip_pager = rem->prop.skip_pager; + if (rem->apply & E_REMEMBER_APPLY_SKIP_TASKBAR) + bd->client.netwm.state.skip_taskbar = rem->prop.skip_taskbar; + if (rem->apply & E_REMEMBER_APPLY_ICON_PREF) + bd->icon_preference = rem->prop.icon_preference; + if (rem->apply & E_REMEMBER_SET_FOCUS_ON_START) + bd->want_focus = 1; + } +} + + +static void +_e_remember_cb_hook_eval_post_new_border(void *data, E_Border *bd) +{ + if (!bd->new_client) return; + + if ((bd->internal) && (!bd->remember) && + (e_config->remember_internal_windows) && + (!bd->internal_no_remember)) + { + E_Remember *rem; + + rem = e_remember_new(); + if (rem) + { + bd->remember = rem; + rem->match = 0; + + if (bd->client.icccm.name) + { + rem->name = eina_stringshare_add(bd->client.icccm.name); + rem->match |= E_REMEMBER_MATCH_NAME; + } + if (bd->client.icccm.class) + { + rem->class = eina_stringshare_add(bd->client.icccm.class); + rem->match |= E_REMEMBER_MATCH_CLASS; + } + if (bd->client.icccm.window_role) + { + rem->role = eina_stringshare_add(bd->client.icccm.window_role); + rem->match |= E_REMEMBER_MATCH_ROLE; + } + if (bd->client.netwm.type != ECORE_X_WINDOW_TYPE_UNKNOWN) + { + rem->match |= E_REMEMBER_MATCH_TYPE; + } + + 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); + } + } +}