Script para elevar una sola ventana al frente

8

En un script, estoy tratando de encontrar la ventana Terminal.app que contiene un dispositivo tty específico y subir esa ventana a la parte superior. Esto es lo que tengo en Applescript hasta ahora:

tell application "System Events"
  set foundWin to false
  if (name of processes) contains "Terminal" then
    tell application "Terminal"
      set theTabs to first tab of every window where tty is "$(tty)"
      repeat with theTab in theTabs
        if class of theTab is tab then
          set theWin to (first window whose tabs contains theTab)
          set selected tab of theWin to theTab
          set foundWin to true
        end if
      end repeat
    end tell
  end if
  if foundWin then
    --RAISE THE WINDOW?!
  end if
end tell

Donde me estoy atorando es la parte de "elevar la ventana".

Aquí hay algunas cosas que no son exactamente lo que quiero:

set frontmost of theWin to true - Esto lleva la ventana al frente del grupo de ventanas Terminal.app pero no la eleva por encima de ninguna otra ventana.

tell application "Terminal" to activate- Esto trae todas las ventanas de Terminal al frente en una gran pila. Solo quiero la única ventana.

tell application "System Events"
    set theSysWin to first window of process "Terminal" whose name is (name of theWin)
    perform action "AXRaise" of theSysWin
end tell

Esto casi lo hace, pero lo que hace es elevar la ventana de terminal a la posición n. ° 2, aún debajo de la ventana activa (si la aplicación activa no es Terminal.app).

click theSysWin at {10,50} - No parece hacer nada.

click first static text of theSysWin - No parece hacer nada.

¿Hay alguna forma de hacer esto? No tiene que estar en Applescript.

EDITAR Encontré esta página web ( http://blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front/ ) citando una llamada de Obj-C / Cocoa:

SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly);

No estoy familiarizado con ObjC o Cocoa, y esto (en última instancia) se invoca desde un script de shell, por lo que no estoy seguro de a dónde ir desde allí.

apiñamiento
fuente

Respuestas:

5

open solo levanta una sola ventana:

do shell script "open -a Terminal"

Otra forma de elevar una ventana es establecer su índice en 1 y luego usar AXRaise:

tell application "Terminal"
    set index of window 2 to 1
end tell
tell application "System Events" to tell process "Terminal"
    perform action "AXRaise" of window 1
end tell
Lri
fuente
Quiero decir, hacer clic en la ventana tiene el efecto deseado. Entonces no estoy seguro de por qué sería imposible programáticamente. Encontré esta página web ( blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front ) con Obj-C / Cocoa call: SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly); no estoy lo suficientemente familiarizado con objc o cocoa sin embargo, saber a dónde ir desde allí.
hacinamiento
4

Puede hacer clic en los elementos del menú de aplicaciones que no están activas. Úselo para hacer clic en el elemento de menú correspondiente a la ventana en el menú Ventana .

Esto es lo que necesita insertar en su script:

tell application "System Events"
    tell application process "Terminal"
        click menu item (name of theWin) of menu of menu bar item "Window" of menu bar 1
    end tell
end tell

Si bien no activa el programa, la ventana está en primer plano.

Daniel Beck
fuente
¡Casi! Eleva la ventana por encima de todas las demás ventanas EXCEPTO la ventana superior de la aplicación activa. Entonces, si tengo un navegador web maximizado o algo así, no tiene un efecto visible: /
hacinamiento
Esto resolvió el problema que tenía cuando recibía un error con "AXRaise" sin entender la acción "realizar" ...
ttt
2

Me doy cuenta de que este hilo es bastante antiguo, pero lo encontré mientras luchaba contra el mismo problema y otros también pueden hacerlo. Por lo que puedo decir, no se puede hacer en AppleScript sin formato. Sin embargo, se puede hacer en AppleScriptObjC. Para usar el ejemplo de @Daniel Beck, la nueva versión sería así.

property NSWorkspace : class "NSWorkspace"
set workspace to NSWorkspace's sharedWorkspace()
tell application "System Events"
    tell application process "Terminal"
        click menu item (name of theWin) of menu of menu bar item "Window" of menu bar 1
        workspace's launchApplication_("Terminal")
    end tell
end tell

El código agregado utilizará la clase NSWorkspace de Cocoa para "iniciar" la aplicación, lo que eleva solo la ventana frontal de esa aplicación hacia el frente con foco. Para obtener más detalles sobre el proceso que me llevó a esto, tengo una descripción más detallada en mi sitio web aquí .

Tom Scogland
fuente
0

Aquí hay otro intento, probado en macOS High Sierra. ¡Ay, esto solo funciona cuando la ventana dada está en el escritorio actual! La API de AppleScript para controlar ventanas parece estar incompleta, lo que hace que esto sea imposible.

Sustituya "Safari" y "WhatsApp" por su caso de uso.

tell application "System Events"
    tell process "Safari"
        try
            set theWindow to (first window whose name contains "WhatsApp")
            perform action "AXRaise" of theWindow
            do shell script "open -a Safari"
        end try
    end tell
end tell

Sin embargo, esto (visiblemente) eleva las ventanas en dos pasos. Primero eleva la ventana a la parte superior de las ventanas de la aplicación, y solo entonces la eleva a la parte superior de todas las ventanas. No perfecto, pero funcional.

Brecht Machiels
fuente