mirror of
https://github.com/labwc/labwc.git
synced 2026-03-21 05:33:52 -04:00
parent
5585977f72
commit
3c345201cd
2 changed files with 47 additions and 21 deletions
|
|
@ -17,29 +17,49 @@ max_move_scale(double pos_cursor, double pos_current,
|
||||||
void
|
void
|
||||||
interactive_begin(struct view *view, enum input_mode mode, uint32_t edges)
|
interactive_begin(struct view *view, enum input_mode mode, uint32_t edges)
|
||||||
{
|
{
|
||||||
if (view->maximized) {
|
if (mode == LAB_INPUT_STATE_MOVE && view->fullscreen) {
|
||||||
|
/**
|
||||||
|
* We don't allow moving fullscreen windows.
|
||||||
|
*
|
||||||
|
* If you think there is a good reason to allow it
|
||||||
|
* feel free to open an issue explaining your use-case.
|
||||||
|
*/
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (mode == LAB_INPUT_STATE_RESIZE
|
||||||
|
&& (view->fullscreen || view->maximized)) {
|
||||||
|
/* We don't allow resizing while in maximized or fullscreen state */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (view->maximized || view->tiled) {
|
||||||
if (mode == LAB_INPUT_STATE_MOVE) {
|
if (mode == LAB_INPUT_STATE_MOVE) {
|
||||||
|
/* Exit maximized or tiled mode */
|
||||||
int new_x = max_move_scale(view->server->seat.cursor->x,
|
int new_x = max_move_scale(view->server->seat.cursor->x,
|
||||||
view->x, view->w, view->natural_geometry.width);
|
view->x, view->w, view->natural_geometry.width);
|
||||||
int new_y = max_move_scale(view->server->seat.cursor->y,
|
int new_y = max_move_scale(view->server->seat.cursor->y,
|
||||||
view->y, view->h, view->natural_geometry.height);
|
view->y, view->h, view->natural_geometry.height);
|
||||||
view->natural_geometry.x = new_x;
|
view->natural_geometry.x = new_x;
|
||||||
view->natural_geometry.y = new_y;
|
view->natural_geometry.y = new_y;
|
||||||
view_maximize(view, false);
|
if (view->maximized) {
|
||||||
/*
|
view_maximize(view, false);
|
||||||
* view_maximize() indirectly calls view->impl->configure
|
}
|
||||||
* which is async but we are using the current values in
|
if (view->tiled) {
|
||||||
* server->grab_box. We pretend the configure already
|
view_move_resize(view, view->natural_geometry);
|
||||||
* happened by setting them manually.
|
}
|
||||||
|
/**
|
||||||
|
* view_maximize() / view_move_resize() indirectly calls
|
||||||
|
* view->impl->configure which is async but we are using
|
||||||
|
* the current values in server->grab_box. We pretend the
|
||||||
|
* configure already happened by setting them manually.
|
||||||
*/
|
*/
|
||||||
view->x = new_x;
|
view->x = new_x;
|
||||||
view->y = new_y;
|
view->y = new_y;
|
||||||
view->w = view->natural_geometry.width;
|
view->w = view->natural_geometry.width;
|
||||||
view->h = view->natural_geometry.height;
|
view->h = view->natural_geometry.height;
|
||||||
} else {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Moving or resizing always resets tiled state */
|
||||||
view->tiled = 0;
|
view->tiled = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
30
src/view.c
30
src/view.c
|
|
@ -215,6 +215,15 @@ view_wlr_output(struct view *view)
|
||||||
return wlr_output;
|
return wlr_output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
view_store_natural_geometry(struct view *view)
|
||||||
|
{
|
||||||
|
view->natural_geometry.x = view->x;
|
||||||
|
view->natural_geometry.y = view->y;
|
||||||
|
view->natural_geometry.width = view->w;
|
||||||
|
view->natural_geometry.height = view->h;
|
||||||
|
}
|
||||||
|
|
||||||
static struct output *
|
static struct output *
|
||||||
view_output(struct view *view)
|
view_output(struct view *view)
|
||||||
{
|
{
|
||||||
|
|
@ -398,11 +407,9 @@ view_maximize(struct view *view, bool maximize)
|
||||||
}
|
}
|
||||||
if (maximize) {
|
if (maximize) {
|
||||||
interactive_end(view);
|
interactive_end(view);
|
||||||
view->natural_geometry.x = view->x;
|
if (!view->tiled) {
|
||||||
view->natural_geometry.y = view->y;
|
view_store_natural_geometry(view);
|
||||||
view->natural_geometry.width = view->w;
|
}
|
||||||
view->natural_geometry.height = view->h;
|
|
||||||
|
|
||||||
view_apply_maximized_geometry(view);
|
view_apply_maximized_geometry(view);
|
||||||
view->maximized = true;
|
view->maximized = true;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -493,11 +500,8 @@ view_set_fullscreen(struct view *view, bool fullscreen,
|
||||||
wlr_output = view_wlr_output(view);
|
wlr_output = view_wlr_output(view);
|
||||||
}
|
}
|
||||||
if (fullscreen) {
|
if (fullscreen) {
|
||||||
if (!view->maximized) {
|
if (!view->maximized && !view->tiled) {
|
||||||
view->natural_geometry.x = view->x;
|
view_store_natural_geometry(view);
|
||||||
view->natural_geometry.y = view->y;
|
|
||||||
view->natural_geometry.width = view->w;
|
|
||||||
view->natural_geometry.height = view->h;
|
|
||||||
}
|
}
|
||||||
view->fullscreen = wlr_output;
|
view->fullscreen = wlr_output;
|
||||||
view_apply_fullscreen_geometry(view, view->fullscreen);
|
view_apply_fullscreen_geometry(view, view->fullscreen);
|
||||||
|
|
@ -710,10 +714,12 @@ view_snap_to_edge(struct view *view, const char *direction)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (view->maximized) {
|
if (view->maximized) {
|
||||||
|
/* Unmaximize + keep using existing natural_geometry */
|
||||||
view_maximize(view, false);
|
view_maximize(view, false);
|
||||||
|
} else if (!view->tiled) {
|
||||||
|
/* store current geometry as new natural_geometry */
|
||||||
|
view_store_natural_geometry(view);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: store old geometry if !maximized && !fullscreen && !tiled */
|
|
||||||
view->tiled = edge;
|
view->tiled = edge;
|
||||||
view_apply_tiled_geometry(view, output);
|
view_apply_tiled_geometry(view, output);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue