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:
parent
1a4b0bf29c
commit
483023051e
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue