struct rtgui_dc* rtgui_dc_client_create(rtgui_widget_t* owner) { struct rtgui_dc* dc; rtgui_widget_t* widget; /* adjudge owner */ if (owner == RT_NULL || owner->toplevel == RT_NULL) return RT_NULL; if (!RTGUI_IS_TOPLEVEL(owner->toplevel)) return RT_NULL; dc = RTGUI_WIDGET_DC(owner); /* set init visible as true */ RTGUI_WIDGET_DC_SET_VISIBLE(owner); /* check widget visible */ widget = owner; while (widget != RT_NULL) { if (RTGUI_WIDGET_IS_HIDE(widget)) { RTGUI_WIDGET_DC_SET_UNVISIBLE(owner); break; } widget = widget->parent; } if (RTGUI_IS_WINTITLE(owner->toplevel)) { rtgui_toplevel_t* top = RTGUI_TOPLEVEL(owner->toplevel); top->drawing ++; if (top->drawing == 1) { #ifdef RTGUI_USING_MOUSE_CURSOR #ifdef __WIN32__ rt_mutex_take(&cursor_mutex, RT_WAITING_FOREVER); rt_kprintf("hide cursor\n"); rtgui_mouse_hide_cursor(); #else /* hide cursor */ rtgui_mouse_hide_cursor(); #endif #endif } } else if (RTGUI_IS_WORKBENCH(owner->toplevel) || RTGUI_IS_WIN(owner->toplevel)) { rtgui_toplevel_t* top = RTGUI_TOPLEVEL(owner->toplevel); top->drawing ++; if (top->drawing == 1) { #ifdef __WIN32__ #ifdef RTGUI_USING_MOUSE_CURSOR rt_mutex_take(&cursor_mutex, RT_WAITING_FOREVER); rt_kprintf("hide cursor\n"); rtgui_mouse_hide_cursor(); #endif #else /* send draw begin to server */ struct rtgui_event_update_begin eupdate; RTGUI_EVENT_UPDATE_BEGIN_INIT(&(eupdate)); eupdate.rect = RTGUI_WIDGET(top)->extent; rtgui_thread_send(top->server, (struct rtgui_event*)&eupdate, sizeof(eupdate)); #endif } } return dc; }
struct rtgui_dc* rtgui_dc_hw_create(rtgui_widget_t* owner) { struct rtgui_dc_hw* dc; rtgui_widget_t* widget; /* adjudge owner */ if (owner == RT_NULL || owner->toplevel == RT_NULL) return RT_NULL; if (!RTGUI_IS_TOPLEVEL(owner->toplevel)) return RT_NULL; /* set init visible as true */ RTGUI_WIDGET_DC_SET_VISIBLE(owner); /* check widget visible */ widget = owner; while (widget != RT_NULL) { if (RTGUI_WIDGET_IS_HIDE(widget)) { RTGUI_WIDGET_DC_SET_UNVISIBLE(owner); return RT_NULL; } widget = widget->parent; } if (!RTGUI_WIDGET_IS_DC_VISIBLE(owner)) return RT_NULL; /* create DC */ dc = (struct rtgui_dc_hw*) rtgui_malloc(sizeof(struct rtgui_dc_hw)); dc->parent.type = RTGUI_DC_HW; dc->parent.engine = &dc_hw_engine; dc->owner = owner; dc->hw_driver = rtgui_graphic_driver_get_default(); if (RTGUI_IS_WINTITLE(owner->toplevel)) { rtgui_toplevel_t* top = RTGUI_TOPLEVEL(owner->toplevel); top->drawing ++; if (top->drawing == 1) { #ifdef RTGUI_USING_MOUSE_CURSOR #ifdef _WIN32 rt_mutex_take(&cursor_mutex, RT_WAITING_FOREVER); rt_kprintf("hide cursor\n"); rtgui_mouse_hide_cursor(); #else /* hide cursor */ rtgui_mouse_hide_cursor(); #endif #endif } } else if (RTGUI_IS_APPLICATION(owner->toplevel) || RTGUI_IS_WIN(owner->toplevel)) { rtgui_toplevel_t* top = RTGUI_TOPLEVEL(owner->toplevel); top->drawing ++; if (top->drawing == 1) { #ifdef _WIN32 #ifdef RTGUI_USING_MOUSE_CURSOR rt_mutex_take(&cursor_mutex, RT_WAITING_FOREVER); rt_kprintf("hide cursor\n"); rtgui_mouse_hide_cursor(); #endif #else /* send draw begin to server */ struct rtgui_event_update_begin eupdate; RTGUI_EVENT_UPDATE_BEGIN_INIT(&(eupdate)); eupdate.rect = RTGUI_WIDGET(top)->extent; rtgui_server_post_event((struct rtgui_event*)&eupdate, sizeof(eupdate)); #endif } } return &(dc->parent); }