grab wl shell surface geom and use for adjusting resize operations

I think this still may not be 100% perfect,
but it's more like 95% perfect now instead of 50%
This commit is contained in:
Mike Blumenkrantz 2015-03-03 16:48:25 -05:00
parent bc160488d8
commit b069009a16
3 changed files with 32 additions and 21 deletions

View File

@ -507,38 +507,51 @@ _e_comp_wl_evas_cb_resize(void *data, Evas_Object *obj EINA_UNUSED, void *event
if (!ec->comp_data->shell.configure_send) return; if (!ec->comp_data->shell.configure_send) return;
if (e_client_util_resizing_get(ec)) if (e_client_util_resizing_get(ec))
{ {
int x, y; int x, y, ax, ay;
x = ec->mouse.last_down[ec->moveinfo.down.button - 1].w; x = ec->mouse.last_down[ec->moveinfo.down.button - 1].w;
y = ec->mouse.last_down[ec->moveinfo.down.button - 1].h; y = ec->mouse.last_down[ec->moveinfo.down.button - 1].h;
if (ec->comp_data->shell.window.w && ec->comp_data->shell.window.h)
{
ax = ec->client.w - ec->comp_data->shell.window.w;
ay = ec->client.h - ec->comp_data->shell.window.h;
}
else
ax = ay = 0;
switch (ec->resize_mode) switch (ec->resize_mode)
{ {
case E_POINTER_RESIZE_TL: case E_POINTER_RESIZE_TL:
case E_POINTER_RESIZE_L: case E_POINTER_RESIZE_L:
case E_POINTER_RESIZE_BL: case E_POINTER_RESIZE_BL:
x += ec->mouse.last_down[ec->moveinfo.down.button - 1].mx - ec->mouse.current.mx; x += ec->mouse.last_down[ec->moveinfo.down.button - 1].mx -
ec->mouse.current.mx - ec->comp_data->shell.window.x;
break; break;
case E_POINTER_RESIZE_TR: case E_POINTER_RESIZE_TR:
case E_POINTER_RESIZE_R: case E_POINTER_RESIZE_R:
case E_POINTER_RESIZE_BR: case E_POINTER_RESIZE_BR:
x += ec->mouse.current.mx - ec->mouse.last_down[ec->moveinfo.down.button - 1].mx; x += ec->mouse.current.mx - ec->mouse.last_down[ec->moveinfo.down.button - 1].mx -
ec->comp_data->shell.window.x;
break; break;
default: break; default:
x -= ax;
} }
switch (ec->resize_mode) switch (ec->resize_mode)
{ {
case E_POINTER_RESIZE_TL: case E_POINTER_RESIZE_TL:
case E_POINTER_RESIZE_T: case E_POINTER_RESIZE_T:
case E_POINTER_RESIZE_TR: case E_POINTER_RESIZE_TR:
y += ec->mouse.last_down[ec->moveinfo.down.button - 1].my - ec->mouse.current.my; y += ec->mouse.last_down[ec->moveinfo.down.button - 1].my -
ec->mouse.current.my - ec->comp_data->shell.window.y;
break; break;
case E_POINTER_RESIZE_BL: case E_POINTER_RESIZE_BL:
case E_POINTER_RESIZE_B: case E_POINTER_RESIZE_B:
case E_POINTER_RESIZE_BR: case E_POINTER_RESIZE_BR:
y += ec->mouse.current.my - ec->mouse.last_down[ec->moveinfo.down.button - 1].my; y += ec->mouse.current.my - ec->mouse.last_down[ec->moveinfo.down.button - 1].my -
ec->comp_data->shell.window.y;
break; break;
default: break; default:
y -= ay;
} }
ec->comp_data->shell.configure_send(ec->comp_data->shell.surface, ec->comp_data->shell.configure_send(ec->comp_data->shell.surface,
ec->comp->wl_comp_data->resize.edges, ec->comp->wl_comp_data->resize.edges,
@ -1062,7 +1075,6 @@ _e_comp_wl_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *state)
ec->new_client = EINA_TRUE; ec->new_client = EINA_TRUE;
} }
} }
state->sx = 0; state->sx = 0;
state->sy = 0; state->sy = 0;
state->new_attach = EINA_FALSE; state->new_attach = EINA_FALSE;

View File

@ -240,6 +240,7 @@ struct _E_Comp_Wl_Client_Data
void (*ping)(struct wl_resource *resource); void (*ping)(struct wl_resource *resource);
void (*map)(struct wl_resource *resource); void (*map)(struct wl_resource *resource);
void (*unmap)(struct wl_resource *resource); void (*unmap)(struct wl_resource *resource);
Eina_Rectangle window;
} shell; } shell;
E_Comp_Wl_Buffer_Ref buffer_ref; E_Comp_Wl_Buffer_Ref buffer_ref;

View File

@ -870,21 +870,19 @@ _e_xdg_shell_surface_cb_ack_configure(struct wl_client *client EINA_UNUSED, stru
} }
static void static void
_e_xdg_shell_surface_cb_window_geometry_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource EINA_UNUSED, int32_t x EINA_UNUSED, int32_t y EINA_UNUSED, int32_t w EINA_UNUSED, int32_t h EINA_UNUSED) _e_xdg_shell_surface_cb_window_geometry_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, int32_t x, int32_t y, int32_t w, int32_t h)
{ {
/* E_Client *ec; */ E_Client *ec;
/* get the client for this resource */ ec = wl_resource_get_user_data(resource);
/* if (!(ec = wl_resource_get_user_data(resource))) */ if (!ec)
/* { */ {
/* wl_resource_post_error(resource, */ wl_resource_post_error(resource, WL_DISPLAY_ERROR_INVALID_OBJECT,
/* WL_DISPLAY_ERROR_INVALID_OBJECT, */ "No Client For Shell Surface");
/* "No Client For Shell Surface"); */ return;
/* return; */ }
/* } */ EINA_RECTANGLE_SET(&ec->comp_data->shell.window, x, y, w, h);
//DBG("XDG_SHELL: Window Geom Set: %d \t%d %d, %d %d", wl_resource_get_id(resource), x, y, w, h);
/* DBG("XDG_SHELL: Window Geom Set: %d \t%d %d, %d %d", */
/* wl_resource_get_id(resource), x, y, w, h); */
} }
static void static void