web-dev-qa-db-fra.com

Raccourci clavier "Application Focus" dans Lubuntu (LXDE)

En unité, en appuyant sur Super + 1 à 9 lance ou passe le focus à une application. Puis-je attribuer un raccourci clavier avec une propriété similaire dans Lubuntu (c'est-à-dire dans LXDE)?

Plus précisément, puis-je configurer un raccourci tel que si l'application est déjà ouverte, le focus est activé et que l'espace de travail change en conséquence (comme dans Unity)? Jusqu'à présent, j'ai seulement réussi à attribuer un raccourci qui lance (une nouvelle instance de) l'application.

7
DustByte

Openbox (gestionnaire de fenêtres de LXDE) ne possède pas de fonctionnalité intégrée pour cela, mais avec un peu d'aide de xdotool , nous pouvons écrire un script qui peut répliquer et même améliorer le comportement de Unity.

Tout d’abord, assurez-vous que xdotool est installé:

Sudo apt-get install xdotool

Enregistrez le script suivant sous le nom focus_or_launch et exécutez-le:

 #!/bin/bash

# NAME:         focus_or_launch
# VERSION:      0.4
# AUTHOR:       (c) 2014 Glutanimate <https://github.com/Glutanimate/>
#
# DESCRIPTION:  Focus existing app window or launch application if no
#               window found
#
#               Simplified version of a script by Henning Bekel
#               (https://bbs.archlinux.org/viewtopic.php?pid=625009#p625009)
#
# DEPENDENCIES: xdotool
#
# LICENSE:      GNU GPLv3 (http://www.gnu.de/documents/gpl-3.0.en.html)
#
# NOTICE:       THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. 
#               EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 
#               PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR 
#               IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 
#               AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND 
#               PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE,
#               YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
#
#               IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY 
#               COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS 
#               PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, 
#               INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE 
#               THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED 
#               INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE 
#               PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER 
#               PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
#
# USAGE:        focus_or_launch <command>
# EXAMPLE:      focus_or_launch google-chrome


############# GLOBVAR/PREP ###############

Executable="$1"
ExecutableBase="$(basename "$Executable")"
Usage="\
Usage: $(basename $0) command
E.g.:  $(basename $0) google-chrome\
"

############## USGCHECKS #################

if [[ $# -ne 1 || "$1" =~ ^(-h|--help)$ ]]; then
  echo "$Usage"
  exit 1
fi

################ MAIN ####################

MostRecentWID="$(xdotool search --class --name "$ExecutableBase" | tail -1 2> /dev/null)"

if [[ -z "$MostRecentWID" ]]; then
  echo "$ExecutableBase not found. Launching new window."
  "$Executable" > /dev/null 2>&1 &
  disown
else
  echo "Focusing existing instance of $ExecutableBase."
  # use brute-force approach if activating most recent WID doesn't work
  xdotool windowactivate "$MostRecentWID" 2>&1 | grep failed \
  && xdotool search --class --name "$ExecutableBase" windowactivate %@
fi

Voici comment fonctionne le script: Lorsque vous exécutez focus_or_launch application, xdotool recherchera les instances existantes de l'application et en ciblera une. Si aucune instance n'est trouvée, le script en lancera une nouvelle.

Pour intégrer ce script à votre session de bureau, éditez votre fichier de configuration openbox (par exemple, ~/.config/openbox/lxde-rc.xml, ../lubuntu-rc.xml ou ../rc.xml) et ajoutez une section semblable à la suivante pour chaque application à contrôler:

<keybind key="W-g">
  <action name="Execute">
    <command>focus_or_launch gedit</command>
  </action>
</keybind>

Assurez-vous de remplacer focus_or_launch par le chemin du script sur votre système ou copiez le script sur votre $PATH.

Si vous ne voulez pas que le script lance une nouvelle instance d'application, supprimez simplement la section suivante:

"$Executable" > /dev/null 2>&1 &
disown

P.S .: Ce script devrait fonctionner sur tous les environnements de bureau compatibles xdotool (par exemple, Unity, GNOME, XFCE, etc.).

8
Glutanimate