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"
24 #include "sclwindows-gtk.h"
27 #include "sclevents.h"
28 #include "sclresourcecache.h"
29 #include "sclcontroller.h"
30 #include "sclactionstate.h"
31 #include "sclres_manager.h"
32 #include "sclkeyfocushandler.h"
36 CSCLWindows::CSCLWindows()
44 memset(&m_base_window_context, 0x00, sizeof(SclWindowContext));
45 memset(&m_magnifier_window_context, 0x00, sizeof(SclWindowContext));
46 memset(&m_dim_window_context, 0x00, sizeof(SclWindowContext));
47 memset(m_popup_window_context, 0x00, sizeof(SclWindowContext) * MAX_POPUP_WINDOW);
49 m_pending_update = FALSE;
51 for (loop = 0;loop < MAX_ZORDER_NUM;loop++) {
52 m_Z_order_list[loop] = SCLWINDOW_INVALID;
56 CSCLWindows::~CSCLWindows()
66 void CSCLWindows::init()
69 CSCLWindowsImpl *impl = get_scl_windows_impl();
73 for (loop = 0;loop < MAX_ZORDER_NUM;loop++) {
74 m_Z_order_list[loop] = SCLWINDOW_INVALID;
79 void CSCLWindows::fini()
81 CSCLWindowsImpl* impl = get_scl_windows_impl();
86 if (SCLWINDOW_INVALID != m_base_window_context.window) {
87 impl->destroy_window(m_base_window_context.window);
88 m_base_window_context.window = SCLWINDOW_INVALID;
91 if (SCLWINDOW_INVALID != m_magnifier_window_context.window) {
92 impl->destroy_window(m_magnifier_window_context.window);
93 m_magnifier_window_context.window = SCLWINDOW_INVALID;
96 if (SCLWINDOW_INVALID != m_dim_window_context.window) {
97 impl->destroy_window(m_dim_window_context.window);
98 m_dim_window_context.window = SCLWINDOW_INVALID;
101 for (int loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
102 if (m_popup_window_context[loop].window != SCLWINDOW_INVALID) {
103 if (!m_popup_window_context[loop].is_virtual) {
104 impl->destroy_window(m_popup_window_context[loop].window);
106 m_popup_window_context[loop].window = SCLWINDOW_INVALID;
111 m_initialized = FALSE;
115 CSCLWindows::get_scl_windows_impl()
119 m_impl = new CSCLWindowsImplWin32;
120 #elif defined(__EFL__)
121 m_impl = new CSCLWindowsImplEfl;
123 m_impl = new CSCLWindowsImplGtk;
130 CSCLWindows::get_instance()
132 static CSCLWindows instance;
136 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)
138 sclwindow window = SCLWINDOW_INVALID;
140 CSCLEvents *events = CSCLEvents::get_instance();
141 CSCLActionState *state = CSCLActionState::get_instance();
142 CSCLController *controller = CSCLController::get_instance();
143 CSCLResourceCache *cache = CSCLResourceCache::get_instance();
144 CSCLContext *context = CSCLContext::get_instance();
145 CSCLWindows *windows = CSCLWindows::get_instance();
146 CSCLUtils *utils = CSCLUtils::get_instance();
148 if (events && state && controller && cache && context && windows && utils) {
149 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
150 if (m_popup_window_context[loop].window != SCLWINDOW_INVALID) {
151 if (m_popup_window_context[loop].layout == layout) return SCLWINDOW_INVALID;
155 window = create_window(opener, geometry, inputmode, layout, popup_type, is_virtual, img_offset_x, img_offset_y, timeout);
156 events->destroy_timer(SCL_TIMER_POPUP_TIMEOUT);
158 events->create_timer(SCL_TIMER_POPUP_TIMEOUT, timeout, layout);
161 printf("create window (%p) x: %d, y:%d, width:%d, height:%d , layout:%d, popuptype:%d\n",
162 window, geometry.x, geometry.y, geometry.width, geometry.height, layout, popup_type);
164 events->connect_window_events(window, SCL_EVENT_MOUSE | SCL_EVENT_EXPOSE);
165 controller->handle_engine_signal(SCL_SIG_POPUP_SHOW, window);
167 /* Shows the dim window if it uses the dim_window */
168 if (use_dim_window) {
169 sclwindow dim_window = get_dim_window();
171 /* Currently, get_window_rect does not work normally (need to check X). So I have commented it*/
173 get_window_rect(get_base_window(), &rect);
174 resize_window(dim_window, rect.width, rect.height);
175 move_window(dim_window, rect.x, rect.y);
176 events->connect_window_events(dim_window, SCL_EVENT_MOUSE);
177 /*If we use transient_for them the ISE will occure some crash. It needs to check X11*/
178 set_parent(opener.window, dim_window);
179 SclWindowContext *dim_window_context = get_window_context(get_dim_window());
180 if (dim_window_context) {
181 if (dim_window_context->is_virtual) {
182 set_parent(opener.window, window);
184 set_parent(dim_window, window);
187 show_window(dim_window);
189 /*If we use transient_for them the ISE will occure some crash. It needs to check X11*/
190 set_parent(opener.window, window);
194 push_window_in_Z_order_list(window);
196 state->set_cur_action_state(ACTION_STATE_POPUP_INIT);
198 const SclLayout *cur_layout = cache->get_cur_layout(window);
200 /* If the newly opened popup window has POPUP_GRAB style, lets press the nearest button on the new window */
201 if (cur_layout->style == LAYOUT_STYLE_POPUP_GRAB) {
202 sclwindow pressed_window = context->get_cur_pressed_window(context->get_last_touch_device_id());
203 sclbyte pressed_key = context->get_cur_pressed_key(context->get_last_touch_device_id());
205 const SclLayoutKeyCoordinate* coordinate = cache->get_cur_layout_key_coordinate(pressed_window, pressed_key);
207 sclwindow moving_window = context->get_cur_moving_window(context->get_last_touch_device_id());
208 SclPoint moving_point = context->get_cur_moving_point(context->get_last_touch_device_id());
209 SclWindowContext *moving_window_context = windows->get_window_context(moving_window);
210 SclWindowContext *popup_window_context = windows->get_window_context(window);
211 if (moving_window_context && popup_window_context) {
213 (moving_window_context->geometry.x - popup_window_context->geometry.x) + moving_point.x;
215 (moving_window_context->geometry.y - popup_window_context->geometry.y) + moving_point.y;
218 /* Find the nearest button on the autopopup window */
219 sclboolean ended = FALSE;
220 sclfloat min_dist = (float)((sclu32)(-1));
221 sclint min_dist_index = NOT_USED;
222 for (sclint loop = 0;loop < MAX_KEY && !ended;loop++) {
223 SclButtonContext *popup_button_context = cache->get_cur_button_context(window, loop);
224 const SclLayoutKeyCoordinate *popup_coordinate = cache->get_cur_layout_key_coordinate(window, loop);
225 if (popup_button_context && popup_coordinate) {
226 if (!(popup_button_context->used)) {
228 } else if (popup_button_context->state != BUTTON_STATE_DISABLED &&
229 popup_coordinate->button_type != BUTTON_TYPE_UIITEM) {
230 if (popup_coordinate) {
231 float dist = utils->get_approximate_distance(moving_point.x, moving_point.y,
232 popup_coordinate->x + (popup_coordinate->width / 2) -
233 cur_layout->mouse_manipulate_x,
234 popup_coordinate->y + (popup_coordinate->height / 2) -
235 cur_layout->mouse_manipulate_y);
236 if (dist < min_dist) {
237 min_dist_index = loop;
244 /* When we found the nearest button, make it pressed */
245 if (min_dist_index != NOT_USED) {
246 const SclLayoutKeyCoordinate *popup_coordinate =
247 cache->get_cur_layout_key_coordinate(window, min_dist_index);
248 if (popup_coordinate) {
249 sclint x = popup_coordinate->x + (popup_coordinate->width / 2) -
250 cur_layout->mouse_manipulate_x;
251 sclint y = popup_coordinate->y + (popup_coordinate->height / 2) -
252 cur_layout->mouse_manipulate_y;
253 controller->mouse_press(window, x, y, context->get_last_touch_device_id());
257 /* The below code block seems unnecessary since we already invoked mouse_press() */
258 /*context->set_cur_pressed_window(context->get_last_touch_device_id(), window);
259 context->set_cur_pressed_key(context->get_last_touch_device_id(), min_dist_index);
260 if (button_context) {
261 button_context->state = BUTTON_STATE_NORMAL;
264 windows->update_window(window, coordinate->x, coordinate->y, coordinate->width, coordinate->height);
272 bool CSCLWindows::close_popup(sclwindow window)
274 printf("close_popup window (%p) \n",window);
276 CSCLKeyFocusHandler *focus_handler = CSCLKeyFocusHandler::get_instance();
278 focus_handler->popup_closed(window);
280 pop_window_in_Z_order_list(window);
282 hide_window(get_dim_window());
284 return destroy_window(window);
287 bool CSCLWindows::close_all_popups(sclwindow skip_window /* = SCLWINDOW_INVALID */)
289 sclboolean all_closed = TRUE;
290 /* Close all the popup windows except the targetWindow */
294 window = get_nth_popup_window(loop);
296 if (window != skip_window) {
305 /* If there is a popup still opened, don't destroy POPUP_TIMEOUT timer */
310 CSCLWindows::create_base_window(const sclwindow parent, scl16 width, scl16 height)
315 m_base_window_context.hidden = TRUE;
316 m_base_window_context.geometry.width = width;
317 m_base_window_context.geometry.height = height;
318 m_base_window_context.is_virtual = FALSE;
319 m_base_window_context.popup_type = POPUP_TYPE_NONE;
320 m_base_window_context.opener.window = parent;
321 m_base_window_context.geometry.x = m_base_window_context.geometry.y = 0;
322 m_base_window_context.etc_info = NULL;
323 m_base_window_context.window =
324 get_scl_windows_impl()->create_base_window(parent, &m_base_window_context, width, height);
326 push_window_in_Z_order_list(m_base_window_context.window);
329 // Update the position information
330 //get_window_context(parent, TRUE);
332 return m_base_window_context.window;
336 * Creates a new top-level window
339 * CSCLGwes* gwes = CSCLGwes::get_instance();
340 * sclwindow popupWindow = gwes->m_windows->create_window(window, 100, 500, 200, 100, 4, POPUP_TYPE_BTN_RELEASE_POPUP, FALSE);
341 * if (popupWindow != NULL) {
342 * gwes->m_events->connect_window_events(popupWindow, SCL_EVENT_MOUSE | SCL_EVENT_EXPOSE);
343 * cache->recompute_layout(popupWindow);
344 * gwes->m_windows->show_window(popupWindow);
348 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)
352 CSCLWindowsImpl* impl = get_scl_windows_impl();
353 sclwindow window = SCLWINDOW_INVALID;
356 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
357 if (m_popup_window_context[loop].window == SCLWINDOW_INVALID) {
358 m_popup_window_context[loop].hidden = TRUE;
359 m_popup_window_context[loop].opener = opener;
360 m_popup_window_context[loop].etc_info = NULL;
361 m_popup_window_context[loop].inputmode = inputmode;
362 m_popup_window_context[loop].layout = layout;
363 m_popup_window_context[loop].popup_type = popup_type;
364 m_popup_window_context[loop].is_virtual = is_virtual;
366 m_popup_window_context[loop].geometry = geometry;
368 m_popup_window_context[loop].layout_image_offset.x = img_offset_x;
369 m_popup_window_context[loop].layout_image_offset.y = img_offset_y;
371 m_popup_window_context[loop].timeout = timeout;
374 window = impl->create_window(opener.window,
375 &(m_popup_window_context[loop]), geometry.width, geometry.height);
377 window = reinterpret_cast<sclwindow>(loop + 1);
380 m_popup_window_context[loop].window = window;
382 //set_window_rotation(window, context->get_rotation_degree());
383 if (!m_popup_window_context[loop].is_virtual) {
384 impl->move_window(window, geometry.x, geometry.y);
390 // Update the position information
391 //get_window_context(window, TRUE);
393 if (window == NULL) {
394 printf("Failed to create a new window. The size of window buffer has exeeded.\n");
401 CSCLWindows::create_magnifier_window(const sclwindow parent, scl16 x, scl16 y, scl16 width, scl16 height)
405 CSCLWindowsImpl* impl = get_scl_windows_impl();
406 sclwindow window = SCLWINDOW_INVALID;
408 if (impl && m_initialized) {
409 if (m_magnifier_window_context.window == SCLWINDOW_INVALID) {
410 window = impl->create_magnifier_window(parent, &m_magnifier_window_context, width, height);
411 impl->set_keep_above(window, TRUE);
413 m_magnifier_window_context.window = window;
414 m_magnifier_window_context.geometry.width = width;
415 m_magnifier_window_context.geometry.height = height;
416 m_magnifier_window_context.hidden = TRUE;
419 window = m_magnifier_window_context.window;
421 set_parent(parent, window);
423 if (window == NULL) {
424 printf("Failed to create a new window. The size of window buffer has exeeded.\n");
426 printf("Magnifier Window %p created\n", window);
430 // Update the position information
431 //get_window_context(window, TRUE);
437 CSCLWindows::get_magnifier_window()
440 return m_magnifier_window_context.window;
444 CSCLWindows::create_dim_window(const sclwindow parent, SclWindowContext *window_context, scl16 width, scl16 height)
448 CSCLWindowsImpl* impl = get_scl_windows_impl();
449 sclwindow window = SCLWINDOW_INVALID;
451 SclResParserManager *sclres_manager = SclResParserManager::get_instance();
452 PSclDefaultConfigure default_configure = NULL;
453 if (sclres_manager) {
454 default_configure = sclres_manager->get_default_configure();
457 if (impl && m_initialized && default_configure) {
458 if (m_dim_window_context.window == NULL) {
459 m_dim_window_context.hidden = TRUE;
460 if (default_configure->use_actual_dim_window) {
461 window = impl->create_dim_window(parent, &m_dim_window_context, width, height);
463 window = reinterpret_cast<sclwindow>(SCLWINDOW_VIRTUAL_DIM);
464 m_dim_window_context.is_virtual = TRUE;
467 m_dim_window_context.window = window;
470 window = m_dim_window_context.window;
473 if (window == NULL) {
474 printf("Failed to create a new window. The size of window buffer has exeeded.\n");
482 CSCLWindows::get_dim_window()
485 return m_dim_window_context.window;
489 CSCLWindows::destroy_window(sclwindow window)
493 CSCLWindowsImpl* impl = get_scl_windows_impl();
494 sclboolean ret = FALSE;
497 if (window == m_base_window_context.window) {
498 impl->destroy_window(window);
499 memset(&m_base_window_context, 0x00, sizeof(SclWindowContext));
500 m_base_window_context.window = SCLWINDOW_INVALID;
502 } else if (window == m_magnifier_window_context.window) {
503 impl->destroy_window(window);
504 memset(&m_magnifier_window_context, 0x00, sizeof(SclWindowContext));
505 m_magnifier_window_context.window = SCLWINDOW_INVALID;
507 } else if (window == m_dim_window_context.window) {
508 impl->destroy_window(window);
509 memset(&m_dim_window_context, 0x00, sizeof(SclWindowContext));
510 m_dim_window_context.window = SCLWINDOW_INVALID;
513 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
514 if (m_popup_window_context[loop].window == window) {
515 impl->destroy_window(window);
516 memset(&m_popup_window_context[loop], 0x00, sizeof(SclWindowContext));
518 m_popup_window_context[loop].window = SCLWINDOW_INVALID;
529 CSCLWindows::get_base_window()
533 return m_base_window_context.window;
537 CSCLWindows::is_base_window(sclwindow window)
541 sclboolean ret = FALSE;
543 if (window != SCLWINDOW_INVALID) {
544 if (window == m_base_window_context.window) {
553 CSCLWindows::find_by_etcinfo( void* etc_info )
557 sclwindow ret = SCLWINDOW_INVALID;
559 if (etc_info == m_base_window_context.etc_info) {
560 ret = m_base_window_context.window;
561 } else if (etc_info == m_magnifier_window_context.etc_info) {
562 ret = m_magnifier_window_context.window;
563 } else if (etc_info == m_dim_window_context.etc_info) {
564 ret = m_dim_window_context.window;
566 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
567 if (etc_info == m_popup_window_context[loop].etc_info) {
568 ret = m_popup_window_context[loop].window;
578 //CSCLWindows::get_window_context(sclwindow window, sclboolean geometry_update)
579 CSCLWindows::get_window_context(sclwindow window)
583 SclWindowContext* ret = NULL;
585 if (window == m_base_window_context.window) {
586 /*if (geometry_update) {
588 get_window_rect(window, &rect);
589 m_base_window_context.geometry.x = rect.x;
590 m_base_window_context.geometry.y = rect.y;
592 ret = &m_base_window_context;
593 } else if (window == m_magnifier_window_context.window) {
594 ret = &m_magnifier_window_context;
595 } else if (window == m_dim_window_context.window) {
596 ret = &m_dim_window_context;
598 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
599 if (m_popup_window_context[loop].window == window) {
600 /*if (geometry_update) {
602 get_window_rect(window, &rect);
603 m_popup_window_context[loop].geometry.x = rect.x;
604 m_popup_window_context[loop].geometry.y = rect.y;
606 ret = &m_popup_window_context[loop];
616 CSCLWindows::set_window_context(sclwindow window, SclWindowContext* context)
620 if (window == m_base_window_context.window) {
621 memcpy(&m_base_window_context,context, sizeof(SclWindowContext));
623 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
624 if (m_popup_window_context[loop].window == window) {
625 memcpy(&m_popup_window_context[loop], context, sizeof(SclWindowContext));
633 CSCLWindows::find_popup_window_index(sclwindow window)
639 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
640 if (m_popup_window_context[loop].window == window) {
650 CSCLWindows::move_window(const sclwindow window, scl16 x, scl16 y)
654 sclboolean is_virtual = FALSE;
655 if (window == m_base_window_context.window) {
656 m_base_window_context.geometry.x = x;
657 m_base_window_context.geometry.y = y;
658 is_virtual = m_base_window_context.is_virtual;
659 } else if (window == m_magnifier_window_context.window) {
660 m_magnifier_window_context.geometry.x = x;
661 m_magnifier_window_context.geometry.y = y;
662 is_virtual = m_magnifier_window_context.is_virtual;
663 } else if (window == m_dim_window_context.window) {
664 m_dim_window_context.geometry.x = x;
665 m_dim_window_context.geometry.y = y;
666 is_virtual = m_dim_window_context.is_virtual;
668 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
669 if (m_popup_window_context[loop].window == window) {
670 m_popup_window_context[loop].geometry.x = x;
671 m_popup_window_context[loop].geometry.y = y;
672 is_virtual = m_popup_window_context[loop].is_virtual;
678 CSCLWindowsImpl* impl = get_scl_windows_impl();
680 impl->move_window(window, x, y);
686 CSCLWindows::resize_window(const sclwindow window, scl16 width, scl16 height)
690 sclboolean is_virtual = FALSE;
691 if (window == m_base_window_context.window) {
692 m_base_window_context.geometry.width = width;
693 m_base_window_context.geometry.height = height;
694 is_virtual = m_base_window_context.is_virtual;
695 } else if (window == m_magnifier_window_context.window) {
696 m_magnifier_window_context.geometry.width = width;
697 m_magnifier_window_context.geometry.height = height;
698 is_virtual = m_magnifier_window_context.is_virtual;
699 } else if (window == m_dim_window_context.window) {
700 m_dim_window_context.geometry.width = width;
701 m_dim_window_context.geometry.height = height;
702 is_virtual = m_dim_window_context.is_virtual;
704 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
705 if (m_popup_window_context[loop].window == window) {
706 m_popup_window_context[loop].geometry.width = width;
707 m_popup_window_context[loop].geometry.height = height;
708 is_virtual = m_popup_window_context[loop].is_virtual;
714 CSCLWindowsImpl* impl = get_scl_windows_impl();
716 impl->resize_window(window, width, height);
722 CSCLWindows::move_resize_window(const sclwindow window, scl16 x, scl16 y, scl16 width, scl16 height)
726 sclboolean is_virtual = FALSE;
727 if (window == m_base_window_context.window) {
728 m_base_window_context.geometry.x = x;
729 m_base_window_context.geometry.y = y;
730 m_base_window_context.geometry.width = width;
731 m_base_window_context.geometry.height = height;
732 is_virtual = m_base_window_context.is_virtual;
733 } else if (window == m_magnifier_window_context.window) {
734 m_magnifier_window_context.geometry.x = x;
735 m_magnifier_window_context.geometry.y = y;
736 m_magnifier_window_context.geometry.width = width;
737 m_magnifier_window_context.geometry.height = height;
738 is_virtual = m_magnifier_window_context.is_virtual;
739 } else if (window == m_dim_window_context.window) {
740 m_dim_window_context.geometry.x = x;
741 m_dim_window_context.geometry.y = y;
742 m_dim_window_context.geometry.width = width;
743 m_dim_window_context.geometry.height = height;
744 is_virtual = m_dim_window_context.is_virtual;
746 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
747 if (m_popup_window_context[loop].window == window) {
748 m_popup_window_context[loop].geometry.x = x;
749 m_popup_window_context[loop].geometry.y = y;
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->move_resize_window(window, x, y, width, height);
766 /* Push given window into a Z-order list */
767 void CSCLWindows::push_window_in_Z_order_list(sclwindow window)
773 for (loop = 0;loop < MAX_ZORDER_NUM;loop++) {
774 if (m_Z_order_list[loop] == SCLWINDOW_INVALID) {
775 m_Z_order_list[loop] = window;
781 /* Pop given window from a Z-order list */
782 void CSCLWindows::pop_window_in_Z_order_list(sclwindow window)
787 sclboolean found = FALSE;
789 for (loop = 0;loop < MAX_ZORDER_NUM - 1;loop++) {
790 if (m_Z_order_list[loop] == window || found) {
792 m_Z_order_list[loop] = m_Z_order_list[loop + 1];
796 m_Z_order_list[MAX_ZORDER_NUM - 1] = SCLWINDOW_INVALID;
799 /* Search n-th window in the Z-order stack, starting from the top (TOPMOST window would be the 0 index) */
800 sclwindow CSCLWindows::get_nth_window_in_Z_order_list(sclbyte index)
806 for (loop = MAX_ZORDER_NUM - 1;loop >= 0;loop--) {
807 if (m_Z_order_list[loop] != SCLWINDOW_INVALID) {
809 return m_Z_order_list[loop];
815 return SCLWINDOW_INVALID;
818 sclwindow CSCLWindows::get_nth_popup_window( sclbyte index )
822 scl_assert_return_null(index >= 0 && index < MAX_POPUP_WINDOW);
824 if (index < MAX_POPUP_WINDOW) {
825 return m_popup_window_context[index].window;
828 return SCLWINDOW_INVALID;
831 sclbyte CSCLWindows::get_Z_order(sclwindow window)
836 for (loop = 0;loop < MAX_ZORDER_NUM;loop++) {
837 if (m_Z_order_list[loop] == window) {
844 void CSCLWindows::set_parent( const sclwindow parent, const sclwindow window )
846 /* Do not set parent if the window is a virtual window */
847 //SclWindowContext *window_context = get_window_context(window, FALSE);
848 SclWindowContext *window_context = get_window_context(window);
849 if (window_context) {
850 if (!(window_context->is_virtual)) {
851 CSCLWindowsImpl* impl = get_scl_windows_impl();
853 impl->set_parent(parent, window);
859 void CSCLWindows::set_window_rotation(const sclwindow window, SCLRotation rotation)
863 CSCLWindowsImpl* impl = get_scl_windows_impl();
866 if (window == NULL) {
867 impl->set_window_rotation(m_base_window_context.window, rotation);
868 if (SCLWINDOW_INVALID != m_magnifier_window_context.window) {
869 CSCLUtils *utils = CSCLUtils::get_instance();
871 SclResParserManager *sclres_manager = SclResParserManager::get_instance();
872 PSclMagnifierWndConfigure magnifier_configure = NULL;
873 if (sclres_manager) {
874 magnifier_configure = sclres_manager->get_magnifier_configure();
876 if (magnifier_configure) {
877 m_magnifier_window_context.geometry.width =
878 magnifier_configure->width * utils->get_custom_scale_rate_x();
879 m_magnifier_window_context.geometry.height =
880 magnifier_configure->height * utils->get_custom_scale_rate_y();
882 impl->set_window_rotation(m_magnifier_window_context.window, rotation);
886 if (SCLWINDOW_INVALID != m_dim_window_context.window) {
887 /* For indivisual window rotation */
888 impl->set_window_rotation(m_dim_window_context.window, rotation);
889 //resize_window(m_dim_window_context.window, m_base_window_context.width, m_base_winctx.height);
890 //move_window(m_dim_window_context.window, m_base_window_context.x, m_base_winctx.y);
891 hide_window(m_dim_window_context.window);
893 /* For indivisual window rotation
894 for (int loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
895 if (m_popup_window_context[loop].window != SCLWINDOW_INVALID) {
896 if (!m_popup_window_context[loop].isVirtual) {
897 get_scl_windows_impl()->set_window_rotation(m_popup_window_context[loop].window, degree);
903 impl->set_window_rotation(window, rotation);
904 printf("## set_window_rotation : %d \n", rotation);
908 // Update the position information
909 //get_window_context(window, TRUE);
910 SclWindowContext *window_context = get_window_context(window);
911 if (window_context) {
912 get_window_rect(window, &(window_context->geometry));
918 CSCLWindows::show_window(const sclwindow window, sclboolean queue /*= FALSE*/)
922 if (window == m_base_window_context.window) {
923 m_base_window_context.hidden = FALSE;
924 } else if (window == m_magnifier_window_context.window) {
925 m_magnifier_window_context.hidden = FALSE;
926 } else if (window == m_dim_window_context.window) {
927 m_dim_window_context.hidden = FALSE;
929 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
930 if (m_popup_window_context[loop].window == window) {
931 m_popup_window_context[loop].hidden = FALSE;
937 CSCLWindowsImpl* impl = get_scl_windows_impl();
939 impl->show_window(window, queue);
944 CSCLWindows::hide_window(const sclwindow window, sclboolean force /*= FALSE*/)
948 if (window == m_base_window_context.window) {
949 m_base_window_context.hidden = TRUE;
950 } else if (window == m_magnifier_window_context.window) {
951 m_magnifier_window_context.hidden = TRUE;
952 } else if (window == m_dim_window_context.window) {
953 m_dim_window_context.hidden = TRUE;
955 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
956 if (m_popup_window_context[loop].window == window) {
957 m_popup_window_context[loop].hidden = TRUE;
963 CSCLWindowsImpl* impl = get_scl_windows_impl();
965 impl->hide_window(window, force);
970 CSCLWindows::set_keep_above(const sclwindow window, sclboolean keep_above)
972 CSCLWindowsImpl* impl = get_scl_windows_impl();
974 impl->set_keep_above(window, keep_above);
979 CSCLWindows::set_update_pending(sclboolean pend)
981 m_pending_update = pend;
983 update_window(m_base_window_context.window);
988 CSCLWindows::get_update_pending()
990 return m_pending_update;
994 CSCLWindows::update_window(const sclwindow window,
995 scl16 x /*= 0*/, scl16 y /*= 0*/, scl16 width /*= 0*/, scl16 height /*= 0*/ )
997 if (!m_pending_update) {
998 CSCLWindowsImpl* impl = get_scl_windows_impl();
1000 impl->update_window(window, x, y, width, height);
1006 CSCLWindows::get_window_rect(const sclwindow window, SclRectangle *rect) {
1009 sclboolean is_virtual = FALSE;
1010 sclboolean ret = FALSE;
1012 if (window == m_base_window_context.window) {
1013 is_virtual = m_base_window_context.is_virtual;
1015 *rect = m_base_window_context.geometry;
1017 } else if (window == m_magnifier_window_context.window) {
1018 is_virtual = m_magnifier_window_context.is_virtual;
1020 *rect = m_magnifier_window_context.geometry;
1022 } else if (window == m_dim_window_context.window) {
1023 is_virtual = m_dim_window_context.is_virtual;
1025 *rect = m_dim_window_context.geometry;
1028 for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
1029 if (m_popup_window_context[loop].window == window) {
1030 is_virtual = m_popup_window_context[loop].is_virtual;
1032 *rect = m_popup_window_context[loop].geometry;
1040 CSCLWindowsImpl* impl = get_scl_windows_impl();
1042 ret = impl->get_window_rect(window, rect);