Skrypt podnoszący jedno okno do przodu

8

W skrypcie próbuję znaleźć okno Terminal.app zawierające określone urządzenie tty i podnieść je do góry. Oto, co do tej pory mam w Applescript:

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

Utknąłem w części „podnoszenie okna”.

Oto kilka rzeczy, które nie są dokładnie tym, czego chcę:

set frontmost of theWin to true - przenosi to okno na przód grupy okien Terminal.app, ale nie podnosi go ponad inne okna.

tell application "Terminal" to activate- powoduje to, że każde okno terminala znajduje się na pierwszym planie w dużym stosie. Chcę tylko jedno okno.

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

To prawie robi, ale podnosi okno terminala do pozycji # 2, wciąż pod aktywnym oknem (jeśli aktywna aplikacja jest inna niż Terminal.app.)

click theSysWin at {10,50} - wydaje się, że nic nie robi.

click first static text of theSysWin - wydaje się, że nic nie robi.

Czy jest na to sposób? Nie musi być w Applescript.

EDYTUJ Znalazłem tę stronę internetową ( http://blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front/ ) cytując połączenie Obj-C / Cocoa:

SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly);

Nie znam ObjC ani Cocoa, a to (ostatecznie) jest wywoływane ze skryptu powłoki, więc nie jestem pewien, dokąd się udać.

gromadzenie się
źródło

Odpowiedzi:

5

open podnosi tylko jedno okno:

do shell script "open -a Terminal"

Innym sposobem na podniesienie okna jest ustawienie jego indeksu na 1, a następnie użycie 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
źródło
Chodzi mi o to, że kliknięcie okna ma pożądany efekt. Nie jestem pewien, dlaczego programowo byłoby to niemożliwe. Znalazłem tę stronę ( blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front ) z połączeniem Obj-C / Cocoa: SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly); Nie znam się zbyt dobrze na objc ani kakao żeby wiedzieć, dokąd się udać.
zatłoczenie
4

Możesz kliknąć elementy menu aplikacji, które nie są aktywne. Użyj go, aby kliknąć pozycję menu odpowiadającą oknu w menu Okno .

Oto, co musisz wstawić do skryptu:

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

Chociaż program nie aktywuje programu, okno jest na pierwszym planie.

Daniel Beck
źródło
Prawie! Podnosi okno ponad wszystkie inne okna Z WYJĄTKIEM najwyższego okna aktywnej aplikacji. Więc jeśli mam zmaksymalizowaną przeglądarkę internetową, czy coś takiego, nie ma to widocznego efektu: /
zatłoczenie
To rozwiązało problem, w którym miałem problem z tym, że „AXRaise” nie rozumie akcji „wykonaj” ...
ttt
2

Zdaję sobie sprawę, że ten wątek jest dość stary, ale natknąłem się na niego, walcząc z tym samym problemem i inni też mogą. O ile wiem, nie można tego zrobić w surowym AppleScript. Można to jednak zrobić w AppleScriptObjC. Aby użyć przykładu z @Daniel Beck, nowa wersja będzie taka.

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

Dodany kod będzie używał klasy NSWorkspace Cocoa do „uruchomienia” aplikacji, która skupia tylko pierwsze okno aplikacji na pierwszym planie. Aby uzyskać więcej informacji na temat procesu, który mnie do tego doprowadził, mam dokładniejszy opis na mojej stronie tutaj .

Tom Scogland
źródło
0

Oto kolejna próba, przetestowana na macOS High Sierra. Niestety działa to tylko wtedy, gdy dane okno znajduje się na bieżącym pulpicie! Interfejs API AppleScript do sterowania oknami wydaje się niekompletny, co uniemożliwia.

W przypadku użycia zastąp „Safari” i „WhatsApp”.

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

To jednak (widocznie) podnosi okna w dwóch krokach. Najpierw podnosi okno do górnej części okien aplikacji, a dopiero potem podnosi je do góry wszystkich okien. Nie idealny, ale funkcjonalny.

Brecht Machiels
źródło