simulate netwm sync for xwl clients

blocks execution of resizes until the surface commit arrives. reduces
the race condition between resize and render and eliminates frame drops
during slow resizes
This commit is contained in:
Mike Blumenkrantz 2015-07-15 13:55:35 -04:00
parent 1c0a0ab00f
commit 17e878eca3
2 changed files with 45 additions and 10 deletions

View File

@ -1146,7 +1146,35 @@ _e_comp_wl_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *state)
ec->comp_data->shell.configure(ec->comp_data->shell.surface,
x, y, state->bw, state->bh);
else
e_client_util_move_resize_without_frame(ec, x, y, state->bw, state->bh);
{
if (ec->netwm.sync.wait)
{
E_Client_Pending_Resize *pnd = NULL;
ec->netwm.sync.wait--;
/* skip pending for which we didn't get a reply */
while (ec->pending_resize)
{
pnd = eina_list_data_get(ec->pending_resize);
ec->pending_resize = eina_list_remove(ec->pending_resize, pnd);
if ((state->bw == pnd->w) && (state->bh == pnd->h))
break;
E_FREE(pnd);
}
if (pnd)
{
e_comp_object_frame_wh_adjust(ec->frame, pnd->w, pnd->h, &ec->w, &ec->h);
E_FREE(pnd);
}
ecore_evas_pointer_xy_get(e_comp->ee, &ec->mouse.current.mx, &ec->mouse.current.my);
ec->netwm.sync.send_time = ecore_loop_time_get();
}
e_client_util_move_resize_without_frame(ec, x, y, state->bw, state->bh);
}
if (ec->new_client)
ec->placed = placed;

View File

@ -4460,10 +4460,12 @@ static void
_e_comp_x_hook_client_resize_end(void *d EINA_UNUSED, E_Client *ec)
{
E_COMP_X_PIXMAP_CHECK;
if (!_e_comp_x_client_data_get(ec)->alarm) return;
eina_hash_del_by_key(alarm_hash, &_e_comp_x_client_data_get(ec)->alarm);
ecore_x_sync_alarm_free(_e_comp_x_client_data_get(ec)->alarm);
_e_comp_x_client_data_get(ec)->alarm = 0;
if (_e_comp_x_client_data_get(ec)->alarm)
{
eina_hash_del_by_key(alarm_hash, &_e_comp_x_client_data_get(ec)->alarm);
ecore_x_sync_alarm_free(_e_comp_x_client_data_get(ec)->alarm);
_e_comp_x_client_data_get(ec)->alarm = 0;
}
ec->netwm.sync.alarm = 0;
/* resize to last geometry if sync alarm for it was not yet handled */
if (ec->pending_resize)
@ -4480,9 +4482,12 @@ static void
_e_comp_x_hook_client_resize_begin(void *d EINA_UNUSED, E_Client *ec)
{
E_COMP_X_PIXMAP_CHECK;
if ((!ec->netwm.sync.request) || (e_comp->comp_type != E_PIXMAP_TYPE_X)) return;
_e_comp_x_client_data_get(ec)->alarm = ecore_x_sync_alarm_new(_e_comp_x_client_data_get(ec)->sync_counter);
eina_hash_add(alarm_hash, &_e_comp_x_client_data_get(ec)->alarm, ec);
if (!ec->netwm.sync.request) return;
if (e_comp->comp_type == E_PIXMAP_TYPE_X)
{
_e_comp_x_client_data_get(ec)->alarm = ecore_x_sync_alarm_new(_e_comp_x_client_data_get(ec)->sync_counter);
eina_hash_add(alarm_hash, &_e_comp_x_client_data_get(ec)->alarm, ec);
}
ec->netwm.sync.alarm = ec->netwm.sync.serial = 1;
ec->netwm.sync.wait = 0;
ec->netwm.sync.send_time = ecore_loop_time_get();
@ -5290,8 +5295,9 @@ e_comp_x_init(void)
_e_comp_x_move_resize_request, NULL);
E_LIST_HANDLER_APPEND(handlers, ECORE_X_EVENT_DESKTOP_CHANGE,
_e_comp_x_desktop_change, NULL);
E_LIST_HANDLER_APPEND(handlers, ECORE_X_EVENT_SYNC_ALARM,
_e_comp_x_sync_alarm, NULL);
if (e_comp->comp_type != E_PIXMAP_TYPE_WL)
E_LIST_HANDLER_APPEND(handlers, ECORE_X_EVENT_SYNC_ALARM,
_e_comp_x_sync_alarm, NULL);
E_LIST_HANDLER_APPEND(handlers, ECORE_EVENT_MOUSE_BUTTON_DOWN,
_e_comp_x_mouse_down, NULL);
@ -5434,6 +5440,7 @@ e_comp_x_xwayland_client_setup(E_Client *ec, E_Client *wc)
wc->w = ec->w, wc->h = ec->h;
wc->client.w = ec->client.w, wc->client.h = ec->client.h;
wc->layer = ec->layer;
wc->netwm.sync.request = 1;
evas_object_layer_set(wc->frame, evas_object_layer_get(ec->frame));
evas_object_geometry_set(wc->frame, ec->x, ec->y, ec->w, ec->h);
evas_object_show(wc->frame);