Gestion alternative des fenêtres sous Linux

Je fais partie de ceux qui configurent Caps Lock pour changer de mise en page parce que je suis trop paresseux pour appuyer sur 2 touches alors que je peux en appuyer une. J'aimerais même 2 touches inutiles : j'en utiliserais une pour activer la mise en page anglaise, et la seconde pour le russe. Mais la deuxième touche inutile consiste à appeler le menu contextuel, qui est tellement inutile qu'il est supprimé par de nombreux fabricants d'ordinateurs portables. Il faut donc se contenter de ce que l’on a.

Et je ne veux pas non plus chercher leurs icônes dans la barre des tâches lorsque je change de fenêtre, ni attraper leurs noms lors du défilement. Alt + Tab, faire défiler les bureaux, etc. Je souhaite appuyer sur une combinaison de touches (idéalement une seule, mais il n'y a plus de touches inutiles gratuites) et accéder immédiatement à la fenêtre dont j'ai besoin. Par exemple comme ceci :

  • Alt+F : Firefox
  • Alt+D : Firefox (navigation privée)
  • Alt+T : Terminal
  • Alt+M : Calculatrice
  • Alt+E : idée IntelliJ
  • etc.

De plus, en appuyant par exemple sur Alt + M Je veux voir la calculatrice, que ce programme soit actuellement en cours d'exécution ou non. S'il est en cours d'exécution, sa fenêtre doit recevoir le focus, et sinon, exécutez le programme souhaité et transférez le focus lors de son chargement.

Pour les cas qui ne sont pas couverts par le script précédent, je souhaite disposer de combinaisons de touches universelles pouvant être facilement attribuées à n'importe quelle fenêtre ouverte. Par exemple, j'ai 10 combinaisons attribuées par Alt + 1 à Alt + 0, qui ne sont liés à aucun programme. je peux juste cliquer Alt + 1 et la fenêtre actuellement active obtiendra le focus lorsque vous cliquerez dessus Alt + 1.

Sous la coupe se trouve une description de quelques fonctionnalités supplémentaires et une réponse sur la façon dont cela peut être réalisé. Mais je vous préviens immédiatement qu'une telle personnalisation « pour vous-même » peut provoquer une grave dépendance, voire un sevrage, si vous devez utiliser Windows, Mac OS ou même l'ordinateur de quelqu'un d'autre avec Linux.

En fait, si vous y réfléchissez, nous n’utilisons pas beaucoup de programmes quotidiennement. Un navigateur, un terminal, un IDE, une sorte de messager, un gestionnaire de fichiers, une calculatrice et peut-être c'est presque tout. Il n'y a pas beaucoup de combinaisons de touches nécessaires pour couvrir 95 % des tâches quotidiennes.

Pour les programmes qui ont plusieurs fenêtres ouvertes, l'une d'entre elles peut être désignée comme principale. Par exemple, plusieurs fenêtres IntelliJ Idea sont ouvertes et affectées à Alt + E. Dans des conditions normales, lorsque vous appuyez sur Alt + E une fenêtre de ce programme s'ouvrira, probablement celle qui a été ouverte en premier. Cependant, si vous cliquez sur Alt + E lorsque l'une des fenêtres de ce programme est déjà active, alors cette fenêtre particulière sera désignée comme la fenêtre principale et ce sera celle qui recevra le focus lorsque les combinaisons suivantes seront enfoncées.

La fenêtre principale peut être réaffectée. Pour ce faire, vous devez d'abord réinitialiser la combinaison, puis lui attribuer une autre fenêtre comme fenêtre principale. Pour réinitialiser une combinaison, vous devez appuyer sur la combinaison elle-même, puis sur une combinaison spéciale de réinitialisation, je l'ai attribuée à Alt+Retour arrière. Cela appellera un script qui annulera l'attribution de la fenêtre principale pour la combinaison précédente. Et puis vous pouvez attribuer une nouvelle fenêtre principale comme décrit dans le paragraphe précédent. La réinitialisation d'une fenêtre liée aux combinaisons universelles s'effectue de la même manière.

L'introduction s'est avérée longue, mais je voulais d'abord expliquer ce que nous allons faire, puis expliquer comment le faire.

Pour ceux qui en ont marre de lire

Bref, le lien vers les scripts se trouve en fin d'article.

Mais vous ne pourrez toujours pas l’installer et l’utiliser immédiatement. Vous devrez d'abord comprendre comment le script trouve la fenêtre souhaitée. Sans cela, il ne sera pas possible d'indiquer au script où exactement le focus doit être transféré. Et vous devez comprendre quoi faire si soudainement une fenêtre appropriée n'est pas trouvée.

Et je ne me concentrerai pas sur la façon de configurer l'exécution des scripts en appuyant sur des combinaisons de touches. Par exemple, dans KDE, c'est dans Paramètres système → Raccourcis → Raccourcis personnalisés. Cela devrait également être le cas dans d'autres gestionnaires de fenêtres.

Présentation de wmctrl

WmctrlComment — utilitaire de console pour interagir avec X Window Manager. C'est le programme clé du script. Jetons un coup d'œil rapide à la façon dont vous pouvez l'utiliser.

Tout d'abord, affichons une liste des fenêtres ouvertes :

$ wmctrl -lx
0x01e0000e -1 plasmashell.plasmashell             N/A Desktop — Plasma
0x01e0001e -1 plasmashell.plasmashell             N/A Plasma
0x03a00001  0 skype.Skype                         N/A Skype
0x04400003  0 Navigator.Firefox                   N/A Google Переводчик - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Лучшие публикации за сутки / Хабр - Mozilla Firefox (Private Browsing)
...

Option -l affiche une liste de toutes les fenêtres ouvertes, et -X ajoute le nom de la classe à la sortie (skype.Skype, Navigateur.Firefox etc). Ici, nous avons besoin de l'identifiant de la fenêtre (colonne 1), du nom de la classe (colonne 3) et du nom de la fenêtre (dernière colonne).

Vous pouvez essayer d'activer une fenêtre en utilisant l'option -a:

$ wmctrl -a skype.Skype -x

Si tout s'est déroulé comme prévu, la fenêtre Skype devrait apparaître à l'écran. Si au lieu de l'option -x utiliser l'option -i, alors au lieu du nom de la classe, vous pouvez spécifier l'identifiant de la fenêtre. Le problème avec l'identifiant est que l'identifiant de la fenêtre change à chaque lancement de l'application et nous ne pouvons pas le savoir à l'avance. En revanche, cet attribut identifie de manière unique une fenêtre, ce qui peut être important lorsqu'une application ouvre plusieurs fenêtres. Nous en parlerons un peu plus loin.

À ce stade, nous devons nous rappeler que nous rechercherons la fenêtre souhaitée en utilisant l'expression régulière par sortie wmctrl -lx. Mais cela ne veut pas dire que nous devons utiliser quelque chose de compliqué. Habituellement, le nom de la classe ou le nom de la fenêtre suffit.

Au fond, l’idée principale devrait déjà être claire. Dans les paramètres globaux de raccourcis clavier/raccourcis de votre gestionnaire de fenêtres, configurez la combinaison requise pour exécuter le script.

Comment utiliser les scripts

Vous devez d'abord installer les utilitaires de la console wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

Ensuite, vous devez télécharger les scripts et les ajouter à $ CHEMIN. Je les mets habituellement dedans ~/bac:

$ cd ~/bin
$ git clone https://github.com/masyamandev/Showwin-script.git
$ ln -s ./Showwin-script/showwin showwin
$ ln -s ./Showwin-script/showwinDetach showwinDetach

Si le répertoire ~/bac n'était pas là, alors vous devez le créer et redémarrer (ou vous reconnecter), sinon ~/bac ne frappera pas $ CHEMIN. Si tout est fait correctement, alors les scripts devraient être accessibles depuis la console et la complétion par onglets devrait fonctionner.

Script principal showwin prend 2 paramètres : le premier est une regex, par laquelle nous rechercherons la fenêtre requise, et le deuxième paramètre est une commande qui doit être exécutée si la fenêtre requise n'est pas trouvée.

Vous pouvez essayer d'exécuter un script, par exemple :

$ showwin "Mozilla Firefox$" firefox

Si Firefox est installé, sa fenêtre doit avoir le focus. Même si Firefox ne fonctionnait pas, il aurait dû démarrer.

Si cela fonctionne, vous pouvez essayer de configurer l'exécution des commandes sur les combinaisons. Dans les paramètres globaux des raccourcis clavier/raccourcis, ajoutez :

  • Alt+F : showwin « Mozilla Firefox$ » Firefox
  • Alt+D : showwin "Mozilla Firefox (navigation privée)$" "firefox -private-window"
  • Alt+C : showwin "chromium-browser.Chromium-browser N*" navigateur-chrome
  • Alt+X : showwin "chromium-browser.Chromium-browser I*" "chromium-browser -incognito"
  • Alt+S : showwin « skype.Skype » skypeforlinux
  • Alt+E : showwin « jetbrains-idea » idea.sh

Etc. Chacun peut configurer les combinaisons de touches et les logiciels comme bon lui semble.
Si tout s'est bien passé, en utilisant les combinaisons ci-dessus, nous pourrons basculer entre les fenêtres en appuyant simplement sur les touches.

Je vais décevoir les amateurs de chrome : il peut distinguer incognito une fenêtre ordinaire par sa sortie wmctrl Vous ne pouvez pas, ils ont les mêmes noms de classe et titres de fenêtres. Dans l'expression régulière proposée, les caractères N* et I* sont nécessaires uniquement pour que ces expressions régulières diffèrent les unes des autres et qu'elles puissent être affectées comme fenêtres principales.

Pour réinitialiser la fenêtre principale de la combinaison précédente (en fait pour les regex, qui showwin appelé la dernière fois), vous devez appeler le script showwinDétacher. J'ai ce script attribué à une combinaison de touches Alt+Retour arrière.

Au scénario showwin il y a une autre fonction. Lorsqu'il est appelé avec un paramètre (dans ce cas, le paramètre est juste un identifiant), il ne vérifie pas du tout l'expression régulière, mais considère que toutes les fenêtres sont appropriées. En soi, cela semble inutile, mais de cette façon, nous pouvons désigner n'importe quelle fenêtre comme fenêtre principale et passer rapidement à cette fenêtre particulière.

J'ai configuré les combinaisons suivantes :

  • Alt+1 : showwin "CustomKey1"
  • Alt+2 : showwin "CustomKey2"
  • ...
  • Alt+0 : showwin "CustomKey0"
  • Alt+Retour arrière : showwinDetach

De cette façon, je peux lier n'importe quelle fenêtre à des combinaisons Alt + 1...Alt + 0. Juste en cliquant Alt + 1 Je lie la fenêtre actuelle à cette combinaison. Je peux annuler la liaison en cliquant Alt + 1et ensuite Alt+Retour arrière. Ou fermez la fenêtre, ça marche aussi.

Ensuite, je vais vous donner quelques détails techniques. Vous n’êtes pas obligé de les lire, mais essayez simplement de les configurer et de voir. Mais je recommanderais quand même de comprendre les scripts des autres avant de les exécuter sur votre ordinateur :).

Comment distinguer les différentes fenêtres d'une même application

En principe, le tout premier exemple « wmctrl -a skype.Skype -x » fonctionnait et peut être utilisé. Mais reprenons l'exemple avec Firefox, dans lequel 2 fenêtres sont ouvertes :

0x04400003  0 Navigator.Firefox                   N/A Google Переводчик - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Лучшие публикации за сутки / Хабр - Mozilla Firefox (Private Browsing)

La première fenêtre est en mode normal et la seconde est la navigation privée. Je voudrais considérer ces fenêtres comme des applications différentes et y accéder en utilisant différentes combinaisons de touches.

Il est nécessaire de compliquer le script qui change de fenêtre. J'ai utilisé cette solution : afficher une liste de toutes les fenêtres, faites grep par regex, prenez la première ligne avec front, récupérez la première colonne (ce sera l'identifiant de la fenêtre) en utilisant cut, passez à la fenêtre par identifiant.

Il devrait y avoir une blague sur les expressions régulières et deux problèmes, mais en fait je n'utilise rien de compliqué. J'ai besoin d'expressions régulières pour pouvoir indiquer la fin de la ligne (le symbole « $ ») et distinguer « Mozilla Firefox$ » de « Mozilla Firefox (navigation privée)$ ».

La commande ressemble à ceci :

$ wmctrl -i -a `wmctrl -lx | grep -i "Mozilla Firefox$" | head -1 | cut -d" " -f1`

Ici, vous pouvez déjà deviner la deuxième fonctionnalité du script : si grep ne renvoie rien, alors l'application souhaitée n'est pas ouverte et vous devez la démarrer en exécutant la commande à partir du deuxième paramètre. Et puis vérifiez périodiquement si la fenêtre requise s'est ouverte afin d'y transférer le focus. Je ne m’attarderai pas là-dessus ; quiconque en aura besoin consultera les sources.

Lorsque les fenêtres d'application ne sont pas distinguables

Nous avons donc appris à transférer le focus sur la fenêtre de l'application souhaitée. Mais que se passe-t-il si une application a plusieurs fenêtres ouvertes ? Sur lequel dois-je me concentrer ? Le script ci-dessus sera très probablement transféré vers la première fenêtre ouverte. Cependant, nous souhaiterions plus de flexibilité. J'aimerais pouvoir me souvenir de quelle fenêtre nous avons besoin et passer à cette fenêtre particulière.

L'idée était la suivante : si nous voulons mémoriser une fenêtre spécifique pour une combinaison de touches, nous devons alors appuyer sur cette combinaison lorsque la fenêtre souhaitée est sélectionnée. À l'avenir, lorsque vous appuierez sur cette combinaison, le focus sera donné à cette fenêtre. Jusqu'à ce que la fenêtre se ferme ou que nous effectuions une réinitialisation pour cette combinaison de scripts showwinDétacher.

Algorithme de script showwin quelque chose comme ça:

  • Vérifiez si nous avons déjà mémorisé l'identifiant de la fenêtre vers laquelle le focus doit être transféré.
    Si vous vous en souvenez et qu'une telle fenêtre existe toujours, nous y transférons le focus et quittons.
  • Nous regardons quelle fenêtre est actuellement active, et si elle correspond à notre demande, mémorisons son identifiant pour y accéder à l'avenir et quitter.
  • Nous allons au moins dans une fenêtre appropriée si elle existe ou ouvrons l'application souhaitée.

Vous pouvez savoir quelle fenêtre est actuellement active à l'aide de l'utilitaire de console xdotool en convertissant sa sortie au format hexadécimal :

$ printf "0x%08x" `xdotool getwindowfocus`

Le moyen le plus simple de mémoriser quelque chose dans bash est de créer des fichiers dans un système de fichiers virtuel situé en mémoire. Dans Ubuntu, ceci est activé par défaut dans /dev/shm/. Je ne peux rien dire sur les autres distributions, j'espère qu'il y a aussi quelque chose de similaire. Vous pouvez regarder avec la commande :

$ mount -l | grep tmpfs

Le script créera des répertoires vides dans ce dossier, comme ceci : /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. De plus, chaque fois qu'il est appelé, il créera un lien symbolique /dev/shm/$USER/showwin/showwin_last sur /dev/shm/$USER/showwin/$SEARCH_REGEX. Cela sera nécessaire pour, si nécessaire, supprimer l'identifiant de la fenêtre pour une certaine combinaison à l'aide d'un script showwinDétacher.

Ce qui peut être amélioré

Tout d'abord, les scripts doivent être configurés manuellement. Sûrement, en raison de la nécessité d'approfondir et de faire beaucoup de choses avec vos mains, beaucoup d'entre vous n'essaieront même pas de configurer le système. S'il était possible d'installer simplement le package et de tout configurer plus facilement, il gagnerait peut-être en popularité. Et puis regardez, l’application serait publiée dans des distributions standard.

Et peut-être que cela peut être fait plus facilement. Si par l'identifiant d'une fenêtre vous pouvez trouver l'identifiant du processus qui l'a créé, et par l'identifiant du processus vous pouvez découvrir quelle commande l'a créé, alors il serait possible d'automatiser la configuration. En fait, je n’ai pas compris si ce que j’écrivais dans ce paragraphe était possible. Le fait est que je suis personnellement satisfait de la manière dont cela fonctionne actuellement. Mais si quelqu'un d'autre que moi trouve l'approche globale pratique et que quelqu'un l'améliore, alors je serai heureux d'utiliser une meilleure solution.

Un autre problème, comme je l'ai déjà écrit, est que dans certains cas, les fenêtres ne peuvent pas être distinguées les unes des autres. Jusqu'à présent, je n'ai observé cela qu'avec incognito dans chrome/chromium, mais il y a peut-être quelque chose de similaire ailleurs. En dernier recours, il existe toujours la possibilité de combinaisons universelles. Alt + 1...Alt + 0. Encore une fois, j'utilise Firefox et pour moi personnellement, ce problème n'est pas grave.

Mais le problème le plus important pour moi est que j’utilise Mac OS pour mon travail et que je ne peux rien configurer de tel là-bas. utilitaire wmctrl Je pense avoir pu l'installer, mais cela ne fonctionne pas vraiment sous Mac OS. Quelque chose peut être fait avec l'application Automator, mais il est si lent qu'il n'est pas pratique à utiliser même lorsqu'il fonctionne. Je ne pouvais pas non plus configurer les combinaisons de touches pour qu'elles fonctionnent dans tous les programmes. Si quelqu’un trouve soudainement une solution, je serai heureux de l’utiliser.

Au lieu d'une conclusion

Il s’est avéré qu’il s’agissait d’un nombre étonnamment élevé de mots pour une fonctionnalité aussi simple en apparence. Je voulais transmettre l’idée et ne pas surcharger le texte, mais je n’ai pas encore trouvé comment la raconter plus simplement. Ce serait peut-être mieux au format vidéo, mais les gens n’aiment pas ça ici.

J'ai parlé un peu de ce qu'il y a sous le capot du script et de la façon de le configurer. Je ne suis pas entré dans les détails du script lui-même, mais il ne fait que 50 lignes, donc ce n’est pas difficile à comprendre.

J'espère que quelqu'un d'autre essaiera cette idée et peut-être même l'appréciera. Je peux dire de moi que le scénario a été écrit il y a environ 3 ans et qu'il me convient TRÈS. Si pratique qu'il provoque un sérieux inconfort lorsque l'on travaille avec les ordinateurs d'autres personnes. Et avec un MacBook fonctionnel.

Lien vers les scripts

Source: habr.com

Ajouter un commentaire