Change dummy object atspi role
[platform/framework/web/crosswalk-tizen.git] / runtime / browser / native_window.cc
index c201a6a..5712dff 100755 (executable)
 #include "runtime/browser/native_window.h"
 
 #include <Ecore_Wayland.h>
+#include <EWebKit.h>
+#include <EWebKit_internal.h>
 #include <cstdint>
 
+#include "common/arraysize.h"
 #include "common/logger.h"
 
 namespace runtime {
 
 namespace {
-  const char* kEdjePath = "/usr/share/edje/xwalk/xwalk_tizen.edj";
-  const char* kWinowRotationEventKey = "wm,rotation,changed";
+const char* kEdjePath = "/usr/share/edje/xwalk/xwalk_tizen.edj";
+const char* kWinowRotationEventKey = "wm,rotation,changed";
+const char* kWinowFocusedEventKey = "focused";
+const char* kWinowUnfocusedEventKey = "unfocused";
+
+const int kPortraitNaturalAngle[] = {
+  0,  // PORTRAIT_PRIMARY
+  180,  // PORTRAIT_SECONDARY
+  270,  // LANDSCAPE_PRIMARY
+  90,  // LANDSCAPE_SECONDARY
+  0,  // NATURAL
+  -1  // ANY
+};
+const int kLandscapeNaturalAngle[] = {
+  270,  // PORTRAIT_PRIMARY
+  90,  // PORTRAIT_SECONDARY
+  0,  // LANDSCAPE_PRIMARY
+  180,  // LANDSCAPE_SECONDARY
+  0,  // NATURAL
+  -1,  // ANY
+};
+
+NativeWindow::ScreenOrientation NativeAngleToOrientation(
+    int angle, NativeWindow::ScreenOrientation natural_orientation) {
+  auto& convert_table =
+      natural_orientation == NativeWindow::ScreenOrientation::PORTRAIT_PRIMARY ?
+          kPortraitNaturalAngle :
+          kLandscapeNaturalAngle;
+  unsigned index = ARRAYSIZE(convert_table) - 1;
+  for (unsigned i = 0; i < ARRAYSIZE(convert_table); ++i) {
+    if (convert_table[i] == angle) {
+      index = i;
+      break;
+    }
+  }
+  return static_cast<NativeWindow::ScreenOrientation>(index);
+}
+
 }  // namespace
 
 
@@ -33,7 +72,7 @@ NativeWindow::NativeWindow()
     : window_(NULL),
       window_type_(Type::NORMAL),
       initialized_(false),
-      layout_(NULL),
+      focus_(NULL),
       content_(NULL),
       rotation_(0),
       handler_id_(0) {
@@ -55,6 +94,7 @@ void NativeWindow::Initialize() {
   int w, h;
   ecore_wl_screen_size_get(&w, &h);
   evas_object_resize(window_, w, h);
+  elm_win_size_base_set(window_, w, h);
   elm_win_autodel_set(window_, EINA_TRUE);
   evas_object_smart_callback_add(window_, "delete,request",
                                  DidDeleteRequested, this);
@@ -85,7 +125,41 @@ void NativeWindow::Initialize() {
   EVAS_SIZE_EXPAND_FILL(top_layout);
   elm_object_content_set(conformant, top_layout);
   evas_object_show(top_layout);
-  layout_ = top_layout;
+
+  // focus
+  Evas_Object* focus = elm_bg_add(top_layout);
+  evas_object_size_hint_align_set(focus, EVAS_HINT_FILL, EVAS_HINT_FILL);
+  evas_object_size_hint_weight_set(focus, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+  elm_object_focus_allow_set(focus, EINA_TRUE);
+  elm_object_part_content_set(top_layout, "elm.swallow.content", focus);
+  EVAS_SIZE_EXPAND_FILL(focus);
+  elm_access_object_unregister(focus);
+  elm_atspi_accessible_role_set(focus, ELM_ATSPI_ROLE_FILLER);
+  evas_object_show(focus);
+  focus_ = focus;
+
+  // focus callback
+  auto focus_callback = [](void* user_data,
+                           Evas_Object*,
+                           void*) -> void {
+    NativeWindow* window = static_cast<NativeWindow*>(user_data);
+    window->DidFocusChanged(true);
+  };
+  auto unfocus_callback = [](void* user_data,
+                             Evas_Object*,
+                             void*) -> void {
+    NativeWindow* window = static_cast<NativeWindow*>(user_data);
+    window->DidFocusChanged(false);
+  };
+
+  evas_object_smart_callback_add(focus,
+                                 kWinowFocusedEventKey,
+                                 focus_callback,
+                                 this);
+  evas_object_smart_callback_add(focus,
+                                 kWinowUnfocusedEventKey,
+                                 unfocus_callback,
+                                 this);
 
   // Rotation
   auto rotation_callback = [](void* user_data,
@@ -106,6 +180,8 @@ void NativeWindow::Initialize() {
     natural_orientation_ = ScreenOrientation::PORTRAIT_PRIMARY;
   }
 
+  elm_win_indicator_mode_set(window_, ELM_WIN_INDICATOR_SHOW);
+
   initialized_ = true;
 }
 
@@ -133,11 +209,10 @@ void NativeWindow::SetContent(Evas_Object* content) {
   // issue elm_object_part_content_unset() on it first.
 
   evas_object_show(content);
-
-  // Hide unseted evas object to avoid focus and event callback problem.
   evas_object_hide(
-    elm_object_part_content_unset(layout_, "elm.swallow.content"));
-  elm_object_part_content_set(layout_, "elm.swallow.content", content);
+    elm_object_part_content_unset(focus_, "elm.swallow.content"));
+  elm_object_part_content_set(focus_, "elm.swallow.content", content);
+  elm_object_focus_set(focus_, EINA_TRUE);
   content_ = content;
 
   // attached webview was resized by evas_norender API
@@ -152,6 +227,12 @@ void NativeWindow::DidRotation(int degree) {
   }
 }
 
+void NativeWindow::DidFocusChanged(bool got) {
+  if (content_ != NULL) {
+    ewk_view_focus_set(content_, got ? EINA_TRUE : EINA_FALSE);
+  }
+}
+
 int NativeWindow::AddRotationHandler(RotationHandler handler) {
   int id = handler_id_++;
   handler_table_[id] = handler;
@@ -162,6 +243,10 @@ void NativeWindow::RemoveRotationHandler(int id) {
   handler_table_.erase(id);
 }
 
+NativeWindow::ScreenOrientation NativeWindow::orientation() const {
+  return NativeAngleToOrientation(rotation_, natural_orientation_);
+}
+
 void NativeWindow::SetRotationLock(int degree) {
   if (degree != -1)
     rotation_ = degree % 360;
@@ -169,26 +254,10 @@ void NativeWindow::SetRotationLock(int degree) {
 }
 
 void NativeWindow::SetRotationLock(ScreenOrientation orientation) {
-  int portrait_natural_angle[] = {
-    0,  // PORTRAIT_PRIMARY
-    180,  // PORTRAIT_SECONDARY
-    270,  // LANDSCAPE_PRIMARY
-    90,  // LANDSCAPE_SECONDARY
-    0,  // NATURAL
-    -1  // ANY
-  };
-  int landscape_natural_angle[] = {
-    270,  // PORTRAIT_PRIMARY
-    90,  // PORTRAIT_SECONDARY
-    0,  // LANDSCAPE_PRIMARY
-    180,  // LANDSCAPE_SECONDARY
-    0,  // NATURAL
-    -1,  // ANY
-  };
   auto& convert_table =
       natural_orientation_ == ScreenOrientation::PORTRAIT_PRIMARY ?
-          portrait_natural_angle :
-          landscape_natural_angle;
+          kPortraitNaturalAngle :
+          kLandscapeNaturalAngle;
   SetRotationLock(convert_table[static_cast<int>(orientation)]);
 }
 
@@ -219,4 +288,17 @@ void NativeWindow::FullScreen(bool enable) {
       enable ? ELM_WIN_INDICATOR_TRANSPARENT : ELM_WIN_INDICATOR_OPAQUE);
 }
 
+#ifdef MANUAL_ROTATE_FEATURE_SUPPORT
+void NativeWindow::EnableManualRotation(bool enable) {
+  LOGGER(DEBUG) << "set manual rotation : " << (enable ? "enabled" : "disabled");
+  elm_win_wm_rotation_manual_rotation_done_set(window_, enable ? EINA_TRUE : EINA_FALSE);
+}
+
+void NativeWindow::ManualRotationDone() {
+  if (EINA_TRUE == elm_win_wm_rotation_manual_rotation_done_get(window_)) {
+    elm_win_wm_rotation_manual_rotation_done(window_);
+  }
+}
+#endif  // MANUAL_ROTATE_FEATURE_SUPPORT
+
 }  // namespace runtime