/src/backend/wince/ftk_display_wince_gdi.c

http://ftk.googlecode.com/ · C · 404 lines · 351 code · 46 blank · 7 comment · 32 complexity · c76d0c4bc100f09a3b59be9f960a3bb1 MD5 · raw file

  1. #include "ftk_typedef.h"
  2. #include "ftk.h"
  3. #include "ftk_log.h"
  4. #include "ftk_bitmap.h"
  5. #include "ftk_event.h"
  6. #include "ftk_globals.h"
  7. #include "ftk_display_wince.h"
  8. #include "ftk_input_method_manager.h"
  9. #include "ftk_input_method_wince.h"
  10. #include <aygshell.h>
  11. typedef struct _PrivInfo
  12. {
  13. HWND wnd;
  14. HBITMAP hBitmap;
  15. int width;
  16. int height;
  17. void* bits;
  18. FtkEvent event;
  19. }PrivInfo;
  20. static int s_key_map[0xff] = {0};
  21. static wchar_t szClassName[] = L"FtkEmulator";
  22. static void ftk_display_wince_set_fullscreen(PrivInfo* priv)
  23. {
  24. SHFullScreen(priv->wnd, SHFS_HIDESIPBUTTON|SHFS_HIDETASKBAR|SHFS_HIDESTARTICON);
  25. SetWindowPos(priv->wnd, HWND_TOPMOST, 0, 0, priv->width, priv->height, SWP_NOOWNERZORDER|SWP_SHOWWINDOW);
  26. }
  27. static void ftk_display_wince_keymap_init(void)
  28. {
  29. s_key_map[0xBD] = FTK_KEY_MINUS;
  30. s_key_map[0x20] = FTK_KEY_SPACE;
  31. s_key_map[0xBB] = FTK_KEY_EQUAL;
  32. s_key_map[0x08] = FTK_KEY_BACKSPACE;
  33. s_key_map[0x09] = FTK_KEY_TAB;
  34. s_key_map[0xC0] = FTK_KEY_QUOTELEFT;
  35. s_key_map[0xDE] = FTK_KEY_QUOTERIGHT;
  36. s_key_map[0xDB] = FTK_KEY_BRACKETLEFT;
  37. s_key_map[0xDD] = FTK_KEY_BRACKETRIGHT;
  38. s_key_map[0x0d] = FTK_KEY_ENTER;
  39. s_key_map[0xBA] = FTK_KEY_SEMICOLON;
  40. s_key_map[0x30] = FTK_KEY_0;
  41. s_key_map[0x31] = FTK_KEY_1;
  42. s_key_map[0x32] = FTK_KEY_2;
  43. s_key_map[0x33] = FTK_KEY_3;
  44. s_key_map[0x34] = FTK_KEY_4;
  45. s_key_map[0x35] = FTK_KEY_5;
  46. s_key_map[0x36] = FTK_KEY_6;
  47. s_key_map[0x37] = FTK_KEY_7;
  48. s_key_map[0x38] = FTK_KEY_8;
  49. s_key_map[0x39] = FTK_KEY_9;
  50. s_key_map[0x70] = FTK_KEY_F1;
  51. s_key_map[0x71] = FTK_KEY_F2;
  52. s_key_map[0x72] = FTK_KEY_F3;
  53. s_key_map[0x73] = FTK_KEY_F4;
  54. s_key_map[0x74] = FTK_KEY_F5;
  55. s_key_map[0x75] = FTK_KEY_F6;
  56. s_key_map[0x76] = FTK_KEY_F7;
  57. s_key_map[0x77] = FTK_KEY_F8;
  58. s_key_map[0x78] = FTK_KEY_F9;
  59. s_key_map[0xBC] = FTK_KEY_COMMA;
  60. s_key_map[0xBE] = FTK_KEY_DOT;
  61. s_key_map[0xBF] = FTK_KEY_SLASH;
  62. s_key_map[0x10] = FTK_KEY_RIGHTSHIFT;
  63. s_key_map[0x11] = FTK_KEY_LEFTCTRL;
  64. s_key_map[0x14] = FTK_KEY_CAPSLOCK;
  65. s_key_map[0x40] = FTK_KEY_LEFTALT;
  66. s_key_map[0x41] = FTK_KEY_a;
  67. s_key_map[0x42] = FTK_KEY_b;
  68. s_key_map[0x43] = FTK_KEY_c;
  69. s_key_map[0x44] = FTK_KEY_d;
  70. s_key_map[0x45] = FTK_KEY_e;
  71. s_key_map[0x46] = FTK_KEY_f;
  72. s_key_map[0x47] = FTK_KEY_g;
  73. s_key_map[0x48] = FTK_KEY_h;
  74. s_key_map[0x49] = FTK_KEY_i;
  75. s_key_map[0x4a] = FTK_KEY_j;
  76. s_key_map[0x4b] = FTK_KEY_k;
  77. s_key_map[0x4c] = FTK_KEY_l;
  78. s_key_map[0x4d] = FTK_KEY_m;
  79. s_key_map[0x4e] = FTK_KEY_n;
  80. s_key_map[0x4f] = FTK_KEY_o;
  81. s_key_map[0x50] = FTK_KEY_p;
  82. s_key_map[0x51] = FTK_KEY_q;
  83. s_key_map[0x52] = FTK_KEY_r;
  84. s_key_map[0x53] = FTK_KEY_s;
  85. s_key_map[0x54] = FTK_KEY_t;
  86. s_key_map[0x55] = FTK_KEY_u;
  87. s_key_map[0x56] = FTK_KEY_v;
  88. s_key_map[0x57] = FTK_KEY_w;
  89. s_key_map[0x58] = FTK_KEY_x;
  90. s_key_map[0x59] = FTK_KEY_y;
  91. s_key_map[0x5a] = FTK_KEY_z;
  92. s_key_map[0x21] = FTK_KEY_PAGEUP;
  93. s_key_map[0x25] = FTK_KEY_LEFT;
  94. s_key_map[0x27] = FTK_KEY_RIGHT;
  95. s_key_map[0x24] = FTK_KEY_HOME;
  96. s_key_map[0x23] = FTK_KEY_END;
  97. s_key_map[0x28] = FTK_KEY_DOWN;
  98. s_key_map[0x22] = FTK_KEY_PAGEDOWN;
  99. s_key_map[0x2d] = FTK_KEY_INSERT;
  100. s_key_map[0x2e] = FTK_KEY_DELETE;
  101. s_key_map[0x26] = FTK_KEY_UP;
  102. }
  103. static char* ftk_display_wince_on_ime(HWND hwnd, LPARAM lParam)
  104. {
  105. LONG n;
  106. wchar_t* unicode;
  107. char* utf8;
  108. HIMC himc;
  109. FtkInputMethod* im = NULL;
  110. if(!(lParam & GCS_RESULTSTR))
  111. {
  112. return NULL;
  113. }
  114. if(ftk_input_method_manager_get_current(ftk_default_input_method_manager(), &im) == RET_FAIL || im == NULL)
  115. {
  116. return NULL;
  117. }
  118. if(ftk_input_method_wince_get_editor(im) == NULL)
  119. {
  120. return NULL;
  121. }
  122. himc = ImmGetContext(hwnd);
  123. if((void*)himc == NULL)
  124. {
  125. return NULL;
  126. }
  127. n = ImmGetCompositionStringW(himc, GCS_RESULTSTR, NULL, 0);
  128. if(n <= 0)
  129. {
  130. ImmReleaseContext(hwnd, himc);
  131. return NULL;
  132. }
  133. unicode = (wchar_t*)FTK_ALLOC(n + 2);
  134. if(unicode == NULL)
  135. {
  136. ImmReleaseContext(hwnd, himc);
  137. return NULL;
  138. }
  139. if(ImmGetCompositionStringW(himc, GCS_RESULTSTR, unicode, n) != n)
  140. {
  141. FTK_FREE(unicode);
  142. ImmReleaseContext(hwnd, himc);
  143. return NULL;
  144. }
  145. ImmReleaseContext(hwnd, himc);
  146. ftk_logd("%s:%d WM_IME_COMPOSITION:%s\n", __FILE__, __LINE__, unicode);
  147. unicode[n / 2] = L'\0';
  148. ftk_logd("%s:%d WM_IME_COMPOSITION:%s\n", __FILE__, __LINE__, unicode);
  149. n = WideCharToMultiByte(CP_UTF8, 0, unicode, -1, NULL, 0, NULL, NULL);
  150. if(n < 1)
  151. {
  152. FTK_FREE(unicode);
  153. return NULL;
  154. }
  155. utf8 = (char*) FTK_ALLOC(n);
  156. if(utf8 == NULL)
  157. {
  158. FTK_FREE(unicode);
  159. return NULL;
  160. }
  161. n = WideCharToMultiByte(CP_UTF8, 0, unicode, -1, utf8, n, NULL, NULL);
  162. if(n < 1)
  163. {
  164. FTK_FREE(unicode);
  165. FTK_FREE(utf8);
  166. return NULL;
  167. }
  168. FTK_FREE(unicode);
  169. ftk_logd("%s:%d WM_IME_COMPOSITION:%s\n", __FILE__, __LINE__, utf8);
  170. return utf8;
  171. }
  172. static void ftk_display_wince_on_paint(PrivInfo* priv)
  173. {
  174. HDC dc;
  175. int x, y, w, h;
  176. PAINTSTRUCT ps;
  177. HBITMAP bmp, old_bmp;
  178. BeginPaint(priv->wnd, &ps);
  179. x = ps.rcPaint.left;
  180. y = ps.rcPaint.top;
  181. w = ps.rcPaint.right - ps.rcPaint.left;
  182. h = ps.rcPaint.bottom - ps.rcPaint.top;
  183. bmp = CreateBitmap(priv->width, priv->height, 1, 32, priv->bits);
  184. dc = CreateCompatibleDC(ps.hdc);
  185. old_bmp = (HBITMAP)SelectObject(dc, bmp);
  186. BitBlt(ps.hdc, x, y, w, h, dc, x, y, SRCCOPY);
  187. SelectObject(dc, old_bmp);
  188. DeleteObject(dc);
  189. DeleteObject(bmp);
  190. EndPaint(priv->wnd, &ps);
  191. }
  192. static LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  193. {
  194. char* buf = NULL;
  195. PrivInfo* priv = (PrivInfo*) GetWindowLongW(hwnd, GWL_USERDATA);
  196. switch(message)
  197. {
  198. case WM_DESTROY:
  199. PostQuitMessage(0);
  200. FTK_QUIT();
  201. break;
  202. //case WM_ACTIVATE:
  203. // set_fullscreen(priv);
  204. // break;
  205. case WM_PAINT:
  206. ftk_display_wince_on_paint(priv);
  207. break;
  208. case WM_KEYDOWN:
  209. case WM_KEYUP:
  210. priv->event.type = message == WM_KEYDOWN ? FTK_EVT_KEY_DOWN : FTK_EVT_KEY_UP;
  211. priv->event.u.key.code = s_key_map[0xFF & wParam];
  212. break;
  213. case WM_LBUTTONUP:
  214. case WM_LBUTTONDOWN:
  215. priv->event.u.mouse.x = LOWORD(lParam);
  216. priv->event.u.mouse.y = HIWORD(lParam);
  217. priv->event.type = message == WM_LBUTTONUP? FTK_EVT_MOUSE_UP : FTK_EVT_MOUSE_DOWN;
  218. break;
  219. case WM_MOUSEMOVE:
  220. priv->event.u.mouse.x = LOWORD(lParam);
  221. priv->event.u.mouse.y = HIWORD(lParam);
  222. priv->event.type = FTK_EVT_MOUSE_MOVE;
  223. break;
  224. case WM_IME_COMPOSITION:
  225. buf = ftk_display_wince_on_ime(hwnd, lParam);
  226. if(buf == NULL)
  227. {
  228. return DefWindowProcW(hwnd, message, wParam, lParam);
  229. }
  230. priv->event.u.extra = buf;
  231. priv->event.type = FTK_EVT_OS_IM_COMMIT;
  232. break;
  233. default:
  234. return DefWindowProcW(hwnd, message, wParam, lParam);
  235. }
  236. if(priv->event.type != FTK_EVT_NOP)
  237. {
  238. ftk_wnd_manager_queue_event_auto_rotate(ftk_default_wnd_manager(), &priv->event);
  239. priv->event.type = FTK_EVT_NOP;
  240. }
  241. return 0;
  242. }
  243. static HWND ftk_display_wince_create_win(PrivInfo *priv)
  244. {
  245. HWND hwnd;
  246. WNDCLASSW wincl;
  247. wincl.hInstance = NULL;
  248. wincl.lpszClassName = szClassName;
  249. wincl.lpfnWndProc = WinProc;
  250. wincl.style = CS_DBLCLKS;
  251. wincl.hIcon = NULL;
  252. wincl.hCursor = LoadCursorW(NULL, IDC_ARROW);
  253. wincl.lpszMenuName = NULL;
  254. wincl.cbClsExtra = 0;
  255. wincl.cbWndExtra = 64;
  256. wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
  257. if (!RegisterClassW(&wincl))
  258. {
  259. return NULL;
  260. }
  261. hwnd = CreateWindowExW(0, szClassName, L"FtkEmulator", WS_DLGFRAME,
  262. CW_USEDEFAULT, CW_USEDEFAULT, priv->width, priv->height,
  263. HWND_DESKTOP, NULL, NULL, NULL);
  264. return hwnd;
  265. }
  266. static Ret ftk_display_wince_update(FtkDisplay* thiz, FtkBitmap* bitmap, FtkRect* rect, int xoffset, int yoffset)
  267. {
  268. //HDC hdc_src, hdc_dest;
  269. RECT dirty_rect;
  270. //HBITMAP hbm_src;
  271. DECL_PRIV(thiz, priv);
  272. //BITMAPINFO bmi;
  273. ftk_bitmap_copy_to_data_bgra32(bitmap, rect,
  274. priv->bits, xoffset, yoffset, priv->width, priv->height);
  275. #if 0
  276. memset(&bmi, 0x00, sizeof(bmi));
  277. bmi.bmiHeader.biBitCount = 32;
  278. bmi.bmiHeader.biCompression = BI_RGB;
  279. bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
  280. bmi.bmiHeader.biWidth = priv->width;
  281. bmi.bmiHeader.biHeight = priv->height;
  282. bmi.bmiHeader.biPlanes = 1;
  283. hdc_dest = CreateCompatibleDC(0);
  284. SelectObject(hdc_dest, priv->hBitmap);
  285. hdc_src = CreateCompatibleDC(0);
  286. hbm_src = CreateBitmap(priv->width, priv->height, 1, 32, priv->bits);
  287. SelectObject(hdc_src, hbm_src);
  288. BitBlt(hdc_dest, 0, 0, priv->width, priv->height, hdc_src, 0, 0, SRCCOPY);
  289. DeleteDC(hdc_src);
  290. DeleteObject(hbm_src);
  291. DeleteDC(hdc_dest);
  292. #endif
  293. dirty_rect.left = xoffset;
  294. dirty_rect.top = yoffset;
  295. dirty_rect.right = xoffset + rect->width;
  296. dirty_rect.bottom = yoffset + rect->height;
  297. InvalidateRect(priv->wnd, &dirty_rect, FALSE);
  298. return RET_OK;
  299. }
  300. static int ftk_display_wince_width(FtkDisplay* thiz)
  301. {
  302. DECL_PRIV(thiz, priv);
  303. return_val_if_fail(priv != NULL, 0);
  304. return priv->width;
  305. }
  306. static int ftk_display_wince_height(FtkDisplay* thiz)
  307. {
  308. DECL_PRIV(thiz, priv);
  309. return_val_if_fail(priv != NULL, 0);
  310. return priv->height;
  311. }
  312. static Ret ftk_display_wince_snap(FtkDisplay* thiz, FtkRect* r, FtkBitmap* bitmap)
  313. {
  314. FtkRect rect = {0};
  315. DECL_PRIV(thiz, priv);
  316. int w = ftk_display_width(thiz);
  317. int h = ftk_display_height(thiz);
  318. int bw = ftk_bitmap_width(bitmap);
  319. int bh = ftk_bitmap_height(bitmap);
  320. rect.x = r->x;
  321. rect.y = r->y;
  322. rect.width = FTK_MIN(bw, r->width);
  323. rect.height = FTK_MIN(bh, r->height);
  324. return ftk_bitmap_copy_from_data_bgra32(bitmap, priv->bits, w, h, &rect);
  325. }
  326. static void ftk_display_wince_destroy(FtkDisplay* thiz)
  327. {
  328. if(thiz != NULL)
  329. {
  330. DECL_PRIV(thiz, priv);
  331. FTK_FREE(priv->bits);
  332. FTK_ZFREE(thiz, sizeof(FtkDisplay) + sizeof(PrivInfo));
  333. }
  334. }
  335. FtkDisplay* ftk_display_wince_create(void)
  336. {
  337. FtkDisplay* thiz;
  338. thiz = (FtkDisplay*)FTK_ZALLOC(sizeof(FtkDisplay) + sizeof(PrivInfo));
  339. if(thiz != NULL)
  340. {
  341. DECL_PRIV(thiz, priv);
  342. thiz->update = ftk_display_wince_update;
  343. thiz->snap = ftk_display_wince_snap;
  344. thiz->width = ftk_display_wince_width;
  345. thiz->height = ftk_display_wince_height;
  346. thiz->destroy = ftk_display_wince_destroy;
  347. priv->width = GetSystemMetrics(SM_CXSCREEN);
  348. priv->height = GetSystemMetrics(SM_CYSCREEN);
  349. priv->bits = FTK_ZALLOC(priv->width * priv->height * 4);
  350. priv->wnd = ftk_display_wince_create_win(priv);
  351. ftk_display_wince_keymap_init();
  352. SetWindowLongW(priv->wnd, GWL_USERDATA, (LONG)priv);
  353. ShowWindow(priv->wnd, SW_SHOW);
  354. //UpdateWindow(priv->wnd);
  355. ftk_display_wince_set_fullscreen(priv);
  356. }
  357. return thiz;
  358. }