Mercurial > sdl-ios-xcode
changeset 2353:07acabba25d9 gsoc2008_iphone
SDL_uikitview is just a generic view class which SDL_uikitopenglview inherits from. The functionality found in this class relates to (right now) mouse/touch input support. The reason for putting it here is that if someone wanted to write a render driver for iPhone based around CoreGraphics rather than OpenGL ES, they could make their Core Graphics view inherit from this class as well.
author | Holmes Futrell <hfutrell@umail.ucsb.edu> |
---|---|
date | Thu, 17 Jul 2008 22:43:09 +0000 |
parents | 1ecbeff9eb4c |
children | 2e4fea4a4416 |
files | src/video/uikit/SDL_uikitview.h src/video/uikit/SDL_uikitview.m |
diffstat | 2 files changed, 134 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/video/uikit/SDL_uikitview.h Thu Jul 17 22:43:09 2008 +0000 @@ -0,0 +1,26 @@ +// +// SDL_uikitview.h +// iPodSDL +// +// Created by Holmes Futrell on 6/23/08. +// Copyright 2008 __MyCompanyName__. All rights reserved. +// + +#import <UIKit/UIKit.h> +#include "SDL_stdinc.h" +#include "SDL_mouse.h" +#include "SDL_mouse_c.h" +#include "SDL_events.h" + +#define MAX_SIMULTANEOUS_TOUCHES 5 + +@interface SDL_uikitview : UIView { + + SDL_Mouse mice[MAX_SIMULTANEOUS_TOUCHES]; + +} +- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; +- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; +- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; + +@end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/video/uikit/SDL_uikitview.m Thu Jul 17 22:43:09 2008 +0000 @@ -0,0 +1,108 @@ +// +// SDL_uikitview.m +// iPodSDL +// +// Created by Holmes Futrell on 6/23/08. +// Copyright 2008 __MyCompanyName__. All rights reserved. +// + +#import "SDL_uikitview.h" + +@implementation SDL_uikitview + +- (void)dealloc { + [super dealloc]; +} + +- (id)initWithFrame:(CGRect)frame { + + self = [super initWithFrame: frame]; + + int i; + for (i=0; i<MAX_SIMULTANEOUS_TOUCHES; i++) { + mice[i].driverdata = NULL; + SDL_AddMouse(&(mice[i]), i); + } + self.multipleTouchEnabled = YES; + + return self; + +} + +- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { + + NSEnumerator *enumerator = [touches objectEnumerator]; + UITouch *touch=(UITouch*)[enumerator nextObject]; + + // associate touches with mice, so long as we have slots + int i; + int found = 0; + for(i=0; touch && i < MAX_SIMULTANEOUS_TOUCHES; i++) { + + // check if this mouse is already tracking a touch + if (mice[i].driverdata != NULL) { + continue; + } + + found = 1; + + int oldMouse = SDL_SelectMouse(-1); + SDL_SelectMouse(i); + CGPoint locationInView = [touch locationInView: self]; + mice[i].driverdata = [touch retain]; + SDL_SendMouseMotion(i, 0, locationInView.x, locationInView.y); + SDL_SendMouseButton(i, SDL_PRESSED, SDL_BUTTON_LEFT); + SDL_GetRelativeMouseState(NULL, NULL); + touch = (UITouch*)[enumerator nextObject]; + + SDL_SelectMouse(oldMouse); + + } +} + +- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { + + NSEnumerator *enumerator = [touches objectEnumerator]; + UITouch *touch=nil; + + while(touch = (UITouch *)[enumerator nextObject]) { + int i, found = NO; + for (i=0; i<MAX_SIMULTANEOUS_TOUCHES && !found; i++) { + if (mice[i].driverdata == touch) { + [(UITouch*)(mice[i].driverdata) release]; + mice[i].driverdata = NULL; + SDL_SendMouseButton(i, SDL_RELEASED, SDL_BUTTON_LEFT); + + found = YES; + } + } + } +} + +- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { + /* + this can happen if the user puts more than 5 touches on the screen + at once, or perhaps in other circumstances. Usually all active + touches are canceled. + */ + [self touchesEnded: touches withEvent: event]; +} + +- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { + + NSEnumerator *enumerator = [touches objectEnumerator]; + UITouch *touch=nil; + + while(touch = (UITouch *)[enumerator nextObject]) { + int i, found = NO; + for (i=0; i<MAX_SIMULTANEOUS_TOUCHES && !found; i++) { + if (mice[i].driverdata == touch) { + CGPoint locationInView = [touch locationInView: self]; + SDL_SendMouseMotion(i, 0, locationInView.x, locationInView.y); + found = YES; + } + } + } +} + +@end