This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
/
SDL_uikitview.m
414 lines (339 loc) · 11.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
Simple DirectMedia Layer
Copyright (C) 1997-2011 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
21
22
23
#include "SDL_config.h"
#if SDL_VIDEO_DRIVER_UIKIT
24
25
26
27
28
29
30
31
32
33
#import "SDL_uikitview.h"
#include "../../events/SDL_keyboard_c.h"
#include "../../events/SDL_mouse_c.h"
#include "../../events/SDL_touch_c.h"
#if SDL_IPHONE_KEYBOARD
#import "keyinfotable.h"
#import "SDL_uikitappdelegate.h"
34
#import "SDL_uikitkeyboard.h"
35
36
37
38
39
#import "SDL_uikitwindow.h"
#endif
@implementation SDL_uikitview
40
41
- (void)dealloc
{
42
43
44
[super dealloc];
}
45
46
- (id)initWithFrame:(CGRect)frame
{
47
self = [super initWithFrame: frame];
48
49
50
#if SDL_IPHONE_KEYBOARD
[self initializeKeyboard];
51
#endif
52
53
54
55
56
57
58
59
60
#ifdef FIXED_MULTITOUCH
self.multipleTouchEnabled = YES;
SDL_Touch touch;
touch.id = 0; //TODO: Should be -1?
//touch.driverdata = SDL_malloc(sizeof(EventTouchData));
//EventTouchData* data = (EventTouchData*)(touch.driverdata);
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
touch.x_min = 0;
touch.x_max = frame.size.width;
touch.native_xres = touch.x_max - touch.x_min;
touch.y_min = 0;
touch.y_max = frame.size.height;
touch.native_yres = touch.y_max - touch.y_min;
touch.pressure_min = 0;
touch.pressure_max = 1;
touch.native_pressureres = touch.pressure_max - touch.pressure_min;
touchId = SDL_AddTouch(&touch, "IPHONE SCREEN");
#endif
return self;
}
80
81
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
82
83
84
85
86
NSEnumerator *enumerator = [touches objectEnumerator];
UITouch *touch = (UITouch*)[enumerator nextObject];
if (touch) {
CGPoint locationInView = [touch locationInView: self];
87
88
89
90
91
92
93
94
95
96
/* send moved event */
SDL_SendMouseMotion(NULL, 0, locationInView.x, locationInView.y);
/* send mouse down event */
SDL_SendMouseButton(NULL, SDL_PRESSED, SDL_BUTTON_LEFT);
}
#ifdef FIXED_MULTITOUCH
while(touch) {
97
CGPoint locationInView = [touch locationInView: self];
98
99
#ifdef IPHONE_TOUCH_EFFICIENT_DANGEROUS
100
101
102
103
104
105
//FIXME: TODO: Using touch as the fingerId is potentially dangerous
//It is also much more efficient than storing the UITouch pointer
//and comparing it to the incoming event.
SDL_SendFingerDown(touchId, (long)touch,
SDL_TRUE, locationInView.x, locationInView.y,
1);
106
#else
107
108
109
110
111
112
113
114
115
int i;
for(i = 0; i < MAX_SIMULTANEOUS_TOUCHES; i++) {
if (finger[i] == NULL) {
finger[i] = touch;
SDL_SendFingerDown(touchId, i,
SDL_TRUE, locationInView.x, locationInView.y,
1);
break;
}
116
117
118
}
#endif
119
touch = (UITouch*)[enumerator nextObject];
120
121
122
123
}
#endif
}
124
125
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
126
127
NSEnumerator *enumerator = [touches objectEnumerator];
UITouch *touch = (UITouch*)[enumerator nextObject];
128
129
130
131
132
133
134
135
if (touch) {
/* send mouse up */
SDL_SendMouseButton(NULL, SDL_RELEASED, SDL_BUTTON_LEFT);
}
#ifdef FIXED_MULTITOUCH
while(touch) {
136
CGPoint locationInView = [touch locationInView: self];
137
138
#ifdef IPHONE_TOUCH_EFFICIENT_DANGEROUS
139
140
141
SDL_SendFingerDown(touchId, (long)touch,
SDL_FALSE, locationInView.x, locationInView.y,
1);
142
#else
143
144
145
146
147
148
149
150
151
int i;
for (i = 0; i < MAX_SIMULTANEOUS_TOUCHES; i++) {
if (finger[i] == touch) {
SDL_SendFingerDown(touchId, i,
SDL_FALSE, locationInView.x, locationInView.y,
1);
finger[i] = NULL;
break;
}
152
153
154
}
#endif
155
touch = (UITouch*)[enumerator nextObject];
156
157
158
159
}
#endif
}
160
161
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
162
163
164
165
166
167
168
169
/*
this can happen if the user puts more than 5 touches on the screen
at once, or perhaps in other circumstances. Usually (it seems)
all active touches are canceled.
*/
[self touchesEnded: touches withEvent: event];
}
170
171
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
172
173
NSEnumerator *enumerator = [touches objectEnumerator];
UITouch *touch = (UITouch*)[enumerator nextObject];
174
175
176
177
178
179
180
181
182
183
if (touch) {
CGPoint locationInView = [touch locationInView: self];
/* send moved event */
SDL_SendMouseMotion(NULL, 0, locationInView.x, locationInView.y);
}
#ifdef FIXED_MULTITOUCH
while(touch) {
184
CGPoint locationInView = [touch locationInView: self];
185
186
#ifdef IPHONE_TOUCH_EFFICIENT_DANGEROUS
187
188
189
SDL_SendTouchMotion(touchId, (long)touch,
SDL_FALSE, locationInView.x, locationInView.y,
1);
190
#else
191
192
193
194
195
196
197
198
int i;
for (i = 0; i < MAX_SIMULTANEOUS_TOUCHES; i++) {
if (finger[i] == touch) {
SDL_SendTouchMotion(touchId, i,
SDL_FALSE, locationInView.x, locationInView.y,
1);
break;
}
199
200
201
}
#endif
202
touch = (UITouch*)[enumerator nextObject];
203
204
205
206
207
208
209
210
211
212
}
#endif
}
/*
---- Keyboard related functionality below this line ----
*/
#if SDL_IPHONE_KEYBOARD
/* Is the iPhone virtual keyboard visible onscreen? */
213
214
- (BOOL)keyboardVisible
{
215
216
217
218
return keyboardVisible;
}
/* Set ourselves up as a UITextFieldDelegate */
219
220
- (void)initializeKeyboard
{
221
222
223
textField = [[UITextField alloc] initWithFrame: CGRectZero];
textField.delegate = self;
/* placeholder so there is something to delete! */
224
225
textField.text = @" ";
226
227
228
229
230
231
232
/* set UITextInputTrait properties, mostly to defaults */
textField.autocapitalizationType = UITextAutocapitalizationTypeNone;
textField.autocorrectionType = UITextAutocorrectionTypeNo;
textField.enablesReturnKeyAutomatically = NO;
textField.keyboardAppearance = UIKeyboardAppearanceDefault;
textField.keyboardType = UIKeyboardTypeDefault;
textField.returnKeyType = UIReturnKeyDefault;
233
234
textField.secureTextEntry = NO;
235
236
237
238
239
240
241
242
textField.hidden = YES;
keyboardVisible = NO;
/* add the UITextField (hidden) to our view */
[self addSubview: textField];
[textField release];
}
/* reveal onscreen virtual keyboard */
243
244
- (void)showKeyboard
{
245
246
247
248
249
keyboardVisible = YES;
[textField becomeFirstResponder];
}
/* hide onscreen virtual keyboard */
250
251
- (void)hideKeyboard
{
252
253
254
255
256
keyboardVisible = NO;
[textField resignFirstResponder];
}
/* UITextFieldDelegate method. Invoked when user types something. */
257
258
- (BOOL)textField:(UITextField *)_textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
259
260
261
262
263
264
265
266
267
if ([string length] == 0) {
/* it wants to replace text with nothing, ie a delete */
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_DELETE);
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_DELETE);
}
else {
/* go through all the characters in the string we've been sent
and convert them to key presses */
int i;
268
for (i = 0; i < [string length]; i++) {
269
270
unichar c = [string characterAtIndex: i];
271
272
273
Uint16 mod = 0;
SDL_Scancode code;
274
275
276
277
278
279
280
281
282
283
284
if (c < 127) {
/* figure out the SDL_Scancode and SDL_keymod for this unichar */
code = unicharToUIKeyInfoTable[c].code;
mod = unicharToUIKeyInfoTable[c].mod;
}
else {
/* we only deal with ASCII right now */
code = SDL_SCANCODE_UNKNOWN;
mod = 0;
}
285
286
287
288
289
290
291
292
293
294
295
if (mod & KMOD_SHIFT) {
/* If character uses shift, press shift down */
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_LSHIFT);
}
/* send a keydown and keyup even for the character */
SDL_SendKeyboardKey(SDL_PRESSED, code);
SDL_SendKeyboardKey(SDL_RELEASED, code);
if (mod & KMOD_SHIFT) {
/* If character uses shift, press shift back up */
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_LSHIFT);
296
}
297
298
299
300
301
302
303
}
SDL_SendKeyboardText([string UTF8String]);
}
return NO; /* don't allow the edit! (keep placeholder text there) */
}
/* Terminates the editing session */
304
305
- (BOOL)textFieldShouldReturn:(UITextField*)_textField
{
306
307
308
309
310
311
312
313
314
315
316
317
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_RETURN);
[self hideKeyboard];
return YES;
}
#endif
@end
/* iPhone keyboard addition functions */
#if SDL_IPHONE_KEYBOARD
318
static SDL_uikitview * getWindowView(SDL_Window * window)
319
{
320
if (window == NULL) {
321
SDL_SetError("Window does not exist");
322
return nil;
323
}
324
325
326
SDL_WindowData *data = (SDL_WindowData *)window->driverdata;
SDL_uikitview *view = data != NULL ? data->view : nil;
327
328
if (view == nil) {
329
330
SDL_SetError("Window has no view");
}
331
332
return view;
333
334
}
335
int SDL_iPhoneKeyboardShow(SDL_Window * window)
336
{
337
338
SDL_uikitview *view = getWindowView(window);
if (view == nil) {
339
return -1;
340
341
}
342
343
[view showKeyboard];
return 0;
344
345
}
346
int SDL_iPhoneKeyboardHide(SDL_Window * window)
347
{
348
349
SDL_uikitview *view = getWindowView(window);
if (view == nil) {
350
return -1;
351
352
}
353
354
355
[view hideKeyboard];
return 0;
}
356
357
358
359
360
SDL_bool SDL_iPhoneKeyboardIsShown(SDL_Window * window)
{
SDL_uikitview *view = getWindowView(window);
if (view == nil) {
361
362
return 0;
}
363
364
return view.keyboardVisible;
365
366
}
367
368
int SDL_iPhoneKeyboardToggle(SDL_Window * window)
{
369
370
SDL_uikitview *view = getWindowView(window);
if (view == nil) {
371
return -1;
372
373
}
374
375
if (SDL_iPhoneKeyboardIsShown(window)) {
SDL_iPhoneKeyboardHide(window);
376
377
}
else {
378
SDL_iPhoneKeyboardShow(window);
379
}
380
return 0;
381
382
383
384
385
386
}
#else
/* stubs, used if compiled without keyboard support */
387
388
int SDL_iPhoneKeyboardShow(SDL_Window * window)
{
389
390
391
392
SDL_SetError("Not compiled with keyboard support");
return -1;
}
393
394
int SDL_iPhoneKeyboardHide(SDL_Window * window)
{
395
396
397
398
SDL_SetError("Not compiled with keyboard support");
return -1;
}
399
400
SDL_bool SDL_iPhoneKeyboardIsShown(SDL_Window * window)
{
401
402
403
return 0;
}
404
405
int SDL_iPhoneKeyboardToggle(SDL_Window * window)
{
406
407
408
409
410
411
SDL_SetError("Not compiled with keyboard support");
return -1;
}
#endif /* SDL_IPHONE_KEYBOARD */
412
413
#endif /* SDL_VIDEO_DRIVER_UIKIT */
414
/* vi: set ts=4 sw=4 expandtab: */