completely redo window profiles

when this feature was added, its behavior was naively set to ignore repeated desk changes. it also was not adequately tested, resulting in a frustratingly large number of bugs.

with these changes, window profiles should no longer be the cause of client visibility being broken as caused by a failure to change desk.

fix TChutney
This commit is contained in:
Mike Blumenkrantz 2014-05-29 12:35:42 -04:00
parent 1a4b0bf29c
commit 483023051e
3 changed files with 54 additions and 20 deletions

View File

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

View File

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

View File

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