From a591b9ca86b86684f2804cedf5d0c17a3614e913 Mon Sep 17 00:00:00 2001 From: patacongo Date: Sat, 19 May 2012 01:01:00 +0000 Subject: NxWM: Add a missing part of the message blocking logic git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4748 42af7a65-404d-4744-a932-0658087f49c3 --- NxWidgets/libnxwidgets/include/ccallback.hxx | 5 +- NxWidgets/libnxwidgets/include/cwidgetcontrol.hxx | 8 ++- .../libnxwidgets/include/cwindoweventhandler.hxx | 4 +- .../include/cwindoweventhandlerlist.hxx | 6 ++- NxWidgets/libnxwidgets/src/ccallback.cxx | 13 ++--- .../libnxwidgets/src/cwindoweventhandlerlist.cxx | 6 ++- NxWidgets/nxwm/include/capplicationwindow.hxx | 4 +- NxWidgets/nxwm/include/cfullscreenwindow.hxx | 4 +- NxWidgets/nxwm/include/cwindowmessenger.hxx | 18 +++---- NxWidgets/nxwm/include/iapplication.hxx | 8 ++- NxWidgets/nxwm/include/iapplicationwindow.hxx | 12 ++++- NxWidgets/nxwm/src/capplicationwindow.cxx | 6 ++- NxWidgets/nxwm/src/ccalibration.cxx | 8 +-- NxWidgets/nxwm/src/cfullscreenwindow.cxx | 8 +-- NxWidgets/nxwm/src/cnxconsole.cxx | 2 +- NxWidgets/nxwm/src/cstartwindow.cxx | 2 +- NxWidgets/nxwm/src/cwindowmessenger.cxx | 57 ++++++++++++---------- 17 files changed, 102 insertions(+), 69 deletions(-) (limited to 'NxWidgets') diff --git a/NxWidgets/libnxwidgets/include/ccallback.hxx b/NxWidgets/libnxwidgets/include/ccallback.hxx index ca3313a9b..09cb83a8a 100644 --- a/NxWidgets/libnxwidgets/include/ccallback.hxx +++ b/NxWidgets/libnxwidgets/include/ccallback.hxx @@ -195,12 +195,13 @@ namespace NXWidgets * callbacks can lead to bad behavior when the callback is executed. * * @param hwnd. Window handle of the blocked window - * @param arg. User provided argument (see nx_openwindow, nx_requestbkgd, + * @param arg1. User provided argument (see nx_openwindow, nx_requestbkgd, * nxtk_openwindow, or nxtk_opentoolbar) + * @param arg2 - User provided argument (see nx_block or nxtk_block) */ #ifdef CONFIG_NX_MULTIUSER - static void windowBlocked(NXWINDOW hwnd, FAR void *arg); + static void windowBlocked(NXWINDOW hwnd, FAR void *arg1, FAR void *arg2); #endif public: diff --git a/NxWidgets/libnxwidgets/include/cwidgetcontrol.hxx b/NxWidgets/libnxwidgets/include/cwidgetcontrol.hxx index 453cc1115..e709271a0 100644 --- a/NxWidgets/libnxwidgets/include/cwidgetcontrol.hxx +++ b/NxWidgets/libnxwidgets/include/cwidgetcontrol.hxx @@ -609,15 +609,13 @@ namespace NXWidgets * window may be safely closed. Closing the window prior with pending * callbacks can lead to bad behavior when the callback is executed. * - * @param hwnd. Window handle of the blocked window - * @param arg. User provided argument (see nx_openwindow, nx_requestbkgd, - * nxtk_openwindow, or nxtk_opentoolbar) + * @param arg - User provided argument (see nx_block or nxtk_block) */ #ifdef CONFIG_NX_MULTIUSER - inline void windowBlocked(void) + inline void windowBlocked(FAR void *arg) { - m_eventHandlers.raiseBlockedEvent(); + m_eventHandlers.raiseBlockedEvent(arg); } #endif diff --git a/NxWidgets/libnxwidgets/include/cwindoweventhandler.hxx b/NxWidgets/libnxwidgets/include/cwindoweventhandler.hxx index c414abadb..574c24b55 100644 --- a/NxWidgets/libnxwidgets/include/cwindoweventhandler.hxx +++ b/NxWidgets/libnxwidgets/include/cwindoweventhandler.hxx @@ -108,9 +108,11 @@ namespace NXWidgets /** * Handle a NX window blocked event + * + * @param arg - User provided argument (see nx_block or nxtk_block) */ - virtual void handleBlockedEvent(void) { } + virtual void handleBlockedEvent(FAR void *arg) { } }; } diff --git a/NxWidgets/libnxwidgets/include/cwindoweventhandlerlist.hxx b/NxWidgets/libnxwidgets/include/cwindoweventhandlerlist.hxx index d9e17de09..035e6a7b9 100644 --- a/NxWidgets/libnxwidgets/include/cwindoweventhandlerlist.hxx +++ b/NxWidgets/libnxwidgets/include/cwindoweventhandlerlist.hxx @@ -39,7 +39,7 @@ /**************************************************************************** * Included Files ****************************************************************************/ - + #include #include @@ -163,9 +163,11 @@ namespace NXWidgets /** * Raise an NX window blocked event. + * + * @param arg - User provided argument (see nx_block or nxtk_block) */ - void raiseBlockedEvent(void); + void raiseBlockedEvent(FAR void *arg); }; } diff --git a/NxWidgets/libnxwidgets/src/ccallback.cxx b/NxWidgets/libnxwidgets/src/ccallback.cxx index 32c5b7d64..b2256c6bb 100644 --- a/NxWidgets/libnxwidgets/src/ccallback.cxx +++ b/NxWidgets/libnxwidgets/src/ccallback.cxx @@ -211,22 +211,23 @@ void CCallback::newKeyboardEvent(NXHANDLE hwnd, uint8_t nCh, * callbacks can lead to bad behavior when the callback is executed. * * @param hwnd. Window handle of the blocked window - * @param arg. User provided argument (see nx_openwindow, nx_requestbkgd, + * @param arg1. User provided argument (see nx_openwindow, nx_requestbkgd, * nxtk_openwindow, or nxtk_opentoolbar) + * @param arg2 - User provided argument (see nx_block or nxtk_block) */ #ifdef CONFIG_NX_MULTIUSER -void CCallback::windowBlocked(NXWINDOW hwnd, FAR void *arg) +void CCallback::windowBlocked(NXWINDOW hwnd, FAR void *arg1, FAR void *arg2) { - gvdbg("hwnd=%p arg=%p\n", hwnd, arg); + gvdbg("hwnd=%p arg1=%p arg2=%p\n", hwnd, arg1, arg2); - // The argument must be the CWidgetControl instance + // The first argument must be the CWidgetControl instance - CWidgetControl *This = (CWidgetControl *)arg; + CWidgetControl *This = (CWidgetControl *)arg1; // Just forward the callback to the CWidgetControl::windowBlocked method - This->windowBlocked(); + This->windowBlocked(arg2); } #endif diff --git a/NxWidgets/libnxwidgets/src/cwindoweventhandlerlist.cxx b/NxWidgets/libnxwidgets/src/cwindoweventhandlerlist.cxx index 15b2c65ff..dfdabcf08 100644 --- a/NxWidgets/libnxwidgets/src/cwindoweventhandlerlist.cxx +++ b/NxWidgets/libnxwidgets/src/cwindoweventhandlerlist.cxx @@ -162,12 +162,14 @@ void CWindowEventHandlerList::raiseKeyboardEvent(void) /** * Raise an NX window blocked event. + * + * @param arg - User provided argument (see nx_block or nxtk_block) */ -void CWindowEventHandlerList::raiseBlockedEvent(void) +void CWindowEventHandlerList::raiseBlockedEvent(FAR void *arg) { for (int i = 0; i < m_eventHandlers.size(); ++i) { - m_eventHandlers.at(i)->handleBlockedEvent(); + m_eventHandlers.at(i)->handleBlockedEvent(arg); } } diff --git a/NxWidgets/nxwm/include/capplicationwindow.hxx b/NxWidgets/nxwm/include/capplicationwindow.hxx index 686150d14..46e4e90d2 100644 --- a/NxWidgets/nxwm/include/capplicationwindow.hxx +++ b/NxWidgets/nxwm/include/capplicationwindow.hxx @@ -162,9 +162,11 @@ namespace NxWM /** * Block further activity on this window in preparation for window * shutdown. + * + * @param app. The application to be blocked */ - void block(void); + void block(IApplication *app); /** * Set the window label diff --git a/NxWidgets/nxwm/include/cfullscreenwindow.hxx b/NxWidgets/nxwm/include/cfullscreenwindow.hxx index 1bab37543..70da9fee5 100644 --- a/NxWidgets/nxwm/include/cfullscreenwindow.hxx +++ b/NxWidgets/nxwm/include/cfullscreenwindow.hxx @@ -126,9 +126,11 @@ namespace NxWM /** * Block further activity on this window in preparation for window * shutdown. + * + * @param app. The application to be blocked */ - void block(void); + void block(IApplication *app); /** * Set the window label diff --git a/NxWidgets/nxwm/include/cwindowmessenger.hxx b/NxWidgets/nxwm/include/cwindowmessenger.hxx index 645e750cb..0aa8961bb 100644 --- a/NxWidgets/nxwm/include/cwindowmessenger.hxx +++ b/NxWidgets/nxwm/include/cwindowmessenger.hxx @@ -98,6 +98,14 @@ namespace NxWM void handleKeyboardEvent(void); #endif + /** + * Handle a NX window blocked event + * + * @param arg - User provided argument (see nx_block or nxtk_block) + */ + + void handleBlockedEvent(FAR void *arg); + public: /** @@ -111,16 +119,6 @@ namespace NxWM */ ~CWindowMessenger(void); - - /** - * Destroy the application window and everything in it. This is - * handled by CWindowMessenger (vs just calling the destructors) because - * in the case where an application destroys itself (because of pressing - * the stop button), then we need to unwind and get out of the application - * logic before destroying all of its objects. - */ - - void destroy(IApplication *app); }; } #endif // __cplusplus diff --git a/NxWidgets/nxwm/include/iapplication.hxx b/NxWidgets/nxwm/include/iapplication.hxx index 28e50e013..456202c6d 100644 --- a/NxWidgets/nxwm/include/iapplication.hxx +++ b/NxWidgets/nxwm/include/iapplication.hxx @@ -45,8 +45,6 @@ #include "cnxstring.hxx" #include "ibitmap.hxx" -#include "iapplicationwindow.hxx" - /**************************************************************************** * Pre-Processor Definitions ****************************************************************************/ @@ -59,6 +57,12 @@ namespace NxWM { + /** + * Foward references + */ + + class IApplicationWindow; + /** * IApplication provides the abstract base class for each NxWM application. */ diff --git a/NxWidgets/nxwm/include/iapplicationwindow.hxx b/NxWidgets/nxwm/include/iapplicationwindow.hxx index ed221797d..60f1b332c 100644 --- a/NxWidgets/nxwm/include/iapplicationwindow.hxx +++ b/NxWidgets/nxwm/include/iapplicationwindow.hxx @@ -46,6 +46,8 @@ #include "cnxstring.hxx" #include "cwidgetcontrol.hxx" +#include "iapplication.hxx" + /**************************************************************************** * Pre-Processor Definitions ****************************************************************************/ @@ -58,6 +60,12 @@ namespace NxWM { + /** + * Foward references + */ + + class IApplication; + /** * This callback class is used by the application to get notification of toolbar * related events. @@ -137,9 +145,11 @@ namespace NxWM /** * Block further activity on this window in preparation for window * shutdown. + * + * @param app. The application to be blocked */ - virtual void block(void) = 0; + virtual void block(IApplication *app) = 0; /** * Set the window label diff --git a/NxWidgets/nxwm/src/capplicationwindow.cxx b/NxWidgets/nxwm/src/capplicationwindow.cxx index c0bc9ed62..5cf172ea6 100644 --- a/NxWidgets/nxwm/src/capplicationwindow.cxx +++ b/NxWidgets/nxwm/src/capplicationwindow.cxx @@ -426,9 +426,11 @@ NXWidgets::CWidgetControl *CApplicationWindow::getWidgetControl(void) const /** * Block further activity on this window in preparation for window * shutdown. + * + * @param app. The application to be blocked */ -void CApplicationWindow::block(void) +void CApplicationWindow::block(IApplication *app) { // Get the widget control from the NXWidgets::CNxWindow instance @@ -437,7 +439,7 @@ void CApplicationWindow::block(void) // And then block further reporting activity on the underlying // NX framed window - nxtk_block(control->getWindowHandle()); + nxtk_block(control->getWindowHandle(), (FAR void *)app); } /** diff --git a/NxWidgets/nxwm/src/ccalibration.cxx b/NxWidgets/nxwm/src/ccalibration.cxx index d93f56a47..6f5976100 100644 --- a/NxWidgets/nxwm/src/ccalibration.cxx +++ b/NxWidgets/nxwm/src/ccalibration.cxx @@ -220,13 +220,13 @@ void CCalibration::stop(void) void CCalibration::destroy(void) { - // Block any further window messages + // Make sure that the application is stopped (should already be stopped) - m_window->block(); + stop(); - // Make sure that the application is stopped + // Block any further window messages - stop(); + m_window->block(this); } /** diff --git a/NxWidgets/nxwm/src/cfullscreenwindow.cxx b/NxWidgets/nxwm/src/cfullscreenwindow.cxx index 0c34166c0..6ec5bf802 100644 --- a/NxWidgets/nxwm/src/cfullscreenwindow.cxx +++ b/NxWidgets/nxwm/src/cfullscreenwindow.cxx @@ -36,7 +36,7 @@ /******************************************************************************************** * Included Files ********************************************************************************************/ - + #include #include @@ -141,9 +141,11 @@ NXWidgets::CWidgetControl *CFullScreenWindow::getWidgetControl(void) const /** * Block further activity on this window in preparation for window * shutdown. + * + * @param app. The application to be blocked */ -void CFullScreenWindow::block(void) +void CFullScreenWindow::block(IApplication *app) { // Get the widget control from the NXWidgets::CNxWindow instance @@ -152,7 +154,7 @@ void CFullScreenWindow::block(void) // And then block further reporting activity on the underlying // NX raw window - nx_block(control->getWindowHandle()); + nx_block(control->getWindowHandle(), (FAR void *)app); } /** diff --git a/NxWidgets/nxwm/src/cnxconsole.cxx b/NxWidgets/nxwm/src/cnxconsole.cxx index 64321ddfb..6a64afc1b 100644 --- a/NxWidgets/nxwm/src/cnxconsole.cxx +++ b/NxWidgets/nxwm/src/cnxconsole.cxx @@ -341,7 +341,7 @@ void CNxConsole::destroy(void) { // Block any further window messages - m_window->block(); + m_window->block(this); // Make sure that the application is stopped diff --git a/NxWidgets/nxwm/src/cstartwindow.cxx b/NxWidgets/nxwm/src/cstartwindow.cxx index 3dfab5097..af46e7b82 100644 --- a/NxWidgets/nxwm/src/cstartwindow.cxx +++ b/NxWidgets/nxwm/src/cstartwindow.cxx @@ -234,7 +234,7 @@ void CStartWindow::destroy(void) // Block any further window messages - m_window->block(); + m_window->block(this); // Make sure that the application is stopped diff --git a/NxWidgets/nxwm/src/cwindowmessenger.cxx b/NxWidgets/nxwm/src/cwindowmessenger.cxx index 4e458566d..b467f533c 100644 --- a/NxWidgets/nxwm/src/cwindowmessenger.cxx +++ b/NxWidgets/nxwm/src/cwindowmessenger.cxx @@ -90,31 +90,6 @@ CWindowMessenger::~CWindowMessenger(void) (void)mq_close(m_mqd); } -/** - * Destroy the application window and everything in it. This is - * handled by CWindowMessenger (vs just calling the destructors) because - * in the case where an application destroys itself (because of pressing - * the stop button), then we need to unwind and get out of the application - * logic before destroying all of its objects. - */ - -void CWindowMessenger::destroy(IApplication *app) -{ - // Send a message to destroy the window isntance at a later time - - struct SStartWindowMessage outmsg; - outmsg.msgId = MSGID_DESTROY_APP; - outmsg.instance = (FAR void *)app; - - gdbg("Sending MSGID_DESTROY_APP with instance=%p\n", app); - int ret = mq_send(m_mqd, &outmsg, sizeof(struct SStartWindowMessage), - CONFIG_NXWM_STARTWINDOW_MXMPRIO); - if (ret < 0) - { - gdbg("ERROR: mq_send failed: %d\n", errno); - } -} - /** * Handle an NX window mouse input event. * @@ -208,3 +183,35 @@ void CWindowMessenger::handleKeyboardEvent(void) } } #endif + +/** + * Handle a NX window blocked event. This handler is called when we + * receive the BLOCKED message meaning that there are no further pending + * actions on the window. It is now safe to delete the window. + * + * This is handled by sending a message to the start window thread (vs just + * calling the destructors) because in the case where an application + * destroys itself (because of pressing the stop button), then we need to + * unwind and get out of the application logic before destroying all of its + * objects. + * + * @param arg - User provided argument (see nx_block or nxtk_block) + */ + +void CWindowMessenger::handleBlockedEvent(FAR void *arg) +{ + // Send a message to destroy the window isntance at a later time + + struct SStartWindowMessage outmsg; + outmsg.msgId = MSGID_DESTROY_APP; + outmsg.instance = arg; + + gdbg("Sending MSGID_DESTROY_APP with instance=%p\n", arg); + int ret = mq_send(m_mqd, &outmsg, sizeof(struct SStartWindowMessage), + CONFIG_NXWM_STARTWINDOW_MXMPRIO); + if (ret < 0) + { + gdbg("ERROR: mq_send failed: %d\n", errno); + } +} + -- cgit v1.2.3