From 3cd7b371d50022fe29f46f9b82c603f3169c07f9 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Mon, 13 May 2019 09:09:33 -0600 Subject: [PATCH] apps/graphics/twm4nx: Fix error in place of icons on the desktop apps/graphics/twm4nx: Fix several errors associated with the NxTerm buttons. Most changes involved fixing crashes with the exit button is pressed. Now the NxTerm windows behave well. However, they are not receiving console input so there is still more to be done. --- graphics/twm4nx/src/cbackground.cxx | 3 ++- graphics/twm4nx/src/ciconmgr.cxx | 11 ++++------- graphics/twm4nx/src/cnxterm.cxx | 9 +++++++-- graphics/twm4nx/src/cresize.cxx | 3 ++- graphics/twm4nx/src/cwindow.cxx | 16 ++++++++++++---- graphics/twm4nx/src/cwindowevent.cxx | 6 ++++-- graphics/twm4nx/src/cwindowfactory.cxx | 13 ++++++++----- include/graphics/twm4nx/cwindowevent.hxx | 9 +++++++-- include/graphics/twm4nx/cwindowfactory.hxx | 13 ++++++++----- 9 files changed, 54 insertions(+), 29 deletions(-) diff --git a/graphics/twm4nx/src/cbackground.cxx b/graphics/twm4nx/src/cbackground.cxx index c4b3eff36..639236159 100644 --- a/graphics/twm4nx/src/cbackground.cxx +++ b/graphics/twm4nx/src/cbackground.cxx @@ -370,7 +370,8 @@ bool CBackground::createBackgroundWindow(void) events.kbdEvent = EVENT_SYSTEM_NOP; events.closeEvent = EVENT_SYSTEM_NOP; - FAR CWindowEvent *control = new CWindowEvent(m_twm4nx, events); + FAR CWindowEvent *control = + new CWindowEvent(m_twm4nx, (FAR CWindow *)0, events); // Create the background window (CTwm4Nx inherits from CNxServer) diff --git a/graphics/twm4nx/src/ciconmgr.cxx b/graphics/twm4nx/src/ciconmgr.cxx index 8b22f9f47..d2e5039fc 100644 --- a/graphics/twm4nx/src/ciconmgr.cxx +++ b/graphics/twm4nx/src/ciconmgr.cxx @@ -291,17 +291,14 @@ void CIconMgr::removeWindow(FAR CWindow *cwin) FAR struct SWindowEntry *wentry = findEntry(cwin); if (wentry != (FAR struct SWindowEntry *)0) { - // Remove the list from the window structure + // Remove the Window from the icon manager list removeEntry(wentry); - - // Destroy the window - - CWindowFactory *factory = m_twm4nx->getWindowFactory(); - factory->destroyWindow(wentry->cwin); - m_nWindows--; std::free(wentry); + + // Repack the button array without the removed window + pack(); } } diff --git a/graphics/twm4nx/src/cnxterm.cxx b/graphics/twm4nx/src/cnxterm.cxx index de7952b30..bb16277b0 100644 --- a/graphics/twm4nx/src/cnxterm.cxx +++ b/graphics/twm4nx/src/cnxterm.cxx @@ -155,10 +155,15 @@ CNxTerm::~CNxTerm(void) stop(); - // Although we didn't create it, we are responsible for deleting the - // application window + // The following is not necessary. The system will automatically + // delete the CWindow instance when the terminate button is pressed. + // We simply have to terminate the application behind the window + +#if 0 + // Delete the application window delete m_nxtermWindow; +#endif } /** diff --git a/graphics/twm4nx/src/cresize.cxx b/graphics/twm4nx/src/cresize.cxx index 358f772df..078f2ccdc 100644 --- a/graphics/twm4nx/src/cresize.cxx +++ b/graphics/twm4nx/src/cresize.cxx @@ -972,7 +972,8 @@ bool CResize::createSizeWindow(void) events.kbdEvent = EVENT_SYSTEM_NOP; events.closeEvent = EVENT_SYSTEM_NOP; - FAR CWindowEvent *control = new CWindowEvent(m_twm4nx, events); + FAR CWindowEvent *control = + new CWindowEvent(m_twm4nx, (FAR CWindow *)0, events); // 4. Create the main window diff --git a/graphics/twm4nx/src/cwindow.cxx b/graphics/twm4nx/src/cwindow.cxx index ccdc7f6b0..a35a4cf54 100644 --- a/graphics/twm4nx/src/cwindow.cxx +++ b/graphics/twm4nx/src/cwindow.cxx @@ -705,11 +705,11 @@ bool CWindow::event(FAR struct SEventMsg *eventmsg) struct SEventMsg outmsg; outmsg.eventID = m_appEvents.closeEvent; - outmsg.obj = m_appEvents.eventObj; + outmsg.obj = (FAR void *)this; outmsg.pos.x = eventmsg->pos.x; outmsg.pos.y = eventmsg->pos.y; outmsg.context = eventmsg->context; - outmsg.handler = eventmsg->handler; + outmsg.handler = m_appEvents.eventObj; int ret = mq_send(m_eventq, (FAR const char *)&outmsg, sizeof(struct SEventMsg), 100); @@ -795,7 +795,7 @@ bool CWindow::createMainWindow(FAR const nxgl_size_s *winsize, // Setup the the CWindowEvent instance to use our inherited drag event // handler - m_windowEvent = new CWindowEvent(m_twm4nx, m_appEvents); + m_windowEvent = new CWindowEvent(m_twm4nx, this, m_appEvents); m_windowEvent->registerDragEventHandler(this, (uintptr_t)1); // 4. Create the window. Handling provided flags. NOTE: that menu windows @@ -900,7 +900,7 @@ bool CWindow::createToolbar(void) events.kbdEvent = EVENT_SYSTEM_NOP; events.closeEvent = EVENT_SYSTEM_NOP; - FAR CWindowEvent *control = new CWindowEvent(m_twm4nx, events); + FAR CWindowEvent *control = new CWindowEvent(m_twm4nx, this, events); control->registerDragEventHandler(this, (uintptr_t)0); // 3. Get the toolbar sub-window from the framed window @@ -1790,6 +1790,14 @@ void CWindow::cleanup(void) m_tbTitle = (FAR NXWidgets::CLabel *)0; } + // Delete the toolbar + + if (m_toolbar != (FAR NXWidgets::CNxToolbar *)0) + { + delete m_toolbar; + m_toolbar = (FAR NXWidgets::CNxToolbar *)0; + } + // Delete the window if (m_nxWin != (FAR NXWidgets::CNxTkWindow *)0) diff --git a/graphics/twm4nx/src/cwindowevent.cxx b/graphics/twm4nx/src/cwindowevent.cxx index b67164cc3..f857cc7df 100644 --- a/graphics/twm4nx/src/cwindowevent.cxx +++ b/graphics/twm4nx/src/cwindowevent.cxx @@ -95,18 +95,20 @@ using namespace Twm4Nx; * CWindowEvent Constructor * * @param twm4nx The Twm4Nx session instance. + * @param client The client window instance. * @param events Describes the application event configuration * @param style The default style that all widgets on this display * should use. If this is not specified, the widget will use the * values stored in the defaultCWidgetStyle object. */ -CWindowEvent::CWindowEvent(FAR CTwm4Nx *twm4nx, +CWindowEvent::CWindowEvent(FAR CTwm4Nx *twm4nx, FAR CWindow *client, FAR const struct SAppEvents &events, FAR const NXWidgets::CWidgetStyle *style) : NXWidgets::CWidgetControl(style) { m_twm4nx = twm4nx; // Cache the Twm4Nx session + m_clientWindow = client; // Cache the client window instance // Events @@ -364,7 +366,7 @@ void CWindowEvent::handleBlockedEvent(FAR void *arg) struct SNxEventMsg msg; msg.eventID = EVENT_WINDOW_DELETE; - msg.obj = arg; + msg.obj = m_clientWindow; msg.instance = this; int ret = mq_send(m_eventq, (FAR const char *)&msg, diff --git a/graphics/twm4nx/src/cwindowfactory.cxx b/graphics/twm4nx/src/cwindowfactory.cxx index 0826349e7..0b71a6e5c 100644 --- a/graphics/twm4nx/src/cwindowfactory.cxx +++ b/graphics/twm4nx/src/cwindowfactory.cxx @@ -234,12 +234,15 @@ FAR CWindow * * Handle the EVENT_WINDOW_DELETE event. The logic sequence is as * follows: * - * 1. The TERMINATE button in pressed in the Window Toolbar - * 2. CWindowFactory::event receives the widget event, - * EVENT_WINDOW_TERMINATE and request to halt the NX Server + * 1. The TERMINATE button in pressed in the Window Toolbar and + * CWindow::handleActionEvent() catches the button event on the + * event listener thread and generates the EVENT_WINDOW_TERMINATE + * 2. CWindows::event receives the widget event, EVENT_WINDOW_TERMINATE, + * on the Twm4NX manin threadand requests to halt the NX Server * messages queues. - * 3. The server responds with the EVENT_WINDOW_DELETE which is - * caught by this function. + * 3. when server responds, the CwindowsEvent::handleBlockedEvent + * generates the EVENT_WINDOW_DELETE which is caught by + * CWindows::event() and which, in turn calls this function. * * @param cwin The CWindow instance. This will be deleted and its * associated container will be freed. diff --git a/include/graphics/twm4nx/cwindowevent.hxx b/include/graphics/twm4nx/cwindowevent.hxx index 9a54f655f..e8d70414f 100644 --- a/include/graphics/twm4nx/cwindowevent.hxx +++ b/include/graphics/twm4nx/cwindowevent.hxx @@ -59,6 +59,8 @@ namespace Twm4Nx { + class CWindow; // Forward reference + // This structure provides information to support application events struct SAppEvents @@ -152,8 +154,9 @@ namespace Twm4Nx { private: FAR CTwm4Nx *m_twm4nx; /**< Cached instance of CTwm4Nx */ + FAR CWindow *m_clientWindow; /**< The client window instance */ mqd_t m_eventq; /**< NxWidget event message queue */ - struct SAppEvents m_appEvents; /**< Appliation event information */ + struct SAppEvents m_appEvents; /**< Application event information */ // Dragging @@ -202,13 +205,15 @@ namespace Twm4Nx * CWindowEvent Constructor * * @param twm4nx The Twm4Nx session instance. + * @param client The client window instance. * @param events Describes the application event configuration * @param style The default style that all widgets on this display * should use. If this is not specified, the widget will use the * values stored in the defaultCWidgetStyle object. */ - CWindowEvent(FAR CTwm4Nx *twm4nx, FAR const struct SAppEvents &events, + CWindowEvent(FAR CTwm4Nx *twm4nx, FAR CWindow *client, + FAR const struct SAppEvents &events, FAR const NXWidgets::CWidgetStyle *style = (const NXWidgets::CWidgetStyle *)NULL); diff --git a/include/graphics/twm4nx/cwindowfactory.hxx b/include/graphics/twm4nx/cwindowfactory.hxx index 5c193c879..c12ac1d46 100644 --- a/include/graphics/twm4nx/cwindowfactory.hxx +++ b/include/graphics/twm4nx/cwindowfactory.hxx @@ -252,12 +252,15 @@ namespace Twm4Nx * Handle the EVENT_WINDOW_DELETE event. The logic sequence is as * follows: * - * 1. The TERMINATE button in pressed in the Window Toolbar - * 2. CWindowFactory::event receives the widget event, - * EVENT_WINDOW_TERMINATE and request to halt the NX Server + * 1. The TERMINATE button in pressed in the Window Toolbar and + * CWindow::handleActionEvent() catches the button event on the + * event listener thread and generates the EVENT_WINDOW_TERMINATE + * 2. CWindows::event receives the widget event, EVENT_WINDOW_TERMINATE, + * on the Twm4NX manin threadand requests to halt the NX Server * messages queues. - * 3. The server responds with the EVENT_WINDOW_DELETE which is - * caught by this function. + * 3. when server responds, the CwindowsEvent::handleBlockedEvent + * generates the EVENT_WINDOW_DELETE which is caught by + * CWindows::event() and which, in turn calls this function. * * @param cwin The CWindow instance. This will be deleted and its * associated container will be freed.