From 58b6e4c3353efaff3537d44a435334cb263b741a Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Mon, 2 May 2022 20:16:04 +1000 Subject: [PATCH] Support retina images --- .../frontend/desktop/darwin/Application.h | 2 ++ .../frontend/desktop/darwin/Application.m | 5 +++++ v2/internal/frontend/desktop/darwin/menu.go | 17 ++++++++++++++--- v2/internal/frontend/desktop/darwin/traymenu.go | 3 ++- v2/internal/frontend/desktop/darwin/window.go | 4 ++++ v2/pkg/menu/tray.go | 1 + 6 files changed, 28 insertions(+), 4 deletions(-) diff --git a/v2/internal/frontend/desktop/darwin/Application.h b/v2/internal/frontend/desktop/darwin/Application.h index 5600706f7..85562e996 100644 --- a/v2/internal/frontend/desktop/darwin/Application.h +++ b/v2/internal/frontend/desktop/darwin/Application.h @@ -72,4 +72,6 @@ NSString* safeInit(const char* input); void SetTrayImage(void *nsStatusItem, void *imageData, int imageDataLength, int template, int position); +bool IsRetina(void *ctx); + #endif /* Application_h */ diff --git a/v2/internal/frontend/desktop/darwin/Application.m b/v2/internal/frontend/desktop/darwin/Application.m index 7f1436809..5c933c231 100644 --- a/v2/internal/frontend/desktop/darwin/Application.m +++ b/v2/internal/frontend/desktop/darwin/Application.m @@ -378,6 +378,11 @@ void SetTrayImage(void *nsStatusItem, void *imageData, int imageDataLength, int ) } +bool IsRetina(void *ctx) { + CGFloat scale = [((WailsContext*)ctx).mainWindow backingScaleFactor]; + return scale != (CGFloat)1; +} + void Run(void *inctx, const char* url, int activationPolicy) { WailsContext *ctx = (__bridge WailsContext*) inctx; NSApplication *app = [NSApplication sharedApplication]; diff --git a/v2/internal/frontend/desktop/darwin/menu.go b/v2/internal/frontend/desktop/darwin/menu.go index c80efe3d3..02c0bcaef 100644 --- a/v2/internal/frontend/desktop/darwin/menu.go +++ b/v2/internal/frontend/desktop/darwin/menu.go @@ -46,7 +46,7 @@ func objectCreated(id uint32, pointer unsafe.Pointer) { createNSObjectMapLock.Unlock() } -func NewNSTrayMenu(context unsafe.Pointer, trayMenu *menu.TrayMenu) *NSTrayMenu { +func NewNSTrayMenu(context unsafe.Pointer, trayMenu *menu.TrayMenu, isRetina bool) *NSTrayMenu { c := NewCalloc() defer c.Free() @@ -57,6 +57,7 @@ func NewNSTrayMenu(context unsafe.Pointer, trayMenu *menu.TrayMenu) *NSTrayMenu result := &NSTrayMenu{ context: context, nsStatusItem: nsStatusItem, + isRetina: isRetina, } if trayMenu.Label != "" { @@ -77,11 +78,21 @@ func NewNSTrayMenu(context unsafe.Pointer, trayMenu *menu.TrayMenu) *NSTrayMenu } func (n *NSTrayMenu) SetImage(image *menu.TrayImage) { - if image.Image == nil { + + if !n.isRetina && image.Image == nil { return } + + var imagePtr unsafe.Pointer + if image.Image != nil { + imagePtr = unsafe.Pointer(&image.Image[0]) + } + if n.isRetina && image.Image2x != nil { + imagePtr = unsafe.Pointer(&image.Image2x[0]) + } + C.SetTrayImage(n.nsStatusItem, - unsafe.Pointer(&image.Image[0]), + imagePtr, C.int(len(image.Image)), bool2Cint(image.IsTemplate), C.int(image.Position), diff --git a/v2/internal/frontend/desktop/darwin/traymenu.go b/v2/internal/frontend/desktop/darwin/traymenu.go index 8ba366f30..3213b11dc 100644 --- a/v2/internal/frontend/desktop/darwin/traymenu.go +++ b/v2/internal/frontend/desktop/darwin/traymenu.go @@ -25,6 +25,7 @@ func (f *Frontend) TrayMenuAdd(trayMenu *menu.TrayMenu) menu.TrayMenuImpl { type NSTrayMenu struct { context unsafe.Pointer nsStatusItem unsafe.Pointer // NSStatusItem + isRetina bool } func (n *NSTrayMenu) SetLabel(label string) { @@ -33,5 +34,5 @@ func (n *NSTrayMenu) SetLabel(label string) { } func (w *Window) TrayMenuAdd(trayMenu *menu.TrayMenu) *NSTrayMenu { - return NewNSTrayMenu(w.context, trayMenu) + return NewNSTrayMenu(w.context, trayMenu, IsRetina(w)) } diff --git a/v2/internal/frontend/desktop/darwin/window.go b/v2/internal/frontend/desktop/darwin/window.go index ed409b973..781739f31 100644 --- a/v2/internal/frontend/desktop/darwin/window.go +++ b/v2/internal/frontend/desktop/darwin/window.go @@ -40,6 +40,10 @@ func bool2Cint(value bool) C.int { return C.int(0) } +func IsRetina(window *Window) bool { + return bool(C.IsRetina(window.context)) +} + func NewWindow(frontendOptions *options.App, debugMode bool) *Window { c := NewCalloc() diff --git a/v2/pkg/menu/tray.go b/v2/pkg/menu/tray.go index 6507f7c67..2dcda3da4 100644 --- a/v2/pkg/menu/tray.go +++ b/v2/pkg/menu/tray.go @@ -31,6 +31,7 @@ const ( type TrayImage struct { Image []byte + Image2x []byte IsTemplate bool Position ImagePosition }