Add MacOSX 10.4 methods and constants to NSEvent. Resort event types to

be binary compatible to MacOSX.


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@25377 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
fredkiefer 2007-08-03 11:27:41 +00:00
parent 9fc6122ab8
commit 8b5ef317f7
7 changed files with 627 additions and 353 deletions

View file

@ -1,3 +1,14 @@
2007-08-03 Fred Kiefer <FredKiefer@gmx.de>
* Headers/AppKit/NSDocumentController.h,
* Source/NSDocumentController.m (-maximumRecentDocumentCount): Add
missing method.
* Headers/AppKit/NSEvent.h,
* Source/NSEvent.m: Add MacOSX 10.4 methods and constants. Resort
event types to be binary compatible to MacOSX.
* Source/Functions.m (NSEventMaskFromType): Remove.
* Source/NSWindow.m (-sendEvent:): Handle new event types.
2007-08-03 Richard Frith-Macdonald <rfm@gnu.org> 2007-08-03 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSWorkspace.m: ([-launchedApplications]) complete and tidy * Source/NSWorkspace.m: ([-launchedApplications]) complete and tidy

View file

@ -109,6 +109,9 @@
- (IBAction)openDocument:(id)sender; - (IBAction)openDocument:(id)sender;
- (IBAction)newDocument:(id)sender; - (IBAction)newDocument:(id)sender;
- (IBAction)clearRecentDocuments:(id)sender; - (IBAction)clearRecentDocuments:(id)sender;
#if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST)
- (unsigned int) maximumRecentDocumentCount;
#endif
/*" Recent Documents "*/ /*" Recent Documents "*/
- (void)noteNewRecentDocument:(NSDocument *)aDocument; - (void)noteNewRecentDocument:(NSDocument *)aDocument;

View file

@ -73,15 +73,12 @@
typedef enum _NSEventType { typedef enum _NSEventType {
// Note - order IS significant as ranges of values // Note - order IS significant as ranges of values
// are used for testing for valid event types. // are used for testing for valid event types.
NSLeftMouseDown, NSLeftMouseDown = 1,
NSLeftMouseUp, NSLeftMouseUp,
NSOtherMouseDown,
NSOtherMouseUp,
NSRightMouseDown, NSRightMouseDown,
NSRightMouseUp, NSRightMouseUp,
NSMouseMoved, NSMouseMoved,
NSLeftMouseDragged, NSLeftMouseDragged,
NSOtherMouseDragged,
NSRightMouseDragged, NSRightMouseDragged,
NSMouseEntered, NSMouseEntered,
NSMouseExited, NSMouseExited,
@ -93,19 +90,23 @@ typedef enum _NSEventType {
NSApplicationDefined, NSApplicationDefined,
NSPeriodic, NSPeriodic,
NSCursorUpdate, NSCursorUpdate,
NSScrollWheel NSScrollWheel = 22,
#if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST)
NSTabletPoint,
NSTabletProximity,
#endif
NSOtherMouseDown = 25,
NSOtherMouseUp,
NSOtherMouseDragged
} NSEventType; } NSEventType;
enum { enum {
NSLeftMouseDownMask = (1 << NSLeftMouseDown), NSLeftMouseDownMask = (1 << NSLeftMouseDown),
NSLeftMouseUpMask = (1 << NSLeftMouseUp), NSLeftMouseUpMask = (1 << NSLeftMouseUp),
NSOtherMouseDownMask = (1 << NSOtherMouseDown),
NSOtherMouseUpMask = (1 << NSOtherMouseUp),
NSRightMouseDownMask = (1 << NSRightMouseDown), NSRightMouseDownMask = (1 << NSRightMouseDown),
NSRightMouseUpMask = (1 << NSRightMouseUp), NSRightMouseUpMask = (1 << NSRightMouseUp),
NSMouseMovedMask = (1 << NSMouseMoved), NSMouseMovedMask = (1 << NSMouseMoved),
NSLeftMouseDraggedMask = (1 << NSLeftMouseDragged), NSLeftMouseDraggedMask = (1 << NSLeftMouseDragged),
NSOtherMouseDraggedMask = (1 << NSOtherMouseDragged),
NSRightMouseDraggedMask = (1 << NSRightMouseDragged), NSRightMouseDraggedMask = (1 << NSRightMouseDragged),
NSMouseEnteredMask = (1 << NSMouseEntered), NSMouseEnteredMask = (1 << NSMouseEntered),
NSMouseExitedMask = (1 << NSMouseExited), NSMouseExitedMask = (1 << NSMouseExited),
@ -118,104 +119,191 @@ enum {
NSPeriodicMask = (1 << NSPeriodic), NSPeriodicMask = (1 << NSPeriodic),
NSCursorUpdateMask = (1 << NSCursorUpdate), NSCursorUpdateMask = (1 << NSCursorUpdate),
NSScrollWheelMask = (1 << NSScrollWheel), NSScrollWheelMask = (1 << NSScrollWheel),
NSAnyEventMask = 0xffffffff #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST)
NSTabletPointMask = (1 << NSTabletPoint),
NSTabletProximityMask = (1 << NSTabletProximity),
#endif
NSOtherMouseDownMask = (1 << NSOtherMouseDown),
NSOtherMouseUpMask = (1 << NSOtherMouseUp),
NSOtherMouseDraggedMask = (1 << NSOtherMouseDragged),
NSAnyEventMask = 0xffffffffU,
// key events
GSKeyEventMask = (NSKeyDownMask | NSKeyUpMask | NSFlagsChangedMask),
// mouse events
GSMouseEventMask = (NSLeftMouseDownMask | NSLeftMouseUpMask | NSLeftMouseDraggedMask
| NSRightMouseDownMask | NSRightMouseUpMask | NSRightMouseDraggedMask
| NSOtherMouseDownMask | NSOtherMouseUpMask | NSOtherMouseDraggedMask
| NSMouseMovedMask | NSScrollWheelMask
#if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST)
| NSTabletPointMask | NSTabletProximityMask
#endif
),
// mouse move events
GSMouseMovedEventMask = (NSMouseMovedMask | NSScrollWheelMask
| NSLeftMouseDraggedMask | NSRightMouseDraggedMask
| NSOtherMouseDraggedMask),
// enter/exit event
GSEnterExitEventMask = (NSMouseEnteredMask | NSMouseExitedMask | NSCursorUpdateMask),
// other events
GSOtherEventMask = (NSAppKitDefinedMask | NSSystemDefinedMask
| NSApplicationDefinedMask | NSPeriodicMask),
// tracking loops may need to add NSPeriodicMask
GSTrackingLoopMask = (NSLeftMouseDownMask | NSLeftMouseUpMask
| NSLeftMouseDraggedMask | NSMouseMovedMask
| NSRightMouseUpMask | NSOtherMouseUpMask)
};
/*
* Convert an NSEvent Type to it's respective Event Mask
*/
// FIXME: Should we use the inline trick from NSGeometry.h here?
static inline
unsigned int
NSEventMaskFromType(NSEventType type)
{
return (1 << type);
}
enum {
#if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST)
NSDeviceIndependentModifierFlagsMask = 0xffff0000U,
#endif
NSAlphaShiftKeyMask = 1 << 16,
NSShiftKeyMask = 2 << 16,
NSControlKeyMask = 4 << 16,
NSAlternateKeyMask = 8 << 16,
NSCommandKeyMask = 16 << 16,
NSNumericPadKeyMask = 32 << 16,
NSHelpKeyMask = 64 << 16,
NSFunctionKeyMask = 128 << 16
};
#if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST)
typedef enum
{
NSUnknownPointingDevice,
NSPenPointingDevice,
NSCursorPointingDevice,
NSEraserPointingDevice
} NSPointingDeviceType;
enum
{
NSPenTipMask = 1,
NSPenLowerSideMask = 2,
NSPenUpperSideMask = 4
};
enum
{
NSMouseEventSubtype,
NSTabletPointEventSubtype,
NSTabletProximityEventSubtype
}; };
enum { enum {
NSAlphaShiftKeyMask = 1, NSWindowExposedEventType = 0,
NSShiftKeyMask = 2, NSApplicationActivatedEventType = 1,
NSControlKeyMask = 4, NSApplicationDeactivatedEventType = 2,
NSAlternateKeyMask = 8, NSWindowMovedEventType = 4,
NSCommandKeyMask = 16, NSScreenChangedEventType = 8,
NSNumericPadKeyMask = 32, NSAWTEventType = 16
NSHelpKeyMask = 64,
NSFunctionKeyMask = 128
}; };
enum
{
NSPowerOffEventType = 1
};
#endif
@interface NSEvent : NSObject <NSCoding, NSCopying> @interface NSEvent : NSObject <NSCoding, NSCopying>
{ {
NSEventType event_type; NSEventType event_type;
NSPoint location_point; NSPoint location_point;
unsigned int modifier_flags; unsigned int modifier_flags;
NSTimeInterval event_time; NSTimeInterval event_time;
int window_num; int window_num;
NSGraphicsContext *event_context; NSGraphicsContext *event_context;
union _MB_event_data union _MB_event_data
{ {
struct struct
{ {
int event_num; int event_num;
short click; short click;
short button; short button;
float pressure; float pressure;
float deltaX; float deltaX;
float deltaY; float deltaY;
float deltaZ; float deltaZ;
} mouse; } mouse;
struct struct
{ {
BOOL repeat; BOOL repeat;
NSString *char_keys; NSString *char_keys;
NSString *unmodified_keys; NSString *unmodified_keys;
unsigned short key_code; unsigned short key_code;
} key; } key;
struct struct
{ {
int event_num; int event_num;
int tracking_num; int tracking_num;
void *user_data; void *user_data;
} tracking; } tracking;
struct struct
{ {
short sub_type; short sub_type;
int data1; int data1;
int data2; int data2;
} misc; } misc;
} event_data; } event_data;
} }
+ (NSEvent*) enterExitEventWithType: (NSEventType)type + (NSEvent*) enterExitEventWithType: (NSEventType)type
location: (NSPoint)location location: (NSPoint)location
modifierFlags: (unsigned int)flags modifierFlags: (unsigned int)flags
timestamp: (NSTimeInterval)time timestamp: (NSTimeInterval)time
windowNumber: (int)windowNum windowNumber: (int)windowNum
context: (NSGraphicsContext*)context context: (NSGraphicsContext*)context
eventNumber: (int)eventNum eventNumber: (int)eventNum
trackingNumber: (int)trackingNum trackingNumber: (int)trackingNum
userData: (void *)userData; userData: (void *)userData;
+ (NSEvent*) keyEventWithType: (NSEventType)type + (NSEvent*) keyEventWithType: (NSEventType)type
location: (NSPoint)location location: (NSPoint)location
modifierFlags: (unsigned int)flags modifierFlags: (unsigned int)flags
timestamp: (NSTimeInterval)time timestamp: (NSTimeInterval)time
windowNumber: (int)windowNum windowNumber: (int)windowNum
context: (NSGraphicsContext*)context context: (NSGraphicsContext*)context
characters: (NSString *)keys characters: (NSString *)keys
charactersIgnoringModifiers: (NSString *)ukeys charactersIgnoringModifiers: (NSString *)ukeys
isARepeat: (BOOL)repeatKey isARepeat: (BOOL)repeatKey
keyCode: (unsigned short)code; keyCode: (unsigned short)code;
+ (NSEvent*) mouseEventWithType: (NSEventType)type + (NSEvent*) mouseEventWithType: (NSEventType)type
location: (NSPoint)location location: (NSPoint)location
modifierFlags: (unsigned int)flags modifierFlags: (unsigned int)flags
timestamp: (NSTimeInterval)time timestamp: (NSTimeInterval)time
windowNumber: (int)windowNum windowNumber: (int)windowNum
context: (NSGraphicsContext*)context context: (NSGraphicsContext*)context
eventNumber: (int)eventNum eventNumber: (int)eventNum
clickCount: (int)clickNum clickCount: (int)clickNum
pressure: (float)pressureValue; pressure: (float)pressureValue;
#if OS_API_VERSION(GS_API_NONE, GS_API_NONE) #if OS_API_VERSION(GS_API_NONE, GS_API_NONE)
+ (NSEvent*) mouseEventWithType: (NSEventType)type + (NSEvent*) mouseEventWithType: (NSEventType)type
location: (NSPoint)location location: (NSPoint)location
modifierFlags: (unsigned int)flags modifierFlags: (unsigned int)flags
timestamp: (NSTimeInterval)time timestamp: (NSTimeInterval)time
windowNumber: (int)windowNum windowNumber: (int)windowNum
context: (NSGraphicsContext*)context context: (NSGraphicsContext*)context
eventNumber: (int)eventNum eventNumber: (int)eventNum
clickCount: (int)clickNum clickCount: (int)clickNum
pressure: (float)pressureValue pressure: (float)pressureValue
buttonNumber: (int)buttonNum buttonNumber: (int)buttonNum
deltaX: (float)deltaX deltaX: (float)deltaX
deltaY: (float)deltaY deltaY: (float)deltaY
deltaZ: (float)deltaZ; deltaZ: (float)deltaZ;
@ -224,17 +312,17 @@ enum {
+ (NSPoint)mouseLocation; + (NSPoint)mouseLocation;
+ (NSEvent*) otherEventWithType: (NSEventType)type + (NSEvent*) otherEventWithType: (NSEventType)type
location: (NSPoint)location location: (NSPoint)location
modifierFlags: (unsigned int)flags modifierFlags: (unsigned int)flags
timestamp: (NSTimeInterval)time timestamp: (NSTimeInterval)time
windowNumber: (int)windowNum windowNumber: (int)windowNum
context: (NSGraphicsContext*)context context: (NSGraphicsContext*)context
subtype: (short)subType subtype: (short)subType
data1: (int)data1 data1: (int)data1
data2: (int)data2; data2: (int)data2;
+ (void) startPeriodicEventsAfterDelay: (NSTimeInterval)delaySeconds + (void) startPeriodicEventsAfterDelay: (NSTimeInterval)delaySeconds
withPeriod: (NSTimeInterval)periodSeconds; withPeriod: (NSTimeInterval)periodSeconds;
+ (void) stopPeriodicEvents; + (void) stopPeriodicEvents;
@ -266,6 +354,27 @@ enum {
- (NSWindow *) window; - (NSWindow *) window;
- (int) windowNumber; - (int) windowNumber;
#if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST)
- (int) absoluteX;
- (int) absoluteY;
- (int) absoluteZ;
- (unsigned int) buttonMask;
- (unsigned int) capabilityMask;
- (unsigned int) deviceID;
- (BOOL) isEnteringProximity;
- (unsigned int) pointingDeviceID;
- (unsigned int) pointingDeviceSerialNumber;
- (NSPointingDeviceType) pointingDeviceType;
- (float) rotation;
- (unsigned int) systemTabletID;
- (unsigned int) tabletID;
- (float) tangentialPressure;
- (NSPoint) tilt;
- (unsigned long long) uniqueID;
- (id) vendorDefined;
- (unsigned int) vendorID;
- (unsigned int) vendorPointingDeviceType;
#endif
@end @end

View file

@ -78,39 +78,6 @@ NSApplicationMain(int argc, const char **argv)
return 0; return 0;
} }
/*
* Convert an NSEvent Type to it's respective Event Mask
*/
unsigned
NSEventMaskFromType(NSEventType type)
{
switch (type)
{
case NSLeftMouseDown: return NSLeftMouseDownMask;
case NSLeftMouseUp: return NSLeftMouseUpMask;
case NSOtherMouseDown: return NSOtherMouseDownMask;
case NSOtherMouseUp: return NSOtherMouseUpMask;
case NSRightMouseDown: return NSRightMouseDownMask;
case NSRightMouseUp: return NSRightMouseUpMask;
case NSMouseMoved: return NSMouseMovedMask;
case NSMouseEntered: return NSMouseEnteredMask;
case NSMouseExited: return NSMouseExitedMask;
case NSLeftMouseDragged: return NSLeftMouseDraggedMask;
case NSOtherMouseDragged: return NSOtherMouseDraggedMask;
case NSRightMouseDragged: return NSRightMouseDraggedMask;
case NSKeyDown: return NSKeyDownMask;
case NSKeyUp: return NSKeyUpMask;
case NSFlagsChanged: return NSFlagsChangedMask;
case NSPeriodic: return NSPeriodicMask;
case NSCursorUpdate: return NSCursorUpdateMask;
case NSScrollWheel: return NSScrollWheelMask;
case NSAppKitDefined: return NSAppKitDefinedMask;
case NSSystemDefined: return NSSystemDefinedMask;
case NSApplicationDefined: return NSApplicationDefinedMask;
}
return 0;
}
/* /*
* Color Functions * Color Functions
*/ */

View file

@ -990,7 +990,10 @@ static NSDictionary *TypeInfoForHumanReadableName (NSArray *types, NSString *typ
} }
// The number of remembered recent documents // The number of remembered recent documents
#define MAX_DOCS 5 - (unsigned int) maximumRecentDocumentCount
{
return 5;
}
- (void) noteNewRecentDocument: (NSDocument *)aDocument - (void) noteNewRecentDocument: (NSDocument *)aDocument
{ {
@ -1011,7 +1014,7 @@ static NSDictionary *TypeInfoForHumanReadableName (NSArray *types, NSString *typ
// Always keep the current object at the end of the list // Always keep the current object at the end of the list
[_recent_documents removeObjectAtIndex: index]; [_recent_documents removeObjectAtIndex: index];
} }
else if ([_recent_documents count] > MAX_DOCS) else if ([_recent_documents count] > [self maximumRecentDocumentCount])
{ {
[_recent_documents removeObjectAtIndex: 0]; [_recent_documents removeObjectAtIndex: 0];
} }

View file

@ -21,7 +21,7 @@
This library is distributed in the hope that it will be useful, This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details. Library General Public License for more details.
You should have received a copy of the GNU Library General Public You should have received a copy of the GNU Library General Public
@ -50,11 +50,11 @@
#include "GNUstepGUI/GSDisplayServer.h" #include "GNUstepGUI/GSDisplayServer.h"
/* /*
* gstep-base has a faster mechanism to get the current thread. * gstep-base has a faster mechanism to get the current thread.
*/ */
#ifndef GNUSTEP_BASE_LIBRARY #ifndef GNUSTEP_BASE_LIBRARY
#define GSCurrentThread() [NSThread currentThread] #define GSCurrentThread() [NSThread currentThread]
#define GSCurrentThreadDictionary() [[NSThread currentThread] threadDictionary] #define GSCurrentThreadDictionary() [[NSThread currentThread] threadDictionary]
#endif #endif
@implementation NSEvent @implementation NSEvent
@ -62,7 +62,7 @@
/* /*
* Class variables * Class variables
*/ */
static NSString *timerKey = @"NSEventTimersKey"; static NSString *timerKey = @"NSEventTimersKey";
static Class eventClass; static Class eventClass;
/* /*
@ -72,7 +72,7 @@ static Class eventClass;
{ {
if (self == [NSEvent class]) if (self == [NSEvent class])
{ {
[self setVersion: 1]; [self setVersion: 2];
eventClass = [NSEvent class]; eventClass = [NSEvent class];
} }
} }
@ -81,22 +81,22 @@ static Class eventClass;
* Creating NSEvent objects * Creating NSEvent objects
*/ */
+ (NSEvent*) enterExitEventWithType: (NSEventType)type + (NSEvent*) enterExitEventWithType: (NSEventType)type
location: (NSPoint)location location: (NSPoint)location
modifierFlags: (unsigned int)flags modifierFlags: (unsigned int)flags
timestamp: (NSTimeInterval)time timestamp: (NSTimeInterval)time
windowNumber: (int)windowNum windowNumber: (int)windowNum
context: (NSGraphicsContext*)context context: (NSGraphicsContext*)context
eventNumber: (int)eventNum eventNumber: (int)eventNum
trackingNumber: (int)trackingNum trackingNumber: (int)trackingNum
userData: (void *)userData userData: (void *)userData
{ {
NSEvent *e; NSEvent *e;
if (type == NSCursorUpdate) if (type == NSCursorUpdate)
RETAIN((id)userData); RETAIN((id)userData);
else if ((type != NSMouseEntered) && (type != NSMouseExited)) else if ((type != NSMouseEntered) && (type != NSMouseExited))
[NSException raise: NSInvalidArgumentException [NSException raise: NSInvalidArgumentException
format: @"enterExitEvent with wrong type"]; format: @"enterExitEvent with wrong type"];
e = (NSEvent*)NSAllocateObject(self, 0, NSDefaultMallocZone()); e = (NSEvent*)NSAllocateObject(self, 0, NSDefaultMallocZone());
if (self != eventClass) if (self != eventClass)
@ -118,21 +118,21 @@ static Class eventClass;
} }
+ (NSEvent*) keyEventWithType: (NSEventType)type + (NSEvent*) keyEventWithType: (NSEventType)type
location: (NSPoint)location location: (NSPoint)location
modifierFlags: (unsigned int)flags modifierFlags: (unsigned int)flags
timestamp: (NSTimeInterval)time timestamp: (NSTimeInterval)time
windowNumber: (int)windowNum windowNumber: (int)windowNum
context: (NSGraphicsContext *)context context: (NSGraphicsContext *)context
characters: (NSString *)keys characters: (NSString *)keys
charactersIgnoringModifiers: (NSString *)ukeys charactersIgnoringModifiers: (NSString *)ukeys
isARepeat: (BOOL)repeatKey isARepeat: (BOOL)repeatKey
keyCode: (unsigned short)code keyCode: (unsigned short)code
{ {
NSEvent *e; NSEvent *e;
if (type < NSKeyDown || type > NSFlagsChanged) if (!(NSEventMaskFromType(type) & GSKeyEventMask))
[NSException raise: NSInvalidArgumentException [NSException raise: NSInvalidArgumentException
format: @"keyEvent with wrong type"]; format: @"keyEvent with wrong type"];
e = (NSEvent*)NSAllocateObject(self, 0, NSDefaultMallocZone()); e = (NSEvent*)NSAllocateObject(self, 0, NSDefaultMallocZone());
if (self != eventClass) if (self != eventClass)
@ -156,20 +156,20 @@ static Class eventClass;
} }
+ (NSEvent*) mouseEventWithType: (NSEventType)type + (NSEvent*) mouseEventWithType: (NSEventType)type
location: (NSPoint)location location: (NSPoint)location
modifierFlags: (unsigned int)flags modifierFlags: (unsigned int)flags
timestamp: (NSTimeInterval)time timestamp: (NSTimeInterval)time
windowNumber: (int)windowNum windowNumber: (int)windowNum
context: (NSGraphicsContext*)context context: (NSGraphicsContext*)context
eventNumber: (int)eventNum eventNumber: (int)eventNum
clickCount: (int)clickNum clickCount: (int)clickNum
pressure: (float)pressureValue pressure: (float)pressureValue
{ {
NSEvent *e; NSEvent *e;
if (type < NSLeftMouseDown || type > NSRightMouseDragged) if (!(NSEventMaskFromType(type) & GSMouseEventMask))
[NSException raise: NSInvalidArgumentException [NSException raise: NSInvalidArgumentException
format: @"mouseEvent with wrong type"]; format: @"mouseEvent with wrong type"];
e = (NSEvent*)NSAllocateObject(self, 0, NSDefaultMallocZone()); e = (NSEvent*)NSAllocateObject(self, 0, NSDefaultMallocZone());
if (self != eventClass) if (self != eventClass)
@ -189,26 +189,25 @@ static Class eventClass;
return e; return e;
} }
+ (NSEvent*) mouseEventWithType: (NSEventType)type + (NSEvent*) mouseEventWithType: (NSEventType)type
location: (NSPoint)location location: (NSPoint)location
modifierFlags: (unsigned int)flags modifierFlags: (unsigned int)flags
timestamp: (NSTimeInterval)time timestamp: (NSTimeInterval)time
windowNumber: (int)windowNum windowNumber: (int)windowNum
context: (NSGraphicsContext*)context context: (NSGraphicsContext*)context
eventNumber: (int)eventNum eventNumber: (int)eventNum
clickCount: (int)clickNum clickCount: (int)clickNum
pressure: (float)pressureValue pressure: (float)pressureValue
buttonNumber: (int)buttonNum buttonNumber: (int)buttonNum
deltaX: (float)deltaX deltaX: (float)deltaX
deltaY: (float)deltaY deltaY: (float)deltaY
deltaZ: (float)deltaZ deltaZ: (float)deltaZ
{ {
NSEvent *e; NSEvent *e;
if ((type < NSLeftMouseDown || type > NSRightMouseDragged) if (!(NSEventMaskFromType(type) & GSMouseEventMask))
&& (type != NSScrollWheel))
[NSException raise: NSInvalidArgumentException [NSException raise: NSInvalidArgumentException
format: @"mouseEvent with wrong type"]; format: @"mouseEvent with wrong type"];
e = (NSEvent*)NSAllocateObject(self, 0, NSDefaultMallocZone()); e = (NSEvent*)NSAllocateObject(self, 0, NSDefaultMallocZone());
if (self != eventClass) if (self != eventClass)
@ -241,20 +240,20 @@ static Class eventClass;
} }
+ (NSEvent*) otherEventWithType: (NSEventType)type + (NSEvent*) otherEventWithType: (NSEventType)type
location: (NSPoint)location location: (NSPoint)location
modifierFlags: (unsigned int)flags modifierFlags: (unsigned int)flags
timestamp: (NSTimeInterval)time timestamp: (NSTimeInterval)time
windowNumber: (int)windowNum windowNumber: (int)windowNum
context: (NSGraphicsContext*)context context: (NSGraphicsContext*)context
subtype: (short)subType subtype: (short)subType
data1: (int)data1 data1: (int)data1
data2: (int)data2 data2: (int)data2
{ {
NSEvent *e; NSEvent *e;
if (type < NSAppKitDefined || type > NSPeriodic) if (!(NSEventMaskFromType(type) & GSOtherEventMask))
[NSException raise: NSInvalidArgumentException [NSException raise: NSInvalidArgumentException
format: @"otherEvent with wrong type"]; format: @"otherEvent with wrong type"];
e = (NSEvent*)NSAllocateObject(self, 0, NSDefaultMallocZone()); e = (NSEvent*)NSAllocateObject(self, 0, NSDefaultMallocZone());
if (self != eventClass) if (self != eventClass)
@ -278,17 +277,17 @@ static Class eventClass;
* Requesting Periodic Events * Requesting Periodic Events
*/ */
+ (void) startPeriodicEventsAfterDelay: (NSTimeInterval)delaySeconds + (void) startPeriodicEventsAfterDelay: (NSTimeInterval)delaySeconds
withPeriod: (NSTimeInterval)periodSeconds withPeriod: (NSTimeInterval)periodSeconds
{ {
NSTimer *timer; NSTimer *timer;
NSMutableDictionary *dict = GSCurrentThreadDictionary(); NSMutableDictionary *dict = GSCurrentThreadDictionary();
NSDebugLLog (@"NSEvent", @"startPeriodicEventsAfterDelay: withPeriod: "); NSDebugLLog (@"NSEvent", @"startPeriodicEventsAfterDelay: withPeriod: ");
if ([dict objectForKey: timerKey]) if ([dict objectForKey: timerKey])
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"Periodic events are already being generated for " format: @"Periodic events are already being generated for "
@"this thread %x", GSCurrentThread()]; @"this thread %x", GSCurrentThread()];
/* /*
* Register a timer that will fire in delaySeconds. * Register a timer that will fire in delaySeconds.
@ -296,31 +295,31 @@ static Class eventClass;
* a repeat timer that will send the following events * a repeat timer that will send the following events
*/ */
timer = [NSTimer timerWithTimeInterval: delaySeconds timer = [NSTimer timerWithTimeInterval: delaySeconds
target: self target: self
selector: @selector(_registerRealTimer:) selector: @selector(_registerRealTimer:)
userInfo: [NSNumber numberWithDouble: periodSeconds] userInfo: [NSNumber numberWithDouble: periodSeconds]
repeats: NO]; repeats: NO];
[[NSRunLoop currentRunLoop] addTimer: timer [[NSRunLoop currentRunLoop] addTimer: timer
forMode: NSEventTrackingRunLoopMode]; forMode: NSEventTrackingRunLoopMode];
[dict setObject: timer forKey: timerKey]; [dict setObject: timer forKey: timerKey];
} }
+ (void) _timerFired: (NSTimer*)timer + (void) _timerFired: (NSTimer*)timer
{ {
NSTimeInterval timeInterval; NSTimeInterval timeInterval;
NSEvent *periodicEvent; NSEvent *periodicEvent;
timeInterval = [[NSDate date] timeIntervalSinceReferenceDate]; timeInterval = [[NSDate date] timeIntervalSinceReferenceDate];
periodicEvent = [self otherEventWithType: NSPeriodic periodicEvent = [self otherEventWithType: NSPeriodic
location: NSZeroPoint location: NSZeroPoint
modifierFlags: 0 modifierFlags: 0
timestamp: timeInterval timestamp: timeInterval
windowNumber: 0 windowNumber: 0
context: [NSApp context] context: [NSApp context]
subtype: 0 subtype: 0
data1: 0 data1: 0
data2: 0]; data2: 0];
NSDebugLLog (@"NSEvent", @"_timerFired: "); NSDebugLLog (@"NSEvent", @"_timerFired: ");
[NSApp postEvent: periodicEvent atStart: NO]; [NSApp postEvent: periodicEvent atStart: NO];
@ -331,42 +330,42 @@ static Class eventClass;
*/ */
+ (void) _registerRealTimer: (NSTimer*)timer + (void) _registerRealTimer: (NSTimer*)timer
{ {
NSTimer *realTimer; NSTimer *realTimer;
NSMutableDictionary *dict = GSCurrentThreadDictionary(); NSMutableDictionary *dict = GSCurrentThreadDictionary();
NSDebugLLog (@"NSEvent", @"_registerRealTimer: "); NSDebugLLog (@"NSEvent", @"_registerRealTimer: ");
{ {
NSTimeInterval timeInterval; NSTimeInterval timeInterval;
NSEvent *periodicEvent; NSEvent *periodicEvent;
timeInterval = [[NSDate date] timeIntervalSinceReferenceDate]; timeInterval = [[NSDate date] timeIntervalSinceReferenceDate];
periodicEvent = [self otherEventWithType: NSPeriodic periodicEvent = [self otherEventWithType: NSPeriodic
location: NSZeroPoint location: NSZeroPoint
modifierFlags: 0 modifierFlags: 0
timestamp: timeInterval timestamp: timeInterval
windowNumber: 0 windowNumber: 0
context: [NSApp context] context: [NSApp context]
subtype: 0 subtype: 0
data1: 0 data1: 0
data2: 0]; data2: 0];
[NSApp postEvent: periodicEvent atStart: NO]; [NSApp postEvent: periodicEvent atStart: NO];
} }
realTimer = [NSTimer timerWithTimeInterval: [[timer userInfo] doubleValue] realTimer = [NSTimer timerWithTimeInterval: [[timer userInfo] doubleValue]
target: self target: self
selector: @selector(_timerFired:) selector: @selector(_timerFired:)
userInfo: nil userInfo: nil
repeats: YES]; repeats: YES];
[dict setObject: realTimer forKey: timerKey]; [dict setObject: realTimer forKey: timerKey];
[[NSRunLoop currentRunLoop] addTimer: realTimer [[NSRunLoop currentRunLoop] addTimer: realTimer
forMode: NSEventTrackingRunLoopMode]; forMode: NSEventTrackingRunLoopMode];
} }
+ (void) stopPeriodicEvents + (void) stopPeriodicEvents
{ {
NSTimer *timer; NSTimer *timer;
NSMutableDictionary *dict = GSCurrentThreadDictionary(); NSMutableDictionary *dict = GSCurrentThreadDictionary();
NSDebugLLog (@"NSEvent", @"stopPeriodicEvents"); NSDebugLLog (@"NSEvent", @"stopPeriodicEvents");
timer = [dict objectForKey: timerKey]; timer = [dict objectForKey: timerKey];
@ -382,10 +381,10 @@ static Class eventClass;
*/ */
- (int) buttonNumber - (int) buttonNumber
{ {
if (event_type < NSLeftMouseDown || event_type > NSMouseExited) if (!(NSEventMaskFromType(event_type) & GSMouseEventMask))
{ {
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"buttonNumber requested for non-mouse event"]; format: @"buttonNumber requested for non-mouse event"];
} }
return event_data.mouse.button; return event_data.mouse.button;
} }
@ -400,7 +399,7 @@ static Class eventClass;
if ((event_type != NSKeyUp) && (event_type != NSKeyDown)) if ((event_type != NSKeyUp) && (event_type != NSKeyDown))
{ {
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"characters requested for non-keyboard event"]; format: @"characters requested for non-keyboard event"];
} }
return event_data.key.char_keys; return event_data.key.char_keys;
} }
@ -416,8 +415,8 @@ static Class eventClass;
if ((event_type != NSKeyUp) && (event_type != NSKeyDown)) if ((event_type != NSKeyUp) && (event_type != NSKeyDown))
{ {
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"charactersIgnoringModifiers requested for " format: @"charactersIgnoringModifiers requested for "
@"non-keyboard event"]; @"non-keyboard event"];
} }
return event_data.key.unmodified_keys; return event_data.key.unmodified_keys;
} }
@ -432,10 +431,10 @@ static Class eventClass;
- (int) clickCount - (int) clickCount
{ {
/* Make sure it is one of the right event types */ /* Make sure it is one of the right event types */
if (event_type < NSLeftMouseDown || event_type > NSRightMouseUp) if (!(NSEventMaskFromType(event_type) & GSMouseEventMask))
{ {
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"clickCount requested for non-mouse event"]; format: @"clickCount requested for non-mouse event"];
} }
return event_data.mouse.click; return event_data.mouse.click;
} }
@ -456,12 +455,12 @@ static Class eventClass;
{ {
event_data.key.char_keys = [event_data.key.char_keys copyWithZone: zone]; event_data.key.char_keys = [event_data.key.char_keys copyWithZone: zone];
event_data.key.unmodified_keys event_data.key.unmodified_keys
= [event_data.key.unmodified_keys copyWithZone: zone]; = [event_data.key.unmodified_keys copyWithZone: zone];
} }
else if (event_type == NSCursorUpdate) else if (event_type == NSCursorUpdate)
{ {
event_data.tracking.user_data event_data.tracking.user_data
= (void *)[(id)event_data.tracking.user_data copyWithZone: zone]; = (void *)[(id)event_data.tracking.user_data copyWithZone: zone];
} }
return e; return e;
} }
@ -477,7 +476,7 @@ static Class eventClass;
if (event_type < NSAppKitDefined || event_type > NSPeriodic) if (event_type < NSAppKitDefined || event_type > NSPeriodic)
{ {
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"data1 requested for invalid event type"]; format: @"data1 requested for invalid event type"];
} }
return event_data.misc.data1; return event_data.misc.data1;
} }
@ -493,7 +492,7 @@ static Class eventClass;
if (event_type < NSAppKitDefined || event_type > NSPeriodic) if (event_type < NSAppKitDefined || event_type > NSPeriodic)
{ {
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"data2 requested for invalid event type"]; format: @"data2 requested for invalid event type"];
} }
return event_data.misc.data2; return event_data.misc.data2;
} }
@ -525,11 +524,10 @@ static Class eventClass;
*/ */
- (float)deltaX - (float)deltaX
{ {
if (event_type != NSScrollWheel if (!(NSEventMaskFromType(event_type) & GSMouseMovedEventMask))
&& (event_type < NSMouseMoved || event_type > NSRightMouseDragged))
{ {
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"deltaX requested for invalid event type"]; format: @"deltaX requested for invalid event type"];
} }
return event_data.mouse.deltaX; return event_data.mouse.deltaX;
} }
@ -546,11 +544,10 @@ static Class eventClass;
*/ */
- (float)deltaY - (float)deltaY
{ {
if (event_type != NSScrollWheel if (!(NSEventMaskFromType(event_type) & GSMouseMovedEventMask))
&& (event_type < NSMouseMoved || event_type > NSRightMouseDragged))
{ {
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"deltaY requested for invalid event type"]; format: @"deltaY requested for invalid event type"];
} }
return event_data.mouse.deltaY; return event_data.mouse.deltaY;
} }
@ -570,11 +567,10 @@ static Class eventClass;
*/ */
- (float)deltaZ - (float)deltaZ
{ {
if (event_type != NSScrollWheel if (!(NSEventMaskFromType(event_type) & GSMouseMovedEventMask))
&& (event_type < NSMouseMoved || event_type > NSRightMouseDragged))
{ {
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"deltaZ requested for invalid event type"]; format: @"deltaZ requested for invalid event type"];
} }
return event_data.mouse.deltaZ; return event_data.mouse.deltaZ;
} }
@ -582,15 +578,13 @@ static Class eventClass;
- (NSString*) description - (NSString*) description
{ {
static const char *eventTypes[] = { static const char *eventTypes[] = {
"nullEvent",
"leftMouseDown", "leftMouseDown",
"leftMouseUp", "leftMouseUp",
"otherMouseDown",
"otherMouseUp",
"rightMouseDown", "rightMouseDown",
"rightMouseUp", "rightMouseUp",
"mouseMoved", "mouseMoved",
"leftMouseDragged", "leftMouseDragged",
"otherMouseDragged",
"rightMouseDragged", "rightMouseDragged",
"mouseEntered", "mouseEntered",
"mouseExited", "mouseExited",
@ -602,7 +596,12 @@ static const char *eventTypes[] = {
"applicationDefined", "applicationDefined",
"periodic", "periodic",
"cursorUpdate", "cursorUpdate",
"scrollWheel" "scrollWheel",
"tabletPoint",
"tabletProximity",
"otherMouseDown",
"otherMouseUp",
"otherMouseDragged"
}; };
switch (event_type) switch (event_type)
@ -613,41 +612,41 @@ static const char *eventTypes[] = {
case NSOtherMouseUp: case NSOtherMouseUp:
case NSRightMouseDown: case NSRightMouseDown:
case NSRightMouseUp: case NSRightMouseUp:
return [NSString stringWithFormat: return [NSString stringWithFormat:
@"NSEvent: eventType = %s, point = { %f, %f }, modifiers = %u," @"NSEvent: eventType = %s, point = { %f, %f }, modifiers = %u,"
@" time = %f, window = %d, dpsContext = %p," @" time = %f, window = %d, dpsContext = %p,"
@" event number = %d, click = %d, pressure = %f", @" event number = %d, click = %d, pressure = %f",
eventTypes[event_type], location_point.x, location_point.y, eventTypes[event_type], location_point.x, location_point.y,
modifier_flags, event_time, window_num, event_context, modifier_flags, event_time, window_num, event_context,
event_data.mouse.event_num, event_data.mouse.click, event_data.mouse.event_num, event_data.mouse.click,
event_data.mouse.pressure]; event_data.mouse.pressure];
break; break;
case NSMouseEntered: case NSMouseEntered:
case NSMouseExited: case NSMouseExited:
return [NSString stringWithFormat: return [NSString stringWithFormat:
@"NSEvent: eventType = %s, point = { %f, %f }, modifiers = %u," @"NSEvent: eventType = %s, point = { %f, %f }, modifiers = %u,"
@" time = %f, window = %d, dpsContext = %p, " @" time = %f, window = %d, dpsContext = %p, "
@" event number = %d, tracking number = %d, user data = %p", @" event number = %d, tracking number = %d, user data = %p",
eventTypes[event_type], location_point.x, location_point.y, eventTypes[event_type], location_point.x, location_point.y,
modifier_flags, event_time, window_num, event_context, modifier_flags, event_time, window_num, event_context,
event_data.tracking.event_num, event_data.tracking.event_num,
event_data.tracking.tracking_num, event_data.tracking.tracking_num,
event_data.tracking.user_data]; event_data.tracking.user_data];
break; break;
case NSKeyDown: case NSKeyDown:
case NSKeyUp: case NSKeyUp:
return [NSString stringWithFormat: return [NSString stringWithFormat:
@"NSEvent: eventType = %s, point = { %f, %f }, modifiers = %u," @"NSEvent: eventType = %s, point = { %f, %f }, modifiers = %u,"
@" time = %f, window = %d, dpsContext = %p, " @" time = %f, window = %d, dpsContext = %p, "
@" repeat = %s, keys = %@, ukeys = %@, keyCode = 0x%x", @" repeat = %s, keys = %@, ukeys = %@, keyCode = 0x%x",
eventTypes[event_type], location_point.x, location_point.y, eventTypes[event_type], location_point.x, location_point.y,
modifier_flags, event_time, window_num, event_context, modifier_flags, event_time, window_num, event_context,
(event_data.key.repeat ? "YES" : "NO"), (event_data.key.repeat ? "YES" : "NO"),
event_data.key.char_keys, event_data.key.unmodified_keys, event_data.key.char_keys, event_data.key.unmodified_keys,
event_data.key.key_code]; event_data.key.key_code];
break; break;
case NSFlagsChanged: case NSFlagsChanged:
case NSPeriodic: case NSPeriodic:
@ -655,34 +654,39 @@ static const char *eventTypes[] = {
case NSAppKitDefined: case NSAppKitDefined:
case NSSystemDefined: case NSSystemDefined:
case NSApplicationDefined: case NSApplicationDefined:
return [NSString stringWithFormat: return [NSString stringWithFormat:
@"NSEvent: eventType = %s, point = { %f, %f }, modifiers = %u," @"NSEvent: eventType = %s, point = { %f, %f }, modifiers = %u,"
@" time = %f, window = %d, dpsContext = %p, " @" time = %f, window = %d, dpsContext = %p, "
@" subtype = %d, data1 = %p, data2 = %p", @" subtype = %d, data1 = %p, data2 = %p",
eventTypes[event_type], location_point.x, location_point.y, eventTypes[event_type], location_point.x, location_point.y,
modifier_flags, event_time, window_num, event_context, modifier_flags, event_time, window_num, event_context,
event_data.misc.sub_type, event_data.misc.data1, event_data.misc.sub_type, event_data.misc.data1,
event_data.misc.data2]; event_data.misc.data2];
break; break;
case NSScrollWheel: case NSScrollWheel:
case NSMouseMoved: case NSMouseMoved:
case NSLeftMouseDragged: case NSLeftMouseDragged:
case NSOtherMouseDragged: case NSOtherMouseDragged:
case NSRightMouseDragged: case NSRightMouseDragged:
return [NSString stringWithFormat: return [NSString stringWithFormat:
@"NSEvent: eventType = %s, point = { %f, %f }, modifiers = %u," @"NSEvent: eventType = %s, point = { %f, %f }, modifiers = %u,"
@" time = %f, window = %d, dpsContext = %p," @" time = %f, window = %d, dpsContext = %p,"
@" event number = %d, click = %d, pressure = %f" @" event number = %d, click = %d, pressure = %f"
@" button = %d, deltaX = %f, deltaY = %f, deltaZ = %f", @" button = %d, deltaX = %f, deltaY = %f, deltaZ = %f",
eventTypes[event_type], location_point.x, location_point.y, eventTypes[event_type], location_point.x, location_point.y,
modifier_flags, event_time, window_num, event_context, modifier_flags, event_time, window_num, event_context,
event_data.mouse.event_num, event_data.mouse.click, event_data.mouse.event_num, event_data.mouse.click,
event_data.mouse.pressure, event_data.mouse.button, event_data.mouse.pressure, event_data.mouse.button,
event_data.mouse.deltaX, event_data.mouse.deltaX,
event_data.mouse.deltaY, event_data.mouse.deltaY,
event_data.mouse.deltaZ]; event_data.mouse.deltaZ];
break; break;
case NSTabletPoint:
case NSTabletProximity:
// FIXME: Tablet events
break;
} }
return [super description]; return [super description];
@ -709,37 +713,42 @@ static const char *eventTypes[] = {
case NSLeftMouseDragged: case NSLeftMouseDragged:
case NSOtherMouseDragged: case NSOtherMouseDragged:
case NSRightMouseDragged: case NSRightMouseDragged:
[aCoder encodeValuesOfObjCTypes: "iififff", &event_data.mouse.event_num, [aCoder encodeValuesOfObjCTypes: "iififff", &event_data.mouse.event_num,
&event_data.mouse.click, &event_data.mouse.pressure, &event_data.mouse.click, &event_data.mouse.pressure,
&event_data.mouse.button, &event_data.mouse.deltaX, &event_data.mouse.button, &event_data.mouse.deltaX,
&event_data.mouse.deltaY, &event_data.mouse.deltaZ]; &event_data.mouse.deltaY, &event_data.mouse.deltaZ];
break; break;
case NSMouseEntered: case NSMouseEntered:
case NSMouseExited: case NSMouseExited:
case NSCursorUpdate: case NSCursorUpdate:
// Can't do anything with the user_data!? // Can't do anything with the user_data!?
[aCoder encodeValuesOfObjCTypes: "ii", &event_data.tracking.event_num, [aCoder encodeValuesOfObjCTypes: "ii", &event_data.tracking.event_num,
&event_data.tracking.tracking_num]; &event_data.tracking.tracking_num];
break; break;
case NSKeyDown: case NSKeyDown:
case NSKeyUp: case NSKeyUp:
[aCoder encodeValueOfObjCType: @encode(BOOL) [aCoder encodeValueOfObjCType: @encode(BOOL)
at: &event_data.key.repeat]; at: &event_data.key.repeat];
[aCoder encodeObject: event_data.key.char_keys]; [aCoder encodeObject: event_data.key.char_keys];
[aCoder encodeObject: event_data.key.unmodified_keys]; [aCoder encodeObject: event_data.key.unmodified_keys];
[aCoder encodeValueOfObjCType: "S" at: &event_data.key.key_code]; [aCoder encodeValueOfObjCType: "S" at: &event_data.key.key_code];
break; break;
case NSFlagsChanged: case NSFlagsChanged:
case NSPeriodic: case NSPeriodic:
case NSAppKitDefined: case NSAppKitDefined:
case NSSystemDefined: case NSSystemDefined:
case NSApplicationDefined: case NSApplicationDefined:
[aCoder encodeValuesOfObjCTypes: "sii", &event_data.misc.sub_type, [aCoder encodeValuesOfObjCTypes: "sii", &event_data.misc.sub_type,
&event_data.misc.data1, &event_data.misc.data2]; &event_data.misc.data1, &event_data.misc.data2];
break; break;
case NSTabletPoint:
case NSTabletProximity:
// FIXME: Tablet events
break;
} }
} }
@ -753,9 +762,10 @@ static const char *eventTypes[] = {
- (int) eventNumber - (int) eventNumber
{ {
/* Make sure it is one of the right event types */ /* Make sure it is one of the right event types */
if (event_type < NSLeftMouseDown || event_type > NSMouseExited) if (!(NSEventMaskFromType(event_type) & GSMouseEventMask) &&
!(NSEventMaskFromType(event_type) & GSEnterExitEventMask))
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"eventNumber requested for non-mouse event"]; format: @"eventNumber requested for non-mouse event"];
if ((event_type == NSMouseEntered) || (event_type == NSMouseExited)) if ((event_type == NSMouseEntered) || (event_type == NSMouseExited))
return event_data.tracking.event_num; return event_data.tracking.event_num;
@ -765,12 +775,44 @@ static const char *eventTypes[] = {
- (id) initWithCoder: (NSCoder*)aDecoder - (id) initWithCoder: (NSCoder*)aDecoder
{ {
int version = [aDecoder versionForClassName: @"NSEvent"];
[aDecoder decodeValueOfObjCType: @encode(NSEventType) at: &event_type]; [aDecoder decodeValueOfObjCType: @encode(NSEventType) at: &event_type];
location_point = [aDecoder decodePoint]; location_point = [aDecoder decodePoint];
[aDecoder decodeValueOfObjCType: @encode(unsigned) at: &modifier_flags]; [aDecoder decodeValueOfObjCType: @encode(unsigned) at: &modifier_flags];
[aDecoder decodeValueOfObjCType: @encode(NSTimeInterval) at: &event_time]; [aDecoder decodeValueOfObjCType: @encode(NSTimeInterval) at: &event_time];
[aDecoder decodeValueOfObjCType: @encode(unsigned) at: &window_num]; [aDecoder decodeValueOfObjCType: @encode(unsigned) at: &window_num];
if (version == 1)
{
// For the unlikely case that old events have been stored, convert them.
switch (event_type)
{
case 0: event_type = NSLeftMouseDown; break;
case 1: event_type = NSLeftMouseUp; break;
case 2: event_type = NSOtherMouseDown; break;
case 3: event_type = NSOtherMouseUp; break;
case 4: event_type = NSRightMouseDown; break;
case 5: event_type = NSRightMouseUp; break;
case 6: event_type = NSMouseMoved; break;
case 7: event_type = NSLeftMouseDragged; break;
case 8: event_type = NSOtherMouseDragged; break;
case 9: event_type = NSRightMouseDragged; break;
case 10: event_type = NSMouseEntered; break;
case 11: event_type = NSMouseExited; break;
case 12: event_type = NSKeyDown; break;
case 13: event_type = NSKeyUp; break;
case 14: event_type = NSFlagsChanged; break;
case 15: event_type = NSAppKitDefined; break;
case 16: event_type = NSSystemDefined; break;
case 17: event_type = NSApplicationDefined; break;
case 18: event_type = NSPeriodic; break;
case 19: event_type = NSCursorUpdate; break;
case 20: event_type = NSScrollWheel; break;
default: break;
}
}
// Decode the event date based upon the event type // Decode the event date based upon the event type
switch (event_type) switch (event_type)
{ {
@ -785,38 +827,43 @@ static const char *eventTypes[] = {
case NSLeftMouseDragged: case NSLeftMouseDragged:
case NSOtherMouseDragged: case NSOtherMouseDragged:
case NSRightMouseDragged: case NSRightMouseDragged:
[aDecoder decodeValuesOfObjCTypes: "iififff", [aDecoder decodeValuesOfObjCTypes: "iififff",
&event_data.mouse.event_num, &event_data.mouse.click, &event_data.mouse.event_num, &event_data.mouse.click,
&event_data.mouse.pressure, &event_data.mouse.button, &event_data.mouse.pressure, &event_data.mouse.button,
&event_data.mouse.deltaX, &event_data.mouse.deltaY, &event_data.mouse.deltaX, &event_data.mouse.deltaY,
&event_data.mouse.deltaZ]; &event_data.mouse.deltaZ];
break; break;
case NSMouseEntered: case NSMouseEntered:
case NSMouseExited: case NSMouseExited:
case NSCursorUpdate: case NSCursorUpdate:
// Can't do anything with the user_data!? // Can't do anything with the user_data!?
[aDecoder decodeValuesOfObjCTypes: "ii", &event_data.tracking.event_num, [aDecoder decodeValuesOfObjCTypes: "ii", &event_data.tracking.event_num,
&event_data.tracking.tracking_num]; &event_data.tracking.tracking_num];
break; break;
case NSKeyDown: case NSKeyDown:
case NSKeyUp: case NSKeyUp:
[aDecoder decodeValueOfObjCType: @encode(BOOL) [aDecoder decodeValueOfObjCType: @encode(BOOL)
at: &event_data.key.repeat]; at: &event_data.key.repeat];
event_data.key.char_keys = [aDecoder decodeObject]; event_data.key.char_keys = [aDecoder decodeObject];
event_data.key.unmodified_keys = [aDecoder decodeObject]; event_data.key.unmodified_keys = [aDecoder decodeObject];
[aDecoder decodeValueOfObjCType: "S" at: &event_data.key.key_code]; [aDecoder decodeValueOfObjCType: "S" at: &event_data.key.key_code];
break; break;
case NSFlagsChanged: case NSFlagsChanged:
case NSPeriodic: case NSPeriodic:
case NSAppKitDefined: case NSAppKitDefined:
case NSSystemDefined: case NSSystemDefined:
case NSApplicationDefined: case NSApplicationDefined:
[aDecoder decodeValuesOfObjCTypes: "sii", &event_data.misc.sub_type, [aDecoder decodeValuesOfObjCTypes: "sii", &event_data.misc.sub_type,
&event_data.misc.data1, &event_data.misc.data2]; &event_data.misc.data1, &event_data.misc.data2];
break; break;
case NSTabletPoint:
case NSTabletProximity:
// FIXME: Tablet events
break;
} }
return self; return self;
@ -831,7 +878,7 @@ static const char *eventTypes[] = {
{ {
if ((event_type != NSKeyUp) && (event_type != NSKeyDown)) if ((event_type != NSKeyUp) && (event_type != NSKeyDown))
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"isARepeat requested for non-keyboard event"]; format: @"isARepeat requested for non-keyboard event"];
return event_data.key.repeat; return event_data.key.repeat;
} }
@ -847,7 +894,7 @@ static const char *eventTypes[] = {
&& (event_type != NSFlagsChanged)) && (event_type != NSFlagsChanged))
{ {
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"keyCode requested for non-keyboard event"]; format: @"keyCode requested for non-keyboard event"];
} }
return event_data.key.key_code; return event_data.key.key_code;
} }
@ -879,10 +926,10 @@ static const char *eventTypes[] = {
- (float) pressure - (float) pressure
{ {
/* Make sure it is one of the right event types */ /* Make sure it is one of the right event types */
if (event_type < NSLeftMouseDown || event_type > NSRightMouseDragged) if (!(NSEventMaskFromType(event_type) & GSMouseEventMask))
{ {
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"pressure requested for non-mouse event"]; format: @"pressure requested for non-mouse event"];
} }
return event_data.mouse.pressure; return event_data.mouse.pressure;
} }
@ -891,16 +938,28 @@ static const char *eventTypes[] = {
* Returns the 'subtype' item associated with the event. * Returns the 'subtype' item associated with the event.
* <br />Raises NSInternalInconsistencyException if the event is not * <br />Raises NSInternalInconsistencyException if the event is not
* of type NSAppKitDefined, NSSystemDefined, NSApplicationDefined, * of type NSAppKitDefined, NSSystemDefined, NSApplicationDefined,
* or NSPeriodic * NSPeriodic or a mouve event.
*/ */
- (short) subtype - (short) subtype
{ {
if (event_type < NSAppKitDefined || event_type > NSPeriodic) if (!(NSEventMaskFromType(event_type) & GSOtherEventMask) &&
!(NSEventMaskFromType(event_type) & GSMouseEventMask))
{ {
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"subtype requested for invalid event type"]; format: @"subtype requested for invalid event type"];
}
if (NSEventMaskFromType(event_type) & GSOtherEventMask)
return event_data.misc.sub_type;
else
{
if (event_type == NSTabletPoint)
return NSTabletPointEventSubtype;
else if (event_type == NSTabletProximity)
return NSTabletProximityEventSubtype;
else
return NSMouseEventSubtype;
} }
return event_data.misc.sub_type;;
} }
/** /**
@ -923,7 +982,7 @@ static const char *eventTypes[] = {
&& event_type != NSCursorUpdate) && event_type != NSCursorUpdate)
{ {
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"trackingNumber requested for non-tracking event"]; format: @"trackingNumber requested for non-tracking event"];
} }
return event_data.tracking.tracking_num; return event_data.tracking.tracking_num;
} }
@ -948,7 +1007,7 @@ static const char *eventTypes[] = {
&& event_type != NSCursorUpdate) && event_type != NSCursorUpdate)
{ {
[NSException raise: NSInternalInconsistencyException [NSException raise: NSInternalInconsistencyException
format: @"userData requested for non-tracking event"]; format: @"userData requested for non-tracking event"];
} }
return event_data.tracking.user_data; return event_data.tracking.user_data;
} }
@ -973,4 +1032,121 @@ static const char *eventTypes[] = {
return window_num; return window_num;
} }
/*
* Methods for tablet events
*/
- (int) absoluteX
{
// FIXME
return 0;
}
- (int) absoluteY
{
// FIXME
return 0;
}
- (int) absoluteZ
{
// FIXME
return 0;
}
- (unsigned int) buttonMask
{
// FIXME
return 0;
}
- (unsigned int) capabilityMask
{
// FIXME
return 0;
}
- (unsigned int) deviceID
{
// FIXME
return 0;
}
- (BOOL) isEnteringProximity
{
// FIXME
return NO;
}
- (unsigned int) pointingDeviceID
{
// FIXME
return 0;
}
- (unsigned int) pointingDeviceSerialNumber
{
// FIXME
return 0;
}
- (NSPointingDeviceType) pointingDeviceType
{
// FIXME
return NSUnknownPointingDevice;
}
- (float) rotation
{
// FIXME
return 0.0;
}
- (unsigned int) systemTabletID
{
// FIXME
return 0;
}
- (unsigned int) tabletID
{
// FIXME
return 0;
}
- (float) tangentialPressure
{
// FIXME
return 0.0;
}
- (NSPoint) tilt
{
// FIXME
return NSMakePoint(0.0, 0.0);
}
- (unsigned long long) uniqueID
{
// FIXME
return 0;
}
- (id) vendorDefined
{
// FIXME
return nil;
}
- (unsigned int) vendorID
{
// FIXME
return 0;
}
- (unsigned int) vendorPointingDeviceType
{
// FIXME
return 0;
}
@end @end

View file

@ -3759,6 +3759,11 @@ resetCursorRectsForView(NSView *theView)
case NSSystemDefined: case NSSystemDefined:
case NSApplicationDefined: case NSApplicationDefined:
break; break;
case NSTabletPoint:
case NSTabletProximity:
// FIXME: Tablet events
break;
} }
} }