mirror of
https://github.com/mauiaaron/apple2.git
synced 2024-12-27 06:29:19 +00:00
270 lines
6.8 KiB
Mathematica
270 lines
6.8 KiB
Mathematica
|
/*
|
||
|
* Copyright (c) 2007 Dave Dribin
|
||
|
*
|
||
|
* Permission is hereby granted, free of charge, to any person
|
||
|
* obtaining a copy of this software and associated documentation
|
||
|
* files (the "Software"), to deal in the Software without
|
||
|
* restriction, including without limitation the rights to use, copy,
|
||
|
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||
|
* of the Software, and to permit persons to whom the Software is
|
||
|
* furnished to do so, subject to the following conditions:
|
||
|
*
|
||
|
* The above copyright notice and this permission notice shall be
|
||
|
* included in all copies or substantial portions of the Software.
|
||
|
*
|
||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||
|
* SOFTWARE.
|
||
|
*/
|
||
|
|
||
|
#import "WatcherWindowController.h"
|
||
|
#import "DDHidQueue.h"
|
||
|
#import "DDHidEvent.h"
|
||
|
#import "DDHidUsage.h"
|
||
|
|
||
|
@interface WatcherEvent : NSObject
|
||
|
{
|
||
|
NSString * mUsageDescription;
|
||
|
DDHidEvent * mEvent;
|
||
|
int mIndex;
|
||
|
}
|
||
|
|
||
|
- (id) initWithUsageDescription: (NSString *) anUsageDecription
|
||
|
event: (DDHidEvent *) anEvent
|
||
|
index: (int) index;
|
||
|
|
||
|
- (NSString *) usageDescription;
|
||
|
- (DDHidEvent *) event;
|
||
|
- (int) index;
|
||
|
|
||
|
@end
|
||
|
|
||
|
@implementation WatcherEvent : NSObject
|
||
|
|
||
|
- (id) initWithUsageDescription: (NSString *) anUsageDescription
|
||
|
event: (DDHidEvent *) anEvent
|
||
|
index: (int) index
|
||
|
{
|
||
|
if (self = [super init])
|
||
|
{
|
||
|
mUsageDescription = [anUsageDescription retain];
|
||
|
mEvent = [anEvent retain];
|
||
|
mIndex = index;
|
||
|
}
|
||
|
return self;
|
||
|
}
|
||
|
|
||
|
//===========================================================
|
||
|
// dealloc
|
||
|
//===========================================================
|
||
|
- (void) dealloc
|
||
|
{
|
||
|
[mUsageDescription release];
|
||
|
[mEvent release];
|
||
|
|
||
|
mUsageDescription = nil;
|
||
|
mEvent = nil;
|
||
|
[super dealloc];
|
||
|
}
|
||
|
|
||
|
//===========================================================
|
||
|
// - usageDescription
|
||
|
//===========================================================
|
||
|
- (NSString *) usageDescription
|
||
|
{
|
||
|
return mUsageDescription;
|
||
|
}
|
||
|
|
||
|
//===========================================================
|
||
|
// - event
|
||
|
//===========================================================
|
||
|
- (DDHidEvent *) event
|
||
|
{
|
||
|
return mEvent;
|
||
|
}
|
||
|
|
||
|
//===========================================================
|
||
|
// - index
|
||
|
//===========================================================
|
||
|
- (int) index
|
||
|
{
|
||
|
return mIndex;
|
||
|
}
|
||
|
|
||
|
@end
|
||
|
|
||
|
@implementation WatcherWindowController
|
||
|
|
||
|
- (id) init
|
||
|
{
|
||
|
self = [super initWithWindowNibName: @"EventWatcher" owner: self];
|
||
|
if (self == nil)
|
||
|
return nil;
|
||
|
|
||
|
mEventHistory = [[NSMutableArray alloc] init];
|
||
|
mNextIndex = 1;
|
||
|
|
||
|
return self;
|
||
|
}
|
||
|
|
||
|
|
||
|
//===========================================================
|
||
|
// dealloc
|
||
|
//===========================================================
|
||
|
- (void) dealloc
|
||
|
{
|
||
|
[mQueue release];
|
||
|
[mDevice release];
|
||
|
[mElements release];
|
||
|
[mEventHistory release];
|
||
|
|
||
|
mQueue = nil;
|
||
|
mDevice = nil;
|
||
|
mElements = nil;
|
||
|
mEventHistory = nil;
|
||
|
[super dealloc];
|
||
|
}
|
||
|
|
||
|
- (void)windowWillClose:(NSNotification *)notification
|
||
|
{
|
||
|
[mQueue release];
|
||
|
mQueue = nil;
|
||
|
[mDevice close];
|
||
|
[self autorelease];
|
||
|
}
|
||
|
|
||
|
- (IBAction)showWindow:(id)sender
|
||
|
{
|
||
|
[super showWindow: sender];
|
||
|
}
|
||
|
|
||
|
- (void) ddhidQueueHasEvents: (DDHidQueue *) hidQueue;
|
||
|
{
|
||
|
WatcherEvent * watcherEvent;
|
||
|
watcherEvent =
|
||
|
[[WatcherEvent alloc] initWithUsageDescription: @"-----------------------------"
|
||
|
event: nil
|
||
|
index: mNextIndex++];
|
||
|
[watcherEvent autorelease];
|
||
|
[mEventHistoryController addObject: watcherEvent];
|
||
|
|
||
|
NSMutableArray * newEvents = [NSMutableArray array];
|
||
|
DDHidEvent * event;
|
||
|
while (event = [hidQueue nextEvent])
|
||
|
{
|
||
|
DDHidElement * element = [mDevice elementForCookie: [event elementCookie]];
|
||
|
watcherEvent =
|
||
|
[[WatcherEvent alloc] initWithUsageDescription: [[element usage] usageNameWithIds]
|
||
|
event: event
|
||
|
index: mNextIndex++];
|
||
|
[watcherEvent autorelease];
|
||
|
[newEvents addObject: watcherEvent];
|
||
|
}
|
||
|
|
||
|
[mEventHistoryController addObjects: newEvents];
|
||
|
}
|
||
|
|
||
|
- (void) windowDidLoad;
|
||
|
{
|
||
|
[mDevice open];
|
||
|
mQueue = [[mDevice createQueueWithSize: 30] retain];
|
||
|
[mQueue setDelegate: self];
|
||
|
[mQueue addElements: mElements];
|
||
|
[self willChangeValueForKey: @"watching"];
|
||
|
[mQueue startOnCurrentRunLoop];
|
||
|
[self didChangeValueForKey: @"watching"];
|
||
|
}
|
||
|
|
||
|
//===========================================================
|
||
|
// device
|
||
|
//===========================================================
|
||
|
- (DDHidDevice *) device
|
||
|
{
|
||
|
return [[mDevice retain] autorelease];
|
||
|
}
|
||
|
|
||
|
- (void) setDevice: (DDHidDevice *) newDevice
|
||
|
{
|
||
|
if (mDevice != newDevice)
|
||
|
{
|
||
|
[mDevice release];
|
||
|
mDevice = [newDevice retain];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//===========================================================
|
||
|
// elements
|
||
|
//===========================================================
|
||
|
- (NSArray *) elements
|
||
|
{
|
||
|
return [[mElements retain] autorelease];
|
||
|
}
|
||
|
|
||
|
- (void) setElements: (NSArray *) newElements
|
||
|
{
|
||
|
if (mElements != newElements)
|
||
|
{
|
||
|
[mElements release];
|
||
|
mElements = [newElements retain];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//===========================================================
|
||
|
// eventHistory
|
||
|
//===========================================================
|
||
|
- (NSMutableArray *) eventHistory
|
||
|
{
|
||
|
return mEventHistory;
|
||
|
}
|
||
|
|
||
|
- (void) setEventHistory: (NSMutableArray *) anEventHistory
|
||
|
{
|
||
|
if (mEventHistory != anEventHistory)
|
||
|
{
|
||
|
[mEventHistory release];
|
||
|
mEventHistory = [anEventHistory retain];
|
||
|
}
|
||
|
}
|
||
|
- (void) addToEventHistory: (id)mEventHistoryObject
|
||
|
{
|
||
|
[[self eventHistory] addObject: mEventHistoryObject];
|
||
|
}
|
||
|
- (void) removeFromEventHistory: (id)mEventHistoryObject
|
||
|
{
|
||
|
[[self eventHistory] removeObject: mEventHistoryObject];
|
||
|
}
|
||
|
|
||
|
- (BOOL) isWatching;
|
||
|
{
|
||
|
if (mQueue == nil)
|
||
|
return NO;
|
||
|
return [mQueue isStarted];
|
||
|
}
|
||
|
|
||
|
- (void) setWatching: (BOOL) watching;
|
||
|
{
|
||
|
BOOL isStarted = [mQueue isStarted];
|
||
|
if (isStarted == watching)
|
||
|
return;
|
||
|
|
||
|
if (watching)
|
||
|
[mQueue startOnCurrentRunLoop];
|
||
|
else
|
||
|
[mQueue stop];
|
||
|
}
|
||
|
|
||
|
- (IBAction) clearHistory: (id) sender;
|
||
|
{
|
||
|
[self willChangeValueForKey: @"eventHistory"];
|
||
|
[mEventHistory removeAllObjects];
|
||
|
mNextIndex = 1;
|
||
|
[self didChangeValueForKey: @"eventHistory"];
|
||
|
}
|
||
|
|
||
|
@end
|