buffer server-side (un)maximize commands to ensure synchronization in wayland

maximize is client-initiated and compositor-enforced in wayland, meaning that a
maximize should only be acted upon in the compositor after the client has
acknowledged that it has transitioned into the maximized state (likely removing
part of its csd region) and has resized itself to match the expected maximize
size

fix T3297
This commit is contained in:
Mike Blumenkrantz 2016-04-08 16:08:32 -04:00
parent 98934fb0e9
commit 63af4ea865
3 changed files with 61 additions and 5 deletions

View File

@ -595,12 +595,61 @@ _e_comp_wl_evas_cb_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_U
}
static void
_e_comp_wl_evas_cb_maximize_pre(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
_e_comp_wl_evas_cb_unmaximize_pre(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
{
E_Client *ec = data;
E_Maximize *max = event_info;
if (!e_object_is_del(E_OBJECT(ec)))
if (e_object_is_del(E_OBJECT(ec))) return;
if (ec->comp_data->in_commit)
ec->comp_data->maximizing = 1;
else if (!e_client_has_xwindow(ec))
{
int w, h, ew, eh;
unsigned int pmax = ec->maximized;
ec->comp_data->max = *max;
if ((!e_config->window_maximize_animate) || ec->maximize_anims_disabled)
{
e_client_unmaximize_geometry_get(ec, *max, NULL, NULL, &w, &h);
ew = ec->w, eh = ec->h;
ec->w = w, ec->h = h;
}
ec->maximized = 0;
_e_comp_wl_configure_send(ec, 0);
if ((!e_config->window_maximize_animate) || ec->maximize_anims_disabled)
ec->w = ew, ec->h = eh;
ec->maximized = pmax;
*max = 0;
}
}
static void
_e_comp_wl_evas_cb_maximize_pre(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
{
E_Client *ec = data;
E_Maximize *max = event_info;
if (e_object_is_del(E_OBJECT(ec))) return;
if (ec->comp_data->in_commit)
ec->comp_data->maximizing = 1;
else if (!e_client_has_xwindow(ec))
{
int w, h, ew, eh;
unsigned int pmax = ec->maximized;
ec->comp_data->max = *max;
if ((!e_config->window_maximize_animate) || ec->maximize_anims_disabled)
{
e_client_maximize_geometry_get(ec, *max, NULL, NULL, &w, &h);
ew = ec->w, eh = ec->h;
ec->w = w, ec->h = h;
}
ec->maximized = *max;
_e_comp_wl_configure_send(ec, 0);
if ((!e_config->window_maximize_animate) || ec->maximize_anims_disabled)
ec->w = ew, ec->h = eh;
ec->maximized = pmax;
*max = 0;
}
}
static void
@ -812,7 +861,7 @@ _e_comp_wl_client_evas_init(E_Client *ec)
evas_object_smart_callback_add(ec->frame, "maximize_pre",
_e_comp_wl_evas_cb_maximize_pre, ec);
evas_object_smart_callback_add(ec->frame, "unmaximize_pre",
_e_comp_wl_evas_cb_maximize_pre, ec);
_e_comp_wl_evas_cb_unmaximize_pre, ec);
evas_object_smart_callback_add(ec->frame, "maximize_done",
_e_comp_wl_evas_cb_maximize_done, ec);
evas_object_smart_callback_add(ec->frame, "unmaximize_done",
@ -1061,6 +1110,7 @@ _e_comp_wl_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *state)
first = !e_pixmap_usable_get(e_comp_x_client_pixmap_get(ec));
#endif
ec->comp_data->in_commit = 1;
if (ec->ignored && (ec->comp_data->shell.surface || ec->internal))
{
EC_CHANGED(ec);
@ -1283,6 +1333,7 @@ _e_comp_wl_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *state)
/* clear input tiler */
eina_tiler_clear(state->input);
}
ec->comp_data->in_commit = 0;
}
static void

View File

@ -309,6 +309,8 @@ struct _E_Comp_Wl_Client_Data
{
int32_t x, y;
} popup;
E_Maximize max;
#ifndef HAVE_WAYLAND_ONLY
E_Pixmap *xwayland_pixmap;
E_Comp_X_Client_Data *xwayland_data;
@ -323,6 +325,7 @@ struct _E_Comp_Wl_Client_Data
Eina_Bool cursor : 1;
Eina_Bool moved : 1;
Eina_Bool maximizing : 1;
Eina_Bool in_commit : 1;
};
struct _E_Comp_Wl_Output

View File

@ -989,6 +989,7 @@ _e_xdg_shell_surface_cb_maximized_unset(struct wl_client *client EINA_UNUSED, st
}
if (ec->lock_user_maximize) return;
ec->comp_data->max = (e_config->maximize_policy & E_MAXIMIZE_TYPE) | E_MAXIMIZE_BOTH;
if (e_config->window_maximize_animate)
w = ec->w, h = ec->h;
else
@ -1046,8 +1047,9 @@ _e_xdg_shell_surface_cb_minimized_set(struct wl_client *client EINA_UNUSED, stru
return;
}
if (!ec->lock_user_iconify)
ec->comp_data->shell.set.minimize = 1;
if (ec->lock_user_iconify) return;
ec->comp_data->shell.set.minimize = 1;
ec->comp_data->max = (e_config->maximize_policy & E_MAXIMIZE_TYPE) | E_MAXIMIZE_BOTH;
}
static const struct xdg_surface_interface _e_xdg_surface_interface =