From 6ff66938713cbf41e7a5bd2b8194abdae43be8f6 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Wed, 29 May 2013 23:31:38 +0200 Subject: [PATCH] [DEV] MAC : mouse event availlable and periodic display (limited at 30 fps???) --- external/etk | 2 +- sources/ewol/Dimension.cpp | 3 +- .../ewol/renderer/os/gui.MacOs.Interface.mm | 5 +- .../ewol/renderer/os/gui.MacOs.OpenglView.h | 4 +- .../ewol/renderer/os/gui.MacOs.OpenglView.mm | 148 ++++++++++++++++-- 5 files changed, 143 insertions(+), 19 deletions(-) diff --git a/external/etk b/external/etk index 1c21a6f3..c90b9d1b 160000 --- a/external/etk +++ b/external/etk @@ -1 +1 @@ -Subproject commit 1c21a6f3d5df76f313040a87a837b201c70a5edf +Subproject commit c90b9d1b3986f21cbd2a3f0a3ad8f12ab1df3bd1 diff --git a/sources/ewol/Dimension.cpp b/sources/ewol/Dimension.cpp index 9ffcbd53..05d53aec 100644 --- a/sources/ewol/Dimension.cpp +++ b/sources/ewol/Dimension.cpp @@ -31,7 +31,8 @@ static const float millimeterToKilometer = 1.0f/1000000.0f; void ewol::dimension::Init(void) { - ratio = vec2(96,96)*inchToMillimeter; + ewol::Dimension conversion(vec2(72,72), ewol::Dimension::Inch); + ratio = conversion.GetMillimeter(); invRatio.setValue(1.0f/ratio.x(),1.0f/ratio.y()); windowsSize.Set(vec2(200,200), ewol::Dimension::Pixel); } diff --git a/sources/ewol/renderer/os/gui.MacOs.Interface.mm b/sources/ewol/renderer/os/gui.MacOs.Interface.mm index 6da569de..1312062a 100644 --- a/sources/ewol/renderer/os/gui.MacOs.Interface.mm +++ b/sources/ewol/renderer/os/gui.MacOs.Interface.mm @@ -69,6 +69,9 @@ int mm_main(int argc, const char *argv[]) autorelease]; // set the windows at a specific position : [window cascadeTopLeftFromPoint:NSMakePoint(50,50)]; + // set the windows resizable + [window setStyleMask:[window styleMask] | NSResizableWindowMask]; + // oposite : [window setStyleMask:[window styleMask] & ~NSResizableWindowMask]; // set the title [window setTitle:appName]; @@ -88,7 +91,7 @@ int mm_main(int argc, const char *argv[]) //[window addChildWindow:view]; //[window makeKeyAndVisible]; - + [window setDelegate:view]; // start application : [NSApp run]; // return no error diff --git a/sources/ewol/renderer/os/gui.MacOs.OpenglView.h b/sources/ewol/renderer/os/gui.MacOs.OpenglView.h index efb2cc3d..e855f170 100644 --- a/sources/ewol/renderer/os/gui.MacOs.OpenglView.h +++ b/sources/ewol/renderer/os/gui.MacOs.OpenglView.h @@ -10,9 +10,10 @@ #import -@interface OpenGLView : NSOpenGLView +@interface OpenGLView : NSOpenGLView { } +- (void)prepareOpenGL; - (void)drawRect:(NSRect) bounds; - (void)mouseDown:(NSEvent *) event; - (void)mouseDragged:(NSEvent *) event; @@ -27,6 +28,7 @@ - (void)otherMouseDragged:(NSEvent *)event; - (void)otherMouseUp:(NSEvent *)event; //- (void)sendEvent:(NSEvent *)event +- (void)keyDown:(NSEvent *)theEvent; @end diff --git a/sources/ewol/renderer/os/gui.MacOs.OpenglView.mm b/sources/ewol/renderer/os/gui.MacOs.OpenglView.mm index 08d4edab..b5521b19 100644 --- a/sources/ewol/renderer/os/gui.MacOs.OpenglView.mm +++ b/sources/ewol/renderer/os/gui.MacOs.OpenglView.mm @@ -11,43 +11,69 @@ #include #include #include - -static int32_t width=0, height=0; +#include + @implementation OpenGLView + +static ewol::SpecialKey guiKeyBoardMode; + +- (void) prepareOpenGL +{ + EWOL_ERROR("prepare"); + GLint swapInt = 1; + [[self openGLContext] setValues:&swapInt forParameter:NSOpenGLCPSwapInterval]; // set to vbl sync + + // set system dpi size : + NSScreen *screen = [NSScreen mainScreen]; + NSDictionary *description = [screen deviceDescription]; + NSSize displayPixelSize = [[description objectForKey:NSDeviceSize] sizeValue]; + CGSize displayPhysicalSize = CGDisplayScreenSize([[description objectForKey:@"NSScreenNumber"] unsignedIntValue]); + + ewol::dimension::SetPixelRatio(vec2((float)displayPixelSize.width/(float)displayPhysicalSize.width, + (float)displayPixelSize.height/(float)displayPhysicalSize.height), + ewol::Dimension::Millimeter); + +} + -(void) drawRect: (NSRect) bounds { - if( width!= bounds.size.width - || height!= bounds.size.height) { - width= bounds.size.width; - height= bounds.size.height; - eSystem::Resize(width,height); - } eSystem::Draw(true); glFlush(); } +-(void)reshape { + EWOL_INFO("view reshape (" << [self frame].size.width << "," << [self frame].size.height << ")" ); + + // window resize; width and height are in pixel coordinates + // but they are floats + float width = [self frame].size.width; + float height = [self frame].size.height; + eSystem::Resize(width,height); +} + -(void)mouseDown:(NSEvent *)event { NSPoint point = [event locationInWindow]; //float x = [event locationInWindow].x; //point.x; - EWOL_INFO("mouseDown : " << (float)point.x << " " << (float)point.y); + //EWOL_INFO("mouseDown : " << (float)point.x << " " << (float)point.y); eSystem::SetMouseState(1, true, point.x, point.y); } -(void)mouseDragged:(NSEvent *)event { NSPoint point = [event locationInWindow]; - EWOL_INFO("mouseDragged : " << (float)point.x << " " << (float)point.y); + //EWOL_INFO("mouseDragged : " << (float)point.x << " " << (float)point.y); eSystem::SetMouseMotion(1, point.x, point.y); } -(void)mouseUp:(NSEvent *)event { NSPoint point = [event locationInWindow]; - EWOL_INFO("mouseUp : " << (float)point.x << " " << (float)point.y); + //EWOL_INFO("mouseUp : " << (float)point.x << " " << (float)point.y); eSystem::SetMouseState(1, false, point.x, point.y); } -(void)mouseMoved:(NSEvent *)event { NSPoint point = [event locationInWindow]; - EWOL_INFO("mouseMoved : " << (float)point.x << " " << (float)point.y); + //EWOL_INFO("mouseMoved : " << (float)point.x << " " << (float)point.y); + eSystem::SetMouseMotion(0, point.x, point.y); } -(void)mouseEntered:(NSEvent *)event { NSPoint point = [event locationInWindow]; @@ -59,17 +85,17 @@ static int32_t width=0, height=0; } -(void)rightMouseDown:(NSEvent *)event { NSPoint point = [event locationInWindow]; - EWOL_INFO("rightMouseDown : " << (float)point.x << " " << (float)point.y); + //EWOL_INFO("rightMouseDown : " << (float)point.x << " " << (float)point.y); eSystem::SetMouseState(3, true, point.x, point.y); } -(void)rightMouseDragged:(NSEvent *)event { NSPoint point = [event locationInWindow]; - EWOL_INFO("rightMouseDragged : " << (float)point.x << " " << (float)point.y); + //EWOL_INFO("rightMouseDragged : " << (float)point.x << " " << (float)point.y); eSystem::SetMouseMotion(3, point.x, point.y); } -(void)rightMouseUp:(NSEvent *)event { NSPoint point = [event locationInWindow]; - EWOL_INFO("rightMouseUp : " << (float)point.x << " " << (float)point.y); + //EWOL_INFO("rightMouseUp : " << (float)point.x << " " << (float)point.y); eSystem::SetMouseState(3, false, point.x, point.y); } -(void)otherMouseDown:(NSEvent *)event { @@ -84,6 +110,23 @@ static int32_t width=0, height=0; NSPoint point = [event locationInWindow]; EWOL_INFO("otherMouseUp : " << (float)point.x << " " << (float)point.y); } +- (void)scrollWheel:(NSEvent *)event { + NSPoint point = [event locationInWindow]; + //EWOL_INFO("scrollWheel : " << (float)point.x << " " << (float)point.y << "button : " << (int32_t)([event buttonNumber])); + EWOL_INFO("scrollWheel : " << (float)point.x << " " << (float)point.y << " delta(" << (float)([event deltaX]) << "," << (float)([event deltaY]) << ")"); + float deltaY = [event deltaY]; + int32_t idEvent = 4; + if (deltaY < 0) { + idEvent = 5; + } + if (abs(deltaY) < 0.1f) { + return; + } + for (float iii=abs(deltaY) ; iii>=0.0f ; iii-=1.0f) { + eSystem::SetMouseState(idEvent, true , point.x, point.y); + eSystem::SetMouseState(idEvent, false, point.x, point.y); + } +} /* // http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/EventOverview/EventArchitecture/EventArchitecture.html -(void)sendEvent:(NSEvent *)event { @@ -91,4 +134,79 @@ static int32_t width=0, height=0; EWOL_INFO("sendEvent : " << (float)point.x << " " << (float)point.y); } */ + +// this generate all the event entry availlable ==> like a big keep focus ... +- (BOOL)acceptsFirstResponder { + return YES; +} + +- (void)keyDown:(NSEvent *)theEvent { + bool thisIsAReapeateKey = false; + if ([theEvent isARepeat]) { + thisIsAReapeateKey = true; + } + NSString *str = [theEvent charactersIgnoringModifiers]; + unichar c = [str characterAtIndex:0]; + + if (c < ' ' || c > '~') { // only ASCII please + c = 0; + return; + } + EWOL_DEBUG("KeyDown " << (char)c); + eSystem::SetKeyboard(guiKeyBoardMode, (char)c, true, thisIsAReapeateKey); + if (true==thisIsAReapeateKey) { + eSystem::SetKeyboard(guiKeyBoardMode, (char)c, false, thisIsAReapeateKey); + } +} + +- (void)keyUp:(NSEvent *)theEvent { + bool thisIsAReapeateKey = false; + if ([theEvent isARepeat]) { + thisIsAReapeateKey = true; + } + EWOL_DEBUG("KeyUp "); + NSString *str = [theEvent charactersIgnoringModifiers]; + unichar c = [str characterAtIndex:0]; + + if (c < ' ' || c > '~') { // only ASCII please + c = 0; + return; + } + eSystem::SetKeyboard(guiKeyBoardMode, (char)c, false, thisIsAReapeateKey); + if (true==thisIsAReapeateKey) { + eSystem::SetKeyboard(guiKeyBoardMode, (char)c, true, thisIsAReapeateKey); + } +} + +#define FRAME_INTERVAL (0.01) + +static NSTimer *timer = nil; + +- (void)windowDidResignMain:(NSNotification *)notification { +// NSLog(@"window did resign main"); + [timer invalidate]; + + //game_deactivate(); // freeze, pause + [self setNeedsDisplay:YES]; +} + +- (void)windowDidBecomeMain:(NSNotification *)notification { +// NSLog(@"window did become main"); + + //game_activate(); + [self setNeedsDisplay:YES]; + + timer = [NSTimer timerWithTimeInterval:FRAME_INTERVAL + target:self + selector:@selector(timerEvent:) + userInfo:nil + repeats:YES]; + + [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; +} + +- (void)timerEvent:(NSTimer *)t { + //run_game(); + [self setNeedsDisplay:YES]; +} @end