| | |
| | | } g_hook{}; |
| | | #endif |
| | | |
| | | class NSWindowProxy : public QObject { |
| | | Q_OBJECT |
| | | class NSWindowProxy { |
| | | Q_DISABLE_COPY(NSWindowProxy) |
| | | |
| | | public: |
| | | NSWindowProxy(NSWindow *macWindow) { |
| | | if (instances.contains(macWindow)) { |
| | |
| | | nswindow = nil; |
| | | } |
| | | |
| | | public Q_SLOTS: |
| | | void replaceImplementations() { |
| | | Method method = class_getInstanceMethod(windowClass, @selector(setStyleMask:)); |
| | | Q_ASSERT(method); |
| | | oldSetStyleMask = reinterpret_cast<setStyleMaskPtr>( |
| | | method_setImplementation(method, reinterpret_cast<IMP>(setStyleMask))); |
| | | Q_ASSERT(oldSetStyleMask); |
| | | |
| | | method = |
| | | class_getInstanceMethod(windowClass, @selector(setTitlebarAppearsTransparent:)); |
| | | Q_ASSERT(method); |
| | | oldSetTitlebarAppearsTransparent = |
| | | reinterpret_cast<setTitlebarAppearsTransparentPtr>(method_setImplementation( |
| | | method, reinterpret_cast<IMP>(setTitlebarAppearsTransparent))); |
| | | Q_ASSERT(oldSetTitlebarAppearsTransparent); |
| | | |
| | | #if 0 |
| | | method = class_getInstanceMethod(windowClass, @selector(canBecomeKeyWindow)); |
| | | Q_ASSERT(method); |
| | | oldCanBecomeKeyWindow = reinterpret_cast<canBecomeKeyWindowPtr>(method_setImplementation(method, reinterpret_cast<IMP>(canBecomeKeyWindow))); |
| | | Q_ASSERT(oldCanBecomeKeyWindow); |
| | | |
| | | method = class_getInstanceMethod(windowClass, @selector(canBecomeMainWindow)); |
| | | Q_ASSERT(method); |
| | | oldCanBecomeMainWindow = reinterpret_cast<canBecomeMainWindowPtr>(method_setImplementation(method, reinterpret_cast<IMP>(canBecomeMainWindow))); |
| | | Q_ASSERT(oldCanBecomeMainWindow); |
| | | #endif |
| | | |
| | | method = class_getInstanceMethod(windowClass, @selector(sendEvent:)); |
| | | Q_ASSERT(method); |
| | | oldSendEvent = reinterpret_cast<sendEventPtr>( |
| | | method_setImplementation(method, reinterpret_cast<IMP>(sendEvent))); |
| | | Q_ASSERT(oldSendEvent); |
| | | } |
| | | |
| | | void restoreImplementations() { |
| | | Method method = class_getInstanceMethod(windowClass, @selector(setStyleMask:)); |
| | | Q_ASSERT(method); |
| | | method_setImplementation(method, reinterpret_cast<IMP>(oldSetStyleMask)); |
| | | oldSetStyleMask = nil; |
| | | |
| | | method = |
| | | class_getInstanceMethod(windowClass, @selector(setTitlebarAppearsTransparent:)); |
| | | Q_ASSERT(method); |
| | | method_setImplementation(method, |
| | | reinterpret_cast<IMP>(oldSetTitlebarAppearsTransparent)); |
| | | oldSetTitlebarAppearsTransparent = nil; |
| | | |
| | | #if 0 |
| | | method = class_getInstanceMethod(windowClass, @selector(canBecomeKeyWindow)); |
| | | Q_ASSERT(method); |
| | | method_setImplementation(method, reinterpret_cast<IMP>(oldCanBecomeKeyWindow)); |
| | | oldCanBecomeKeyWindow = nil; |
| | | |
| | | method = class_getInstanceMethod(windowClass, @selector(canBecomeMainWindow)); |
| | | Q_ASSERT(method); |
| | | method_setImplementation(method, reinterpret_cast<IMP>(oldCanBecomeMainWindow)); |
| | | oldCanBecomeMainWindow = nil; |
| | | #endif |
| | | |
| | | method = class_getInstanceMethod(windowClass, @selector(sendEvent:)); |
| | | Q_ASSERT(method); |
| | | method_setImplementation(method, reinterpret_cast<IMP>(oldSendEvent)); |
| | | oldSendEvent = nil; |
| | | } |
| | |
| | | nswindow.hasShadow = YES; |
| | | nswindow.showsToolbarButton = NO; |
| | | nswindow.movableByWindowBackground = NO; |
| | | nswindow.movable = NO; |
| | | //nswindow.movable = NO; // This line causes the window in the wrong position when become fullscreen. |
| | | // For some unknown reason, we don't need the following hack in Qt versions below or |
| | | // equal to 6.2.4. |
| | | #if (QT_VERSION > QT_VERSION_CHECK(6, 2, 4)) |
| | |
| | | return; |
| | | } |
| | | |
| | | NSWindowProxy * const proxy = it.value(); |
| | | NSWindowProxy *proxy = it.value(); |
| | | if (event.type == NSEventTypeLeftMouseDown) { |
| | | proxy->lastMouseDownEvent = event; |
| | | QCoreApplication::processEvents(); |
| | |
| | | |
| | | static inline NSWindow *mac_getNSWindow(const WId windowId) { |
| | | const auto nsview = reinterpret_cast<NSView *>(windowId); |
| | | if (!nsview) { |
| | | return nil; |
| | | } |
| | | return [nsview window]; |
| | | } |
| | | |
| | |
| | | auto it = g_proxyList()->find(windowId); |
| | | if (it == g_proxyList()->end()) { |
| | | NSWindow *nswindow = mac_getNSWindow(windowId); |
| | | if (!nswindow) { |
| | | return nil; |
| | | } |
| | | const auto proxy = new NSWindowProxy(nswindow); |
| | | it = g_proxyList()->insert(windowId, proxy); |
| | | } |
| | |
| | | } |
| | | |
| | | } |
| | | |
| | | #include "cocoawindowcontext.moc" |