Support retina images

This commit is contained in:
Lea Anthony 2022-05-02 20:16:04 +10:00
commit 58b6e4c335
No known key found for this signature in database
GPG key ID: 33DAF7BB90A58405
6 changed files with 28 additions and 4 deletions

View file

@ -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 */

View file

@ -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];

View file

@ -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),

View file

@ -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))
}

View file

@ -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()

View file

@ -31,6 +31,7 @@ const (
type TrayImage struct {
Image []byte
Image2x []byte
IsTemplate bool
Position ImagePosition
}