summaryrefslogtreecommitdiff
path: root/components/rtgui
diff options
context:
space:
mode:
author[email protected] <[email protected]>2011-01-25 00:05:52 +0000
committer[email protected] <[email protected]>2011-01-25 00:05:52 +0000
commit211e1aa33446574d3b6e11bd3cefc27fb6b9306b (patch)
treea0dd64fceabe8d8c46fa70e7a3c195fc7f272d79 /components/rtgui
parentffa3e22d2e7440a6e93e8142e18a7c6a17997511 (diff)
re-write external clip.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1261 bbd45198-f89e-11dd-88c7-29a3b14d5316
Diffstat (limited to 'components/rtgui')
-rw-r--r--components/rtgui/common/rtgui_system.c2
-rw-r--r--components/rtgui/common/rtgui_theme.c4
-rw-r--r--components/rtgui/include/rtgui/widgets/toplevel.h2
-rw-r--r--components/rtgui/server/topwin.c109
-rw-r--r--components/rtgui/server/topwin.h2
-rw-r--r--components/rtgui/widgets/toplevel.c55
-rw-r--r--components/rtgui/widgets/widget.c13
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 <rtgui/widgets/window.h>
-#include <rtgui/widgets/workbench.h>
-#include <rtgui/widgets/title.h>
-
-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 <rtgui/driver.h> /* 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));
}
}