diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-05-01 22:31:26 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-05-01 22:31:26 +0000 |
commit | fe90fbdbd18eed8712bbc30909efb1b7870f859f (patch) | |
tree | eee1c00f81d018b0b2ec87c6a61d59947ad75606 | |
parent | fd4dd86fe8de2ddda1e8723973e8b5774528ebb7 (diff) | |
download | px4-nuttx-fe90fbdbd18eed8712bbc30909efb1b7870f859f.tar.gz px4-nuttx-fe90fbdbd18eed8712bbc30909efb1b7870f859f.tar.bz2 px4-nuttx-fe90fbdbd18eed8712bbc30909efb1b7870f859f.zip |
NxWM update
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4683 42af7a65-404d-4744-a932-0658087f49c3
-rw-r--r-- | NxWidgets/UnitTests/nxwm/main.cxx | 11 | ||||
-rw-r--r-- | NxWidgets/libnxwidgets/include/cwidgetcontrol.hxx | 33 | ||||
-rw-r--r-- | NxWidgets/libnxwidgets/src/cimage.cxx | 2 | ||||
-rw-r--r-- | NxWidgets/libnxwidgets/src/cwidgetcontrol.cxx | 27 | ||||
-rw-r--r-- | NxWidgets/nxwm/src/cnxconsole.cxx | 62 | ||||
-rw-r--r-- | NxWidgets/nxwm/src/ctaskbar.cxx | 11 |
6 files changed, 109 insertions, 37 deletions
diff --git a/NxWidgets/UnitTests/nxwm/main.cxx b/NxWidgets/UnitTests/nxwm/main.cxx index d93d9b391..f07cdb19c 100644 --- a/NxWidgets/UnitTests/nxwm/main.cxx +++ b/NxWidgets/UnitTests/nxwm/main.cxx @@ -172,6 +172,17 @@ int MAIN_NAME(int argc, char *argv[]) return EXIT_FAILURE; } + // Initialize the NSH library + + printf(MAIN_STRING "Initialize the NSH library\n"); + if (!NxWM::nshlibInitialize()) + { + printf(MAIN_STRING "ERROR: Failed to initialize the NSH library\n"); + delete window; + delete g_nxwmtest.taskbar; + return EXIT_FAILURE; + } + // Add the NxConsole application to the start window NxWM::CNxConsole *console = (NxWM::CNxConsole *)0; // Avoid compiler complaint diff --git a/NxWidgets/libnxwidgets/include/cwidgetcontrol.hxx b/NxWidgets/libnxwidgets/include/cwidgetcontrol.hxx index 9fedd4618..0a894eae8 100644 --- a/NxWidgets/libnxwidgets/include/cwidgetcontrol.hxx +++ b/NxWidgets/libnxwidgets/include/cwidgetcontrol.hxx @@ -193,6 +193,9 @@ namespace NXWidgets struct nxgl_size_s m_size; /**< Size of the window */ struct nxgl_point_s m_pos; /**< Position in display space */ struct nxgl_rect_s m_bounds; /**< Size of the display */ +#ifdef CONFIG_NX_MULTIUSER + sem_t m_geosem; /**< Posted when geometry is valid */ +#endif /** * Style @@ -280,6 +283,27 @@ namespace NXWidgets void wakeupModalLoop(void); /** + * Take the geometry semaphore (handling signal interruptions) + */ + +#ifdef CONFIG_NX_MULTIUSER + void takeGeoSem(void); +#else + inline void takeGeoSem(void) {} +#endif + + /** + * Give the geometry semaphore + */ + + inline void giveGeoSem(void) + { +#ifdef CONFIG_NX_MULTIUSER + sem_post(&m_geosem); +#endif + } + + /** * Clear all mouse events */ @@ -553,7 +577,10 @@ namespace NXWidgets inline CRect getWindowBoundingBox(void) { - return CRect(&m_bounds); + takeGeoSem(); + CRect rect(&m_bounds); + giveGeoSem(); + return rect; } /** @@ -564,8 +591,10 @@ namespace NXWidgets inline bool getWindowPosition(FAR struct nxgl_point_s *pPos) { + takeGeoSem(); pPos->x = m_pos.x; pPos->x = m_pos.y; + giveGeoSem(); return true; } @@ -577,8 +606,10 @@ namespace NXWidgets inline bool getWindowSize(FAR struct nxgl_size_s *pSize) { + takeGeoSem(); pSize->h = m_size.h; pSize->w = m_size.w; + giveGeoSem(); return true; } diff --git a/NxWidgets/libnxwidgets/src/cimage.cxx b/NxWidgets/libnxwidgets/src/cimage.cxx index c905737fd..0ca6f571e 100644 --- a/NxWidgets/libnxwidgets/src/cimage.cxx +++ b/NxWidgets/libnxwidgets/src/cimage.cxx @@ -272,7 +272,7 @@ void CImage::drawContents(CGraphicsPort *port) } else { - port->drawBitmapGreyScale(rect.getX(),displayRow, + port->drawBitmapGreyScale(rect.getX(), displayRow, rect.getWidth(), 1, &bitmap, 0, 0); } diff --git a/NxWidgets/libnxwidgets/src/cwidgetcontrol.cxx b/NxWidgets/libnxwidgets/src/cwidgetcontrol.cxx index 5ea672a2f..a6807dad5 100644 --- a/NxWidgets/libnxwidgets/src/cwidgetcontrol.cxx +++ b/NxWidgets/libnxwidgets/src/cwidgetcontrol.cxx @@ -42,6 +42,7 @@ #include <stdint.h> #include <stdbool.h> #include <cstring> +#include <cerrno> #include "nxconfig.hxx" #include "cnxserver.hxx" @@ -427,6 +428,13 @@ void CWidgetControl::geometryEvent(NXHANDLE hWindow, m_hWindow = hWindow; nxgl_rectcopy(&m_bounds, bounds); + + // Wake up any threads waiting for initial position information. + // REVISIT: If the window is moved or repositioned, then the + // position and size data will be incorrect for a period of time. + // That case should be handled here as well. + + giveGeoSem(); } } @@ -865,6 +873,25 @@ bool CWidgetControl::pollCursorControlEvents(void) } /** + * Take the geometry semaphore (handling signal interruptions) + */ + +#ifdef CONFIG_NX_MULTIUSER +void CWidgetControl::takeGeoSem(void) +{ + // Take the geometry semaphore. Retry is an error occurs (only if + // the error is due to a signal interruption). + + int ret; + do + { + ret = sem_wait(&m_geosem); + } + while (ret < 0 && errno == EINTR); +} +#endif + +/** * Clear all mouse events */ diff --git a/NxWidgets/nxwm/src/cnxconsole.cxx b/NxWidgets/nxwm/src/cnxconsole.cxx index 5fe81d844..3652364c7 100644 --- a/NxWidgets/nxwm/src/cnxconsole.cxx +++ b/NxWidgets/nxwm/src/cnxconsole.cxx @@ -143,38 +143,6 @@ CNxConsole::~CNxConsole(void) } /** - * One time NSH initialization. This function must be called exactly - * once during the boot-up sequence to initialize the NSH library. - * - * @return True on successful initialization - */ - -bool nshlibInitialize(void) -{ - // Initialize the global data structure - - sem_init(&g_nxconvars.sem, 0, 0); - - // Initialize the NSH library - - nsh_initialize(); - - // If the Telnet console is selected as a front-end, then start the - // Telnet daemon. - -#ifdef CONFIG_NSH_TELNET - int ret = nsh_telnetstart(); - if (ret < 0) - { - // The daemon is NOT running! - - return false; - } -#endif - return true; -} - -/** * Each implementation of IApplication must provide a method to recover * the contained CApplicationWindow instance. */ @@ -442,5 +410,35 @@ void CNxConsole::close(void) m_taskbar->stopApplication(static_cast<IApplication*>(this)); } +/** + * One time NSH initialization. This function must be called exactly + * once during the boot-up sequence to initialize the NSH library. + * + * @return True on successful initialization + */ + +bool NxWM::nshlibInitialize(void) +{ + // Initialize the global data structure + + sem_init(&g_nxconvars.sem, 0, 0); + + // Initialize the NSH library + + nsh_initialize(); + + // If the Telnet console is selected as a front-end, then start the + // Telnet daemon. +#ifdef CONFIG_NSH_TELNET + int ret = nsh_telnetstart(); + if (ret < 0) + { + // The daemon is NOT running! + + return false; + } +#endif + return true; +} diff --git a/NxWidgets/nxwm/src/ctaskbar.cxx b/NxWidgets/nxwm/src/ctaskbar.cxx index faac2fa76..1dba90c5a 100644 --- a/NxWidgets/nxwm/src/ctaskbar.cxx +++ b/NxWidgets/nxwm/src/ctaskbar.cxx @@ -867,7 +867,7 @@ bool CTaskbar::redrawTaskbarWindow(void) { // Get the icon associated with this application - NXWidgets::CImage *image = m_slots.at(i).image; + NXWidgets::CImage *image = m_slots.at(i).image; // Disable drawing of the icon image; disable events from the icon @@ -962,6 +962,7 @@ bool CTaskbar::redrawBackgroundWindow(void) // Then re-draw the background image on the window + m_backImage->enableDrawing(); m_backImage->redraw(); return true; } @@ -982,7 +983,7 @@ bool CTaskbar::redrawApplicationWindow(void) { // No.. Search for that last, non-minimized application - for (int i = m_slots.size() - 1; i > 0; i--) + for (int i = m_slots.size() - 1; i >= 0; i--) { IApplication *candidate = m_slots.at(i).app; if (!candidate->isMinimized()) @@ -1002,6 +1003,10 @@ bool CTaskbar::redrawApplicationWindow(void) m_topapp = app; app->setTopApplication(true); + // Disable drawing of the background image. + + m_backImage->disableDrawing(); + // And.. Draw the application app->redraw(); @@ -1009,7 +1014,7 @@ bool CTaskbar::redrawApplicationWindow(void) } else { - // Otherwise, re-draw the background + // Otherwise, re-draw the background image m_topapp = (IApplication *)0; return redrawBackgroundWindow(); |