Deblan blog

[Astuce] i3wm : Switcher entre les fenêtres d'un container

Le script que je vais vous donné a été écrit il y a quelques mois déjà. Il permet de switcher entre les fenêtres* d'un container. Si dans un container j'ai 3 fenêtres, alors je pourrai focus la première via alt+F2, la seconde via alt+F2 et la dernière via alt+F3. Si un container contient un autre container, le script détectera quel est celui focused et quelles fenêtres lui appartiennent.

Si des fenêtres et des containers appartiennent au même container, alors chacun des containers sera interprété comme une fenêtre.

* : une fenêtre est une application (terminal, navigateur, client mail, etc.)

Le script est une nouvelle fois écrit en PHP et les binds gèrent 6 windows. Pour pouvez bien sûr en ajouter.

Dans ~/bin/i3_switch_focus_container.php (ne pas oublier de faire un chmod u+x dessus) :

#!/usr/bin/php5
<?php

function getTree()
{
    return json_decode(shell_exec('i3-msg -t get_tree'));
}

function getFocusedWindowContainer($tree)
{
    if (empty($tree->nodes)) {
        return null;
    }

    foreach ($tree->nodes as $k => $container) {
        if (true === $container->focused) {
            return $tree->nodes;
        }

        if (null !== $container = getFocusedWindowContainer($container)) {
            return $container;
        }
    }

    return null;
}

function getFocusWindowNumber($default, $max)
{
    global $argv;

    if (!isset($argv[1])) {
        $argv[1] = $default;
    }

    return min($max, max(1, $argv[1])) - 1;
}

function getDefaultFocusWindowNumber($container)
{
    foreach ($container as $k => $v) {
        if ($v->focused) {
            return $k + 1;
        }
    }
}

function setFocusToWindow($window)
{
	shell_exec(sprintf("i3-msg '[con_id=\"%s\"] focus'", $window->id));
}

$container = getFocusedWindowContainer(getTree());

if ($container !== null) {
    $number = getFocusWindowNumber(getDefaultFocusWindowNumber($container), count($container));
    
	foreach ($container as $k => $window) {
        if ($k == $number) {
            setFocusToWindow($window);
        }
    }
}

Dans votre fichier de configuration i3 :

bindsym $mod+F1 exec ~/bin/i3_switch_focus_container.php 1
bindsym $mod+F2 exec ~/bin/i3_switch_focus_container.php 2
bindsym $mod+F3 exec ~/bin/i3_switch_focus_container.php 3
bindsym $mod+F4 exec ~/bin/i3_switch_focus_container.php 4
bindsym $mod+F5 exec ~/bin/i3_switch_focus_container.php 5
bindsym $mod+F6 exec ~/bin/i3_switch_focus_container.php 6

Ajouter un commentaire

Vous pouvez utiliser du markdown.Afficher l'aide.