/src/os/android/ftk_input_method_android.c

http://ftk.googlecode.com/ · C · 148 lines · 113 code · 34 blank · 1 comment · 15 complexity · a0ca2d03214dc1c9d6a75b5f0025f4fa MD5 · raw file

  1. #include "ftk_jni.h"
  2. #include "ftk_log.h"
  3. #include "ftk_event.h"
  4. #include "ftk_globals.h"
  5. #include "ftk_input_method_android.h"
  6. typedef struct _PrivInfo
  7. {
  8. FtkWidget* editor;
  9. FtkInputType input_type;
  10. }PrivInfo;
  11. static Ret ftk_input_method_android_handle_event(FtkInputMethod* thiz, FtkEvent* event);
  12. static Ret ftk_input_method_android_init(FtkInputMethod* thiz)
  13. {
  14. return RET_OK;
  15. }
  16. static Ret ftk_input_method_android_reset(FtkInputMethod* thiz)
  17. {
  18. return RET_OK;
  19. }
  20. static Ret ftk_input_method_android_activate(FtkInputMethod* thiz)
  21. {
  22. ftk_input_method_android_init(thiz);
  23. ftk_wnd_manager_add_global_listener(ftk_default_wnd_manager(),
  24. (FtkListener)ftk_input_method_android_handle_event, thiz);
  25. ftk_logd("%s\n", __func__);
  26. return RET_OK;
  27. }
  28. static Ret ftk_input_method_android_deactivate(FtkInputMethod* thiz)
  29. {
  30. ftk_input_method_android_reset(thiz);
  31. ftk_wnd_manager_remove_global_listener(ftk_default_wnd_manager(),
  32. (FtkListener)ftk_input_method_android_handle_event, thiz);
  33. ftk_logd("%s\n", __func__);
  34. return RET_OK;
  35. }
  36. static Ret ftk_input_method_android_focus_in(FtkInputMethod* thiz, FtkWidget* editor)
  37. {
  38. DECL_PRIV(thiz, priv);
  39. return_val_if_fail(priv != NULL && editor != NULL, RET_FAIL);
  40. priv->editor = editor;
  41. Android_ShowKeyboard();
  42. return ftk_input_method_android_activate(thiz);
  43. }
  44. static Ret ftk_input_method_android_focus_out(FtkInputMethod* thiz)
  45. {
  46. DECL_PRIV(thiz, priv);
  47. return_val_if_fail(priv != NULL, RET_FAIL);
  48. Android_HideKeyboard();
  49. priv->editor = NULL;
  50. return ftk_input_method_android_deactivate(thiz);
  51. }
  52. static Ret ftk_input_method_android_set_type(FtkInputMethod* thiz, FtkInputType input_type)
  53. {
  54. DECL_PRIV(thiz, priv);
  55. return_val_if_fail(priv != NULL, RET_FAIL);
  56. priv->input_type = input_type;
  57. return RET_OK;
  58. }
  59. static Ret ftk_input_method_android_handle_event(FtkInputMethod* thiz, FtkEvent* event)
  60. {
  61. Ret ret = RET_OK;
  62. DECL_PRIV(thiz, priv);
  63. return_val_if_fail(priv != NULL && event != NULL, RET_FAIL);
  64. switch(event->type)
  65. {
  66. case FTK_EVT_OS_IM_COMMIT:
  67. {
  68. FtkEvent evt = {0};
  69. if(priv->editor == NULL)
  70. {
  71. FTK_FREE(event->u.extra);
  72. ret = RET_REMOVE;
  73. break;
  74. }
  75. /* TODO: priv->input_type */
  76. evt.type = FTK_EVT_IM_COMMIT;
  77. evt.u.extra = event->u.extra;
  78. evt.widget = priv->editor;
  79. ftk_widget_event(priv->editor, &evt);
  80. FTK_FREE(event->u.extra);
  81. ret = RET_REMOVE;
  82. break;
  83. }
  84. case FTK_EVT_IM_ACT_COMMIT:
  85. {
  86. break;
  87. }
  88. default:break;
  89. }
  90. return ret;
  91. }
  92. static void ftk_input_method_android_destroy(FtkInputMethod* thiz)
  93. {
  94. if(thiz != NULL)
  95. {
  96. DECL_PRIV(thiz, priv);
  97. FTK_ZFREE(thiz, sizeof(FtkInputMethod) + sizeof(PrivInfo));
  98. }
  99. }
  100. FtkInputMethod* ftk_input_method_android_create(void)
  101. {
  102. FtkInputMethod* thiz = FTK_ZALLOC(sizeof(FtkInputMethod) + sizeof(PrivInfo));
  103. if(thiz != NULL)
  104. {
  105. thiz->ref = 1;
  106. thiz->name = "android ime";
  107. thiz->set_type = ftk_input_method_android_set_type;
  108. thiz->focus_in = ftk_input_method_android_focus_in;
  109. thiz->focus_out = ftk_input_method_android_focus_out;
  110. thiz->handle_event = ftk_input_method_android_handle_event;
  111. thiz->destroy = ftk_input_method_android_destroy;
  112. }
  113. return thiz;
  114. }