fix close btn behavior on Mac

This commit is contained in:
Altair Wei 2021-11-12 22:43:54 +08:00
parent 7d29ee5b95
commit 57610634d6
3 changed files with 18 additions and 3 deletions

View File

@ -18,13 +18,14 @@ class NSWindowProxy
{ {
private: private:
NSWindow* m_window; NSWindow* m_window;
QWindow* m_qtwindow;
scoped_nsobject<WindowButtonsProxy> m_buttonProxy; scoped_nsobject<WindowButtonsProxy> m_buttonProxy;
scoped_nsobject<NSWindowProxyDelegate> m_windowDelegate; scoped_nsobject<NSWindowProxyDelegate> m_windowDelegate;
bool m_windowButtonVisibility; bool m_windowButtonVisibility;
QPoint m_trafficLightPosition; QPoint m_trafficLightPosition;
public: public:
NSWindowProxy(NSWindow *window); NSWindowProxy(NSWindow *window, QWindow *qtwindow);
~NSWindowProxy(); ~NSWindowProxy();
NSWindow* window() { return m_window; } NSWindow* window() { return m_window; }
@ -44,6 +45,7 @@ public:
void notifyWindowLeaveFullScreen(); void notifyWindowLeaveFullScreen();
void notifyWindowWillEnterFullScreen(); void notifyWindowWillEnterFullScreen();
void notifyWindowWillLeaveFullScreen(); void notifyWindowWillLeaveFullScreen();
void notifyWindowCloseButtonClicked();
}; };

View File

@ -1,6 +1,7 @@
#include "nswindow_proxy.h" #include "nswindow_proxy.h"
#include <QtGui/qguiapplication.h> #include <QtGui/qguiapplication.h>
#include <QtGui/qwindow.h>
static QList<NSWindow*> gFlsWindows; static QList<NSWindow*> gFlsWindows;
static bool gNSWindowOverrode = false; static bool gNSWindowOverrode = false;
@ -160,10 +161,11 @@ static void restoreNSWindowMethods(NSWindow* window)
} }
NSWindowProxy::NSWindowProxy(NSWindow *window) NSWindowProxy::NSWindowProxy(NSWindow *window, QWindow *qtwindow)
: m_windowButtonVisibility(false) : m_windowButtonVisibility(false)
, m_buttonProxy(nullptr) , m_buttonProxy(nullptr)
, m_window(window) , m_window(window)
, m_qtwindow(qtwindow)
{ {
overrideNSWindowMethods(window); overrideNSWindowMethods(window);
m_buttonProxy.reset([[WindowButtonsProxy alloc] initWithWindow:window]); m_buttonProxy.reset([[WindowButtonsProxy alloc] initWithWindow:window]);
@ -240,6 +242,11 @@ void NSWindowProxy::notifyWindowWillLeaveFullScreen() {
} }
} }
void NSWindowProxy::notifyWindowCloseButtonClicked() {
// Call QWindow::close() when button clicked.
m_qtwindow->close();
}
@implementation NSWindowProxyDelegate @implementation NSWindowProxyDelegate
- (id)initWithWindowProxy:(NSWindowProxy*)proxy { - (id)initWithWindowProxy:(NSWindowProxy*)proxy {
m_windowProxy = proxy; m_windowProxy = proxy;
@ -288,4 +295,10 @@ void NSWindowProxy::notifyWindowWillLeaveFullScreen() {
- (void)windowDidExitFullScreen:(NSNotification*)notification { - (void)windowDidExitFullScreen:(NSNotification*)notification {
m_windowProxy->notifyWindowLeaveFullScreen(); m_windowProxy->notifyWindowLeaveFullScreen();
} }
- (BOOL)windowShouldClose:(id)window {
// We will override default close behavior
m_windowProxy->notifyWindowCloseButtonClicked();
return NO;
}
@end @end

View File

@ -143,7 +143,7 @@ bool setMacWindowHook(QWindow* w)
if (nswindow == nullptr) if (nswindow == nullptr)
return false; return false;
NSWindowProxy *obj = new NSWindowProxy(nswindow); NSWindowProxy *obj = new NSWindowProxy(nswindow, w);
gQWindowToNSWindow.insert(w, obj); gQWindowToNSWindow.insert(w, obj);
return true; return true;