Patches 4-6 from Petteri Aimonen
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5364 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
parent
35e380ac6d
commit
39ce8b1fab
@ -3635,4 +3635,10 @@
|
|||||||
* Config.mk: Defined DELIM to be either / or \, depending upon
|
* Config.mk: Defined DELIM to be either / or \, depending upon
|
||||||
CONFIG_WINDOWS_NATIVE. This will allow me to eliminate a lot of
|
CONFIG_WINDOWS_NATIVE. This will allow me to eliminate a lot of
|
||||||
conditional logic elsewhere.
|
conditional logic elsewhere.
|
||||||
|
* nuttx/graphics: One a mouse button is pressed, continue to report all
|
||||||
|
mouse button events to the first window that received the the initial
|
||||||
|
button down event, even if the mouse attempts to dray outside the
|
||||||
|
window. From Petteri Aimonen.
|
||||||
|
* nuttx/graphics/nxmu/nx_block.c: One more fixe to the NX block message
|
||||||
|
logic from Petteri Aimonen.
|
||||||
|
|
||||||
|
@ -140,7 +140,7 @@ int nx_block(NXWINDOW hwnd, FAR void *arg)
|
|||||||
* that it will not be blocked.
|
* that it will not be blocked.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ret = nxmu_sendserver(wnd->conn, &outmsg, sizeof(struct nxbe_window_s));
|
ret = nxmu_sendserver(wnd->conn, &outmsg, sizeof(struct nxsvrmsg_blocked_s));
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -61,9 +61,10 @@
|
|||||||
* Private Data
|
* Private Data
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static struct nxgl_point_s g_mpos;
|
static struct nxgl_point_s g_mpos;
|
||||||
static struct nxgl_point_s g_mrange;
|
static struct nxgl_point_s g_mrange;
|
||||||
static uint8_t g_mbutton;
|
static uint8_t g_mbutton;
|
||||||
|
static struct nxbe_window_s *g_mwnd;
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Data
|
* Public Data
|
||||||
@ -154,6 +155,7 @@ int nxmu_mousein(FAR struct nxfe_state_s *fe,
|
|||||||
struct nxbe_window_s *wnd;
|
struct nxbe_window_s *wnd;
|
||||||
nxgl_coord_t x = pos->x;
|
nxgl_coord_t x = pos->x;
|
||||||
nxgl_coord_t y = pos->y;
|
nxgl_coord_t y = pos->y;
|
||||||
|
uint8_t oldbuttons;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Clip x and y to within the bounding rectangle */
|
/* Clip x and y to within the bounding rectangle */
|
||||||
@ -182,20 +184,36 @@ int nxmu_mousein(FAR struct nxfe_state_s *fe,
|
|||||||
{
|
{
|
||||||
/* Update the mouse value */
|
/* Update the mouse value */
|
||||||
|
|
||||||
g_mpos.x = x;
|
oldbuttons = g_mbutton;
|
||||||
g_mpos.y = y;
|
g_mpos.x = x;
|
||||||
g_mbutton = buttons;
|
g_mpos.y = y;
|
||||||
|
g_mbutton = buttons;
|
||||||
|
|
||||||
/* Pick the window to receive the mouse event. Start with
|
/* If a button is already down, regard this as part of a mouse drag
|
||||||
* the top window and go down. Stop with the first window
|
* event. Pass all the following events to the window where the drag
|
||||||
* that gets the mouse report
|
* started in.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (oldbuttons && g_mwnd && g_mwnd->cb->mousein)
|
||||||
|
{
|
||||||
|
struct nxclimsg_mousein_s outmsg;
|
||||||
|
outmsg.msgid = NX_CLIMSG_MOUSEIN;
|
||||||
|
outmsg.wnd = g_mwnd;
|
||||||
|
outmsg.buttons = g_mbutton;
|
||||||
|
nxgl_vectsubtract(&outmsg.pos, &g_mpos, &g_mwnd->bounds.pt1);
|
||||||
|
|
||||||
|
return nxmu_sendclient(g_mwnd->conn, &outmsg, sizeof(struct nxclimsg_mousein_s));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Pick the window to receive the mouse event. Start with the top
|
||||||
|
* window and go down. Stop with the first window that gets the mouse
|
||||||
|
* report
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (wnd = fe->be.topwnd; wnd; wnd = wnd->below)
|
for (wnd = fe->be.topwnd; wnd; wnd = wnd->below)
|
||||||
{
|
{
|
||||||
/* The background window normally has no callback structure
|
/* The background window normally has no callback structure (unless
|
||||||
* (unless a client has taken control of the background via
|
* a client has taken control of the background via nx_requestbkgd()).
|
||||||
* nx_requestbkgd()).
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (wnd->cb)
|
if (wnd->cb)
|
||||||
@ -207,6 +225,8 @@ int nxmu_mousein(FAR struct nxfe_state_s *fe,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_mwnd = wnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
|
@ -62,9 +62,10 @@
|
|||||||
* Private Data
|
* Private Data
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static struct nxgl_point_s g_mpos;
|
static struct nxgl_point_s g_mpos;
|
||||||
static struct nxgl_point_s g_mrange;
|
static struct nxgl_point_s g_mrange;
|
||||||
static uint8_t g_mbutton;
|
static uint8_t g_mbutton;
|
||||||
|
static struct nxbe_window_s *g_mwnd;
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Data
|
* Public Data
|
||||||
@ -148,6 +149,7 @@ int nx_mousein(NXHANDLE handle, nxgl_coord_t x, nxgl_coord_t y, uint8_t buttons)
|
|||||||
{
|
{
|
||||||
FAR struct nxfe_state_s *fe = (FAR struct nxfe_state_s *)handle;
|
FAR struct nxfe_state_s *fe = (FAR struct nxfe_state_s *)handle;
|
||||||
struct nxbe_window_s *wnd;
|
struct nxbe_window_s *wnd;
|
||||||
|
uint8_t oldbuttons;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Clip x and y to within the bounding rectangle */
|
/* Clip x and y to within the bounding rectangle */
|
||||||
@ -176,13 +178,27 @@ int nx_mousein(NXHANDLE handle, nxgl_coord_t x, nxgl_coord_t y, uint8_t buttons)
|
|||||||
{
|
{
|
||||||
/* Update the mouse value */
|
/* Update the mouse value */
|
||||||
|
|
||||||
|
oldbuttons = g_mbutton;
|
||||||
g_mpos.x = x;
|
g_mpos.x = x;
|
||||||
g_mpos.y = y;
|
g_mpos.y = y;
|
||||||
g_mbutton = buttons;
|
g_mbutton = buttons;
|
||||||
|
|
||||||
/* Pick the window to receive the mouse event. Start with
|
/* If a button is already down, regard this as part of a mouse drag
|
||||||
* the top window and go down. Step with the first window
|
* event. Pass all the following events to the window where the drag
|
||||||
* that gets the mouse report
|
* started in.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (oldbuttons && g_mwnd && g_mwnd->cb->mousein)
|
||||||
|
{
|
||||||
|
struct nxgl_point_s relpos;
|
||||||
|
nxgl_vectsubtract(&relpos, &g_mpos, &g_mwnd->bounds.pt1);
|
||||||
|
g_mwnd->cb->mousein((NXWINDOW)g_mwnd, &relpos, g_mbutton, g_mwnd->arg);
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Pick the window to receive the mouse event. Start with the top
|
||||||
|
* window and go down. Step with the first window that gets the mouse
|
||||||
|
* report
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (wnd = fe->be.topwnd; wnd; wnd = wnd->below)
|
for (wnd = fe->be.topwnd; wnd; wnd = wnd->below)
|
||||||
@ -193,6 +209,8 @@ int nx_mousein(NXHANDLE handle, nxgl_coord_t x, nxgl_coord_t y, uint8_t buttons)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_mwnd = wnd;
|
||||||
}
|
}
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
@ -261,9 +261,20 @@ static void nxtk_mousein(NXWINDOW hwnd, FAR const struct nxgl_point_s *pos,
|
|||||||
|
|
||||||
nxgl_vectoradd(&abspos, pos, &fwnd->wnd.bounds.pt1);
|
nxgl_vectoradd(&abspos, pos, &fwnd->wnd.bounds.pt1);
|
||||||
|
|
||||||
|
/* In order to deliver mouse release events to the same window where the
|
||||||
|
* mouse down event happened, we store the initial mouse down location.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (fwnd->mbutton == 0 && buttons != 0)
|
||||||
|
{
|
||||||
|
fwnd->mpos = abspos;
|
||||||
|
}
|
||||||
|
|
||||||
|
fwnd->mbutton = buttons;
|
||||||
|
|
||||||
/* Is the mouse position inside of the client window region? */
|
/* Is the mouse position inside of the client window region? */
|
||||||
|
|
||||||
if (fwnd->fwcb->mousein && nxgl_rectinside(&fwnd->fwrect, &abspos))
|
if (fwnd->fwcb->mousein && nxgl_rectinside(&fwnd->fwrect, &fwnd->mpos))
|
||||||
{
|
{
|
||||||
nxgl_vectsubtract(&relpos, &abspos, &fwnd->fwrect.pt1);
|
nxgl_vectsubtract(&relpos, &abspos, &fwnd->fwrect.pt1);
|
||||||
fwnd->fwcb->mousein((NXTKWINDOW)fwnd, &relpos, buttons, fwnd->fwarg);
|
fwnd->fwcb->mousein((NXTKWINDOW)fwnd, &relpos, buttons, fwnd->fwarg);
|
||||||
@ -271,7 +282,7 @@ static void nxtk_mousein(NXWINDOW hwnd, FAR const struct nxgl_point_s *pos,
|
|||||||
|
|
||||||
/* If the mouse position inside the toobar region? */
|
/* If the mouse position inside the toobar region? */
|
||||||
|
|
||||||
else if (fwnd->tbcb->mousein && nxgl_rectinside(&fwnd->tbrect, &abspos))
|
else if (fwnd->tbcb->mousein && nxgl_rectinside(&fwnd->tbrect, &fwnd->mpos))
|
||||||
{
|
{
|
||||||
nxgl_vectsubtract(&relpos, &abspos, &fwnd->tbrect.pt1);
|
nxgl_vectsubtract(&relpos, &abspos, &fwnd->tbrect.pt1);
|
||||||
fwnd->tbcb->mousein((NXTKWINDOW)fwnd, &relpos, buttons, fwnd->tbarg);
|
fwnd->tbcb->mousein((NXTKWINDOW)fwnd, &relpos, buttons, fwnd->tbarg);
|
||||||
|
@ -72,6 +72,11 @@ struct nxtk_framedwindow_s
|
|||||||
struct nxgl_rect_s fwrect;
|
struct nxgl_rect_s fwrect;
|
||||||
FAR const struct nx_callback_s *fwcb;
|
FAR const struct nx_callback_s *fwcb;
|
||||||
FAR void *fwarg;
|
FAR void *fwarg;
|
||||||
|
|
||||||
|
/* Initial mouse down location */
|
||||||
|
|
||||||
|
uint8_t mbutton;
|
||||||
|
struct nxgl_point_s mpos;
|
||||||
};
|
};
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
Loading…
Reference in New Issue
Block a user