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:
Sebastian Ullrich 2012-09-24 21:14:40 +02:00 committed by Michael Stapelberg
parent 7f0065e1b1
commit 49979c9d15
5 changed files with 46 additions and 5 deletions

View File

@ -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,

View File

@ -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) {

View File

@ -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, &params); drag_pointer(con, event, XCB_NONE, BORDER_TOP /* irrelevant */, cursor, resize_window_callback, &params);
/* 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();
} }

View File

@ -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

View File

@ -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 windows size # workspace and sets the scratchpad flag to SCRATCHPAD_FRESH. The windows 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.
################################################################################ ################################################################################