summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoracheronfail <acheronfail@gmail.com>2020-09-01 22:29:45 +1000
committeracheronfail <acheronfail@gmail.com>2020-10-20 17:48:26 +1100
commitfae10f6df75b65d92b127e8890b5d0bfa77211ae (patch)
treee17a281e06bb45cd7e52888bf04d5f33e677ac7c
parentffad26beb0776a3b9c06cd2e1e93ecd15d3345fd (diff)
downloadi3-fae10f6df75b65d92b127e8890b5d0bfa77211ae.tar.gz
i3-fae10f6df75b65d92b127e8890b5d0bfa77211ae.zip
allow ppt values in move direction and move position commands
make ppt values clear in userguide chore: move is_ppt and DLOG out of TAILQ_FOREACH loop
-rw-r--r--RELEASE-NOTES-next1
-rw-r--r--docs/userguide17
-rw-r--r--include/commands.h8
-rw-r--r--parser-specs/commands.spec29
-rw-r--r--src/commands.c30
-rw-r--r--testcases/t/124-move.t34
6 files changed, 79 insertions, 40 deletions
diff --git a/RELEASE-NOTES-next b/RELEASE-NOTES-next
index 39b8d836..406fbe2a 100644
--- a/RELEASE-NOTES-next
+++ b/RELEASE-NOTES-next
@@ -27,6 +27,7 @@ working. Please reach out to us in that case!
• update i3bar config when necessary (reduces redraws on bar mode changes)
• mention rofi in default config file
• i3-input: add different exit codes for when i3-input fails
+ • allow ppt values in move direction and move position commands
┌────────────────────────────┐
│ Bugfixes │
diff --git a/docs/userguide b/docs/userguide
index 642843e2..5f98206e 100644
--- a/docs/userguide
+++ b/docs/userguide
@@ -245,7 +245,7 @@ you open a new terminal, it will open below the current one.
So, how can you open a new terminal window to the *right* of the current one?
The solution is to use +focus parent+, which will focus the +Parent Container+ of
-the current +Container+. In default configuration, use +$mod+a+ to navigate one
+the current +Container+. In default configuration, use +$mod+a+ to navigate one
+Container+ up the tree (you can repeat this multiple times until you get to the
+Workspace Container+). In this case, you would focus the +Vertical Split Container+
which is *inside* the horizontally oriented workspace. Thus, now new windows will be
@@ -1415,7 +1415,7 @@ button6::
Scroll wheel right.
button7::
Scroll wheel left.
-
+
Please note that the old +wheel_up_cmd+ and +wheel_down_cmd+ commands are deprecated
and will be removed in a future release. We strongly recommend using the more general
@@ -1682,8 +1682,8 @@ When +strip_workspace_name+ is set to +yes+, any workspace that has a name of
the form "[n][:][NAME]" will display only the number.
The default is to display the full name within the workspace button. Be aware
-that the colon in the workspace name is optional, so `[n][NAME]` will also
-have the workspace name and number stripped correctly.
+that the colon in the workspace name is optional, so `[n][NAME]` will also
+have the workspace name and number stripped correctly.
*Syntax*:
------------------------------
@@ -2140,12 +2140,15 @@ Use the +move+ command to move a container.
# Moves the container into the given direction.
# The optional pixel argument specifies how far the
# container should be moved if it is floating and
-# defaults to 10 pixels.
-move <left|right|down|up> [<px> px]
+# defaults to 10 pixels. The optional ppt argument
+# means "percentage points", and if specified it indicates
+# how many points the container should be moved if it is
+# floating rather than by a pixel value.
+move <left|right|down|up> [<amount> [px|ppt]]
# Moves the container to the specified pos_x and pos_y
# coordinates on the screen.
-move position <pos_x> [px] <pos_y> [px]
+move position <pos_x> [px|ppt] <pos_y> [px|ppt]
# Moves the container to the center of the screen.
# If 'absolute' is used, it is moved to the center of
diff --git a/include/commands.h b/include/commands.h
index 9a2a20b2..7a1877a1 100644
--- a/include/commands.h
+++ b/include/commands.h
@@ -219,10 +219,10 @@ void cmd_fullscreen(I3_CMD, const char *action, const char *fullscreen_mode);
void cmd_sticky(I3_CMD, const char *action);
/**
- * Implementation of 'move <direction> [<pixels> [px]]'.
+ * Implementation of 'move <direction> [<amount> [px|ppt]]'.
*
*/
-void cmd_move_direction(I3_CMD, const char *direction_str, long move_px);
+void cmd_move_direction(I3_CMD, const char *direction_str, long amount, const char *mode);
/**
* Implementation of 'layout default|stacked|stacking|tabbed|splitv|splith'.
@@ -267,10 +267,10 @@ void cmd_open(I3_CMD);
void cmd_focus_output(I3_CMD, const char *name);
/**
- * Implementation of 'move [window|container] [to] [absolute] position <px> [px] <px> [px]
+ * Implementation of 'move [window|container] [to] [absolute] position [<pos_x> [px|ppt] <pos_y> [px|ppt]]
*
*/
-void cmd_move_window_to_position(I3_CMD, long x, long y);
+void cmd_move_window_to_position(I3_CMD, long x, const char *mode_x, long y, const char *mode_y);
/**
* Implementation of 'move [window|container] [to] [absolute] position center
diff --git a/parser-specs/commands.spec b/parser-specs/commands.spec
index 11177b88..4db81680 100644
--- a/parser-specs/commands.spec
+++ b/parser-specs/commands.spec
@@ -131,7 +131,7 @@ state WORKSPACE:
-> call cmd_workspace_back_and_forth()
'number'
-> WORKSPACE_NUMBER
- workspace = string
+ workspace = string
-> call cmd_workspace_name($workspace, $no_auto_back_and_forth)
state WORKSPACE_NUMBER:
@@ -321,14 +321,15 @@ state RENAME_WORKSPACE_TO_NEW_NAME:
new_name = string
-> call cmd_rename_workspace($old_name, $new_name)
-# move <direction> [<pixels> [px]]
+
+# move <direction> [<amount> [px|ppt]]
# move [window|container] [to] workspace [<str>|next|prev|next_on_output|prev_on_output|current]
# move [window|container] [to] output <str>
# move [window|container] [to] mark <str>
# move [window|container] [to] scratchpad
# move workspace to [output] <str>
# move scratchpad
-# move [window|container] [to] [absolute] position [ [<pixels> [px] <pixels> [px]] | center ]
+# move [window|container] [to] [absolute] position [ [<pos_x> [px|ppt] <pos_y> [px|ppt] ] | center ]
# move [window|container] [to] position mouse|cursor|pointer
state MOVE:
'window'
@@ -355,16 +356,16 @@ state MOVE:
-> MOVE_TO_ABSOLUTE_POSITION
state MOVE_DIRECTION:
- pixels = number
- -> MOVE_DIRECTION_PX
+ amount = number
+ -> MOVE_DIRECTION_NUMBER
end
- -> call cmd_move_direction($direction, 10)
+ -> call cmd_move_direction($direction, 10, "px")
-state MOVE_DIRECTION_PX:
- 'px'
- -> call cmd_move_direction($direction, &pixels)
+state MOVE_DIRECTION_NUMBER:
+ mode = 'px', 'ppt'
+ -> call cmd_move_direction($direction, &amount, $mode)
end
- -> call cmd_move_direction($direction, &pixels)
+ -> call cmd_move_direction($direction, &amount, "px")
state MOVE_WORKSPACE:
'to '
@@ -409,14 +410,16 @@ state MOVE_TO_POSITION:
-> MOVE_TO_POSITION_X
state MOVE_TO_POSITION_X:
- 'px'
+ mode_x = 'px', 'ppt'
->
coord_y = number
-> MOVE_TO_POSITION_Y
state MOVE_TO_POSITION_Y:
- 'px', end
- -> call cmd_move_window_to_position(&coord_x, &coord_y)
+ mode_y = 'px', 'ppt'
+ -> call cmd_move_window_to_position(&coord_x, $mode_x, &coord_y, $mode_y)
+ end
+ -> call cmd_move_window_to_position(&coord_x, $mode_x, &coord_y, 0)
# mode <string>
state MODE:
diff --git a/src/commands.c b/src/commands.c
index 4687c16d..8e8aece9 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -1490,34 +1490,37 @@ void cmd_sticky(I3_CMD, const char *action) {
}
/*
- * Implementation of 'move <direction> [<pixels> [px]]'.
+ * Implementation of 'move <direction> [<amount> [px|ppt]]'.
*
*/
-void cmd_move_direction(I3_CMD, const char *direction_str, long move_px) {
+void cmd_move_direction(I3_CMD, const char *direction_str, long amount, const char *mode) {
owindow *current;
HANDLE_EMPTY_MATCH;
Con *initially_focused = focused;
direction_t direction = parse_direction(direction_str);
+ const bool is_ppt = mode && strcmp(mode, "ppt") == 0;
+
+ DLOG("moving in direction %s, %ld %s\n", direction_str, amount, mode);
TAILQ_FOREACH (current, &owindows, owindows) {
- DLOG("moving in direction %s, px %ld\n", direction_str, move_px);
if (con_is_floating(current->con)) {
- DLOG("floating move with %ld pixels\n", move_px);
+ DLOG("floating move with %ld %s\n", amount, mode);
Rect newrect = current->con->parent->rect;
+ Con *output = con_get_output(current->con);
switch (direction) {
case D_LEFT:
- newrect.x -= move_px;
+ newrect.x -= is_ppt ? output->rect.width * ((double)amount / 100.0) : amount;
break;
case D_RIGHT:
- newrect.x += move_px;
+ newrect.x += is_ppt ? output->rect.width * ((double)amount / 100.0) : amount;
break;
case D_UP:
- newrect.y -= move_px;
+ newrect.y -= is_ppt ? output->rect.height * ((double)amount / 100.0) : amount;
break;
case D_DOWN:
- newrect.y += move_px;
+ newrect.y += is_ppt ? output->rect.height * ((double)amount / 100.0) : amount;
break;
}
@@ -1721,10 +1724,10 @@ void cmd_focus_output(I3_CMD, const char *name) {
}
/*
- * Implementation of 'move [window|container] [to] [absolute] position <px> [px] <px> [px]
+ * Implementation of 'move [window|container] [to] [absolute] position [<pos_x> [px|ppt] <pos_y> [px|ppt]]
*
*/
-void cmd_move_window_to_position(I3_CMD, long x, long y) {
+void cmd_move_window_to_position(I3_CMD, long x, const char *mode_x, long y, const char *mode_y) {
bool has_error = false;
owindow *current;
@@ -1743,10 +1746,11 @@ void cmd_move_window_to_position(I3_CMD, long x, long y) {
}
Rect newrect = current->con->parent->rect;
+ Con *output = con_get_output(current->con);
- DLOG("moving to position %ld %ld\n", x, y);
- newrect.x = x;
- newrect.y = y;
+ newrect.x = mode_x && strcmp(mode_x, "ppt") == 0 ? output->rect.width * ((double)x / 100.0) : x;
+ newrect.y = mode_y && strcmp(mode_y, "ppt") == 0 ? output->rect.height * ((double)y / 100.0) : y;
+ DLOG("moving to position %d %s %d %s\n", newrect.x, mode_x, newrect.y, mode_y);
if (!floating_reposition(current->con->parent, newrect)) {
yerror("Cannot move window/container out of bounds.");
diff --git a/testcases/t/124-move.t b/testcases/t/124-move.t
index b7ef0b2c..b4a8ca3e 100644
--- a/testcases/t/124-move.t
+++ b/testcases/t/124-move.t
@@ -220,21 +220,49 @@ is($absolute->y, $absolute_before->y, 'y not changed');
is($absolute->width, $absolute_before->width, 'width not changed');
is($absolute->height, $absolute_before->height, 'height not changed');
+$absolute_before = $absolute;
+$top_before = $top;
+
######################################################################
-# 6) test moving floating window to a specified position
+# 7) test moving floating containers with a specific amount of ppt
+######################################################################
+
+cmd 'move right 25 ppt';
+
+sync_with_i3;
+
+($absolute, $top) = $floatwin->rect;
+
+is($absolute->x, int($x->root->rect->width * 0.25) + $absolute_before->x, 'moved 25 ppt to the right');
+is($absolute->y, $absolute_before->y, 'y not changed');
+is($absolute->width, $absolute_before->width, 'width not changed');
+is($absolute->height, $absolute_before->height, 'height not changed');
+
+######################################################################
+# 8) test moving floating window to a specified position
# and to absolute center
######################################################################
$tmp = fresh_workspace;
open_floating_window; my @floatcon;
+# Move to specified position with px
cmd 'move position 5 px 15 px';
@floatcon = @{get_ws($tmp)->{floating_nodes}};
-is($floatcon[0]->{rect}->{x}, 5, 'moved to position 5 x');
-is($floatcon[0]->{rect}->{y}, 15, 'moved to position 15 y');
+is($floatcon[0]->{rect}->{x}, 5, 'moved to position 5 (px) x');
+is($floatcon[0]->{rect}->{y}, 15, 'moved to position 15 (px) y');
+
+# Move to specified position with ppt
+cmd 'move position 20 ppt 20 ppt';
+
+@floatcon = @{get_ws($tmp)->{floating_nodes}};
+
+is($floatcon[0]->{rect}->{x}, int($x->root->rect->width * 0.20), "moved to position 20 (ppt) x");
+is($floatcon[0]->{rect}->{y}, int($x->root->rect->height * 0.20), "moved to position 20 (ppt) y");
+# Move to absolute center
cmd 'move absolute position center';
@floatcon = @{get_ws($tmp)->{floating_nodes}};