¿Hay alguna manera de simular un evento "Cerrar" en varias ventanas usando el terminal?

15

Respondí en Preguntar a Ubuntu Salir de todas las instancias a gnome-terminaltravés de un comando, pero como todos ustedes pueden leer gnome-terminal, parece que no tengo una SIGllamada que pueda usar para simular este evento "Cerrar". Esto me llevó a preguntar, ¿hay alguna forma en GNOME / KDE / LXDE / {ponga su ventana / administrador de escritorio / entorno aquí} para simular el evento "Haga clic en el botón de cerrar"? He leído diferentes preguntas que podrían tener alguna relación con esto, pero no conteste esto.

Lo que estoy buscando es un mundial comando (si existe) para hacer esto en diferentes escenarios. Si no existe ninguno, explique cómo funciona el botón "Cerrar".

Posibles usos:

Braiam
fuente

Respuestas:

16

Creo que la página de manual relacionada es, XKillClient . Puede usar xdotoolpara simular el botón de cierre que se hace clic desde un terminal de esta manera.

Ejemplo

Suponiendo que tengo un gnome-terminalabierto y su nombre es "saml @ grinchy: / home".

  1. Obtenga la ID de la ventana

    $ xdotool search --name "saml@grinchy:/home"
    96488188
    
  2. Envíale un Alt+F4

    $ xdotool windowactivate --sync 96488188 key --clearmodifiers \
         --delay 100 alt+F4
    

Puede juntarlos incrustando el primer comando en el segundo:

$ xdotool windowactivate --sync $( ...1st command...) key --clearmodifiers \
         --delay 100 alt+F4

Puedes salvarte dejando xdotoolambas cosas al mismo tiempo:

$ xdotool search --name "saml@grinchy:~" key alt+f4

Globalmente

Puede adaptar lo que he proporcionado para ejecutarlo en ventanas que tienen el mismo nombre:

$ xdotool search --name "saml@grinchy:~"
96488779
96468996

O en ventanas por otros atributos. Puede utilizar xwininfopara obtener más información sobre una ventana en particular. Ejecútelo y luego haga clic en la ventana de interés:

$ xwininfo

xwininfo: Please select the window about which you
          would like information by clicking the
          mouse in that window.

xwininfo: Window id: 0x5c04d4b "saml@grinchy:~"

  Absolute upper-left X:  14
  Absolute upper-left Y:  74
  Relative upper-left X:  14
  Relative upper-left Y:  74
  Width: 941
  Height: 361
  Depth: 32
  Visual: 0x62
  Visual Class: TrueColor
  Border width: 0
  Class: InputOutput
  Colormap: 0x5c00003 (not installed)
  Bit Gravity State: NorthWestGravity
  Window Gravity State: NorthWestGravity
  Backing Store State: NotUseful
  Save Under State: no
  Map State: IsViewable
  Override Redirect State: no
  Corners:  +14+74  -485+74  -485-465  +14-465
  -geometry 132x24+14+74

Otras herramientas útiles cuando se trata con ventanas X11 son xdpyinfo& xprop. xdpyinfose puede usar para encontrar información sobre el servidor X. Para que pueda averiguar qué ventana tiene foco:

$ xdpyinfo |grep focus
focus:  window 0x5c00005, revert to Parent

xpropy xwininfopuede tomar un -idcambio para que pueda proporcionarles la ID de ventana que le interesa en lugar de tener que hacer clic en ella:

$ xprop -id 0x5c00001|grep -i class
WM_CLASS(STRING) = "gnome-terminal", "Gnome-terminal"

Referencias

slm
fuente
Creo que podemos simplificar aún más el uso xdotool search --name "saml@grinchy:~" key alt+f4, el problema es que no he encontrado cómo hacer esto con varias ventanas que tienen el mismo nombre ...
Braiam
@Braiam: ¿hay algo único en ellos? Cuando invocas la ventana, puedes decirle a GNOME cuáles quieres que sean los títulos.
slm
@Braiam - por ejemplo:wmctrl -r :ACTIVE: -N "MyWindowTitle
slm
1
Estoy tratando de usar el ejemplo proporcionado aquí para enviar el key alt+F4a todas las ventanas (si se puede cambiar el tamaño, ¿por qué no alt + F4), pero sin suerte. Y gracias: D.
Braiam
1
El mouse está sobrevalorado: /. Y resolví la pregunta, xdotool search --name "gedit|terminal|office" key --window %@ alt+F4buscaré cualquier ventana que tenga gedit, terminal u oficina en su nombre de título y enviaré el comando alt + F4.
Braiam
1

Me pareció xdotoolescamoso / con errores, a veces cierra la ventana de primer plano en lugar de la que debería estar cerrada. Esto parece deberse a la forma en que se envían las claves después de poner la ventana en primer plano en lugar de enviar directamente eventos de ventana, y es un problema muy molesto. Sugiero usarwmctrl , que cierra directamente una ventana sin enviar pulsaciones de teclas.

Puede cerrar una ventana directamente haciendo coincidir el nombre, por ejemplo, ambos cerrarán la ventana "Documento sin título 1 - gedit":

wmctrl -c "gedit"
wmctrl -c "Untitled"

Puede usar la -Fopción para considerar solo coincidencias exactas:

wmctrl -F -c "Untitled Document 1 - gedit"

O puede dar la identificación directamente:

wmctrl -i -c "121634821"

Se pueden encontrar más ejemplos de uso / documentación aquí .

Una cosa que encuentro muy útil es xdotoolla capacidad de esperar hasta que haya un resultado usando el --syncargumento. La combinación del comando dos en uno se hace así:

xdotool search --sync --name "gedit" | xargs wmctrl -i -c

Si está en una Mac, probablemente necesitará el -I{}parámetro:

xdotool search --sync --name "gedit" | xargs -I{} wmctrl -i -c {}

Si desea admitir varias ventanas, debe indicar xargsque llame wmctrlcon un máximo de 1 argumento cada vez con la -nopción. wmctrlno admite explícitamente múltiples ventanas como argumentos:

xdotool search --sync --name "gedit" | xargs -I{} -n 1 wmctrl -i -c {}

Esto esperará hasta que haya al menos 1 de esas ventanas y luego las cerrará todas.

jmiserez
fuente
¿Aparecerá el cuadro de diálogo del mensaje "¿estás seguro?"
Braiam
@Braiam Sí, lo acabo de probar. Solo si un programa se está ejecutando en el terminal (por ejemplo top), por supuesto, lo mismo que cuando se hace clic en el botón Cerrar.
jmiserez
Corrí xdotool search --sync --name "Software Updater" | xargs wmctrl -i -cen confianza, y empecé Software Updater. De ahora en adelante, el Actualizador de software no se muestra correctamente. Solo se muestra la barra de título. Reinstalar update-manager no ayudó.
jarno
Con gusto cerrar sesión y volver a la sesión de Xfce ayudó.
jarno
No puedo encontrar "gedit" con las utilidades xdotool o xprop. Solo es cierto para "gedit", puedo encontrar otros programas. El comando xdotool search --sync --name "gedit" no devuelve resultado. ¿Alguien puede ayudar? Ubuntu 17
Gonki
-1

pkill (1) debería ser lo que necesita.

schaiba
fuente
3
No, no simulará el evento "Cerrar" en ninguna de mis pruebas (abrir un gedit, LibreOffice y el terminal, escribir algo, enviar el comando), si uso el --signalinterruptor no es diferente de killo killall. Estoy esperando el ¿Quieres salvar? alerta.
Braiam el
Tienes razón, parece que leí mal tu pregunta.
schaiba