提交 211e1aa3 编写于 作者: B bernard.xiong@gmail.com

re-write external clip.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1261 bbd45198-f89e-11dd-88c7-29a3b14d5316
上级 ffa3e22d
......@@ -22,7 +22,7 @@
// #define RTGUI_EVENT_DEBUG
#ifdef __WIN32__
#ifdef _WIN32
#define RTGUI_EVENT_DEBUG
#define RTGUI_MEM_TRACE
#endif
......
......@@ -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);
......
......@@ -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
......@@ -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
......@@ -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
......@@ -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);
......
......@@ -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));
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册