Skip to content

Commit 317d01f

Browse files
authored
Merge pull request #179 from httpsphl/fix/desktop-stop-key
fix(desktop): stop every bot with Ctrl+Alt+Esc, which every keyboard has
2 parents 590b2e5 + fcd16f9 commit 317d01f

8 files changed

Lines changed: 12 additions & 10 deletions

File tree

‎app/src/i18n/en/desktop.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export const desktop = {
3131
stoppedBody: (bot: string) => `${bot} cannot read or use your apps until you let it go on.`,
3232
emptyTitle: (bot: string) => `${bot} has not used your desktop yet`,
3333
emptyBody: "When it reads or uses a window of an app you allowed, the window shows here, live.",
34-
shortcut: "Ctrl+Alt+End stops every bot on your desktop, even with Botloft closed.",
34+
shortcut: "Ctrl+Alt+Esc stops every bot on your desktop, even with Botloft closed.",
3535
waiting: "Waiting for the picture…",
3636
read: "Read the window",
3737
click: (target: string) => `Clicked "${target}"`,

‎app/src/i18n/es/desktop.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export const desktop: Messages["desktop"] = {
3232
emptyBody:
3333
"Cuando lea o use una ventana de una app que permitiste, la ventana aparece aquí, en vivo.",
3434
shortcut:
35-
"Ctrl+Alt+Fin detiene a todos los bots en tu escritorio, incluso con Botloft cerrado.",
35+
"Ctrl+Alt+Esc detiene a todos los bots en tu escritorio, incluso con Botloft cerrado.",
3636
waiting: "Esperando la imagen…",
3737
read: "Leyó la ventana",
3838
click: (target) => `Hizo clic en "${target}"`,

‎app/src/i18n/pt-BR/desktop.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export const desktop: Messages["desktop"] = {
3131
emptyTitle: (bot) => `${bot} ainda não usou seu desktop`,
3232
emptyBody:
3333
"Quando ele ler ou usar uma janela de um app que você liberou, a janela aparece aqui, ao vivo.",
34-
shortcut: "Ctrl+Alt+End para todos os bots no seu desktop, mesmo com o Botloft fechado.",
34+
shortcut: "Ctrl+Alt+Esc para todos os bots no seu desktop, mesmo com o Botloft fechado.",
3535
waiting: "Esperando a imagem…",
3636
read: "Leu a janela",
3737
click: (target) => `Clicou em "${target}"`,

‎crates/botloftd/src/main.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ fn run(paths: Paths, config: Config, config_path: PathBuf, scheduled: bool) -> a
137137
});
138138
// No bot process survived the last run, so nobody waits for these.
139139
approvals::expire_all(&daemon);
140-
// Ctrl+Alt+End stops every bot on the desktop, app open or not (spec 24.9).
140+
// Ctrl+Alt+Esc stops every bot on the desktop, app open or not (spec 24.9).
141141
let stopping = Arc::clone(&daemon);
142142
match platform::desktop::on_stop_key(move || botloftd::service::desktop::stop_all(&stopping)) {
143143
Ok(()) | Err(platform::desktop::DesktopError::Unavailable) => {}

‎crates/botloftd/src/platform/desktop/keys.rs‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ mod tests {
139139
"Alt+Tab",
140140
"Alt+Shift+Tab",
141141
"Alt+Esc",
142+
// The owner's own key to stop every bot (spec 24.9).
143+
"Ctrl+Alt+Esc",
142144
"Ctrl+Esc",
143145
"Ctrl+Alt+Delete",
144146
"Ctrl+Alt+Del",

‎crates/botloftd/src/platform/desktop/mod.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ pub fn windows() -> Result<Vec<Window>, DesktopError> {
150150
}
151151
}
152152

153-
/// Calls `stop` each time the owner presses Ctrl+Alt+End, from now on
153+
/// Calls `stop` each time the owner presses Ctrl+Alt+Esc, from now on
154154
/// (spec 24.9). Refused when another program holds the shortcut.
155155
pub fn on_stop_key(stop: impl Fn() + Send + 'static) -> Result<(), DesktopError> {
156156
#[cfg(windows)]

‎crates/botloftd/src/platform/desktop/windows/stop_key.rs‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
//! The shortcut that stops every bot on the desktop, Ctrl+Alt+End (spec
1+
//! The shortcut that stops every bot on the desktop, Ctrl+Alt+Esc (spec
22
//! 24.9): registered for the whole session on a thread of its own, so it
33
//! works with the app closed.
44
55
use std::sync::mpsc;
66

77
use windows::Win32::UI::Input::KeyboardAndMouse::{
8-
MOD_ALT, MOD_CONTROL, MOD_NOREPEAT, RegisterHotKey, VK_END,
8+
MOD_ALT, MOD_CONTROL, MOD_NOREPEAT, RegisterHotKey, VK_ESCAPE,
99
};
1010
use windows::Win32::UI::WindowsAndMessaging::{GetMessageW, MSG, WM_HOTKEY};
1111

@@ -27,7 +27,7 @@ pub fn on_stop_key(stop: impl Fn() + Send + 'static) -> Result<(), DesktopError>
2727
None,
2828
STOP,
2929
MOD_CONTROL | MOD_ALT | MOD_NOREPEAT,
30-
u32::from(VK_END.0),
30+
u32::from(VK_ESCAPE.0),
3131
)
3232
};
3333
let ok = held.is_ok();

‎docs/spec.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1760,11 +1760,11 @@ No servidor `botloft` (11), como as do navegador.
17601760

17611761
### 24.9 App
17621762

1763-
- **Painel "Desktop"** ao lado do chat, o quarto lugar do dock do computador do bot (navegador, terminal, arquivos e desktop, 15.1), com a mesma largura: a foto ao vivo da janela que o bot leu ou em que agiu por último, sobre a mesa na cor do bot, o nome do app e o título da janela, e a linha do que ele acabou de fazer, no idioma do dono ("Clicou em "Save"", "Escreveu em "Nome"", "Escolheu "Large"", "Leu a janela"). No cabeçalho, "Ao vivo" com a foto chegando e **Parar**; parado, o selo "Parado" e um aviso com **Deixar continuar**. Sem janela ainda, o painel explica que ela aparece ali quando o bot ler ou usar um app liberado. Embaixo, a dica do atalho Ctrl+Alt+End. As linhas das tools `desktop_*` no chat têm o botão de tela que abre o painel, como as do navegador abrem o dele.
1763+
- **Painel "Desktop"** ao lado do chat, o quarto lugar do dock do computador do bot (navegador, terminal, arquivos e desktop, 15.1), com a mesma largura: a foto ao vivo da janela que o bot leu ou em que agiu por último, sobre a mesa na cor do bot, o nome do app e o título da janela, e a linha do que ele acabou de fazer, no idioma do dono ("Clicou em "Save"", "Escreveu em "Nome"", "Escolheu "Large"", "Leu a janela"). No cabeçalho, "Ao vivo" com a foto chegando e **Parar**; parado, o selo "Parado" e um aviso com **Deixar continuar**. Sem janela ainda, o painel explica que ela aparece ali quando o bot ler ou usar um app liberado. Embaixo, a dica do atalho Ctrl+Alt+Esc. As linhas das tools `desktop_*` no chat têm o botão de tela que abre o painel, como as do navegador abrem o dele.
17641764
- **O que o daemon guarda** (`DesktopState`, em memória, por bot): a janela (`id`, título, app), a última ação (`DesktopAction`: clicar, escrever, escolher ou rolar, o nome do controle e a opção escolhida; nada depois de só ler), que o app diz no idioma do dono, quando foi, e se o dono o parou. Cada leitura, foto ou ação o atualiza e sai a notificação `desktop.changed` para todos os apps.
17651765
- **Foto ao vivo:** `desktop.watch {botId}` devolve o estado e a foto mais nova (`DesktopView`) e, enquanto alguma conexão assiste aquele bot, o daemon fotografa a janela dele quatro vezes por segundo (`PrintWindow`, como `desktop_screenshot`) e manda `desktop.frame` só quando a foto mudou, só para quem assiste, como os quadros do navegador (21.7): um app lento recebe a mais nova. Quando a última conexão para (`desktop.unwatch`, outro `desktop.watch` ou a conexão caindo), as fotos param.
17661766
- **Parar:** `desktop.stop {botId}` marca o bot como parado e `desktop.resume {botId}` o deixa continuar; os dois devolvem o `DesktopState`. Parado, toda tool `desktop_*` dele recusa, de novo depois de esperar o dono ou a vez no desktop, com o aviso de que o dono o parou e que ele deve contar no chat o que fazia. Uma ação já em andamento termina (ela dura no máximo 5 s, 24.5). Parado fica até o dono deixar continuar. Isso vive na memória: um daemon que reinicia começa com ninguém parado.
1767-
- **Parar tudo:** o atalho global `Ctrl+Alt+End`, que o daemon registra ao subir (`RegisterHotKey` num thread com fila própria, `MOD_NOREPEAT`), para todos os bots no desktop, mesmo com o app fechado. Se outro programa já tem o atalho (outro daemon do Botloft, de dev, por exemplo), o daemon avisa no log e segue sem ele.
1767+
- **Parar tudo:** o atalho global `Ctrl+Alt+Esc`, que o daemon registra ao subir (`RegisterHotKey` num thread com fila própria, `MOD_NOREPEAT`), para todos os bots no desktop, mesmo com o app fechado. Esc está em todo teclado, até nos compactos (60% e 70% não têm End), e o Windows não usa Ctrl+Alt+Esc (os dele são Ctrl+Shift+Esc, Alt+Esc e Ctrl+Esc); um bot não o aperta, porque Alt+Esc está entre as teclas do sistema (24.7). Se outro programa já tem o atalho (outro daemon do Botloft, de dev, por exemplo), o daemon avisa no log e segue sem ele.
17681768
- O cartão de permissão no chat (24.2) diz "<bot> quer ver <app>" com o ícone de tela, o porquê do bot ("<bot> diz: ..."), o caminho do executável e o que ver deixa fazer (ler as janelas do app e fotografá-las com o dono no computador, nunca senhas, e onde tirar). Respondido, vira uma linha: "<bot> pode ver <app>", "<bot> não pode ver <app>" com a nota, ou sem resposta. As tools `desktop_*` aparecem no chat com o ícone de tela e o porquê como resumo.
17691769

17701770
### 24.10 Permissões no app

0 commit comments

Comments
 (0)