2013-01-07 21:44:31 +01:00
|
|
|
/*
|
|
|
|
* MACDRV Cocoa application class declaration
|
|
|
|
*
|
|
|
|
* Copyright 2011, 2012, 2013 Ken Thomases for CodeWeavers Inc.
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
|
|
*/
|
|
|
|
|
|
|
|
#import <AppKit/AppKit.h>
|
|
|
|
|
|
|
|
#include "macdrv_cocoa.h"
|
|
|
|
|
2020-07-23 19:34:35 +02:00
|
|
|
#if !defined(MAC_OS_X_VERSION_10_12) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_12
|
|
|
|
/* For older SDKs, #define the new names of constants deprecated/renamed in macOS 10.12. */
|
|
|
|
#define NSCompositingOperationSourceOver NSCompositeSourceOver
|
|
|
|
#define NSEventMaskAny NSAnyEventMask
|
|
|
|
#define NSEventMaskLeftMouseDown NSLeftMouseDownMask
|
|
|
|
#define NSEventMaskOtherMouseDown NSOtherMouseDownMask
|
|
|
|
#define NSEventMaskRightMouseDown NSRightMouseDownMask
|
|
|
|
#define NSEventModifierFlagCommand NSCommandKeyMask
|
|
|
|
#define NSEventModifierFlagControl NSControlKeyMask
|
|
|
|
#define NSEventModifierFlagOption NSAlternateKeyMask
|
|
|
|
#define NSEventModifierFlagShift NSShiftKeyMask
|
|
|
|
#define NSEventTypeAppKitDefined NSAppKitDefined
|
|
|
|
#define NSEventTypeApplicationDefined NSApplicationDefined
|
|
|
|
#define NSEventTypeFlagsChanged NSFlagsChanged
|
|
|
|
#define NSEventTypeKeyDown NSKeyDown
|
|
|
|
#define NSEventTypeKeyUp NSKeyUp
|
|
|
|
#define NSEventTypeLeftMouseDown NSLeftMouseDown
|
|
|
|
#define NSEventTypeLeftMouseDragged NSLeftMouseDragged
|
|
|
|
#define NSEventTypeLeftMouseUp NSLeftMouseUp
|
|
|
|
#define NSEventTypeMouseMoved NSMouseMoved
|
|
|
|
#define NSEventTypeOtherMouseDown NSOtherMouseDown
|
|
|
|
#define NSEventTypeOtherMouseDragged NSOtherMouseDragged
|
|
|
|
#define NSEventTypeOtherMouseUp NSOtherMouseUp
|
|
|
|
#define NSEventTypeRightMouseDown NSRightMouseDown
|
|
|
|
#define NSEventTypeRightMouseUp NSRightMouseUp
|
|
|
|
#define NSEventTypeRightMouseDragged NSRightMouseDragged
|
|
|
|
#define NSEventTypeScrollWheel NSScrollWheel
|
|
|
|
#define NSWindowStyleMaskBorderless NSBorderlessWindowMask
|
|
|
|
#define NSWindowStyleMaskClosable NSClosableWindowMask
|
|
|
|
#define NSWindowStyleMaskFullScreen NSFullScreenWindowMask
|
|
|
|
#define NSWindowStyleMaskMiniaturizable NSMiniaturizableWindowMask
|
|
|
|
#define NSWindowStyleMaskResizable NSResizableWindowMask
|
|
|
|
#define NSWindowStyleMaskTitled NSTitledWindowMask
|
|
|
|
#define NSWindowStyleMaskUtilityWindow NSUtilityWindowMask
|
|
|
|
#endif
|
2013-01-07 21:44:31 +01:00
|
|
|
|
2013-01-21 07:07:47 +01:00
|
|
|
#define ERR(...) do { if (macdrv_err_on) LogError(__func__, __VA_ARGS__); } while (false)
|
|
|
|
|
|
|
|
|
2013-03-13 22:52:57 +01:00
|
|
|
enum {
|
|
|
|
WineApplicationEventWakeQuery,
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2013-01-21 07:07:51 +01:00
|
|
|
@class WineEventQueue;
|
2013-01-27 23:19:48 +01:00
|
|
|
@class WineWindow;
|
2013-01-21 07:07:51 +01:00
|
|
|
|
|
|
|
|
2013-04-16 07:38:01 +02:00
|
|
|
@interface WineApplicationController : NSObject <NSApplicationDelegate>
|
2013-01-21 07:07:51 +01:00
|
|
|
{
|
2013-03-11 04:58:26 +01:00
|
|
|
CFRunLoopSourceRef requestSource;
|
|
|
|
NSMutableArray* requests;
|
|
|
|
dispatch_queue_t requestsManipQueue;
|
|
|
|
|
2013-01-21 07:07:51 +01:00
|
|
|
NSMutableArray* eventQueues;
|
|
|
|
NSLock* eventQueuesLock;
|
2013-01-27 23:19:33 +01:00
|
|
|
|
|
|
|
NSTimeInterval eventTimeAdjustment;
|
2013-01-27 23:19:45 +01:00
|
|
|
|
|
|
|
NSMutableArray* keyWindows;
|
2013-01-27 23:19:48 +01:00
|
|
|
NSMutableSet* triedWindows;
|
|
|
|
unsigned long windowFocusSerial;
|
2013-02-04 00:20:11 +01:00
|
|
|
|
2017-05-16 00:17:47 +02:00
|
|
|
TISInputSourceRef lastKeyboardInputSource;
|
|
|
|
TISInputSourceRef lastKeyboardLayoutInputSource;
|
2013-02-04 00:20:11 +01:00
|
|
|
CGEventSourceKeyboardType keyboardType;
|
2013-02-04 00:20:18 +01:00
|
|
|
NSEvent* lastFlagsChanged;
|
2013-04-22 04:32:26 +02:00
|
|
|
BOOL inputSourceIsInputMethod;
|
|
|
|
BOOL inputSourceIsInputMethodValid;
|
2013-07-09 09:49:59 +02:00
|
|
|
uint32_t pressedKeyCodes[128 / 32];
|
2013-02-07 02:32:22 +01:00
|
|
|
|
|
|
|
CGFloat primaryScreenHeight;
|
|
|
|
BOOL primaryScreenHeightValid;
|
2013-05-07 10:00:49 +02:00
|
|
|
NSMutableData* screenFrameCGRects;
|
2013-02-18 02:28:27 +01:00
|
|
|
|
2013-02-25 05:53:32 +01:00
|
|
|
WineWindow* lastTargetWindow;
|
2013-05-07 10:00:55 +02:00
|
|
|
WineWindow* mouseCaptureWindow;
|
2013-02-25 05:53:32 +01:00
|
|
|
BOOL forceNextMouseMoveAbsolute;
|
2013-05-07 10:00:39 +02:00
|
|
|
double mouseMoveDeltaX, mouseMoveDeltaY;
|
2013-05-07 10:00:42 +02:00
|
|
|
NSUInteger unmatchedMouseDowns;
|
2013-02-25 05:53:32 +01:00
|
|
|
|
2014-05-15 03:15:35 +02:00
|
|
|
NSTimeInterval lastScrollTime;
|
|
|
|
double accumScrollX, accumScrollY;
|
|
|
|
|
2013-02-18 02:28:49 +01:00
|
|
|
NSMutableDictionary* originalDisplayModes;
|
2013-10-02 06:24:13 +02:00
|
|
|
NSMutableDictionary* latentDisplayModes;
|
2013-06-07 00:43:06 +02:00
|
|
|
BOOL displaysCapturedForFullscreen;
|
2013-02-25 05:53:21 +01:00
|
|
|
|
|
|
|
NSArray* cursorFrames;
|
|
|
|
int cursorFrame;
|
|
|
|
NSTimer* cursorTimer;
|
2013-10-18 06:45:52 +02:00
|
|
|
NSCursor* cursor;
|
|
|
|
BOOL cursorIsCurrent;
|
2013-02-25 05:53:21 +01:00
|
|
|
BOOL cursorHidden;
|
2013-10-18 06:45:52 +02:00
|
|
|
BOOL clientWantsCursorHidden;
|
2013-02-25 05:53:47 +01:00
|
|
|
|
2013-02-25 05:53:51 +01:00
|
|
|
BOOL clippingCursor;
|
|
|
|
CGRect cursorClipRect;
|
|
|
|
CFMachPortRef cursorClippingEventTap;
|
|
|
|
NSMutableArray* warpRecords;
|
|
|
|
CGPoint synthesizedLocation;
|
2013-02-25 05:53:47 +01:00
|
|
|
NSTimeInterval lastSetCursorPositionTime;
|
2013-02-25 05:53:51 +01:00
|
|
|
NSTimeInterval lastEventTapEventTime;
|
2013-03-18 04:40:49 +01:00
|
|
|
|
|
|
|
NSImage* applicationIcon;
|
2013-06-04 11:59:37 +02:00
|
|
|
|
|
|
|
BOOL beenActive;
|
2013-12-11 19:50:47 +01:00
|
|
|
|
|
|
|
NSMutableSet* windowsBeingDragged;
|
2021-09-14 22:22:45 +02:00
|
|
|
BOOL useDragNotifications;
|
2013-01-21 07:07:51 +01:00
|
|
|
}
|
2013-01-07 21:44:31 +01:00
|
|
|
|
2013-02-04 00:20:11 +01:00
|
|
|
@property (nonatomic) CGEventSourceKeyboardType keyboardType;
|
2013-02-04 00:20:18 +01:00
|
|
|
@property (readonly, copy, nonatomic) NSEvent* lastFlagsChanged;
|
2013-02-18 02:28:49 +01:00
|
|
|
@property (readonly, nonatomic) BOOL areDisplaysCaptured;
|
2013-02-04 00:20:11 +01:00
|
|
|
|
2014-04-28 22:09:28 +02:00
|
|
|
@property (readonly) BOOL clippingCursor;
|
|
|
|
|
2013-04-16 07:38:01 +02:00
|
|
|
+ (WineApplicationController*) sharedController;
|
|
|
|
|
2013-01-07 21:44:31 +01:00
|
|
|
- (void) transformProcessToForeground;
|
|
|
|
|
2013-01-21 07:07:51 +01:00
|
|
|
- (BOOL) registerEventQueue:(WineEventQueue*)queue;
|
|
|
|
- (void) unregisterEventQueue:(WineEventQueue*)queue;
|
|
|
|
|
2013-01-27 23:19:33 +01:00
|
|
|
- (void) computeEventTimeAdjustmentFromTicks:(unsigned long long)tickcount uptime:(uint64_t)uptime_ns;
|
|
|
|
- (double) ticksForEventTime:(NSTimeInterval)eventTime;
|
|
|
|
|
2013-01-27 23:19:48 +01:00
|
|
|
- (void) windowGotFocus:(WineWindow*)window;
|
|
|
|
|
2013-03-13 22:52:57 +01:00
|
|
|
- (BOOL) waitUntilQueryDone:(int*)done timeout:(NSDate*)timeout processEvents:(BOOL)processEvents;
|
2013-03-11 04:58:26 +01:00
|
|
|
|
2013-07-09 09:49:59 +02:00
|
|
|
- (void) noteKey:(uint16_t)keyCode pressed:(BOOL)pressed;
|
2013-02-04 00:20:18 +01:00
|
|
|
|
2015-03-24 00:58:11 +01:00
|
|
|
- (void) window:(WineWindow*)window isBeingDragged:(BOOL)dragged;
|
2017-06-21 17:15:50 +02:00
|
|
|
- (void) windowWillOrderOut:(WineWindow*)window;
|
2015-03-24 00:58:11 +01:00
|
|
|
|
2013-02-25 05:53:51 +01:00
|
|
|
- (void) flipRect:(NSRect*)rect;
|
|
|
|
|
2013-05-17 01:43:16 +02:00
|
|
|
- (WineWindow*) frontWineWindow;
|
2013-05-17 01:43:33 +02:00
|
|
|
- (void) adjustWindowLevels;
|
2013-06-07 00:43:06 +02:00
|
|
|
- (void) updateFullscreenWindows;
|
2013-02-18 02:28:27 +01:00
|
|
|
|
2013-04-16 07:38:01 +02:00
|
|
|
- (BOOL) handleEvent:(NSEvent*)anEvent;
|
|
|
|
- (void) didSendEvent:(NSEvent*)anEvent;
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
|
|
|
|
@interface WineApplication : NSApplication
|
|
|
|
{
|
|
|
|
WineApplicationController* wineController;
|
|
|
|
}
|
|
|
|
|
|
|
|
@property (readwrite, assign, nonatomic) WineApplicationController* wineController;
|
|
|
|
|
2013-01-07 21:44:31 +01:00
|
|
|
@end
|
2013-01-07 21:44:44 +01:00
|
|
|
|
2013-04-16 07:38:01 +02:00
|
|
|
|
2013-01-07 21:44:44 +01:00
|
|
|
void OnMainThreadAsync(dispatch_block_t block);
|
2013-01-21 07:07:47 +01:00
|
|
|
|
|
|
|
void LogError(const char* func, NSString* format, ...);
|
|
|
|
void LogErrorv(const char* func, NSString* format, va_list args);
|