web-dev-qa-db-fra.com

Pourquoi ma commande wmctrl -a ne soulève-t-elle pas ma fenêtre Rhythmbox réduite?

Le problème

J'ajoute actuellement quelques raccourcis personnalisés.

Je ne parviens pas à révéler une fenêtre Rhythmbox réduite. J'utilise wmctrl dans un script Shell, voir ci-dessous, pour cette tâche. Lorsque j'appuie sur la combinaison de touches, rien ne se passe (visuellement). Révéler Firefox, par exemple, en utilisant une version adaptée du script Shell ci-dessous fonctionne sans aucun problème. pourquoi Rhythmbox ne se comporte-t-il pas de la même manière?

Le script dit:

sh -c "if pgrep -x rhythmbox > /dev/null; then wmctrl -a rhythmbox; else rhythmbox; fi"

Edit important:

Apparemment, mon script fonctionne maintenant - sans avoir rien changé à ce sujet. Cependant, j'ai exécuté killall rhythmbox. Après cela, mon script Shell a fonctionné comme prévu. Je pense qu'en ajoutant simplement le correctif au lieu de supprimer la question, je peux peut-être aider quelqu'un à trouver le même problème. Si vous pensez savoir pourquoi cela est arrivé, n'hésitez pas à partager votre theroy.

Encore une édition:

Waouh, d'accord ... Quelques secondes à peine après l'ajout de la dernière modification, j'ai de nouveau essayé d'utiliser ledit raccourci et cela n'a pas fonctionné. J'ai tué le processus et tout a encore fonctionné - le corps then ET _ else. Après avoir cliqué sur quelques fenêtres, il a cessé de fonctionner. Après avoir exécuté killall rhythmbox et l'avoir vu fonctionner à nouveau parfaitement, même après avoir omis de reproduire l'erreur, je suis parvenue à la conclusion qu'il s'agissait d'une action aléatoire. Eh bien, pseudo-aléatoire, bien sûr. Si vous voulez l'essayer vous-même, vous savez le faire. Vous pouvez obtenir wmctrl en exécutant Sudo apt install wmctrl. J'utilise la version 1.07 de celui-ci sur Ubuntu 16.04 LTS et très confus.

Dernière édition (ne jamais dire dernier):

En fait, j'ai obtenu que Firefox se révèle maintenant en appuyant sur la combinaison de touches. C'est cool, mais pas ce que je veux. Je vais boire une grande tasse de café maintenant et faire autre chose, wow.

3
Reum12

Le problème: rhythmbox change le nom de la fenêtre

Le problème est que vous identifiez la fenêtre par son nom , à l'aide de wmctrl -a. De man wmctrl:

-a <WIN>
    Switch to the desktop containing the window <WIN>, raise the window, and give it focus. 

<WIN> est une chaîne d'identification dans le nom de la fenêtre.

Dans votre cas, cela risque de provoquer des erreurs, car Rhythmbox change le nom de la fenêtre en fonction du morceau. Vous devez identifier la fenêtre soit par sa classe window , soit par sa id

Ce dernier peut être fait en utilisant:

wmctrl -ia

où l'option -i signifie window-id:

   -i     Interpret window arguments (<WIN>) as  a  numeric  value  rather
          than  a  string name for the window. If the numeric value starts
          with the prefix '0x' it is assumed to be a hexadecimal number.

Les identificateurs de fenêtre et les pid auxquels une fenêtre appartient peuvent être extraits de la liste de fenêtres, appelée par la commande:

wmctrl -lp 

Une commande fiable pour élever la fenêtre la plus récente, par ex. Rhythmbox est alors:

wmctrl -ia "$(wmctrl -lp | grep "$(pgrep rhythmbox)" | tail -1 | awk '{ print $1 }')"

Explication:

wmctrl -lp

liste toutes les fenêtres, y compris leurs pids. Une propriété importante de la commande est qu’elle répertorie les fenêtres dans leur ordre de création .

Donc:

wmctrl -lp | grep "$(pgrep rhythmbox)" | tail -1 | awk '{ print $1 }'

volonté:

  • lister tous les windows + pids auxquels ils appartiennent:

    wmctrl -lp
    
  • trouvez ceux appartenant à rhythmbox:

    grep "$(pgrep rhythmbox)"
    
  • trouvez le dernier (qui est aussi le dernier créé):

    tail -1
    
  • extraire la première chaîne de la ligne (qui est la fenêtre -id):

    awk '{ print $1 }'
    

La commande:

wmctrl -ia

soulève ensuite la fenêtre la plus récente de Rhythmbox par son identifiant.

Scénario

Pour des raisons de commodité et pour éviter les problèmes avec les guillemets, je voudrais en faire un petit script avec la commande et l'exécuter à partir d'un raccourci:

#!/bin/bash
wmctrl -ia "$(wmctrl -lp | grep "$(pgrep rhythmbox)" | tail -1 | awk '{ print $1 }')"

Faites-le () exécutable et ajoutez une touche de raccourci: choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés" . Cliquez sur le "+" et ajoutez la commande:

/path/to/script.sh

Aditionellement

Il semble que vous utilisiez la commande/script pour plusieurs applications. Au lieu de créer des scripts distincts pour chaque application, vous pouvez définir l’argument de l’application :

#!/bin/bash
app=$(pgrep $1)
wmctrl -ia "$(wmctrl -lp | grep "$app" | tail -1 | awk '{ print $1 }')"

Ensuite

 /path/to/script.sh gedit

ouvrira la dernière fenêtre gedit créée, alors que

/path/to/script.sh rhythmbox

ouvrira la fenêtre rhythmbox créée récemment, et ainsi de suite.

2
Jacob Vlijm