.png)
En Unity, presionar Super+ 1para 9iniciar o cambiar el foco a una aplicación. ¿Puedo asignar un atajo de teclado con una propiedad similar en Lubuntu (es decir, en LXDE)?
Más precisamente, ¿puedo configurar un acceso directo de modo que, si la aplicación ya está abierta, el foco cambie a ella y el espacio de trabajo cambie en consecuencia (como en Unity)? Hasta ahora sólo he logrado asignar un acceso directo que inicia (una nueva instancia de) la aplicación.
Respuesta1
Openbox (el administrador de ventanas de LXDE) no tiene una funcionalidad incorporada para esto, pero con un poco de ayuda dexdotoolpodemos escribir un script que pueda replicar e incluso mejorar el comportamiento de Unity.
Primero, asegúrese de tener xdotool instalado:
sudo apt-get install xdotool
Guarde el siguiente script como focus_or_launch
y hágalo ejecutable:
#!/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
Así es como funciona el script: cuando ejecute focus_or_launch application
xdotool buscará instancias existentes de la aplicación y enfocará una de ellas. Si no se encuentra ninguna instancia, el script iniciará una nueva.
Para integrar este script con su sesión de escritorio, edite su archivo de configuración de Openbox (por ejemplo ~/.config/openbox/lxde-rc.xml
, ../lubuntu-rc.xml
o ../rc.xml
) y agregue una sección similar a la siguiente para cada aplicación que desee controlar:
<keybind key="W-g">
<action name="Execute">
<command>focus_or_launch gedit</command>
</action>
</keybind>
Asegúrese de reemplazar focus_or_launch
con la ruta al script en su sistema o, alternativamente, copie el script a su archivo $PATH
.
Si no desea que el script inicie una nueva instancia de aplicación, simplemente elimine la siguiente sección:
"$Executable" > /dev/null 2>&1 &
disown
PD: Este script debería funcionar en todos los entornos de escritorio compatibles con xdotool (por ejemplo, Unity, GNOME, XFCE...)