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