mirror of
https://gitee.com/zlgopen/awtk.git
synced 2024-12-02 03:58:33 +08:00
use event source manager to implement main loop
This commit is contained in:
parent
f42a5992d9
commit
fb163dfa48
@ -1,4 +1,7 @@
|
||||
# 最新动态
|
||||
* 2019/12/29
|
||||
* 使用event\_source\_manager实现主循环。
|
||||
|
||||
* 2019/12/27
|
||||
* 增加str\_from\_wstr\_with\_len
|
||||
* 增加tk\_utf8\_from\_utf16\_ex
|
||||
|
@ -37,7 +37,6 @@ ret_t main_loop_quit(main_loop_t* l) {
|
||||
|
||||
if (l->quit != NULL) {
|
||||
l->quit(l);
|
||||
l->app_quited = TRUE;
|
||||
}
|
||||
|
||||
return RET_OK;
|
||||
@ -100,6 +99,8 @@ ret_t main_loop_sleep_default(main_loop_t* l) {
|
||||
}
|
||||
|
||||
ret_t main_loop_sleep(main_loop_t* l) {
|
||||
return_value_if_fail(l != NULL, RET_BAD_PARAMS);
|
||||
|
||||
if (l->sleep != NULL) {
|
||||
return l->sleep(l);
|
||||
}
|
||||
@ -108,9 +109,35 @@ ret_t main_loop_sleep(main_loop_t* l) {
|
||||
}
|
||||
|
||||
ret_t main_loop_step(main_loop_t* l) {
|
||||
return_value_if_fail(l != NULL, RET_BAD_PARAMS);
|
||||
|
||||
if (l->step != NULL) {
|
||||
return l->step(l);
|
||||
}
|
||||
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
event_source_manager_t* main_loop_get_event_source_manager(main_loop_t* l) {
|
||||
return_value_if_fail(l != NULL, NULL);
|
||||
|
||||
if (l->get_event_source_manager != NULL) {
|
||||
return l->get_event_source_manager(l);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret_t main_loop_add_event_source(main_loop_t* l, event_source_t* source) {
|
||||
event_source_manager_t* m = main_loop_get_event_source_manager(l);
|
||||
return_value_if_fail(m != NULL && source != NULL, RET_BAD_PARAMS);
|
||||
|
||||
return event_source_manager_add(m, source);
|
||||
}
|
||||
|
||||
ret_t main_loop_remove_event_source(main_loop_t* l, event_source_t* source) {
|
||||
event_source_manager_t* m = main_loop_get_event_source_manager(l);
|
||||
return_value_if_fail(m != NULL && source != NULL, RET_BAD_PARAMS);
|
||||
|
||||
return event_source_manager_remove(m, source);
|
||||
}
|
||||
|
@ -24,6 +24,7 @@
|
||||
|
||||
#include "base/widget.h"
|
||||
#include "base/event_queue.h"
|
||||
#include "tkc/event_source_manager.h"
|
||||
|
||||
BEGIN_C_DECLS
|
||||
|
||||
@ -33,6 +34,7 @@ typedef struct _main_loop_t main_loop_t;
|
||||
typedef ret_t (*main_loop_run_t)(main_loop_t* l);
|
||||
typedef ret_t (*main_loop_quit_t)(main_loop_t* l);
|
||||
typedef ret_t (*main_loop_queue_event_t)(main_loop_t* l, const event_queue_req_t* e);
|
||||
typedef event_source_manager_t* (*main_loop_get_event_source_manager_t)(main_loop_t* l);
|
||||
typedef ret_t (*main_loop_wakeup_t)(main_loop_t* l);
|
||||
typedef ret_t (*main_loop_step_t)(main_loop_t* l);
|
||||
typedef ret_t (*main_loop_sleep_t)(main_loop_t* l);
|
||||
@ -45,6 +47,7 @@ struct _main_loop_t {
|
||||
main_loop_sleep_t sleep;
|
||||
main_loop_wakeup_t wakeup;
|
||||
main_loop_queue_event_t queue_event;
|
||||
main_loop_get_event_source_manager_t get_event_source_manager;
|
||||
main_loop_destroy_t destroy;
|
||||
|
||||
bool_t running;
|
||||
@ -67,6 +70,11 @@ ret_t main_loop_destroy(main_loop_t* l);
|
||||
ret_t main_loop_step(main_loop_t* l);
|
||||
ret_t main_loop_sleep(main_loop_t* l);
|
||||
|
||||
/*event_source*/
|
||||
event_source_manager_t* main_loop_get_event_source_manager(main_loop_t* l);
|
||||
ret_t main_loop_add_event_source(main_loop_t* l, event_source_t* source);
|
||||
ret_t main_loop_remove_event_source(main_loop_t* l, event_source_t* source);
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif /*TK_MAIN_LOOP_H*/
|
||||
|
@ -202,7 +202,7 @@ static ret_t main_loop_sdl2_dispatch_window_event(main_loop_simple_t* loop, SDL_
|
||||
e = event_init(EVT_NATIVE_WINDOW_DESTROY, NULL);
|
||||
window_manager_dispatch_native_window_event(l->wm, &e, win);
|
||||
|
||||
main_loop_quit(&(loop->base));
|
||||
tk_quit();
|
||||
}
|
||||
} break;
|
||||
#if SDL_VERSION_ATLEAST(2, 0, 5)
|
||||
|
@ -22,6 +22,10 @@
|
||||
#include "tkc/time_now.h"
|
||||
#include "main_loop/main_loop_simple.h"
|
||||
|
||||
#include "tkc/event_source_idle.h"
|
||||
#include "tkc/event_source_timer.h"
|
||||
#include "tkc/event_source_manager_default.h"
|
||||
|
||||
static ret_t main_loop_simple_queue_event(main_loop_t* l, const event_queue_req_t* r) {
|
||||
ret_t ret = RET_FAIL;
|
||||
main_loop_simple_t* loop = (main_loop_simple_t*)l;
|
||||
@ -164,10 +168,9 @@ static ret_t main_loop_dispatch_input(main_loop_simple_t* loop) {
|
||||
static ret_t main_loop_simple_step(main_loop_t* l) {
|
||||
main_loop_simple_t* loop = (main_loop_simple_t*)l;
|
||||
|
||||
timer_dispatch();
|
||||
main_loop_dispatch_input(loop);
|
||||
main_loop_dispatch_events(loop);
|
||||
idle_dispatch();
|
||||
event_source_manager_dispatch(loop->event_source_manager);
|
||||
|
||||
window_manager_paint(loop->base.wm);
|
||||
|
||||
@ -186,7 +189,15 @@ static ret_t main_loop_simple_run(main_loop_t* l) {
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
static event_source_manager_t* main_loop_simple_get_event_source_manager(main_loop_t* l) {
|
||||
main_loop_simple_t* loop = (main_loop_simple_t*)l;
|
||||
|
||||
return loop->event_source_manager;
|
||||
}
|
||||
|
||||
main_loop_simple_t* main_loop_simple_init(int w, int h) {
|
||||
event_source_t* idle_source = NULL;
|
||||
event_source_t* timer_source = NULL;
|
||||
static main_loop_simple_t s_main_loop_simple;
|
||||
main_loop_simple_t* loop = &s_main_loop_simple;
|
||||
|
||||
@ -206,15 +217,27 @@ main_loop_simple_t* main_loop_simple_init(int w, int h) {
|
||||
loop->base.run = main_loop_simple_run;
|
||||
loop->base.step = main_loop_simple_step;
|
||||
loop->base.queue_event = main_loop_simple_queue_event;
|
||||
loop->base.get_event_source_manager = main_loop_simple_get_event_source_manager;
|
||||
|
||||
window_manager_post_init(loop->base.wm, w, h);
|
||||
main_loop_set((main_loop_t*)loop);
|
||||
|
||||
loop->event_source_manager = event_source_manager_default_create();
|
||||
|
||||
idle_source = event_source_idle_create(idle_manager());
|
||||
timer_source = event_source_timer_create(timer_manager());
|
||||
event_source_manager_add(loop->event_source_manager, idle_source);
|
||||
event_source_manager_add(loop->event_source_manager, timer_source);
|
||||
OBJECT_UNREF(idle_source);
|
||||
OBJECT_UNREF(timer_source);
|
||||
|
||||
return loop;
|
||||
}
|
||||
|
||||
ret_t main_loop_simple_reset(main_loop_simple_t* loop) {
|
||||
return_value_if_fail(loop != NULL, RET_BAD_PARAMS);
|
||||
|
||||
event_source_manager_destroy(loop->event_source_manager);
|
||||
event_queue_destroy(loop->queue);
|
||||
tk_mutex_destroy(loop->mutex);
|
||||
|
||||
|
@ -53,6 +53,7 @@ struct _main_loop_simple_t {
|
||||
void* user2;
|
||||
void* user3;
|
||||
void* user4;
|
||||
event_source_manager_t* event_source_manager;
|
||||
main_loop_dispatch_input_t dispatch_input;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user