X-Git-Url: http://ecere.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ecere%2Fsrc%2Fgui%2FWindow.ec;h=581e4dcd74ed6292e9df8b1aa43d8f32dae19baa;hb=refs%2Fheads%2FmultiTouch;hp=85dcdaaa85b6c867e7146b23b8011715d7248476;hpb=3b1f0a2264983aa86e36bd0576acb1eed9bbd8ee;p=sdk diff --git a/ecere/src/gui/Window.ec b/ecere/src/gui/Window.ec index 85dcdaa..581e4dc 100644 --- a/ecere/src/gui/Window.ec +++ b/ecere/src/gui/Window.ec @@ -491,6 +491,15 @@ private class HotKeySlot : struct Key key; }; +public struct TouchPointerInfo +{ + int id; + int x, y; + float size, pressure; +}; + +public enum TouchPointerEvent { move, up, down, pointerUp, pointerDown }; + public class Window { private: @@ -4060,6 +4069,59 @@ private: reEntrancy = false; } + public bool MultiTouchMessage(TouchPointerEvent event, Array infos, Modifiers * mods, bool consequential, bool activate) + { + bool result = true; + if(infos.count) + { + Window w = null; + while(result && w != this) + { + // TODO: How to handle this? + int x = infos[0].x; + int y = infos[0].y; + Window msgWindow = GetAtPosition(x,y, false, true, w); + Window window; + delete w; + w = msgWindow; + if(w) incref w; + window = (w && !w.disabled) ? w : null; + + if(consequential) mods->isSideEffect = true; + if(!result || (window && window.destroyed)) window = null; + + if(window) + { + if(window.OnMultiTouch && !window.disabled) + { + Array in { size = infos.size }; + memcpy(in.array, infos.array, sizeof(TouchPointerInfo) * infos.size); + + for(i : in) + { + i.x -= (window.absPosition.x + window.clientStart.x); + i.y -= (window.absPosition.y + window.clientStart.y); + + i.x = Max(Min(i.x, 32767),-32768); + i.y = Max(Min(i.y, 32767),-32768); + } + + incref window; + if(!window.OnMultiTouch(event, in, *mods)) + result = false; + + delete in; + delete window; + } + } + if(!result || !w || !w.clickThrough) + break; + } + delete w; + } + return result; + } + public bool MouseMessage(uint method, int x, int y, Modifiers * mods, bool consequential, bool activate) { bool result = true; @@ -7985,6 +8047,7 @@ public: virtual bool OnMiddleButtonDown(int x, int y, Modifiers mods); virtual bool OnMiddleButtonUp(int x, int y, Modifiers mods); virtual bool OnMiddleDoubleClick(int x, int y, Modifiers mods); + virtual bool OnMultiTouch(TouchPointerEvent event, Array infos, Modifiers mods); virtual void OnMouseCaptureLost(void); virtual void OnHScroll(ScrollBarAction action, int position, Key key); virtual void OnVScroll(ScrollBarAction action, int position, Key key); @@ -10134,6 +10197,18 @@ class WindowControllerInterface : ControllableWindow return result; } + bool OnMultiTouch(TouchPointerEvent event, Array infos, Modifiers mods) + { + bool result = controller.OnMultiTouch ? ((bool(*)(Window, WindowController, TouchPointerEvent event, Array infos, Modifiers))(void *)controller.OnMultiTouch)((Window)controller.controlled, controller, event, infos, mods) : true; + if(result) + { + bool(* onMultiTouch)(Window, TouchPointerEvent, Array, Modifiers) = (void *)controller.windowVTbl[__ecereVMethodID___ecereNameSpace__ecere__gui__Window_OnMultiTouch]; + if(onMultiTouch) + onMultiTouch(controller.window, event, infos, mods); + } + return result; + } + void OnResize(int width, int height) { if(controller.OnResize) @@ -10249,6 +10324,7 @@ public: virtual bool V::OnMiddleButtonDown(WindowController controller, int x, int y, Modifiers mods); virtual bool V::OnMiddleButtonUp(WindowController controller, int x, int y, Modifiers mods); virtual bool V::OnMiddleDoubleClick(WindowController controller, int x, int y, Modifiers mods); + virtual bool V::OnMultiTouch(WindowController controller, TouchPointerEvent event, Array infos, Modifiers mods); virtual void V::OnResize(WindowController controller, int width, int height); virtual void V::OnRedraw(WindowController controller, Surface surface); virtual bool V::OnCreate(WindowController controller);