web-dev-qa-db-fra.com

Est-il possible de parcourir les espaces de travail dans Unity (14.04+)?

J'ai configuré mes raccourcis clavier de sorte que Alt + gauche m'amène à l'espace de travail à gauche et Alt + droite m'emmène à l'espace de travail à droite, mais je préférerais avoir un jeu de touches pour faire défiler. Idéalement, quelque chose comme

workspace 1 + Alt + tab ---> worskspace 2
workspace 2 + Alt + tab ---> worskspace 3
workspace 3 + Alt + tab ---> worskspace 4
workspace 4 + Alt + tab ---> worskspace 1

Le problème est la dernière ligne. Je ne vois aucun moyen de revenir de l'espace de travail 4 à l'espace de travail 1. Comment passer au bon module 4?

1
uhuola

Parcourez vos fenêtres

Avec un petit script, il est très bien possible de parcourir les espaces de travail (en fait les fenêtres):

  • en avant:

    enter image description here

    (Si la dernière fenêtre est atteinte, le script passe à la première)

  • ... ou en arrière:

    enter image description here

    (Si la première fenêtre est atteinte, le script passe à la dernière)

Le script

#!/usr/bin/env python3
import subprocess
import sys

move = sys.argv[1]

# get the needed info from wmctrl -d
wsdata = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
# retrieve total size of workspace
ws = [int(n) for n in wsdata[3].split("x")]
# panel/launcher height/width
pans = [int(n) for n in wsdata[7].split(",")]
# work area
wa = [int(n) for n in wsdata[8].split("x")]
# x/y resolution
res_h = pans[0]+wa[0]; res_v = pans[1]+wa[1]
# current position in the spanning workspace
VP = [int(n) for n in wsdata[5].split(",")]

def last_h():
    # test if we are on the last viewport horizontally
    return VP[0]+res_h == ws[0]

def first_h():
    # test if we are on the first viewport horizontally
    return VP[0] == 0

def last_v():
    # test if we are on the last viewport vertically
    return VP[1]+res_v == ws[1]

def first_v():
    # test if we are on the first viewport vertically
    return VP[1] == 0

if move == "next":
    if last_h() == False:
        command = str(VP[0]+res_h)+","+str(VP[1])
    Elif last_v() == True:
        command = "0,0"
    else:
        command = "0,"+str(VP[1]+res_v)

if move == "prev":
    if first_h() == False:
        command = str(VP[0]-res_h)+","+str(VP[1])
    Elif first_v() == True:
        command = str(ws[0]-res_h)+","+str(ws[1]-res_v)
    else:
        command = str(ws[0]-res_h)+","+str(VP[1]-res_v)

subprocess.Popen(["wmctrl", "-o", command])

Comment utiliser

  1. Le script a besoin de wmctrl :

    Sudo apt-get install wmctrl
    
  2. Copiez le script dans un fichier vide, enregistrez-le sous through_viewports.py

  3. Ajoutez deux commandes à deux touches de raccourci différentes:

    python3 /path/to/through_viewports.py next
    

    pour passer à la fenêtre suivante et:

    python3 /path/to/through_viewports.py prev
    

    aller à la fenêtre précédente

    Ouvrez Paramètres système> Clavier> Raccourcis> Raccourcis personnalisés. Clique le + et ajoutez les deux commandes aux raccourcis que vous aimez.

C'est tout Le script détecte comment vos fenêtres sont configurées et les parcourt.

Comment ça marche, le concept

Dans Unity, les fenêtres sont disposées dans une seule grande matrice, ce qui rend l'ensemble unique espace de travail, le bureau Unity existe.

Utilisation de la commande:

wmctrl -d

dans la sortie, nous pouvons lire toutes les informations dont nous avons besoin pour savoir où nous en sommes actuellement dans la matrice.

0  * DG: 5120x2400  VP: 0,0  WA: 65,24 1215x776  N/A
  • 5120x2400 est la taille totale de toutes les fenêtres (matrice)
  • 0,0 est la position x/y de la fenêtre courante dans la matrice (en haut à gauche, pixels)
  • de WA: 65,24 1215x776 on peut dériver la résolution de l'écran (65,24 sont la largeur/hauteur du lanceur/panneau, 1215x776 est la zone restante)

Une fois que nous avons les informations correctes, le script calcule la position cible dans la matrice et la définit avec la commande:

wmctrl -o x,y
3
Jacob Vlijm

En 12.04, j'avais résolu ce problème en modifiant une clé avec gconf-editor, mais je n'avais pas cette même clé en 16.04, alors voici ce qui a fonctionné pour moi:

Sudo apt-get install compizconfig-settings-manager

qui installe un utilitaire de paramètres avancés de l'interface graphique, puis

ccsm

qui le lance. Et puis je suis allé à Desktop Wall> Viewport Switching> Allow Wrap-Around et j'ai coché la case.

2
ph7four