From: John Benediktsson Date: Mon, 29 Mar 2021 21:35:41 +0000 (-0700) Subject: ui: better platform-specific keybindings. X-Git-Tag: 0.99~2362 X-Git-Url: https://gitweb.factorcode.org/gitweb.cgi?p=factor.git;a=commitdiff_plain;h=d3a35c26ce41d2b861c489cd6454826c48495214 ui: better platform-specific keybindings. Some major changes include on macOS we pass M+ for Command and A+ for Option, which matches some of the documentation, but now requires us to have some OS-specific code in the define-command-map usage. --- diff --git a/basis/ui/backend/cocoa/views/views.factor b/basis/ui/backend/cocoa/views/views.factor index 820b4831dd..fb33261b32 100644 --- a/basis/ui/backend/cocoa/views/views.factor +++ b/basis/ui/backend/cocoa/views/views.factor @@ -43,8 +43,8 @@ CONSTANT: NSFunctionKeyMask 0x800000 CONSTANT: modifiers { { S+ $ NSShiftKeyMask } { C+ $ NSControlKeyMask } - { A+ $ NSCommandKeyMask } - { M+ $ NSAlternateKeyMask } + { M+ $ NSCommandKeyMask } + { A+ $ NSAlternateKeyMask } } CONSTANT: key-codes diff --git a/basis/ui/commands/commands-tests.factor b/basis/ui/commands/commands-tests.factor index 48009fb7b4..4d62339bd1 100644 --- a/basis/ui/commands/commands-tests.factor +++ b/basis/ui/commands/commands-tests.factor @@ -23,19 +23,19 @@ testing "testing" "hey" { } define-command-map os macosx? [ - [ "⌘A" ] [ T{ key-down f { A+ } "a" } gesture>string ] unit-test - [ "B" ] [ T{ key-down f f "b" } gesture>string ] unit-test + { "⌘A" } [ T{ key-down f { M+ } "a" } gesture>string ] unit-test + { "B" } [ T{ key-down f f "b" } gesture>string ] unit-test - [ "⌃X" ] [ + { "⌃X" } [ [ { $command testing "testing" com-test-1 } print-element ] with-string-writer ] unit-test ] [ - [ "A+a" ] [ T{ key-down f { A+ } "a" } gesture>string ] unit-test - [ "b" ] [ T{ key-down f f "b" } gesture>string ] unit-test + { "A+a" } [ T{ key-down f { A+ } "a" } gesture>string ] unit-test + { "b" } [ T{ key-down f f "b" } gesture>string ] unit-test - [ "C+x" ] [ + { "C+x" } [ [ { $command testing "testing" com-test-1 } print-element ] with-string-writer diff --git a/basis/ui/gadgets/editors/editors.factor b/basis/ui/gadgets/editors/editors.factor index ddde9d5a6f..9bdc25b529 100644 --- a/basis/ui/gadgets/editors/editors.factor +++ b/basis/ui/gadgets/editors/editors.factor @@ -2,14 +2,13 @@ ! See http://factorcode.org/license.txt for BSD license. USING: accessors arrays assocs calendar colors.constants combinators combinators.short-circuit documents -documents.elements fonts fry grouping kernel locals make math -math.functions math.order math.ranges math.rectangles -math.vectors models models.arrow namespaces opengl sequences -sorting splitting system timers ui.baseline-alignment +documents.elements fonts fry grouping kernel literals locals +make math math.functions math.order math.ranges math.rectangles +math.vectors models models.arrow namespaces opengl opengl.gl +sequences sorting splitting system timers ui.baseline-alignment ui.clipboards ui.commands ui.gadgets ui.gadgets.borders ui.gadgets.line-support ui.gadgets.menus ui.gadgets.scrollers -ui.gestures ui.pens.solid ui.render ui.text ui.theme unicode -opengl.gl ; +ui.gestures ui.pens.solid ui.render ui.text ui.theme unicode ; IN: ui.gadgets.editors TUPLE: editor < line-gadget @@ -432,12 +431,17 @@ editor "editing" f { { redo-action com-redo } { T{ key-down f f "DELETE" } delete-next-character } { T{ key-down f f "BACKSPACE" } delete-previous-character } + { T{ key-down f { S+ } "DELETE" } delete-next-character } { T{ key-down f { S+ } "BACKSPACE" } delete-previous-character } - { T{ key-down f { C+ } "DELETE" } delete-next-word } - { T{ key-down f { C+ } "BACKSPACE" } delete-previous-word } - { T{ key-down f { A+ } "DELETE" } delete-to-end-of-line } - { T{ key-down f { A+ } "BACKSPACE" } delete-to-start-of-line } -} os unix? [ { + { T{ key-down f ${ os macosx? A+ C+ ? } "DELETE" } delete-next-word } + { T{ key-down f ${ os macosx? A+ C+ ? } "BACKSPACE" } delete-previous-word } + { T{ key-down f ${ os macosx? M+ A+ ? } "DELETE" } delete-to-end-of-line } + { T{ key-down f ${ os macosx? M+ A+ ? } "BACKSPACE" } delete-to-start-of-line } +} os macosx? [ { + { T{ key-down f { C+ } "DELETE" } delete-next-character } + { T{ key-down f { C+ } "BACKSPACE" } delete-previous-character } +} append ] when os unix? [ { + ! { T{ key-down f { C+ } "t" } transpose-character } { T{ key-down f { C+ } "d" } delete-next-character } { T{ key-down f { C+ } "h" } delete-previous-character } { T{ key-down f { C+ } "u" } delete-to-start-of-line } @@ -487,13 +491,22 @@ editor "caret-motion" f { { T{ button-down } position-caret } { T{ key-down f f "LEFT" } previous-character } { T{ key-down f f "RIGHT" } next-character } - { T{ key-down f { C+ } "LEFT" } previous-word } - { T{ key-down f { C+ } "RIGHT" } next-word } + { T{ key-down f ${ os macosx? A+ C+ ? } "LEFT" } previous-word } + { T{ key-down f ${ os macosx? A+ C+ ? } "RIGHT" } next-word } { T{ key-down f f "HOME" } start-of-line } { T{ key-down f f "END" } end-of-line } - { T{ key-down f { C+ } "HOME" } start-of-document } - { T{ key-down f { C+ } "END" } end-of-document } -} os unix? [ { + ! { T{ key-down f ${ os macosx? A+ C+ ? } "UP" } start-of-paragraph } + ! { T{ key-down f ${ os macosx? A+ C+ ? } "DOWN" } end-of-paragraph } + { T{ key-down f ${ os macosx? A+ C+ ? } "HOME" } start-of-document } + { T{ key-down f ${ os macosx? A+ C+ ? } "END" } end-of-document } +} os macosx? [ { + { T{ key-down f { M+ } "LEFT" } start-of-line } + { T{ key-down f { M+ } "RIGHT" } end-of-line } + ! { T{ key-down f { M+ } "UP" } start-of-paragraph } + ! { T{ key-down f { M+ } "DOWN" } end-of-paragraph } + { T{ key-down f { M+ } "HOME" } start-of-document } + { T{ key-down f { M+ } "END" } end-of-document } +} append ] when os unix? [ { { T{ key-down f { C+ } "b" } previous-character } { T{ key-down f { C+ } "f" } next-character } { T{ key-down f { C+ } "a" } start-of-line } @@ -549,13 +562,22 @@ editor "selection" f { { T{ key-down f { C+ } "l" } select-line } { T{ key-down f { S+ } "LEFT" } select-previous-character } { T{ key-down f { S+ } "RIGHT" } select-next-character } - { T{ key-down f { S+ C+ } "LEFT" } select-previous-word } - { T{ key-down f { S+ C+ } "RIGHT" } select-next-word } + { T{ key-down f ${ S+ os macosx? A+ C+ ? } "LEFT" } select-previous-word } + { T{ key-down f ${ S+ os macosx? A+ C+ ? } "RIGHT" } select-next-word } { T{ key-down f { S+ } "HOME" } select-start-of-line } { T{ key-down f { S+ } "END" } select-end-of-line } - { T{ key-down f { S+ C+ } "HOME" } select-start-of-document } - { T{ key-down f { S+ C+ } "END" } select-end-of-document } -} define-command-map + ! { T{ key-down f ${ S+ os macosx? A+ C+ ? } "UP" } select-start-of-paragraph } + ! { T{ key-down f ${ S+ os macosx? A+ C+ ? } "DOWN" } select-end-of-paragraph } + { T{ key-down f ${ S+ os macosx? A+ C+ ? } "HOME" } select-start-of-document } + { T{ key-down f ${ S+ os macosx? A+ C+ ? } "END" } select-end-of-document } +} os macosx? [ { + { T{ key-down f { S+ M+ } "LEFT" } select-start-of-line } + { T{ key-down f { S+ M+ } "RIGHT" } select-end-of-line } + ! { T{ key-down f ${ S+ M+ } "UP" } select-start-of-paragraph } + ! { T{ key-down f ${ S+ M+ } "DOWN" } select-end-of-paragraph } + { T{ key-down f { S+ M+ } "HOME" } select-start-of-document } + { T{ key-down f { S+ M+ } "END" } select-end-of-document } +} append ] when define-command-map : editor-menu ( editor -- ) { diff --git a/basis/ui/gestures/gestures-docs.factor b/basis/ui/gestures/gestures-docs.factor index ed8ef8d333..5577d906cf 100644 --- a/basis/ui/gestures/gestures-docs.factor +++ b/basis/ui/gestures/gestures-docs.factor @@ -125,10 +125,10 @@ HELP: C+ { $description "Control key modifier." } ; HELP: A+ -{ $description "Alt key modifier." } ; +{ $description "Alt key modifier. This is the Option key on Mac OS X." } ; HELP: M+ -{ $description "Meta key modifier. This is the Command key on Mac OS X and the Windows key on other Unices and Windows." } ; +{ $description "Meta key modifier. This is the Command key on Mac OS X and the Windows key on other Unix and Windows platforms." } ; HELP: S+ { $description "Shift key modifier." } ; @@ -248,9 +248,9 @@ ARTICLE: "gesture-differences" "Gesture handling differences between platforms" "On Mac OS X, the modifier keys map as follows:" { $table { { $link S+ } "Shift" } - { { $link A+ } "Command (Apple)" } + { { $link A+ } "Option" } { { $link C+ } "Control" } - { { $link M+ } "Option" } + { { $link M+ } "Command (Apple)" } } "On Windows and X11:" { $table diff --git a/basis/ui/gestures/gestures.factor b/basis/ui/gestures/gestures.factor index bcb56c5cb0..98b8d2f4ee 100644 --- a/basis/ui/gestures/gestures.factor +++ b/basis/ui/gestures/gestures.factor @@ -323,8 +323,8 @@ HOOK: modifiers>string os ( modifiers -- string ) M: macosx modifiers>string [ { - { A+ [ "\u002318" ] } - { M+ [ "\u002325" ] } + { M+ [ "\u002318" ] } + { A+ [ "\u002325" ] } { S+ [ "\u0021e7" ] } { C+ [ "\u002303" ] } } case diff --git a/basis/ui/tools/browser/browser.factor b/basis/ui/tools/browser/browser.factor index 9eca133cc0..0abc1af2e0 100644 --- a/basis/ui/tools/browser/browser.factor +++ b/basis/ui/tools/browser/browser.factor @@ -3,13 +3,14 @@ USING: accessors arrays assocs classes combinators combinators.short-circuit compiler.units debugger fonts fry help help.apropos help.crossref help.home help.markup help.stylesheet -help.topics io.styles kernel locals make math.vectors models -namespaces sequences sets ui ui.commands ui.gadgets ui.gadgets.borders -ui.gadgets.editors ui.gadgets.glass ui.gadgets.panes -ui.gadgets.scrollers ui.gadgets.status-bar ui.gadgets.toolbar -ui.gadgets.tracks ui.gadgets.viewports ui.gadgets.worlds ui.gestures -ui.pens.solid ui.theme ui.tools.browser.history -ui.tools.browser.popups ui.tools.common unicode vocabs ; +help.topics io.styles kernel literals locals make math math.vectors +models namespaces sequences sets system ui ui.commands +ui.gadgets ui.gadgets.borders ui.gadgets.editors +ui.gadgets.glass ui.gadgets.panes ui.gadgets.scrollers +ui.gadgets.status-bar ui.gadgets.toolbar ui.gadgets.tracks +ui.gadgets.viewports ui.gadgets.worlds ui.gestures ui.pens.solid +ui.theme ui.tools.browser.history ui.tools.browser.popups +ui.tools.common unicode vocabs ; IN: ui.tools.browser TUPLE: browser-gadget < tool history scroller search-field popup ; @@ -188,11 +189,11 @@ M: browser-gadget focusable-child* search-field>> ; \ glossary H{ { +nullary+ t } } define-command browser-gadget "toolbar" f { - { T{ key-down f { A+ } "LEFT" } com-back } - { T{ key-down f { A+ } "RIGHT" } com-forward } - { T{ key-down f { A+ } "H" } com-home } + { T{ key-down f ${ os macosx? M+ A+ ? } "LEFT" } com-back } + { T{ key-down f ${ os macosx? M+ A+ ? } "RIGHT" } com-forward } + { T{ key-down f ${ os macosx? M+ A+ ? } "HOME" } com-home } { T{ key-down f f "F1" } browser-help } - { T{ key-down f { A+ } "F1" } glossary } + { T{ key-down f ${ os macosx? M+ A+ ? } "F1" } glossary } } define-command-map : ?show-help ( link browser -- ) @@ -208,12 +209,15 @@ browser-gadget "toolbar" f { : com-next ( browser -- ) [ next-article ] navigate ; browser-gadget "navigation" "Commands for navigating in the article hierarchy" { - { T{ key-down f { A+ } "u" } com-up } - { T{ key-down f { A+ } "p" } com-prev } - { T{ key-down f { A+ } "n" } com-next } - { T{ key-down f { A+ } "k" } com-show-outgoing-links } - { T{ key-down f { A+ } "K" } com-show-incoming-links } -} define-command-map + { T{ key-down f ${ os macosx? M+ A+ ? } "UP" } com-up } + { T{ key-down f ${ os macosx? M+ A+ ? } "p" } com-prev } + { T{ key-down f ${ os macosx? M+ A+ ? } "n" } com-next } + { T{ key-down f ${ os macosx? M+ A+ ? } "k" } com-show-outgoing-links } + { T{ key-down f ${ os macosx? M+ A+ ? } "K" } com-show-incoming-links } +} os macosx? [ { + { T{ key-down f { M+ } "[" } com-back } + { T{ key-down f { M+ } "]" } com-forward } +} append ] when define-command-map browser-gadget "multi-touch" f { { left-action com-back } @@ -243,11 +247,16 @@ browser-gadget "scrolling" : com-font-size-minus ( browser -- ) -2 adjust-help-font-size model>> notify-connections ; +: com-font-size-normal ( browser -- ) + font-size-span default-style get font-size of - + adjust-help-font-size model>> notify-connections ; + browser-gadget "fonts" f { - { T{ key-down f { A+ } "+" } com-font-size-plus } - { T{ key-down f { A+ } "=" } com-font-size-plus } - { T{ key-down f { A+ } "_" } com-font-size-minus } - { T{ key-down f { A+ } "-" } com-font-size-minus } + { T{ key-down f ${ os macosx? M+ C+ ? } "+" } com-font-size-plus } + { T{ key-down f ${ os macosx? M+ C+ ? } "=" } com-font-size-plus } + { T{ key-down f ${ os macosx? M+ C+ ? } "_" } com-font-size-minus } + { T{ key-down f ${ os macosx? M+ C+ ? } "-" } com-font-size-minus } + { T{ key-down f ${ os macosx? M+ C+ ? } "0" } com-font-size-normal } } define-command-map MAIN: browser-window diff --git a/basis/ui/tools/listener/listener.factor b/basis/ui/tools/listener/listener.factor index 917467a0be..bfcfe4d840 100644 --- a/basis/ui/tools/listener/listener.factor +++ b/basis/ui/tools/listener/listener.factor @@ -455,19 +455,19 @@ interactor "completion" f { listener-gadget "toolbar" f { { f restart-listener } - { T{ key-down f { A+ } "u" } com-auto-use } - { T{ key-down f { A+ } "k" } clear-output } - { T{ key-down f { A+ } "K" } clear-stack } + { T{ key-down f ${ os macosx? M+ A+ ? } "u" } com-auto-use } + { T{ key-down f ${ os macosx? M+ A+ ? } "k" } clear-output } + { T{ key-down f ${ os macosx? M+ A+ ? } "K" } clear-stack } { T{ key-down f f "F1" } com-help } } define-command-map listener-gadget "scrolling" "The listener's scroller can be scrolled from the keyboard." { - { T{ key-down f { A+ } "UP" } com-scroll-up } - { T{ key-down f { A+ } "DOWN" } com-scroll-down } - { T{ key-down f { A+ } "PAGE_UP" } com-page-up } - { T{ key-down f { A+ } "PAGE_DOWN" } com-page-down } + { T{ key-down f ${ os macosx? M+ A+ ? } "UP" } com-scroll-up } + { T{ key-down f ${ os macosx? M+ A+ ? } "DOWN" } com-scroll-down } + { T{ key-down f ${ os macosx? M+ A+ ? } "PAGE_UP" } com-page-up } + { T{ key-down f ${ os macosx? M+ A+ ? } "PAGE_DOWN" } com-page-down } } define-command-map listener-gadget "multi-touch" f { @@ -520,9 +520,14 @@ PRIVATE> : com-font-size-minus ( listener -- ) -2 adjust-listener-font-size ; +: com-font-size-normal ( listener -- ) + default-font-size over input>> font>> size>> - + adjust-listener-font-size ; + listener-gadget "fonts" f { - { T{ key-down f { A+ } "+" } com-font-size-plus } - { T{ key-down f { A+ } "=" } com-font-size-plus } - { T{ key-down f { A+ } "_" } com-font-size-minus } - { T{ key-down f { A+ } "-" } com-font-size-minus } + { T{ key-down f ${ os macosx? M+ C+ ? } "+" } com-font-size-plus } + { T{ key-down f ${ os macosx? M+ C+ ? } "=" } com-font-size-plus } + { T{ key-down f ${ os macosx? M+ C+ ? } "_" } com-font-size-minus } + { T{ key-down f ${ os macosx? M+ C+ ? } "-" } com-font-size-minus } + { T{ key-down f ${ os macosx? M+ C+ ? } "0" } com-font-size-normal } } define-command-map diff --git a/basis/ui/tools/tools.factor b/basis/ui/tools/tools.factor index 8f096d0c3d..85c6eabdd7 100644 --- a/basis/ui/tools/tools.factor +++ b/basis/ui/tools/tools.factor @@ -1,8 +1,9 @@ ! Copyright (C) 2006, 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: memory namespaces system ui ui.backend ui.commands -ui.gestures ui.tools.browser ui.tools.common ui.tools.error-list -ui.tools.listener vocabs.refresh ; +USING: kernel literals memory namespaces sequences system ui +ui.backend ui.commands ui.gestures ui.tools.browser +ui.tools.common ui.tools.error-list ui.tools.listener +vocabs.refresh ; IN: ui.tools \ refresh-all H{ { +nullary+ t } { +listener+ t } } define-command @@ -14,19 +15,26 @@ IN: ui.tools \ com-exit H{ { +nullary+ t } } define-command tool "tool-switching" f { - { T{ key-down f { A+ } "l" } show-listener } - { T{ key-down f { A+ } "L" } listener-window } - { T{ key-down f { A+ } "b" } show-browser } - { T{ key-down f { A+ } "B" } browser-window } + { T{ key-down f ${ os macosx? M+ A+ ? } "l" } show-listener } + { T{ key-down f ${ os macosx? M+ A+ ? } "L" } listener-window } + { T{ key-down f ${ os macosx? M+ A+ ? } "b" } show-browser } + { T{ key-down f ${ os macosx? M+ A+ ? } "B" } browser-window } } define-command-map tool "common" f { - { T{ key-down f { A+ } "w" } close-window } - { T{ key-down f { A+ } "F" } toggle-fullscreen } - { T{ key-down f { A+ } "q" } com-exit } + { T{ key-down f ${ os macosx? M+ A+ ? } "q" } com-exit } { T{ key-down f f "F2" } refresh-all } { T{ key-down f f "F3" } show-error-list } -} define-command-map +} os macosx? { + { T{ key-down f { M+ } "w" } close-window } + { T{ key-down f { M+ } "q" } com-exit } + { T{ key-down f { C+ M+ } "f" } toggle-fullscreen } +} { + { T{ key-down f { C+ } "w" } close-window } + { T{ key-down f { C+ } "F4" } close-window } + { T{ key-down f { A+ } "F4" } com-exit } + { T{ key-down f f "F11" } ? toggle-fullscreen } +} ? prepend define-command-map : ui-tools-main ( -- ) f ui-stop-after-last-window? set-global