Como obter a entrada da GUI do usuário a partir de scripts BASH?

1

A partir de um script BASH, quero obter informações do usuário e alterar as configurações do sistema, em um loop. Eu tentei o cocoaDialog pela primeira vez, mas isso tem uma falha fatal: as caixas de diálogo estão sempre em cima de outras janelas.

Idealmente, eu poderia abrir uma caixa de diálogo com os botões "definir modo de suspensão" e "definir modo de espera" (para alternar as configurações "Impedir que o computador durma automaticamente quando a tela estiver desligada") e a caixa de diálogo / janela permaneceria quando os botões fossem pressionados. pressionado. No caso do cocoaDialog, tive que abrir uma nova caixa de diálogo cada vez que um botão era pressionado. Teria sido bom, mas, além do problema acima mencionado, colocar uma nova caixa de diálogo posiciona-a no meio da tela e não onde estava a antiga (e o cocoaDialog não tem argumentos de posicionamento para caixas de diálogo).

Alguém sabe de uma solução? Eu suspeito que o AppleScript funcionaria, mas é tão complexo e não consegui encontrar exemplos adequados que eu pudesse copiar / modificar.

Obrigado.

e40
fonte
@dayday esse post não ajuda. Eu quero algo amigável para Mac.
e40
Deseja apenas alternar as configurações de suspensão do Mac? Eu uso Caffein por faróis para isso (disponível na App Store). Lindo pequeno ícone da barra de menus e pronto!
agentroadkill 27/11/2015
@agentroadkill: A cafeína não funciona para mim porque isso apenas impede que a tela durma.
e40

Respostas:

1

Eu encontrei duas soluções. O melhor é o segundo.

Solução 1: use Tcl / Tk:

#! /usr/bin/env wish8.5
# Adapted from brilliant example here:
#   http://stackoverflow.com/questions/166231/tcl-tk-examples

package require Tk

proc main {} {
if {[lsearch -exact [font names] TkDefaultFont] == -1} {
    # older versions of Tk don't define this font, so pick something
    # suitable
    font create TkDefaultFont -family Helvetica -size 12
}
# in 8.5 we can use {*} but this will work in earlier versions
eval font create TkBoldFont [font actual TkDefaultFont] -weight bold

buildUI
}

proc buildUI {} {
frame .toolbar
scrollbar .vsb -command [list .t yview]
text .t \
    -width 80 -height 10 \
    -yscrollcommand [list .vsb set] \
    -highlightthickness 0
.t tag configure command -font TkBoldFont
.t tag configure error   -font TkDefaultFont -foreground firebrick
.t tag configure output  -font TkDefaultFont -foreground black

grid .toolbar -sticky nsew
grid .t .vsb  -sticky nsew
grid rowconfigure . 1 -weight 1
grid columnconfigure . 0 -weight 1

set i 0
foreach {label command} {
    awake     {prevent_computer_sleep}
    sleep     {allow_computer_sleep}
    status    {pmset -g | grep sleep}
} {
    button .b$i -text $label -command [list runCommand $command]
    pack .b$i -in .toolbar -side left
    incr i
}
}

proc output {type text} {
.t configure -state normal
.t insert end $text $type "\n"
.t see end
.t configure -state disabled
}

proc runCommand {cmd} {
output command $cmd
set f [open "| $cmd" r]
fconfigure $f -blocking false
fileevent $f readable  [list handleFileEvent $f]
}

proc closePipe {f} {
# turn blocking on so we can catch any errors
fconfigure $f -blocking true
if {[catch {close $f} err]} {
    output error $err
}
}

proc handleFileEvent {f} {
set status [catch { gets $f line } result]
if { $status != 0 } {
    # unexpected error
    output error $result
    closePipe $f

} elseif { $result >= 0 } {
    # we got some output
    output normal $line

} elseif { [eof $f] } {
    # End of file
    closePipe $f

} elseif { [fblocked $f] } {
    # Read blocked, so do nothing
}
}

main

onde prevent_computer_sleep apenas faz sudo pmset sleep 0e allow_computer_sleep faz sudo pmset sleep 1.

Solução 2: modifique o KeepingYouAwake para usar o sistema em suspensão e não exibir suspensão: o meu fork do KeepingYouAwake .

e40
fonte