Table des matières

Déplacer un Workspace donné vers l'écran actif

Introduction

Vous avez deux écrans ou plus, et lorsque vous êtes sur un écran et souhaitez aller sur un workspace X, vous souhaitez que ce workspace soit affiché sur l'écran courant et non sur l'écran sur lequel il a été déclaré.

Il n'y a pas de commande intégrée à i3 qui permette de faire ça directement, mais en utilisant les IPC, nous allons réaliser un script qui fait tout ce qu'on veut.

Installation

~/.config/i3/switch-workspace.py
#!/usr/bin/env python
 
from json import loads
from os import popen
from sys import argv
 
def ipc_query(req="command", msg=""):
    ans = popen("i3-msg -t " + req + " " +  msg).readlines()[0]
    return loads(ans)
 
if __name__ == "__main__":
    # Usage & checking args
    if len(argv) != 2:
        print "Usage: switch-workspace.py name-of-workspace"
        exit(-1)
 
    newworkspace = argv[1]
 
    # Retrieving active display
    active_display = None
    old_display = None
    for w in ipc_query(req="get_workspaces"):
        if w['focused']:
            active_display = w['output']
        if w['name'] == newworkspace:
            old_display = w['output']
        if newworkspace.isdigit() and w['num'] == int(newworkspace):
            old_display = w['output']
        print w
 
    # Pre-computing commands
    if newworkspace.isdigit():
        cmd_show = "workspace number " + newworkspace
    else:
        cmd_show = "workspace " + newworkspace
    cmd_move = "move workspace to output " + active_display
 
    # Moving workspace to active display
    if active_display == old_display:
        print cmd_show
        print ipc_query(msg=cmd_show)
    else:
        cmd="'" + cmd_show + ";" + cmd_move + ";" + cmd_show + "'"
        print cmd
        print ipc_query(msg=cmd)
chmod u+x ~/.config/i3/switch-workspace.py

Utilisation

Pour utiliser le script, on rajoute les bindings qui vont bien dans le fichier de configuration d'i3 :

~/.config/i3/config
...
bindsym $mod+minus exec ~/.config/i3/switch-workspace.py 6
...

Et avec ça:

Meta + - affiche directement le workspace 6 sur l'écran courant.