2 * Copyright (c) 2012 - 2014 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.
18 #include "sclwindows.h"
20 #include "sclwindows-win32.h"
21 #elif defined(__EFL__)
22 #include "sclwindows-efl.h"
23 #elif defined(__NUI__)
24 #include "sclwindows-nui.h"
26 #include "sclwindows-gtk.h"
29 #include "sclevents.h"
30 #include "sclresourcecache.h"
31 #include "sclcontroller.h"
32 #include "sclactionstate.h"
33 #include "sclres_manager.h"
34 #include "sclkeyfocushandler.h"
35 #include "sclanimator.h"
36 #include "scleventhandler.h"
41 CSCLWindows::CSCLWindows()
49 memset(&m_base_window_context, 0x00, sizeof(SclWindowContext));
50 memset(&m_magnifier_window_context, 0x00, sizeof(SclWindowContext));
51 memset(&m_dim_window_context, 0x00, sizeof(SclWindowContext));
52 memset(m_popup_window_context, 0x00, sizeof(SclWindowContext) * MAX_POPUP_WINDOW);
54 m_pending_update = FALSE;
55 m_initialized = FALSE;
57 for (loop = 0;loop < MAX_ZORDER_NUM;loop++) {
58 m_Z_order_list[loop] = SCLWINDOW_INVALID;
62 CSCLWindows::~CSCLWindows()
72 void CSCLWindows::init()
75 CSCLWindowsImpl *impl = get_scl_windows_impl();
79 for (loop = 0;loop < MAX_ZORDER_NUM;loop++) {
80 m_Z_order_list[loop] = SCLWINDOW_INVALID;
85 void CSCLWindows::fini()
87 CSCLWindowsImpl* impl = get_scl_windows_impl();
92 if (SCLWINDOW_INVALID != m_base_window_context.window) {
93 impl->destroy_window(m_base_window_context.window);
94 m_base_window_context.window = SCLWINDOW_INVALID;
97 if (SCLWINDOW_INVALID != m_magnifier_window_context.window) {
98 impl->destroy_window(m_magnifier_window_context.window);
99 m_magnifier_window_context.window = SCLWINDOW_INVALID;
102 if (SCLWINDOW_INVALID != m_dim_window_context.window) {
103 impl->destroy_window(m_dim_window_context.window);
104 m_dim_window_context.window = SCLWINDOW_INVALID;
107 for (int loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
108 if (m_popup_window_context[loop].window != SCLWINDOW_INVALID) {
109 if (!m_popup_window_context[loop].is_virtual) {
110 impl->destroy_window(m_popup_window_context[loop].window);
112 m_popup_window_context[loop].window = SCLWINDOW_INVALID;
117 m_initialized = FALSE;
121 CSCLWindows::get_scl_windows_impl()
125 m_impl = new CSCLWindowsImplWin32;
126 #elif defined(__EFL__)
127 m_impl = new CSCLWindowsImplEfl;
128 #elif defined(__NUI__)
129 m_impl = new CSCLWindowsImplNui;
131 m_impl = new CSCLWindowsImplGtk;
138 CSCLWindows::get_instance()
140 static CSCLWindows instance;
144 sclwindow CSCLWindows::open_popup(const SclWindowOpener opener, const SclRectangle &geometry, sclshort inputmode, sclshort layout, SCLPopupType popup_type, sclboolean is_virtual, sclboolean use_dim_window, sclint img_offset_x, sclint img_offset_y, sclint timeout)
146 sclwindow window = SCLWINDOW_INVALID;
148 CSCLEvents *events = CSCLEvents::get_instance();
149 CSCLActionState *state = CSCLActionState::get_instance();
150 CSCLController *controller = CSCLController::get_instance();
151 CSCLResourceCache *cache = CSCLResourceCache::get_instance();
152 CSCLContext *context = CSCLContext::get_instance();
153 CSCLWindows *windows = CSCLWindows::get_instance();
154 CSCLUtils *utils = CSCLUtils::get_instance();
156 if (events && state && controller && cache && context && windows && utils) {
157 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
158 if (m_popup_window_context[loop].window != SCLWINDOW_INVALID) {
159 if (m_popup_window_context[loop].layout == layout) return SCLWINDOW_INVALID;
163 window = create_window(opener, geometry, inputmode, layout, popup_type, is_virtual, img_offset_x, img_offset_y, timeout);
164 events->destroy_timer(SCL_TIMER_POPUP_TIMEOUT);
166 events->create_timer(SCL_TIMER_POPUP_TIMEOUT, timeout, layout);
169 LOGD("create window (%p) x: %d, y:%d, width:%d, height:%d , layout:%d, popuptype:%d",
170 window, geometry.x, geometry.y, geometry.width, geometry.height, layout, popup_type);
172 events->connect_window_events(window, SCL_EVENT_MOUSE | SCL_EVENT_EXPOSE);
173 controller->handle_engine_signal(SCL_SIG_POPUP_SHOW, window);
175 /* Shows the dim window if it uses the dim_window */
176 if (use_dim_window) {
177 sclwindow dim_window = get_dim_window();
179 /* Currently, get_window_rect does not work normally (need to check X). So I have commented it*/
181 get_window_rect(get_base_window(), &rect);
182 resize_window(dim_window, rect.width, rect.height);
183 move_window(dim_window, rect.x, rect.y);
184 events->connect_window_events(dim_window, SCL_EVENT_MOUSE);
185 /*If we use transient_for them the ISE will occur some crash. It needs to check X11*/
186 set_parent(opener.window, dim_window);
187 SclWindowContext *dim_window_context = get_window_context(get_dim_window());
188 if (dim_window_context) {
189 if (dim_window_context->is_virtual) {
190 set_parent(opener.window, window);
192 set_parent(dim_window, window);
195 show_window(dim_window);
197 /*If we use transient_for them the ISE will occur some crash. It needs to check X11*/
198 set_parent(opener.window, window);
202 push_window_in_Z_order_list(window);
204 state->set_cur_action_state(ACTION_STATE_POPUP_INIT);
206 const SclLayout *cur_layout = cache->get_cur_layout(window);
208 /* If the newly opened popup window has POPUP_GRAB style, lets press the nearest button on the new window */
209 if (cur_layout->style == LAYOUT_STYLE_POPUP_GRAB) {
210 sclwindow pressed_window = context->get_cur_pressed_window(context->get_last_touch_device_id());
211 sclbyte pressed_key = context->get_cur_pressed_key(context->get_last_touch_device_id());
213 const SclLayoutKeyCoordinate* coordinate = cache->get_cur_layout_key_coordinate(pressed_window, pressed_key);
215 sclwindow moving_window = context->get_cur_moving_window(context->get_last_touch_device_id());
216 SclPoint moving_point = context->get_cur_moving_point(context->get_last_touch_device_id());
217 SclWindowContext *moving_window_context = windows->get_window_context(moving_window);
218 SclWindowContext *popup_window_context = windows->get_window_context(window);
219 if (moving_window_context && popup_window_context) {
221 (moving_window_context->geometry.x - popup_window_context->geometry.x) + moving_point.x;
223 (moving_window_context->geometry.y - popup_window_context->geometry.y) + moving_point.y;
226 /* Find the nearest button on the autopopup window */
227 sclboolean ended = FALSE;
228 sclfloat min_dist = (float)((sclu32)(-1));
229 sclint min_dist_index = NOT_USED;
230 for (sclint loop = 0;loop < MAX_KEY && !ended;loop++) {
231 SclButtonContext *popup_button_context = cache->get_cur_button_context(window, loop);
232 const SclLayoutKeyCoordinate *popup_coordinate = cache->get_cur_layout_key_coordinate(window, loop);
233 if (popup_button_context && popup_coordinate) {
234 if (!(popup_button_context->used)) {
236 } else if (popup_button_context->state != BUTTON_STATE_DISABLED &&
237 popup_coordinate->button_type != BUTTON_TYPE_UIITEM) {
238 if (popup_coordinate) {
239 float dist = utils->get_approximate_distance(moving_point.x, moving_point.y,
240 popup_coordinate->x + (popup_coordinate->width / 2) -
241 cur_layout->mouse_manipulate_x,
242 popup_coordinate->y + (popup_coordinate->height / 2) -
243 cur_layout->mouse_manipulate_y);
244 if (dist < min_dist) {
245 min_dist_index = loop;
252 /* When we found the nearest button, make it pressed */
253 if (min_dist_index != NOT_USED) {
254 const SclLayoutKeyCoordinate *popup_coordinate =
255 cache->get_cur_layout_key_coordinate(window, min_dist_index);
256 if (popup_coordinate) {
257 sclint x = popup_coordinate->x + (popup_coordinate->width / 2) -
258 cur_layout->mouse_manipulate_x;
259 sclint y = popup_coordinate->y + (popup_coordinate->height / 2) -
260 cur_layout->mouse_manipulate_y;
261 controller->mouse_press(window, x, y, context->get_last_touch_device_id());
265 /* The below code block seems unnecessary since we already invoked mouse_press() */
266 /*context->set_cur_pressed_window(context->get_last_touch_device_id(), window);
267 context->set_cur_pressed_key(context->get_last_touch_device_id(), min_dist_index);
268 if (button_context) {
269 button_context->state = BUTTON_STATE_NORMAL;
272 if (windows && coordinate)
273 windows->update_window(window, coordinate->x, coordinate->y, coordinate->width, coordinate->height);
281 bool CSCLWindows::close_popup(sclwindow window, sclboolean timed_out)
283 LOGD("close_popup window (%p)", window);
285 CSCLEventHandler *handler = CSCLEventHandler::get_instance();
288 SclNotiPopupClosingDesc desc;
289 desc.ui_event_desc = NULL;
290 desc.input_mode = NULL;
291 desc.timed_out = timed_out;
293 SclResParserManager *sclres_manager = SclResParserManager::get_instance();
294 if (sclres_manager) {
295 const PSclInputModeConfigure sclres_input_mode_configure =
296 sclres_manager->get_input_mode_configure_table();
297 SclWindowContext *window_context = get_window_context(window);
298 if (window_context && sclres_input_mode_configure) {
299 if (scl_check_arrindex(window_context->inputmode, MAX_SCL_INPUT_MODE)) {
300 desc.input_mode = sclres_input_mode_configure[window_context->inputmode].name;
305 if (SCL_EVENT_PASS_ON == handler->on_event_notification(SCL_UINOTITYPE_POPUP_CLOSING, &desc)) {
306 SclNotiPopupClosedDesc closed_desc;
307 closed_desc.ui_event_desc = NULL;
308 closed_desc.input_mode = desc.input_mode;
309 closed_desc.timed_out = desc.timed_out;
310 handler->on_event_notification(SCL_UINOTITYPE_POPUP_CLOSED, &desc);
312 CSCLKeyFocusHandler *focus_handler = CSCLKeyFocusHandler::get_instance();
314 focus_handler->popup_closed(window);
316 pop_window_in_Z_order_list(window);
318 hide_window(get_dim_window());
320 return destroy_window(window);
327 bool CSCLWindows::close_all_popups(sclwindow skip_window /* = SCLWINDOW_INVALID */, sclboolean timed_out)
329 sclboolean all_closed = TRUE;
330 /* Close all the popup windows except the targetWindow */
334 window = get_nth_popup_window(loop);
336 if (window != skip_window) {
337 close_popup(window, timed_out);
345 /* If there is a popup still opened, don't destroy POPUP_TIMEOUT timer */
350 CSCLWindows::create_base_window(const sclwindow parent, scl16 width, scl16 height)
355 CSCLWindowsImpl* impl = get_scl_windows_impl();
357 m_base_window_context.hidden = TRUE;
358 m_base_window_context.geometry.width = width;
359 m_base_window_context.geometry.height = height;
360 m_base_window_context.is_virtual = FALSE;
361 m_base_window_context.popup_type = POPUP_TYPE_NONE;
362 m_base_window_context.opener.window = parent;
363 m_base_window_context.geometry.x = m_base_window_context.geometry.y = 0;
364 m_base_window_context.etc_info = NULL;
365 m_base_window_context.window = SCLWINDOW_INVALID;
368 m_base_window_context.window = impl->create_base_window(parent, &m_base_window_context, width, height);
369 push_window_in_Z_order_list(m_base_window_context.window);
373 // Update the position information
374 //get_window_context(parent, TRUE);
376 return m_base_window_context.window;
380 * Creates a new top-level window
383 * CSCLGwes* gwes = CSCLGwes::get_instance();
384 * sclwindow popupWindow = gwes->m_windows->create_window(window, 100, 500, 200, 100, 4, POPUP_TYPE_BTN_RELEASE_POPUP, FALSE);
385 * if (popupWindow != NULL) {
386 * gwes->m_events->connect_window_events(popupWindow, SCL_EVENT_MOUSE | SCL_EVENT_EXPOSE);
387 * cache->recompute_layout(popupWindow);
388 * gwes->m_windows->show_window(popupWindow);
392 CSCLWindows::create_window(const SclWindowOpener opener, const SclRectangle &geometry, sclshort inputmode, sclshort layout, SCLPopupType popup_type, sclboolean is_virtual, sclint img_offset_x, sclint img_offset_y, sclint timeout)
396 CSCLWindowsImpl* impl = get_scl_windows_impl();
397 sclwindow window = SCLWINDOW_INVALID;
400 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
401 if (m_popup_window_context[loop].window == SCLWINDOW_INVALID) {
402 m_popup_window_context[loop].hidden = TRUE;
403 m_popup_window_context[loop].opener = opener;
404 m_popup_window_context[loop].etc_info = NULL;
405 m_popup_window_context[loop].inputmode = inputmode;
406 m_popup_window_context[loop].layout = layout;
407 m_popup_window_context[loop].popup_type = popup_type;
408 m_popup_window_context[loop].is_virtual = is_virtual;
410 m_popup_window_context[loop].geometry = geometry;
412 m_popup_window_context[loop].layout_image_offset.x = img_offset_x;
413 m_popup_window_context[loop].layout_image_offset.y = img_offset_y;
415 m_popup_window_context[loop].timeout = timeout;
418 window = impl->create_window(opener.window,
419 &(m_popup_window_context[loop]), geometry.width, geometry.height);
421 window = reinterpret_cast<sclwindow>(loop + 1);
424 m_popup_window_context[loop].window = window;
426 //set_window_rotation(window, context->get_rotation_degree());
427 if (!m_popup_window_context[loop].is_virtual) {
428 impl->move_window(window, geometry.x, geometry.y);
434 // Update the position information
435 //get_window_context(window, TRUE);
437 if (window == NULL) {
438 LOGW("Failed to create a new window. The size of window buffer has exceeded.");
445 CSCLWindows::create_magnifier_window(const sclwindow parent, scl16 x, scl16 y, scl16 width, scl16 height)
449 CSCLWindowsImpl* impl = get_scl_windows_impl();
450 sclwindow window = SCLWINDOW_INVALID;
452 if (impl && m_initialized) {
453 if (m_magnifier_window_context.window == SCLWINDOW_INVALID) {
454 window = impl->create_magnifier_window(parent, &m_magnifier_window_context, width, height);
455 impl->set_keep_above(window, TRUE);
457 m_magnifier_window_context.window = window;
458 m_magnifier_window_context.geometry.width = width;
459 m_magnifier_window_context.geometry.height = height;
460 m_magnifier_window_context.hidden = TRUE;
463 window = m_magnifier_window_context.window;
465 set_parent(parent, window);
467 if (window == NULL) {
468 LOGW("Failed to create a new window. The size of window buffer has exceeded.");
470 LOGD("Magnifier Window %p created", window);
474 // Update the position information
475 //get_window_context(window, TRUE);
481 CSCLWindows::get_magnifier_window()
484 return m_magnifier_window_context.window;
488 CSCLWindows::create_dim_window(const sclwindow parent, SclWindowContext *window_context, scl16 width, scl16 height)
492 CSCLWindowsImpl* impl = get_scl_windows_impl();
493 sclwindow window = SCLWINDOW_INVALID;
495 SclResParserManager *sclres_manager = SclResParserManager::get_instance();
496 PSclDefaultConfigure default_configure = NULL;
497 if (sclres_manager) {
498 default_configure = sclres_manager->get_default_configure();
501 if (impl && m_initialized && default_configure) {
502 if (m_dim_window_context.window == NULL) {
503 m_dim_window_context.hidden = TRUE;
504 if (default_configure->use_actual_dim_window) {
505 window = impl->create_dim_window(parent, &m_dim_window_context, width, height);
507 window = reinterpret_cast<sclwindow>(SCLWINDOW_VIRTUAL_DIM);
508 m_dim_window_context.is_virtual = TRUE;
511 m_dim_window_context.window = window;
514 window = m_dim_window_context.window;
517 if (window == NULL) {
518 LOGW("Failed to create a new window. The size of window buffer has exceeded");
526 CSCLWindows::get_dim_window()
529 return m_dim_window_context.window;
533 CSCLWindows::destroy_window(sclwindow window)
537 CSCLWindowsImpl* impl = get_scl_windows_impl();
538 sclboolean ret = FALSE;
541 if (window == m_base_window_context.window) {
542 impl->destroy_window(window);
543 memset(&m_base_window_context, 0x00, sizeof(SclWindowContext));
544 m_base_window_context.window = SCLWINDOW_INVALID;
546 } else if (window == m_magnifier_window_context.window) {
547 impl->destroy_window(window);
548 memset(&m_magnifier_window_context, 0x00, sizeof(SclWindowContext));
549 m_magnifier_window_context.window = SCLWINDOW_INVALID;
551 } else if (window == m_dim_window_context.window) {
552 impl->destroy_window(window);
553 memset(&m_dim_window_context, 0x00, sizeof(SclWindowContext));
554 m_dim_window_context.window = SCLWINDOW_INVALID;
557 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
558 if (m_popup_window_context[loop].window == window) {
559 impl->destroy_window(window);
560 memset(&m_popup_window_context[loop], 0x00, sizeof(SclWindowContext));
562 m_popup_window_context[loop].window = SCLWINDOW_INVALID;
573 CSCLWindows::get_base_window()
577 return m_base_window_context.window;
581 CSCLWindows::is_base_window(sclwindow window)
585 sclboolean ret = FALSE;
587 if (window != SCLWINDOW_INVALID) {
588 if (window == m_base_window_context.window) {
597 CSCLWindows::find_by_etcinfo(void* etc_info)
601 sclwindow ret = SCLWINDOW_INVALID;
603 if (etc_info == m_base_window_context.etc_info) {
604 ret = m_base_window_context.window;
605 } else if (etc_info == m_magnifier_window_context.etc_info) {
606 ret = m_magnifier_window_context.window;
607 } else if (etc_info == m_dim_window_context.etc_info) {
608 ret = m_dim_window_context.window;
610 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
611 if (etc_info == m_popup_window_context[loop].etc_info) {
612 ret = m_popup_window_context[loop].window;
622 //CSCLWindows::get_window_context(sclwindow window, sclboolean geometry_update)
623 CSCLWindows::get_window_context(sclwindow window)
627 SclWindowContext* ret = NULL;
629 if (window == m_base_window_context.window) {
630 /*if (geometry_update) {
632 get_window_rect(window, &rect);
633 m_base_window_context.geometry.x = rect.x;
634 m_base_window_context.geometry.y = rect.y;
636 ret = &m_base_window_context;
637 } else if (window == m_magnifier_window_context.window) {
638 ret = &m_magnifier_window_context;
639 } else if (window == m_dim_window_context.window) {
640 ret = &m_dim_window_context;
642 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
643 if (m_popup_window_context[loop].window == window) {
644 /*if (geometry_update) {
646 get_window_rect(window, &rect);
647 m_popup_window_context[loop].geometry.x = rect.x;
648 m_popup_window_context[loop].geometry.y = rect.y;
650 ret = &m_popup_window_context[loop];
660 CSCLWindows::set_window_context(sclwindow window, SclWindowContext* context)
664 if (window == m_base_window_context.window) {
665 memcpy(&m_base_window_context, context, sizeof(SclWindowContext));
667 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
668 if (m_popup_window_context[loop].window == window) {
669 memcpy(&m_popup_window_context[loop], context, sizeof(SclWindowContext));
677 CSCLWindows::find_popup_window_index(sclwindow window)
683 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
684 if (m_popup_window_context[loop].window == window) {
694 CSCLWindows::move_window(const sclwindow window, scl16 x, scl16 y)
698 sclboolean is_virtual = FALSE;
699 if (window == m_base_window_context.window) {
700 m_base_window_context.geometry.x = x;
701 m_base_window_context.geometry.y = y;
702 is_virtual = m_base_window_context.is_virtual;
703 } else if (window == m_magnifier_window_context.window) {
704 m_magnifier_window_context.geometry.x = x;
705 m_magnifier_window_context.geometry.y = y;
706 is_virtual = m_magnifier_window_context.is_virtual;
707 } else if (window == m_dim_window_context.window) {
708 m_dim_window_context.geometry.x = x;
709 m_dim_window_context.geometry.y = y;
710 is_virtual = m_dim_window_context.is_virtual;
712 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
713 if (m_popup_window_context[loop].window == window) {
714 m_popup_window_context[loop].geometry.x = x;
715 m_popup_window_context[loop].geometry.y = y;
716 is_virtual = m_popup_window_context[loop].is_virtual;
722 CSCLWindowsImpl* impl = get_scl_windows_impl();
724 impl->move_window(window, x, y);
730 CSCLWindows::resize_window(const sclwindow window, scl16 width, scl16 height)
734 sclboolean is_virtual = FALSE;
735 if (window == m_base_window_context.window) {
736 m_base_window_context.geometry.width = width;
737 m_base_window_context.geometry.height = height;
738 is_virtual = m_base_window_context.is_virtual;
739 } else if (window == m_magnifier_window_context.window) {
740 m_magnifier_window_context.geometry.width = width;
741 m_magnifier_window_context.geometry.height = height;
742 is_virtual = m_magnifier_window_context.is_virtual;
743 } else if (window == m_dim_window_context.window) {
744 m_dim_window_context.geometry.width = width;
745 m_dim_window_context.geometry.height = height;
746 is_virtual = m_dim_window_context.is_virtual;
748 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
749 if (m_popup_window_context[loop].window == window) {
750 m_popup_window_context[loop].geometry.width = width;
751 m_popup_window_context[loop].geometry.height = height;
752 is_virtual = m_popup_window_context[loop].is_virtual;
758 CSCLWindowsImpl* impl = get_scl_windows_impl();
760 impl->resize_window(window, width, height);
766 CSCLWindows::move_resize_window(const sclwindow window, scl16 x, scl16 y, scl16 width, scl16 height)
770 sclboolean is_virtual = FALSE;
771 if (window == m_base_window_context.window) {
772 m_base_window_context.geometry.x = x;
773 m_base_window_context.geometry.y = y;
774 m_base_window_context.geometry.width = width;
775 m_base_window_context.geometry.height = height;
776 is_virtual = m_base_window_context.is_virtual;
777 } else if (window == m_magnifier_window_context.window) {
778 m_magnifier_window_context.geometry.x = x;
779 m_magnifier_window_context.geometry.y = y;
780 m_magnifier_window_context.geometry.width = width;
781 m_magnifier_window_context.geometry.height = height;
782 is_virtual = m_magnifier_window_context.is_virtual;
783 } else if (window == m_dim_window_context.window) {
784 m_dim_window_context.geometry.x = x;
785 m_dim_window_context.geometry.y = y;
786 m_dim_window_context.geometry.width = width;
787 m_dim_window_context.geometry.height = height;
788 is_virtual = m_dim_window_context.is_virtual;
790 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
791 if (m_popup_window_context[loop].window == window) {
792 m_popup_window_context[loop].geometry.x = x;
793 m_popup_window_context[loop].geometry.y = y;
794 m_popup_window_context[loop].geometry.width = width;
795 m_popup_window_context[loop].geometry.height = height;
796 is_virtual = m_popup_window_context[loop].is_virtual;
802 CSCLWindowsImpl* impl = get_scl_windows_impl();
804 impl->move_resize_window(window, x, y, width, height);
810 /* Push given window into a Z-order list */
811 void CSCLWindows::push_window_in_Z_order_list(sclwindow window)
817 for (loop = 0;loop < MAX_ZORDER_NUM;loop++) {
818 if (m_Z_order_list[loop] == SCLWINDOW_INVALID) {
819 m_Z_order_list[loop] = window;
825 /* Pop given window from a Z-order list */
826 void CSCLWindows::pop_window_in_Z_order_list(sclwindow window)
831 sclboolean found = FALSE;
833 for (loop = 0;loop < MAX_ZORDER_NUM - 1;loop++) {
834 if (m_Z_order_list[loop] == window || found) {
836 m_Z_order_list[loop] = m_Z_order_list[loop + 1];
840 m_Z_order_list[MAX_ZORDER_NUM - 1] = SCLWINDOW_INVALID;
843 /* Search n-th window in the Z-order stack, starting from the top (TOPMOST window would be the 0 index) */
844 sclwindow CSCLWindows::get_nth_window_in_Z_order_list(sclbyte index)
850 for (loop = MAX_ZORDER_NUM - 1;loop >= 0;loop--) {
851 if (m_Z_order_list[loop] != SCLWINDOW_INVALID) {
853 return m_Z_order_list[loop];
859 return SCLWINDOW_INVALID;
862 sclwindow CSCLWindows::get_nth_popup_window(sclbyte index)
866 scl_assert_return_null(index >= 0 && index < MAX_POPUP_WINDOW);
868 if (index < MAX_POPUP_WINDOW) {
869 return m_popup_window_context[index].window;
872 return SCLWINDOW_INVALID;
875 sclbyte CSCLWindows::get_Z_order(sclwindow window)
880 for (loop = 0;loop < MAX_ZORDER_NUM;loop++) {
881 if (m_Z_order_list[loop] == window) {
888 void CSCLWindows::set_parent(const sclwindow parent, const sclwindow window)
890 /* Do not set parent if the window is a virtual window */
891 //SclWindowContext *window_context = get_window_context(window, FALSE);
892 SclWindowContext *window_context = get_window_context(window);
893 if (window_context) {
894 if (!(window_context->is_virtual)) {
895 CSCLWindowsImpl* impl = get_scl_windows_impl();
897 impl->set_parent(parent, window);
903 void CSCLWindows::set_window_rotation(const sclwindow window, SCLRotation rotation)
907 CSCLWindowsImpl* impl = get_scl_windows_impl();
908 CSCLUtils *utils = CSCLUtils::get_instance();
911 if (window == NULL) {
912 impl->set_window_rotation(m_base_window_context.window, rotation);
913 if (SCLWINDOW_INVALID != m_magnifier_window_context.window) {
914 SclResParserManager *sclres_manager = SclResParserManager::get_instance();
915 PSclMagnifierWndConfigure magnifier_configure = NULL;
916 if (sclres_manager) {
917 magnifier_configure = sclres_manager->get_magnifier_configure();
919 if (magnifier_configure) {
920 m_magnifier_window_context.geometry.width =
921 magnifier_configure->width * utils->get_custom_scale_rate_x();
922 m_magnifier_window_context.geometry.height =
923 magnifier_configure->height * utils->get_custom_scale_rate_y();
925 impl->set_window_rotation(m_magnifier_window_context.window, rotation);
929 if (SCLWINDOW_INVALID != m_dim_window_context.window) {
930 /* For individual window rotation */
931 impl->set_window_rotation(m_dim_window_context.window, rotation);
932 //resize_window(m_dim_window_context.window, m_base_window_context.width, m_base_winctx.height);
933 //move_window(m_dim_window_context.window, m_base_window_context.x, m_base_winctx.y);
934 hide_window(m_dim_window_context.window);
936 /* For individual window rotation
937 for (int loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
938 if (m_popup_window_context[loop].window != SCLWINDOW_INVALID) {
939 if (!m_popup_window_context[loop].isVirtual) {
940 get_scl_windows_impl()->set_window_rotation(m_popup_window_context[loop].window, degree);
946 impl->set_window_rotation(window, rotation);
947 LOGD("## set_window_rotation : %d", rotation);
951 // Update the position information
952 //get_window_context(window, TRUE);
953 SclWindowContext *window_context = get_window_context(window);
954 if (window_context) {
955 get_window_rect(window, &(window_context->geometry));
961 CSCLWindows::show_window(const sclwindow window, sclboolean queue /*= FALSE*/)
965 if (window == m_base_window_context.window) {
966 m_base_window_context.hidden = FALSE;
967 } else if (window == m_magnifier_window_context.window) {
968 m_magnifier_window_context.hidden = FALSE;
969 } else if (window == m_dim_window_context.window) {
970 m_dim_window_context.hidden = FALSE;
972 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
973 if (m_popup_window_context[loop].window == window) {
974 m_popup_window_context[loop].hidden = FALSE;
980 CSCLWindowsImpl* impl = get_scl_windows_impl();
982 impl->show_window(window, queue);
987 CSCLWindows::hide_window(const sclwindow window, sclboolean force /*= FALSE*/)
991 if (window == m_base_window_context.window) {
992 m_base_window_context.hidden = TRUE;
993 } else if (window == m_magnifier_window_context.window) {
994 m_magnifier_window_context.hidden = TRUE;
995 } else if (window == m_dim_window_context.window) {
996 m_dim_window_context.hidden = TRUE;
998 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
999 if (m_popup_window_context[loop].window == window) {
1000 m_popup_window_context[loop].hidden = TRUE;
1006 CSCLWindowsImpl* impl = get_scl_windows_impl();
1008 impl->hide_window(window, force);
1013 CSCLWindows::set_keep_above(const sclwindow window, sclboolean keep_above)
1015 CSCLWindowsImpl* impl = get_scl_windows_impl();
1017 impl->set_keep_above(window, keep_above);
1022 CSCLWindows::set_update_pending(sclboolean pend)
1024 m_pending_update = pend;
1026 update_window(m_base_window_context.window);
1031 CSCLWindows::get_update_pending()
1033 return m_pending_update;
1037 CSCLWindows::update_window(const sclwindow window,
1038 scl16 x /*= 0*/, scl16 y /*= 0*/, scl16 width /*= 0*/, scl16 height /*= 0*/ )
1040 if (!m_pending_update) {
1041 CSCLWindowsImpl* impl = get_scl_windows_impl();
1042 CSCLAnimator *animator = CSCLAnimator::get_instance();
1043 CSCLResourceCache *cache = CSCLResourceCache::get_instance();
1044 CSCLContext *context = CSCLContext::get_instance();
1045 CSCLKeyFocusHandler* focus_handler = CSCLKeyFocusHandler::get_instance();
1048 impl->update_window(window, x, y, width, height);
1050 /* If we are not updating the whole screen */
1051 if (animator && cache && context && focus_handler && (x != 0 || y != 0 || width != 0 || height != 0)) {
1052 sclboolean draw_highlight_ui = TRUE;
1053 SclAnimationState *state = NULL;
1056 sclint id = animator->find_animator_by_type(ANIMATION_TYPE_HIGHLIGHT_UI);
1057 state = animator->get_animation_state(id);
1060 // If currently the highlight UI is being animated, don't update here
1061 if (state->active) {
1062 draw_highlight_ui = FALSE;
1066 SclWindowContext *window_context = get_window_context(window);
1067 if (focus_handler->get_current_focus_window() == window) {
1071 SclWindowContext *base_window_context = get_window_context(get_base_window());
1072 if (window_context && base_window_context) {
1073 if (window_context->is_virtual) {
1074 startx += (window_context->geometry.x - base_window_context->geometry.x);
1075 starty += (window_context->geometry.y - base_window_context->geometry.y);
1078 if (draw_highlight_ui && context->get_highlight_ui_enabled()) {
1079 const SclLayoutKeyCoordinate *coordinate = NULL;
1080 scl8 current_key_index = focus_handler->get_current_focus_key();
1081 coordinate = cache->get_cur_layout_key_coordinate(window, current_key_index);
1083 // Update the highlighted area as well
1084 LOGD("startx: %d, starty: %d", startx, starty);
1085 LOGD("coordinate x(%d), y(%d), w(%d), h(%d)", coordinate->x, coordinate->y, coordinate->width, coordinate->height);
1087 impl->update_window(window, startx + coordinate->x, starty + coordinate->y, coordinate->width, coordinate->height);
1097 CSCLWindows::get_window_rect(const sclwindow window, SclRectangle *rect) {
1100 sclboolean is_virtual = FALSE;
1101 sclboolean ret = FALSE;
1103 if (window == m_base_window_context.window) {
1104 is_virtual = m_base_window_context.is_virtual;
1106 *rect = m_base_window_context.geometry;
1108 } else if (window == m_magnifier_window_context.window) {
1109 is_virtual = m_magnifier_window_context.is_virtual;
1111 *rect = m_magnifier_window_context.geometry;
1113 } else if (window == m_dim_window_context.window) {
1114 is_virtual = m_dim_window_context.is_virtual;
1116 *rect = m_dim_window_context.geometry;
1119 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
1120 if (m_popup_window_context[loop].window == window) {
1121 is_virtual = m_popup_window_context[loop].is_virtual;
1123 *rect = m_popup_window_context[loop].geometry;
1131 CSCLWindowsImpl* impl = get_scl_windows_impl();
1133 ret = impl->get_window_rect(window, rect);
1140 void CSCLWindows::set_window_backend_callback(ISCLUIWindowBackendCallback *callback, void *data)
1142 CSCLWindowsImpl* impl = get_scl_windows_impl();
1144 impl->set_window_backend_callback(callback, data);