]> gitweb.factorcode.org Git - factor.git/commitdiff
cocoa.statusbar: Add some words to make a systemStatusBar on macOS
authorDoug Coleman <doug.coleman@gmail.com>
Thu, 28 Jan 2021 14:34:22 +0000 (08:34 -0600)
committerDoug Coleman <doug.coleman@gmail.com>
Thu, 28 Jan 2021 14:36:30 +0000 (08:36 -0600)
basis/cocoa/statusbar/authors.txt [new file with mode: 0644]
basis/cocoa/statusbar/platforms.txt [new file with mode: 0644]
basis/cocoa/statusbar/statusbar.factor [new file with mode: 0644]
basis/cocoa/statusbar/summary.txt [new file with mode: 0644]

diff --git a/basis/cocoa/statusbar/authors.txt b/basis/cocoa/statusbar/authors.txt
new file mode 100644 (file)
index 0000000..7c1b2f2
--- /dev/null
@@ -0,0 +1 @@
+Doug Coleman
diff --git a/basis/cocoa/statusbar/platforms.txt b/basis/cocoa/statusbar/platforms.txt
new file mode 100644 (file)
index 0000000..6e806f4
--- /dev/null
@@ -0,0 +1 @@
+macosx
diff --git a/basis/cocoa/statusbar/statusbar.factor b/basis/cocoa/statusbar/statusbar.factor
new file mode 100644 (file)
index 0000000..048bd80
--- /dev/null
@@ -0,0 +1,71 @@
+! Copyright (C) 2021 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors alien.c-types arrays cocoa cocoa.application
+cocoa.classes cocoa.messages cocoa.runtime cocoa.subclassing
+compiler.units kernel locals.backend math.parser multiline
+sequences ui ;
+IN: cocoa.statusbar
+
+<< {
+    "NSStatusBar"
+    "NSStatusItem"
+} [
+    [ ] import-objc-class
+] each
+>>
+
+CONSTANT: NSVariableStatusItemLength -1.0
+CONSTANT: NSSquareStatusItemLength -2.0
+
+: get-system-statusbar ( -- alien )
+    NSStatusBar -> systemStatusBar ;
+
+TUPLE: platform-menu name items ;
+TUPLE: platform-menu-item title quot key-equivalent selector target ;
+
+: menu>dummy-class ( menu -- object )
+    [ name>> "NSObject" V{ } ]
+    [
+        items>> [
+            swap
+            [
+                [ number>string "dummy" prepend void { id SEL } ]
+                [ quot>> [ 2 load-locals 2 drop-locals ] prepose ] bi* 4array
+            ] keep over first >>selector drop
+        ] map-index
+        [ define-objc-class ] with-compilation-unit
+    ] [
+        name>> objc_getClass -> alloc -> init
+    ] tri ;
+
+: >NSMenuItem ( menu-item -- NSMenuItem )
+    [ NSMenuItem -> alloc ] dip
+    [ title>> <NSString> ]
+    [ selector>> <selector> cocoa.messages:selector ]
+    [ key-equivalent>> "" or <NSString> ] tri
+    -> initWithTitle:action:keyEquivalent: ;
+
+:: menu>alien ( menu -- menu-alien )
+    NSMenu -> alloc -> init :> ns-menu
+    menu menu>dummy-class :> dummy-class
+    ! NSMenu objc-dummy menu
+    menu items>> [
+        >NSMenuItem [ dummy-class -> setTarget: ] keep
+    ] map :> ns-menu-items
+    ns-menu ns-menu-items [ -> addItem: ] with each
+    ns-menu ;
+
+:: show-menu ( menu -- menu-alien statusbar-item-alien )
+    menu menu>alien :> menu-alien
+    get-system-statusbar :> system-alien
+    system-alien
+        NSVariableStatusItemLength -> statusItemWithLength: [ -> retain ] keep :> ns-status-item
+    ns-status-item menu name>> <NSString> -> setTitle:
+    menu-alien -> setMenu:
+    menu-alien ns-status-item ;
+
+: enable-menu-item ( alien -- ) 1 -> setEnabled: ;
+: disable-menu-item ( alien -- ) 0 -> setEnabled: ;
+
+: hide-statusbar-item ( statusbar-item-alien -- )
+    [ get-system-statusbar ] dip -> removeStatusItem: ;
diff --git a/basis/cocoa/statusbar/summary.txt b/basis/cocoa/statusbar/summary.txt
new file mode 100644 (file)
index 0000000..2d32c9d
--- /dev/null
@@ -0,0 +1 @@
+NSStatusBar utilities