nuttx-apps/include/graphics/twm4nx/cwindowfactory.hxx
Gregory Nutt 3cd7b371d5 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.
2019-05-13 09:09:33 -06:00

311 lines
10 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// apps/graphics/twm4nx/include/cwindowfactory.hxx
// A collection of Window Helpers: Add a new window, put the titlebar and
// other stuff around the window
//
// Copyright (C) 2019 Gregory Nutt. All rights reserved.
// Author: Gregory Nutt <gnutt@nuttx.org>
//
// Largely an original work but derives from TWM 1.0.10 in many ways:
//
// Copyright 1989,1998 The Open Group
// Copyright 1988 by Evans & Sutherland Computer Corporation,
//
// Please refer to apps/twm4nx/COPYING for detailed copyright information.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in
// the documentation and/or other materials provided with the
// distribution.
// 3. Neither the name NuttX nor the names of its contributors may be
// used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
// OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
/////////////////////////////////////////////////////////////////////////////
#ifndef __APPS_INCLUDE_GRAPHICS_TWM4NX_CWINDOWFACTORY_HXX
#define __APPS_INCLUDE_GRAPHICS_TWM4NX_CWINDOWFACTORY_HXX
/////////////////////////////////////////////////////////////////////////////
// Included Files
/////////////////////////////////////////////////////////////////////////////
#include <cstdbool>
#include "graphics/twm4nx/cwindow.hxx"
#include "graphics/twm4nx/ctwm4nxevent.hxx"
#include "graphics/twm4nx/iapplication.hxx"
/////////////////////////////////////////////////////////////////////////////
// Implementation Classes
/////////////////////////////////////////////////////////////////////////////
namespace NXWidgets
{
struct SRlePaletteBitmap; // Forward reference
}
namespace Twm4Nx
{
class CWindow; // Forward reference
class CIconMgr; // Forward reference
struct SWindowEntry; // Forward reference
// For each window that is on the display, one of these structures
// is allocated and linked into a list. It is essentially just a
// container for a window.
struct SWindow
{
FAR struct SWindow *flink; /**< Foward link tonext window */
FAR struct SWindow *blink; /**< Backward link to previous window */
FAR struct SWindowEntry *wentry; /**< Icon manager list entry (for list removal) */
FAR CWindow *cwin; /**< Window object payload */
};
/**
* This class is a simple implement of the interface to the Main Menu that
* provides the Desktop Main Menu entry.
*/
class CDesktopItem : public IApplication
{
public:
/**
* Return the Main Menu item string. This overrides the method from
* IApplication
*
* @param name The name of the application.
*/
inline NXWidgets::CNxString getName(void)
{
return NXWidgets::CNxString("Desktop");
}
/**
* There is no sub-menu for this Main Menu item. This overrides
* the method from IApplication.
*
* @return This implementation will always return a null value.
*/
inline FAR CMenus *getSubMenu(void)
{
return (FAR CMenus *)0;
}
/**
* There is no custom event handler. We use the common event handler.
*
* @return. null is always returned in this impementation.
*/
inline FAR CTwm4NxEvent *getEventHandler(void)
{
return (FAR CTwm4NxEvent *)0;
}
/**
* Return the Twm4Nx event that will be generated when the Main Menu
* item is selected.
*
* @return. This function always returns EVENT_WINDOW_DESKTOP.
*/
inline uint16_t getEvent(void)
{
return EVENT_WINDOW_DESKTOP;
}
};
/**
* The CWindowFactory class creates new window instances and manages some
* things that are common to all windows.
*/
class CWindowFactory: public CTwm4NxEvent
{
private:
CTwm4Nx *m_twm4nx; /**< Cached Twm4Nx session */
struct nxgl_point_s m_winpos; /**< Position of next window created */
FAR struct SWindow *m_windowHead; /**< List of windows on the display */
CDesktopItem m_desktopItem; /**< For the "Desktop" Main Menu item */
/**
* Add a window container to the window list.
*
* @param win. The window container to be added to the list.
*/
void addWindowContainer(FAR struct SWindow *win);
/**
* Remove a window container from the window list.
*
* @param win. The window container to be removed from the list.
*/
void removeWindowContainer(FAR struct SWindow *win);
/**
* Find the window container that contains the specified window.
*
* @param cwin. The window whose container is needed.
* @return On success, the container of the specific window is returned;
* NULL is returned on failure.
*/
FAR struct SWindow *findWindow(FAR CWindow *cwin);
/**
* Check if the icon within iconBounds collides with any other icon on
* the desktop.
*
* @param cwin The window containing the Icon of interest
* @param iconBounds The candidate Icon bounding box
* @param collision The bounding box of the icon that the candidate
* collides with
* @return Returns true if there is a collision
*/
bool checkCollision(FAR CWindow *cwin,
FAR const struct nxgl_rect_s &iconBounds,
FAR struct nxgl_rect_s &collision);
/**
* This is the function that responds to the EVENT_WINDOW_DESKTOP. It
* iconifies all windows so that the desktop is visible.
*
* @return True is returned if the operation was successful.
*/
bool showDesktop(void);
public:
/**
* CWindowFactory Constructor
*
* @param twm4nx. Twm4Nx session
*/
CWindowFactory(CTwm4Nx *twm4nx);
/**
* CWindowFactory Destructor
*/
~CWindowFactory(void);
/**
* Add Icon Manager menu items to the Main menu. This is really part
* of the instance initialization, but cannot be executed until the
* Main Menu logic is ready.
*
* @return True on success
*/
bool addMenuItems(void);
/**
* Create a new window and add it to the window list.
*
* The window is initialized with all application events disabled.
* The CWindows::configureEvents() method may be called as a second
* initialization step in order to enable application events.
*
* @param name The window name
* @param sbitmap The Icon bitmap
* @param iconMgr Pointer to icon manager instance
* @param flags Toolbar customizations see WFLAGS_NO_* definitions
* @return Reference to the allocated CWindow instance
*/
FAR CWindow *
createWindow(FAR NXWidgets::CNxString &name,
FAR const struct NXWidgets::SRlePaletteBitmap *sbitmap,
FAR CIconMgr *iconMgr, uint8_t flags);
/**
* Handle the EVENT_WINDOW_DELETE event. The logic sequence is as
* follows:
*
* 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. 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.
*/
void destroyWindow(FAR CWindow *cwin);
/**
* Pick a position for a new Icon on the desktop. Tries to avoid
* collisions with other Icons and reserved areas on the background
*
* @param cwin The window being iconified.
* @param defPos The default position to use if there is no free
* region on the desktop.
* @param iconPos The selected Icon position. Might be the same as
* the default position.
* @return True is returned on success
*/
bool placeIcon(FAR CWindow *cwin,
FAR const struct nxgl_point_s &defPos,
FAR struct nxgl_point_s &iconPos);
/**
* Redraw icons. The icons are drawn on the background window. When
* the background window receives a redraw request, it will call this
* method in order to redraw any effected icons drawn in the
* background.
*
* @param nxRect The region in the background to be redrawn
*/
void redrawIcons(FAR const nxgl_rect_s *nxRect);
/**
* Handle WINDOW events.
*
* @param msg. The received NxWidget WINDOW event message.
* @return True if the message was properly handled. false is
* return on any failure.
*/
bool event(FAR struct SEventMsg *msg);
};
}
#endif // __APPS_INCLUDE_GRAPHICS_TWM4NX_CWINDOWFACTORY_HXX