WMTouch.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:4k
源码类别:

uCOS

开发平台:

C/C++

  1. /*
  2. *********************************************************************************************************
  3. *                                                uC/GUI
  4. *                        Universal graphic software for embedded applications
  5. *
  6. *                       (c) Copyright 2002, Micrium Inc., Weston, FL
  7. *                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
  8. *
  9. *              礐/GUI is protected by international copyright laws. Knowledge of the
  10. *              source code may not be used to write a similar product. This file may
  11. *              only be used in accordance with a license and should not be redistributed
  12. *              in any way. We appreciate your understanding and fairness.
  13. *
  14. ----------------------------------------------------------------------
  15. File        : WMTouch.c
  16. Purpose     : Windows manager, touch support
  17. ----------------------------------------------------------------------
  18. */
  19. #include <stddef.h>           /* needed for definition of NULL */
  20. #include "WM_Intern.H"
  21. #include "GUIDebug.h"
  22. #if (GUI_WINSUPPORT & (GUI_SUPPORT_TOUCH | GUI_SUPPORT_MOUSE))
  23. /****************************************************************
  24. *
  25. *          static data
  26. *
  27. *****************************************************************
  28. */
  29. static WM_HWIN _hWinLast;
  30. /****************************************************************
  31. *
  32. *          Static code
  33. *
  34. *****************************************************************
  35. */
  36. void _cbDeleteWindow(WM_HWIN hWin) {
  37.   if (hWin == _hWinLast) {
  38.     _hWinLast = 0;
  39.   }
  40. }
  41. /****************************************************************
  42. *
  43. *       Public code
  44. *
  45. *****************************************************************
  46. */
  47. /****************************************************************
  48. *
  49. *       WM_HandleHID       
  50. *
  51. * Polls the touch screen. If something has changed,
  52. * sends a message to the concerned window.
  53. *
  54. * Return value:
  55. *   0 if nothing has been done
  56. *   1 if touch message has been sent
  57. */
  58. int WM_HandleHID(void) {
  59.   int r = 0;
  60.   static GUI_TOUCH_tState StateLast;
  61.   GUI_HID_STATE State;
  62.   GUI_HID_GetState(&State);
  63.   WM_LOCK();
  64.   WM__pfDeleteWindowHook = _cbDeleteWindow;   /* TBD in the future... Hook function management in order to allow multiple hook functions */
  65.   #if GUI_SUPPORT_CURSOR
  66.     GUI_CURSOR_SetPosition(State.x, State.y);
  67.   #endif
  68.   if (StateLast.Pressed | State.Pressed) {
  69.     if (   (StateLast.x != State.x)
  70.         || (StateLast.y != State.y)
  71.         || ((StateLast.Pressed ? 1:0) != (State.Pressed ? 1:0)))
  72.     {
  73.       WM_MESSAGE Msg;
  74.       WM_HWIN hWin;
  75.       StateLast = State;             /* Remember current values */
  76.       r = 1;
  77.       Msg.MsgId = WM_TOUCH;
  78.       Msg.Data.p = (void*)&State;
  79.       if (WM__hCapture == 0) {
  80.         hWin = WM_Screen2hWin(State.x, State.y);
  81.       } else {
  82.         hWin = WM__hCapture;
  83.       }
  84.       /* Tell window if it is no longer pressed */
  85.       if (_hWinLast != hWin) {
  86.         if (_hWinLast != 0) {
  87.           if (State.Pressed) {
  88.             Msg.Data.p = NULL;    /* no longer in this window */
  89.           } else {     /* "Clicked" in this window */
  90.             StateLast.Pressed =0;
  91.             Msg.Data.p = (void*)&StateLast;
  92.           }
  93.           GUI_DEBUG_LOG1 ("nSending WM_Touch to LastWindow %d (out of area)", _hWinLast);
  94.           WM_SendMessage(_hWinLast, &Msg);
  95.           _hWinLast = 0;
  96.         }
  97.       }
  98.       if (hWin) {           /* Sending WM_Touch to Window */
  99.         /* convert screen into window coordinates */
  100.         WM_Obj* pWin = WM_H2P(hWin);
  101.         State.x -= pWin->Rect.x0;
  102.         State.y -= pWin->Rect.y0;
  103.         WM_SendMessage(hWin, &Msg);
  104.         /* Remember window */
  105.         if (State.Pressed) {
  106.           _hWinLast = hWin;
  107.         } else {
  108.           /* Handle automatic captue release */
  109.           if (WM__CaptureReleaseAuto) {
  110.             WM_ReleaseCapture();
  111.           }
  112.           _hWinLast = 0;
  113.         }
  114.       }
  115.     }
  116.   }
  117.   WM_UNLOCK();
  118.   return r;
  119. }
  120. #else
  121. void WM_Touch_c(void) {} /* avoid empty object files */
  122. #endif  /* (GUI_WINSUPPORT & GUI_SUPPORT_TOUCH) */