forked from enlightenment/enlightenment
Add support to resize wayland clients.
Signed-off-by: Chris Michael <cp.michael@samsung.com>
This commit is contained in:
parent
58df59aaf4
commit
d22f3f53a5
|
@ -49,6 +49,7 @@ static void _e_wl_shell_shell_surface_cb_key_down(void *data, Evas_Object *obj E
|
||||||
/* shell surface interface prototypes */
|
/* shell surface interface prototypes */
|
||||||
static void _e_wl_shell_shell_surface_cb_pong(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, unsigned int serial);
|
static void _e_wl_shell_shell_surface_cb_pong(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, unsigned int serial);
|
||||||
static void _e_wl_shell_shell_surface_cb_move(struct wl_client *client, struct wl_resource *resource, struct wl_resource *seat_resource, unsigned int serial);
|
static void _e_wl_shell_shell_surface_cb_move(struct wl_client *client, struct wl_resource *resource, struct wl_resource *seat_resource, unsigned int serial);
|
||||||
|
static void _e_wl_shell_shell_surface_cb_resize(struct wl_client *client, struct wl_resource *resource, struct wl_resource *seat_resource, unsigned int serial, unsigned int edges);
|
||||||
static void _e_wl_shell_shell_surface_cb_toplevel_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource);
|
static void _e_wl_shell_shell_surface_cb_toplevel_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource);
|
||||||
static void _e_wl_shell_shell_surface_cb_fullscreen_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, unsigned int method, unsigned int framerate, struct wl_resource *output_resource);
|
static void _e_wl_shell_shell_surface_cb_fullscreen_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, unsigned int method, unsigned int framerate, struct wl_resource *output_resource);
|
||||||
static void _e_wl_shell_shell_surface_cb_maximized_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, struct wl_resource *output_resource EINA_UNUSED);
|
static void _e_wl_shell_shell_surface_cb_maximized_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, struct wl_resource *output_resource EINA_UNUSED);
|
||||||
|
@ -60,6 +61,11 @@ static void _e_wl_shell_move_grab_cb_focus(struct wl_pointer_grab *grab, struct
|
||||||
static void _e_wl_shell_move_grab_cb_motion(struct wl_pointer_grab *grab, unsigned int timestamp, wl_fixed_t x, wl_fixed_t y);
|
static void _e_wl_shell_move_grab_cb_motion(struct wl_pointer_grab *grab, unsigned int timestamp, wl_fixed_t x, wl_fixed_t y);
|
||||||
static void _e_wl_shell_move_grab_cb_button(struct wl_pointer_grab *grab, unsigned int timestamp, unsigned int button, unsigned int state);
|
static void _e_wl_shell_move_grab_cb_button(struct wl_pointer_grab *grab, unsigned int timestamp, unsigned int button, unsigned int state);
|
||||||
|
|
||||||
|
/* shell resize_grab interface prototypes */
|
||||||
|
static void _e_wl_shell_resize_grab_cb_focus(struct wl_pointer_grab *grab, struct wl_surface *surface EINA_UNUSED, wl_fixed_t x EINA_UNUSED, wl_fixed_t y EINA_UNUSED);
|
||||||
|
static void _e_wl_shell_resize_grab_cb_motion(struct wl_pointer_grab *grab, unsigned int timestamp, wl_fixed_t x, wl_fixed_t y);
|
||||||
|
static void _e_wl_shell_resize_grab_cb_button(struct wl_pointer_grab *grab, unsigned int timestamp, unsigned int button, unsigned int state);
|
||||||
|
|
||||||
/* shell busy_grab interface prototypes */
|
/* shell busy_grab interface prototypes */
|
||||||
static void _e_wl_shell_busy_grab_cb_focus(struct wl_pointer_grab *grab, struct wl_surface *surface, wl_fixed_t x EINA_UNUSED, wl_fixed_t y EINA_UNUSED);
|
static void _e_wl_shell_busy_grab_cb_focus(struct wl_pointer_grab *grab, struct wl_surface *surface, wl_fixed_t x EINA_UNUSED, wl_fixed_t y EINA_UNUSED);
|
||||||
static void _e_wl_shell_busy_grab_cb_motion(struct wl_pointer_grab *grab EINA_UNUSED, unsigned int timestamp EINA_UNUSED, wl_fixed_t x EINA_UNUSED, wl_fixed_t y EINA_UNUSED);
|
static void _e_wl_shell_busy_grab_cb_motion(struct wl_pointer_grab *grab EINA_UNUSED, unsigned int timestamp EINA_UNUSED, wl_fixed_t x EINA_UNUSED, wl_fixed_t y EINA_UNUSED);
|
||||||
|
@ -84,7 +90,7 @@ static const struct wl_shell_surface_interface _e_shell_surface_interface =
|
||||||
{
|
{
|
||||||
_e_wl_shell_shell_surface_cb_pong,
|
_e_wl_shell_shell_surface_cb_pong,
|
||||||
_e_wl_shell_shell_surface_cb_move,
|
_e_wl_shell_shell_surface_cb_move,
|
||||||
NULL, // resize
|
_e_wl_shell_shell_surface_cb_resize,
|
||||||
_e_wl_shell_shell_surface_cb_toplevel_set,
|
_e_wl_shell_shell_surface_cb_toplevel_set,
|
||||||
NULL, // transient_set
|
NULL, // transient_set
|
||||||
_e_wl_shell_shell_surface_cb_fullscreen_set,
|
_e_wl_shell_shell_surface_cb_fullscreen_set,
|
||||||
|
@ -101,6 +107,13 @@ static const struct wl_pointer_grab_interface _e_move_grab_interface =
|
||||||
_e_wl_shell_move_grab_cb_button,
|
_e_wl_shell_move_grab_cb_button,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct wl_pointer_grab_interface _e_resize_grab_interface =
|
||||||
|
{
|
||||||
|
_e_wl_shell_resize_grab_cb_focus,
|
||||||
|
_e_wl_shell_resize_grab_cb_motion,
|
||||||
|
_e_wl_shell_resize_grab_cb_button,
|
||||||
|
};
|
||||||
|
|
||||||
static const struct wl_pointer_grab_interface _e_busy_grab_interface =
|
static const struct wl_pointer_grab_interface _e_busy_grab_interface =
|
||||||
{
|
{
|
||||||
_e_wl_shell_busy_grab_cb_focus,
|
_e_wl_shell_busy_grab_cb_focus,
|
||||||
|
@ -1274,6 +1287,61 @@ _e_wl_shell_shell_surface_cb_move(struct wl_client *client, struct wl_resource *
|
||||||
e_border_act_move_begin(ewss->surface->bd, ev);
|
e_border_act_move_begin(ewss->surface->bd, ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_wl_shell_shell_surface_cb_resize(struct wl_client *client, struct wl_resource *resource, struct wl_resource *seat_resource, unsigned int serial, unsigned int edges)
|
||||||
|
{
|
||||||
|
E_Wayland_Input *input = NULL;
|
||||||
|
E_Wayland_Shell_Surface *ewss = NULL;
|
||||||
|
E_Wayland_Shell_Grab *grab = NULL;
|
||||||
|
E_Binding_Event_Mouse_Button *ev;
|
||||||
|
|
||||||
|
/* try to cast the seat resource to our input structure */
|
||||||
|
if (!(input = seat_resource->data)) return;
|
||||||
|
|
||||||
|
/* try to cast the resource to our shell surface */
|
||||||
|
if (!(ewss = resource->data)) return;
|
||||||
|
|
||||||
|
/* if the shell surface is fullscreen or maximized, get out */
|
||||||
|
if ((ewss->type == E_WAYLAND_SHELL_SURFACE_TYPE_FULLSCREEN) ||
|
||||||
|
(ewss->type == E_WAYLAND_SHELL_SURFACE_TYPE_MAXIMIZED))
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* check for valid move setup */
|
||||||
|
if ((input->wl.seat.pointer->button_count == 0) ||
|
||||||
|
(input->wl.seat.pointer->grab_serial != serial) ||
|
||||||
|
(input->wl.seat.pointer->focus != &ewss->surface->wl.surface))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ((edges == 0) || (edges > 15) ||
|
||||||
|
((edges & 3) == 3) || ((edges & 12) == 12))
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* try to allocate space for our grab structure */
|
||||||
|
if (!(grab = E_NEW(E_Wayland_Shell_Grab, 1))) return;
|
||||||
|
|
||||||
|
/* set grab properties */
|
||||||
|
grab->edges = edges;
|
||||||
|
grab->w = ewss->surface->geometry.w;
|
||||||
|
grab->h = ewss->surface->geometry.h;
|
||||||
|
|
||||||
|
/* start the resize grab */
|
||||||
|
_e_wl_shell_grab_start(grab, ewss, input->wl.seat.pointer,
|
||||||
|
&_e_resize_grab_interface, edges);
|
||||||
|
|
||||||
|
/* create a fake binding event for mouse button */
|
||||||
|
ev = E_NEW(E_Binding_Event_Mouse_Button, 1);
|
||||||
|
|
||||||
|
if (grab->pointer->grab_button == BTN_LEFT)
|
||||||
|
ev->button = 1;
|
||||||
|
else if (grab->pointer->grab_button == BTN_MIDDLE)
|
||||||
|
ev->button = 2;
|
||||||
|
else if (grab->pointer->grab_button == BTN_RIGHT)
|
||||||
|
ev->button = 3;
|
||||||
|
|
||||||
|
/* tell E to start resizing this border */
|
||||||
|
e_border_act_resize_begin(ewss->surface->bd, ev);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_e_wl_shell_shell_surface_cb_toplevel_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource)
|
_e_wl_shell_shell_surface_cb_toplevel_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource)
|
||||||
{
|
{
|
||||||
|
@ -1386,6 +1454,7 @@ _e_wl_shell_shell_surface_cb_class_set(struct wl_client *client EINA_UNUSED, str
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* shell move_grab interface functions */
|
||||||
static void
|
static void
|
||||||
_e_wl_shell_move_grab_cb_focus(struct wl_pointer_grab *grab, struct wl_surface *surface EINA_UNUSED, wl_fixed_t x EINA_UNUSED, wl_fixed_t y EINA_UNUSED)
|
_e_wl_shell_move_grab_cb_focus(struct wl_pointer_grab *grab, struct wl_surface *surface EINA_UNUSED, wl_fixed_t x EINA_UNUSED, wl_fixed_t y EINA_UNUSED)
|
||||||
{
|
{
|
||||||
|
@ -1402,25 +1471,25 @@ _e_wl_shell_move_grab_cb_motion(struct wl_pointer_grab *grab, unsigned int times
|
||||||
/* FIXME: This needs to become a no-op as the actual surface movement
|
/* FIXME: This needs to become a no-op as the actual surface movement
|
||||||
* is handled by e_border now */
|
* is handled by e_border now */
|
||||||
|
|
||||||
printf("Grab Motion: %d %d\n", x, y);
|
printf("Move Grab Motion: %d %d\n", x, y);
|
||||||
|
|
||||||
E_Wayland_Shell_Grab *ewsg = NULL;
|
/* E_Wayland_Shell_Grab *ewsg = NULL; */
|
||||||
E_Wayland_Shell_Surface *ewss = NULL;
|
/* E_Wayland_Shell_Surface *ewss = NULL; */
|
||||||
struct wl_pointer *ptr;
|
/* struct wl_pointer *ptr; */
|
||||||
/* Evas_Coord nx = 0, ny = 0; */
|
/* Evas_Coord nx = 0, ny = 0; */
|
||||||
|
|
||||||
/* safety */
|
/* safety */
|
||||||
if (!grab) return;
|
/* if (!grab) return; */
|
||||||
|
|
||||||
/* try to get the shell grab from the pointer grab */
|
/* try to get the shell grab from the pointer grab */
|
||||||
if (!(ewsg = container_of(grab, E_Wayland_Shell_Grab, grab)))
|
/* if (!(ewsg = container_of(grab, E_Wayland_Shell_Grab, grab))) */
|
||||||
return;
|
/* return; */
|
||||||
|
|
||||||
/* try to get the pointer */
|
/* try to get the pointer */
|
||||||
if (!(ptr = grab->pointer)) return;
|
/* if (!(ptr = grab->pointer)) return; */
|
||||||
|
|
||||||
/* try to get the shell surface */
|
/* try to get the shell surface */
|
||||||
if (!(ewss = ewsg->shell_surface)) return;
|
/* if (!(ewss = ewsg->shell_surface)) return; */
|
||||||
|
|
||||||
|
|
||||||
/* printf("\tGrab: %d %d\n", ewsg->x, ewsg->y); */
|
/* printf("\tGrab: %d %d\n", ewsg->x, ewsg->y); */
|
||||||
|
@ -1482,6 +1551,71 @@ _e_wl_shell_move_grab_cb_button(struct wl_pointer_grab *grab, unsigned int times
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* shell resize_grab interface functions */
|
||||||
|
static void
|
||||||
|
_e_wl_shell_resize_grab_cb_focus(struct wl_pointer_grab *grab, struct wl_surface *surface EINA_UNUSED, wl_fixed_t x EINA_UNUSED, wl_fixed_t y EINA_UNUSED)
|
||||||
|
{
|
||||||
|
/* safety */
|
||||||
|
if (!grab) return;
|
||||||
|
|
||||||
|
/* remove focus */
|
||||||
|
grab->focus = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_wl_shell_resize_grab_cb_motion(struct wl_pointer_grab *grab, unsigned int timestamp, wl_fixed_t x, wl_fixed_t y)
|
||||||
|
{
|
||||||
|
/* FIXME: This needs to become a no-op as the actual surface resize
|
||||||
|
* is handled by e_border now */
|
||||||
|
|
||||||
|
printf("Resize Grab Motion: %d %d\n", x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_wl_shell_resize_grab_cb_button(struct wl_pointer_grab *grab, unsigned int timestamp, unsigned int button, unsigned int state)
|
||||||
|
{
|
||||||
|
E_Wayland_Shell_Grab *ewsg = NULL;
|
||||||
|
struct wl_pointer *ptr;
|
||||||
|
|
||||||
|
printf("Resize Grab Button\n");
|
||||||
|
|
||||||
|
/* safety */
|
||||||
|
if (!grab) return;
|
||||||
|
|
||||||
|
/* try to get the shell grab from the pointer grab */
|
||||||
|
if (!(ewsg = container_of(grab, E_Wayland_Shell_Grab, grab)))
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* try to get the pointer */
|
||||||
|
if (!(ptr = grab->pointer)) return;
|
||||||
|
|
||||||
|
printf("\tButton Count: %d\n", ptr->button_count);
|
||||||
|
printf("\tState: %d\n", state);
|
||||||
|
|
||||||
|
/* test if we are done with the grab */
|
||||||
|
if ((ptr->button_count == 0) &&
|
||||||
|
(state == WL_POINTER_BUTTON_STATE_RELEASED))
|
||||||
|
{
|
||||||
|
E_Wayland_Surface *ews = NULL;
|
||||||
|
|
||||||
|
printf("\tNO BUTTON DOWN\n");
|
||||||
|
ews = ewsg->shell_surface->surface;
|
||||||
|
|
||||||
|
/* tell E to end the border resize */
|
||||||
|
e_border_act_resize_end(ews->bd, NULL);
|
||||||
|
|
||||||
|
/* end the grab */
|
||||||
|
_e_wl_shell_grab_end(ewsg);
|
||||||
|
free(grab);
|
||||||
|
|
||||||
|
/* set surface geometry */
|
||||||
|
_e_wl_shell_shell_surface_configure(ews, ews->geometry.x,
|
||||||
|
ews->geometry.y, ews->bd->w,
|
||||||
|
ews->bd->h);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* shell busy_grab interface functions */
|
||||||
static void
|
static void
|
||||||
_e_wl_shell_busy_grab_cb_focus(struct wl_pointer_grab *grab, struct wl_surface *surface, wl_fixed_t x EINA_UNUSED, wl_fixed_t y EINA_UNUSED)
|
_e_wl_shell_busy_grab_cb_focus(struct wl_pointer_grab *grab, struct wl_surface *surface, wl_fixed_t x EINA_UNUSED, wl_fixed_t y EINA_UNUSED)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue