summaryrefslogtreecommitdiff
path: root/macosx/plugins/DFInput/macsrc/MappingCell.m
blob: d36fab500b1f869d88ac5a158272d76014191193 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
 * Copyright (c) 2010, Wei Mingzhi <whistler_wmz@users.sf.net>.
 * All Rights Reserved.
 *
 * Based on: HIDInput by Gil Pedersen.
 * Copyright (c) 2004, Gil Pedersen.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see <http://www.gnu.org/licenses>.
 */

#import "MappingCell.h"
#import "ControllerList.h"
#import "cfg.h"

@implementation MappingCell

- (id)initTextCell:(NSString *)aString {
	self = [super initTextCell:aString];
	[self setEditable:NO];
	return self;
}

- (void)selectWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject start:(NSInteger)selStart length:(NSInteger)selLength
{
	[super selectWithFrame:aRect inView:controlView editor:textObj delegate:anObject start:selStart length:selLength];

	long whichPad = [ControllerList currentController];
	NSTableView *tableView = (NSTableView *)[self controlView];
	long i, changed = 0, row;
	NSEvent *endEvent;
	NSPoint where = {0.0, 0.0};

	/* start a modal session */
	NSModalSession session = [NSApp beginModalSessionForWindow:[tableView window]];
	[NSApp runModalSession:session];

	/* delay for a little while to allow user to release the button pressed to activate the element */
	[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.15]];

	InitAxisPos(whichPad);

	/* wait for 10 seconds for user to press a key */
	for (i = 0; i < 10; i++) {
		[NSApp runModalSession:session];
		row = [tableView selectedRow];
		if (row < DKEY_TOTAL) {
			changed = ReadDKeyEvent(whichPad, [ControllerList buttonOfRow:row]);
		} else {
			row -= DKEY_TOTAL;
			changed = ReadAnalogEvent(whichPad, row / 4, row % 4);
		}

		if (changed) break;
	}

	[NSApp endModalSession:session];

	/* move selection to the next list element */
	[self endEditing:textObj];
	if (changed == 1) {
		int nextRow = [tableView selectedRow] + 1;
		if (nextRow >= [tableView numberOfRows]) {
			[tableView deselectAll:self];
			return;
		}
		[tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:nextRow] byExtendingSelection:NO];

		/* discard any events we have received while waiting for the button press */
		endEvent = [NSEvent otherEventWithType:NSApplicationDefined location:where 
									modifierFlags:0 timestamp:(NSTimeInterval)0
									windowNumber:0 context:[NSGraphicsContext currentContext] subtype:0 data1:0 data2:0];
		[NSApp postEvent:endEvent atStart:NO];
		[NSApp discardEventsMatchingMask:NSAnyEventMask beforeEvent:endEvent];
	}
	[[tableView window] makeFirstResponder:tableView];
}

@end