Browse Source

re-write external clip.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1261 bbd45198-f89e-11dd-88c7-29a3b14d5316
bernard.xiong@gmail.com 14 years ago
parent
commit
211e1aa334

+ 1 - 1
components/rtgui/common/rtgui_system.c

@@ -22,7 +22,7 @@
 
 
 // #define RTGUI_EVENT_DEBUG
 // #define RTGUI_EVENT_DEBUG
 
 
-#ifdef __WIN32__
+#ifdef _WIN32
 #define RTGUI_EVENT_DEBUG
 #define RTGUI_EVENT_DEBUG
 #define RTGUI_MEM_TRACE
 #define RTGUI_MEM_TRACE
 #endif
 #endif

+ 2 - 2
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_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_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_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_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 */
 		/* shrink border */
 		rtgui_rect_inflate(&rect, -WINTITLE_BORDER_SIZE);
 		rtgui_rect_inflate(&rect, -WINTITLE_BORDER_SIZE);

+ 0 - 2
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);
 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);
 void rtgui_toplevel_update_clip(rtgui_toplevel_t* top);
 
 
 #endif
 #endif

+ 15 - 94
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 */
 			/* reset clip info in title */
 			if (wnd->title != RT_NULL)
 			if (wnd->title != RT_NULL)
 			{
 			{
-				rtgui_toplevel_handle_clip(RTGUI_TOPLEVEL(wnd->title), &eclip);
 				rtgui_toplevel_update_clip(RTGUI_TOPLEVEL(wnd->title));
 				rtgui_toplevel_update_clip(RTGUI_TOPLEVEL(wnd->title));
 				rtgui_region_subtract_rect(&(RTGUI_WIDGET(wnd->title)->clip),
 				rtgui_region_subtract_rect(&(RTGUI_WIDGET(wnd->title)->clip),
 					&(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 */
 		/* reset clip info in title */
 		if (topwin->title != RT_NULL)
 		if (topwin->title != RT_NULL)
 		{
 		{
-			rtgui_toplevel_handle_clip(RTGUI_TOPLEVEL(topwin->title), eclip);
 			rtgui_toplevel_update_clip(RTGUI_TOPLEVEL(topwin->title));
 			rtgui_toplevel_update_clip(RTGUI_TOPLEVEL(topwin->title));
 			rtgui_region_subtract_rect(&(RTGUI_WIDGET(topwin->title)->clip),
 			rtgui_region_subtract_rect(&(RTGUI_WIDGET(topwin->title)->clip),
 				&(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 */
 			/* reset clip info in title */
 			if (wnd->title != RT_NULL)
 			if (wnd->title != RT_NULL)
 			{
 			{
-				rtgui_toplevel_handle_clip(RTGUI_TOPLEVEL(wnd->title), eclip);
 				rtgui_toplevel_update_clip(RTGUI_TOPLEVEL(wnd->title));
 				rtgui_toplevel_update_clip(RTGUI_TOPLEVEL(wnd->title));
 				rtgui_region_subtract_rect(&(RTGUI_WIDGET(wnd->title)->clip),
 				rtgui_region_subtract_rect(&(RTGUI_WIDGET(wnd->title)->clip),
 					&(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;
 extern struct rtgui_list_node _rtgui_panel_list;
-#ifdef RTGUI_USING_SMALL_SIZE
 static void rtgui_topwin_update_clip()
 static void rtgui_topwin_update_clip()
 {
 {
 	rt_int32_t count = 0;
 	rt_int32_t count = 0;
@@ -772,7 +768,6 @@ static void rtgui_topwin_update_clip()
 		if (wnd->title != RT_NULL)
 		if (wnd->title != RT_NULL)
 		{
 		{
 			/* reset clip info */
 			/* reset clip info */
-			rtgui_toplevel_handle_clip(RTGUI_TOPLEVEL(wnd->title), &eclip);
 			rtgui_toplevel_update_clip(RTGUI_TOPLEVEL(wnd->title));
 			rtgui_toplevel_update_clip(RTGUI_TOPLEVEL(wnd->title));
 			rtgui_region_subtract_rect(&(RTGUI_WIDGET(wnd->title)->clip),
 			rtgui_region_subtract_rect(&(RTGUI_WIDGET(wnd->title)->clip),
 				&(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)
 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);
 	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_rect* rect;
 	struct rtgui_topwin* topwin;
 	struct rtgui_topwin* topwin;
 	struct rtgui_list_node* node;
 	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);
 	rt_sem_take(&_rtgui_topwin_lock, RT_WAITING_FOREVER);
 	/* get all of topwin rect list */
 	/* 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);
 		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) 
 		if (topwin->title != RT_NULL) 
-			*rect = RTGUI_WIDGET(topwin->title)->extent;
+			rect = &(RTGUI_WIDGET(topwin->title)->extent);
 		else 
 		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);
 	rt_sem_release(&_rtgui_topwin_lock);
 }
 }
-#endif
+

+ 1 - 1
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_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_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
 #endif
 
 

+ 1 - 54
components/rtgui/widgets/toplevel.c

@@ -24,8 +24,6 @@ static void _rtgui_toplevel_constructor(rtgui_toplevel_t *toplevel)
 
 
 	/* init toplevel property */
 	/* init toplevel property */
 	toplevel->drawing = 0;
 	toplevel->drawing = 0;
-	toplevel->external_clip_rect = RT_NULL;
-	toplevel->external_clip_size = 0;
 
 
 	/* hide toplevel default */
 	/* hide toplevel default */
 	RTGUI_WIDGET_HIDE(RTGUI_WIDGET(toplevel));
 	RTGUI_WIDGET_HIDE(RTGUI_WIDGET(toplevel));
@@ -38,12 +36,6 @@ static void _rtgui_toplevel_destructor(rtgui_toplevel_t* toplevel)
 {
 {
 	/* release external clip info */
 	/* release external clip info */
 	toplevel->drawing = 0;
 	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)
 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;
 		break;
 
 
 	case RTGUI_EVENT_CLIP_INFO:
 	case RTGUI_EVENT_CLIP_INFO:
-		/* set toplevel external clip info */
-		rtgui_toplevel_handle_clip(toplevel, (struct rtgui_event_clip_info*)event);
-
 		/* update toplevel clip */
 		/* update toplevel clip */
 		rtgui_toplevel_update_clip(toplevel);
 		rtgui_toplevel_update_clip(toplevel);
 		break;
 		break;
@@ -116,44 +105,6 @@ rt_bool_t rtgui_toplevel_event_handler(rtgui_widget_t* widget, rtgui_event_t* ev
 	return RT_FALSE;
 	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 */
 #include <rtgui/driver.h> /* to get screen rect */
 
 
 void rtgui_toplevel_update_clip(rtgui_toplevel_t* top)
 void rtgui_toplevel_update_clip(rtgui_toplevel_t* top)
@@ -176,11 +127,7 @@ void rtgui_toplevel_update_clip(rtgui_toplevel_t* top)
 		&screen_rect);
 		&screen_rect);
 
 
 	/* subtract the external 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 */
 	/* update the clip info of each child */
 	container = RTGUI_CONTAINER(top);
 	container = RTGUI_CONTAINER(top);

+ 2 - 11
components/rtgui/widgets/widget.c

@@ -509,11 +509,8 @@ void rtgui_widget_hide(rtgui_widget_t* widget)
 
 
 	if (widget->parent != RT_NULL)
 	if (widget->parent != RT_NULL)
 	{
 	{
-		int index;
 		rtgui_widget_t *parent;
 		rtgui_widget_t *parent;
-		rtgui_toplevel_t *toplevel;
 
 
-		rect = widget->extent;
 		parent = widget->parent;
 		parent = widget->parent;
 		/* get the no transparent parent */
 		/* get the no transparent parent */
 		while (parent != RT_NULL && parent->flag & RTGUI_WIDGET_FLAG_TRANSPARENT)
 		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 */
 		/* 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 */
 		/* 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));
 	}
 	}
 }
 }