/src/backend/ucosii/ftk_source_input.c

http://ftk.googlecode.com/ · C · 269 lines · 205 code · 35 blank · 29 comment · 16 complexity · a6dafb8dd6f2afb3aa42c6061a77461f MD5 · raw file

  1. /*
  2. * File: ftk_source_input.c
  3. * Author: Li XianJing <xianjimli@hotmail.com>
  4. * Brief: source to handle /dev/input/xx
  5. *
  6. * Copyright (c) 2009 - 2010 Li XianJing <xianjimli@hotmail.com>
  7. *
  8. * Licensed under the Academic Free License version 2.1
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation; either version 2 of the License, or
  13. * (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with this program; if not, write to the Free Software
  22. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  23. */
  24. /*
  25. * History:
  26. * ================================================================
  27. * 2009-10-03 Li XianJing <xianjimli@hotmail.com> created
  28. *
  29. */
  30. #include "ftk_log.h"
  31. #include "ftk_key.h"
  32. #include "ftk_display.h"
  33. #include "ftk_source_input.h"
  34. #include "ftk_pipe.h"
  35. #include "ftk_wnd_manager.h"
  36. typedef struct _PrivInfo
  37. {
  38. int x;
  39. int y;
  40. FtkPipe *pipe;
  41. FtkEvent event;
  42. FtkOnEvent on_event;
  43. void* user_data;
  44. }PrivInfo;
  45. static FtkPipe *s_pipe = NULL;
  46. static int s_key_map[0xff] = {0};
  47. static void ftk_keymap_init(void)
  48. {
  49. s_key_map[0xBD] = FTK_KEY_MINUS;
  50. s_key_map[0x20] = FTK_KEY_SPACE;
  51. s_key_map[0xBB] = FTK_KEY_EQUAL;
  52. s_key_map[0x08] = FTK_KEY_BACKSPACE;
  53. s_key_map[0x09] = FTK_KEY_TAB;
  54. s_key_map[0xC0] = FTK_KEY_QUOTELEFT;
  55. s_key_map[0xDE] = FTK_KEY_QUOTERIGHT;
  56. s_key_map[0xDB] = FTK_KEY_BRACKETLEFT;
  57. s_key_map[0xDD] = FTK_KEY_BRACKETRIGHT;
  58. s_key_map[0x0d] = FTK_KEY_ENTER;
  59. s_key_map[0xBA] = FTK_KEY_SEMICOLON;
  60. s_key_map[0x30] = FTK_KEY_0;
  61. s_key_map[0x31] = FTK_KEY_1;
  62. s_key_map[0x32] = FTK_KEY_2;
  63. s_key_map[0x33] = FTK_KEY_3;
  64. s_key_map[0x34] = FTK_KEY_4;
  65. s_key_map[0x35] = FTK_KEY_5;
  66. s_key_map[0x36] = FTK_KEY_6;
  67. s_key_map[0x37] = FTK_KEY_7;
  68. s_key_map[0x38] = FTK_KEY_8;
  69. s_key_map[0x39] = FTK_KEY_9;
  70. s_key_map[0x70] = FTK_KEY_F1;
  71. s_key_map[0x71] = FTK_KEY_F2;
  72. s_key_map[0x72] = FTK_KEY_F3;
  73. s_key_map[0x73] = FTK_KEY_F4;
  74. s_key_map[0x74] = FTK_KEY_F5;
  75. s_key_map[0x75] = FTK_KEY_F6;
  76. s_key_map[0x76] = FTK_KEY_F7;
  77. s_key_map[0x77] = FTK_KEY_F8;
  78. s_key_map[0x78] = FTK_KEY_F9;
  79. s_key_map[0xBC] = FTK_KEY_COMMA;
  80. s_key_map[0xBE] = FTK_KEY_DOT;
  81. s_key_map[0xBF] = FTK_KEY_SLASH;
  82. s_key_map[0x10] = FTK_KEY_RIGHTSHIFT;
  83. s_key_map[0x11] = FTK_KEY_LEFTCTRL;
  84. s_key_map[0x14] = FTK_KEY_CAPSLOCK;
  85. s_key_map[0x40] = FTK_KEY_LEFTALT;
  86. s_key_map[0x41] = FTK_KEY_a;
  87. s_key_map[0x42] = FTK_KEY_b;
  88. s_key_map[0x43] = FTK_KEY_c;
  89. s_key_map[0x44] = FTK_KEY_d;
  90. s_key_map[0x45] = FTK_KEY_e;
  91. s_key_map[0x46] = FTK_KEY_f;
  92. s_key_map[0x47] = FTK_KEY_g;
  93. s_key_map[0x48] = FTK_KEY_h;
  94. s_key_map[0x49] = FTK_KEY_i;
  95. s_key_map[0x4a] = FTK_KEY_j;
  96. s_key_map[0x4b] = FTK_KEY_k;
  97. s_key_map[0x4c] = FTK_KEY_l;
  98. s_key_map[0x4d] = FTK_KEY_m;
  99. s_key_map[0x4e] = FTK_KEY_n;
  100. s_key_map[0x4f] = FTK_KEY_o;
  101. s_key_map[0x50] = FTK_KEY_p;
  102. s_key_map[0x51] = FTK_KEY_q;
  103. s_key_map[0x52] = FTK_KEY_r;
  104. s_key_map[0x53] = FTK_KEY_s;
  105. s_key_map[0x54] = FTK_KEY_t;
  106. s_key_map[0x55] = FTK_KEY_u;
  107. s_key_map[0x56] = FTK_KEY_v;
  108. s_key_map[0x57] = FTK_KEY_w;
  109. s_key_map[0x58] = FTK_KEY_x;
  110. s_key_map[0x59] = FTK_KEY_y;
  111. s_key_map[0x5a] = FTK_KEY_z;
  112. s_key_map[0x21] = FTK_KEY_PAGEUP;
  113. s_key_map[0x25] = FTK_KEY_LEFT;
  114. s_key_map[0x27] = FTK_KEY_RIGHT;
  115. s_key_map[0x24] = FTK_KEY_HOME;
  116. s_key_map[0x23] = FTK_KEY_END;
  117. s_key_map[0x28] = FTK_KEY_DOWN;
  118. s_key_map[0x22] = FTK_KEY_PAGEDOWN;
  119. s_key_map[0x2d] = FTK_KEY_INSERT;
  120. s_key_map[0x2e] = FTK_KEY_DELETE;
  121. s_key_map[0x26] = FTK_KEY_UP;
  122. return;
  123. }
  124. int ftk_add_event(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  125. {
  126. if(s_pipe != NULL)
  127. {
  128. struct input_event ievent;
  129. ievent.hwnd = hwnd;
  130. ievent.message = message;
  131. ievent.wparam = wParam;
  132. ievent.lparam = lParam;
  133. ftk_pipe_write(s_pipe, &ievent, sizeof(struct input_event));
  134. return 0;
  135. }
  136. return -1;
  137. }
  138. static Ret ftk_on_key_event(PrivInfo* priv, int down, unsigned char vkey)
  139. {
  140. priv->event.type = down ? FTK_EVT_KEY_DOWN : FTK_EVT_KEY_UP;
  141. priv->event.u.key.code = s_key_map[vkey];
  142. return RET_OK;
  143. }
  144. static int ftk_source_input_get_fd(FtkSource* thiz)
  145. {
  146. DECL_PRIV(thiz, priv);
  147. return ftk_pipe_get_read_handle(priv->pipe);
  148. }
  149. static int ftk_key_map(FtkSource* thiz, int key)
  150. {
  151. return s_key_map[key] != 0 ? s_key_map[key] : key;
  152. }
  153. static int ftk_source_input_check(FtkSource* thiz)
  154. {
  155. return -1;
  156. }
  157. static Ret ftk_source_input_dispatch(FtkSource* thiz)
  158. {
  159. int ret = 0;
  160. struct input_event ievent;
  161. DECL_PRIV(thiz, priv);
  162. ret = ftk_pipe_read(priv->pipe, &ievent, sizeof(ievent));
  163. return_val_if_fail(ret == sizeof(ievent), RET_FAIL);
  164. switch (ievent.message)
  165. {
  166. case WM_KEYDOWN:
  167. case WM_KEYUP:
  168. {
  169. ftk_on_key_event(priv, ievent.message==WM_KEYDOWN, 0xFF & ievent.wparam);
  170. break;
  171. }
  172. case WM_LBUTTONUP:
  173. case WM_LBUTTONDOWN:
  174. {
  175. int xPos, yPos;
  176. xPos = LOWORD(ievent.lparam);
  177. yPos = HIWORD(ievent.lparam);
  178. priv->event.u.mouse.x = xPos;
  179. priv->event.u.mouse.y = yPos;
  180. priv->event.type = ievent.message == WM_LBUTTONUP? FTK_EVT_MOUSE_UP : FTK_EVT_MOUSE_DOWN;
  181. break;
  182. }
  183. case WM_MOUSEMOVE:
  184. {
  185. int xPos = LOWORD(ievent.lparam);
  186. int yPos = HIWORD(ievent.lparam);
  187. priv->event.u.mouse.x = xPos;
  188. priv->event.u.mouse.y = yPos;
  189. priv->event.type = FTK_EVT_MOUSE_MOVE;
  190. break;
  191. }
  192. default:
  193. break;
  194. }
  195. if(priv->on_event != NULL && priv->event.type != FTK_EVT_NOP)
  196. {
  197. priv->on_event(priv->user_data, &priv->event);
  198. priv->event.type = FTK_EVT_NOP;
  199. }
  200. return RET_OK;
  201. }
  202. static void ftk_source_input_destroy(FtkSource* thiz)
  203. {
  204. if(thiz != NULL)
  205. {
  206. DECL_PRIV(thiz, priv);
  207. ftk_pipe_destroy(priv->pipe);
  208. FTK_ZFREE(thiz, sizeof(thiz) + sizeof(PrivInfo));
  209. s_pipe = NULL;
  210. }
  211. return;
  212. }
  213. FtkSource* ftk_source_input_create(FtkOnEvent on_event, void* user_data)
  214. {
  215. FtkSource* thiz = (FtkSource*)FTK_ZALLOC(sizeof(FtkSource) + sizeof(PrivInfo));
  216. if(thiz != NULL)
  217. {
  218. DECL_PRIV(thiz, priv);
  219. thiz->get_fd = ftk_source_input_get_fd;
  220. thiz->check = ftk_source_input_check;
  221. thiz->dispatch = ftk_source_input_dispatch;
  222. thiz->destroy = ftk_source_input_destroy;
  223. s_pipe = priv->pipe = ftk_pipe_create();
  224. if(priv->pipe == NULL)
  225. {
  226. FTK_ZFREE(thiz, sizeof(thiz) + sizeof(PrivInfo));
  227. return NULL;
  228. }
  229. thiz->ref = 1;
  230. priv->on_event = on_event;
  231. priv->user_data = user_data;
  232. }
  233. return thiz;
  234. }