mirror of
https://github.com/apache/nuttx-apps.git
synced 2025-07-17 19:51:03 +08:00
Most fixes to get NxWM working on the STM3240G-EVAL
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4710 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
parent
4e9d0ebfea
commit
fb682a72fb
@ -230,6 +230,16 @@ int MAIN_NAME(int argc, char *argv[])
|
|||||||
|
|
||||||
initMemoryUsage();
|
initMemoryUsage();
|
||||||
|
|
||||||
|
// 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");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
showTestCaseMemory("After initializing the NSH library");
|
||||||
|
|
||||||
// Create an instance of the Task Bar.
|
// Create an instance of the Task Bar.
|
||||||
//
|
//
|
||||||
// The general sequence for initializing the task bar is:
|
// The general sequence for initializing the task bar is:
|
||||||
@ -316,18 +326,6 @@ int MAIN_NAME(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
showTestCaseMemory("After create the start window application");
|
showTestCaseMemory("After create the start window application");
|
||||||
|
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
showTestCaseMemory("After initializing the NSH library");
|
|
||||||
|
|
||||||
// Add the NxConsole application to the start window
|
// Add the NxConsole application to the start window
|
||||||
|
|
||||||
NxWM::CNxConsole *console = (NxWM::CNxConsole *)0; // Avoid compiler complaint
|
NxWM::CNxConsole *console = (NxWM::CNxConsole *)0; // Avoid compiler complaint
|
||||||
|
@ -609,7 +609,7 @@ namespace NXWidgets
|
|||||||
{
|
{
|
||||||
waitGeoData();
|
waitGeoData();
|
||||||
pos->x = m_pos.x;
|
pos->x = m_pos.x;
|
||||||
pos->x = m_pos.y;
|
pos->y = m_pos.y;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -654,19 +654,6 @@ namespace NXWidgets
|
|||||||
return m_size.h;
|
return m_size.h;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the size of the window. This is normally reported by an NX callback. But
|
|
||||||
* the toolbar widget control does not get NX callbacks and has to get the
|
|
||||||
* window size throught this method. This method should not be called by user
|
|
||||||
* code
|
|
||||||
*
|
|
||||||
* @param hWindow The window handle that should be used to communicate
|
|
||||||
* with the window
|
|
||||||
* @param bounds. The size of the underlying window.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void setWindowBounds(NXHANDLE hWindow, FAR const struct nxgl_rect_s *bounds);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The creation sequence is:
|
* The creation sequence is:
|
||||||
*
|
*
|
||||||
|
@ -41,6 +41,7 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <sched.h>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
#include "cwidgetcontrol.hxx"
|
#include "cwidgetcontrol.hxx"
|
||||||
@ -149,11 +150,12 @@ CNxToolbar *CNxTkWindow::openToolbar(nxgl_coord_t height)
|
|||||||
CWidgetStyle style;
|
CWidgetStyle style;
|
||||||
m_widgetControl->getWidgetStyle(&style);
|
m_widgetControl->getWidgetStyle(&style);
|
||||||
|
|
||||||
// Set the background color to the color of the toolbar
|
// Set the background color(s) to the color of the toolbar
|
||||||
|
|
||||||
style.colors.background = CONFIG_NXTK_BORDERCOLOR1;
|
style.colors.background = CONFIG_NXTK_BORDERCOLOR1;
|
||||||
|
style.colors.selectedBackground = CONFIG_NXTK_BORDERCOLOR1;
|
||||||
|
|
||||||
// Create a new controlling widget for the window
|
// Create a new controlling widget for the window using these colors
|
||||||
|
|
||||||
CWidgetControl *widgetControl = new CWidgetControl(&style);
|
CWidgetControl *widgetControl = new CWidgetControl(&style);
|
||||||
|
|
||||||
@ -179,11 +181,46 @@ CNxToolbar *CNxTkWindow::openToolbar(nxgl_coord_t height)
|
|||||||
return (CNxToolbar *)0;
|
return (CNxToolbar *)0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Provide parent widget control information to new widget control instance
|
// Provide parent widget control information to new widget control instance.
|
||||||
|
// This information is reported by an NX callback for "normal" windows. But
|
||||||
|
// the toolbar widget control does not get NX callbacks and has to get the
|
||||||
|
// window size through the setWindowBounds method.
|
||||||
|
|
||||||
struct nxgl_rect_s bounds;
|
// Disable preemption so that we can be assured that all of the following
|
||||||
m_widgetControl->getWindowBoundingBox(&bounds);
|
// values are synchronized.
|
||||||
widgetControl->setWindowBounds(m_widgetControl->getWindowHandle(), &bounds);
|
|
||||||
|
sched_lock();
|
||||||
|
|
||||||
|
// Get the physical bounding box of the window in display coordinates
|
||||||
|
|
||||||
|
struct nxgl_rect_s windowBounds;
|
||||||
|
m_widgetControl->getWindowBoundingBox(&windowBounds);
|
||||||
|
|
||||||
|
// Get the position of the parent window in display coordinates
|
||||||
|
|
||||||
|
struct nxgl_point_s windowPos;
|
||||||
|
m_widgetControl->getWindowPosition(&windowPos);
|
||||||
|
|
||||||
|
// Get the bounding box of the toolbar in parent window coordinates
|
||||||
|
|
||||||
|
struct nxgl_rect_s toolbarBounds;
|
||||||
|
nxtk_toolbarbounds(m_hNxTkWindow, &toolbarBounds);
|
||||||
|
|
||||||
|
// Get the toolbar size
|
||||||
|
|
||||||
|
struct nxgl_size_s toolbarSize;
|
||||||
|
nxgl_rectsize(&toolbarSize, &toolbarBounds);
|
||||||
|
|
||||||
|
// Get the toolbar position in display coordinates by adding the window position
|
||||||
|
|
||||||
|
struct nxgl_point_s toolbarPos;
|
||||||
|
nxgl_vectoradd(&toolbarPos, &toolbarBounds.pt1, &windowPos);
|
||||||
|
|
||||||
|
// Perform the fake NX callback
|
||||||
|
|
||||||
|
widgetControl->geometryEvent(m_hNxTkWindow, &toolbarSize,
|
||||||
|
&toolbarPos, &windowBounds);
|
||||||
|
sched_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_toolbar;
|
return m_toolbar;
|
||||||
|
@ -42,6 +42,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
#include <sched.h>
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
|
|
||||||
#include "nxconfig.hxx"
|
#include "nxconfig.hxx"
|
||||||
@ -396,41 +397,6 @@ void CWidgetControl::setFocusedWidget(CNxWidget *widget)
|
|||||||
|
|
||||||
widget->focus();
|
widget->focus();
|
||||||
}
|
}
|
||||||
#warning "Widgets with focus need to go on a stack so that focus can be restored"
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the size of the window. This is normally reported by an NX callback. But
|
|
||||||
* the toolbar widget control does not get NX callbacks and has to get the
|
|
||||||
* window size throught this method. This method should not be called by user
|
|
||||||
* code
|
|
||||||
*
|
|
||||||
* @param hWindow The window handle that should be used to communicate
|
|
||||||
* with the window
|
|
||||||
* @param bounds. The size of the underlying window.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void CWidgetControl::setWindowBounds(NXHANDLE hWindow, FAR const struct nxgl_rect_s *bounds)
|
|
||||||
{
|
|
||||||
// The first callback is important. This is the handshake that proves
|
|
||||||
// that we are truly communicating with the servier. This is also
|
|
||||||
// a critical point because this is when we know the physical
|
|
||||||
// dimensions of the underlying window.
|
|
||||||
|
|
||||||
if (!m_hWindow)
|
|
||||||
{
|
|
||||||
// Save one-time server specific information
|
|
||||||
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -451,13 +417,38 @@ void CWidgetControl::geometryEvent(NXHANDLE hWindow,
|
|||||||
FAR const struct nxgl_point_s *pos,
|
FAR const struct nxgl_point_s *pos,
|
||||||
FAR const struct nxgl_rect_s *bounds)
|
FAR const struct nxgl_rect_s *bounds)
|
||||||
{
|
{
|
||||||
|
// Disable pre-emption so that we can be assured that the following
|
||||||
|
// operations are atomic
|
||||||
|
|
||||||
|
sched_lock();
|
||||||
|
|
||||||
// Save positional data that may change dynamically
|
// Save positional data that may change dynamically
|
||||||
|
|
||||||
m_pos.x = pos->x;
|
m_pos.x = pos->x;
|
||||||
m_pos.y = pos->y;
|
m_pos.y = pos->y;
|
||||||
m_size.h = size->h;
|
m_size.h = size->h;
|
||||||
m_size.w = size->w;
|
m_size.w = size->w;
|
||||||
setWindowBounds(hWindow, bounds);
|
|
||||||
|
// The first callback is important. This is the handshake that proves
|
||||||
|
// that we are truly communicating with the servier. This is also
|
||||||
|
// a critical point because this is when we know the physical
|
||||||
|
// dimensions of the underlying window.
|
||||||
|
|
||||||
|
if (!m_hWindow)
|
||||||
|
{
|
||||||
|
// Save one-time server specific information
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
sched_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -169,7 +169,7 @@ bool CApplicationWindow::open(void)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the CWidgetControl associated with this window
|
// Get the CWidgetControl associated with the toolbar
|
||||||
|
|
||||||
NXWidgets::CWidgetControl *control = m_toolbar->getWidgetControl();
|
NXWidgets::CWidgetControl *control = m_toolbar->getWidgetControl();
|
||||||
if (!control)
|
if (!control)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user