Merge branch 'workspace_baf' into next
This commit is contained in:
commit
744def377a
|
@ -737,6 +737,25 @@ force_xinerama yes
|
||||||
Also note that your output names are not descriptive (like +HDMI1+) when using
|
Also note that your output names are not descriptive (like +HDMI1+) when using
|
||||||
Xinerama, instead they are counted up, starting at 0: +xinerama-0+, +xinerama-1+, …
|
Xinerama, instead they are counted up, starting at 0: +xinerama-0+, +xinerama-1+, …
|
||||||
|
|
||||||
|
=== Automatic back-and-forth when switching to the current workspace
|
||||||
|
|
||||||
|
This configuration directive enables automatic +workspace back_and_forth+ (see
|
||||||
|
<<back_and_forth>>) when switching to the workspace that is currently focused.
|
||||||
|
|
||||||
|
For instance: Assume you are on workspace "1: www" and switch to "2: IM" using
|
||||||
|
mod+2 because somebody sent you a message. You don’t need to remember where you
|
||||||
|
came from now, you can just press mod+2 again to switch back to "1: www".
|
||||||
|
|
||||||
|
*Syntax*:
|
||||||
|
--------------------------------------
|
||||||
|
workspace_auto_back_and_forth <yes|no>
|
||||||
|
--------------------------------------
|
||||||
|
|
||||||
|
*Example*:
|
||||||
|
---------------------------------
|
||||||
|
workspace_auto_back_and_forth yes
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
== List of commands
|
== List of commands
|
||||||
|
|
||||||
Commands are what you bind to specific keypresses. You can also issue commands
|
Commands are what you bind to specific keypresses. You can also issue commands
|
||||||
|
@ -892,6 +911,10 @@ workspace 1, 3, 4 and 9 and you want to cycle through them with a single key
|
||||||
combination. Similarily, you can use +move workspace next+ and +move workspace
|
combination. Similarily, you can use +move workspace next+ and +move workspace
|
||||||
prev+ to move a container to the next/previous workspace.
|
prev+ to move a container to the next/previous workspace.
|
||||||
|
|
||||||
|
[[back_and_forth]]
|
||||||
|
To switch back to the previously focused workspace, use +workspace
|
||||||
|
back_and_forth+.
|
||||||
|
|
||||||
To move a container to another xrandr output such as +LVDS1+ or +VGA1+, you can
|
To move a container to another xrandr output such as +LVDS1+ or +VGA1+, you can
|
||||||
use the +move output+ command followed by the name of the target output. You
|
use the +move output+ command followed by the name of the target output. You
|
||||||
may also use +left+, +right+, +up+, +down+ instead of the xrandr output name to
|
may also use +left+, +right+, +up+, +down+ instead of the xrandr output name to
|
||||||
|
@ -906,6 +929,9 @@ bindsym mod+2 workspace 2
|
||||||
bindsym mod+Shift+1 move workspace 1
|
bindsym mod+Shift+1 move workspace 1
|
||||||
bindsym mod+Shift+2 move workspace 2
|
bindsym mod+Shift+2 move workspace 2
|
||||||
...
|
...
|
||||||
|
|
||||||
|
# switch between the current and the previously focused one
|
||||||
|
bindsym mod+b workspace back_and_forth
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
==== Named workspaces
|
==== Named workspaces
|
||||||
|
|
|
@ -133,6 +133,12 @@ struct Config {
|
||||||
* is fetched once and never updated. */
|
* is fetched once and never updated. */
|
||||||
bool force_xinerama;
|
bool force_xinerama;
|
||||||
|
|
||||||
|
/** Automatic workspace back and forth switching. If this is set, a
|
||||||
|
* switch to the currently active workspace will switch to the
|
||||||
|
* previously focused one instead, making it possible to fast toggle
|
||||||
|
* between two workspaces. */
|
||||||
|
bool workspace_auto_back_and_forth;
|
||||||
|
|
||||||
/** The default border style for new windows. */
|
/** The default border style for new windows. */
|
||||||
border_style_t default_border;
|
border_style_t default_border;
|
||||||
|
|
||||||
|
|
|
@ -70,6 +70,13 @@ Con* workspace_next();
|
||||||
*/
|
*/
|
||||||
Con* workspace_prev();
|
Con* workspace_prev();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Focuses the previously focused workspace.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void workspace_back_and_forth();
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/**
|
/**
|
||||||
* Assigns the given workspace to the given screen by correctly updating its
|
* Assigns the given workspace to the given screen by correctly updating its
|
||||||
|
|
|
@ -127,6 +127,7 @@ none { return TOK_NONE; }
|
||||||
focus_follows_mouse { return TOKFOCUSFOLLOWSMOUSE; }
|
focus_follows_mouse { return TOKFOCUSFOLLOWSMOUSE; }
|
||||||
force_focus_wrapping { return TOK_FORCE_FOCUS_WRAPPING; }
|
force_focus_wrapping { return TOK_FORCE_FOCUS_WRAPPING; }
|
||||||
force_xinerama { return TOK_FORCE_XINERAMA; }
|
force_xinerama { return TOK_FORCE_XINERAMA; }
|
||||||
|
workspace_auto_back_and_forth { return TOK_WORKSPACE_AUTO_BAF; }
|
||||||
workspace_bar { return TOKWORKSPACEBAR; }
|
workspace_bar { return TOKWORKSPACEBAR; }
|
||||||
popup_during_fullscreen { return TOK_POPUP_DURING_FULLSCREEN; }
|
popup_during_fullscreen { return TOK_POPUP_DURING_FULLSCREEN; }
|
||||||
ignore { return TOK_IGNORE; }
|
ignore { return TOK_IGNORE; }
|
||||||
|
|
|
@ -623,6 +623,7 @@ void parse_file(const char *f) {
|
||||||
%token TOKFOCUSFOLLOWSMOUSE "focus_follows_mouse"
|
%token TOKFOCUSFOLLOWSMOUSE "focus_follows_mouse"
|
||||||
%token TOK_FORCE_FOCUS_WRAPPING "force_focus_wrapping"
|
%token TOK_FORCE_FOCUS_WRAPPING "force_focus_wrapping"
|
||||||
%token TOK_FORCE_XINERAMA "force_xinerama"
|
%token TOK_FORCE_XINERAMA "force_xinerama"
|
||||||
|
%token TOK_WORKSPACE_AUTO_BAF "workspace_auto_back_and_forth"
|
||||||
%token TOKWORKSPACEBAR "workspace_bar"
|
%token TOKWORKSPACEBAR "workspace_bar"
|
||||||
%token TOK_DEFAULT "default"
|
%token TOK_DEFAULT "default"
|
||||||
%token TOK_STACKING "stacking"
|
%token TOK_STACKING "stacking"
|
||||||
|
@ -679,6 +680,7 @@ line:
|
||||||
| focus_follows_mouse
|
| focus_follows_mouse
|
||||||
| force_focus_wrapping
|
| force_focus_wrapping
|
||||||
| force_xinerama
|
| force_xinerama
|
||||||
|
| workspace_back_and_forth
|
||||||
| workspace_bar
|
| workspace_bar
|
||||||
| workspace
|
| workspace
|
||||||
| assign
|
| assign
|
||||||
|
@ -1035,6 +1037,14 @@ force_xinerama:
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
workspace_back_and_forth:
|
||||||
|
TOK_WORKSPACE_AUTO_BAF bool
|
||||||
|
{
|
||||||
|
DLOG("automatic workspace back-and-forth = %d\n", $2);
|
||||||
|
config.workspace_auto_back_and_forth = $2;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
workspace_bar:
|
workspace_bar:
|
||||||
TOKWORKSPACEBAR bool
|
TOKWORKSPACEBAR bool
|
||||||
{
|
{
|
||||||
|
|
|
@ -72,10 +72,11 @@ EOL (\r?\n)
|
||||||
cmdyycolumn = 1;
|
cmdyycolumn = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* the next/prev tokens are here to recognize them *before* handling
|
/* the next/prev/back_and_forth tokens are here to recognize them *before*
|
||||||
* strings ('workspace' command) */
|
* handling strings ('workspace' command) */
|
||||||
next { return TOK_NEXT; }
|
next { return TOK_NEXT; }
|
||||||
prev { return TOK_PREV; }
|
prev { return TOK_PREV; }
|
||||||
|
back_and_forth { return TOK_BACK_AND_FORTH; }
|
||||||
|
|
||||||
<WANT_STRING>\"[^\"]+\" {
|
<WANT_STRING>\"[^\"]+\" {
|
||||||
BEGIN(INITIAL);
|
BEGIN(INITIAL);
|
||||||
|
|
|
@ -174,6 +174,7 @@ bool definitelyGreaterThan(float a, float b, float epsilon) {
|
||||||
%token TOK_OR "or"
|
%token TOK_OR "or"
|
||||||
%token TOK_PPT "ppt"
|
%token TOK_PPT "ppt"
|
||||||
%token TOK_NOP "nop"
|
%token TOK_NOP "nop"
|
||||||
|
%token TOK_BACK_AND_FORTH "back_and_forth"
|
||||||
|
|
||||||
%token TOK_CLASS "class"
|
%token TOK_CLASS "class"
|
||||||
%token TOK_INSTANCE "instance"
|
%token TOK_INSTANCE "instance"
|
||||||
|
@ -587,9 +588,28 @@ workspace:
|
||||||
workspace_show(workspace_prev());
|
workspace_show(workspace_prev());
|
||||||
tree_render();
|
tree_render();
|
||||||
}
|
}
|
||||||
|
| TOK_WORKSPACE TOK_BACK_AND_FORTH
|
||||||
|
{
|
||||||
|
workspace_back_and_forth();
|
||||||
|
tree_render();
|
||||||
|
}
|
||||||
| TOK_WORKSPACE STR
|
| TOK_WORKSPACE STR
|
||||||
{
|
{
|
||||||
printf("should switch to workspace %s\n", $2);
|
printf("should switch to workspace %s\n", $2);
|
||||||
|
|
||||||
|
Con *ws = con_get_workspace(focused);
|
||||||
|
|
||||||
|
/* Check if the command wants to switch to the current workspace */
|
||||||
|
if (strcmp(ws->name, $2) == 0) {
|
||||||
|
printf("This workspace is already focused.\n");
|
||||||
|
if (config.workspace_auto_back_and_forth) {
|
||||||
|
workspace_back_and_forth();
|
||||||
|
free($2);
|
||||||
|
tree_render();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
workspace_show_by_name($2);
|
workspace_show_by_name($2);
|
||||||
free($2);
|
free($2);
|
||||||
|
|
||||||
|
|
|
@ -2,13 +2,17 @@
|
||||||
* vim:ts=4:sw=4:expandtab
|
* vim:ts=4:sw=4:expandtab
|
||||||
*
|
*
|
||||||
* i3 - an improved dynamic tiling window manager
|
* i3 - an improved dynamic tiling window manager
|
||||||
* © 2009-2010 Michael Stapelberg and contributors (see also: LICENSE)
|
* © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE)
|
||||||
*
|
*
|
||||||
* workspace.c: Functions for modifying workspaces
|
* workspace.c: Functions for modifying workspaces
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#include "all.h"
|
#include "all.h"
|
||||||
|
|
||||||
|
/* Stores a copy of the name of the last used workspace for the workspace
|
||||||
|
* back-and-forth switching. */
|
||||||
|
static char *previous_workspace_name = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns a pointer to the workspace with the given number (starting at 0),
|
* Returns a pointer to the workspace with the given number (starting at 0),
|
||||||
* creating the workspace if necessary (by allocating the necessary amount of
|
* creating the workspace if necessary (by allocating the necessary amount of
|
||||||
|
@ -191,11 +195,20 @@ static void _workspace_show(Con *workspace, bool changed_num_workspaces) {
|
||||||
/* enable fullscreen for the target workspace. If it happens to be the
|
/* enable fullscreen for the target workspace. If it happens to be the
|
||||||
* same one we are currently on anyways, we can stop here. */
|
* same one we are currently on anyways, we can stop here. */
|
||||||
workspace->fullscreen_mode = CF_OUTPUT;
|
workspace->fullscreen_mode = CF_OUTPUT;
|
||||||
if (workspace == con_get_workspace(focused)) {
|
current = con_get_workspace(focused);
|
||||||
|
if (workspace == current) {
|
||||||
DLOG("Not switching, already there.\n");
|
DLOG("Not switching, already there.\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Remember currently focused workspace for switching back to it later with
|
||||||
|
* the 'workspace back_and_forth' command.
|
||||||
|
* NOTE: We have to duplicate the name as the original will be freed when
|
||||||
|
* the corresponding workspace is cleaned up. */
|
||||||
|
|
||||||
|
FREE(previous_workspace_name);
|
||||||
|
previous_workspace_name = sstrdup(current->name);
|
||||||
|
|
||||||
workspace_reassign_sticky(workspace);
|
workspace_reassign_sticky(workspace);
|
||||||
|
|
||||||
LOG("switching to %p\n", workspace);
|
LOG("switching to %p\n", workspace);
|
||||||
|
@ -368,6 +381,19 @@ workspace_prev_end:
|
||||||
return prev;
|
return prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Focuses the previously focused workspace.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void workspace_back_and_forth() {
|
||||||
|
if (!previous_workspace_name) {
|
||||||
|
DLOG("No previous workspace name set. Not switching.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
workspace_show_by_name(previous_workspace_name);
|
||||||
|
}
|
||||||
|
|
||||||
static bool get_urgency_flag(Con *con) {
|
static bool get_urgency_flag(Con *con) {
|
||||||
Con *child;
|
Con *child;
|
||||||
TAILQ_FOREACH(child, &(con->nodes_head), nodes)
|
TAILQ_FOREACH(child, &(con->nodes_head), nodes)
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
#!perl
|
||||||
|
# vim:ts=4:sw=4:expandtab
|
||||||
|
# !NO_I3_INSTANCE! will prevent complete-run.pl from starting i3
|
||||||
|
#
|
||||||
|
# Checks if the 'workspace back_and_forth' command and the
|
||||||
|
# 'workspace_auto_back_and_forth' config directive work correctly.
|
||||||
|
#
|
||||||
|
|
||||||
|
use i3test;
|
||||||
|
use X11::XCB::Connection;
|
||||||
|
|
||||||
|
my $x = X11::XCB::Connection->new;
|
||||||
|
|
||||||
|
my $config = <<EOT;
|
||||||
|
# i3 config file (v4)
|
||||||
|
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
|
||||||
|
EOT
|
||||||
|
|
||||||
|
my $pid = launch_with_config($config);
|
||||||
|
|
||||||
|
my $first_ws = fresh_workspace;
|
||||||
|
ok(get_ws($first_ws)->{focused}, 'first workspace focused');
|
||||||
|
|
||||||
|
my $second_ws = fresh_workspace;
|
||||||
|
ok(get_ws($second_ws)->{focused}, 'second workspace focused');
|
||||||
|
|
||||||
|
my $third_ws = fresh_workspace;
|
||||||
|
ok(get_ws($third_ws)->{focused}, 'third workspace focused');
|
||||||
|
|
||||||
|
cmd 'workspace back_and_forth';
|
||||||
|
ok(get_ws($second_ws)->{focused}, 'second workspace focused');
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# test that without workspace_auto_back_and_forth switching to the same
|
||||||
|
# workspace that is currently focused is a no-op
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
cmd qq|workspace "$second_ws"|;
|
||||||
|
ok(get_ws($second_ws)->{focused}, 'second workspace still focused');
|
||||||
|
|
||||||
|
exit_gracefully($pid);
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# the same test, but with workspace_auto_back_and_forth
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
$config = <<EOT;
|
||||||
|
# i3 config file (v4)
|
||||||
|
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
|
||||||
|
workspace_auto_back_and_forth yes
|
||||||
|
EOT
|
||||||
|
|
||||||
|
$pid = launch_with_config($config);
|
||||||
|
|
||||||
|
$first_ws = fresh_workspace;
|
||||||
|
ok(get_ws($first_ws)->{focused}, 'first workspace focused');
|
||||||
|
|
||||||
|
$second_ws = fresh_workspace;
|
||||||
|
ok(get_ws($second_ws)->{focused}, 'second workspace focused');
|
||||||
|
|
||||||
|
$third_ws = fresh_workspace;
|
||||||
|
ok(get_ws($third_ws)->{focused}, 'third workspace focused');
|
||||||
|
|
||||||
|
cmd qq|workspace "$third_ws"|;
|
||||||
|
ok(get_ws($second_ws)->{focused}, 'second workspace focused');
|
||||||
|
|
||||||
|
exit_gracefully($pid);
|
||||||
|
|
||||||
|
done_testing;
|
Loading…
Reference in New Issue