2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include "runtime/browser/native_window.h"
21 #elif defined(HAVE_WAYLAND)
22 #include <Ecore_Wayland.h>
27 #include "common/logger.h"
32 const char* kEdjePath = "/usr/share/edje/xwalk/xwalk_tizen.edj";
33 const char* kWinowRotationEventKey = "wm,rotation,changed";
34 const char* kWinowFocusedEventKey = "focused";
35 const char* kWinowUnfocusedEventKey = "unfocused";
39 NativeWindow::NativeWindow()
40 : initialized_(false),
48 NativeWindow::~NativeWindow() {
51 void NativeWindow::Initialize() {
53 window_ = CreateWindowInternal();
54 elm_win_conformant_set(window_, EINA_TRUE);
57 uint16_t pid = getpid();
58 ecore_x_window_prop_property_set(
59 elm_win_xwindow_get(window_),
60 ECORE_X_ATOM_NET_WM_PID,
61 ECORE_X_ATOM_CARDINAL, 32, &pid, 1);
62 ecore_x_vsync_animator_tick_source_set(elm_win_xwindow_get(window_));
63 ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h);
64 #elif defined(HAVE_WAYLAND)
65 ecore_wl_screen_size_get(&w, &h);
67 evas_object_resize(window_, w, h);
68 elm_win_autodel_set(window_, EINA_TRUE);
69 evas_object_smart_callback_add(window_, "delete,request",
70 DidDeleteRequested, this);
71 evas_object_smart_callback_add(window_, "profile,changed",
72 DidProfileChanged, this);
74 #define EVAS_SIZE_EXPAND_FILL(obj) \
75 evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); \
76 evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
79 Evas_Object* bg = evas_object_rectangle_add(evas_object_evas_get(window_));
80 evas_object_color_set(bg, 0, 0, 0, 255);
81 EVAS_SIZE_EXPAND_FILL(bg);
82 elm_win_resize_object_add(window_, bg);
83 evas_object_render_op_set(bg, EVAS_RENDER_BLEND);
87 Evas_Object* conformant = elm_conformant_add(window_);
88 EVAS_SIZE_EXPAND_FILL(conformant);
89 elm_win_resize_object_add(window_, conformant);
90 evas_object_show(conformant);
93 Evas_Object* top_layout = elm_layout_add(conformant);
94 elm_layout_file_set(top_layout, kEdjePath, "web-application");
95 EVAS_SIZE_EXPAND_FILL(top_layout);
96 elm_object_content_set(conformant, top_layout);
97 evas_object_show(top_layout);
100 Evas_Object* focus = elm_button_add(top_layout);
101 elm_theme_extension_add(NULL, kEdjePath);
102 elm_object_style_set(focus, "wrt");
103 elm_object_part_content_set(top_layout, "elm.swallow.content", focus);
104 EVAS_SIZE_EXPAND_FILL(focus);
105 elm_access_object_unregister(focus);
106 evas_object_show(focus);
110 auto focus_callback = [](void* user_data,
113 NativeWindow* window = static_cast<NativeWindow*>(user_data);
114 window->DidFocusChanged(true);
116 auto unfocus_callback = [](void* user_data,
119 NativeWindow* window = static_cast<NativeWindow*>(user_data);
120 window->DidFocusChanged(false);
123 evas_object_smart_callback_add(focus,
124 kWinowFocusedEventKey,
127 evas_object_smart_callback_add(focus,
128 kWinowUnfocusedEventKey,
133 auto rotation_callback = [](void* user_data,
136 NativeWindow* window = static_cast<NativeWindow*>(user_data);
137 int degree = elm_win_rotation_get(obj);
138 window->DidRotation(degree);
140 evas_object_smart_callback_add(window_,
141 kWinowRotationEventKey,
146 natural_orientation_ = ScreenOrientation::LANDSCAPE_PRIMARY;
148 natural_orientation_ = ScreenOrientation::PORTRAIT_PRIMARY;
154 void NativeWindow::DidDeleteRequested(void* /*data*/,
155 Evas_Object* /*obj*/, void* /*event_info*/) {
156 LOGGER(DEBUG) << "didDeleteRequested";
160 void NativeWindow::DidProfileChanged(void* /*data*/,
161 Evas_Object* /*obj*/, void* /*event_info*/) {
162 LOGGER(DEBUG) << "didProfileChanged";
165 Evas_Object* NativeWindow::evas_object() const {
169 void NativeWindow::SetContent(Evas_Object* content) {
171 // If any object was already set as a content object in the same part,
172 // the previous object will be deleted automatically with this call.
173 // If the content is NULL, this call will just delete the previous object.
174 // If the If you wish to preserve it,
175 // issue elm_object_part_content_unset() on it first.
176 evas_object_show(content);
177 elm_object_part_content_unset(focus_, "elm.swallow.content");
178 elm_object_part_content_set(focus_, "elm.swallow.content", content);
179 elm_object_focus_set(focus_, EINA_TRUE);
183 void NativeWindow::DidRotation(int degree) {
185 auto it = handler_table_.begin();
186 for ( ; it != handler_table_.end(); ++it) {
191 void NativeWindow::DidFocusChanged(bool got) {
192 if (content_ != NULL) {
193 elm_object_focus_set(content_, got ? EINA_TRUE : EINA_FALSE);
197 int NativeWindow::AddRotationHandler(RotationHandler handler) {
198 int id = handler_id_++;
199 handler_table_[id] = handler;
203 void NativeWindow::RemoveRotationHandler(int id) {
204 handler_table_.erase(id);
207 void NativeWindow::SetRotationLock(int degree) {
209 rotation_ = degree % 360;
210 elm_win_wm_rotation_preferred_rotation_set(window_, rotation_);
213 void NativeWindow::SetRotationLock(ScreenOrientation orientation) {
214 int portrait_natural_angle[] = {
215 0, // PORTRAIT_PRIMARY
216 180, // PORTRAIT_SECONDARY
217 270, // LANDSCAPE_PRIMARY
218 90, // LANDSCAPE_SECONDARY
222 int landscape_natural_angle[] = {
223 270, // PORTRAIT_PRIMARY
224 90, // PORTRAIT_SECONDARY
225 0, // LANDSCAPE_PRIMARY
226 180, // LANDSCAPE_SECONDARY
230 auto& convert_table =
231 natural_orientation_ == ScreenOrientation::PORTRAIT_PRIMARY ?
232 portrait_natural_angle :
233 landscape_natural_angle;
234 SetRotationLock(convert_table[static_cast<int>(orientation)]);
238 void NativeWindow::SetAutoRotation() {
239 elm_win_wm_rotation_preferred_rotation_set(window_, -1);
240 if (elm_win_wm_rotation_supported_get(window_)) {
241 const int rotation[4] = {0, 90, 180, 270};
242 elm_win_wm_rotation_available_rotations_set(window_, rotation, 4);
244 rotation_ = elm_win_rotation_get(window_);
247 void NativeWindow::Show() {
248 evas_object_show(window_);
251 void NativeWindow::Active() {
252 elm_win_activate(window_);
255 void NativeWindow::InActive() {
256 elm_win_lower(window_);
259 void NativeWindow::FullScreen(bool enable) {
260 elm_win_indicator_opacity_set(window_,
261 enable ? ELM_WIN_INDICATOR_TRANSPARENT : ELM_WIN_INDICATOR_OPAQUE);
264 } // namespace runtime