void (*close)(struct view *view);
const char *(*get_string_prop)(struct view *view, const char *prop);
void (*map)(struct view *view);
- void (*move)(struct view *view, int x, int y);
void (*set_activated)(struct view *view, bool activated);
void (*set_fullscreen)(struct view *view, bool fullscreen);
void (*unmap)(struct view *view);
view_move(struct view *view, int x, int y)
{
assert(view);
- if (view->impl->move) {
- view->impl->move(view, x, y);
- }
+ view_move_resize(view, (struct wlr_box){
+ .x = x, .y = y,
+ .width = view->pending.width,
+ .height = view->pending.height
+ });
}
void
view_update_app_id(view);
}
-static void
-xdg_toplevel_view_move(struct view *view, int x, int y)
-{
- /* override any previous pending move */
- view->pending.x = x;
- view->pending.y = y;
-
- /* Syncs moves with resizes */
- if (view->pending_configure_serial > 0) {
- return;
- }
-
- view->current.x = x;
- view->current.y = y;
- view_moved(view);
-}
-
static void
xdg_toplevel_view_configure(struct view *view, struct wlr_box geo)
{
+ uint32_t serial = 0;
view_adjust_size(view, &geo.width, &geo.height);
- if (view->pending.width == geo.width && view->pending.height == geo.height) {
- /*
- * As wayland has no notion of a global position
- * we are only updating the size. If a wayland
- * client receives the same size it already has
- * it might not respond to the configure request
- * and thus we will never actually set the new
- * position. To handle this case just call move
- * directly.
- */
- xdg_toplevel_view_move(view, geo.x, geo.y);
- return;
+ /*
+ * We do not need to send a configure request unless the size
+ * changed (wayland has no notion of a global position). If the
+ * size is the same (and there is no pending configure request)
+ * then we can just move the view directly.
+ */
+ if (geo.width != view->pending.width
+ || geo.height != view->pending.height) {
+ serial = wlr_xdg_toplevel_set_size(xdg_toplevel_from_view(view),
+ geo.width, geo.height);
}
view->pending = geo;
- struct wlr_xdg_toplevel *xdg_toplevel = xdg_toplevel_from_view(view);
- uint32_t serial = wlr_xdg_toplevel_set_size(xdg_toplevel,
- (uint32_t)geo.width, (uint32_t)geo.height);
if (serial > 0) {
view->pending_configure_serial = serial;
} else if (view->pending_configure_serial == 0) {
.close = xdg_toplevel_view_close,
.get_string_prop = xdg_toplevel_view_get_string_prop,
.map = xdg_toplevel_view_map,
- .move = xdg_toplevel_view_move,
.set_activated = xdg_toplevel_view_set_activated,
.set_fullscreen = xdg_toplevel_view_set_fullscreen,
.unmap = xdg_toplevel_view_unmap,
view_update_app_id(view);
}
-static void
-move(struct view *view, int x, int y)
-{
- view->current.x = x;
- view->current.y = y;
-
- /* override any previous pending move */
- view->pending.x = x;
- view->pending.y = y;
-
- struct wlr_xwayland_surface *s = xwayland_surface_from_view(view);
- wlr_xwayland_surface_configure(s, (int16_t)x, (int16_t)y,
- (uint16_t)s->width, (uint16_t)s->height);
- view_moved(view);
-}
-
static void
_close(struct view *view)
{
.close = _close,
.get_string_prop = get_string_prop,
.map = map,
- .move = move,
.set_activated = set_activated,
.set_fullscreen = set_fullscreen,
.unmap = unmap,