aboutsummaryrefslogtreecommitdiff
path: root/testcases/t/245-move-position-mouse.t
blob: 01e2c30e121fe88404c941bc7aa38ff461d34201 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#!perl
# vim:ts=4:sw=4:expandtab
#
# Please read the following documents before working on tests:
# • https://build.i3wm.org/docs/testsuite.html
#   (or docs/testsuite)
#
# • https://build.i3wm.org/docs/lib-i3test.html
#   (alternatively: perldoc ./testcases/lib/i3test.pm)
#
# • https://build.i3wm.org/docs/ipc.html
#   (or docs/ipc)
#
# • http://onyxneon.com/books/modern_perl/modern_perl_a4.pdf
#   (unless you are already familiar with Perl)
#
# Tests the 'move [window|container] [to] position mouse|cursor|pointer command.
# Ticket: #1696
use i3test i3_autostart => 0;
use POSIX qw(floor);

sub warp_pointer {
    my ($pos_x, $pos_y) = @_;
    $x->root->warp_pointer($pos_x, $pos_y);
    sync_with_i3;
}

my ($pid, $config, $ws, $rect, @cons);
my $root_rect = $x->root->rect;

##########################################################################

##########################################################################
# Given a floating container and the cursor far from any edges, when
# moving the container to the mouse, then the container is moved such
# that the cursor is centered inside it.
##########################################################################

$config = <<EOT;
# i3 config file (v4)
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
EOT
$pid = launch_with_config($config);

$ws = fresh_workspace;
open_floating_window;
warp_pointer(100, 100);

cmd 'move position mouse';

@cons = @{get_ws($ws)->{floating_nodes}};
$rect = $cons[0]->{rect};

is(floor($rect->{x} + $rect->{width} / 2), 100, "con is centered around cursor horizontally");
is(floor($rect->{y} + $rect->{height} / 2), 100, "con is centered around cursor vertically");

exit_gracefully($pid);

##########################################################################
# Given a floating container and the cursor is in the left upper edge
# of the output, when moving the container to the mouse, then the
# container is moved but adjusted to stay in-bounds.
##########################################################################

$config = <<EOT;
# i3 config file (v4)
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
EOT
$pid = launch_with_config($config);

$ws = fresh_workspace;
open_floating_window;
warp_pointer(5, 5);

cmd 'move position mouse';

@cons = @{get_ws($ws)->{floating_nodes}};
$rect = $cons[0]->{rect};

is($rect->{x}, 0, "con is on the left edge");
is($rect->{y}, 0, "con is on the upper edge");

exit_gracefully($pid);

##########################################################################
# Given a floating container and the cursor is in the left right lower
# edge of the output, when moving the container to the mouse, then the
# container is moved but adjusted to stay in-bounds.
##########################################################################

$config = <<EOT;
# i3 config file (v4)
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
EOT
$pid = launch_with_config($config);

$ws = fresh_workspace;
open_floating_window;
warp_pointer($root_rect->width - 5, $root_rect->height - 5);

cmd 'move position mouse';

@cons = @{get_ws($ws)->{floating_nodes}};
$rect = $cons[0]->{rect};

is($rect->{x} + $rect->{width}, $root_rect->width, "con is on the right edge");
is($rect->{y} + $rect->{height}, $root_rect->height, "con is on the lower edge");

exit_gracefully($pid);

##########################################################################
# Given a floating container and the cursor being close to the corner of
# an output, when the container is moved to the mouse, then the container
# is moved but adjusted to the output boundaries.
# This test verifies that boundaries of individual outputs are respected
# and not just boundaries of the entire X root screen.
##########################################################################

$config = <<EOT;
# i3 config file (v4)
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
fake-outputs 500x500+0+0,500x500+500+0,500x500+0+500,500x500+500+500
EOT
$pid = launch_with_config($config);

$ws = fresh_workspace;
open_floating_window;
warp_pointer(495, 495);

cmd 'move position mouse';

@cons = @{get_ws($ws)->{floating_nodes}};
$rect = $cons[0]->{rect};

is($rect->{x} + $rect->{width}, 500, "con is on the right edge");
is($rect->{y} + $rect->{height}, 500, "con is on the lower edge");

exit_gracefully($pid);

##########################################################################

done_testing;