summaryrefslogtreecommitdiff
path: root/nuttx/graphics/nxmu/nxmu_mouse.c
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-11-16 16:49:21 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-11-16 16:49:21 +0000
commitdbda56e617cfde1910ecf6091a76038f44dff65d (patch)
tree2d8f43731bee5df1d21b090dfa3f4fec008cb16e /nuttx/graphics/nxmu/nxmu_mouse.c
parentc96506f914b598e59fce7cc9b3c394a5ebe8d23c (diff)
downloadpx4-nuttx-dbda56e617cfde1910ecf6091a76038f44dff65d.tar.gz
px4-nuttx-dbda56e617cfde1910ecf6091a76038f44dff65d.tar.bz2
px4-nuttx-dbda56e617cfde1910ecf6091a76038f44dff65d.zip
Patches 4-6 from Petteri Aimonen
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5364 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/graphics/nxmu/nxmu_mouse.c')
-rw-r--r--nuttx/graphics/nxmu/nxmu_mouse.c44
1 files changed, 32 insertions, 12 deletions
diff --git a/nuttx/graphics/nxmu/nxmu_mouse.c b/nuttx/graphics/nxmu/nxmu_mouse.c
index 3ebe062d2..93441cc01 100644
--- a/nuttx/graphics/nxmu/nxmu_mouse.c
+++ b/nuttx/graphics/nxmu/nxmu_mouse.c
@@ -61,9 +61,10 @@
* Private Data
****************************************************************************/
-static struct nxgl_point_s g_mpos;
-static struct nxgl_point_s g_mrange;
-static uint8_t g_mbutton;
+static struct nxgl_point_s g_mpos;
+static struct nxgl_point_s g_mrange;
+static uint8_t g_mbutton;
+static struct nxbe_window_s *g_mwnd;
/****************************************************************************
* Public Data
@@ -154,6 +155,7 @@ int nxmu_mousein(FAR struct nxfe_state_s *fe,
struct nxbe_window_s *wnd;
nxgl_coord_t x = pos->x;
nxgl_coord_t y = pos->y;
+ uint8_t oldbuttons;
int ret;
/* 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 */
- g_mpos.x = x;
- g_mpos.y = y;
- g_mbutton = buttons;
+ oldbuttons = g_mbutton;
+ g_mpos.x = x;
+ g_mpos.y = y;
+ g_mbutton = buttons;
- /* 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
+ /* If a button is already down, regard this as part of a mouse drag
+ * event. Pass all the following events to the window where the drag
+ * 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)
{
- /* The background window normally has no callback structure
- * (unless a client has taken control of the background via
- * nx_requestbkgd()).
+ /* The background window normally has no callback structure (unless
+ * a client has taken control of the background via nx_requestbkgd()).
*/
if (wnd->cb)
@@ -207,6 +225,8 @@ int nxmu_mousein(FAR struct nxfe_state_s *fe,
}
}
}
+
+ g_mwnd = wnd;
}
return OK;