From 0a240572410ac7cfbe92233d50c671be77d83877 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Mon, 7 Mar 2011 00:06:27 +0100 Subject: [PATCH] When leaving fullscreen, set focus to con which was opened during fullscreen (+testcase) (Thanks dothebart) --- src/manage.c | 6 +++ testcases/t/56-fullscreen-focus.t | 65 +++++++++++++++++++++++++++++++ testcases/t/lib/i3test.pm | 7 +++- 3 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 testcases/t/56-fullscreen-focus.t diff --git a/src/manage.c b/src/manage.c index 789bd8a9..1465457e 100644 --- a/src/manage.c +++ b/src/manage.c @@ -244,6 +244,12 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki else DLOG("dock, not focusing\n"); } else { DLOG("fs = %p, ws = %p, not focusing\n", fs, ws); + /* Insert the new container in focus stack *after* the currently + * focused (fullscreen) con. This way, the new container will be + * focused after we return from fullscreen mode */ + Con *first = TAILQ_FIRST(&(nc->parent->focus_head)); + TAILQ_REMOVE(&(nc->parent->focus_head), nc, focused); + TAILQ_INSERT_AFTER(&(nc->parent->focus_head), first, nc, focused); } /* set floating if necessary */ diff --git a/testcases/t/56-fullscreen-focus.t b/testcases/t/56-fullscreen-focus.t new file mode 100644 index 00000000..7d8b16ca --- /dev/null +++ b/testcases/t/56-fullscreen-focus.t @@ -0,0 +1,65 @@ +#!perl +# vim:ts=4:sw=4:expandtab +# +# Test if new containers get focused when there is a fullscreen container at +# the time of launching the new one. +# +use X11::XCB qw(:all); +use Time::HiRes qw(sleep); +use i3test; + +BEGIN { + use_ok('X11::XCB::Window'); +} + +my $x = X11::XCB::Connection->new; +my $i3 = i3("/tmp/nestedcons"); + +my $tmp = get_unused_workspace; +cmd "workspace $tmp"; + +##################################################################### +# open the left window +##################################################################### + +my $left = open_standard_window($x, '#ff0000'); + +is($x->input_focus, $left->id, 'left window focused'); + +diag("left = " . $left->id); + +##################################################################### +# Open the right window +##################################################################### + +my $right = open_standard_window($x, '#00ff00'); + +diag("right = " . $right->id); + +##################################################################### +# Set the right window to fullscreen +##################################################################### +cmd 'nop setting fullscreen'; +cmd 'fullscreen'; + +##################################################################### +# Open a third window +##################################################################### + +my $third = open_standard_window($x, '#0000ff'); + +diag("third = " . $third->id); + +# move the fullscreen window to a different ws + +my $tmp2 = get_unused_workspace; + +cmd "move workspace $tmp2"; + +# verify that the third window has the focus + +sleep 0.25; + +is($x->input_focus, $third->id, 'third window focused'); + +done_testing; diff --git a/testcases/t/lib/i3test.pm b/testcases/t/lib/i3test.pm index b9d168d6..87a34981 100644 --- a/testcases/t/lib/i3test.pm +++ b/testcases/t/lib/i3test.pm @@ -9,6 +9,7 @@ use X11::XCB qw(:all); use AnyEvent::I3; use List::Util qw(first); use List::MoreUtils qw(lastval); +use Time::HiRes qw(sleep); use v5.10; use Exporter (); @@ -41,12 +42,14 @@ use warnings; } sub open_standard_window { - my ($x) = @_; + my ($x, $color) = @_; + + $color ||= '#c0c0c0'; my $window = $x->root->create_child( class => WINDOW_CLASS_INPUT_OUTPUT, rect => [ 0, 0, 30, 30 ], - background_color => '#C0C0C0', + background_color => $color, ); $window->name('Window ' . counter_window()); -- 2.39.5