Always auto center on 'scratchpad show' if window hasn't been repositioned by the user
This change ensures a scratchpad window is still centered on the screen if it has first been shown on another screen of a different resolution. Moving or resizing the scratchpad manually disables this behavior.
This commit is contained in:
parent
7f0065e1b1
commit
49979c9d15
|
@ -569,6 +569,8 @@ struct Con {
|
||||||
/** callbacks */
|
/** callbacks */
|
||||||
void(*on_remove_child)(Con *);
|
void(*on_remove_child)(Con *);
|
||||||
|
|
||||||
|
/** not a scratchpad window, auto centered scratchpad window, or
|
||||||
|
* user positioned scratchpad window. */
|
||||||
enum {
|
enum {
|
||||||
SCRATCHPAD_NONE = 0,
|
SCRATCHPAD_NONE = 0,
|
||||||
SCRATCHPAD_FRESH = 1,
|
SCRATCHPAD_FRESH = 1,
|
||||||
|
|
|
@ -592,6 +592,10 @@ static void cmd_resize_floating(I3_CMD, char *way, char *direction, Con *floatin
|
||||||
} else if (strcmp(direction, "left") == 0) {
|
} else if (strcmp(direction, "left") == 0) {
|
||||||
floating_con->rect.x -= (floating_con->rect.width - old_rect.width);
|
floating_con->rect.x -= (floating_con->rect.width - old_rect.width);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If this is a scratchpad window, don't auto center it from now on. */
|
||||||
|
if (floating_con->scratchpad_state == SCRATCHPAD_FRESH)
|
||||||
|
floating_con->scratchpad_state = SCRATCHPAD_CHANGED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool cmd_resize_tiling_direction(I3_CMD, Con *current, char *way, char *direction, int ppt) {
|
static bool cmd_resize_tiling_direction(I3_CMD, Con *current, char *way, char *direction, int ppt) {
|
||||||
|
|
|
@ -438,6 +438,11 @@ void floating_drag_window(Con *con, const xcb_button_press_event_t *event) {
|
||||||
|
|
||||||
/* Drag the window */
|
/* Drag the window */
|
||||||
drag_pointer(con, event, XCB_NONE, BORDER_TOP /* irrelevant */, XCURSOR_CURSOR_MOVE, drag_window_callback, event);
|
drag_pointer(con, event, XCB_NONE, BORDER_TOP /* irrelevant */, XCURSOR_CURSOR_MOVE, drag_window_callback, event);
|
||||||
|
|
||||||
|
/* If this is a scratchpad window, don't auto center it from now on. */
|
||||||
|
if (con->scratchpad_state == SCRATCHPAD_FRESH)
|
||||||
|
con->scratchpad_state = SCRATCHPAD_CHANGED;
|
||||||
|
|
||||||
tree_render();
|
tree_render();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -537,6 +542,10 @@ void floating_resize_window(Con *con, const bool proportional,
|
||||||
struct resize_window_callback_params params = { corner, proportional, event };
|
struct resize_window_callback_params params = { corner, proportional, event };
|
||||||
|
|
||||||
drag_pointer(con, event, XCB_NONE, BORDER_TOP /* irrelevant */, cursor, resize_window_callback, ¶ms);
|
drag_pointer(con, event, XCB_NONE, BORDER_TOP /* irrelevant */, cursor, resize_window_callback, ¶ms);
|
||||||
|
|
||||||
|
/* If this is a scratchpad window, don't auto center it from now on. */
|
||||||
|
if (con->scratchpad_state == SCRATCHPAD_FRESH)
|
||||||
|
con->scratchpad_state = SCRATCHPAD_CHANGED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -660,6 +669,11 @@ void floating_reposition(Con *con, Rect newrect) {
|
||||||
con->rect = newrect;
|
con->rect = newrect;
|
||||||
|
|
||||||
floating_maybe_reassign_ws(con);
|
floating_maybe_reassign_ws(con);
|
||||||
|
|
||||||
|
/* If this is a scratchpad window, don't auto center it from now on. */
|
||||||
|
if (con->scratchpad_state == SCRATCHPAD_FRESH)
|
||||||
|
con->scratchpad_state = SCRATCHPAD_CHANGED;
|
||||||
|
|
||||||
tree_render();
|
tree_render();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -178,7 +178,6 @@ void scratchpad_show(Con *con) {
|
||||||
((output->rect.width / 2.0) - (con->rect.width / 2.0));
|
((output->rect.width / 2.0) - (con->rect.width / 2.0));
|
||||||
con->rect.y = output->rect.y +
|
con->rect.y = output->rect.y +
|
||||||
((output->rect.height / 2.0) - (con->rect.height / 2.0));
|
((output->rect.height / 2.0) - (con->rect.height / 2.0));
|
||||||
con->scratchpad_state = SCRATCHPAD_CHANGED;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Activate active workspace if window is from another workspace to ensure
|
/* Activate active workspace if window is from another workspace to ensure
|
||||||
|
|
|
@ -93,8 +93,7 @@ is(scalar @{$__i3_scratch->{floating_nodes}}, 0, '__i3_scratch ws empty');
|
||||||
################################################################################
|
################################################################################
|
||||||
# 3: Verify that 'scratchpad toggle' sends a window to the __i3_scratch
|
# 3: Verify that 'scratchpad toggle' sends a window to the __i3_scratch
|
||||||
# workspace and sets the scratchpad flag to SCRATCHPAD_FRESH. The window’s size
|
# workspace and sets the scratchpad flag to SCRATCHPAD_FRESH. The window’s size
|
||||||
# and position will be changed (once!) on the next 'scratchpad show' and the
|
# and position will be changed on the next 'scratchpad show'.
|
||||||
# flag will be changed to SCRATCHPAD_CHANGED.
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
my ($nodes, $focus) = get_ws_content($tmp);
|
my ($nodes, $focus) = get_ws_content($tmp);
|
||||||
|
@ -165,10 +164,33 @@ $__i3_scratch = get_ws('__i3_scratch');
|
||||||
@scratch_nodes = @{$__i3_scratch->{floating_nodes}};
|
@scratch_nodes = @{$__i3_scratch->{floating_nodes}};
|
||||||
is(scalar @scratch_nodes, 1, '__i3_scratch contains our window');
|
is(scalar @scratch_nodes, 1, '__i3_scratch contains our window');
|
||||||
|
|
||||||
is($scratch_nodes[0]->{scratchpad_state}, 'changed', 'scratchpad_state changed');
|
################################################################################
|
||||||
|
# 6: Resizing the window should disable auto centering on scratchpad show
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
cmd 'scratchpad show';
|
||||||
|
|
||||||
|
$ws = get_ws($tmp);
|
||||||
|
is($ws->{floating_nodes}->[0]->{scratchpad_state}, 'fresh',
|
||||||
|
'scratchpad_state fresh');
|
||||||
|
|
||||||
|
cmd 'resize grow width 10 px';
|
||||||
|
cmd 'scratchpad show';
|
||||||
|
cmd 'scratchpad show';
|
||||||
|
|
||||||
|
$ws = get_ws($tmp);
|
||||||
|
$scratchrect = $ws->{floating_nodes}->[0]->{rect};
|
||||||
|
$outputrect = $output->{rect};
|
||||||
|
|
||||||
|
is($ws->{floating_nodes}->[0]->{scratchpad_state}, 'changed',
|
||||||
|
'scratchpad_state changed');
|
||||||
|
is($scratchrect->{width}, $outputrect->{width} * 0.5 + 10, 'scratch width is 50% + 10px');
|
||||||
|
|
||||||
|
cmd 'resize shrink width 10 px';
|
||||||
|
cmd 'scratchpad show';
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# 6: Verify that repeated 'scratchpad show' cycle through the stack, that is,
|
# 7: Verify that repeated 'scratchpad show' cycle through the stack, that is,
|
||||||
# toggling a visible window should insert it at the bottom of the stack of the
|
# toggling a visible window should insert it at the bottom of the stack of the
|
||||||
# __i3_scratch workspace.
|
# __i3_scratch workspace.
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
Loading…
Reference in New Issue