From 60679bd51420f1827af1e2b07452d886129e9bab Mon Sep 17 00:00:00 2001 From: Joshua Granick Date: Wed, 9 Jul 2014 17:16:36 -0700 Subject: [PATCH] Add more Window events --- lime/app/Application.hx | 12 ++++- lime/ui/Window.hx | 54 ++++++++++++++++++++-- project/include/ui/WindowEvent.h | 11 ++++- project/src/backend/sdl/SDLApplication.cpp | 25 ++++++++-- project/src/ui/MouseEvent.cpp | 7 ++- project/src/ui/WindowEvent.cpp | 28 +++++++++++ 6 files changed, 127 insertions(+), 10 deletions(-) diff --git a/lime/app/Application.hx b/lime/app/Application.hx index e2cd236ed..53f9d5c5e 100644 --- a/lime/app/Application.hx +++ b/lime/app/Application.hx @@ -83,7 +83,12 @@ class Application extends Module { TouchEventManager.onTouchEnd.add (onTouchEnd); Window.onWindowActivate.add (onWindowActivate); + Window.onWindowClose.add (onWindowClose); Window.onWindowDeactivate.add (onWindowDeactivate); + Window.onWindowFocusIn.add (onWindowFocusIn); + Window.onWindowFocusOut.add (onWindowFocusOut); + Window.onWindowMove.add (onWindowMove); + Window.onWindowResize.add (onWindowResize); var window = new Window (config); var renderer = new Renderer (window); @@ -165,7 +170,12 @@ class Application extends Module { public function onTouchMove (x:Float, y:Float, id:Int):Void {} public function onTouchStart (x:Float, y:Float, id:Int):Void {} public function onWindowActivate ():Void {} - public function onWindowDeactivate ():Void { } + public function onWindowClose ():Void {} + public function onWindowDeactivate ():Void {} + public function onWindowFocusIn ():Void {} + public function onWindowFocusOut ():Void {} + public function onWindowMove (x:Float, y:Float):Void {} + public function onWindowResize (width:Float, height:Float):Void {} public function render (context:RenderContext):Void { diff --git a/lime/ui/Window.hx b/lime/ui/Window.hx index 08c9dc6c4..8f3131bb7 100644 --- a/lime/ui/Window.hx +++ b/lime/ui/Window.hx @@ -24,7 +24,12 @@ class Window { public static var onWindowActivate = new EventVoid> (); + public static var onWindowClose = new EventVoid> (); public static var onWindowDeactivate = new EventVoid> (); + public static var onWindowFocusIn = new EventVoid> (); + public static var onWindowFocusOut = new EventVoid> (); + public static var onWindowMove = new EventFloat->Void> (); + public static var onWindowResize = new EventFloat->Void> (); private static var eventInfo = new WindowEventInfo (); private static var registered:Bool; @@ -34,6 +39,8 @@ class Window { public var fullscreen:Bool; public var height:Int; public var width:Int; + public var x:Int; + public var y:Int; #if js public var canvas:CanvasElement; @@ -213,7 +220,7 @@ class Window { } - private static function dispatch ():Void { + private function dispatch ():Void { switch (eventInfo.type) { @@ -221,10 +228,36 @@ class Window { onWindowActivate.dispatch (); + case WINDOW_CLOSE: + + onWindowClose.dispatch (); + case WINDOW_DEACTIVATE: onWindowDeactivate.dispatch (); + case WINDOW_FOCUS_IN: + + onWindowFocusIn.dispatch (); + + case WINDOW_FOCUS_OUT: + + onWindowFocusOut.dispatch (); + + case WINDOW_MOVE: + + x = eventInfo.x; + y = eventInfo.y; + + onWindowMove.dispatch (eventInfo.x, eventInfo.y); + + case WINDOW_RESIZE: + + width = eventInfo.width; + height = eventInfo.height; + + onWindowResize.dispatch (eventInfo.width, eventInfo.height); + } } @@ -262,19 +295,27 @@ class Window { private class WindowEventInfo { + public var height:Int; public var type:WindowEventType; + public var width:Int; + public var x:Int; + public var y:Int; - public function new (type:WindowEventType = null) { + public function new (type:WindowEventType = null, width:Int = 0, height:Int = 0, x:Int = 0, y:Int = 0) { this.type = type; + this.width = width; + this.height = height; + this.x = x; + this.y = y; } public function clone ():WindowEventInfo { - return new WindowEventInfo (type); + return new WindowEventInfo (type, width, height, x, y); } @@ -302,6 +343,11 @@ private class WindowEventInfo { @:enum private abstract WindowEventType(Int) { var WINDOW_ACTIVATE = 0; - var WINDOW_DEACTIVATE = 1; + var WINDOW_CLOSE = 1; + var WINDOW_DEACTIVATE = 2; + var WINDOW_FOCUS_IN = 3; + var WINDOW_FOCUS_OUT = 4; + var WINDOW_MOVE = 5; + var WINDOW_RESIZE = 6; } \ No newline at end of file diff --git a/project/include/ui/WindowEvent.h b/project/include/ui/WindowEvent.h index a05cb810a..4fba2b45a 100644 --- a/project/include/ui/WindowEvent.h +++ b/project/include/ui/WindowEvent.h @@ -11,7 +11,12 @@ namespace lime { enum WindowEventType { WINDOW_ACTIVATE, - WINDOW_DEACTIVATE + WINDOW_CLOSE, + WINDOW_DEACTIVATE, + WINDOW_FOCUS_IN, + WINDOW_FOCUS_OUT, + WINDOW_MOVE, + WINDOW_RESIZE }; @@ -27,7 +32,11 @@ namespace lime { static void Dispatch (WindowEvent* event); + int height; WindowEventType type; + int width; + int x; + int y; }; diff --git a/project/src/backend/sdl/SDLApplication.cpp b/project/src/backend/sdl/SDLApplication.cpp index ad9d881a4..4f4281538 100644 --- a/project/src/backend/sdl/SDLApplication.cpp +++ b/project/src/backend/sdl/SDLApplication.cpp @@ -162,6 +162,10 @@ namespace lime { case SDL_WINDOWEVENT_SHOWN: case SDL_WINDOWEVENT_HIDDEN: + case SDL_WINDOWEVENT_SIZE_CHANGED: + case SDL_WINDOWEVENT_FOCUS_GAINED: + case SDL_WINDOWEVENT_FOCUS_LOST: + case SDL_WINDOWEVENT_MOVED: ProcessWindowEvent (event); break; @@ -171,11 +175,9 @@ namespace lime { RenderEvent::Dispatch (&renderEvent); break; - case SDL_WINDOWEVENT_SIZE_CHANGED: /*resize*/ break; - case SDL_WINDOWEVENT_FOCUS_GAINED: /*focus in*/ break; - case SDL_WINDOWEVENT_FOCUS_LOST: /*focus out*/ break; case SDL_WINDOWEVENT_CLOSE: + ProcessWindowEvent (event); active = false; break; @@ -261,7 +263,24 @@ namespace lime { switch (event->window.event) { case SDL_WINDOWEVENT_SHOWN: windowEvent.type = WINDOW_ACTIVATE; break; + case SDL_WINDOWEVENT_CLOSE: windowEvent.type = WINDOW_CLOSE; break; case SDL_WINDOWEVENT_HIDDEN: windowEvent.type = WINDOW_DEACTIVATE; break; + case SDL_WINDOWEVENT_FOCUS_GAINED: windowEvent.type = WINDOW_FOCUS_IN; break; + case SDL_WINDOWEVENT_FOCUS_LOST: windowEvent.type = WINDOW_FOCUS_OUT; break; + + case SDL_WINDOWEVENT_MOVED: + + windowEvent.type = WINDOW_MOVE; + windowEvent.x = event->window.data1; + windowEvent.y = event->window.data2; + break; + + case SDL_WINDOWEVENT_SIZE_CHANGED: + + windowEvent.type = WINDOW_RESIZE; + windowEvent.width = event->window.data1; + windowEvent.height = event->window.data2; + break; } diff --git a/project/src/ui/MouseEvent.cpp b/project/src/ui/MouseEvent.cpp index 5e8d931e2..d153902a3 100644 --- a/project/src/ui/MouseEvent.cpp +++ b/project/src/ui/MouseEvent.cpp @@ -41,7 +41,12 @@ namespace lime { value object = (MouseEvent::eventObject ? MouseEvent::eventObject->get () : alloc_empty_object ()); - alloc_field (object, id_button, alloc_int (event->button)); + if (event->type != MOUSE_WHEEL) { + + alloc_field (object, id_button, alloc_int (event->button)); + + } + alloc_field (object, id_type, alloc_int (event->type)); alloc_field (object, id_x, alloc_float (event->x)); alloc_field (object, id_y, alloc_float (event->y)); diff --git a/project/src/ui/WindowEvent.cpp b/project/src/ui/WindowEvent.cpp index 7e4536c91..0b0421ca6 100644 --- a/project/src/ui/WindowEvent.cpp +++ b/project/src/ui/WindowEvent.cpp @@ -8,13 +8,21 @@ namespace lime { AutoGCRoot* WindowEvent::callback = 0; AutoGCRoot* WindowEvent::eventObject = 0; + static int id_height; static int id_type; + static int id_width; + static int id_x; + static int id_y; static bool init = false; WindowEvent::WindowEvent () { type = WINDOW_ACTIVATE; + width = 0; + height = 0; + x = 0; + y = 0; } @@ -25,7 +33,11 @@ namespace lime { if (!init) { + id_height = val_id ("height"); id_type = val_id ("type"); + id_width = val_id ("width"); + id_x = val_id ("x"); + id_y = val_id ("y"); init = true; } @@ -34,6 +46,22 @@ namespace lime { alloc_field (object, id_type, alloc_int (event->type)); + switch (event->type) { + + case WINDOW_MOVE: + + alloc_field (object, id_x, alloc_int (event->x)); + alloc_field (object, id_y, alloc_int (event->y)); + break; + + case WINDOW_RESIZE: + + alloc_field (object, id_width, alloc_int (event->width)); + alloc_field (object, id_height, alloc_int (event->height)); + break; + + } + val_call0 (WindowEvent::callback->get ()); }