summaryrefslogtreecommitdiff
path: root/components/rtgui
diff options
context:
space:
mode:
author[email protected] <[email protected]>2010-08-04 23:39:01 +0000
committer[email protected] <[email protected]>2010-08-04 23:39:01 +0000
commit898ad75a7afec41a8d91c9dbe7f6ff5c9a47a572 (patch)
treeb9ce66c28cba9dbd4ef87099a83e0f06bd139c0e /components/rtgui
parent1451735e9edecb2d11576920af36b55e8a539a0d (diff)
add on_idle call back function.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@829 bbd45198-f89e-11dd-88c7-29a3b14d5316
Diffstat (limited to 'components/rtgui')
-rw-r--r--components/rtgui/common/rtgui_system.c35
-rw-r--r--components/rtgui/include/rtgui/rtgui_system.h7
-rw-r--r--components/rtgui/widgets/window.c47
-rw-r--r--components/rtgui/widgets/workbench.c31
4 files changed, 109 insertions, 11 deletions
diff --git a/components/rtgui/common/rtgui_system.c b/components/rtgui/common/rtgui_system.c
index df438ab5ee..cb04189266 100644
--- a/components/rtgui/common/rtgui_system.c
+++ b/components/rtgui/common/rtgui_system.c
@@ -285,6 +285,7 @@ rtgui_thread_t* rtgui_thread_register(rt_thread_t tid, rt_mq_t mq)
thread->tid = tid;
thread->mq = mq;
thread->widget = RT_NULL;
+ thread->on_idle = RT_NULL;
/* set user thread */
tid->user_data = (rt_uint32_t)thread;
@@ -323,6 +324,26 @@ rtgui_thread_t* rtgui_thread_self()
return thread;
}
+void rtgui_thread_set_onidle(rtgui_idle_func onidle)
+{
+ struct rtgui_thread* thread;
+
+ thread = rtgui_thread_self();
+ RT_ASSERT(thread != RT_NULL);
+
+ thread->on_idle = onidle;
+}
+
+rtgui_idle_func rtgui_thread_get_onidle()
+{
+ struct rtgui_thread* thread;
+
+ thread = rtgui_thread_self();
+ RT_ASSERT(thread != RT_NULL);
+
+ return thread->on_idle;
+}
+
extern rt_thread_t rt_thread_find(char* name);
rt_thread_t rtgui_thread_get_server()
{
@@ -455,6 +476,20 @@ rt_err_t rtgui_thread_recv(rtgui_event_t* event, rt_size_t event_size)
return r;
}
+rt_err_t rtgui_thread_recv_nosuspend(rtgui_event_t* event, rt_size_t event_size)
+{
+ struct rtgui_thread* thread;
+ rt_err_t r;
+
+ /* find rtgui_thread */
+ thread = (struct rtgui_thread*) (rt_thread_self()->user_data);
+ if (thread == RT_NULL) return -RT_ERROR;
+
+ r = rt_mq_recv(thread->mq, event, event_size, 0);
+
+ return r;
+}
+
rt_err_t rtgui_thread_recv_filter(rt_uint32_t type, rtgui_event_t* event, rt_size_t event_size)
{
struct rtgui_thread* thread;
diff --git a/components/rtgui/include/rtgui/rtgui_system.h b/components/rtgui/include/rtgui/rtgui_system.h
index 4afc65e4e0..ef2bd5da84 100644
--- a/components/rtgui/include/rtgui/rtgui_system.h
+++ b/components/rtgui/include/rtgui/rtgui_system.h
@@ -39,10 +39,14 @@ struct rtgui_thread
struct rtgui_widget* widget;
/* event buffer */
rt_uint8_t event_buffer[RTGUI_EVENT_BUFFER_SIZE];
+
+ /* on idle event handler */
+ void (*on_idle)(struct rtgui_widget* widget, struct rtgui_event *event);
};
typedef struct rtgui_thread rtgui_thread_t;
struct rtgui_timer;
typedef void (*rtgui_timeout_func)(struct rtgui_timer* timer, void* parameter);
+typedef void (*rtgui_idle_func)(struct rtgui_widget* widget, struct rtgui_event *event);
struct rtgui_timer
{
@@ -65,6 +69,8 @@ void rtgui_timer_stop (rtgui_timer_t* timer);
rtgui_thread_t* rtgui_thread_register(rt_thread_t tid, rt_mq_t mq);
void rtgui_thread_deregister(rt_thread_t tid);
+void rtgui_thread_set_onidle(rtgui_idle_func onidle);
+rtgui_idle_func rtgui_thread_get_onidle();
rtgui_thread_t* rtgui_thread_self(void);
rt_thread_t rtgui_thread_get_server(void);
@@ -76,6 +82,7 @@ rt_err_t rtgui_thread_send(rt_thread_t tid, struct rtgui_event* event, rt_size_t
rt_err_t rtgui_thread_send_urgent(rt_thread_t tid, struct rtgui_event* event, rt_size_t event_size);
rt_err_t rtgui_thread_send_sync(rt_thread_t tid, struct rtgui_event* event, rt_size_t event_size);
rt_err_t rtgui_thread_recv(struct rtgui_event* event, rt_size_t event_size);
+rt_err_t rtgui_thread_recv_nosuspend(struct rtgui_event* event, rt_size_t event_size);
rt_err_t rtgui_thread_recv_filter(rt_uint32_t type, struct rtgui_event* event, rt_size_t event_size);
rt_err_t rtgui_thread_ack(struct rtgui_event* event, rt_int32_t status);
diff --git a/components/rtgui/widgets/window.c b/components/rtgui/widgets/window.c
index 0997d769ba..13982395ef 100644
--- a/components/rtgui/widgets/window.c
+++ b/components/rtgui/widgets/window.c
@@ -522,6 +522,7 @@ rt_bool_t rtgui_win_event_handler(struct rtgui_widget* widget, struct rtgui_even
/* windows event loop */
void rtgui_win_event_loop(rtgui_win_t* wnd)
{
+ rt_err_t result;
rtgui_thread_t* tid;
struct rtgui_event* event;
@@ -535,10 +536,27 @@ void rtgui_win_event_loop(rtgui_win_t* wnd)
{
while (wnd->style & RTGUI_WIN_STYLE_UNDER_MODAL)
{
- if (rtgui_thread_recv(event, RTGUI_EVENT_BUFFER_SIZE) == RT_EOK)
+ if (tid->on_idle != RT_NULL)
{
- /* perform event handler */
- RTGUI_WIDGET(wnd)->event_handler(RTGUI_WIDGET(wnd), event);
+ result = rtgui_thread_recv_nosuspend(event, RTGUI_EVENT_BUFFER_SIZE);
+ if (result == RT_EOK)
+ {
+ /* perform event handler */
+ RTGUI_WIDGET(wnd)->event_handler(RTGUI_WIDGET(wnd), event);
+ }
+ else if (result == -RT_ETIMEOUT)
+ {
+ tid->on_idle(RTGUI_WIDGET(wnd), RT_NULL);
+ }
+ }
+ else
+ {
+ result = rtgui_thread_recv(event, RTGUI_EVENT_BUFFER_SIZE);
+ if (result == RT_EOK)
+ {
+ /* perform event handler */
+ RTGUI_WIDGET(wnd)->event_handler(RTGUI_WIDGET(wnd), event);
+ }
}
}
}
@@ -546,10 +564,27 @@ void rtgui_win_event_loop(rtgui_win_t* wnd)
{
while (!(wnd->style & RTGUI_WIN_STYLE_CLOSED))
{
- if (rtgui_thread_recv(event, RTGUI_EVENT_BUFFER_SIZE) == RT_EOK)
+ if (tid->on_idle != RT_NULL)
+ {
+ result = rtgui_thread_recv_nosuspend(event, RTGUI_EVENT_BUFFER_SIZE);
+ if (result == RT_EOK)
+ {
+ /* perform event handler */
+ RTGUI_WIDGET(wnd)->event_handler(RTGUI_WIDGET(wnd), event);
+ }
+ else if (result == -RT_ETIMEOUT)
+ {
+ tid->on_idle(RTGUI_WIDGET(wnd), RT_NULL);
+ }
+ }
+ else
{
- /* perform event handler */
- RTGUI_WIDGET(wnd)->event_handler(RTGUI_WIDGET(wnd), event);
+ result = rtgui_thread_recv(event, RTGUI_EVENT_BUFFER_SIZE);
+ if (result == RT_EOK)
+ {
+ /* perform event handler */
+ RTGUI_WIDGET(wnd)->event_handler(RTGUI_WIDGET(wnd), event);
+ }
}
}
}
diff --git a/components/rtgui/widgets/workbench.c b/components/rtgui/widgets/workbench.c
index 28224d1eb9..1cfc98eedc 100644
--- a/components/rtgui/widgets/workbench.c
+++ b/components/rtgui/widgets/workbench.c
@@ -162,6 +162,7 @@ void rtgui_workbench_set_flag(rtgui_workbench_t* workbench, rt_uint8_t flag)
rt_bool_t rtgui_workbench_event_loop(rtgui_workbench_t* workbench)
{
+ rt_err_t result;
rtgui_thread_t* tid;
struct rtgui_event* event;
@@ -176,9 +177,19 @@ rt_bool_t rtgui_workbench_event_loop(rtgui_workbench_t* workbench)
/* event loop for modal mode shown view */
while (workbench->flag & RTGUI_WORKBENCH_FLAG_MODAL_MODE)
{
- if (rtgui_thread_recv(event, RTGUI_EVENT_BUFFER_SIZE) == RT_EOK)
+ if (tid->on_idle != RT_NULL)
{
- RTGUI_WIDGET(workbench)->event_handler(RTGUI_WIDGET(workbench), event);
+ result = rtgui_thread_recv_nosuspend(event, RTGUI_EVENT_BUFFER_SIZE);
+ if (result == RT_EOK)
+ RTGUI_WIDGET(workbench)->event_handler(RTGUI_WIDGET(workbench), event);
+ else if (result == -RT_ETIMEOUT)
+ tid->on_idle(RTGUI_WIDGET(workbench), RT_NULL);
+ }
+ else
+ {
+ result = rtgui_thread_recv(event, RTGUI_EVENT_BUFFER_SIZE);
+ if (result == RT_EOK)
+ RTGUI_WIDGET(workbench)->event_handler(RTGUI_WIDGET(workbench), event);
}
}
}
@@ -186,12 +197,22 @@ rt_bool_t rtgui_workbench_event_loop(rtgui_workbench_t* workbench)
{
/* show workbench firstly */
rtgui_workbench_show(workbench);
-
+
while (!(workbench->flag & RTGUI_WORKBENCH_FLAG_CLOSED))
{
- if (rtgui_thread_recv(event, RTGUI_EVENT_BUFFER_SIZE) == RT_EOK)
+ if (tid->on_idle != RT_NULL)
+ {
+ result = rtgui_thread_recv_nosuspend(event, RTGUI_EVENT_BUFFER_SIZE);
+ if (result == RT_EOK)
+ RTGUI_WIDGET(workbench)->event_handler(RTGUI_WIDGET(workbench), event);
+ else if (result == -RT_ETIMEOUT)
+ tid->on_idle(RTGUI_WIDGET(workbench), RT_NULL);
+ }
+ else
{
- RTGUI_WIDGET(workbench)->event_handler(RTGUI_WIDGET(workbench), event);
+ result = rtgui_thread_recv(event, RTGUI_EVENT_BUFFER_SIZE);
+ if (result == RT_EOK)
+ RTGUI_WIDGET(workbench)->event_handler(RTGUI_WIDGET(workbench), event);
}
}
}