# vim:ts=4:sw=4:expandtab
#
# Please read the following documents before working on tests:
-# • http://build.i3wm.org/docs/testsuite.html
+# • https://build.i3wm.org/docs/testsuite.html
# (or docs/testsuite)
#
-# • http://build.i3wm.org/docs/lib-i3test.html
+# • https://build.i3wm.org/docs/lib-i3test.html
# (alternatively: perldoc ./testcases/lib/i3test.pm)
#
-# • http://build.i3wm.org/docs/ipc.html
+# • https://build.i3wm.org/docs/ipc.html
# (or docs/ipc)
#
# • http://onyxneon.com/books/modern_perl/modern_perl_a4.pdf
use POSIX qw(mkfifo);
use File::Temp qw(:POSIX);
+SKIP: {
+
+ skip "X11::XCB too old (need >= 0.07)", 24 if $X11::XCB::VERSION < 0.07;
+
use ExtUtils::PkgConfig;
# setup dependency on libstartup-notification using pkg-config
static SnLauncheeContext *ctx;
static xcb_connection_t *conn;
-// TODO: this should use $x
-void init_ctx() {
- int screen;
- if ((conn = xcb_connect(NULL, &screen)) == NULL ||
- xcb_connection_has_error(conn))
- errx(1, "x11 conn failed");
-
- printf("screen = %d\n", screen);
+void init_ctx(void *connptr) {
+ conn = (xcb_connection_t*)connptr;
sndisplay = sn_xcb_display_new(conn, NULL, NULL);
- ctx = sn_launchee_context_new_from_environment(sndisplay, screen);
+ ctx = sn_launchee_context_new_from_environment(sndisplay, 0);
}
const char *get_startup_id() {
# echo its $DESKTOP_STARTUP_ID. We (blockingly) read the variable into
# $startup_id in the testcase.
my $tmp = tmpnam();
-mkfifo($tmp, 0600) or die "Could not create FIFO in $tmp";
+mkfifo($tmp, 0600) or BAIL_OUT "Could not create FIFO in $tmp: $!";
cmd qq|exec echo \$DESKTOP_STARTUP_ID >$tmp|;
$ENV{DESKTOP_STARTUP_ID} = $startup_id;
# Create a new libstartup-notification launchee context
-init_ctx();
+init_ctx($x->get_xcb_conn());
# Make sure the context was set up successfully
is(get_startup_id(), $startup_id, 'libstartup-notification returns the same id');
is_num_children($first_ws, 2, 'two containers on the first workspace');
######################################################################
-# 2) open another window after the startup process is completed
-# (should be placed on the current workspace)
+# verifies that finishing startup doesn't immediately stop windows
+# from being placed on the sequence's workspace, but that moving
+# the leader actually deletes the startup sequence mapping
######################################################################
complete_startup();
sync_with_i3;
-my $otherwin = open_window;
+# even when renaming the workspace, windows should end up on the correct one
+cmd "rename workspace $first_ws to temp";
+
+# Startup has completed but the 30-second deletion time hasn't elapsed,
+# so this window should still go on the leader's initial workspace.
+$win = open_window({ dont_map => 1, client_leader => $leader });
+$win->map;
+sync_with_i3;
+
+cmd "rename workspace temp to $first_ws";
+
+is_num_children($first_ws, 3, 'three containers on the first workspace');
+
+# empty 'from' workspaces should not crash the renaming of startup sequences
+cmd "workspace $first_ws";
+cmd "rename workspace to temp";
+cmd "rename workspace to $first_ws";
+
+# Switch to the first workspace and move the focused window to the
+# second workspace.
+cmd "workspace $first_ws";
+cmd "move workspace $second_ws";
+
is_num_children($second_ws, 1, 'one container on the second workspace');
+# Create and switch to a new workspace, just to be safe.
+my $third_ws = fresh_workspace;
+
+# Moving the window between workspaces should have immediately
+# removed the startup workspace mapping. New windows with that
+# leader should be created on the current workspace.
+$win = open_window({ dont_map => 1, client_leader => $leader });
+$win->map;
+sync_with_i3;
+
+is_num_children($third_ws, 1, 'one container on the third workspace');
+
+######################################################################
+# 2) open another window after the startup process is completed
+# (should be placed on the current workspace)
+######################################################################
+
+my $otherwin = open_window;
+is_num_children($third_ws, 2, 'two containers on the third workspace');
+
######################################################################
# 3) test that the --no-startup-id flag for exec leads to no DESKTOP_STARTUP_ID
# environment variable.
######################################################################
-mkfifo($tmp, 0600) or die "Could not create FIFO in $tmp";
+mkfifo($tmp, 0600) or BAIL_OUT "Could not create FIFO in $tmp: $!";
cmd qq|exec --no-startup-id echo \$DESKTOP_STARTUP_ID >$tmp|;
# 4) same thing, but with double quotes in exec
######################################################################
-mkfifo($tmp, 0600) or die "Could not create FIFO in $tmp";
+mkfifo($tmp, 0600) or BAIL_OUT "Could not create FIFO in $tmp: $!";
cmd qq|exec --no-startup-id "echo \$DESKTOP_STARTUP_ID >$tmp"|;
unlink($tmp);
is($startup_id, '', 'startup_id empty');
+}
done_testing;