From 211e1aa33446574d3b6e11bd3cefc27fb6b9306b Mon Sep 17 00:00:00 2001 From: "bernard.xiong@gmail.com" Date: Tue, 25 Jan 2011 00:05:52 +0000 Subject: [PATCH] re-write external clip. git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1261 bbd45198-f89e-11dd-88c7-29a3b14d5316 --- components/rtgui/common/rtgui_system.c | 2 +- components/rtgui/common/rtgui_theme.c | 4 +- .../rtgui/include/rtgui/widgets/toplevel.h | 2 - components/rtgui/server/topwin.c | 109 +++--------------- components/rtgui/server/topwin.h | 2 +- components/rtgui/widgets/toplevel.c | 55 +-------- components/rtgui/widgets/widget.c | 13 +-- 7 files changed, 22 insertions(+), 165 deletions(-) diff --git a/components/rtgui/common/rtgui_system.c b/components/rtgui/common/rtgui_system.c index 4d5fe601b5..2888d85ce9 100644 --- a/components/rtgui/common/rtgui_system.c +++ b/components/rtgui/common/rtgui_system.c @@ -22,7 +22,7 @@ // #define RTGUI_EVENT_DEBUG -#ifdef __WIN32__ +#ifdef _WIN32 #define RTGUI_EVENT_DEBUG #define RTGUI_MEM_TRACE #endif diff --git a/components/rtgui/common/rtgui_theme.c b/components/rtgui/common/rtgui_theme.c index 3e86b060a9..5e337482a7 100644 --- a/components/rtgui/common/rtgui_theme.c +++ b/components/rtgui/common/rtgui_theme.c @@ -81,11 +81,11 @@ void rtgui_theme_draw_win(struct rtgui_topwin* win) RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(win->title)) = RTGUI_RGB(128, 128, 128); rtgui_dc_draw_hline(dc, rect.x1 + 1, rect.x2 - 1, rect.y2 - 1); - rtgui_dc_draw_vline(dc, rect.x2 - 1, rect.y1 + 1, rect.y2 - 1); + rtgui_dc_draw_vline(dc, rect.x2 - 1, rect.y1 + 1, rect.y2); RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(win->title)) = RTGUI_RGB(64, 64, 64); rtgui_dc_draw_hline(dc, rect.x1, rect.x2, rect.y2); - rtgui_dc_draw_vline(dc, rect.x2, rect.y1, rect.y2); + rtgui_dc_draw_vline(dc, rect.x2, rect.y1, rect.y2 + 1); /* shrink border */ rtgui_rect_inflate(&rect, -WINTITLE_BORDER_SIZE); diff --git a/components/rtgui/include/rtgui/widgets/toplevel.h b/components/rtgui/include/rtgui/widgets/toplevel.h index 463b7e76d2..1ef443351f 100644 --- a/components/rtgui/include/rtgui/widgets/toplevel.h +++ b/components/rtgui/include/rtgui/widgets/toplevel.h @@ -44,8 +44,6 @@ rtgui_type_t *rtgui_toplevel_type_get(void); rt_bool_t rtgui_toplevel_event_handler(rtgui_widget_t* widget, rtgui_event_t* event); -void rtgui_toplevel_handle_clip(struct rtgui_toplevel* top, - struct rtgui_event_clip_info* info); void rtgui_toplevel_update_clip(rtgui_toplevel_t* top); #endif diff --git a/components/rtgui/server/topwin.c b/components/rtgui/server/topwin.c index b1c9749d18..a655d5a56e 100644 --- a/components/rtgui/server/topwin.c +++ b/components/rtgui/server/topwin.c @@ -313,7 +313,6 @@ void rtgui_topwin_raise(struct rtgui_win* wid, rt_thread_t sender) /* reset clip info in title */ if (wnd->title != RT_NULL) { - rtgui_toplevel_handle_clip(RTGUI_TOPLEVEL(wnd->title), &eclip); rtgui_toplevel_update_clip(RTGUI_TOPLEVEL(wnd->title)); rtgui_region_subtract_rect(&(RTGUI_WIDGET(wnd->title)->clip), &(RTGUI_WIDGET(wnd->title)->clip), @@ -368,7 +367,6 @@ void rtgui_topwin_raise(struct rtgui_win* wid, rt_thread_t sender) /* reset clip info in title */ if (topwin->title != RT_NULL) { - rtgui_toplevel_handle_clip(RTGUI_TOPLEVEL(topwin->title), eclip); rtgui_toplevel_update_clip(RTGUI_TOPLEVEL(topwin->title)); rtgui_region_subtract_rect(&(RTGUI_WIDGET(topwin->title)->clip), &(RTGUI_WIDGET(topwin->title)->clip), @@ -396,7 +394,6 @@ void rtgui_topwin_raise(struct rtgui_win* wid, rt_thread_t sender) /* reset clip info in title */ if (wnd->title != RT_NULL) { - rtgui_toplevel_handle_clip(RTGUI_TOPLEVEL(wnd->title), eclip); rtgui_toplevel_update_clip(RTGUI_TOPLEVEL(wnd->title)); rtgui_region_subtract_rect(&(RTGUI_WIDGET(wnd->title)->clip), &(RTGUI_WIDGET(wnd->title)->clip), @@ -746,7 +743,6 @@ struct rtgui_topwin* rtgui_topwin_get_wnd(int x, int y) } extern struct rtgui_list_node _rtgui_panel_list; -#ifdef RTGUI_USING_SMALL_SIZE static void rtgui_topwin_update_clip() { rt_int32_t count = 0; @@ -772,7 +768,6 @@ static void rtgui_topwin_update_clip() if (wnd->title != RT_NULL) { /* reset clip info */ - rtgui_toplevel_handle_clip(RTGUI_TOPLEVEL(wnd->title), &eclip); rtgui_toplevel_update_clip(RTGUI_TOPLEVEL(wnd->title)); rtgui_region_subtract_rect(&(RTGUI_WIDGET(wnd->title)->clip), &(RTGUI_WIDGET(wnd->title)->clip), @@ -801,79 +796,6 @@ static void rtgui_topwin_update_clip() } } } -#else -static void rtgui_topwin_update_clip() -{ - rt_int32_t count = 0; - struct rtgui_event_clip_info* eclip; - struct rtgui_list_node* node = _rtgui_topwin_show_list.next; - - /* calculate count */ - while (node != RT_NULL) - { - count ++; - node = node->next; - } - - eclip = (struct rtgui_event_clip_info*)rtgui_malloc(sizeof(struct rtgui_event_clip_info) - + count * sizeof(struct rtgui_rect)); - RTGUI_EVENT_CLIP_INFO_INIT(eclip); - - count = 0; - rtgui_list_foreach(node, &_rtgui_topwin_show_list) - { - struct rtgui_rect* rect; - struct rtgui_topwin* wnd; - wnd = rtgui_list_entry(node, struct rtgui_topwin, list); - - eclip->num_rect = count; - eclip->wid = wnd->wid; - - /* send to destination window */ - rtgui_thread_send(wnd->tid, &(eclip->parent), - sizeof(struct rtgui_event_clip_info) + count * sizeof(struct rtgui_rect)); - - /* update clip in win title */ - if (wnd->title != RT_NULL) - { - /* reset clip info */ - rtgui_toplevel_handle_clip(RTGUI_TOPLEVEL(wnd->title), eclip); - rtgui_toplevel_update_clip(RTGUI_TOPLEVEL(wnd->title)); - rtgui_region_subtract_rect(&(RTGUI_WIDGET(wnd->title)->clip), - &(RTGUI_WIDGET(wnd->title)->clip), - &(wnd->extent)); - } - - rect = RTGUI_EVENT_GET_RECT(eclip, count++); - *rect = (wnd->title != RT_NULL)? RTGUI_WIDGET(wnd->title)->extent : wnd->extent; - } - - /* send clip info to each panel */ - eclip->wid = RT_NULL; - eclip->num_rect = count; - - rtgui_list_foreach(node, &(_rtgui_panel_list)) - { - struct rtgui_panel* panel; - struct rtgui_list_node* panel_node; - - panel = rtgui_list_entry(node, struct rtgui_panel, sibling); - - rtgui_list_foreach(panel_node, &(panel->thread_list)) - { - struct rtgui_panel_thread* thread; - thread = rtgui_list_entry(panel_node, struct rtgui_panel_thread, list); - - /* send clip info to panel */ - rtgui_thread_send(thread->tid, &(eclip->parent), - sizeof(struct rtgui_event_clip_info) + count * sizeof(struct rtgui_rect)); - } - } - - /* release clip info event */ - rtgui_free(eclip); -} -#endif static void rtgui_topwin_redraw(struct rtgui_rect* rect) { @@ -1010,23 +932,19 @@ void rtgui_topwin_remove_monitor_rect(struct rtgui_win* wid, rtgui_rect_t* rect) rtgui_mouse_monitor_remove(&(win->monitor_list), rect); } -#ifdef RTGUI_USING_SMALL_SIZE /** - * get clip information for topwin - * wid, the self window id. If wid = NULL, get whole topwin clip information. - * - * @return the clip rect information + * do clip for topwin list + * widget, the clip widget to be done clip */ -void rtgui_topwin_get_clipinfo(struct rtgui_rect* rect_list, rt_int32_t count) +void rtgui_topwin_do_clip(rtgui_widget_t* widget) { + rtgui_toplevel_t* wid; struct rtgui_rect* rect; struct rtgui_topwin* topwin; struct rtgui_list_node* node; - if ((rect_list == RT_NULL) || (count == 0)) return ; - - /* set to the header of list */ - rect = rect_list; + /* get toplevel wid */ + wid = widget->toplevel; rt_sem_take(&_rtgui_topwin_lock, RT_WAITING_FOREVER); /* get all of topwin rect list */ @@ -1034,15 +952,18 @@ void rtgui_topwin_get_clipinfo(struct rtgui_rect* rect_list, rt_int32_t count) { topwin = rtgui_list_entry(node, struct rtgui_topwin, list); + if (topwin->wid == (rtgui_win_t*)(wid) || + RTGUI_WIDGET(topwin->title) == widget) break; /* it's self window, break */ + + /* get extent */ if (topwin->title != RT_NULL) - *rect = RTGUI_WIDGET(topwin->title)->extent; + rect = &(RTGUI_WIDGET(topwin->title)->extent); else - *rect = topwin->extent; + rect = &(topwin->extent); - rect ++; - count --; - if (count <= 0) break; + /* subtract the topwin rect */ + rtgui_region_subtract_rect(&(widget->clip), &(widget->clip), rect); } rt_sem_release(&_rtgui_topwin_lock); } -#endif + diff --git a/components/rtgui/server/topwin.h b/components/rtgui/server/topwin.h index 8bfe394235..8ec5a5c6cc 100644 --- a/components/rtgui/server/topwin.h +++ b/components/rtgui/server/topwin.h @@ -53,7 +53,7 @@ void rtgui_topwin_title_onmouse(struct rtgui_topwin* win, struct rtgui_event_mou 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); -void rtgui_topwin_get_clipinfo(struct rtgui_rect* rect_list, rt_int32_t count); +void rtgui_topwin_do_clip(rtgui_widget_t* widget); #endif diff --git a/components/rtgui/widgets/toplevel.c b/components/rtgui/widgets/toplevel.c index 0f12c22f68..dd501cf91e 100644 --- a/components/rtgui/widgets/toplevel.c +++ b/components/rtgui/widgets/toplevel.c @@ -24,8 +24,6 @@ static void _rtgui_toplevel_constructor(rtgui_toplevel_t *toplevel) /* init toplevel property */ toplevel->drawing = 0; - toplevel->external_clip_rect = RT_NULL; - toplevel->external_clip_size = 0; /* hide toplevel default */ RTGUI_WIDGET_HIDE(RTGUI_WIDGET(toplevel)); @@ -38,12 +36,6 @@ static void _rtgui_toplevel_destructor(rtgui_toplevel_t* toplevel) { /* release external clip info */ toplevel->drawing = 0; - if (toplevel->external_clip_size > 0) - { - rtgui_free(toplevel->external_clip_rect); - toplevel->external_clip_rect = RT_NULL; - toplevel->external_clip_size = 0; - } } rtgui_type_t *rtgui_toplevel_type_get(void) @@ -75,9 +67,6 @@ rt_bool_t rtgui_toplevel_event_handler(rtgui_widget_t* widget, rtgui_event_t* ev break; case RTGUI_EVENT_CLIP_INFO: - /* set toplevel external clip info */ - rtgui_toplevel_handle_clip(toplevel, (struct rtgui_event_clip_info*)event); - /* update toplevel clip */ rtgui_toplevel_update_clip(toplevel); break; @@ -116,44 +105,6 @@ rt_bool_t rtgui_toplevel_event_handler(rtgui_widget_t* widget, rtgui_event_t* ev return RT_FALSE; } -#include -#include -#include - -void rtgui_toplevel_handle_clip(struct rtgui_toplevel* top, - struct rtgui_event_clip_info* info) -{ - RT_ASSERT(top != RT_NULL); - RT_ASSERT(info != RT_NULL); - - /* release old rect array */ - if (top->external_clip_size != 0) - { - rtgui_free(top->external_clip_rect); - top->external_clip_rect = RT_NULL; - top->external_clip_size = 0; - } - - /* no rect info */ - if (info->num_rect == 0) return; - - top->external_clip_rect = (rtgui_rect_t*) rtgui_malloc(sizeof(rtgui_rect_t) * - info->num_rect); - top->external_clip_size = info->num_rect; - -#ifdef RTGUI_USING_SMALL_SIZE - { - extern void rtgui_topwin_get_clipinfo(struct rtgui_rect* list, rt_int32_t count); - - /* get rect list from topwin list */ - rtgui_topwin_get_clipinfo(top->external_clip_rect, top->external_clip_size); - } -#else - /* copy rect array */ - rt_memcpy(top->external_clip_rect, (void*)(info + 1), sizeof(rtgui_rect_t) * info->num_rect); -#endif -} - #include /* to get screen rect */ void rtgui_toplevel_update_clip(rtgui_toplevel_t* top) @@ -176,11 +127,7 @@ void rtgui_toplevel_update_clip(rtgui_toplevel_t* top) &screen_rect); /* subtract the external rect */ - for (idx = 0; idx < top->external_clip_size; idx ++) - { - rtgui_region_subtract_rect(&(RTGUI_WIDGET(top)->clip), &(RTGUI_WIDGET(top)->clip), - &(top->external_clip_rect[idx])); - } + rtgui_topwin_do_clip(RTGUI_WIDGET(top)); /* update the clip info of each child */ container = RTGUI_CONTAINER(top); diff --git a/components/rtgui/widgets/widget.c b/components/rtgui/widgets/widget.c index 304e59b86c..0946dd8fa0 100644 --- a/components/rtgui/widgets/widget.c +++ b/components/rtgui/widgets/widget.c @@ -509,11 +509,8 @@ void rtgui_widget_hide(rtgui_widget_t* widget) if (widget->parent != RT_NULL) { - int index; rtgui_widget_t *parent; - rtgui_toplevel_t *toplevel; - rect = widget->extent; parent = widget->parent; /* get the no transparent parent */ while (parent != RT_NULL && parent->flag & RTGUI_WIDGET_FLAG_TRANSPARENT) @@ -522,16 +519,10 @@ void rtgui_widget_hide(rtgui_widget_t* widget) } /* union widget rect */ - rtgui_region_union_rect(&(widget->parent->clip), &(widget->parent->clip), &rect); + rtgui_region_union_rect(&(parent->clip), &(parent->clip), &(widget->extent)); - /* handle extern rect */ - toplevel = RTGUI_TOPLEVEL(widget->toplevel); /* subtract the external rect */ - for (index = 0; index < toplevel->external_clip_size; index ++) - { - rtgui_region_subtract_rect(&(widget->parent->clip), &(widget->parent->clip), - &(toplevel->external_clip_rect[index])); - } + rtgui_topwin_do_clip(RTGUI_WIDGET(parent)); } } -- GitLab