Ensure to move the view when configured
This commit is contained in:
parent
27937add76
commit
e2843d87c8
|
@ -30,7 +30,7 @@ struct roots_xdg_surface_v6 {
|
||||||
struct wl_listener request_maximize;
|
struct wl_listener request_maximize;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
bool needs_move;
|
uint32_t configure_serial;
|
||||||
double x, y;
|
double x, y;
|
||||||
uint32_t width, height;
|
uint32_t width, height;
|
||||||
} move_resize;
|
} move_resize;
|
||||||
|
|
|
@ -107,7 +107,9 @@ struct wlr_xdg_surface_v6 {
|
||||||
|
|
||||||
bool configured;
|
bool configured;
|
||||||
bool added;
|
bool added;
|
||||||
|
uint32_t configure_serial;
|
||||||
struct wl_event_source *configure_idle;
|
struct wl_event_source *configure_idle;
|
||||||
|
uint32_t configure_next_serial;
|
||||||
struct wl_list configure_list;
|
struct wl_list configure_list;
|
||||||
|
|
||||||
char *title;
|
char *title;
|
||||||
|
@ -171,37 +173,38 @@ void wlr_xdg_shell_v6_destroy(struct wlr_xdg_shell_v6 *xdg_shell);
|
||||||
void wlr_xdg_surface_v6_ping(struct wlr_xdg_surface_v6 *surface);
|
void wlr_xdg_surface_v6_ping(struct wlr_xdg_surface_v6 *surface);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request that this toplevel surface be the given size.
|
* Request that this toplevel surface be the given size. Returns the associated
|
||||||
|
* configure serial.
|
||||||
*/
|
*/
|
||||||
void wlr_xdg_toplevel_v6_set_size(struct wlr_xdg_surface_v6 *surface,
|
uint32_t wlr_xdg_toplevel_v6_set_size(struct wlr_xdg_surface_v6 *surface,
|
||||||
uint32_t width, uint32_t height);
|
uint32_t width, uint32_t height);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request that this toplevel surface show itself in an activated or deactivated
|
* Request that this toplevel surface show itself in an activated or deactivated
|
||||||
* state.
|
* state. Returns the associated configure serial.
|
||||||
*/
|
*/
|
||||||
void wlr_xdg_toplevel_v6_set_activated(struct wlr_xdg_surface_v6 *surface,
|
uint32_t wlr_xdg_toplevel_v6_set_activated(struct wlr_xdg_surface_v6 *surface,
|
||||||
bool activated);
|
bool activated);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request that this toplevel surface consider itself maximized or not
|
* Request that this toplevel surface consider itself maximized or not
|
||||||
* maximized.
|
* maximized. Returns the associated configure serial.
|
||||||
*/
|
*/
|
||||||
void wlr_xdg_toplevel_v6_set_maximized(struct wlr_xdg_surface_v6 *surface,
|
uint32_t wlr_xdg_toplevel_v6_set_maximized(struct wlr_xdg_surface_v6 *surface,
|
||||||
bool maximized);
|
bool maximized);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request that this toplevel surface consider itself fullscreen or not
|
* Request that this toplevel surface consider itself fullscreen or not
|
||||||
* fullscreen.
|
* fullscreen. Returns the associated configure serial.
|
||||||
*/
|
*/
|
||||||
void wlr_xdg_toplevel_v6_set_fullscreen(struct wlr_xdg_surface_v6 *surface,
|
uint32_t wlr_xdg_toplevel_v6_set_fullscreen(struct wlr_xdg_surface_v6 *surface,
|
||||||
bool fullscreen);
|
bool fullscreen);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request that this toplevel surface consider itself to be resizing or not
|
* Request that this toplevel surface consider itself to be resizing or not
|
||||||
* resizing.
|
* resizing. Returns the associated configure serial.
|
||||||
*/
|
*/
|
||||||
void wlr_xdg_toplevel_v6_set_resizing(struct wlr_xdg_surface_v6 *surface,
|
uint32_t wlr_xdg_toplevel_v6_set_resizing(struct wlr_xdg_surface_v6 *surface,
|
||||||
bool resizing);
|
bool resizing);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -223,4 +226,5 @@ void wlr_xdg_surface_v6_popup_get_position(struct wlr_xdg_surface_v6 *surface,
|
||||||
struct wlr_xdg_surface_v6 *wlr_xdg_surface_v6_popup_at(
|
struct wlr_xdg_surface_v6 *wlr_xdg_surface_v6_popup_at(
|
||||||
struct wlr_xdg_surface_v6 *surface, double sx, double sy,
|
struct wlr_xdg_surface_v6 *surface, double sx, double sy,
|
||||||
double *popup_sx, double *popup_sy);
|
double *popup_sx, double *popup_sy);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -83,14 +83,13 @@ static void move_resize(struct roots_view *view, double x, double y,
|
||||||
x = x + width - constrained_width;
|
x = x + width - constrained_width;
|
||||||
y = y + height - constrained_height;
|
y = y + height - constrained_height;
|
||||||
|
|
||||||
roots_surface->move_resize.needs_move = true;
|
|
||||||
roots_surface->move_resize.x = x;
|
roots_surface->move_resize.x = x;
|
||||||
roots_surface->move_resize.y = y;
|
roots_surface->move_resize.y = y;
|
||||||
roots_surface->move_resize.width = constrained_width;
|
roots_surface->move_resize.width = constrained_width;
|
||||||
roots_surface->move_resize.height = constrained_height;
|
roots_surface->move_resize.height = constrained_height;
|
||||||
|
|
||||||
wlr_xdg_toplevel_v6_set_size(surface, constrained_width,
|
roots_surface->move_resize.configure_serial = wlr_xdg_toplevel_v6_set_size(
|
||||||
constrained_height);
|
surface, constrained_width, constrained_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void maximize(struct roots_view *view, bool maximized) {
|
static void maximize(struct roots_view *view, bool maximized) {
|
||||||
|
@ -159,12 +158,13 @@ static void handle_commit(struct wl_listener *listener, void *data) {
|
||||||
struct roots_view *view = roots_surface->view;
|
struct roots_view *view = roots_surface->view;
|
||||||
struct wlr_xdg_surface_v6 *surface = view->xdg_surface_v6;
|
struct wlr_xdg_surface_v6 *surface = view->xdg_surface_v6;
|
||||||
|
|
||||||
if (roots_surface->move_resize.needs_move) {
|
if (roots_surface->move_resize.configure_serial ==
|
||||||
|
surface->configure_serial) {
|
||||||
view->x = roots_surface->move_resize.x +
|
view->x = roots_surface->move_resize.x +
|
||||||
roots_surface->move_resize.width - surface->geometry->width;
|
roots_surface->move_resize.width - surface->geometry->width;
|
||||||
view->y = roots_surface->move_resize.y +
|
view->y = roots_surface->move_resize.y +
|
||||||
roots_surface->move_resize.height - surface->geometry->height;
|
roots_surface->move_resize.height - surface->geometry->height;
|
||||||
roots_surface->move_resize.needs_move = false;
|
roots_surface->move_resize.configure_serial = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -812,6 +812,7 @@ static void xdg_surface_ack_configure(struct wl_client *client,
|
||||||
}
|
}
|
||||||
|
|
||||||
surface->configured = true;
|
surface->configured = true;
|
||||||
|
surface->configure_serial = serial;
|
||||||
|
|
||||||
wl_signal_emit(&surface->events.ack_configure, surface);
|
wl_signal_emit(&surface->events.ack_configure, surface);
|
||||||
|
|
||||||
|
@ -941,7 +942,6 @@ static void wlr_xdg_toplevel_v6_send_configure(
|
||||||
|
|
||||||
static void wlr_xdg_surface_send_configure(void *user_data) {
|
static void wlr_xdg_surface_send_configure(void *user_data) {
|
||||||
struct wlr_xdg_surface_v6 *surface = user_data;
|
struct wlr_xdg_surface_v6 *surface = user_data;
|
||||||
struct wl_display *display = wl_client_get_display(surface->client->client);
|
|
||||||
|
|
||||||
surface->configure_idle = NULL;
|
surface->configure_idle = NULL;
|
||||||
|
|
||||||
|
@ -953,7 +953,7 @@ static void wlr_xdg_surface_send_configure(void *user_data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
wl_list_insert(surface->configure_list.prev, &configure->link);
|
wl_list_insert(surface->configure_list.prev, &configure->link);
|
||||||
configure->serial = wl_display_next_serial(display);
|
configure->serial = surface->configure_next_serial;
|
||||||
|
|
||||||
switch (surface->role) {
|
switch (surface->role) {
|
||||||
case WLR_XDG_SURFACE_V6_ROLE_NONE:
|
case WLR_XDG_SURFACE_V6_ROLE_NONE:
|
||||||
|
@ -974,7 +974,7 @@ static void wlr_xdg_surface_send_configure(void *user_data) {
|
||||||
zxdg_surface_v6_send_configure(surface->resource, configure->serial);
|
zxdg_surface_v6_send_configure(surface->resource, configure->serial);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wlr_xdg_surface_v6_schedule_configure(
|
static uint32_t wlr_xdg_surface_v6_schedule_configure(
|
||||||
struct wlr_xdg_surface_v6 *surface) {
|
struct wlr_xdg_surface_v6 *surface) {
|
||||||
struct wl_display *display = wl_client_get_display(surface->client->client);
|
struct wl_display *display = wl_client_get_display(surface->client->client);
|
||||||
struct wl_event_loop *loop = wl_display_get_event_loop(display);
|
struct wl_event_loop *loop = wl_display_get_event_loop(display);
|
||||||
|
@ -995,23 +995,23 @@ static void wlr_xdg_surface_v6_schedule_configure(
|
||||||
if (surface->configure_idle != NULL) {
|
if (surface->configure_idle != NULL) {
|
||||||
if (!pending_same) {
|
if (!pending_same) {
|
||||||
// configure request already scheduled
|
// configure request already scheduled
|
||||||
return;
|
return surface->configure_next_serial;
|
||||||
}
|
}
|
||||||
|
|
||||||
// configure request not necessary anymore
|
// configure request not necessary anymore
|
||||||
wl_event_source_remove(surface->configure_idle);
|
wl_event_source_remove(surface->configure_idle);
|
||||||
surface->configure_idle = NULL;
|
surface->configure_idle = NULL;
|
||||||
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
if (pending_same) {
|
if (pending_same) {
|
||||||
// configure request not necessary
|
// configure request not necessary
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
surface->configure_idle =
|
surface->configure_next_serial = wl_display_next_serial(display);
|
||||||
wl_event_loop_add_idle(
|
surface->configure_idle = wl_event_loop_add_idle(loop,
|
||||||
loop,
|
wlr_xdg_surface_send_configure, surface);
|
||||||
wlr_xdg_surface_send_configure,
|
return surface->configure_next_serial;
|
||||||
surface);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1304,45 +1304,45 @@ void wlr_xdg_surface_v6_ping(struct wlr_xdg_surface_v6 *surface) {
|
||||||
surface->client->ping_serial);
|
surface->client->ping_serial);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wlr_xdg_toplevel_v6_set_size(struct wlr_xdg_surface_v6 *surface,
|
uint32_t wlr_xdg_toplevel_v6_set_size(struct wlr_xdg_surface_v6 *surface,
|
||||||
uint32_t width, uint32_t height) {
|
uint32_t width, uint32_t height) {
|
||||||
assert(surface->role == WLR_XDG_SURFACE_V6_ROLE_TOPLEVEL);
|
assert(surface->role == WLR_XDG_SURFACE_V6_ROLE_TOPLEVEL);
|
||||||
surface->toplevel_state->pending.width = width;
|
surface->toplevel_state->pending.width = width;
|
||||||
surface->toplevel_state->pending.height = height;
|
surface->toplevel_state->pending.height = height;
|
||||||
|
|
||||||
wlr_xdg_surface_v6_schedule_configure(surface);
|
return wlr_xdg_surface_v6_schedule_configure(surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wlr_xdg_toplevel_v6_set_activated(struct wlr_xdg_surface_v6 *surface,
|
uint32_t wlr_xdg_toplevel_v6_set_activated(struct wlr_xdg_surface_v6 *surface,
|
||||||
bool activated) {
|
bool activated) {
|
||||||
assert(surface->role == WLR_XDG_SURFACE_V6_ROLE_TOPLEVEL);
|
assert(surface->role == WLR_XDG_SURFACE_V6_ROLE_TOPLEVEL);
|
||||||
surface->toplevel_state->pending.activated = activated;
|
surface->toplevel_state->pending.activated = activated;
|
||||||
|
|
||||||
wlr_xdg_surface_v6_schedule_configure(surface);
|
return wlr_xdg_surface_v6_schedule_configure(surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wlr_xdg_toplevel_v6_set_maximized(struct wlr_xdg_surface_v6 *surface,
|
uint32_t wlr_xdg_toplevel_v6_set_maximized(struct wlr_xdg_surface_v6 *surface,
|
||||||
bool maximized) {
|
bool maximized) {
|
||||||
assert(surface->role == WLR_XDG_SURFACE_V6_ROLE_TOPLEVEL);
|
assert(surface->role == WLR_XDG_SURFACE_V6_ROLE_TOPLEVEL);
|
||||||
surface->toplevel_state->pending.maximized = maximized;
|
surface->toplevel_state->pending.maximized = maximized;
|
||||||
|
|
||||||
wlr_xdg_surface_v6_schedule_configure(surface);
|
return wlr_xdg_surface_v6_schedule_configure(surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wlr_xdg_toplevel_v6_set_fullscreen(struct wlr_xdg_surface_v6 *surface,
|
uint32_t wlr_xdg_toplevel_v6_set_fullscreen(struct wlr_xdg_surface_v6 *surface,
|
||||||
bool fullscreen) {
|
bool fullscreen) {
|
||||||
assert(surface->role == WLR_XDG_SURFACE_V6_ROLE_TOPLEVEL);
|
assert(surface->role == WLR_XDG_SURFACE_V6_ROLE_TOPLEVEL);
|
||||||
surface->toplevel_state->pending.fullscreen = fullscreen;
|
surface->toplevel_state->pending.fullscreen = fullscreen;
|
||||||
|
|
||||||
wlr_xdg_surface_v6_schedule_configure(surface);
|
return wlr_xdg_surface_v6_schedule_configure(surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wlr_xdg_toplevel_v6_set_resizing(struct wlr_xdg_surface_v6 *surface,
|
uint32_t wlr_xdg_toplevel_v6_set_resizing(struct wlr_xdg_surface_v6 *surface,
|
||||||
bool resizing) {
|
bool resizing) {
|
||||||
assert(surface->role == WLR_XDG_SURFACE_V6_ROLE_TOPLEVEL);
|
assert(surface->role == WLR_XDG_SURFACE_V6_ROLE_TOPLEVEL);
|
||||||
surface->toplevel_state->pending.resizing = resizing;
|
surface->toplevel_state->pending.resizing = resizing;
|
||||||
|
|
||||||
wlr_xdg_surface_v6_schedule_configure(surface);
|
return wlr_xdg_surface_v6_schedule_configure(surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wlr_xdg_toplevel_v6_send_close(struct wlr_xdg_surface_v6 *surface) {
|
void wlr_xdg_toplevel_v6_send_close(struct wlr_xdg_surface_v6 *surface) {
|
||||||
|
|
Loading…
Reference in New Issue