From 93ce805b3b7d0a083d3209acb9787e5677a14df1 Mon Sep 17 00:00:00 2001 From: Jerome St-Louis Date: Thu, 16 Apr 2015 14:14:05 -0400 Subject: [PATCH] ecere/gui/Window: Fixed support for changing active WindowController - Note: 'window' member should no longer be set --- ecere/src/gui/Window.ec | 73 ++++++++++++++-------- .../bitmapsAndKB/KBController/controller.ec | 2 +- 2 files changed, 47 insertions(+), 28 deletions(-) diff --git a/ecere/src/gui/Window.ec b/ecere/src/gui/Window.ec index 6572e81..68e4f79 100644 --- a/ecere/src/gui/Window.ec +++ b/ecere/src/gui/Window.ec @@ -9780,7 +9780,22 @@ private: property subclass(DisplayDriver) _displayDriver { get { return !formDesigner ? dispDriver : null; } } WindowController controller; - public property WindowController controller { get { return controller; } set { delete controller; controller = value; if(controller) incref controller; } } + public property WindowController controller + { + get { return controller; } + set + { + if(controller) + controller.setWindow(null); + delete controller; + controller = value; + if(controller) + { + incref controller; + controller.setWindow(this); + } + } + } }; public class CommonControl : Window @@ -9969,7 +9984,7 @@ class WindowControllerInterface : ControllableWindow bool OnMouseMove(int x, int y, Modifiers mods) { - bool result = ((bool(*)(Window, WindowController, int, int, Modifiers))(void *)controller.OnMouseMove)((Window)controller.controlled, controller, x, y, mods); + bool result = controller.OnMouseMove ? ((bool(*)(Window, WindowController, int, int, Modifiers))(void *)controller.OnMouseMove)((Window)controller.controlled, controller, x, y, mods) : true; if(result) { bool(* onMouseMove)(Window, int, int, Modifiers) = (void *)controller.windowVTbl[__ecereVMethodID___ecereNameSpace__ecere__gui__Window_OnMouseMove]; @@ -10147,37 +10162,41 @@ class WindowControllerInterface : ControllableWindow public class WindowController { -public: - property Window window + void setWindow(Window value) { - set + uint size = class(Window).vTblSize; + if(value) { - uint size = class(Window).vTblSize; - if(value) + delete windowVTbl; + windowVTbl = new void *[size]; + memcpy(windowVTbl, value._vTbl, size * sizeof(void *)); + if(value._vTbl == value._class._vTbl) { - windowVTbl = new void *[size]; - memcpy(windowVTbl, value._vTbl, size * sizeof(void *)); - if(value._vTbl == value._class._vTbl) - { - value._vTbl = new void *[value._class.vTblSize]; - memcpy(value._vTbl + size, value._class._vTbl + size, (value._class.vTblSize - size) * sizeof(void *)); - } + value._vTbl = new void *[value._class.vTblSize]; + memcpy(value._vTbl + size, value._class._vTbl + size, (value._class.vTblSize - size) * sizeof(void *)); + } + { + int c; + for(c = 0; c < size; c++) { - int c; - for(c = 0; c < size; c++) - { - void * function = class(WindowControllerInterface)._vTbl[c]; - if(function && function != DefaultFunction) - value._vTbl[c] = function; - else - value._vTbl[c] = windowVTbl[c]; - } + void * function = class(WindowControllerInterface)._vTbl[c]; + if(function && function != DefaultFunction) + value._vTbl[c] = function; + else + value._vTbl[c] = windowVTbl[c]; } } - else - memcpy(value._vTbl, windowVTbl, class(Window).vTblSize * sizeof(void *)); - window = value; } + else if(window) + { + memcpy(window._vTbl, windowVTbl, class(Window).vTblSize * sizeof(void *)); + delete windowVTbl; + } + window = value; + } +public: + property Window window + { get { return window; } } property V controlled @@ -10205,7 +10224,7 @@ public: virtual void V::OnUnloadGraphics(WindowController controller); private: - int (** windowVTbl)(); + public int (** windowVTbl)(); V controlled; Window window; diff --git a/samples/guiAndGfx/bitmapsAndKB/KBController/controller.ec b/samples/guiAndGfx/bitmapsAndKB/KBController/controller.ec index 44604e6..495cddd 100644 --- a/samples/guiAndGfx/bitmapsAndKB/KBController/controller.ec +++ b/samples/guiAndGfx/bitmapsAndKB/KBController/controller.ec @@ -90,7 +90,7 @@ class MainWindow : Window hasClose = true; size = { 576, 432 }; - controller = WorldObjectController { this }; + controller = WorldObjectController { }; bool OnCreate() { -- 1.8.3.1