From 5190f5e49885ca3e0913df474019828f200f572d Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Wed, 28 Jul 2010 23:32:13 -0700 Subject: [PATCH] Fixed the code so we receive Cocoa touch events --- src/video/cocoa/SDL_cocoakeyboard.m | 122 ++-------------------------- src/video/cocoa/SDL_cocoatouch.h | 35 -------- src/video/cocoa/SDL_cocoawindow.h | 14 ++++ src/video/cocoa/SDL_cocoawindow.m | 68 ++++++++++++++++ 4 files changed, 89 insertions(+), 150 deletions(-) delete mode 100644 src/video/cocoa/SDL_cocoatouch.h diff --git a/src/video/cocoa/SDL_cocoakeyboard.m b/src/video/cocoa/SDL_cocoakeyboard.m index 046ad4f1c..e2aea94fa 100644 --- a/src/video/cocoa/SDL_cocoakeyboard.m +++ b/src/video/cocoa/SDL_cocoakeyboard.m @@ -26,17 +26,11 @@ #include "../../events/SDL_keyboard_c.h" #include "../../events/scancodes_darwin.h" -//Touch Code -#include "../../events/SDL_touch_c.h" -#include "SDL_cocoatouch.h" - #include //#define DEBUG_IME NSLog #define DEBUG_IME -#define DEBUG_TOUCH NSLog - #ifndef NX_DEVICERCTLKEYMASK #define NX_DEVICELCTLKEYMASK 0x00000001 #endif @@ -71,7 +65,6 @@ @interface SDLTranslatorResponder : NSView } - (void) doCommandBySelector:(SEL)myselector; - (void) setInputRect:(SDL_Rect *) rect; -- (void) handleTouches:(cocoaTouchType)type WithEvent:(NSEvent*) event; @end @implementation SDLTranslatorResponder @@ -198,83 +191,6 @@ - (NSArray *) validAttributesForMarkedText return [NSArray array]; } -// Touch Code Begins ----------- - -- (id)initWithFrame:(CGRect)frame { - if (self = [super initWithFrame:frame]) { - [self setAcceptsTouchEvents:YES]; - [self setWantsRestingTouches:YES]; - DEBUG_TOUCH(@"Initializing Cocoa Touch System...."); - - } - return self; -} - -//Not an API function -- (void)handleTouches:(cocoaTouchType)type WithEvent:(NSEvent *)event { - NSSet *touches = [event touchesMatchingPhase:NSTouchPhaseBegan inView:self]; - - NSEnumerator *enumerator = [touches objectEnumerator]; - NSTouch *touch = (NSTouch*)[enumerator nextObject]; - while (touch) { - long touchId = (long)[touch device]; - if(!SDL_GetTouchIndex(touchId)) { - if(Cocoa_AddTouch(touch) < 0) continue; - } - float x = [touch normalizedPosition].x; - float y = [touch normalizedPosition].y; - long fingerId = (long)[touch identity]; - switch (type) { - case COCOA_TOUCH_DOWN: - SDL_SendFingerDown(touchId,fingerId, - SDL_TRUE,x,y,1); - break; - case COCOA_TOUCH_UP: - case COCOA_TOUCH_CANCELLED: - SDL_SendFingerDown(touchId,fingerId, - SDL_FALSE,x,y,1); - case COCOA_TOUCH_MOVE: - SDL_SendTouchMotion(touchId,fingerId, - SDL_FALSE,x,y,1); - } - - touch = (NSTouch*)[enumerator nextObject]; - } -} - -- (void)touchesBeganWithEvent:(NSEvent *)event { - DEBUG_TOUCH(@"Finger Down"); - - [self handleTouches: COCOA_TOUCH_DOWN WithEvent: event]; - - //Documentation said to call super, but examples do not - //[super touchesBeganWithEvent:event] -} -- (void)touchesMovedWithEvent:(NSEvent *)event { - DEBUG_TOUCH(@"Finger Moved"); - - [self handleTouches: COCOA_TOUCH_MOVE WithEvent: event]; - - //[super touchesMovedWithEvent:event] -} -- (void)touchesEndedWithEvent:(NSEvent *)event { - DEBUG_TOUCH(@"Finger Up"); - - [self handleTouches: COCOA_TOUCH_UP WithEvent: event]; - - //[super touchesEndedWithEvent:event] -} -- (void)touchesCancelledWithEvent:(NSEvent *)event { - DEBUG_TOUCH(@"Finger Cancelled"); - - [self handleTouches: COCOA_TOUCH_CANCELLED WithEvent: event]; - - //[super touchesCancelledWithEvent:event] -} - -//Touch Code Ends -------------- - - @end /* This is the original behavior, before support was added for @@ -712,14 +628,13 @@ - (void)touchesCancelledWithEvent:(NSEvent *)event { * it to the front most window's content view */ if (!data->fieldEdit) { data->fieldEdit = - [[SDLTranslatorResponder alloc] initWithFrame: NSMakeRect(0.0, 0.0, 0.0, 0.0)]; - DEBUG_TOUCH(@"Accepts Touch events? %i",[data->fieldEdit acceptsTouchEvents]); + [[SDLTranslatorResponder alloc] initWithFrame: NSMakeRect(0.0, 0.0, 0.0, 0.0)]; } if (![[data->fieldEdit superview] isEqual: parentView]) { // DEBUG_IME(@"add fieldEdit to window contentView"); - [data->fieldEdit removeFromSuperview]; + [data->fieldEdit removeFromSuperview]; [parentView addSubview: data->fieldEdit]; [[NSApp keyWindow] makeFirstResponder: data->fieldEdit]; } @@ -776,14 +691,14 @@ - (void)touchesCancelledWithEvent:(NSEvent *)event { if (![event isARepeat]) { /* See if we need to rebuild the keyboard layout */ UpdateKeymap(data); + } - SDL_SendKeyboardKey(SDL_PRESSED, code); + SDL_SendKeyboardKey(SDL_PRESSED, code); #if 1 - if (code == SDL_SCANCODE_UNKNOWN) { - fprintf(stderr, "The key you just pressed is not recognized by SDL. To help get this fixed, report this to the SDL mailing list or to Christian Walther . Mac virtual key code is %d.\n", scancode); - } -#endif + if (code == SDL_SCANCODE_UNKNOWN) { + fprintf(stderr, "The key you just pressed is not recognized by SDL. To help get this fixed, report this to the SDL mailing list or to Christian Walther . Mac virtual key code is %d.\n", scancode); } +#endif if (SDL_EventState(SDL_TEXTINPUT, SDL_QUERY)) { /* FIXME CW 2007-08-16: only send those events to the field editor for which we actually want text events, not e.g. esc or function keys. Arrow keys in particular seem to produce crashes sometimes. */ [data->fieldEdit interpretKeyEvents:[NSArray arrayWithObject:event]]; @@ -808,29 +723,6 @@ - (void)touchesCancelledWithEvent:(NSEvent *)event { } } -Cocoa_AddTouch(NSTouch* finger) { - SDL_Touch touch; - touch.id = (long)[finger device]; - //NSSize size = [finger deviceSize]; - //touch.driverdata = SDL_malloc(sizeof(EventTouchData)); - //EventTouchData* data = (EventTouchData*)(touch.driverdata); - - touch.x_min = 0; - touch.x_max = 1; - touch.xres = touch.x_max - touch.x_min; - touch.y_min = 0; - touch.y_max = 1; - touch.yres = touch.y_max - touch.y_min; - touch.pressure_min = 0; - touch.pressure_max = 1; - touch.pressureres = touch.pressure_max - touch.pressure_min; - - - return SDL_AddTouch(&touch, ""); - -} - - void Cocoa_QuitKeyboard(_THIS) { diff --git a/src/video/cocoa/SDL_cocoatouch.h b/src/video/cocoa/SDL_cocoatouch.h deleted file mode 100644 index 3dc83e9c3..000000000 --- a/src/video/cocoa/SDL_cocoatouch.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2010 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -#ifndef _SDL_cocoatouch_h -#define _SDL_cocoatouch_h - -extern void Cocoa_InitTouch(_THIS); -extern int Cocoa_AddTouch(NSTouch* finger); -extern void Cocoa_QuitTouch(_THIS); - -typedef enum {COCOA_TOUCH_DOWN,COCOA_TOUCH_UP,COCOA_TOUCH_MOVE,COCOA_TOUCH_CANCELLED} cocoaTouchType; - -#endif /* _SDL_touch_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/cocoa/SDL_cocoawindow.h b/src/video/cocoa/SDL_cocoawindow.h index 6c38924f0..574642bd5 100644 --- a/src/video/cocoa/SDL_cocoawindow.h +++ b/src/video/cocoa/SDL_cocoawindow.h @@ -64,6 +64,20 @@ typedef struct SDL_WindowData SDL_WindowData; -(void) rightMouseDragged:(NSEvent *) theEvent; -(void) otherMouseDragged:(NSEvent *) theEvent; -(void) scrollWheel:(NSEvent *) theEvent; +-(void) touchesBeganWithEvent:(NSEvent *) theEvent; +-(void) touchesMovedWithEvent:(NSEvent *) theEvent; +-(void) touchesEndedWithEvent:(NSEvent *) theEvent; +-(void) touchesCancelledWithEvent:(NSEvent *) theEvent; + +/* Touch event handling */ +typedef enum { + COCOA_TOUCH_DOWN, + COCOA_TOUCH_UP, + COCOA_TOUCH_MOVE, + COCOA_TOUCH_CANCELLED +} cocoaTouchType; +-(void) handleTouches:(cocoaTouchType)type withEvent:(NSEvent*) event; + @end /* *INDENT-ON* */ diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m index be4840b82..b67f8340b 100644 --- a/src/video/cocoa/SDL_cocoawindow.m +++ b/src/video/cocoa/SDL_cocoawindow.m @@ -25,6 +25,7 @@ #include "../SDL_sysvideo.h" #include "../../events/SDL_keyboard_c.h" #include "../../events/SDL_mouse_c.h" +#include "../../events/SDL_touch_c.h" #include "../../events/SDL_windowevents_c.h" #include "SDL_cocoavideo.h" @@ -60,6 +61,7 @@ - (void)listen:(SDL_WindowData *)data [center addObserver:self selector:@selector(windowDidUnhide:) name:NSApplicationDidUnhideNotification object:NSApp]; [_data->nswindow setAcceptsMouseMovedEvents:YES]; + [[_data->nswindow contentView] setAcceptsTouchEvents:YES]; } - (void)close @@ -268,6 +270,72 @@ - (void)scrollWheel:(NSEvent *)theEvent SDL_SendMouseWheel(_data->window, (int)x, (int)y); } +- (void)touchesBeganWithEvent:(NSEvent *) theEvent +{ + [self handleTouches:COCOA_TOUCH_DOWN withEvent:theEvent]; +} + +- (void)touchesMovedWithEvent:(NSEvent *) theEvent +{ + [self handleTouches:COCOA_TOUCH_MOVE withEvent:theEvent]; +} + +- (void)touchesEndedWithEvent:(NSEvent *) theEvent +{ + [self handleTouches:COCOA_TOUCH_UP withEvent:theEvent]; +} + +- (void)touchesCancelledWithEvent:(NSEvent *) theEvent +{ + [self handleTouches:COCOA_TOUCH_CANCELLED withEvent:theEvent]; +} + +- (void)handleTouches:(cocoaTouchType)type withEvent:(NSEvent *)event +{ + NSSet *touches = [event touchesMatchingPhase:NSTouchPhaseBegan inView:nil]; + + NSEnumerator *enumerator = [touches objectEnumerator]; + NSTouch *touch = (NSTouch*)[enumerator nextObject]; + while (touch) { + long touchId = (long)[touch device]; + if (!SDL_GetTouch(touchId)) { + SDL_Touch touch; + + touch.id = touchId; + touch.x_min = 0; + touch.x_max = 1; + touch.xres = touch.x_max - touch.x_min; + touch.y_min = 0; + touch.y_max = 1; + touch.yres = touch.y_max - touch.y_min; + touch.pressure_min = 0; + touch.pressure_max = 1; + touch.pressureres = touch.pressure_max - touch.pressure_min; + + if (SDL_AddTouch(&touch, "") < 0) { + return; + } + } + float x = [touch normalizedPosition].x; + float y = [touch normalizedPosition].y; + long fingerId = (long)[touch identity]; + switch (type) { + case COCOA_TOUCH_DOWN: + SDL_SendFingerDown(touchId, fingerId, SDL_TRUE, x, y, 1); + break; + case COCOA_TOUCH_UP: + case COCOA_TOUCH_CANCELLED: + SDL_SendFingerDown(touchId, fingerId, SDL_FALSE, x, y, 1); + break; + case COCOA_TOUCH_MOVE: + SDL_SendTouchMotion(touchId, fingerId, SDL_FALSE, x, y, 1); + break; + } + + touch = (NSTouch*)[enumerator nextObject]; + } +} + @end @interface SDLWindow : NSWindow