diff --git a/darwin/menu.m b/darwin/menu.m index 96c5c63a..52234751 100644 --- a/darwin/menu.m +++ b/darwin/menu.m @@ -59,8 +59,8 @@ enum { item = (struct menuItem *) [v pointerValue]; if (item->type == typeCheckbox) uiMenuItemSetChecked(uiMenuItem(item), !uiMenuItemChecked(uiMenuItem(item))); - // TODO get key window - (*(item->onClicked))(uiMenuItem(item), NULL, item->onClickedData); + // use the key window as the source of the menu event; it's the active window + (*(item->onClicked))(uiMenuItem(item), windowFromNSWindow([NSApp keyWindow]), item->onClickedData); } - (void)register:(NSMenuItem *)item to:(struct menuItem *)smi diff --git a/darwin/uipriv_darwin.h b/darwin/uipriv_darwin.h index 561d48dd..69f47c9c 100644 --- a/darwin/uipriv_darwin.h +++ b/darwin/uipriv_darwin.h @@ -42,3 +42,6 @@ extern void disableAutocorrect(NSTextView *); // entry.m extern void finishNewTextField(NSTextField *, BOOL); + +// window.m +extern uiWindow *windowFromNSWindow(NSWindow *); diff --git a/darwin/window.m b/darwin/window.m index 51ad0019..c7d69327 100644 --- a/darwin/window.m +++ b/darwin/window.m @@ -6,12 +6,18 @@ int (*onClosing)(uiWindow *, void *); void *onClosingData; } +- (uiWindow *)getuiWindow; - (void)setuiWindow:(uiWindow *)ww; - (void)setOnClosing:(int (*)(uiWindow *, void *))f data:(void *)data; @end @implementation windowDelegate +- (uiWindow *)getuiWindow +{ + return self->w; +} + - (void)setuiWindow:(uiWindow *)ww { self->w = ww; @@ -218,3 +224,13 @@ uiWindow *uiNewWindow(const char *title, int width, int height, int hasMenubar) return uiWindow(w); } + +uiWindow *windowFromNSWindow(NSWindow *w) +{ + windowDelegate *d; + + if (w == nil) + return NULL; + d = (windowDelegate *) [w delegate]; + return [d getuiWindow]; +}