mirror of
https://github.com/labwc/labwc.git
synced 2026-03-17 05:33:47 -04:00
interactive: Don't write to view->x/y/w/h directly
Otherwise, the scene-graph isn't updated when calling view->impl->configure(), and the view ends up in a weird half-maximized state.
This commit is contained in:
parent
79d9cfcda6
commit
d5e2728c7f
1 changed files with 24 additions and 23 deletions
|
|
@ -31,6 +31,26 @@ interactive_begin(struct view *view, enum input_mode mode, uint32_t edges)
|
||||||
/* We don't allow resizing while in maximized or fullscreen state */
|
/* We don't allow resizing while in maximized or fullscreen state */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function sets up an interactive move or resize operation, where
|
||||||
|
* the compositor stops propagating pointer events to clients and
|
||||||
|
* instead consumes them itself, to move or resize windows.
|
||||||
|
*/
|
||||||
|
struct seat *seat = &view->server->seat;
|
||||||
|
struct server *server = view->server;
|
||||||
|
server->grabbed_view = view;
|
||||||
|
server->input_mode = mode;
|
||||||
|
|
||||||
|
/* Remember view and cursor positions at start of move/resize */
|
||||||
|
server->grab_x = seat->cursor->x;
|
||||||
|
server->grab_y = seat->cursor->y;
|
||||||
|
server->grab_box.x = view->x;
|
||||||
|
server->grab_box.y = view->y;
|
||||||
|
server->grab_box.width = view->w;
|
||||||
|
server->grab_box.height = view->h;
|
||||||
|
server->resize_edges = edges;
|
||||||
|
|
||||||
if (view->maximized || view->tiled) {
|
if (view->maximized || view->tiled) {
|
||||||
if (mode == LAB_INPUT_STATE_MOVE) {
|
if (mode == LAB_INPUT_STATE_MOVE) {
|
||||||
/* Exit maximized or tiled mode */
|
/* Exit maximized or tiled mode */
|
||||||
|
|
@ -52,35 +72,16 @@ interactive_begin(struct view *view, enum input_mode mode, uint32_t edges)
|
||||||
* the current values in server->grab_box. We pretend the
|
* the current values in server->grab_box. We pretend the
|
||||||
* configure already happened by setting them manually.
|
* configure already happened by setting them manually.
|
||||||
*/
|
*/
|
||||||
view->x = new_x;
|
server->grab_box.x = new_x;
|
||||||
view->y = new_y;
|
server->grab_box.y = new_y;
|
||||||
view->w = view->natural_geometry.width;
|
server->grab_box.width = view->natural_geometry.width;
|
||||||
view->h = view->natural_geometry.height;
|
server->grab_box.height = view->natural_geometry.height;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Moving or resizing always resets tiled state */
|
/* Moving or resizing always resets tiled state */
|
||||||
view->tiled = 0;
|
view->tiled = 0;
|
||||||
|
|
||||||
/*
|
|
||||||
* This function sets up an interactive move or resize operation, where
|
|
||||||
* the compositor stops propagating pointer events to clients and
|
|
||||||
* instead consumes them itself, to move or resize windows.
|
|
||||||
*/
|
|
||||||
struct seat *seat = &view->server->seat;
|
|
||||||
struct server *server = view->server;
|
|
||||||
server->grabbed_view = view;
|
|
||||||
server->input_mode = mode;
|
|
||||||
|
|
||||||
/* Remember view and cursor positions at start of move/resize */
|
|
||||||
server->grab_x = seat->cursor->x;
|
|
||||||
server->grab_y = seat->cursor->y;
|
|
||||||
struct wlr_box box = {
|
|
||||||
.x = view->x, .y = view->y, .width = view->w, .height = view->h
|
|
||||||
};
|
|
||||||
memcpy(&server->grab_box, &box, sizeof(struct wlr_box));
|
|
||||||
server->resize_edges = edges;
|
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case LAB_INPUT_STATE_MOVE:
|
case LAB_INPUT_STATE_MOVE:
|
||||||
cursor_set(&server->seat, "grab");
|
cursor_set(&server->seat, "grab");
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue