diff options
| author | Bernard Xiong <[email protected]> | 2013-02-21 13:11:10 +0800 |
|---|---|---|
| committer | Bernard Xiong <[email protected]> | 2013-02-21 13:11:10 +0800 |
| commit | 385f682d7bfce81ba281faaffb0a250ab94985b8 (patch) | |
| tree | 94fca413db98390d21dc18938067a7a90e470a6f /components/rtgui/server | |
| parent | c4bd0023f8da136c5788f47f9a0170a77f627be9 (diff) | |
remove RT-Thread GUI from RT-Thread temporary
Diffstat (limited to 'components/rtgui/server')
| -rw-r--r-- | components/rtgui/server/driver.c | 139 | ||||
| -rw-r--r-- | components/rtgui/server/mouse.c | 682 | ||||
| -rw-r--r-- | components/rtgui/server/mouse.h | 56 | ||||
| -rw-r--r-- | components/rtgui/server/server.c | 415 | ||||
| -rw-r--r-- | components/rtgui/server/topwin.c | 1177 | ||||
| -rw-r--r-- | components/rtgui/server/topwin.h | 57 |
6 files changed, 0 insertions, 2526 deletions
diff --git a/components/rtgui/server/driver.c b/components/rtgui/server/driver.c deleted file mode 100644 index dd441afb88..0000000000 --- a/components/rtgui/server/driver.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - * File : driver.c - * This file is part of RTGUI in RT-Thread RTOS - * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rt-thread.org/license/LICENSE - * - * Change Logs: - * Date Author Notes - * 2009-10-04 Bernard first version - */ -#include <rtthread.h> -#include <rtgui/driver.h> - -struct rtgui_graphic_driver _driver; - -extern const struct rtgui_graphic_driver_ops *rtgui_pixel_device_get_ops(int pixel_format); -extern const struct rtgui_graphic_driver_ops *rtgui_framebuffer_get_ops(int pixel_format); - -/* get default driver */ -struct rtgui_graphic_driver *rtgui_graphic_driver_get_default() -{ - return &_driver; -} -RTM_EXPORT(rtgui_graphic_driver_get_default); - -void rtgui_graphic_driver_get_rect(const struct rtgui_graphic_driver *driver, rtgui_rect_t *rect) -{ - RT_ASSERT(rect != RT_NULL); - RT_ASSERT(driver != RT_NULL); - - rect->x1 = rect->y1 = 0; - rect->x2 = driver->width; - rect->y2 = driver->height; -} -RTM_EXPORT(rtgui_graphic_driver_get_rect); - -rt_err_t rtgui_graphic_set_device(rt_device_t device) -{ - rt_err_t result; - struct rt_device_graphic_info info; - struct rtgui_graphic_ext_ops *ext_ops; - - /* get framebuffer address */ - result = rt_device_control(device, RTGRAPHIC_CTRL_GET_INFO, &info); - if (result != RT_EOK) - { - /* get device information failed */ - return -RT_ERROR; - } - - /* initialize framebuffer driver */ - _driver.device = device; - _driver.pixel_format = info.pixel_format; - _driver.bits_per_pixel = info.bits_per_pixel; - _driver.width = info.width; - _driver.height = info.height; - _driver.pitch = _driver.width * _driver.bits_per_pixel / 8; - _driver.framebuffer = info.framebuffer; - - /* get graphic extension operations */ - result = rt_device_control(device, RTGRAPHIC_CTRL_GET_EXT, &ext_ops); - if (result == RT_EOK) - { - _driver.ext_ops = ext_ops; - } - - if (info.framebuffer != RT_NULL) - { - /* is a frame buffer device */ - _driver.ops = rtgui_framebuffer_get_ops(_driver.pixel_format); - } - else - { - /* is a pixel device */ - _driver.ops = rtgui_pixel_device_get_ops(_driver.pixel_format); - } - -#ifdef RTGUI_USING_HW_CURSOR - /* set default cursor image */ - rtgui_cursor_set_image(RTGUI_CURSOR_ARROW); -#endif - - return RT_EOK; -} -RTM_EXPORT(rtgui_graphic_set_device); - -/* screen update */ -void rtgui_graphic_driver_screen_update(const struct rtgui_graphic_driver *driver, rtgui_rect_t *rect) -{ - struct rt_device_rect_info rect_info; - - rect_info.x = rect->x1; - rect_info.y = rect->y1; - rect_info.width = rect->x2 - rect->x1; - rect_info.height = rect->y2 - rect->y1; - rt_device_control(driver->device, RTGRAPHIC_CTRL_RECT_UPDATE, &rect_info); -} -RTM_EXPORT(rtgui_graphic_driver_screen_update); - -/* get video frame buffer */ -rt_uint8_t *rtgui_graphic_driver_get_framebuffer(const struct rtgui_graphic_driver *driver) -{ - return (rt_uint8_t *)driver->framebuffer; -} -RTM_EXPORT(rtgui_graphic_driver_get_framebuffer); - -rt_uint8_t *rtgui_graphic_driver_get_default_framebuffer(void) -{ - return rtgui_graphic_driver_get_framebuffer(&_driver); -} -RTM_EXPORT(rtgui_graphic_driver_get_default_framebuffer); - -#ifdef RTGUI_USING_HW_CURSOR -void rtgui_cursor_set_position(rt_uint16_t x, rt_uint16_t y) -{ - rt_uint32_t value; - - if (_driver.device != RT_NULL) - { - value = (x << 16 | y); - rt_device_control(_driver.device, RT_DEVICE_CTRL_CURSOR_SET_POSITION, &value); - } -} - -void rtgui_cursor_set_image(enum rtgui_cursor_type type) -{ - rt_uint32_t value; - - if (_driver.device != RT_NULL) - { - value = type; - rt_device_control(_driver.device, RT_DEVICE_CTRL_CURSOR_SET_TYPE, &value); - } -}; -#endif - diff --git a/components/rtgui/server/mouse.c b/components/rtgui/server/mouse.c deleted file mode 100644 index 0fff8f101c..0000000000 --- a/components/rtgui/server/mouse.c +++ /dev/null @@ -1,682 +0,0 @@ -/* - * File : mouse.c - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rt-thread.org/license/LICENSE - * - * Change Logs: - * Date Author Notes - * 2009-10-16 Bernard first version - */ - -#include "mouse.h" -#include <rtgui/region.h> -#include <rtgui/driver.h> -#include <rtgui/rtgui_system.h> - -struct rtgui_cursor -{ - /* screen byte per pixel */ - rt_uint16_t bpp; - - /* screen pitch */ - rt_uint16_t screen_pitch; - - /* current cursor x and y */ - rt_uint16_t cx, cy; - -#ifdef RTGUI_USING_MOUSE_CURSOR - /* cursor pitch */ - rt_uint16_t cursor_pitch; - - /* show cursor and show cursor count */ - rt_bool_t show_cursor; - rt_base_t show_cursor_count; - - /* cursor rect info */ - rtgui_rect_t rect; - - /* cursor image and saved cursor */ - rtgui_image_t *cursor_image; - rt_uint8_t *cursor_saved; -#endif - -#ifdef RTGUI_USING_WINMOVE - /* move window rect and border */ - struct rtgui_topwin *topwin; - rtgui_rect_t win_rect; - rt_uint8_t *win_left, *win_right; - rt_uint8_t *win_top, *win_bottom; - rt_bool_t win_rect_show, win_rect_has_saved; -#endif -}; - -struct rtgui_cursor *_rtgui_cursor; - -#ifdef RTGUI_USING_MOUSE_CURSOR -struct rt_mutex cursor_mutex; -static const rt_uint8_t *cursor_xpm[] = -{ - "16 16 35 1", - " c None", - ". c #A0B8D0", - "+ c #F0F0F0", - "@ c #FFFFFF", - "# c #F0F8F0", - "$ c #A0B0D0", - "% c #90A8C0", - "& c #A0B0C0", - "* c #E0E8F0", - "= c #8090B0", - "- c #D0D8E0", - "; c #7080A0", - "> c #90A0B0", - ", c #FFF8FF", - "' c #F0F8FF", - ") c #607090", - "! c #8098B0", - "~ c #405060", - "{ c #405070", - "] c #506070", - "^ c #607080", - "/ c #708090", - "( c #7088A0", - "_ c #D0D0E0", - ": c #607890", - "< c #C0D0E0", - "[ c #C0C8D0", - "} c #506880", - "| c #5F778F", - "1 c #D0D8F0", - "2 c #506080", - "3 c #C0C8E0", - "4 c #A0A8C0", - "5 c #405870", - "6 c #5F6F8F", - " . ", - " .. ", - " .+. ", - " .@#$ ", - " $@@+% ", - " &@@@*= ", - " %@@@@-; ", - " >@@,''-) ", - " !,''+)~{] ", - " ='-^*/ ", - " (_{:<[^ ", - " ;} |:12 ", - " / )345 ", - " 6}${ ", - " 5{ ", - " " -}; - -static void rtgui_cursor_restore(void); -static void rtgui_cursor_save(void); -static void rtgui_cursor_show(void); -#endif - -#ifdef RTGUI_USING_WINMOVE -static void rtgui_winrect_restore(void); -static void rtgui_winrect_save(void); -static void rtgui_winrect_show(void); -#endif - -#define WIN_MOVE_BORDER 4 -void rtgui_mouse_init(void) -{ - const struct rtgui_graphic_driver *gd = rtgui_graphic_driver_get_default(); - - if (_rtgui_cursor != RT_NULL) rtgui_mouse_fini(); - - _rtgui_cursor = (struct rtgui_cursor *) rtgui_malloc(sizeof(struct rtgui_cursor)); - rt_memset(_rtgui_cursor, 0, sizeof(struct rtgui_cursor)); - -#ifdef RTGUI_USING_MOUSE_CURSOR - rt_mutex_init(&cursor_mutex, "cursor", RT_IPC_FLAG_FIFO); -#endif - - /* init cursor */ - _rtgui_cursor->bpp = gd->bits_per_pixel / 8; - _rtgui_cursor->screen_pitch = _rtgui_cursor->bpp * gd->width; - -#ifdef RTGUI_USING_MOUSE_CURSOR - /* init cursor image */ - _rtgui_cursor->cursor_image = rtgui_image_create_from_mem("xpm", - (rt_uint8_t *)cursor_xpm, - sizeof(cursor_xpm), - RT_TRUE); - if (_rtgui_cursor->cursor_image == RT_NULL) - { - rtgui_free(_rtgui_cursor); - _rtgui_cursor = RT_NULL; - - return; - } - - /* init rect */ - _rtgui_cursor->rect.x1 = _rtgui_cursor->rect.y1 = 0; - _rtgui_cursor->rect.x2 = _rtgui_cursor->cursor_image->w; - _rtgui_cursor->rect.y2 = _rtgui_cursor->cursor_image->h; - - _rtgui_cursor->cursor_pitch = _rtgui_cursor->cursor_image->w * _rtgui_cursor->bpp; - - _rtgui_cursor->show_cursor = RT_TRUE; - _rtgui_cursor->show_cursor_count = 0; - _rtgui_cursor->cursor_saved = rtgui_malloc(_rtgui_cursor->cursor_image->w * - _rtgui_cursor->cursor_image->h * _rtgui_cursor->bpp); -#endif - -#ifdef RTGUI_USING_WINMOVE - /* init window move save image */ - _rtgui_cursor->win_rect_has_saved = RT_FALSE; - _rtgui_cursor->win_rect_show = RT_FALSE; - - _rtgui_cursor->win_left = rtgui_malloc(_rtgui_cursor->bpp * gd->height * WIN_MOVE_BORDER); - _rtgui_cursor->win_right = rtgui_malloc(_rtgui_cursor->bpp * gd->height * WIN_MOVE_BORDER); - _rtgui_cursor->win_top = rtgui_malloc(_rtgui_cursor->bpp * gd->width * WIN_MOVE_BORDER); - _rtgui_cursor->win_bottom = rtgui_malloc(_rtgui_cursor->bpp * gd->width * WIN_MOVE_BORDER); -#endif -} - -void rtgui_mouse_fini(void) -{ - if (_rtgui_cursor != RT_NULL) - { -#ifdef RTGUI_USING_WINMOVE - rtgui_free(_rtgui_cursor->win_left); - rtgui_free(_rtgui_cursor->win_right); - rtgui_free(_rtgui_cursor->win_top); - rtgui_free(_rtgui_cursor->win_bottom); -#endif -#ifdef RTGUI_USING_MOUSE_CURSOR - rt_mutex_detach(&cursor_mutex); - rtgui_image_destroy(_rtgui_cursor->cursor_image); - rtgui_free(_rtgui_cursor->cursor_saved); -#endif - rtgui_free(_rtgui_cursor); - - _rtgui_cursor = RT_NULL; - } -} - -void rtgui_mouse_moveto(int x, int y) -{ -#ifdef RTGUI_USING_MOUSE_CURSOR - rt_mutex_take(&cursor_mutex, RT_WAITING_FOREVER); -#endif - - if (x != _rtgui_cursor->cx || - y != _rtgui_cursor->cy) - { -#ifdef RTGUI_USING_WINMOVE - if (_rtgui_cursor->win_rect_show) - { - if (_rtgui_cursor->win_rect_has_saved == RT_TRUE) - { - rtgui_winrect_restore(); - } - -#ifdef RTGUI_USING_MOUSE_CURSOR - rtgui_mouse_hide_cursor(); -#endif - - /* move winrect */ - rtgui_rect_moveto(&(_rtgui_cursor->win_rect), x - _rtgui_cursor->cx, - y - _rtgui_cursor->cy); - rtgui_winrect_save(); - - /* move current cursor */ - _rtgui_cursor->cx = x; - _rtgui_cursor->cy = y; - -#ifdef RTGUI_USING_MOUSE_CURSOR - /* show cursor */ - rtgui_mouse_show_cursor(); -#endif - /* show winrect */ - rtgui_winrect_show(); - } - else -#endif - { -#ifdef RTGUI_USING_MOUSE_CURSOR - rtgui_mouse_hide_cursor(); -#endif - /* move current cursor */ - _rtgui_cursor->cx = x; - _rtgui_cursor->cy = y; - -#ifdef RTGUI_USING_MOUSE_CURSOR - /* show cursor */ - rtgui_mouse_show_cursor(); -#endif - } - -#ifdef RTGUI_USING_HW_CURSOR - rtgui_cursor_set_position(_rtgui_cursor->cx, _rtgui_cursor->cy); -#endif - } - -#ifdef RTGUI_USING_MOUSE_CURSOR - rt_mutex_release(&cursor_mutex); -#endif -} - -void rtgui_mouse_set_position(int x, int y) -{ - /* move current cursor */ - _rtgui_cursor->cx = x; - _rtgui_cursor->cy = y; - -#ifdef RTGUI_USING_HW_CURSOR - rtgui_cursor_set_position(_rtgui_cursor->cx, _rtgui_cursor->cy); -#endif -} - -#ifdef RTGUI_USING_MOUSE_CURSOR -void rtgui_mouse_set_cursor_enable(rt_bool_t enable) -{ - _rtgui_cursor->show_cursor = enable; -} - -/* set current cursor image */ -void rtgui_mouse_set_cursor(rtgui_image_t *cursor) -{ -} - -void rtgui_mouse_get_cursor_rect(rtgui_rect_t *rect) -{ - if (rect != RT_NULL) - { - *rect = _rtgui_cursor->rect; - } -} - -void rtgui_mouse_show_cursor() -{ - if (_rtgui_cursor->show_cursor == RT_FALSE) - return; - - _rtgui_cursor->show_cursor_count ++; - if (_rtgui_cursor->show_cursor_count == 1) - { - /* save show mouse area */ - rtgui_cursor_save(); - - /* show mouse cursor */ - rtgui_cursor_show(); - } -} - -void rtgui_mouse_hide_cursor() -{ - if (_rtgui_cursor->show_cursor == RT_FALSE) - return; - - if (_rtgui_cursor->show_cursor_count == 1) - { - /* display the cursor coverage area */ - rtgui_cursor_restore(); - } - _rtgui_cursor->show_cursor_count --; -} - -rt_bool_t rtgui_mouse_is_intersect(rtgui_rect_t *r) -{ - return rtgui_rect_is_intersect(&(_rtgui_cursor->rect), r) == RT_EOK ? RT_TRUE : RT_FALSE; -} - -/* display the saved cursor area to screen */ -static void rtgui_cursor_restore() -{ - rt_base_t idx, height, cursor_pitch; - rt_uint8_t *cursor_ptr, *fb_ptr; - - fb_ptr = rtgui_graphic_driver_get_default_framebuffer() + _rtgui_cursor->cy * _rtgui_cursor->screen_pitch - + _rtgui_cursor->cx * _rtgui_cursor->bpp; - cursor_ptr = _rtgui_cursor->cursor_saved; - - height = (_rtgui_cursor->cy + _rtgui_cursor->cursor_image->h < - rtgui_graphic_driver_get_default()->height) ? _rtgui_cursor->cursor_image->h : - rtgui_graphic_driver_get_default()->height - _rtgui_cursor->cy; - - cursor_pitch = (_rtgui_cursor->cx + _rtgui_cursor->cursor_image->w < - rtgui_graphic_driver_get_default()->width) ? _rtgui_cursor->cursor_pitch : - (rtgui_graphic_driver_get_default()->width - _rtgui_cursor->cx) * _rtgui_cursor->bpp; - - for (idx = 0; idx < height; idx ++) - { - rt_memcpy(fb_ptr, cursor_ptr, cursor_pitch); - - fb_ptr += _rtgui_cursor->screen_pitch; - cursor_ptr += _rtgui_cursor->cursor_pitch; - } -} - -/* save the cursor coverage area from screen */ -static void rtgui_cursor_save() -{ - rt_base_t idx, height, cursor_pitch; - rt_uint8_t *cursor_ptr, *fb_ptr; - - fb_ptr = rtgui_graphic_driver_get_default_framebuffer() + _rtgui_cursor->cy * _rtgui_cursor->screen_pitch + - _rtgui_cursor->cx * _rtgui_cursor->bpp; - cursor_ptr = _rtgui_cursor->cursor_saved; - - height = (_rtgui_cursor->cy + _rtgui_cursor->cursor_image->h < - rtgui_graphic_driver_get_default()->height) ? _rtgui_cursor->cursor_image->h : - rtgui_graphic_driver_get_default()->height - _rtgui_cursor->cy; - - cursor_pitch = (_rtgui_cursor->cx + _rtgui_cursor->cursor_image->w < - rtgui_graphic_driver_get_default()->width) ? _rtgui_cursor->cursor_pitch : - (rtgui_graphic_driver_get_default()->width - _rtgui_cursor->cx) * _rtgui_cursor->bpp; - - for (idx = 0; idx < height; idx ++) - { - rt_memcpy(cursor_ptr, fb_ptr, cursor_pitch); - - fb_ptr += _rtgui_cursor->screen_pitch; - cursor_ptr += _rtgui_cursor->cursor_pitch; - } -} - -static void rtgui_cursor_show() -{ - // FIXME: the prototype of set_pixel is using int so we have to use int - // as well. Might be uniformed with others in the future - int x, y; - rtgui_color_t *ptr; - rtgui_rect_t rect; - void (*set_pixel)(rtgui_color_t * c, int x, int y); - - ptr = (rtgui_color_t *) _rtgui_cursor->cursor_image->data; - set_pixel = rtgui_graphic_driver_get_default()->ops->set_pixel; - - rtgui_mouse_get_cursor_rect(&rect); - rtgui_rect_moveto(&rect, _rtgui_cursor->cx, _rtgui_cursor->cy); - - /* draw each point */ - for (y = rect.y1; y < rect.y2; y ++) - { - for (x = rect.x1; x < rect.x2; x++) - { - /* not alpha */ - if ((*ptr >> 24) != 255) - { - set_pixel(ptr, x, y); - } - - /* move to next color buffer */ - ptr ++; - } - } - - /* update rect */ - rtgui_graphic_driver_screen_update(rtgui_graphic_driver_get_default(), &rect); -} -#endif - -#ifdef RTGUI_USING_WINMOVE -void rtgui_winrect_set(struct rtgui_topwin *topwin) -{ - /* set win rect show */ - _rtgui_cursor->win_rect_show = RT_TRUE; - - /* set win rect */ - _rtgui_cursor->win_rect = topwin->title == RT_NULL ? topwin->extent : RTGUI_WIDGET(topwin->title)->extent; - _rtgui_cursor->topwin = topwin; -} - -rt_bool_t rtgui_winrect_moved_done(rtgui_rect_t *winrect, struct rtgui_topwin **topwin) -{ - rt_bool_t moved = RT_FALSE; - - /* no win rect */ - if (winrect == RT_NULL) return RT_FALSE; - - /* restore winrect */ - if (_rtgui_cursor->win_rect_has_saved) - { - rtgui_winrect_restore(); - - moved = RT_TRUE; - } - - /* clear win rect show */ - _rtgui_cursor->win_rect_show = RT_FALSE; - _rtgui_cursor->win_rect_has_saved = RT_FALSE; - - /* return win rect */ - *winrect = _rtgui_cursor->win_rect; - *topwin = _rtgui_cursor->topwin; - - return moved; -} - -rt_bool_t rtgui_winrect_is_moved() -{ - return _rtgui_cursor->win_rect_show; -} - -/* show winrect */ -static void rtgui_winrect_show() -{ - rt_uint16_t x, y; - rtgui_color_t c; - rtgui_rect_t screen_rect, win_rect, win_rect_inner; - void (*set_pixel)(rtgui_color_t * c, int x, int y); - - c = black; - set_pixel = rtgui_graphic_driver_get_default()->ops->set_pixel; - - win_rect = _rtgui_cursor->win_rect; - win_rect_inner = win_rect; - rtgui_rect_inflate(&win_rect_inner, -WIN_MOVE_BORDER); - - rtgui_graphic_driver_get_rect(rtgui_graphic_driver_get_default(), - &screen_rect); - rtgui_rect_intersect(&screen_rect, &win_rect); - rtgui_rect_intersect(&screen_rect, &win_rect_inner); - - /* draw left */ - for (y = win_rect.y1; y < win_rect.y2; y ++) - { - for (x = win_rect.x1; x < win_rect_inner.x1; x++) - if ((x + y) & 0x01) set_pixel(&c, x, y); - } - - /* draw right */ - for (y = win_rect.y1; y < win_rect.y2; y ++) - { - for (x = win_rect_inner.x2; x < win_rect.x2; x++) - if ((x + y) & 0x01) set_pixel(&c, x, y); - } - - /* draw top border */ - for (y = win_rect.y1; y < win_rect_inner.y1; y ++) - { - for (x = win_rect_inner.x1; x < win_rect_inner.x2; x++) - if ((x + y) & 0x01) set_pixel(&c, x, y); - } - - /* draw bottom border */ - for (y = win_rect_inner.y2; y < win_rect.y2; y ++) - { - for (x = win_rect_inner.x1; x < win_rect_inner.x2; x++) - if ((x + y) & 0x01) set_pixel(&c, x, y); - } - - /* update rect */ - rtgui_graphic_driver_screen_update(rtgui_graphic_driver_get_default(), &win_rect); -} - -#define display_direct_memcpy(src, dest, src_pitch, dest_pitch, height, len) \ - for (idx = 0; idx < height; idx ++) \ - { \ - rt_memcpy(dest, src, len); \ - src += src_pitch; \ - dest += dest_pitch; \ - } - -static void rtgui_winrect_restore() -{ - rt_uint8_t *winrect_ptr, *fb_ptr, *driver_fb; - int winrect_pitch, idx; - rtgui_rect_t screen_rect, win_rect; - - driver_fb = rtgui_graphic_driver_get_default_framebuffer(); - win_rect = _rtgui_cursor->win_rect; - - rtgui_graphic_driver_get_rect(rtgui_graphic_driver_get_default(), - &screen_rect); - rtgui_rect_intersect(&screen_rect, &win_rect); - - /* restore winrect left */ - fb_ptr = driver_fb + win_rect.y1 * _rtgui_cursor->screen_pitch + - win_rect.x1 * _rtgui_cursor->bpp; - winrect_ptr = _rtgui_cursor->win_left; - winrect_pitch = WIN_MOVE_BORDER * _rtgui_cursor->bpp; - display_direct_memcpy(winrect_ptr, fb_ptr, winrect_pitch, _rtgui_cursor->screen_pitch, - (win_rect.y2 - win_rect.y1), winrect_pitch); - - /* restore winrect right */ - fb_ptr = driver_fb + win_rect.y1 * _rtgui_cursor->screen_pitch + - (win_rect.x2 - WIN_MOVE_BORDER) * _rtgui_cursor->bpp; - winrect_ptr = _rtgui_cursor->win_right; - winrect_pitch = WIN_MOVE_BORDER * _rtgui_cursor->bpp; - display_direct_memcpy(winrect_ptr, fb_ptr, winrect_pitch, _rtgui_cursor->screen_pitch, - (win_rect.y2 - win_rect.y1), winrect_pitch); - - /* restore winrect top */ - fb_ptr = driver_fb + win_rect.y1 * _rtgui_cursor->screen_pitch + - (win_rect.x1 + WIN_MOVE_BORDER) * _rtgui_cursor->bpp; - winrect_ptr = _rtgui_cursor->win_top; - winrect_pitch = (win_rect.x2 - win_rect.x1 - 2 * WIN_MOVE_BORDER) * _rtgui_cursor->bpp; - display_direct_memcpy(winrect_ptr, fb_ptr, winrect_pitch, _rtgui_cursor->screen_pitch, - WIN_MOVE_BORDER, winrect_pitch); - - /* restore winrect bottom */ - fb_ptr = driver_fb + (win_rect.y2 - WIN_MOVE_BORDER) * _rtgui_cursor->screen_pitch + - (win_rect.x1 + WIN_MOVE_BORDER) * _rtgui_cursor->bpp; - winrect_ptr = _rtgui_cursor->win_bottom; - display_direct_memcpy(winrect_ptr, fb_ptr, winrect_pitch, _rtgui_cursor->screen_pitch, - WIN_MOVE_BORDER, winrect_pitch); -} - -static void rtgui_winrect_save() -{ - rt_uint8_t *winrect_ptr, *fb_ptr, *driver_fb; - int winrect_pitch, idx; - rtgui_rect_t screen_rect, win_rect; - - driver_fb = rtgui_graphic_driver_get_default_framebuffer(); - win_rect = _rtgui_cursor->win_rect; - - rtgui_graphic_driver_get_rect(rtgui_graphic_driver_get_default(), - &screen_rect); - rtgui_rect_intersect(&screen_rect, &win_rect); - - /* set winrect has saved */ - _rtgui_cursor->win_rect_has_saved = RT_TRUE; - - /* save winrect left */ - fb_ptr = driver_fb + win_rect.y1 * _rtgui_cursor->screen_pitch + - win_rect.x1 * _rtgui_cursor->bpp; - winrect_ptr = _rtgui_cursor->win_left; - winrect_pitch = WIN_MOVE_BORDER * _rtgui_cursor->bpp; - display_direct_memcpy(fb_ptr, winrect_ptr, _rtgui_cursor->screen_pitch, winrect_pitch, - (win_rect.y2 - win_rect.y1), winrect_pitch); - - /* save winrect right */ - fb_ptr = driver_fb + win_rect.y1 * _rtgui_cursor->screen_pitch + - (win_rect.x2 - WIN_MOVE_BORDER) * _rtgui_cursor->bpp; - winrect_ptr = _rtgui_cursor->win_right; - winrect_pitch = WIN_MOVE_BORDER * _rtgui_cursor->bpp; - display_direct_memcpy(fb_ptr, winrect_ptr, _rtgui_cursor->screen_pitch, winrect_pitch, - (win_rect.y2 - win_rect.y1), winrect_pitch); - - /* save winrect top */ - fb_ptr = driver_fb + win_rect.y1 * _rtgui_cursor->screen_pitch + - (win_rect.x1 + WIN_MOVE_BORDER) * _rtgui_cursor->bpp; - winrect_ptr = _rtgui_cursor->win_top; - winrect_pitch = (win_rect.x2 - win_rect.x1 - 2 * WIN_MOVE_BORDER) * _rtgui_cursor->bpp; - display_direct_memcpy(fb_ptr, winrect_ptr, _rtgui_cursor->screen_pitch, winrect_pitch, - WIN_MOVE_BORDER, winrect_pitch); - - /* save winrect bottom */ - fb_ptr = driver_fb + (win_rect.y2 - WIN_MOVE_BORDER) * _rtgui_cursor->screen_pitch + - (win_rect.x1 + WIN_MOVE_BORDER) * _rtgui_cursor->bpp; - winrect_ptr = _rtgui_cursor->win_bottom; - display_direct_memcpy(fb_ptr, winrect_ptr, _rtgui_cursor->screen_pitch, winrect_pitch, - WIN_MOVE_BORDER, winrect_pitch); -} -#endif - -void rtgui_mouse_monitor_append(rtgui_list_t *head, rtgui_rect_t *rect) -{ - struct rtgui_mouse_monitor *mmonitor; - - /* check parameters */ - if (head == RT_NULL || rect == RT_NULL) return; - - /* create a mouse monitor node */ - mmonitor = (struct rtgui_mouse_monitor *) rtgui_malloc(sizeof(struct rtgui_mouse_monitor)); - if (mmonitor == RT_NULL) return; /* no memory */ - - /* set mouse monitor node */ - mmonitor->rect = *rect; - rtgui_list_init(&(mmonitor->list)); - - /* append to list */ - rtgui_list_append(head, &(mmonitor->list)); -} - -void rtgui_mouse_monitor_remove(rtgui_list_t *head, rtgui_rect_t *rect) -{ - struct rtgui_list_node *node; - struct rtgui_mouse_monitor *mmonitor; - - /* check parameters */ - if (head == RT_NULL || rect == RT_NULL) return; - - for (node = head->next; node != RT_NULL; node = node->next) - { - mmonitor = rtgui_list_entry(node, struct rtgui_mouse_monitor, list); - if (mmonitor->rect.x1 == rect->x1 && - mmonitor->rect.x2 == rect->x2 && - mmonitor->rect.y1 == rect->y1 && - mmonitor->rect.y2 == rect->y2) - { - /* found node */ - rtgui_list_remove(head, node); - rtgui_free(mmonitor); - - return ; - } - } -} - -rt_bool_t rtgui_mouse_monitor_contains_point(rtgui_list_t *head, int x, int y) -{ - struct rtgui_list_node *node; - - /* check parameter */ - if (head == RT_NULL) return RT_FALSE; - - rtgui_list_foreach(node, head) - { - struct rtgui_mouse_monitor *monitor = rtgui_list_entry(node, - struct rtgui_mouse_monitor, list); - - if (rtgui_rect_contains_point(&(monitor->rect), x, y) == RT_EOK) - { - return RT_TRUE; - } - } - - return RT_FALSE; -} diff --git a/components/rtgui/server/mouse.h b/components/rtgui/server/mouse.h deleted file mode 100644 index dd62596efe..0000000000 --- a/components/rtgui/server/mouse.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * File : mouse.h - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rt-thread.org/license/LICENSE - * - * Change Logs: - * Date Author Notes - * 2009-10-16 Bernard first version - */ -#ifndef __RTGUI_MOUSE_H__ -#define __RTGUI_MOUSE_H__ - -#include <rtgui/rtgui.h> -#include <rtgui/image.h> -#include "topwin.h" - -struct rtgui_mouse_monitor -{ - /* event rect */ - rtgui_rect_t rect; - - /* node list */ - rtgui_list_t list; -}; -typedef struct rtgui_mouse_monitor rtgui_mouse_monitor_t; - -void rtgui_mouse_init(void); -void rtgui_mouse_fini(void); -void rtgui_mouse_moveto(int x, int y); -/* set cursor position */ -void rtgui_mouse_set_position(int x, int y); - -void rtgui_mouse_set_cursor_enable(rt_bool_t enable); -void rtgui_mouse_set_cursor(rtgui_image_t *cursor); -void rtgui_mouse_get_cursor_rect(rtgui_rect_t *rect); - -void rtgui_mouse_show_cursor(void); -void rtgui_mouse_hide_cursor(void); - -rt_bool_t rtgui_mouse_is_intersect(rtgui_rect_t *r); - -#ifdef RTGUI_USING_WINMOVE -rt_bool_t rtgui_winrect_is_moved(void); -void rtgui_winrect_set(struct rtgui_topwin *topwin); -rt_bool_t rtgui_winrect_moved_done(rtgui_rect_t *winrect, struct rtgui_topwin **topwin); -#endif - -void rtgui_mouse_monitor_append(rtgui_list_t *head, rtgui_rect_t *rect); -void rtgui_mouse_monitor_remove(rtgui_list_t *head, rtgui_rect_t *rect); -rt_bool_t rtgui_mouse_monitor_contains_point(rtgui_list_t *head, int x, int y); - -#endif diff --git a/components/rtgui/server/server.c b/components/rtgui/server/server.c deleted file mode 100644 index 8728a5ed44..0000000000 --- a/components/rtgui/server/server.c +++ /dev/null @@ -1,415 +0,0 @@ -/* - * File : server.c - * This file is part of RTGUI in RT-Thread RTOS - * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rt-thread.org/license/LICENSE - * - * Change Logs: - * Date Author Notes - * 2009-10-04 Bernard first version - */ - -#include <rtgui/rtgui.h> -#include <rtgui/event.h> -#include <rtgui/rtgui_system.h> -#include <rtgui/rtgui_object.h> -#include <rtgui/rtgui_app.h> -#include <rtgui/driver.h> - -#include "mouse.h" -#include "topwin.h" - -static struct rtgui_app *rtgui_server_app = RT_NULL; -static struct rtgui_app *rtgui_wm_application = RT_NULL; - -void rtgui_server_handle_update(struct rtgui_event_update_end *event) -{ - struct rtgui_graphic_driver *driver; - - driver = rtgui_graphic_driver_get_default(); - if (driver != RT_NULL) - { - rtgui_graphic_driver_screen_update(driver, &(event->rect)); - } -} - -void rtgui_server_handle_monitor_add(struct rtgui_event_monitor *event) -{ - /* add monitor rect to top window list */ - rtgui_topwin_append_monitor_rect(event->wid, &(event->rect)); -} - -void rtgui_server_handle_monitor_remove(struct rtgui_event_monitor *event) -{ - /* add monitor rect to top window list */ - rtgui_topwin_remove_monitor_rect(event->wid, &(event->rect)); -} - -void rtgui_server_handle_mouse_btn(struct rtgui_event_mouse *event) -{ - struct rtgui_topwin *wnd; - - /* re-init to server thread */ - RTGUI_EVENT_MOUSE_BUTTON_INIT(event); - - /* set cursor position */ - rtgui_mouse_set_position(event->x, event->y); - -#ifdef RTGUI_USING_WINMOVE - if (rtgui_winrect_is_moved() && - event->button & (RTGUI_MOUSE_BUTTON_LEFT | RTGUI_MOUSE_BUTTON_UP)) - { - struct rtgui_topwin *topwin; - rtgui_rect_t rect; - - if (rtgui_winrect_moved_done(&rect, &topwin) == RT_TRUE) - { - struct rtgui_event_win_move ewin; - - /* move window */ - RTGUI_EVENT_WIN_MOVE_INIT(&ewin); - ewin.wid = topwin->wid; - if (topwin->title != RT_NULL) - { - if (topwin->flag & WINTITLE_BORDER) - { - ewin.x = rect.x1 + WINTITLE_BORDER_SIZE; - ewin.y = rect.y1 + WINTITLE_BORDER_SIZE; - } - if (!(topwin->flag & WINTITLE_NO)) ewin.y += WINTITLE_HEIGHT; - } - else - { - ewin.x = rect.x1; - ewin.y = rect.y1; - } - - /* send to client thread */ - rtgui_send(topwin->app, &(ewin.parent), sizeof(ewin)); - - return; - } - } -#endif - - /* get the wnd which contains the mouse */ - wnd = rtgui_topwin_get_wnd_no_modaled(event->x, event->y); - if (wnd != RT_NULL) - { - event->wid = wnd->wid; - - /* only raise window if the button is pressed down */ - if (event->button & RTGUI_MOUSE_BUTTON_DOWN - && rtgui_topwin_get_focus() != wnd) - { - rtgui_topwin_activate_topwin(wnd); - } - - if (wnd->title != RT_NULL && - rtgui_rect_contains_point(&(RTGUI_WIDGET(wnd->title)->extent), event->x, event->y) == RT_EOK) - { - rtgui_topwin_title_onmouse(wnd, event); - } - else - { - /* send mouse event to thread */ - rtgui_send(wnd->app, (struct rtgui_event *)event, sizeof(struct rtgui_event_mouse)); - } - return ; - } -} - -static struct rtgui_topwin *last_monitor_topwin = RT_NULL; - -void rtgui_server_handle_mouse_motion(struct rtgui_event_mouse *event) -{ - /* the topwin contains current mouse */ - struct rtgui_topwin *win = RT_NULL; - - /* re-init mouse event */ - RTGUI_EVENT_MOUSE_MOTION_INIT(event); - - win = rtgui_topwin_get_wnd_no_modaled(event->x, event->y); - if (win != RT_NULL && win->monitor_list.next != RT_NULL) - { - // FIXME: - /* check whether the monitor exist */ - if (rtgui_mouse_monitor_contains_point(&(win->monitor_list), - event->x, event->y) != RT_TRUE) - { - win = RT_NULL; - } - } - - if (last_monitor_topwin != RT_NULL) - { - event->wid = last_monitor_topwin->wid; - /* send mouse motion event */ - rtgui_send(last_monitor_topwin->app, &(event->parent), sizeof(struct rtgui_event_mouse)); - } - - if (last_monitor_topwin != win) - { - last_monitor_topwin = win; - if (last_monitor_topwin != RT_NULL) - { - event->wid = last_monitor_topwin->wid; - - /* send mouse motion event */ - rtgui_send(last_monitor_topwin->app, &(event->parent), sizeof(struct rtgui_event_mouse)); - } - } - - /* move mouse to (x, y) */ - rtgui_mouse_moveto(event->x, event->y); -} - -void rtgui_server_handle_kbd(struct rtgui_event_kbd *event) -{ - struct rtgui_topwin *wnd; - - /* re-init to server thread */ - RTGUI_EVENT_KBD_INIT(event); - - /* todo: handle input method and global shortcut */ - - wnd = rtgui_topwin_get_focus(); - if (wnd != RT_NULL) - { - RT_ASSERT(wnd->flag & WINTITLE_ACTIVATE) - - /* send to focus window */ - event->wid = wnd->wid; - - /* send keyboard event to thread */ - rtgui_send(wnd->app, (struct rtgui_event *)event, sizeof(struct rtgui_event_kbd)); - - return; - } -} - -#ifdef _WIN32_NATIVE -#include <windows.h> -#endif - -static rt_bool_t rtgui_server_event_handler(struct rtgui_object *object, - struct rtgui_event *event) -{ - RT_ASSERT(object != RT_NULL); - RT_ASSERT(event != RT_NULL); - - /* dispatch event */ - switch (event->type) - { - case RTGUI_EVENT_APP_CREATE: - case RTGUI_EVENT_APP_DESTROY: - if (rtgui_wm_application != RT_NULL) - { - /* forward event to wm application */ - rtgui_send(rtgui_wm_application, event, sizeof(struct rtgui_event_application)); - } - else - { - /* always ack with OK */ - rtgui_ack(event, RTGUI_STATUS_OK); - } - break; - - /* mouse and keyboard event */ - case RTGUI_EVENT_MOUSE_MOTION: - /* handle mouse motion event */ - rtgui_server_handle_mouse_motion((struct rtgui_event_mouse *)event); - break; - - case RTGUI_EVENT_MOUSE_BUTTON: - /* handle mouse button */ - rtgui_server_handle_mouse_btn((struct rtgui_event_mouse *)event); - break; - - case RTGUI_EVENT_KBD: - /* handle keyboard event */ - rtgui_server_handle_kbd((struct rtgui_event_kbd *)event); - break; - - /* window event */ - case RTGUI_EVENT_WIN_CREATE: - if (rtgui_topwin_add((struct rtgui_event_win_create *)event) == RT_EOK) - rtgui_ack(event, RTGUI_STATUS_OK); - else - rtgui_ack(event, RTGUI_STATUS_ERROR); - break; - - case RTGUI_EVENT_WIN_SHOW: - if (rtgui_topwin_show((struct rtgui_event_win *)event) == RT_EOK) - rtgui_ack(event, RTGUI_STATUS_OK); - else - rtgui_ack(event, RTGUI_STATUS_ERROR); - break; - - case RTGUI_EVENT_WIN_HIDE: - if (rtgui_topwin_hide((struct rtgui_event_win *)event) == RT_EOK) - rtgui_ack(event, RTGUI_STATUS_OK); - else - rtgui_ack(event, RTGUI_STATUS_ERROR); - break; - - case RTGUI_EVENT_WIN_MOVE: - if (rtgui_topwin_move((struct rtgui_event_win_move *)event) == RT_EOK) - rtgui_ack(event, RTGUI_STATUS_OK); - else - rtgui_ack(event, RTGUI_STATUS_ERROR); - break; - - case RTGUI_EVENT_WIN_MODAL_ENTER: - if (rtgui_topwin_modal_enter((struct rtgui_event_win_modal_enter *)event) == RT_EOK) - rtgui_ack(event, RTGUI_STATUS_OK); - else - rtgui_ack(event, RTGUI_STATUS_ERROR); - break; - - case RTGUI_EVENT_WIN_ACTIVATE: - if (rtgui_topwin_activate((struct rtgui_event_win_activate *)event) == RT_EOK) - rtgui_ack(event, RTGUI_STATUS_OK); - else - rtgui_ack(event, RTGUI_STATUS_ERROR); - break; - - case RTGUI_EVENT_WIN_DESTROY: - if (last_monitor_topwin != RT_NULL && - last_monitor_topwin->wid == ((struct rtgui_event_win *)event)->wid) - last_monitor_topwin = RT_NULL; - if (rtgui_topwin_remove(((struct rtgui_event_win *)event)->wid) == RT_EOK) - rtgui_ack(event, RTGUI_STATUS_OK); - else - rtgui_ack(event, RTGUI_STATUS_ERROR); - break; - - case RTGUI_EVENT_WIN_RESIZE: - rtgui_topwin_resize(((struct rtgui_event_win_resize *)event)->wid, - &(((struct rtgui_event_win_resize *)event)->rect)); - break; - - case RTGUI_EVENT_SET_WM: - if (rtgui_wm_application != RT_NULL) - { - rtgui_ack(event, RTGUI_STATUS_ERROR); - } - else - { - struct rtgui_event_set_wm *set_wm; - - set_wm = (struct rtgui_event_set_wm *) event; - rtgui_wm_application = set_wm->app; - rtgui_ack(event, RTGUI_STATUS_OK); - } - break; - - /* other event */ - case RTGUI_EVENT_COMMAND: - break; - - case RTGUI_EVENT_UPDATE_BEGIN: -#ifdef RTGUI_USING_MOUSE_CURSOR - /* hide cursor */ - rtgui_mouse_hide_cursor(); -#endif - break; - - case RTGUI_EVENT_UPDATE_END: - /* handle screen update */ - rtgui_server_handle_update((struct rtgui_event_update_end *)event); -#ifdef RTGUI_USING_MOUSE_CURSOR - /* show cursor */ - rtgui_mouse_show_cursor(); -#endif - break; - - case RTGUI_EVENT_MONITOR_ADD: - /* handle mouse monitor */ - rtgui_server_handle_monitor_add((struct rtgui_event_monitor *)event); - break; - default: - rt_kprintf("RTGUI: wrong event sent to server: %d", event->type); - return RT_FALSE; - } - - return RT_TRUE; -} - -/** - * rtgui server thread's entry - */ -static void rtgui_server_entry(void *parameter) -{ -#ifdef _WIN32_NATIVE - /* set the server thread to highest */ - HANDLE hCurrentThread = GetCurrentThread(); - SetThreadPriority(hCurrentThread, THREAD_PRIORITY_HIGHEST); -#endif - - /* create rtgui server application */ - rtgui_server_app = rtgui_app_create("rtgui"); - rt_kprintf("RTGUI: create server: %p", rtgui_server_app); - if (rtgui_server_app == RT_NULL) - return; - - rtgui_object_set_event_handler(RTGUI_OBJECT(rtgui_server_app), - rtgui_server_event_handler); - /* init mouse and show */ - rtgui_mouse_init(); -#ifdef RTGUI_USING_MOUSE_CURSOR - rtgui_mouse_show_cursor(); -#endif - - rtgui_app_run(rtgui_server_app); - - rtgui_app_destroy(rtgui_server_app); - rtgui_server_app = RT_NULL; -} - -void rtgui_server_post_event(struct rtgui_event *event, rt_size_t size) -{ - if (rtgui_server_app != RT_NULL) - rtgui_send(rtgui_server_app, event, size); - else - rt_kprintf("post when server is not running\n"); -} - -rt_err_t rtgui_server_post_event_sync(struct rtgui_event *event, rt_size_t size) -{ - if (rtgui_server_app != RT_NULL) - return rtgui_send_sync(rtgui_server_app, event, size); - else - { - rt_kprintf("post when server is not running\n"); - return -RT_ENOSYS; - } -} - -struct rtgui_app* rtgui_get_server(void) -{ - rt_thread_t tid = rt_thread_find("rtgui"); - - if (tid == RT_NULL) - return RT_NULL; - return (struct rtgui_app*)tid->user_data; -} -RTM_EXPORT(rtgui_get_server); - -void rtgui_server_init(void) -{ - rt_thread_t tid; - - tid = rt_thread_create("rtgui", - rtgui_server_entry, RT_NULL, - RTGUI_SVR_THREAD_STACK_SIZE, - RTGUI_SVR_THREAD_PRIORITY, - RTGUI_SVR_THREAD_TIMESLICE); - - /* start rtgui server thread */ - if (tid != RT_NULL) - rt_thread_startup(tid); -} diff --git a/components/rtgui/server/topwin.c b/components/rtgui/server/topwin.c deleted file mode 100644 index d052e00071..0000000000 --- a/components/rtgui/server/topwin.c +++ /dev/null @@ -1,1177 +0,0 @@ -/* - * File : topwin.c - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rt-thread.org/license/LICENSE - * - * Change Logs: - * Date Author Notes - * 2009-10-16 Bernard first version - */ -#include "topwin.h" -#include "mouse.h" - -#include <rtgui/dlist.h> -#include <rtgui/event.h> -#include <rtgui/image.h> -#include <rtgui/rtgui_theme.h> -#include <rtgui/rtgui_system.h> -#include <rtgui/rtgui_app.h> -#include <rtgui/widgets/window.h> - -/* This list is divided into two parts. The first part is the shown list, in - * which all the windows have the WINTITLE_SHOWN flag set. Second part is the - * hidden items, in which all the windows don't have WINTITLE_SHOWN flag. - * - * The active window is the one that would receive kbd events. It should always - * be in the first tree. The order of this list is the order of the windows. - * Top window can always clip the window beneath it when the two - * overlapping. Child window can always clip it's parent. Slibing windows can - * clip each other with the same rule as this list. Each child list is the same - * as _rtgui_topwin_list. This forms the hierarchy tree structure of all - * windows. - * - * Thus, the left most leaf of the tree is the top most window and the right - * most root node is the bottom window. The hidden part have no specific - * order. - */ -static struct rtgui_dlist_node _rtgui_topwin_list; -#define get_topwin_from_list(list_entry) \ - (rtgui_dlist_entry((list_entry), struct rtgui_topwin, list)) - -#define IS_ROOT_WIN(topwin) ((topwin)->parent == RT_NULL) - -static struct rt_semaphore _rtgui_topwin_lock; - -static void rtgui_topwin_update_clip(void); -static void rtgui_topwin_redraw(struct rtgui_rect *rect); -static void _rtgui_topwin_activate_next(enum rtgui_topwin_flag); - -void rtgui_topwin_init(void) -{ - /* init window list */ - rtgui_dlist_init(&_rtgui_topwin_list); - - rt_sem_init(&_rtgui_topwin_lock, - "topwin", 1, RT_IPC_FLAG_FIFO); -} - -static struct rtgui_topwin *rtgui_topwin_search_in_list(struct rtgui_win *window, - struct rtgui_dlist_node *list) -{ - /* TODO: use a cache to speed up the search. */ - struct rtgui_dlist_node *node; - struct rtgui_topwin *topwin; - - /* the action is tend to operate on the top most window. So we search in a - * depth first order. - */ - rtgui_dlist_foreach(node, list, next) - { - topwin = rtgui_dlist_entry(node, struct rtgui_topwin, list); - - /* is this node? */ - if (topwin->wid == window) - { - return topwin; - } - - topwin = rtgui_topwin_search_in_list(window, &topwin->child_list); - if (topwin != RT_NULL) - return topwin; - } - - return RT_NULL; -} - -/* add a window to window list[hide] */ -rt_err_t rtgui_topwin_add(struct rtgui_event_win_create *event) -{ - struct rtgui_topwin *topwin; - - topwin = rtgui_malloc(sizeof(struct rtgui_topwin)); - if (topwin == RT_NULL) - return -RT_ERROR; - - topwin->wid = event->wid; -#ifdef RTGUI_USING_SMALL_SIZE - topwin->extent = RTGUI_WIDGET(event->wid)->extent; -#else - topwin->extent = event->extent; -#endif - topwin->app = event->parent.sender; - - if (event->parent_window == RT_NULL) - { - topwin->parent = RT_NULL; - rtgui_dlist_insert_before(&_rtgui_topwin_list, &topwin->list); - } - else - { - topwin->parent = rtgui_topwin_search_in_list(event->parent_window, &_rtgui_topwin_list); - if (topwin->parent == RT_NULL) - { - /* parent does not exist. Orphan window? */ - rtgui_free(topwin); - return -RT_ERROR; - } - rtgui_dlist_insert_before(&topwin->parent->child_list, &topwin->list); - } - - rtgui_dlist_init(&topwin->child_list); - - topwin->flag = 0; - if (event->parent.user & RTGUI_WIN_STYLE_NO_TITLE) topwin->flag |= WINTITLE_NO; - if (event->parent.user & RTGUI_WIN_STYLE_CLOSEBOX) topwin->flag |= WINTITLE_CLOSEBOX; - if (!(event->parent.user & RTGUI_WIN_STYLE_NO_BORDER)) topwin->flag |= WINTITLE_BORDER; - if (event->parent.user & RTGUI_WIN_STYLE_NO_FOCUS) topwin->flag |= WINTITLE_NOFOCUS; - if (event->parent.user & RTGUI_WIN_STYLE_ONTOP) topwin->flag |= WINTITLE_ONTOP; - if (event->parent.user & RTGUI_WIN_STYLE_ONBTM) topwin->flag |= WINTITLE_ONBTM; - - if (!(topwin->flag & WINTITLE_NO) || (topwin->flag & WINTITLE_BORDER)) - { - /* get win extent */ - rtgui_rect_t rect = topwin->extent; - - /* add border rect */ - if (topwin->flag & WINTITLE_BORDER) - { - rtgui_rect_inflate(&rect, WINTITLE_BORDER_SIZE); - } - - /* add title rect */ - if (!(topwin->flag & WINTITLE_NO)) rect.y1 -= WINTITLE_HEIGHT; - -#ifdef RTGUI_USING_SMALL_SIZE - topwin->title = rtgui_wintitle_create(topwin->wid, event->wid->title); -#else - topwin->title = rtgui_wintitle_create(topwin->wid, (const char *)event->title); -#endif - rtgui_widget_set_rect(RTGUI_WIDGET(topwin->title), &rect); - - /* update clip info */ - rtgui_region_subtract_rect(&(RTGUI_WIDGET(topwin->title)->clip), - &(RTGUI_WIDGET(topwin->title)->clip), - &(topwin->extent)); - } - else - topwin->title = RT_NULL; - - rtgui_list_init(&topwin->monitor_list); - - return RT_EOK; -} - -static struct rtgui_topwin *_rtgui_topwin_get_root_win(struct rtgui_topwin *topwin) -{ - struct rtgui_topwin *topparent; - - RT_ASSERT(topwin != RT_NULL); - - topparent = topwin; - while (topparent && !IS_ROOT_WIN(topparent)) - topparent = topparent->parent; - return topparent; -} - -static struct rtgui_topwin *_rtgui_topwin_get_topmost_child_shown(struct rtgui_topwin *topwin) -{ - RT_ASSERT(topwin != RT_NULL); - - while (!(rtgui_dlist_isempty(&topwin->child_list)) && - get_topwin_from_list(topwin->child_list.next)->flag &WINTITLE_SHOWN) - topwin = get_topwin_from_list(topwin->child_list.next); - return topwin; -} - -static rt_bool_t _rtgui_topwin_in_layer(struct rtgui_topwin *topwin, enum rtgui_topwin_flag flag) -{ - return (topwin->flag & (WINTITLE_ONTOP | WINTITLE_ONBTM)) - == (flag & (WINTITLE_ONTOP | WINTITLE_ONBTM)); -} - -/* find the topmost window shown in the layer set by flag. The flag has many - * other infomations but we only use the ONTOP/ONBTM */ -static struct rtgui_topwin *_rtgui_topwin_get_topmost_window_shown(enum rtgui_topwin_flag flag) -{ - struct rtgui_dlist_node *node; - - rtgui_dlist_foreach(node, &_rtgui_topwin_list, next) - { - struct rtgui_topwin *topwin = get_topwin_from_list(node); - - /* reach the hidden region no window shown in current layer */ - if (!(topwin->flag & WINTITLE_SHOWN)) - return RT_NULL; - - if (_rtgui_topwin_in_layer(topwin, flag)) - return _rtgui_topwin_get_topmost_child_shown(topwin); - } - /* no window in current layer is shown */ - return RT_NULL; -} - -/* a hidden parent will hide it's children. Top level window can be shown at - * any time. */ -static rt_bool_t _rtgui_topwin_could_show(struct rtgui_topwin *topwin) -{ - struct rtgui_topwin *parent; - - RT_ASSERT(topwin != RT_NULL); - - for (parent = topwin->parent; parent != RT_NULL; parent = parent->parent) - { - if (!(parent->flag & WINTITLE_SHOWN)) - return RT_FALSE; - } - return RT_TRUE; -} - -static void _rtgui_topwin_union_region_tree(struct rtgui_topwin *topwin, - struct rtgui_region *region) -{ - struct rtgui_dlist_node *node; - - RT_ASSERT(topwin != RT_NULL); - - rtgui_dlist_foreach(node, &topwin->child_list, next) - _rtgui_topwin_union_region_tree(get_topwin_from_list(node), region); - - if (topwin->title != RT_NULL) - rtgui_region_union_rect(region, region, &RTGUI_WIDGET(topwin->title)->extent); - else - rtgui_region_union_rect(region, region, &topwin->extent); -} - -/* The return value of this function is the next node in tree. - * - * As we freed the node in this function, it would be a null reference error of - * the caller iterate the tree normally. - */ -static struct rtgui_dlist_node *_rtgui_topwin_free_tree(struct rtgui_topwin *topwin) -{ - struct rtgui_dlist_node *node, *next_node; - - RT_ASSERT(topwin != RT_NULL); - - node = topwin->child_list.next; - while (node != &topwin->child_list) - node = _rtgui_topwin_free_tree(get_topwin_from_list(node)); - - next_node = topwin->list.next; - rtgui_dlist_remove(&topwin->list); - - /* free the monitor rect list, topwin node and title */ - while (topwin->monitor_list.next != RT_NULL) - { - struct rtgui_mouse_monitor *monitor = rtgui_list_entry(topwin->monitor_list.next, - struct rtgui_mouse_monitor, list); - - topwin->monitor_list.next = topwin->monitor_list.next->next; - rtgui_free(monitor); - } - - /* destroy win title */ - rtgui_wintitle_destroy(topwin->title); - topwin->title = RT_NULL; - - rtgui_free(topwin); - return next_node; -} - -rt_err_t rtgui_topwin_remove(struct rtgui_win *wid) -{ - struct rtgui_topwin *topwin, *old_focus; - struct rtgui_region region; - - /* find the topwin node */ - topwin = rtgui_topwin_search_in_list(wid, &_rtgui_topwin_list); - - if (topwin == RT_NULL) - return -RT_ERROR; - - rtgui_region_init(®ion); - - old_focus = rtgui_topwin_get_focus(); - - /* remove the root from _rtgui_topwin_list will remove the whole tree from - * _rtgui_topwin_list. */ - rtgui_dlist_remove(&topwin->list); - - if (old_focus == topwin) - { - _rtgui_topwin_activate_next(topwin->flag); - } - - if (topwin->flag & WINTITLE_SHOWN) - { - rtgui_topwin_update_clip(); - /* redraw the old rect */ - _rtgui_topwin_union_region_tree(topwin, ®ion); - rtgui_topwin_redraw(rtgui_region_extents(®ion)); - } - - _rtgui_topwin_free_tree(topwin); - - return RT_EOK; -} - -/* neither deactivate the old focus nor change _rtgui_topwin_list. - * Suitable to be called when the first item is the window to be activated - * already. */ -static void _rtgui_topwin_only_activate(struct rtgui_topwin *topwin) -{ - struct rtgui_event_win event; - - RT_ASSERT(topwin != RT_NULL); - - if (topwin->flag & WINTITLE_NOFOCUS) - return; - - /* activate the raised window */ - RTGUI_EVENT_WIN_ACTIVATE_INIT(&event); - - topwin->flag |= WINTITLE_ACTIVATE; - - event.wid = topwin->wid; - rtgui_send(topwin->app, &(event.parent), sizeof(struct rtgui_event_win)); - - /* redraw title */ - if (topwin->title != RT_NULL) - { - rtgui_theme_draw_win(topwin); - } -} - -/* activate next window in the same layer as flag. The flag has many other - * infomations but we only use the ONTOP/ONBTM */ -static void _rtgui_topwin_activate_next(enum rtgui_topwin_flag flag) -{ - struct rtgui_topwin *topwin; - - topwin = _rtgui_topwin_get_topmost_window_shown(flag); - if (topwin == RT_NULL) - return; - - _rtgui_topwin_only_activate(topwin); -} - -/* this function does not update the clip(to avoid doubel clipping). So if the - * tree has changed, make sure it has already updated outside. */ -static void _rtgui_topwin_deactivate(struct rtgui_topwin *topwin) -{ - struct rtgui_event_win event; - - RT_ASSERT(topwin != RT_NULL); - RT_ASSERT(topwin->app != RT_NULL); - - RTGUI_EVENT_WIN_DEACTIVATE_INIT(&event); - event.wid = topwin->wid; - rtgui_send(topwin->app, - &event.parent, sizeof(struct rtgui_event_win)); - - topwin->flag &= ~WINTITLE_ACTIVATE; - - /* redraw title */ - if (topwin->title != RT_NULL) - { - rtgui_theme_draw_win(topwin); - } -} - -static void _rtgui_topwin_move_whole_tree2top(struct rtgui_topwin *topwin) -{ - struct rtgui_topwin *topparent; - - RT_ASSERT(topwin != RT_NULL); - - /* move the whole tree */ - topparent = _rtgui_topwin_get_root_win(topwin); - RT_ASSERT(topparent != RT_NULL); - - /* remove node from hidden list */ - rtgui_dlist_remove(&topparent->list); - /* add node to show list */ - if (topwin->flag & WINTITLE_ONTOP) - { - rtgui_dlist_insert_after(&_rtgui_topwin_list, &(topparent->list)); - } - else if (topwin->flag & WINTITLE_ONBTM) - { - /* botton layer window, before the fisrt bottom window or hidden window. */ - struct rtgui_topwin *ntopwin = get_topwin_from_list(&_rtgui_topwin_list); - struct rtgui_dlist_node *node; - - rtgui_dlist_foreach(node, &_rtgui_topwin_list, next) - { - ntopwin = get_topwin_from_list(node); - if ((ntopwin->flag & WINTITLE_ONBTM) - || !(ntopwin->flag & WINTITLE_SHOWN)) - break; - } - /* all other windows are shown top/normal layer windows. Insert it as - * the last window. */ - if (node == &_rtgui_topwin_list) - rtgui_dlist_insert_before(&_rtgui_topwin_list, &(topparent->list)); - else - rtgui_dlist_insert_before(&ntopwin->list, &(topparent->list)); - } - else - { - /* normal layer window, before the fisrt shown normal layer window. */ - struct rtgui_topwin *ntopwin = get_topwin_from_list(&_rtgui_topwin_list); - struct rtgui_dlist_node *node; - - rtgui_dlist_foreach(node, &_rtgui_topwin_list, next) - { - ntopwin = get_topwin_from_list(node); - if (!((ntopwin->flag & WINTITLE_ONTOP) - && (ntopwin->flag & WINTITLE_SHOWN))) - break; - } - /* all other windows are shown top layer windows. Insert it as - * the last window. */ - if (node == &_rtgui_topwin_list) - rtgui_dlist_insert_before(&_rtgui_topwin_list, &(topparent->list)); - else - rtgui_dlist_insert_before(&ntopwin->list, &(topparent->list)); - } -} - -static void _rtgui_topwin_raise_in_sibling(struct rtgui_topwin *topwin) -{ - struct rtgui_dlist_node *win_level; - - RT_ASSERT(topwin != RT_NULL); - - if (topwin->parent == RT_NULL) - win_level = &_rtgui_topwin_list; - else - win_level = &topwin->parent->child_list; - rtgui_dlist_remove(&topwin->list); - rtgui_dlist_insert_after(win_level, &topwin->list); -} - -/* it will do 2 things. One is moving the whole tree(the root of the tree) to - * the front and the other is moving topwin to the front of it's siblings. */ -static void _rtgui_topwin_raise_tree_from_root(struct rtgui_topwin *topwin) -{ - RT_ASSERT(topwin != RT_NULL); - - _rtgui_topwin_move_whole_tree2top(topwin); - /* root win is aleady moved by _rtgui_topwin_move_whole_tree2top */ - if (!IS_ROOT_WIN(topwin)) - _rtgui_topwin_raise_in_sibling(topwin); -} - -/* activate a win means: - * - deactivate the old focus win if any - * - raise the window to the front of it's siblings - * - activate a win - */ -rt_err_t rtgui_topwin_activate(struct rtgui_event_win_activate *event) -{ - struct rtgui_topwin *topwin; - - RT_ASSERT(event); - - topwin = rtgui_topwin_search_in_list(event->wid, &_rtgui_topwin_list); - if (topwin == RT_NULL) - return -RT_ERROR; - - return rtgui_topwin_activate_topwin(topwin); -} - -static void _rtgui_topwin_draw_tree(struct rtgui_topwin *topwin, struct rtgui_event_paint *epaint) -{ - struct rtgui_dlist_node *node; - - if (topwin->title != RT_NULL) - { - rtgui_theme_draw_win(topwin); - } - - epaint->wid = topwin->wid; - rtgui_send(topwin->app, &(epaint->parent), sizeof(struct rtgui_event_paint)); - - rtgui_dlist_foreach(node, &topwin->child_list, prev) - { - if (!(get_topwin_from_list(node)->flag & WINTITLE_SHOWN)) - return; - _rtgui_topwin_draw_tree(get_topwin_from_list(node), epaint); - } -} - -rt_err_t rtgui_topwin_activate_topwin(struct rtgui_topwin *topwin) -{ - struct rtgui_topwin *old_focus_topwin; - struct rtgui_event_paint epaint; - - RT_ASSERT(topwin != RT_NULL); - - RTGUI_EVENT_PAINT_INIT(&epaint); - - if (!(topwin->flag & WINTITLE_SHOWN)) - return -RT_ERROR; - - if (topwin->flag & WINTITLE_NOFOCUS) - { - /* just raise and show, not affect others. */ - _rtgui_topwin_raise_tree_from_root(topwin); - rtgui_topwin_update_clip(); - _rtgui_topwin_draw_tree(topwin, &epaint); - return RT_EOK; - } - - if (topwin->flag & WINTITLE_ACTIVATE) - return RT_EOK; - - old_focus_topwin = rtgui_topwin_get_focus(); - /* if topwin has the focus, it shoule have WINTITLE_ACTIVATE set and - * returned above. */ - RT_ASSERT(old_focus_topwin != topwin); - - _rtgui_topwin_raise_tree_from_root(topwin); - /* clip before active the window, so we could get right boarder region. */ - rtgui_topwin_update_clip(); - - if (old_focus_topwin != RT_NULL) - { - /* deactivate the old focus window firstly, otherwise it will make the new - * window invisible. */ - _rtgui_topwin_deactivate(old_focus_topwin); - } - - _rtgui_topwin_only_activate(topwin); - - _rtgui_topwin_draw_tree(topwin, &epaint); - - return RT_EOK; -} - -/* map func to the topwin tree in preorder. - * - * Remember that we are in a embedded system so write the @param func memory - * efficiently. - */ -rt_inline void _rtgui_topwin_preorder_map(struct rtgui_topwin *topwin, void (*func)(struct rtgui_topwin *)) -{ - struct rtgui_dlist_node *child; - - RT_ASSERT(topwin != RT_NULL); - RT_ASSERT(func != RT_NULL); - - func(topwin); - - rtgui_dlist_foreach(child, &topwin->child_list, next) - _rtgui_topwin_preorder_map(get_topwin_from_list(child), func); -} - -rt_inline void _rtgui_topwin_mark_hidden(struct rtgui_topwin *topwin) -{ - topwin->flag &= ~WINTITLE_SHOWN; - if (topwin->title != RT_NULL) - { - RTGUI_WIDGET_HIDE(topwin->title); - } - RTGUI_WIDGET_HIDE(topwin->wid); -} - -rt_inline void _rtgui_topwin_mark_shown(struct rtgui_topwin *topwin) -{ - if (!(topwin->flag & WINTITLE_SHOWN) - && RTGUI_WIDGET_IS_HIDE(topwin->wid)) - return; - - topwin->flag |= WINTITLE_SHOWN; - if (topwin->title != RT_NULL) - { - RTGUI_WIDGET_UNHIDE(topwin->title); - } - RTGUI_WIDGET_UNHIDE(topwin->wid); -} - -rt_err_t rtgui_topwin_show(struct rtgui_event_win *event) -{ - struct rtgui_topwin *topwin; - struct rtgui_win *wid = event->wid; - - topwin = rtgui_topwin_search_in_list(wid, &_rtgui_topwin_list); - /* no such a window recorded */ - if (topwin == RT_NULL) - return -RT_ERROR; - - /* if the parent is hidden, just mark it as shown. It will be shown when - * the parent is shown. */ - if (!_rtgui_topwin_could_show(topwin)) - { - topwin->flag |= WINTITLE_SHOWN; - _rtgui_topwin_raise_in_sibling(topwin); - - return -RT_ERROR; - } - - _rtgui_topwin_preorder_map(topwin, _rtgui_topwin_mark_shown); - rtgui_topwin_activate_topwin(topwin); - - return RT_EOK; -} - -static void _rtgui_topwin_clear_modal_tree(struct rtgui_topwin *topwin) -{ - struct rtgui_dlist_node *node; - - RT_ASSERT(topwin != RT_NULL); - RT_ASSERT(topwin->parent != RT_NULL); - - while (!IS_ROOT_WIN(topwin)) - { - rtgui_dlist_foreach(node, &topwin->parent->child_list, next) - get_topwin_from_list(node)->flag &= ~WINTITLE_MODALED; - topwin = topwin->parent; - } - /* clear the modal flag of the root window */ - topwin->flag &= ~WINTITLE_MODALED; -} - -/* hide a window */ -rt_err_t rtgui_topwin_hide(struct rtgui_event_win *event) -{ - struct rtgui_topwin *topwin; - struct rtgui_topwin *old_focus_topwin = rtgui_topwin_get_focus(); - struct rtgui_win *wid = event->wid; - struct rtgui_dlist_node *containing_list; - - /* find in show list */ - topwin = rtgui_topwin_search_in_list(wid, &_rtgui_topwin_list); - if (topwin == RT_NULL) - { - return -RT_ERROR; - } - if (!(topwin->flag & WINTITLE_SHOWN)) - { - return RT_EOK; - } - - old_focus_topwin = rtgui_topwin_get_focus(); - - _rtgui_topwin_preorder_map(topwin, _rtgui_topwin_mark_hidden); - - if (topwin->parent == RT_NULL) - containing_list = &_rtgui_topwin_list; - else - containing_list = &topwin->parent->child_list; - - rtgui_dlist_remove(&topwin->list); - rtgui_dlist_insert_before(containing_list, &topwin->list); - - /* update clip info */ - rtgui_topwin_update_clip(); - - /* redraw the old rect */ - rtgui_topwin_redraw(&(topwin->extent)); - - if (topwin->flag & WINTITLE_MODALING) - { - _rtgui_topwin_clear_modal_tree(topwin); - topwin->flag &= ~WINTITLE_MODALING; - } - - if (old_focus_topwin == topwin) - { - _rtgui_topwin_activate_next(topwin->flag); - } - - topwin->flag &= ~WINTITLE_ACTIVATE; - - return RT_EOK; -} - -/* move top window */ -rt_err_t rtgui_topwin_move(struct rtgui_event_win_move *event) -{ - struct rtgui_topwin *topwin; - int dx, dy; - rtgui_rect_t old_rect; /* the old topwin coverage area */ - struct rtgui_list_node *node; - - /* find in show list */ - topwin = rtgui_topwin_search_in_list(event->wid, &_rtgui_topwin_list); - if (topwin == RT_NULL || - !(topwin->flag & WINTITLE_SHOWN)) - { - return -RT_ERROR; - } - - /* get the delta move x, y */ - dx = event->x - topwin->extent.x1; - dy = event->y - topwin->extent.y1; - - old_rect = topwin->extent; - /* move window rect */ - rtgui_rect_moveto(&(topwin->extent), dx, dy); - - /* move window title */ - if (topwin->title != RT_NULL) - { - old_rect = RTGUI_WIDGET(topwin->title)->extent; - rtgui_widget_move_to_logic(RTGUI_WIDGET(topwin->title), dx, dy); - } - - /* move the monitor rect list */ - rtgui_list_foreach(node, &(topwin->monitor_list)) - { - struct rtgui_mouse_monitor *monitor = rtgui_list_entry(node, - struct rtgui_mouse_monitor, - list); - rtgui_rect_moveto(&(monitor->rect), dx, dy); - } - - /* update windows clip info */ - rtgui_topwin_update_clip(); - - /* update old window coverage area */ - rtgui_topwin_redraw(&old_rect); - - /* update top window title */ - if (topwin->title != RT_NULL) - rtgui_theme_draw_win(topwin); - if (rtgui_rect_is_intersect(&old_rect, &(topwin->extent)) != RT_EOK) - { - /* - * the old rect is not intersect with moved rect, - * re-paint window - */ - struct rtgui_event_paint epaint; - RTGUI_EVENT_PAINT_INIT(&epaint); - epaint.wid = topwin->wid; - rtgui_send(topwin->app, &(epaint.parent), sizeof(epaint)); - } - - return RT_EOK; -} - -/* - * resize a top win - * Note: currently, only support resize hidden window - */ -void rtgui_topwin_resize(struct rtgui_win *wid, rtgui_rect_t *rect) -{ - struct rtgui_topwin *topwin; - struct rtgui_region region; - - /* find in show list */ - topwin = rtgui_topwin_search_in_list(wid, &_rtgui_topwin_list); - if (topwin == RT_NULL || - !(topwin->flag & WINTITLE_SHOWN)) - return; - - /* record the old rect */ - rtgui_region_init_with_extents(®ion, &topwin->extent); - /* union the new rect so this is the region we should redraw */ - rtgui_region_union_rect(®ion, ®ion, rect); - - topwin->extent = *rect; - - if (topwin->title != RT_NULL) - { - /* get win extent */ - rtgui_rect_t rect = topwin->extent; - - /* add border rect */ - if (topwin->flag & WINTITLE_BORDER) - { - rtgui_rect_inflate(&rect, WINTITLE_BORDER_SIZE); - } - - /* add title rect */ - if (!(topwin->flag & WINTITLE_NO)) - rect.y1 -= WINTITLE_HEIGHT; - - RTGUI_WIDGET(topwin->title)->extent = rect; - } - - /* update windows clip info */ - rtgui_topwin_update_clip(); - - /* update old window coverage area */ - rtgui_topwin_redraw(rtgui_region_extents(®ion)); -} - -static struct rtgui_topwin *_rtgui_topwin_get_focus_from_list(struct rtgui_dlist_node *list) -{ - struct rtgui_dlist_node *node; - - RT_ASSERT(list != RT_NULL); - - rtgui_dlist_foreach(node, list, next) - { - struct rtgui_topwin *child = get_topwin_from_list(node); - if (child->flag & WINTITLE_ACTIVATE) - return child; - - child = _rtgui_topwin_get_focus_from_list(&child->child_list); - if (child != RT_NULL) - return child; - } - - return RT_NULL; -} - -struct rtgui_topwin *rtgui_topwin_get_focus(void) -{ - return _rtgui_topwin_get_focus_from_list(&_rtgui_topwin_list); -} - -static struct rtgui_topwin *_rtgui_topwin_get_wnd_from_tree(struct rtgui_dlist_node *list, - int x, int y, - rt_bool_t exclude_modaled) -{ - struct rtgui_dlist_node *node; - struct rtgui_topwin *topwin, *target; - - RT_ASSERT(list != RT_NULL); - - rtgui_dlist_foreach(node, list, next) - { - topwin = get_topwin_from_list(node); - if (!(topwin->flag & WINTITLE_SHOWN)) - break; - - /* if higher window have this point, return it */ - target = _rtgui_topwin_get_wnd_from_tree(&topwin->child_list, x, y, exclude_modaled); - if (target != RT_NULL) - return target; - - if (exclude_modaled && (topwin->flag & WINTITLE_MODALED)) - break; - - if ((topwin->title != RT_NULL) && - rtgui_rect_contains_point(&(RTGUI_WIDGET(topwin->title)->extent), x, y) == RT_EOK) - { - return topwin; - } - else if (rtgui_rect_contains_point(&(topwin->extent), x, y) == RT_EOK) - { - return topwin; - } - } - - return RT_NULL; -} - -struct rtgui_topwin *rtgui_topwin_get_wnd(int x, int y) -{ - return _rtgui_topwin_get_wnd_from_tree(&_rtgui_topwin_list, x, y, RT_FALSE); -} - -struct rtgui_topwin *rtgui_topwin_get_wnd_no_modaled(int x, int y) -{ - return _rtgui_topwin_get_wnd_from_tree(&_rtgui_topwin_list, x, y, RT_TRUE); -} - -/* clip region from topwin, and the windows beneath it. */ -rt_inline void _rtgui_topwin_clip_to_region(struct rtgui_region *region, - struct rtgui_topwin *topwin) -{ - RT_ASSERT(region != RT_NULL); - RT_ASSERT(topwin != RT_NULL); - - if (topwin->title != RT_NULL) - { - rtgui_region_reset(&(RTGUI_WIDGET(topwin->title)->clip), - &(RTGUI_WIDGET(topwin->title)->extent)); - rtgui_region_intersect(&(RTGUI_WIDGET(topwin->title)->clip), - &(RTGUI_WIDGET(topwin->title)->clip), - region); - rtgui_region_subtract_rect(&(RTGUI_WIDGET(topwin->title)->clip), - &(RTGUI_WIDGET(topwin->title)->clip), - &topwin->extent); - } - - rtgui_region_reset(&RTGUI_WIDGET(topwin->wid)->clip, - &RTGUI_WIDGET(topwin->wid)->extent); - rtgui_region_intersect(&RTGUI_WIDGET(topwin->wid)->clip, - &RTGUI_WIDGET(topwin->wid)->clip, - region); -} - -static void rtgui_topwin_update_clip(void) -{ - struct rtgui_topwin *top; - struct rtgui_event_clip_info eclip; - /* Note that the region is a "female die", that means it's the region you - * can paint to, not the region covered by others. - */ - struct rtgui_region region_available; - - if (rtgui_dlist_isempty(&_rtgui_topwin_list) || - !(get_topwin_from_list(_rtgui_topwin_list.next)->flag & WINTITLE_SHOWN)) - return; - - RTGUI_EVENT_CLIP_INFO_INIT(&eclip); - - rtgui_region_init_rect(®ion_available, 0, 0, - rtgui_graphic_driver_get_default()->width, - rtgui_graphic_driver_get_default()->height); - - /* from top to bottom. */ - top = _rtgui_topwin_get_topmost_window_shown(WINTITLE_ONTOP); - /* 0 is normal layer */ - if (top == RT_NULL) - top = _rtgui_topwin_get_topmost_window_shown(0); - if (top == RT_NULL) - top = _rtgui_topwin_get_topmost_window_shown(WINTITLE_ONBTM); - - while (top != RT_NULL) - { - /* clip the topwin */ - _rtgui_topwin_clip_to_region(®ion_available, top); -#if 0 - /* debug window clipping */ - rt_kprintf("clip %s ", top->wid->title); - rtgui_region_dump(®ion_available); - rt_kprintf("\n"); -#endif - - /* update available region */ - if (top->title != RT_NULL) - rtgui_region_subtract_rect(®ion_available, ®ion_available, &RTGUI_WIDGET(top->title)->extent); - else - rtgui_region_subtract_rect(®ion_available, ®ion_available, &top->extent); - - /* send clip event to destination window */ - eclip.wid = top->wid; - rtgui_send(top->app, &(eclip.parent), sizeof(struct rtgui_event_clip_info)); - - /* move to next sibling tree */ - if (top->parent == RT_NULL) - if (top->list.next != &_rtgui_topwin_list && - get_topwin_from_list(top->list.next)->flag & WINTITLE_SHOWN) - top = _rtgui_topwin_get_topmost_child_shown(get_topwin_from_list(top->list.next)); - else - break; - /* move to next slibing topwin */ - else if (top->list.next != &top->parent->child_list && - get_topwin_from_list(top->list.next)->flag & WINTITLE_SHOWN) - top = _rtgui_topwin_get_topmost_child_shown(get_topwin_from_list(top->list.next)); - /* level up */ - else - top = top->parent; - } -} - -static void _rtgui_topwin_redraw_tree(struct rtgui_dlist_node *list, - struct rtgui_rect *rect, - struct rtgui_event_paint *epaint) -{ - struct rtgui_dlist_node *node; - - RT_ASSERT(list != RT_NULL); - RT_ASSERT(rect != RT_NULL); - RT_ASSERT(epaint != RT_NULL); - - /* skip the hidden windows */ - rtgui_dlist_foreach(node, list, prev) - { - if (get_topwin_from_list(node)->flag & WINTITLE_SHOWN) - break; - } - - for (; node != list; node = node->prev) - { - struct rtgui_topwin *topwin; - - topwin = get_topwin_from_list(node); - - //FIXME: intersect with clip? - if (rtgui_rect_is_intersect(rect, &(topwin->extent)) == RT_EOK) - { - epaint->wid = topwin->wid; - rtgui_send(topwin->app, &(epaint->parent), sizeof(*epaint)); - - /* draw title */ - if (topwin->title != RT_NULL) - { - rtgui_theme_draw_win(topwin); - } - } - - _rtgui_topwin_redraw_tree(&topwin->child_list, rect, epaint); - } -} - -static void rtgui_topwin_redraw(struct rtgui_rect *rect) -{ - struct rtgui_event_paint epaint; - RTGUI_EVENT_PAINT_INIT(&epaint); - epaint.wid = RT_NULL; - - _rtgui_topwin_redraw_tree(&_rtgui_topwin_list, rect, &epaint); -} - -/* a window enter modal mode will modal all the sibling window and parent - * window all along to the root window(which parent is RT_NULL or the desktop - * window if there is). If a root window modals, there is nothing to do here.*/ -rt_err_t rtgui_topwin_modal_enter(struct rtgui_event_win_modal_enter *event) -{ - struct rtgui_topwin *topwin, *parent_top; - struct rtgui_dlist_node *node; - - topwin = rtgui_topwin_search_in_list(event->wid, &_rtgui_topwin_list); - - if (topwin == RT_NULL) - return -RT_ERROR; - - if (IS_ROOT_WIN(topwin)) - return RT_EOK; - - parent_top = topwin->parent; - - /* modal window should be on top already */ - RT_ASSERT(get_topwin_from_list(parent_top->child_list.next) == topwin); - - while (!IS_ROOT_WIN(parent_top)) - { - rtgui_dlist_foreach(node, &parent_top->child_list, next) - get_topwin_from_list(node)->flag |= WINTITLE_MODALED; - parent_top->flag |= WINTITLE_MODALED; - - parent_top = parent_top->parent; - } - /* mark root window as modaled */ - parent_top->flag |= WINTITLE_MODALED; - - topwin->flag &= ~WINTITLE_MODALED; - topwin->flag |= WINTITLE_MODALING; - - return RT_EOK; -} - -void rtgui_topwin_title_onmouse(struct rtgui_topwin *win, struct rtgui_event_mouse *event) -{ - rtgui_rect_t rect; - - /* let window to process this mouse event */ - if (rtgui_rect_contains_point(&win->extent, event->x, event->y) == RT_EOK) - { - /* send mouse event to thread */ - rtgui_send(win->app, &(event->parent), sizeof(struct rtgui_event_mouse)); - return; - } - - /* get close button rect (device value) */ - rect.x1 = RTGUI_WIDGET(win->title)->extent.x2 - WINTITLE_BORDER_SIZE - WINTITLE_CB_WIDTH - 3; - rect.y1 = RTGUI_WIDGET(win->title)->extent.y1 + WINTITLE_BORDER_SIZE + 3; - rect.x2 = rect.x1 + WINTITLE_CB_WIDTH; - rect.y2 = rect.y1 + WINTITLE_CB_HEIGHT; - - if (event->button & RTGUI_MOUSE_BUTTON_LEFT) - { - if (event->button & RTGUI_MOUSE_BUTTON_DOWN) - { - if (rtgui_rect_contains_point(&rect, event->x, event->y) == RT_EOK) - { - win->flag |= WINTITLE_CB_PRESSED; - rtgui_theme_draw_win(win); - } -#ifdef RTGUI_USING_WINMOVE - else - { - /* maybe move window */ - rtgui_winrect_set(win); - } -#endif - } - else if (win->flag & WINTITLE_CB_PRESSED && event->button & RTGUI_MOUSE_BUTTON_UP) - { - if (rtgui_rect_contains_point(&rect, event->x, event->y) == RT_EOK) - { - struct rtgui_event_win event; - - win->flag &= ~WINTITLE_CB_PRESSED; - rtgui_theme_draw_win(win); - - /* send close event to window */ - RTGUI_EVENT_WIN_CLOSE_INIT(&event); - event.wid = win->wid; - rtgui_send(win->app, &(event.parent), sizeof(struct rtgui_event_win)); - } - } - } -} - -void rtgui_topwin_append_monitor_rect(struct rtgui_win *wid, rtgui_rect_t *rect) -{ - struct rtgui_topwin *win; - - /* parameters check */ - if (wid == RT_NULL || rect == RT_NULL) return; - - /* find topwin */ - win = rtgui_topwin_search_in_list(wid, &_rtgui_topwin_list); - if (win == RT_NULL) - return; - - /* append rect to top window monitor rect list */ - rtgui_mouse_monitor_append(&(win->monitor_list), rect); -} - -void rtgui_topwin_remove_monitor_rect(struct rtgui_win *wid, rtgui_rect_t *rect) -{ - struct rtgui_topwin *win; - - /* parameters check */ - if (wid == RT_NULL || rect == RT_NULL) - return; - - /* find topwin */ - win = rtgui_topwin_search_in_list(wid, &_rtgui_topwin_list); - if (win == RT_NULL) - return; - - /* remove rect from top window monitor rect list */ - rtgui_mouse_monitor_remove(&(win->monitor_list), rect); -} - -static void _rtgui_topwin_dump(struct rtgui_topwin *topwin) -{ - rt_kprintf("0x%p:%s,0x%x", topwin, topwin->wid->title, topwin->flag); -} - -static void _rtgui_topwin_dump_tree(struct rtgui_topwin *topwin) -{ - struct rtgui_dlist_node *node; - - _rtgui_topwin_dump(topwin); - - rt_kprintf("("); - rtgui_dlist_foreach(node, &topwin->child_list, next) - { - _rtgui_topwin_dump_tree(get_topwin_from_list(node)); - } - rt_kprintf(")"); -} - -void rtgui_topwin_dump_tree(void) -{ - struct rtgui_dlist_node *node; - - rtgui_dlist_foreach(node, &_rtgui_topwin_list, next) - { - _rtgui_topwin_dump_tree(get_topwin_from_list(node)); - rt_kprintf("\n"); - } -} - -#ifdef RT_USING_FINSH -#include <finsh.h> -void dump_tree() -{ - rtgui_topwin_dump_tree(); -} -FINSH_FUNCTION_EXPORT(dump_tree, dump rtgui topwin tree) -#endif diff --git a/components/rtgui/server/topwin.h b/components/rtgui/server/topwin.h deleted file mode 100644 index 45f41f34e9..0000000000 --- a/components/rtgui/server/topwin.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * File : topwin.h - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rt-thread.org/license/LICENSE - * - * Change Logs: - * Date Author Notes - * 2009-10-16 Bernard first version - */ -#ifndef __RTGUI_TOPWIN_H__ -#define __RTGUI_TOPWIN_H__ - -#include <rtgui/rtgui.h> -#include <rtgui/region.h> -#include <rtgui/event.h> -#include <rtgui/widgets/title.h> -#include <rtgui/rtgui_server.h> - -/* add or remove a top win */ -rt_err_t rtgui_topwin_add(struct rtgui_event_win_create *event); -rt_err_t rtgui_topwin_remove(struct rtgui_win *wid); -rt_err_t rtgui_topwin_activate(struct rtgui_event_win_activate *event); -rt_err_t rtgui_topwin_activate_topwin(struct rtgui_topwin *win); - -/* show a window */ -rt_err_t rtgui_topwin_show(struct rtgui_event_win *event); -/* hide a window */ -rt_err_t rtgui_topwin_hide(struct rtgui_event_win *event); -/* move a window */ -rt_err_t rtgui_topwin_move(struct rtgui_event_win_move *event); -/* resize a window */ -void rtgui_topwin_resize(struct rtgui_win *wid, rtgui_rect_t *r); -/* a window is entering modal mode */ -rt_err_t rtgui_topwin_modal_enter(struct rtgui_event_win_modal_enter *event); - -/* get window at (x, y) */ -struct rtgui_topwin *rtgui_topwin_get_wnd(int x, int y); -struct rtgui_topwin *rtgui_topwin_get_wnd_no_modaled(int x, int y); - -//void rtgui_topwin_deactivate_win(struct rtgui_topwin* win); - -/* window title */ -void rtgui_topwin_title_ondraw(struct rtgui_topwin *win); -void rtgui_topwin_title_onmouse(struct rtgui_topwin *win, struct rtgui_event_mouse *event); - -/* monitor rect */ -void rtgui_topwin_append_monitor_rect(struct rtgui_win *wid, rtgui_rect_t *rect); -void rtgui_topwin_remove_monitor_rect(struct rtgui_win *wid, rtgui_rect_t *rect); - -/* get the topwin that is currently focused */ -struct rtgui_topwin *rtgui_topwin_get_focus(void); -#endif - |
