Script para elevar uma única janela para a frente

8

Em um script, estou tentando encontrar a janela Terminal.app que contém um dispositivo tty específico e elevar essa janela para o topo. Aqui está o que eu tenho no Applescript até agora:

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

Onde estou ficando preso é a parte "levantando a janela".

Aqui estão algumas coisas que não são exatamente o que eu quero:

set frontmost of theWin to true - isso leva a janela para a frente do grupo de janelas Terminal.app, mas não a eleva acima de outras janelas.

tell application "Terminal" to activate- isso traz todas as janelas do Terminal para a frente em uma grande pilha. Eu só quero a uma janela.

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

Isso quase faz, mas o que faz é elevar a janela do terminal para a posição # 2, ainda abaixo da janela ativa (se o aplicativo ativo for algo diferente de Terminal.app.)

click theSysWin at {10,50} - parece não fazer nada.

click first static text of theSysWin - parece não fazer nada.

Existe uma maneira de fazer isso? Não precisa estar no Applescript.

EDIT Encontrei esta página da web ( http://blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front/ ) citando uma chamada Obj-C / Cocoa:

SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly);

Eu não estou familiarizado com ObjC ou Cocoa, e isso é (em última instância) sendo invocado a partir de um script de shell, portanto, não tenho certeza para onde ir a partir daí.

aglomeração
fonte

Respostas:

5

open apenas gera uma única janela:

do shell script "open -a Terminal"

Outra maneira de aumentar uma janela é definir seu índice como 1 e usar o 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
fonte
Quero dizer, clicar na janela tem o efeito desejado. Portanto, não sei por que seria impossível programaticamente. Encontrei esta página da web ( blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front ) com a chamada Obj-C / Cocoa: SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly); não estou familiarizado o suficiente com objc ou cacau para saber para onde ir a partir daí.
aglomerando
3

Você pode clicar nos itens de menu de aplicativos que não estão ativos. Use-o para clicar no item de menu correspondente à janela no menu Janela .

Isto é o que você precisa inserir no seu 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

Embora não ative o programa, a janela está na frente.

Daniel Beck
fonte
Quase! Ele eleva a janela acima de todas as outras janelas, EXCETO a janela superior do aplicativo ativo. Portanto, se eu tenho um navegador maximizado ou algo assim, ele não tem um efeito visível: /
crowding
2

Sei que esse segmento é bastante antigo, mas eu o encontrei enquanto lutava contra o mesmo problema e outros podem também. Tanto quanto eu posso dizer, isso não pode ser feito em AppleScript bruto. No entanto, isso pode ser feito em AppleScriptObjC. Para usar o exemplo de @Daniel Beck, a nova versão seria assim.

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

O código adicionado usará a classe NSWorkspace da Cocoa para "iniciar" o aplicativo, o que eleva apenas a janela da frente do aplicativo para a frente com foco. Para obter mais detalhes sobre o processo que me levou a isso, tenho um artigo mais completo no meu site aqui .

Tom Scogland
fonte
0

Aqui está outra tentativa, testada no macOS High Sierra. Infelizmente, isso só funciona quando a janela especificada está na área de trabalho atual! A API AppleScript para controlar as janelas parece estar incompleta, tornando isso impossível.

Substitua "Safari" e "WhatsApp" pelo seu 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

Isso (visivelmente) eleva as janelas em duas etapas, no entanto. Primeiro, ele eleva a janela para o topo das janelas do aplicativo e somente depois para o topo de todas as janelas. Não é perfeito, mas funcional.

Brecht Machiels
fonte