diff --git a/src/bin/e_client.c b/src/bin/e_client.c index 932ba220c..9259acb9a 100644 --- a/src/bin/e_client.c +++ b/src/bin/e_client.c @@ -2407,14 +2407,20 @@ e_client_desk_set(E_Client *ec, E_Desk *desk) if ((e_config->use_desktop_window_profile) && (ec->e.state.profile.use)) { - if (ec->e.state.profile.wait_for_done) return; + ec->e.state.profile.desk_num = desk->x + (desk->y * desk->zone->desk_x_count); + ec->e.state.profile.zone_num = desk->zone->num; + ec->e.state.profile.comp_num = desk->zone->comp->man->num; if (ec->e.state.profile.name != desk->window_profile) { eina_stringshare_refplace(&ec->e.state.profile.set, desk->window_profile); EC_CHANGED(ec); return; } + if (ec->e.state.profile.wait_for_done) return; } + ec->e.state.profile.desk_num = + ec->e.state.profile.zone_num = + ec->e.state.profile.comp_num = -1; if (ec->fullscreen) { ec->desk->fullscreen_clients = eina_list_remove(ec->desk->fullscreen_clients, ec); diff --git a/src/bin/e_client.h b/src/bin/e_client.h index c2fa816d8..b750ddec8 100644 --- a/src/bin/e_client.h +++ b/src/bin/e_client.h @@ -498,6 +498,9 @@ struct E_Client Eina_Stringshare *name; Eina_Stringshare **available_list; Eina_Stringshare *set; + char desk_num; + char zone_num; + char comp_num; int num; unsigned char wait_for_done : 1; unsigned char use : 1; diff --git a/src/bin/e_comp_x.c b/src/bin/e_comp_x.c index 0c4cd3f0e..81d370656 100644 --- a/src/bin/e_comp_x.c +++ b/src/bin/e_comp_x.c @@ -1867,7 +1867,14 @@ _e_comp_x_message(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_X_Event_Cl char *profile; profile = ecore_x_atom_name_get(ev->data.l[1]); ecore_x_e_window_profile_change_request_send(e_client_util_pwin_get(ec), profile); + eina_stringshare_replace(&ec->e.state.profile.set, profile); ec->e.state.profile.wait_for_done = 1; + if (ec->desk && (!e_util_strcmp(ec->desk->window_profile, profile))) + { + ec->e.state.profile.desk_num = ec->desk->x + (ec->desk->y * ec->desk->zone->desk_x_count); + ec->e.state.profile.zone_num = ec->desk->zone->num; + ec->e.state.profile.comp_num = ec->desk->zone->comp->man->num; + } free(profile); } } @@ -1912,21 +1919,35 @@ _e_comp_x_message(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_X_Event_Cl if ((ec->e.state.profile.use) && (ec->e.state.profile.wait_for_done)) { - E_Desk *desk = NULL; char *profile; profile = ecore_x_atom_name_get(ev->data.l[1]); - if (profile) - eina_stringshare_replace(&ec->e.state.profile.name, profile); - - ec->e.state.profile.wait_for_done = 0; - - if ((!ec->desk) || e_util_strcmp(ec->desk->window_profile, ec->e.state.profile.name)) + if ((!e_util_strcmp(profile, ec->e.state.profile.set)) && (ec->e.state.profile.desk_num != -1)) { - desk = e_comp_desk_window_profile_get(ec->comp, ec->e.state.profile.name); - if (desk) - e_client_desk_set(ec, desk); + E_Desk *desk; + E_Comp *comp; + E_Zone *zone; + unsigned int d, z, c; + + c = MIN(ec->e.state.profile.comp_num, eina_list_count(e_comp_list()) - 1); + comp = eina_list_nth(e_comp_list(), c); + z = MIN(ec->e.state.profile.zone_num, eina_list_count(comp->zones) - 1); + zone = e_comp_zone_number_get(comp, z); + d = MIN(ec->e.state.profile.desk_num, (zone->desk_x_count * zone->desk_y_count) - 1); + desk = zone->desks[d]; + + if (profile) + eina_stringshare_replace(&ec->e.state.profile.name, profile); + + ec->e.state.profile.wait_for_done = 0; + + if ((!ec->desk) || e_util_strcmp(ec->desk->window_profile, ec->e.state.profile.name) || (ec->desk != desk)) + { + if (ec->e.state.profile.name == desk->window_profile) + e_client_desk_set(ec, desk); + } } + eina_stringshare_replace(&ec->e.state.profile.set, NULL); free(profile); } } @@ -2994,7 +3015,6 @@ _e_comp_x_hook_client_fetch(void *d EINA_UNUSED, E_Client *ec) ecore_x_e_window_profile_change_request_send(e_client_util_pwin_get(ec), ec->e.state.profile.set); ec->e.state.profile.wait_for_done = 1; - eina_stringshare_replace(&ec->e.state.profile.set, NULL); } if (ec->changes.prop || ec->netwm.fetch.type) { @@ -3836,6 +3856,8 @@ _e_comp_x_hook_client_fetch(void *d EINA_UNUSED, E_Client *ec) if ((e_config->use_desktop_window_profile) && (need_desk_set)) { + E_Desk *desk_use = NULL; + if (!(ec->e.state.profile.name) && (ec->e.state.profile.num >= 1)) { @@ -3846,14 +3868,14 @@ _e_comp_x_hook_client_fetch(void *d EINA_UNUSED, E_Client *ec) if (!ec->e.state.profile.available_list[i]) continue; p = ec->e.state.profile.available_list[i]; - if (strcmp(ec->desk->window_profile, p) == 0) + if (!e_util_strcmp(ec->desk->window_profile, p)) { - ec->e.state.profile.name = eina_stringshare_add(ec->desk->window_profile); + desk_use = ec->desk; break; } } - if (!ec->e.state.profile.name) + if (!desk_use) { E_Comp *c = ec->comp; E_Desk *desk = NULL; @@ -3866,17 +3888,20 @@ _e_comp_x_hook_client_fetch(void *d EINA_UNUSED, E_Client *ec) desk = e_comp_desk_window_profile_get(c, p); if ((desk) && (ec->desk != desk)) { - ec->e.state.profile.name = eina_stringshare_add(p); + desk_use = desk; break; } } } } - if (!ec->e.state.profile.name) - { - ec->e.state.profile.name = eina_stringshare_add(ec->desk->window_profile); - } + if (!desk_use) + desk_use = ec->desk; + ec->e.state.profile.desk_num = desk_use->x + (desk_use->y * desk_use->zone->desk_x_count); + ec->e.state.profile.zone_num = desk_use->zone->num; + ec->e.state.profile.comp_num = desk_use->zone->comp->man->num; + eina_stringshare_refplace(&ec->e.state.profile.name, desk_use->window_profile); + eina_stringshare_refplace(&ec->e.state.profile.set, desk_use->window_profile); ecore_x_e_window_profile_change_request_send(win, ec->e.state.profile.name);