Intenté usar el wmctrl
comando de alternar, pero no funcionó en mi configuración de Ubuntu. La palanca se activaría, pero no se desactivaría. (Creo que podría ser porque estoy usando el entorno de escritorio gnome, en el que wmctrl
AFAIK está ligeramente roto).
De todos modos, después de mucha investigación y averiguar cómo escribir el código adecuado en bash, creé un solo comando que usa los wmctrl
comandos dentro de una capa de lógica para alternar el estado 'siempre en la parte superior' de manera efectiva en el escritorio actual de GNOME. Publiqué esta respuesta en Ask Unix / Linux, pero pensé en publicarla aquí también en caso de que alguien tuviera el mismo problema.
Aquí está el comando:
bash -c 'wmctrl -r :ACTIVE: -b $([[ $(xprop -id $(xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}") _NET_WM_STATE) =~ "ABOVE" ]] && echo "remove" || echo "add"),above'
Comprueba la propiedad de estado de la ventana activa "_NET_WM_STATE" utilizando xprops
, y si contiene el texto "ARRIBA", significa que la opción 'siempre en la parte superior' está activa. Luego simplemente ejecuta el wmctrl
comando con el parámetro add
o remove
según corresponda.
Desglose de comandos (cada comando se inserta en el siguiente, reemplazando el ■
marcador de posición):
Obtener ID de ventana activa:
xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}"
Obtenga el estado de la ventana al xprop
usar la identificación:
xprop -id $(■) _NET_WM_STATE
Compruebe si el estado contiene "ARRIBA", lo que indica que la ventana está configurada como "siempre arriba":
[[ $(■) =~ "ABOVE" ]]
Devuelve "remove" si es verdadero, de lo contrario devuelve "add":
■ && echo "remove" || echo "add"
Ejecute el wmctrl
comando utilizando el valor devuelto como parámetro:
wmctrl -r :ACTIVE: -b $(■),above
Envíe todo para bash
que pueda usar la sustitución de comandos ${ ... }
, la evaluación booleana de bash [[ ... ]]
y el operador de coincidencia de expresiones regulares =~
:
bash -c '■'
Este último paso en particular me llevó mucho tiempo resolverlo. Hasta que me di cuenta de que los atajos de teclado no se ejecutaban en bash de forma predeterminada, no tenía idea de por qué los comandos funcionaban en la consola mientras los probaba, pero fallaban silenciosamente cuando se ejecutaban directamente como atajos de teclado. ¡Me llevó por la pared por siglos!
Nota: debido a que necesita comillas alrededor del comando que está enviando a bash, tuve que tener cuidado al escribir el comando de que nunca fui más de un nivel más profundo (usando comillas dobles). Cualquier anidamiento adicional de cadenas entre comillas habría requerido muchas barras invertidas confusas para escapar de las comillas.