summaryrefslogtreecommitdiffstats
path: root/platform/macos/display_server_macos.mm
diff options
context:
space:
mode:
Diffstat (limited to 'platform/macos/display_server_macos.mm')
-rw-r--r--platform/macos/display_server_macos.mm73
1 files changed, 59 insertions, 14 deletions
diff --git a/platform/macos/display_server_macos.mm b/platform/macos/display_server_macos.mm
index 6461f50818..0041848c78 100644
--- a/platform/macos/display_server_macos.mm
+++ b/platform/macos/display_server_macos.mm
@@ -2321,7 +2321,7 @@ void DisplayServerMacOS::window_set_window_buttons_offset(const Vector2i &p_offs
WindowData &wd = windows[p_window];
float scale = screen_get_max_scale();
wd.wb_offset = p_offset / scale;
- wd.wb_offset = wd.wb_offset.max(Vector2i(12, 12));
+ wd.wb_offset = wd.wb_offset.maxi(12);
if (wd.window_button_view) {
[wd.window_button_view setOffset:NSMakePoint(wd.wb_offset.x, wd.wb_offset.y)];
}
@@ -3151,10 +3151,11 @@ void DisplayServerMacOS::set_icon(const Ref<Image> &p_icon) {
}
}
-DisplayServer::IndicatorID DisplayServerMacOS::create_status_indicator(const Ref<Image> &p_icon, const String &p_tooltip, const Callable &p_callback) {
+DisplayServer::IndicatorID DisplayServerMacOS::create_status_indicator(const Ref<Texture2D> &p_icon, const String &p_tooltip, const Callable &p_callback) {
NSImage *nsimg = nullptr;
if (p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0) {
- Ref<Image> img = p_icon->duplicate();
+ Ref<Image> img = p_icon->get_image();
+ img = img->duplicate();
img->convert(Image::FORMAT_RGBA8);
NSBitmapImageRep *imgrep = [[NSBitmapImageRep alloc]
@@ -3192,13 +3193,18 @@ DisplayServer::IndicatorID DisplayServerMacOS::create_status_indicator(const Ref
IndicatorData idat;
- idat.item = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength];
- idat.view = [[GodotStatusItemView alloc] init];
+ NSStatusItem *item = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength];
+ idat.item = item;
+ idat.delegate = [[GodotStatusItemDelegate alloc] init];
+ [idat.delegate setCallback:p_callback];
- [idat.view setToolTip:[NSString stringWithUTF8String:p_tooltip.utf8().get_data()]];
- [idat.view setImage:nsimg];
- [idat.view setCallback:p_callback];
- [idat.item setView:idat.view];
+ item.button.image = nsimg;
+ item.button.imagePosition = NSImageOnly;
+ item.button.imageScaling = NSImageScaleProportionallyUpOrDown;
+ item.button.target = idat.delegate;
+ item.button.action = @selector(click:);
+ [item.button sendActionOn:(NSEventMaskLeftMouseDown | NSEventMaskRightMouseDown | NSEventMaskOtherMouseDown)];
+ item.button.toolTip = [NSString stringWithUTF8String:p_tooltip.utf8().get_data()];
IndicatorID iid = indicator_id_counter++;
indicators[iid] = idat;
@@ -3206,12 +3212,13 @@ DisplayServer::IndicatorID DisplayServerMacOS::create_status_indicator(const Ref
return iid;
}
-void DisplayServerMacOS::status_indicator_set_icon(IndicatorID p_id, const Ref<Image> &p_icon) {
+void DisplayServerMacOS::status_indicator_set_icon(IndicatorID p_id, const Ref<Texture2D> &p_icon) {
ERR_FAIL_COND(!indicators.has(p_id));
NSImage *nsimg = nullptr;
if (p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0) {
- Ref<Image> img = p_icon->duplicate();
+ Ref<Image> img = p_icon->get_image();
+ img = img->duplicate();
img->convert(Image::FORMAT_RGBA8);
NSBitmapImageRep *imgrep = [[NSBitmapImageRep alloc]
@@ -3247,19 +3254,57 @@ void DisplayServerMacOS::status_indicator_set_icon(IndicatorID p_id, const Ref<I
}
}
- [indicators[p_id].view setImage:nsimg];
+ NSStatusItem *item = indicators[p_id].item;
+ item.button.image = nsimg;
}
void DisplayServerMacOS::status_indicator_set_tooltip(IndicatorID p_id, const String &p_tooltip) {
ERR_FAIL_COND(!indicators.has(p_id));
- [indicators[p_id].view setToolTip:[NSString stringWithUTF8String:p_tooltip.utf8().get_data()]];
+ NSStatusItem *item = indicators[p_id].item;
+ item.button.toolTip = [NSString stringWithUTF8String:p_tooltip.utf8().get_data()];
+}
+
+void DisplayServerMacOS::status_indicator_set_menu(IndicatorID p_id, const RID &p_menu_rid) {
+ ERR_FAIL_COND(!indicators.has(p_id));
+
+ NSStatusItem *item = indicators[p_id].item;
+ if (p_menu_rid.is_valid() && native_menu->has_menu(p_menu_rid)) {
+ NSMenu *menu = native_menu->get_native_menu_handle(p_menu_rid);
+ item.menu = menu;
+ } else {
+ item.menu = nullptr;
+ }
}
void DisplayServerMacOS::status_indicator_set_callback(IndicatorID p_id, const Callable &p_callback) {
ERR_FAIL_COND(!indicators.has(p_id));
- [indicators[p_id].view setCallback:p_callback];
+ [indicators[p_id].delegate setCallback:p_callback];
+}
+
+Rect2 DisplayServerMacOS::status_indicator_get_rect(IndicatorID p_id) const {
+ ERR_FAIL_COND_V(!indicators.has(p_id), Rect2());
+
+ NSStatusItem *item = indicators[p_id].item;
+ NSView *v = item.button;
+ const NSRect contentRect = [v frame];
+ const NSRect nsrect = [v.window convertRectToScreen:contentRect];
+ Rect2 rect;
+
+ // Return the position of the top-left corner, for macOS the y starts at the bottom.
+ const float scale = screen_get_max_scale();
+ rect.size.x = nsrect.size.width;
+ rect.size.y = nsrect.size.height;
+ rect.size *= scale;
+ rect.position.x = nsrect.origin.x;
+ rect.position.y = (nsrect.origin.y + nsrect.size.height);
+ rect.position *= scale;
+ rect.position -= _get_screens_origin();
+ // macOS native y-coordinate relative to _get_screens_origin() is negative,
+ // Godot expects a positive value.
+ rect.position.y *= -1;
+ return rect;
}
void DisplayServerMacOS::delete_status_indicator(IndicatorID p_id) {