web-dev-qa-db-fra.com

Comment puis-je avoir une application à afficher automatiquement sur tous les bureaux avec openbox?

Est-il possible d'utiliser wmctrl ou autre chose pour qu'une fenêtre spécifique s'affiche automatiquement sur tous les bureaux?

J'utilise le premier joueur Google Play Music miniplayer Chrome extension pour contrôler la lecture de musique. J'ai déjà un alias bash que je peux invoquer pour que le mini-joueur reste au-dessus des autres fenêtres, mais je souhaite également l'envoyer également à tous les ordinateurs de bureau afin que je n'ai pas à cliquer avec le bouton droit de la souris et à sélectionner Envoyer sur le bureau Tous les ordinateurs de bureau (via openbox).

Idéalement, un script doit exécuter quelque chose en arrière-plan et dès qu'il détecte la fenêtre du mini-joueur, il la place au-dessus et est envoyé à tous les ordinateurs de bureau. Est-ce possible?

3
Andy Forceno

Vous pouvez réellement le faire sans un script tiers. Openbox prend en charge une gamme étendue de paramètres par application .

Création d'une règle spécifique à l'application

Les règles d'application sont comparées à différentes propriétés telles que le nom de la fenêtre, la classe, le rôle ou le titre. La plupart de ces propriétés peuvent être obtenues pour une fenêtre spécifique en exécutant

obxprop | grep "^_OB_APP"

et en cliquant sur la fenêtre en question.

Si vous envisagez de spécifier la règle pour une fenêtre d’extension Chrome, vous souhaiterez peut-être fournir autant de propriétés correspondantes que possible afin de rendre la règle aussi spécifique que possible. Vous ne voulez pas que cela s'applique à toutes les Chrome fenêtres. Essayez différentes propriétés correspondantes et voyez ce qui vous convient le mieux.

Après avoir défini la fenêtre correspondante, vous pouvez définir différentes propriétés qui s'appliqueront exclusivement à la fenêtre/application en question. Voici un extrait de la valeur par défaut rc.xml décrivant toutes les propriétés disponibles:

# each rule element can be left out or set to 'default' to specify to not 
# change that attribute of the window

<decor>yes</decor>
# enable or disable window decorations

<shade>no</shade>
# make the window shaded when it appears, or not

<position force="no">
  # the position is only used if both an x and y coordinate are provided
  # (and not set to 'default')
  # when force is "yes", then the window will be placed here even if it
  # says you want it placed elsewhere.  this is to override buggy
  # applications who refuse to behave
  <x>center</x>
  # a number like 50, or 'center' to center on screen. use a negative number
  # to start from the right (or bottom for <y>), ie -50 is 50 pixels from
  # the right Edge (or bottom). use 'default' to specify using value
  # provided by the application, or chosen by openbox, instead.
  <y>200</y>
  <monitor>1</monitor>
  # specifies the monitor in a xinerama setup.
  # 1 is the first head, or 'mouse' for wherever the mouse is
</position>

<size>
  # the size to make the window.
  <width>20</width>
  # a number like 20, or 'default' to use the size given by the application.
  # you can use fractions such as 1/2 or percentages such as 75% in which
  # case the value is relative to the size of the monitor that the window
  # appears on.
  <height>30%</height>
</size>

<focus>yes</focus>
# if the window should try be given focus when it appears. if this is set
# to yes it doesn't guarantee the window will be given focus. some
# restrictions may apply, but Openbox will try to

<desktop>1</desktop>
# 1 is the first desktop, 'all' for all desktops

<layer>normal</layer>
# 'above', 'normal', or 'below'

<iconic>no</iconic>
# make the window iconified when it appears, or not

<skip_pager>no</skip_pager>
# asks to not be shown in pagers

<skip_taskbar>no</skip_taskbar>
# asks to not be shown in taskbars. window cycling actions will also
# skip past such windows

<fullscreen>yes</fullscreen>
# make the window in fullscreen mode when it appears

<maximized>true</maximized>
# 'Horizontal', 'Vertical' or boolean (yes/no)

Dans votre cas spécifique, vous souhaiterez spécifier les layer et desktop de l'application. Voici un exemple de règle qui désignerait toutes les fenêtres d'une application spécifique pour qu'elles soient toujours au premier plan et omniprésentes sur tous les bureaux disponibles:

<application name="miniplayer" class="miniplayer" type="normal">
  <layer>above</layer>
  <desktop>all</desktop>
</application>

J'ai choisi un nom d'application arbitraire et une classe pour cet exemple. Comme indiqué précédemment, vous devrez vous assurer de trouver les valeurs correctes pour votre application spécifique.


Edit : J'ai examiné votre application spécifique et proposé une règle qui fonctionne sur mon système:

<application name="crx_npngaakpdgeaajbnidkkginekmnaejbi" class="Google-chrome" type="normal" role="pop-up">
  <layer>above</layer>
  <desktop>all</desktop>
</application>

J'espère que cela fonctionne pour vous aussi.


Modification de la configuration de votre openbox pour ajouter une règle spécifique à l'application

Pour ajouter une règle d'application, ouvrez votre openbox rc.xml (situé sous ~/.config/openbox/rc.xml pour une openbox ou ~/.config/openbox/lxde-rc.xml pour LXDE) et accédez à la section <applications> à la fin du fichier. .

Insérez les règles spécifiques à votre application entre les balises <applications>..</applications>. Enregistrez ensuite le fichier et rechargez la configuration en exécutant:

openbox --reconfigure

Les règles spécifiques à l'application doivent être appliquées après cela et seront automatiquement appliquées aux fenêtres nouvellement apparues.

3
Glutanimate

Solution plus générale trouvée en utilisant Python 2.7 et la bibliothèque python-wnck.

Si vous êtes intéressé par les détails, vérifiez this et this

Si ce n'est pas juste, faites cette étape. Les étapes 1-2 devraient déjà être effectuées dans Ubuntu:

  1. installez python2.7. Sudo apt-get install python2.7

  2. installez python-wnck. Sudo apt-get install python-wnck

  3. créer le fichier stick_player.py. touch stick_player.py

  4. ajoutez python Shebang.

echo '#!' which python> stick_player.py

  1. le rendre exécutable. chmod +x stick_player.py

  2. collez ce script dans stick_player.py. Il devrait ressembler à

#!/usr/bin/python

import wnck

screen = wnck.screen_get_default()
screen.force_update()

for win in screen.get_windows():
    if win.get_name() == 'Prime Player':
        win.stick()
  1. lancez votre lecteur dans une nouvelle fenêtre. Dans mon cas, le nom de la fenêtre était "Premier joueur". Si ce n'est pas le cas, faites le moi savoir.

  2. script de lancement. ./stick_player.py


Si vous souhaitez également annuler "visible sur tous les espaces de travail", faites-le. Répétez les étapes 3 à 7, mais.

  1. créer le fichier unstick_player.py. touch unstick_player.py

  2. ajoutez python Shebang.

echo '#!' which python> unstick_player.py

  1. le rendre exécutable. chmod +x unstick_player.py

  2. change la dernière ligne de win.stick() à win.unstick()

  3. script de lancement. ./unstick_player.py


Aussi

Vous pouvez trouver tous vos noms de fenêtres en utilisant ce script:

#!/usr/bin/python

import wnck

screen = wnck.screen_get_default()
screen.force_update()

for win in screen.get_windows():
    print win.get_name()
3
c0rp