Existe uma maneira de exibir a saída AppleScript na barra de menus?

8

Antes de ler mais: conheço os programas de mordomo e similares. Estou procurando uma maneira INCORPORADA de fazer isso sem um aplicativo de terceiros.

Enfim, escrevi um AppleScript que executa um comando shell. Quero exibir essa saída na barra de menus na parte superior ... sem Butler, como posso fazer isso?

FALL3N
fonte
Como o AppleScriptObjC faz parte do macOS (2014), é possível usar sua estrutura "Foundation" (incluindo os métodos do NSMenu) para alcançar o que provavelmente não era possível em 2012.. . . . . Veja minha resposta abaixo em Como fazer!
clemsam lang

Respostas:

2

Como uma generalidade, sem um programa de terceiros, como o Growl, não há como criar isso.

No entanto, você pode escrever um script ou outro programa como o que encontrei aqui que fornece o serviço de menu para você. Tenho certeza de que a integração do Growl seria muito mais fácil de realizar.

Stu Wilson
fonte
1

Não há uma maneira integrada de fazer isso no OS X. No entanto, usando o Growl , você pode receber notificações. Aqui está um exemplo de script para isso:

--Make sure Growl is running
tell application "System Events"
    set isRunning to (count of (every process whose bundle identifier is "com.Growl.GrowlHelperApp")) > 0
end tell

if isRunning then
    tell application id "com.Growl.GrowlHelperApp"
        set the allNotificationsList to ¬
            {"Test Notification", "Another Test Notification"}
        --Notifications can be enabled in System Preferences>Growl>Applications>Display Options
        set the enabledNotificationsList to ¬
            {"Test Notification"}
        register as application ¬
            "Growl AppleScript Sample" all notifications allNotificationsList ¬
            default notifications enabledNotificationsList ¬
                    -- Set the icon. You can use any icon from any application
            icon of application "AppleScript Editor"

        notify with name ¬
            "Test Notification" title ¬
            "Test Notification" description ¬
            "This is a test AppleScript notification." application name "Growl AppleScript Sample"

        notify with name ¬
            "Another Test Notification" title ¬
            "Another Test Notification :) " description ¬
            "Alas — you won't see me until you enable me..." application name "Growl AppleScript Sample"

    end tell
end if

Isso deve exibir isso:

E se você tiver a outra notificação ativada também:

Técnicas mais avançadas são descritas aqui.

daviesgeek
fonte
1

Como o AppleScriptObjC faz parte do macOS, é possível usar sua estrutura "Foundation" (incluindo os métodos do NSMenu) para alcançar o que provavelmente não era possível em 2012.

Encontrei um script interessante para criar menus personalizados no AppleScript; disso extraí o código adequado para colocar o texto na barra de menus do macOS . De fato, ele usa apenas o "título" de um menu para inserir algum conteúdo.

Para demonstrar isso, implementei um script de diálogo muito básico que solicita aos usuários a entrada de texto (aguardando 6 segundos), que é exibida temporariamente na barra de menus (5 segundos).
Aqui está:

use framework "Foundation"
use framework "AppKit"
use scripting additions
property StatusItem : missing value
property newMenu : class "NSMenu"

display dialog "Write something:" default answer "" giving up after 6
set myText to text returned of the result
if myText is "" then set myText to "TOOOOO slow … try again !"
set myText to ">>    " & myText & "    <<"

set bar to current application's NSStatusBar's systemStatusBar
set StatusItem to bar's statusItemWithLength:-1.0
StatusItem's setTitle:myText
set newMenu to current application's NSMenu's alloc()'s initWithTitle:"Custom"
StatusItem's setMenu:newMenu

delay 5
current application's NSStatusBar's systemStatusBar()'s ¬
        removeStatusItem:StatusItem  

Esse código AppleScript pode ser usado em qualquer script seu. (A parte "diálogo" é opcional ...)

user3439894 ajudou a fechar meu "menu", veja a última linha do script. Muito obrigado!

clemsam lang
fonte
Por acaso, você tem um link para o código-fonte original do qual você obteve sua resposta? Seria bom ver. Obrigado.
user3439894
11
Sim - é no último manipulador da resposta aceita a esta questão: /programming/29168474/creating-a-simple-menubar-app-using-applescript. . . . . Receio, porém, que minha última linha (que funciona metade do tempo) que encontrei em outro lugar - e adaptada - NÃO esteja correta . . . . . . Como não sou programador, preciso de mais tempo para entender o código.
clemsam lang
11
BTW É uma resposta agradável e, se não fosse por "travou algumas vezes - por causa de" dealloc () "?" Eu teria +1. No entanto, um pouco de reflexão ... se você usar esse código como um aplicativo AppleScriptObjC independente, talvez seja melhor, isso StatusItem's dealloc()só será aplicável ao aplicativo AppleScriptObjC e não ao Editor de scripts e ao travá-lo acidentalmente.
user3439894
FWIW A primeira set myText to ...linha de código , o display dialog comando anterior realmente não faz nada com base no código resultante e, portanto, não é de todo necessário. Em outras palavras, o único utilizado valor de myTexté o que é atribuído após o display dialog comando é executado e por defini-la para qualquer coisa antes do o display dialog comando não é utilizada codificação e não é necessário no contexto do código atualmente apresentada.
user3439894
11
Em vez de StatusItem's dealloc()ou StatusItem's setTitle:""eu usaria:current application's NSStatusBar's systemStatusBar()'s removeStatusItem:StatusItem
user3439894