160 lines
4.1 KiB
C
160 lines
4.1 KiB
C
/*
|
||
* tkMacOSXEvent.c --
|
||
*
|
||
* This file contains the basic Mac OS X Event handling routines.
|
||
*
|
||
* Copyright (c) 1995-1997 Sun Microsystems, Inc.
|
||
* Copyright 2001-2009, Apple Inc.
|
||
* Copyright (c) 2005-2009 Daniel A. Steffen <das@users.sourceforge.net>
|
||
*
|
||
* See the file "license.terms" for information on usage and redistribution
|
||
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||
*/
|
||
|
||
#include "tkMacOSXPrivate.h"
|
||
#include "tkMacOSXEvent.h"
|
||
#include "tkMacOSXDebug.h"
|
||
#include "tkMacOSXConstants.h"
|
||
|
||
#pragma mark TKApplication(TKEvent)
|
||
|
||
enum {
|
||
NSWindowWillMoveEventType = 20
|
||
};
|
||
|
||
@implementation TKApplication(TKEvent)
|
||
/* TODO: replace by +[addLocalMonitorForEventsMatchingMask ? */
|
||
- (NSEvent *) tkProcessEvent: (NSEvent *) theEvent
|
||
{
|
||
#ifdef TK_MAC_DEBUG_EVENTS
|
||
TKLog(@"-[%@(%p) %s] %@", [self class], self, _cmd, theEvent);
|
||
#endif
|
||
NSEvent *processedEvent = theEvent;
|
||
NSEventType type = [theEvent type];
|
||
NSInteger subtype;
|
||
|
||
switch ((NSInteger)type) {
|
||
case NSAppKitDefined:
|
||
subtype = [theEvent subtype];
|
||
|
||
switch (subtype) {
|
||
/* Ignored at the moment. */
|
||
case NSApplicationActivatedEventType:
|
||
break;
|
||
case NSApplicationDeactivatedEventType:
|
||
break;
|
||
case NSWindowExposedEventType:
|
||
break;
|
||
case NSScreenChangedEventType:
|
||
break;
|
||
case NSWindowMovedEventType:
|
||
break;
|
||
case NSWindowWillMoveEventType:
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
break; /* AppkitEvent. Return theEvent */
|
||
case NSKeyUp:
|
||
case NSKeyDown:
|
||
case NSFlagsChanged:
|
||
processedEvent = [self tkProcessKeyEvent:theEvent];
|
||
break; /* Key event. Return the processed event. */
|
||
case NSLeftMouseDown:
|
||
case NSLeftMouseUp:
|
||
case NSRightMouseDown:
|
||
case NSRightMouseUp:
|
||
case NSLeftMouseDragged:
|
||
case NSRightMouseDragged:
|
||
case NSMouseMoved:
|
||
case NSMouseEntered:
|
||
case NSMouseExited:
|
||
case NSScrollWheel:
|
||
case NSOtherMouseDown:
|
||
case NSOtherMouseUp:
|
||
case NSOtherMouseDragged:
|
||
case NSTabletPoint:
|
||
case NSTabletProximity:
|
||
processedEvent = [self tkProcessMouseEvent:theEvent];
|
||
break; /* Mouse event. Return the processed event. */
|
||
#if 0
|
||
case NSSystemDefined:
|
||
subtype = [theEvent subtype];
|
||
break;
|
||
case NSApplicationDefined: {
|
||
id win;
|
||
win = [theEvent window];
|
||
break;
|
||
}
|
||
case NSCursorUpdate:
|
||
break;
|
||
case NSEventTypeGesture:
|
||
case NSEventTypeMagnify:
|
||
case NSEventTypeRotate:
|
||
case NSEventTypeSwipe:
|
||
case NSEventTypeBeginGesture:
|
||
case NSEventTypeEndGesture:
|
||
break;
|
||
#endif
|
||
|
||
default:
|
||
break; /* return theEvent */
|
||
}
|
||
return processedEvent;
|
||
}
|
||
@end
|
||
|
||
#pragma mark -
|
||
|
||
/*
|
||
*----------------------------------------------------------------------
|
||
*
|
||
* TkMacOSXFlushWindows --
|
||
*
|
||
* This routine is a stub called by XSync, which is called during the Tk
|
||
* update command. The language specification does not require that the
|
||
* update command be synchronous but many of the tests assume that is the
|
||
* case. It is not naturally the case on macOS since many idle tasks are
|
||
* run inside of the drawRect method of a window's contentView, and that
|
||
* method will not be called until after this function returns. To make
|
||
* the tests work, we attempt to force this to be synchronous by waiting
|
||
* until drawRect has been called for each window. The mechanism we use
|
||
* for this is to have drawRect post an ApplicationDefined NSEvent on the
|
||
* AppKit event queue when it finishes drawing, and wait for it here.
|
||
*
|
||
* Results:
|
||
* None.
|
||
*
|
||
* Side effects:
|
||
* Calls the drawRect method of the contentView of each visible
|
||
* window.
|
||
*
|
||
*----------------------------------------------------------------------
|
||
*/
|
||
|
||
MODULE_SCOPE void
|
||
TkMacOSXFlushWindows(void)
|
||
{
|
||
NSArray *macWindows = [NSApp orderedWindows];
|
||
if ([NSApp simulateDrawing]) {
|
||
[NSApp setSimulateDrawing:NO];
|
||
return;
|
||
}
|
||
for (NSWindow *w in macWindows) {
|
||
if (TkMacOSXGetXWindow(w)) {
|
||
[w displayIfNeeded];
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
/*
|
||
* Local Variables:
|
||
* mode: objc
|
||
* c-basic-offset: 4
|
||
* fill-column: 79
|
||
* coding: utf-8
|
||
* End:
|
||
*/
|