events.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:6k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: events.c 271 2005-08-09 08:31:35Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #include "../common/common.h"
  24. #include "../common/palmos/pace.h"
  25. #include "events.h"
  26. #define STACKSIZE 4
  27. typedef struct info
  28. {
  29. Boolean Override;
  30. int ReadPos;
  31. int WritePos;
  32. EventType Stack[STACKSIZE];
  33. Boolean PenDown;
  34. PointType PenPos;
  35. PointType PenStart;
  36. UInt16 PenObject;
  37. UInt32 KeyState;
  38. UInt32 BatteryTick;
  39. UInt32 BatteryInterval;
  40. } info;
  41. static info Info;
  42. static Err Push(info* p,const EventType* event)
  43. {
  44. int i = p->WritePos+1;
  45. if (i == STACKSIZE)
  46. i = 0;
  47. if (i == p->ReadPos)
  48. return evtErrQueueFull;
  49. memcpy(&p->Stack[p->WritePos],event,sizeof(EventType));
  50. p->WritePos = i;
  51. return errNone;
  52. }
  53. static bool_t CheckEvent(info* p)
  54. {
  55. EventType e;
  56. Boolean Down;
  57. PointType Pos;
  58. UInt32 KeyState;
  59. EvtGetPen(&Pos.x, &Pos.y, &Down);
  60. if (p->PenDown != Down)
  61. {
  62. p->PenPos = Pos;
  63. p->PenDown = Down;
  64. memset(&e,0,sizeof(e));
  65. e.penDown = Down;
  66. e.tapCount = 1;
  67. e.screenX = Pos.x;
  68. e.screenY = Pos.y;
  69. if (Down)
  70. {
  71. p->PenStart = Pos;
  72. e.eType = penDownEvent;
  73. }
  74. else
  75. {
  76. e.eType = penUpEvent;
  77. e.data.penUp.start = p->PenStart;
  78. e.data.penUp.end = Pos;
  79. }
  80. Push(p,&e);
  81. return 1;
  82. }
  83. else
  84. if (Down && (p->PenPos.x != Pos.x || p->PenPos.y != Pos.y))
  85. {
  86. p->PenPos = Pos;
  87. memset(&e,0,sizeof(e));
  88. e.eType = penMoveEvent;
  89. e.penDown = true;
  90. e.tapCount = 1;
  91. e.screenX = Pos.x;
  92. e.screenY = Pos.y;
  93. Push(p,&e);
  94. return 1;
  95. }
  96. KeyState = KeyCurrentState();
  97. if (KeyState != p->KeyState)
  98. {
  99. UInt32 Change = KeyState ^ p->KeyState;
  100. p->KeyState = KeyState;
  101. if ((Change & keyBitPower) && !(KeyState & keyBitPower))
  102. {
  103. DebugMessage("Battery manager override mode off");
  104. // turning off event override mode
  105. EvtOverride(0);
  106. }
  107. }
  108. return 0;
  109. }
  110. Boolean EvtGetOverride()
  111. {
  112. return Info.Override;
  113. }
  114. void EvtOverride(Boolean v)
  115. {
  116. EventType e;
  117. info* p = &Info;
  118. if (v != p->Override)
  119. {
  120. p->Override = v;
  121. if (v)
  122. {
  123. EvtGetPen(&p->PenPos.x, &p->PenPos.y, &p->PenDown);
  124. p->PenStart = p->PenPos;
  125. do
  126. {
  127. EvtGetEvent(&e,evtNoWait);
  128. if (e.eType == nilEvent)
  129. break;
  130. } while(Push(p,&e)==errNone);
  131. p->KeyState = KeyCurrentState();
  132. p->BatteryTick = TimGetTicks();
  133. p->BatteryInterval = SysTicksPerSecond();
  134. }
  135. else
  136. {
  137. // flush event queue
  138. EvtResetAutoOffTimer();
  139. do
  140. {
  141. EvtGetEvent(&e,evtNoWait);
  142. } while (e.eType != nilEvent);
  143. }
  144. }
  145. }
  146. void _EvtAddUniqueEventToQueue(const EventType *eventP, UInt32 id,Boolean inPlace)
  147. {
  148. int i;
  149. info* p = &Info;
  150. if (!p->Override)
  151. {
  152. EvtAddUniqueEventToQueue(eventP,id,inPlace);
  153. return;
  154. }
  155. i = p->ReadPos;
  156. while (i!=p->WritePos)
  157. {
  158. if (p->Stack[i].eType == eventP->eType)
  159. {
  160. memcpy(&p->Stack[i],eventP,sizeof(EventType));
  161. return;
  162. }
  163. if (++i == STACKSIZE)
  164. i = 0;
  165. }
  166. Push(&Info,eventP);
  167. }
  168. void _EvtGetEvent(EventType *event, Int32 timeout)
  169. {
  170. info* p = &Info;
  171. if (!p->Override)
  172. {
  173. EvtGetEvent(event,timeout);
  174. return;
  175. }
  176. for (;;)
  177. {
  178. while (CheckEvent(p));
  179. if (p->ReadPos != p->WritePos)
  180. {
  181. memcpy(event,&p->Stack[p->ReadPos],sizeof(EventType));
  182. if (++p->ReadPos == STACKSIZE)
  183. p->ReadPos = 0;
  184. break;
  185. }
  186. if (timeout==0)
  187. {
  188. memset(event,0,sizeof(EventType));
  189. event->eType = nilEvent;
  190. break;
  191. }
  192. SysTaskDelay(1);
  193. if (timeout>0)
  194. --timeout;
  195. }
  196. }
  197. Err _EvtEnqueueKey(WChar ascii, UInt16 keycode, UInt16 modifiers)
  198. {
  199. EventType event;
  200. if (!Info.Override)
  201. return EvtEnqueueKey(ascii, keycode, modifiers);
  202. memset(&event,0,sizeof(event));
  203. event.eType = keyDownEvent;
  204. event.data.keyDown.chr = keycode;
  205. event.data.keyDown.modifiers = modifiers;
  206. return Push(&Info,&event);
  207. }
  208. Boolean _EvtEventAvail()
  209. {
  210. if (!Info.Override)
  211. return (Boolean)(EvtEventAvail() || EvtSysEventAvail(1));
  212. return 1;
  213. }
  214. void _FrmPopupForm(UInt16 formId)
  215. {
  216. if (!Info.Override)
  217. FrmPopupForm(formId);
  218. }
  219. static UInt16 FindObject(FormType* Form,Coord x,Coord y)
  220. {
  221. UInt16 n,Count = FrmGetNumberOfObjects(Form);
  222. RectangleType Rect;
  223. for (n=0;n<Count;++n)
  224. {
  225. FrmGetObjectBounds(Form,n,&Rect);
  226. if (Rect.topLeft.x <= x &&
  227. Rect.topLeft.y <= y &&
  228. Rect.topLeft.x + Rect.extent.x > x &&
  229. Rect.topLeft.y + Rect.extent.y > y)
  230. return FrmGetObjectId(Form,n);
  231. }
  232. return 0;
  233. }
  234. Boolean OSHandleEvent(EventPtr eventP)
  235. {
  236. if (!Info.Override)
  237. {
  238. Err err;
  239. if (SysHandleEvent(eventP))
  240. return 1;
  241. if (MenuHandleEvent(0,eventP,&err))
  242. return 1;
  243. return FrmDispatchEvent(eventP);
  244. }
  245. else
  246. {
  247. info* p = &Info;
  248. FormType* Form = FrmGetActiveForm();
  249. FormEventHandlerType* Handler = FrmGetEventHandler(Form);
  250. if (Handler && Handler(eventP))
  251. return 1;
  252. if (eventP->eType == penDownEvent)
  253. p->PenObject = FindObject(Form,eventP->screenX,eventP->screenY);
  254. if (eventP->eType == penUpEvent && p->PenObject && FindObject(Form,eventP->screenX,eventP->screenY)==p->PenObject)
  255. {
  256. FormObjectKind Kind = FrmGetObjectType(Form,FrmGetObjectIndex(Form,p->PenObject));
  257. if (Kind == frmControlObj)
  258. {
  259. EventType e;
  260. memset(&e,0,sizeof(e));
  261. e.eType = ctlSelectEvent;
  262. e.data.ctlSelect.controlID = p->PenObject;
  263. Push(p,&e);
  264. }
  265. }
  266. return 0;
  267. }
  268. }