Disabled NXTK autoraise; it does not work properly in multi-user mode due to queue mouse/touchscreen input

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4732 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2012-05-13 23:40:23 +00:00
parent 776db19800
commit a8727040dd
6 changed files with 41 additions and 20 deletions

View File

@ -2750,3 +2750,11 @@
when if positional data is valid. When the touch is released, the X/Y position
of the release must be the same as the X/Y position of the last touch (se that
the release occurs in the same window as the last touch).
* graphics/nxtk/nxtk_events.c: Fix an error in mouse/touchscreen input logic:
Was autoraising the window AFTER processing the mouse press. This raises havoc
if the result of processing the mouse click was to raise some other window!
* graphics/nxtk/nxtk_events.c: I had to disable the whole autoraise feature
for multi-user case because it does not work correctly. In a scenario where (1) there
are multiple queued touchscreen events for the same window and (2) the result of the
first input was to switch windows, then the autoraise implementation will cause the
window to revert to the previous window. Not good behavior.

View File

@ -2,7 +2,7 @@
* graphics/nxbe/nxbe_lower.c
*
* Copyright (C) 2008-2009, 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* graphics/nxbe/nxbe_raise.c
*
* Copyright (C) 2008-2009, 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions

View File

@ -1,8 +1,8 @@
/****************************************************************************
* graphics/nxmu/nx_openwindow.c
*
* Copyright (C) 2008-2009, 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
* Copyright (C) 2008-2009, 2011-2012 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@ -39,11 +39,12 @@
#include <nuttx/config.h>
#include <stdlib.h>
#include <errno.h>
#include <debug.h>
#include <nuttx/nx/nx.h>
#include <nuttx/kmalloc.h>
#include "nxfe.h"
/****************************************************************************
@ -103,7 +104,7 @@ NXWINDOW nx_openwindow(NXHANDLE handle, FAR const struct nx_callback_s *cb,
/* Pre-allocate the window structure */
wnd = (FAR struct nxbe_window_s *)zalloc(sizeof(struct nxbe_window_s));
wnd = (FAR struct nxbe_window_s *)kzalloc(sizeof(struct nxbe_window_s));
if (!wnd)
{
errno = ENOMEM;

View File

@ -220,6 +220,28 @@ static void nxtk_mousein(NXWINDOW hwnd, FAR const struct nxgl_point_s *pos,
struct nxgl_point_s abspos;
struct nxgl_point_s relpos;
/* Raise the window to the top if any mouse button was pressed or if auto-raise
* is configured. Do this before reporting the mouse event (because processing
* of the mouse event could change the ordering again).
*/
/* REVISIT: This does not work correctly. In a scenario where (1) there are
* multiple queued touchscreen events and (2) the result of the first input
* was to switch windows, then this autoraise implementation will cause the
* window to revert to the previous window. Not good behavior.
*/
#ifndef CONFIG_NX_MULTIUSER /* Queuing only happens in multi-user mode */
#ifdef CONFIG_NXTK_AUTORAISE
if (fwnd->wnd.above != NULL)
#else
if (buttons != 0 && fwnd->wnd.above != NULL)
#endif
{
nx_raise((NXWINDOW)&fwnd->wnd);
}
#endif
/* When we get here, the mouse position that we receive has already been
* offset by the window origin. Here we need to detect mouse events in
* the various regions of the windows: The toolbar, the client window,
@ -248,17 +270,6 @@ static void nxtk_mousein(NXWINDOW hwnd, FAR const struct nxgl_point_s *pos,
nxgl_vectsubtract(&relpos, &abspos, &fwnd->tbrect.pt1);
fwnd->tbcb->mousein((NXTKWINDOW)fwnd, &relpos, buttons, fwnd->tbarg);
}
/* Raise the window to the top if any mouse button was pressed or if auto-raise
* is configured.
*/
#ifndef CONFIG_NXTK_AUTORAISE
if (buttons != 0)
#endif
{
nx_raise((NXWINDOW)&fwnd->wnd);
}
}
#endif

View File

@ -1,8 +1,8 @@
/****************************************************************************
* graphics/nxtk/nxtk_openwindow.c
*
* Copyright (C) 2008-2009 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
* Copyright (C) 2008-2009, 2012 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@ -44,6 +44,7 @@
#include <debug.h>
#include <nuttx/nx/nx.h>
#include <nuttx/kmalloc.h>
#include "nxfe.h"
#include "nxtk_internal.h"
@ -130,7 +131,7 @@ NXTKWINDOW nxtk_openwindow(NXHANDLE handle,
/* Pre-allocate the window structure */
fwnd = (FAR struct nxtk_framedwindow_s *)zalloc(sizeof(struct nxtk_framedwindow_s));
fwnd = (FAR struct nxtk_framedwindow_s *)kzalloc(sizeof(struct nxtk_framedwindow_s));
if (!fwnd)
{
errno = ENOMEM;