mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-11-09 20:45:41 +08:00
reduce the size of clip_info event.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@306 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
1 parent
a8e372657e
commit
676602f89d
5 files changed
+189
-165
No files matched your search
@@ -659,167 +659,3 @@ void rtgui_free(void* ptr)
|
||||
rt_free(ptr);
|
||||
}
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* read/write lock implementation
|
||||
*/
|
||||
struct rtgui_rwlock* rtgui_rwlock_create()
|
||||
{
|
||||
struct rtgui_rwlock* rwlock;
|
||||
|
||||
rwlock = rtgui_malloc(sizeof(struct rtgui_rwlock));
|
||||
if (rwlock != RT_NULL)
|
||||
{
|
||||
rwlock->stat = RTGUI_RWLOCK_UNLOCK;
|
||||
rwlock->reader_count = 0;
|
||||
|
||||
rt_sem_init(&(rwlock->rd_lock), "rwr", 0, RT_IPC_FLAG_FIFO);
|
||||
rt_sem_init(&(rwlock->wr_lock), "rww", 0, RT_IPC_FLAG_FIFO);
|
||||
}
|
||||
|
||||
return rwlock;
|
||||
}
|
||||
|
||||
rt_err_t rtgui_rwlock_delete(struct rtgui_rwlock* rwlock)
|
||||
{
|
||||
RT_ASSERT(rwlock != RT_NULL);
|
||||
|
||||
rt_sem_detach(&(rwlock->rd_lock));
|
||||
rt_sem_detach(&(rwlock->wr_lock));
|
||||
|
||||
rtgui_free(rwlock);
|
||||
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
rt_err_t rtgui_rwlock_read_take(struct rtgui_rwlock* rwlock, rt_int32_t timeout)
|
||||
{
|
||||
rt_err_t result;
|
||||
rt_ubase_t level;
|
||||
|
||||
RT_ASSERT(rwlock != RT_NULL);
|
||||
level = rt_hw_interrupt_disable();
|
||||
switch (rwlock->stat)
|
||||
{
|
||||
case RTGUI_RWLOCK_UNLOCK:
|
||||
break;
|
||||
|
||||
case RTGUI_RWLOCK_READING:
|
||||
if (rwlock->wr_lock.parent.suspend_thread_count > 0)
|
||||
{
|
||||
/* suspend read thread */
|
||||
result = rt_sem_take(&rwlock->rd_lock, timeout);
|
||||
if (result != RT_EOK)
|
||||
{
|
||||
rt_hw_interrupt_enable(level);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case RTGUI_RWLOCK_WRITTING:
|
||||
/* suspend read thread */
|
||||
result = rt_sem_take(&(rwlock->rd_lock), timeout);
|
||||
if (result != RT_EOK)
|
||||
{
|
||||
rt_hw_interrupt_enable(level);
|
||||
return result;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/* get rwlock */
|
||||
rwlock->reader_count ++;
|
||||
rwlock->stat = RTGUI_RWLOCK_READING;
|
||||
|
||||
rt_hw_interrupt_enable(level);
|
||||
}
|
||||
|
||||
rt_err_t rtgui_rwlock_write_take(struct rtgui_rwlock* rwlock, rt_int32_t timeout)
|
||||
{
|
||||
rt_err_t result;
|
||||
rt_ubase_t level;
|
||||
|
||||
RT_ASSERT(rwlock != RT_NULL);
|
||||
|
||||
level = rt_hw_interrupt_disable();
|
||||
rwlock->stat = RTGUI_RWLOCK_WRITTING;
|
||||
result = rt_sem_take(&(rwlock->wr_lock), timeout);
|
||||
|
||||
if (result != RT_EOK)
|
||||
{
|
||||
if (rwlock->wr_lock.parent.suspend_thread_count == 0)
|
||||
{
|
||||
if (rwlock->reader_count > 0)
|
||||
rwlock->stat = RTGUI_RWLOCK_READING;
|
||||
}
|
||||
}
|
||||
rt_hw_interrupt_enable(level);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
rt_err_t rtgui_rwlock_read_release(struct rtgui_rwlock* rwlock)
|
||||
{
|
||||
rt_ubase_t level;
|
||||
|
||||
RT_ASSERT(rwlock != RT_NULL);
|
||||
|
||||
level = rt_hw_interrupt_disable();
|
||||
switch (rwlock->stat)
|
||||
{
|
||||
case RTGUI_RWLOCK_UNLOCK:
|
||||
ASSERT(0);
|
||||
break;
|
||||
|
||||
case RTGUI_RWLOCK_READING:
|
||||
rwlock->reader_count --;
|
||||
if (rwlock->reader_count == 0)
|
||||
rwlock->stat = RTGUI_RWLOCK_UNLOCK;
|
||||
break;
|
||||
|
||||
case RTGUI_RWLOCK_WRITTING:
|
||||
rwlock->reader_count --;
|
||||
|
||||
if (rwlock->reader_count == 0)
|
||||
{
|
||||
/* resume write */
|
||||
rt_sem_release(&(rwlock->wr_lock));
|
||||
}
|
||||
break;
|
||||
}
|
||||
rt_hw_interrupt_enable(level);
|
||||
}
|
||||
|
||||
rt_err_t rtgui_rwlock_write_release(struct rtgui_rwlock* rwlock)
|
||||
{
|
||||
rt_err_t result;
|
||||
rt_ubase_t level;
|
||||
|
||||
RT_ASSERT(rwlock != RT_NULL);
|
||||
|
||||
level = rt_hw_interrupt_disable();
|
||||
result = rt_sem_release(&(rwlock->wr_lock));
|
||||
|
||||
if ((result == RT_EOK) && (rwlock->wr_lock.parent.suspend_thread_count == 0))
|
||||
{
|
||||
rt_uint32_t index, reader_thread_count;
|
||||
|
||||
reader_thread_count = rwlock->rd_lock.parent.suspend_thread_count;
|
||||
if (reader_thread_count > 0)
|
||||
{
|
||||
rwlock->stat = RTGUI_RWLOCK_READING;
|
||||
|
||||
/* resume all reader thread */
|
||||
for (index = 0; index < reader_thread_count; index ++)
|
||||
{
|
||||
rt_sem_release(&(rwlock->rd_lock));
|
||||
}
|
||||
}
|
||||
else rwlock->stat = RTGUI_RWLOCK_UNLOCK;
|
||||
}
|
||||
rt_hw_interrupt_enable(level);
|
||||
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
@@ -78,3 +78,4 @@ void* rtgui_malloc(rt_size_t size);
|
||||
void rtgui_free(void* ptr);
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -53,4 +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);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -116,7 +116,7 @@ rt_bool_t rtgui_toplevel_event_handler(rtgui_widget_t* widget, rtgui_event_t* ev
|
||||
}
|
||||
|
||||
void rtgui_toplevel_handle_clip(struct rtgui_toplevel* top,
|
||||
struct rtgui_event_clip_info* info)
|
||||
struct rtgui_event_clip_info* info)
|
||||
{
|
||||
RT_ASSERT(top != RT_NULL);
|
||||
RT_ASSERT(info != RT_NULL);
|
||||
@@ -136,8 +136,13 @@ void rtgui_toplevel_handle_clip(struct rtgui_toplevel* top,
|
||||
info->num_rect);
|
||||
top->external_clip_size = info->num_rect;
|
||||
|
||||
#ifdef RTGUI_USING_SMALL_SIZE
|
||||
/* 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 */
|
||||
|
||||
Reference in new issue
Block a user