2022-07-18 09:42:45 +03:00
|
|
|
// Simple windows-less application that shows a icon button
|
|
|
|
// on Mac OS tray.
|
|
|
|
//
|
|
|
|
// Tested on Mac OS Monterey (12.3).
|
|
|
|
|
|
|
|
module main
|
|
|
|
|
|
|
|
#include <Cocoa/Cocoa.h>
|
|
|
|
#flag -framework Cocoa
|
|
|
|
|
|
|
|
#include "@VMODROOT/tray.m"
|
|
|
|
|
|
|
|
fn C.tray_app_init(TrayParams) &TrayInfo
|
|
|
|
fn C.tray_app_loop(&TrayInfo)
|
|
|
|
fn C.tray_app_run(&TrayInfo)
|
|
|
|
fn C.tray_app_exit(&TrayInfo)
|
|
|
|
|
|
|
|
struct TrayMenuItem {
|
|
|
|
id string [required] // Unique ID.
|
|
|
|
text string [required] // Text to display.
|
|
|
|
}
|
|
|
|
|
|
|
|
// Parameters to configure the tray button.
|
|
|
|
struct TrayParams {
|
|
|
|
items []TrayMenuItem [required]
|
|
|
|
on_click fn (item TrayMenuItem)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Internal Cocoa application state.
|
|
|
|
struct TrayInfo {
|
|
|
|
app voidptr // pointer to NSApplication
|
|
|
|
app_delegate voidptr // pointer to AppDelegate
|
|
|
|
}
|
|
|
|
|
|
|
|
[heap]
|
|
|
|
struct MyApp {
|
|
|
|
mut:
|
2022-09-15 07:59:31 +03:00
|
|
|
tray_info &TrayInfo = unsafe { nil }
|
2022-07-18 09:42:45 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
fn (app &MyApp) on_menu_item_click(item TrayMenuItem) {
|
2022-11-15 16:53:13 +03:00
|
|
|
println('click ${item.id}')
|
2022-07-18 09:42:45 +03:00
|
|
|
if item.id == 'quit' {
|
|
|
|
C.tray_app_exit(app.tray_info)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
mut my_app := &MyApp{
|
|
|
|
tray_info: 0
|
|
|
|
}
|
|
|
|
|
|
|
|
my_app.tray_info = C.tray_app_init(TrayParams{
|
|
|
|
items: [TrayMenuItem{
|
|
|
|
id: 'hello'
|
|
|
|
text: 'Hello'
|
|
|
|
}, TrayMenuItem{
|
|
|
|
id: 'quit'
|
|
|
|
text: 'Quit!'
|
|
|
|
}]
|
|
|
|
on_click: my_app.on_menu_item_click
|
|
|
|
})
|
|
|
|
|
|
|
|
//// Use this:
|
|
|
|
// for {
|
|
|
|
// C.tray_app_loop(my_app.tray_info)
|
|
|
|
// // println("loop")
|
|
|
|
// }
|
|
|
|
|
|
|
|
//// Or this:
|
|
|
|
C.tray_app_run(my_app.tray_info)
|
|
|
|
}
|