diff --git a/include/labwc.h b/include/labwc.h index 0760bec6..9048fe26 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -145,6 +145,7 @@ struct view_impl { void (*for_each_surface)(struct view *view, wlr_surface_iterator_func_t iterator, void *data); void (*map)(struct view *view); + void (*move)(struct view *view, double x, double y); void (*unmap)(struct view *view); }; @@ -230,6 +231,7 @@ void xwayland_unmanaged_create(struct server *server, struct wlr_box view_get_surface_geometry(struct view *view); struct wlr_box view_geometry(struct view *view); void view_move_resize(struct view *view, struct wlr_box geo); +void view_move(struct view *view, double x, double y); void view_minimize(struct view *view); void view_unminimize(struct view *view); void view_for_each_surface(struct view *view, diff --git a/meson.build b/meson.build index 59f6d8c5..d72a63ee 100644 --- a/meson.build +++ b/meson.build @@ -11,6 +11,7 @@ project( add_project_arguments( [ '-DWLR_USE_UNSTABLE', + '-Wno-enum-compare', ], language: 'c', ) diff --git a/src/cursor.c b/src/cursor.c index 5ad5e7cb..40ff39e9 100644 --- a/src/cursor.c +++ b/src/cursor.c @@ -1,3 +1,4 @@ +#include #include "labwc.h" #include "menu/menu.h" @@ -68,17 +69,10 @@ process_cursor_move(struct server *server, uint32_t time) /* Move the grabbed view to the new position. */ double dx = server->seat.cursor->x - server->grab_x; double dy = server->seat.cursor->y - server->grab_y; - server->grabbed_view->x = server->grab_box.x + dx; - server->grabbed_view->y = server->grab_box.y + dy; - - if (server->grabbed_view->type != LAB_XWAYLAND_VIEW) { - return; - } struct view *view = server->grabbed_view; - wlr_xwayland_surface_configure(view->xwayland_surface, view->x, view->y, - view->xwayland_surface->width, - view->xwayland_surface->height); + assert(view); + view->impl->move(view, server->grab_box.x + dx, server->grab_box.y + dy); } #define MIN_VIEW_WIDTH (100) diff --git a/src/view.c b/src/view.c index e3d6991a..a6ab8971 100644 --- a/src/view.c +++ b/src/view.c @@ -6,6 +6,12 @@ view_move_resize(struct view *view, struct wlr_box geo) view->impl->configure(view, geo); } +void +view_move(struct view *view, double x, double y) +{ + view->impl->move(view, x, y); +} + void view_minimize(struct view *view) { diff --git a/src/xdg.c b/src/xdg.c index 62c3f365..180228ac 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -168,6 +168,13 @@ xdg_toplevel_view_configure(struct view *view, struct wlr_box geo) } } +static void +xdg_toplevel_view_move(struct view *view, double x, double y) +{ + view->x = x; + view->y = y; +} + static void xdg_toplevel_view_close(struct view *view) { @@ -242,6 +249,7 @@ static const struct view_impl xdg_toplevel_view_impl = { .close = xdg_toplevel_view_close, .for_each_surface = xdg_toplevel_view_for_each_surface, .map = xdg_toplevel_view_map, + .move = xdg_toplevel_view_move, .unmap = xdg_toplevel_view_unmap, }; diff --git a/src/xwayland.c b/src/xwayland.c index 0e8d9d14..9b2b2d49 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -72,6 +72,16 @@ configure(struct view *view, struct wlr_box geo) (uint16_t)geo.height); } +static void +move(struct view *view, double x, double y) +{ + view->x = x; + view->y = y; + struct wlr_xwayland_surface *s = view->xwayland_surface; + wlr_xwayland_surface_configure(s, (int16_t)x, (int16_t)y, + (uint16_t)s->width, (uint16_t)s->height); +} + static void _close(struct view *view) { @@ -144,6 +154,7 @@ static const struct view_impl xwl_view_impl = { .close = _close, .for_each_surface = for_each_surface, .map = map, + .move = move, .unmap = unmap, };