提交 db064602 编写于 作者: C chaos.proton@gmail.com

merge new RTGUI in to trunk

The full log is at https://github.com/RTGUI/RTGUI/commits/merge_1 and it's difficult to merge the new tree commit by commit. I also converted all the file into unix eol so there are many fake diff. Big changes are noted in rtgui/doc/road_map.txt and rtgui/doc/attention.txt. Keep an eye on them if you want to migrate your old code.

Note that the work is still in progress and the bsp is not prepared in trunk so far.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@2092 bbd45198-f89e-11dd-88c7-29a3b14d5316
上级 06d45f0c
......@@ -34,9 +34,9 @@ common/pixel_driver.c
""")
server_src = Split("""
server/rtgui_application.c
server/driver.c
server/mouse.c
server/panel.c
server/server.c
server/topwin.c
""")
......@@ -45,7 +45,6 @@ widgets_src = Split("""
widgets/box.c
widgets/button.c
widgets/checkbox.c
widgets/container.c
widgets/combobox.c
widgets/iconbox.c
widgets/label.c
......@@ -62,13 +61,12 @@ widgets/listbox.c
widgets/title.c
widgets/toplevel.c
widgets/notebook.c
widgets/view.c
widgets/container.c
widgets/list_view.c
widgets/about_view.c
widgets/filelist_view.c
widgets/widget.c
widgets/window.c
widgets/workbench.c
""")
# The set of source files associated with this SConscript file.
......
......@@ -21,9 +21,10 @@
#include <rtgui/driver.h>
#include <rtgui/rtgui_system.h>
#include <rtgui/widgets/view.h>
#include <rtgui/rtgui_application.h>
#include <rtgui/rtgui_server.h>
#include <rtgui/widgets/container.h>
#include <rtgui/widgets/window.h>
#include <rtgui/widgets/workbench.h>
#include <rtgui/widgets/title.h>
static void rtgui_dc_client_draw_point(struct rtgui_dc* dc, int x, int y);
......@@ -50,11 +51,8 @@ struct rtgui_dc* rtgui_dc_begin_drawing(rtgui_widget_t* owner)
if ((rtgui_region_is_flat(&owner->clip) == RT_EOK) &&
rtgui_rect_is_equal(&(owner->extent), &(owner->clip.extents)) == RT_EOK)
{
/* use hardware DC */
return rtgui_dc_hw_create(owner);
}
else
return rtgui_dc_client_create(owner);
}
......@@ -116,7 +114,7 @@ struct rtgui_dc* rtgui_dc_client_create(rtgui_widget_t* owner)
if (RTGUI_WIDGET_IS_HIDE(widget))
{
RTGUI_WIDGET_DC_SET_UNVISIBLE(owner);
break;
return RT_NULL;
}
widget = widget->parent;
......@@ -130,7 +128,7 @@ struct rtgui_dc* rtgui_dc_client_create(rtgui_widget_t* owner)
if (top->drawing == 1)
{
#ifdef RTGUI_USING_MOUSE_CURSOR
#ifdef __WIN32__
#ifdef _WIN32
rt_mutex_take(&cursor_mutex, RT_WAITING_FOREVER);
rt_kprintf("hide cursor\n");
rtgui_mouse_hide_cursor();
......@@ -141,15 +139,18 @@ struct rtgui_dc* rtgui_dc_client_create(rtgui_widget_t* owner)
#endif
}
}
else if (RTGUI_IS_WORKBENCH(owner->toplevel) ||
RTGUI_IS_WIN(owner->toplevel))
else if (RTGUI_IS_APPLICATION(owner->toplevel))
{
RT_ASSERT(0);
}
else if (RTGUI_IS_WIN(owner->toplevel))
{
rtgui_toplevel_t* top = RTGUI_TOPLEVEL(owner->toplevel);
top->drawing ++;
if (top->drawing == 1)
{
#ifdef __WIN32__
#ifdef _WIN32
#ifdef RTGUI_USING_MOUSE_CURSOR
rt_mutex_take(&cursor_mutex, RT_WAITING_FOREVER);
rt_kprintf("hide cursor\n");
......@@ -161,7 +162,7 @@ struct rtgui_dc* rtgui_dc_client_create(rtgui_widget_t* owner)
RTGUI_EVENT_UPDATE_BEGIN_INIT(&(eupdate));
eupdate.rect = RTGUI_WIDGET(top)->extent;
rtgui_thread_send(top->server, (struct rtgui_event*)&eupdate, sizeof(eupdate));
rtgui_server_post_event((struct rtgui_event*)&eupdate, sizeof(eupdate));
#endif
}
}
......@@ -186,7 +187,7 @@ static rt_bool_t rtgui_dc_client_fini(struct rtgui_dc* dc)
top->drawing --;
if ((top->drawing == 0) && RTGUI_WIDGET_IS_DC_VISIBLE(owner))
{
#ifdef __WIN32__
#ifdef _WIN32
#ifdef RTGUI_USING_MOUSE_CURSOR
rt_mutex_release(&cursor_mutex);
/* show cursor */
......@@ -206,7 +207,7 @@ static rt_bool_t rtgui_dc_client_fini(struct rtgui_dc* dc)
#endif
}
}
else if (RTGUI_IS_WORKBENCH(owner->toplevel) ||
else if (RTGUI_IS_APPLICATION(owner->toplevel) ||
RTGUI_IS_WIN(owner->toplevel))
{
rtgui_toplevel_t* top = RTGUI_TOPLEVEL(owner->toplevel);
......@@ -214,7 +215,7 @@ static rt_bool_t rtgui_dc_client_fini(struct rtgui_dc* dc)
if ((top->drawing == 0) && RTGUI_WIDGET_IS_DC_VISIBLE(owner))
{
#ifdef __WIN32__
#ifdef _WIN32
#ifdef RTGUI_USING_MOUSE_CURSOR
rt_mutex_release(&cursor_mutex);
/* show cursor */
......@@ -229,7 +230,7 @@ static rt_bool_t rtgui_dc_client_fini(struct rtgui_dc* dc)
RTGUI_EVENT_UPDATE_END_INIT(&(eupdate));
eupdate.rect = owner->extent;
rtgui_thread_send(top->server, (struct rtgui_event*)&eupdate, sizeof(eupdate));
rtgui_server_post_event((struct rtgui_event*)&eupdate, sizeof(eupdate));
#endif
}
}
......
......@@ -15,9 +15,11 @@
#include <rtgui/dc_hw.h>
#include <rtgui/driver.h>
#include <rtgui/rtgui_system.h>
#include <rtgui/widgets/view.h>
#include <rtgui/rtgui_application.h>
#include <rtgui/rtgui_server.h>
#include <rtgui/widgets/container.h>
#include <rtgui/widgets/window.h>
#include <rtgui/widgets/workbench.h>
#include <rtgui/widgets/title.h>
static void rtgui_dc_hw_draw_point(struct rtgui_dc* dc, int x, int y);
......@@ -81,7 +83,7 @@ struct rtgui_dc* rtgui_dc_hw_create(rtgui_widget_t* owner)
if (RTGUI_WIDGET_IS_HIDE(widget))
{
RTGUI_WIDGET_DC_SET_UNVISIBLE(owner);
break;
return RT_NULL;
}
widget = widget->parent;
......@@ -104,7 +106,7 @@ struct rtgui_dc* rtgui_dc_hw_create(rtgui_widget_t* owner)
if (top->drawing == 1)
{
#ifdef RTGUI_USING_MOUSE_CURSOR
#ifdef __WIN32__
#ifdef _WIN32
rt_mutex_take(&cursor_mutex, RT_WAITING_FOREVER);
rt_kprintf("hide cursor\n");
rtgui_mouse_hide_cursor();
......@@ -115,7 +117,7 @@ struct rtgui_dc* rtgui_dc_hw_create(rtgui_widget_t* owner)
#endif
}
}
else if (RTGUI_IS_WORKBENCH(owner->toplevel) ||
else if (RTGUI_IS_APPLICATION(owner->toplevel) ||
RTGUI_IS_WIN(owner->toplevel))
{
rtgui_toplevel_t* top = RTGUI_TOPLEVEL(owner->toplevel);
......@@ -123,7 +125,7 @@ struct rtgui_dc* rtgui_dc_hw_create(rtgui_widget_t* owner)
if (top->drawing == 1)
{
#ifdef __WIN32__
#ifdef _WIN32
#ifdef RTGUI_USING_MOUSE_CURSOR
rt_mutex_take(&cursor_mutex, RT_WAITING_FOREVER);
rt_kprintf("hide cursor\n");
......@@ -135,7 +137,7 @@ struct rtgui_dc* rtgui_dc_hw_create(rtgui_widget_t* owner)
RTGUI_EVENT_UPDATE_BEGIN_INIT(&(eupdate));
eupdate.rect = RTGUI_WIDGET(top)->extent;
rtgui_thread_send(top->server, (struct rtgui_event*)&eupdate, sizeof(eupdate));
rtgui_server_post_event((struct rtgui_event*)&eupdate, sizeof(eupdate));
#endif
}
}
......@@ -162,7 +164,7 @@ static rt_bool_t rtgui_dc_hw_fini(struct rtgui_dc* dc)
top->drawing --;
if ((top->drawing == 0) && RTGUI_WIDGET_IS_DC_VISIBLE(owner))
{
#ifdef __WIN32__
#ifdef _WIN32
#ifdef RTGUI_USING_MOUSE_CURSOR
rt_mutex_release(&cursor_mutex);
/* show cursor */
......@@ -182,7 +184,7 @@ static rt_bool_t rtgui_dc_hw_fini(struct rtgui_dc* dc)
#endif
}
}
else if (RTGUI_IS_WORKBENCH(owner->toplevel) ||
else if (RTGUI_IS_APPLICATION(owner->toplevel) ||
RTGUI_IS_WIN(owner->toplevel))
{
rtgui_toplevel_t* top = RTGUI_TOPLEVEL(owner->toplevel);
......@@ -190,7 +192,7 @@ static rt_bool_t rtgui_dc_hw_fini(struct rtgui_dc* dc)
if ((top->drawing == 0) && RTGUI_WIDGET_IS_DC_VISIBLE(owner))
{
#ifdef __WIN32__
#ifdef _WIN32
#ifdef RTGUI_USING_MOUSE_CURSOR
rt_mutex_release(&cursor_mutex);
/* show cursor */
......@@ -205,7 +207,7 @@ static rt_bool_t rtgui_dc_hw_fini(struct rtgui_dc* dc)
RTGUI_EVENT_UPDATE_END_INIT(&(eupdate));
eupdate.rect = owner->extent;
rtgui_thread_send(top->server, (struct rtgui_event*)&eupdate, sizeof(eupdate));
rtgui_server_post_event((struct rtgui_event*)&eupdate, sizeof(eupdate));
#endif
}
}
......
......@@ -86,7 +86,7 @@ static void rtgui_hz_bitmap_font_draw_text (struct rtgui_font* font, struct rtgu
while (length > 0)
{
len = 0;
while (((rt_uint8_t)*(text + len)) < 0x80 && *(text + len)) len ++;
while (((rt_uint8_t)*(text + len)) < 0x80 && *(text + len) && len < length) len ++;
/* draw text with English font */
if (len > 0)
{
......@@ -97,7 +97,7 @@ static void rtgui_hz_bitmap_font_draw_text (struct rtgui_font* font, struct rtgu
}
len = 0;
while (((rt_uint8_t)*(text + len)) >= 0x80) len ++;
while (((rt_uint8_t)*(text + len)) >= 0x80 && len < length) len ++;
if (len > 0)
{
_rtgui_hz_bitmap_font_draw_text(bmp_font, dc, text, len, rect);
......
......@@ -177,7 +177,7 @@ static void rtgui_hz_file_font_draw_text(struct rtgui_font* font, struct rtgui_d
while (length > 0)
{
len = 0;
while (((rt_uint8_t)*(text + len)) < 0x80 && *(text + len)) len ++;
while (((rt_uint8_t)*(text + len)) < 0x80 && *(text + len) && len < length) len ++;
/* draw text with English font */
if (len > 0)
{
......@@ -188,7 +188,7 @@ static void rtgui_hz_file_font_draw_text(struct rtgui_font* font, struct rtgui_d
}
len = 0;
while (((rt_uint8_t)*(text + len)) >= 0x80) len ++;
while (((rt_uint8_t)*(text + len)) >= 0x80 && len < length) len ++;
if (len > 0)
{
_rtgui_hz_file_font_draw_text(hz_file_font, dc, text, len, rect);
......
......@@ -64,47 +64,47 @@ void rtgui_system_image_init(void)
#endif
}
static struct rtgui_image_engine* rtgui_image_get_engine(const char* type)
static struct rtgui_image_engine* rtgui_image_get_engine_by_filename(const char* fn)
{
struct rtgui_list_node *node;
struct rtgui_image_engine *engine;
const char* ext;
ext = fn + rt_strlen(fn);
while (ext != fn)
{
if (*ext == '.') { ext ++; break; }
ext --;
}
if (ext == fn) return RT_NULL; /* no ext */
rtgui_list_foreach(node, &_rtgui_system_image_list)
{
engine = rtgui_list_entry(node, struct rtgui_image_engine, list);
if (strncasecmp(engine->name, type, strlen(engine->name)) ==0)
if (strncasecmp(engine->name, ext, strlen(engine->name)) == 0)
return engine;
}
return RT_NULL;
}
#if defined(RTGUI_USING_DFS_FILERW) || defined(RTGUI_USING_STDIO_FILERW)
static struct rtgui_image_engine* rtgui_image_get_engine_by_filename(const char* fn)
static struct rtgui_image_engine* rtgui_image_get_engine(const char* type)
{
struct rtgui_list_node *node;
struct rtgui_image_engine *engine;
const char* ext;
ext = fn + rt_strlen(fn);
while (ext != fn)
{
if (*ext == '.') { ext ++; break; }
ext --;
}
if (ext == fn) return RT_NULL; /* no ext */
rtgui_list_foreach(node, &_rtgui_system_image_list)
{
engine = rtgui_list_entry(node, struct rtgui_image_engine, list);
if (strncasecmp(engine->name, ext, strlen(engine->name)) == 0)
if (strncasecmp(engine->name, type, strlen(engine->name)) ==0)
return engine;
}
return RT_NULL;
}
#if defined(RTGUI_USING_DFS_FILERW) || defined(RTGUI_USING_STDIO_FILERW)
struct rtgui_image* rtgui_image_create_from_file(const char* type, const char* filename, rt_bool_t load)
{
struct rtgui_filerw* filerw;
......
......@@ -17,9 +17,10 @@
static void _rtgui_object_constructor(rtgui_object_t *object)
{
if (!object) return;
if (!object)
return;
object->is_static = RT_FALSE;
object->flag = RTGUI_OBJECT_FLAG_NONE;
}
/* Destroys the object */
......@@ -115,7 +116,6 @@ rtgui_object_t *rtgui_object_create(rtgui_type_t *object_type)
#endif
new_object->type = object_type;
new_object->is_static = RT_FALSE;
rtgui_type_object_construct(object_type, new_object);
......@@ -131,7 +131,8 @@ rtgui_object_t *rtgui_object_create(rtgui_type_t *object_type)
*/
void rtgui_object_destroy(rtgui_object_t *object)
{
if (!object || object->is_static == RT_TRUE) return;
if (!object || object->flag & RTGUI_OBJECT_FLAG_STATIC)
return;
#ifdef RTGUI_OBJECT_TRACE
obj_info.objs_number --;
......@@ -178,3 +179,15 @@ const rtgui_type_t *rtgui_object_object_type_get(rtgui_object_t *object)
return object->type;
}
void rtgui_object_set_event_handler(struct rtgui_object *object, rtgui_event_handler_ptr handler)
{
RT_ASSERT(object != RT_NULL);
object->event_handler = handler;
}
rt_bool_t rtgui_object_event_handler(struct rtgui_object *object, struct rtgui_event* event)
{
return RT_FALSE;
}
......@@ -16,15 +16,13 @@
#include <rtgui/image.h>
#include <rtgui/font.h>
#include <rtgui/event.h>
#include <rtgui/rtgui_application.h>
#include <rtgui/rtgui_server.h>
#include <rtgui/rtgui_system.h>
#include <rtgui/widgets/window.h>
#include <rtgui/rtgui_theme.h>
#define RTGUI_EVENT_DEBUG
#ifdef _WIN32
#define RTGUI_EVENT_DEBUG
#define RTGUI_MEM_TRACE
#endif
......@@ -43,467 +41,6 @@ void rtgui_system_server_init()
rtgui_system_theme_init();
}
/************************************************************************/
/* RTGUI Thread Wrapper */
/************************************************************************/
#ifdef RTGUI_EVENT_DEBUG
const char *event_string[] =
{
/* panel event */
"PANEL_ATTACH", /* attach to a panel */
"PANEL_DETACH", /* detach from a panel */
"PANEL_SHOW", /* show in a panel */
"PANEL_HIDE", /* hide from a panel */
"PANEL_INFO", /* panel information */
"PANEL_RESIZE", /* resize panel */
"PANEL_FULLSCREEN", /* to full screen */
"PANEL_NORMAL", /* to normal screen */
/* window event */
"WIN_CREATE", /* create a window */
"WIN_DESTROY", /* destroy a window */
"WIN_SHOW", /* show a window */
"WIN_HIDE", /* hide a window */
"WIN_ACTIVATE", /* activate a window */
"WIN_DEACTIVATE", /* deactivate a window */
"WIN_CLOSE", /* close a window */
"WIN_MOVE", /* move a window */
"WIN_RESIZE", /* resize a window */
"SET_WM", /* set window manager */
"UPDATE_BEGIN", /* begin of update rect */
"UPDATE_END", /* end of update rect */
"MONITOR_ADD", /* add a monitor rect */
"MONITOR_REMOVE", /* remove a monitor rect*/
"PAINT", /* paint on screen */
"TIMER", /* timer */
/* clip rect information */
"CLIP_INFO", /* clip rect info */
/* mouse and keyboard event */
"MOUSE_MOTION", /* mouse motion */
"MOUSE_BUTTON", /* mouse button info */
"KBD", /* keyboard info */
/* user command event */
"COMMAND", /* user command */
/* request's status event */
"STATUS", /* request result */
"SCROLLED", /* scroll bar scrolled */
"RESIZE", /* widget resize */
};
#define DBG_MSG(x) rt_kprintf x
static void rtgui_event_dump(rt_thread_t tid, rtgui_event_t* event)
{
char* sender = "(unknown)";
if (event->sender != RT_NULL) sender = event->sender->name;
if ((event->type == RTGUI_EVENT_TIMER) ||
(event->type == RTGUI_EVENT_UPDATE_BEGIN) ||
(event->type == RTGUI_EVENT_UPDATE_END))
{
/* don't dump timer event */
return ;
}
rt_kprintf("%s -- %s --> %s ", sender, event_string[event->type], tid->name);
switch (event->type)
{
case RTGUI_EVENT_PAINT:
{
struct rtgui_event_paint *paint = (struct rtgui_event_paint *)event;
if(paint->wid != RT_NULL)
rt_kprintf("win: %s", paint->wid->title);
}
break;
case RTGUI_EVENT_KBD:
{
struct rtgui_event_kbd *ekbd = (struct rtgui_event_kbd*) event;
if (ekbd->wid != RT_NULL)
rt_kprintf("win: %s", ekbd->wid->title);
if (RTGUI_KBD_IS_UP(ekbd)) rt_kprintf(", up");
else rt_kprintf(", down");
}
break;
case RTGUI_EVENT_CLIP_INFO:
{
struct rtgui_event_clip_info *info = (struct rtgui_event_clip_info *)event;
if(info->wid != RT_NULL)
rt_kprintf("win: %s", info->wid->title);
}
break;
case RTGUI_EVENT_WIN_CREATE:
{
struct rtgui_event_win_create *create = (struct rtgui_event_win_create*)event;
rt_kprintf(" win: %s at (x1:%d, y1:%d, x2:%d, y2:%d)",
#ifdef RTGUI_USING_SMALL_SIZE
create->wid->title,
RTGUI_WIDGET(create->wid)->extent.x1,
RTGUI_WIDGET(create->wid)->extent.y1,
RTGUI_WIDGET(create->wid)->extent.x2,
RTGUI_WIDGET(create->wid)->extent.y2);
#else
create->title,
create->extent.x1,
create->extent.y1,
create->extent.x2,
create->extent.y2);
#endif
}
break;
case RTGUI_EVENT_UPDATE_END:
{
struct rtgui_event_update_end* update_end = (struct rtgui_event_update_end*)event;
rt_kprintf("(x:%d, y1:%d, x2:%d, y2:%d)", update_end->rect.x1,
update_end->rect.y1,
update_end->rect.x2,
update_end->rect.y2);
}
break;
case RTGUI_EVENT_WIN_ACTIVATE:
case RTGUI_EVENT_WIN_DEACTIVATE:
case RTGUI_EVENT_WIN_SHOW:
{
struct rtgui_event_win *win = (struct rtgui_event_win *)event;
if(win->wid != RT_NULL)
rt_kprintf("win: %s", win->wid->title);
}
break;
case RTGUI_EVENT_WIN_MOVE:
{
struct rtgui_event_win_move *win = (struct rtgui_event_win_move *)event;
if(win->wid != RT_NULL)
{
rt_kprintf("win: %s", win->wid->title);
rt_kprintf(" to (x:%d, y:%d)", win->x, win->y);
}
}
break;
case RTGUI_EVENT_WIN_RESIZE:
{
struct rtgui_event_win_resize* win = (struct rtgui_event_win_resize *)event;
if (win->wid != RT_NULL)
{
rt_kprintf("win: %s, rect(x1:%d, y1:%d, x2:%d, y2:%d)", win->wid->title,
RTGUI_WIDGET(win->wid)->extent.x1,
RTGUI_WIDGET(win->wid)->extent.y1,
RTGUI_WIDGET(win->wid)->extent.x2,
RTGUI_WIDGET(win->wid)->extent.y2);
}
}
break;
case RTGUI_EVENT_MOUSE_BUTTON:
case RTGUI_EVENT_MOUSE_MOTION:
{
struct rtgui_event_mouse *mouse = (struct rtgui_event_mouse*)event;
if (mouse->button & RTGUI_MOUSE_BUTTON_LEFT) rt_kprintf("left ");
else rt_kprintf("right ");
if (mouse->button & RTGUI_MOUSE_BUTTON_DOWN) rt_kprintf("down ");
else rt_kprintf("up ");
if (mouse->wid != RT_NULL)
rt_kprintf("win: %s at (%d, %d)", mouse->wid->title,
mouse->x, mouse->y);
else
rt_kprintf("(%d, %d)", mouse->x, mouse->y);
}
break;
case RTGUI_EVENT_MONITOR_ADD:
{
struct rtgui_event_monitor *monitor = (struct rtgui_event_monitor*)event;
if (monitor->panel != RT_NULL)
{
rt_kprintf("the rect is:(%d, %d) - (%d, %d)",
monitor->rect.x1, monitor->rect.y1,
monitor->rect.x2, monitor->rect.y2);
}
else if (monitor->wid != RT_NULL)
{
rt_kprintf("win: %s, the rect is:(%d, %d) - (%d, %d)", monitor->wid->title,
monitor->rect.x1, monitor->rect.y1,
monitor->rect.x2, monitor->rect.y2);
}
}
break;
}
rt_kprintf("\n");
}
#else
#define DBG_MSG(x)
#define rtgui_event_dump(tid, event)
#endif
rtgui_thread_t* rtgui_thread_register(rt_thread_t tid, rt_mq_t mq)
{
rtgui_thread_t* thread = rtgui_malloc(sizeof(rtgui_thread_t));
if (thread != RT_NULL)
{
DBG_MSG(("register a rtgui thread: %s, tid: 0x%p\n", tid->name, tid));
/* set tid and 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;
}
return thread;
}
void rtgui_thread_deregister(rt_thread_t tid)
{
rtgui_thread_t* thread;
/* find rtgui_thread_t */
thread = (rtgui_thread_t*) (tid->user_data);
if (thread != RT_NULL)
{
/* remove rtgui_thread_t */
tid->user_data = 0;
/* free rtgui_thread_t */
rtgui_free(thread);
}
}
/* get current gui thread */
rtgui_thread_t* rtgui_thread_self()
{
rtgui_thread_t* thread;
rt_thread_t self;
/* get current thread */
self = rt_thread_self();
thread = (rtgui_thread_t*)(self->user_data);
return thread;
}
void rtgui_thread_set_onidle(rtgui_idle_func onidle)
{
rtgui_thread_t* thread;
thread = rtgui_thread_self();
RT_ASSERT(thread != RT_NULL);
thread->on_idle = onidle;
}
rtgui_idle_func rtgui_thread_get_onidle()
{
rtgui_thread_t* 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()
{
return rt_thread_find("rtgui");
}
void rtgui_thread_set_widget(rtgui_widget_t* widget)
{
rtgui_thread_t* thread;
/* get rtgui_thread */
thread = (rtgui_thread_t*) (rt_thread_self()->user_data);
if (thread != RT_NULL) thread->widget = widget;
}
rtgui_widget_t* rtgui_thread_get_widget()
{
rtgui_thread_t* thread;
/* get rtgui_thread_t */
thread = (rtgui_thread_t*) (rt_thread_self()->user_data);
return thread == RT_NULL? RT_NULL : thread->widget;
}
rt_err_t rtgui_thread_send(rt_thread_t tid, rtgui_event_t* event, rt_size_t event_size)
{
rt_err_t result;
rtgui_thread_t* thread;
rtgui_event_dump(tid, event);
/* find rtgui_thread_t */
thread = (rtgui_thread_t*) (tid->user_data);
if (thread == RT_NULL) return -RT_ERROR;
result = rt_mq_send(thread->mq, event, event_size);
if (result != RT_EOK)
{
if (event->type != RTGUI_EVENT_TIMER)
rt_kprintf("send event to %s failed\n", thread->tid->name);
}
return result;
}
rt_err_t rtgui_thread_send_urgent(rt_thread_t tid, rtgui_event_t* event, rt_size_t event_size)
{
rt_err_t result;
rtgui_thread_t* thread;
rtgui_event_dump(tid, event);
/* find rtgui_thread_t */
thread = (rtgui_thread_t*) (tid->user_data);
if (thread == RT_NULL) return -RT_ERROR;
result = rt_mq_urgent(thread->mq, event, event_size);
if (result != RT_EOK)
rt_kprintf("send ergent event failed\n");
return result;
}
rt_err_t rtgui_thread_send_sync(rt_thread_t tid, rtgui_event_t* event, rt_size_t event_size)
{
rt_err_t r;
rtgui_thread_t* thread;
rt_int32_t ack_buffer, ack_status;
struct rt_mailbox ack_mb;
rtgui_event_dump(tid, event);
/* init ack mailbox */
r = rt_mb_init(&ack_mb, "ack", &ack_buffer, 1, 0);
if (r!= RT_EOK) goto __return;
/* find rtgui_thread_t */
thread = (rtgui_thread_t*) (tid->user_data);
if (thread == RT_NULL)
{
r = -RT_ERROR;
goto __return;
}
event->ack = &ack_mb;
r = rt_mq_send(thread->mq, event, event_size);
if (r != RT_EOK)
{
rt_kprintf("send sync event failed\n");
goto __return;
}
r = rt_mb_recv(&ack_mb, (rt_uint32_t*)&ack_status, RT_WAITING_FOREVER);
if (r!= RT_EOK) goto __return;
if (ack_status != RTGUI_STATUS_OK)
r = -RT_ERROR;
else
r = RT_EOK;
__return:
/* fini ack mailbox */
rt_mb_detach(&ack_mb);
return r;
}
rt_err_t rtgui_thread_ack(rtgui_event_t* event, rt_int32_t status)
{
if (event != RT_NULL &&
event->ack != RT_NULL)
{
rt_mb_send(event->ack, status);
}
return RT_EOK;
}
rt_err_t rtgui_thread_recv(rtgui_event_t* event, rt_size_t event_size)
{
rtgui_thread_t* thread;
rt_err_t r;
/* find rtgui_thread_t */
thread = (rtgui_thread_t*) (rt_thread_self()->user_data);
if (thread == RT_NULL) return -RT_ERROR;
r = rt_mq_recv(thread->mq, event, event_size, RT_WAITING_FOREVER);
return r;
}
rt_err_t rtgui_thread_recv_nosuspend(rtgui_event_t* event, rt_size_t event_size)
{
rtgui_thread_t* thread;
rt_err_t r;
/* find rtgui_thread */
thread = (rtgui_thread_t*) (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)
{
rtgui_thread_t* thread;
/* find rtgui_thread_t */
thread = (rtgui_thread_t*) (rt_thread_self()->user_data);
if (thread == RT_NULL) return -RT_ERROR;
while (rt_mq_recv(thread->mq, event, event_size, RT_WAITING_FOREVER) == RT_EOK)
{
if (event->type == type)
{
return RT_EOK;
}
else
{
/* let widget to handle event */
if (thread->widget != RT_NULL &&
thread->widget->event_handler != RT_NULL)
{
thread->widget->event_handler(thread->widget, event);
}
}
}
return -RT_ERROR;
}
/************************************************************************/
/* RTGUI Timer */
/************************************************************************/
......@@ -522,7 +59,7 @@ static void rtgui_time_out(void* parameter)
event.timer = timer;
rtgui_thread_send(timer->tid, &(event.parent), sizeof(rtgui_event_timer_t));
rtgui_application_send(timer->tid, &(event.parent), sizeof(rtgui_event_timer_t));
}
rtgui_timer_t* rtgui_timer_create(rt_int32_t time, rt_int32_t flag, rtgui_timeout_func timeout, void* parameter)
......
1, 对同一 window 销毁两次会引起 segfault。同时,如果在创建时设置了
RTGUI_WIN_STYLE_DESTROY_ON_CLOSE,close 窗口之后不要再去销毁窗口。
2, 所有的 window 由 topwin 进行管理,用户不要在指定创建具有父窗口的子窗口之后在
把这个窗口加为父窗口的 child。这可能会导致子窗口无法显示。
3, command 事件添加了 wid 参数,用于指定此事件需要传递的目标窗口。
4, 在 widget 中添加了 on_show 和 on_hide 事件回调函数。他们会在控件显示/隐藏的
时候被调用。
5, slider 控件改为左键减小数值,右键增加数值。横向的 slider 处理左右键,纵向的
slider 处理上下键,上面的值小,下面的值大。
6, view 不再提供 show 方法。如果想单独显示控件,请用 window 包含之。
RTGUI for 1.1 路线图(排名不分先后)
1, 把 rtgui_thread 给去掉,变成 rtgui_application ,消除原来的 rtgui_thread +
mq 的模式。rtgui_application 记录当前依附的 panel,和 panel 的 extent。(Done)
1.1, rtgui_application_run 运行主事件循环(Done)
1.2, rtgui_application 作为事件的接收者_和_事件派发者。(Done)
2, workbench,window并成一个,其事件主循环并合并到rtgui_application中。
2.1, window 作为有标题栏的 workbench(Done)
2.2, 将其事件主循环移至 application 中。(Done)
2.3, 将 window 的父类 toplevel 合并进 window 中。所有直接与服务器打交道的从
window 继承。(或者将 toplevel 合并进 application 中,因为只有 application 才
会和服务器打交道。)
2.4 在创建 window 的时候需要指定 parent,如果为 RT_NULL,则此 window 为 root
窗口,parent 为当前 rtgui_application。每一个 application 必须有且只有一个根
窗口。(Done)
2.5 添加一个 FULL_PANEL 的 STYLE。指定此 STYLE 之后会自动填满整个 panel。其
与 NO_TITLE 之类的合用可以达到之前 workbench 的效果。(Deprecated)
2.6 event_loop 可以设定顶层控件,只会把事件传递给顶层控件。这样可以方便的实
现模态窗口。event_loop 靠 object 的一个标志位来判断是否要退出当前循环。(Done)
3, 将 view 合并进 container,所有容器类继承 container。[note1](Done)
4, 事件循环完成后不主动销毁控件,销毁任务交由用户完成。但是有些自动销毁是必要的
,比如 container 自动销毁其包含的控件(Done)
4.1 对于 window 的 onclose事件,保证在其回调函数中可以(但不是必须)安全销毁窗
口。这个功能不保证能够实现。(onclose 是在将要关闭窗口的时候触发的,调用它之
后 RTGUI 还要进行其他的设置和清理工作,所以不能在 onclose 里销毁窗口)(Cannot
Implement)
4.2 对 window 添加 RTGUI_WIN_STYLE_DESTROY_ON_CLOSE 。使得其在被关闭时自动销
毁。注意:对同一 window 销毁两次会引起 segfault。同时,如果在创建时设置了
RTGUI_WIN_STYLE_DESTROY_ON_CLOSE,close 窗口之后不要再去销毁窗口。
5, API 清理。更详细的文档。
6, 使 panel 退化为无窗口标题的 window,这样 server 就只记录 window 一种东西的位
置。(Done, 删除了 panel,使得整体以 window 为主)
7, 指定名称的时候不再自己拷贝一份。(我觉得 90% 的情况下名称都是静态的字符串,这
时用 strdup其实并没有必要。)(Deprecated)
8, 添加一些工业控制当中用到的波形、仪表之类的控件。
9, 在 window 中记录焦点控件,键盘事件由 window 直接投送。各个控件不记录焦点控件
。(Done)
10, 在 widget 中添加 on_show 和 on_hide 事件回调函数。(Done)
11, 添加 EVENT_WIN_MODAL_ENTER 和 EVENT_WIN_MODAL_EXIT 事件,用来通知窗口管理器
(topwin)一个窗口进入模态。窗口管理器根据这个进行相应的设置。
12, rtgui_filelist_view 不必继承自 container。
13, 添加 desktop window 支持。(Done)
概念与名词:
13.1 desktop window:最底层的桌面窗口。它会在所有窗口下面显示,并且不会被它
上面的窗口模态掉。它的子窗口是 root window。(继承关系由 RTGUI 管理,不
用用户管理)它只有在启用 RTGUI_USING_DESKTOP_WINDOW 时才有此特性。
13.2 root window:创建时父窗口为 RT_NULL 的窗口。是用户空间窗口继承树的根。
13.3 normal window:创建时父窗口不为 RT_NULL 的窗口。它始终会在父窗口之上显
示(它会 clip 父窗口)。normal windows 和 root window 组成一个窗口树。
13.4 模态:当一个 normal window 模态显示时会会模态自己所在树的同级窗口
和所有父级窗口,但不会影响别的窗口树。被模态的窗口不会接受到用户事
件(按键,触摸等)
----
[note1] 我们至少需要一种容器控件来盛放其他的控件,并且能把上层事件传递给被包含
的控件。实现这样的功能有一个就好,container 可以担当这个责任。其他需要放多个控
件的控件则可以继承/包含这个控件。然后多个容器控件轮换的,notebook 可以来做。
notebook可以是有标签和无标签的,有标签的对应一般的 tab 控件,无标签的对应 rtgui
for RTT 1.0 的 workbench+view。
/*
* File : dlist.h
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2006 - 2011, RT-Thread Development Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2006-03-16 Bernard the first version
* 2006-09-07 Bernard move the kservice APIs to rtthread.h
* 2007-06-27 Bernard fix the rt_list_remove bug
* 2012-02-25 Grissiom move to rtgui/include/rtgui and some misc changes
*/
#ifndef __RTGUI_DLIST_H__
#define __RTGUI_DLIST_H__
/* This file is copied from kservice.h in RTT kernel. There are some differences:
* 1, naming. Use rtgui_dlist_ prefix instead of rt_list.
* 2, add rtgui_dlist_foreach for convenience.
* 3, move the definition of list node into this file.
*
* Please keep both of the files synchronized when fixing bugs.
*/
#ifdef __cplusplus
extern "C" {
#endif
struct rtgui_dlist_node
{
struct rtgui_dlist_node *next; /* point to next node. */
struct rtgui_dlist_node *prev; /* point to prev node. */
};
/**
* @brief initialize a list
*
* @param l list to be initialized
*/
rt_inline void rtgui_dlist_init(struct rtgui_dlist_node *l)
{
l->next = l->prev = l;
}
/**
* @brief insert a node after a list
*
* @param l list to insert it
* @param n new node to be inserted
*/
rt_inline void rtgui_dlist_insert_after(struct rtgui_dlist_node *l, struct rtgui_dlist_node *n)
{
l->next->prev = n;
n->next = l->next;
l->next = n;
n->prev = l;
}
/**
* @brief insert a node before a list
*
* @param n new node to be inserted
* @param l list to insert it
*/
rt_inline void rtgui_dlist_insert_before(struct rtgui_dlist_node *l, struct rtgui_dlist_node *n)
{
l->prev->next = n;
n->prev = l->prev;
l->prev = n;
n->next = l;
}
/**
* @brief remove node from list.
* @param n the node to remove from the list.
*/
rt_inline void rtgui_dlist_remove(struct rtgui_dlist_node *n)
{
n->next->prev = n->prev;
n->prev->next = n->next;
rtgui_dlist_init(n);
}
/**
* @brief tests whether a list is empty
* @param l the list to test.
*/
rt_inline int rtgui_dlist_isempty(const struct rtgui_dlist_node *l)
{
return l->next == l;
}
/**
* @brief get the struct for this entry
* @param node the entry point
* @param type the type of structure
* @param member the name of list in structure
*/
#define rtgui_dlist_entry(node, type, member) \
((type *)((char *)(node) - (unsigned long)(&((type *)0)->member)))
/* the direction can only be next or prev. If you want to iterate the list in
* normal order, use next. If you want to iterate the list with reverse order,
* use prev.*/
#define rtgui_dlist_foreach(node, list, direction) \
for ((node) = (list)->direction; (node) != list; (node) = (node)->direction)
#ifdef __cplusplus
}
#endif
#endif
......@@ -17,18 +17,10 @@
#include <rtgui/rtgui.h>
#include <rtgui/kbddef.h>
/* NOTE: if you create a new event type, remember to add it into the union
* rtgui_event_generic */
enum _rtgui_event_type
{
/* panel event */
RTGUI_EVENT_PANEL_ATTACH = 0, /* attach to a panel */
RTGUI_EVENT_PANEL_DETACH, /* detach from a panel */
RTGUI_EVENT_PANEL_SHOW, /* show in a panel */
RTGUI_EVENT_PANEL_HIDE, /* hide from a panel */
RTGUI_EVENT_PANEL_INFO, /* panel information */
RTGUI_EVENT_PANEL_RESIZE, /* resize panel */
RTGUI_EVENT_PANEL_FULLSCREEN, /* to full screen */
RTGUI_EVENT_PANEL_NORMAL, /* to normal screen */
/* window event */
RTGUI_EVENT_WIN_CREATE, /* create a window */
RTGUI_EVENT_WIN_DESTROY, /* destroy a window */
......@@ -39,6 +31,10 @@ enum _rtgui_event_type
RTGUI_EVENT_WIN_CLOSE, /* close a window */
RTGUI_EVENT_WIN_MOVE, /* move a window */
RTGUI_EVENT_WIN_RESIZE, /* resize a window */
RTGUI_EVENT_WIN_MODAL_ENTER, /* the window is entering modal mode.
This event should be sent after the
window got setup and before the
application got setup. */
/* WM event */
RTGUI_EVENT_SET_WM, /* set window manager */
......@@ -46,7 +42,7 @@ enum _rtgui_event_type
RTGUI_EVENT_UPDATE_BEGIN, /* update a rect */
RTGUI_EVENT_UPDATE_END, /* update a rect */
RTGUI_EVENT_MONITOR_ADD, /* add a monitor rect */
RTGUI_EVENT_MONITOR_REMOVE, /* remove a monitor rect*/
RTGUI_EVENT_MONITOR_REMOVE, /* remove a monitor rect */
RTGUI_EVENT_PAINT, /* paint on screen */
RTGUI_EVENT_TIMER, /* timer */
......@@ -98,110 +94,39 @@ typedef struct rtgui_event rtgui_event_t;
(e)->ack = RT_NULL; \
} while (0)
/*
* RTGUI Panel Event
*/
struct rtgui_event_panel_attach
{
struct rtgui_event parent;
/* the panel name to be attached */
char panel_name[RTGUI_NAME_MAX];
/* workbench, wm field */
rtgui_workbench_t* workbench;
};
struct rtgui_event_panel_detach
{
struct rtgui_event parent;
/* the panel which thread belong to */
rtgui_panel_t* panel;
/* workbench, wm field */
rtgui_workbench_t* workbench;
};
struct rtgui_event_panel_show
{
struct rtgui_event parent;
/* the panel which thread belong to */
rtgui_panel_t* panel;
/* workbench, wm field */
rtgui_workbench_t* workbench;
};
struct rtgui_event_panel_hide
{
struct rtgui_event parent;
/* the panel which thread belong to */
rtgui_panel_t* panel;
/* workbench, wm field */
rtgui_workbench_t* workbench;
};
struct rtgui_event_panel_info
{
struct rtgui_event parent;
/* panel info */
rtgui_panel_t* panel;
rtgui_rect_t extent;
};
#define RTGUI_EVENT_PANEL_ATTACH_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_PANEL_ATTACH)
#define RTGUI_EVENT_PANEL_DETACH_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_PANEL_DETACH)
#define RTGUI_EVENT_PANEL_SHOW_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_PANEL_SHOW)
#define RTGUI_EVENT_PANEL_HIDE_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_PANEL_HIDE)
#define RTGUI_EVENT_PANEL_INFO_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_PANEL_INFO)
#define _RTGUI_EVENT_WIN_ELEMENTS \
struct rtgui_event parent; \
struct rtgui_win *wid;
/*
* RTGUI Window Event
*/
struct rtgui_event_win
{
struct rtgui_event parent;
/* the window id */
rtgui_win_t* wid;
_RTGUI_EVENT_WIN_ELEMENTS
};
struct rtgui_event_win_create
{
struct rtgui_event parent;
_RTGUI_EVENT_WIN_ELEMENTS
struct rtgui_win *parent_window;
#ifndef RTGUI_USING_SMALL_SIZE
/* the window title */
rt_uint8_t title[RTGUI_NAME_MAX];
/* the window extent */
struct rtgui_rect extent;
#endif
/* the window id */
rtgui_win_t* wid;
};
struct rtgui_event_win_move
{
struct rtgui_event parent;
/* the window id */
rtgui_win_t* wid;
_RTGUI_EVENT_WIN_ELEMENTS
rt_int16_t x, y;
};
struct rtgui_event_win_resize
{
struct rtgui_event parent;
/* the window id */
rtgui_win_t* wid;
_RTGUI_EVENT_WIN_ELEMENTS
rtgui_rect_t rect;
};
......@@ -212,6 +137,7 @@ struct rtgui_event_win_resize
#define rtgui_event_win_activate rtgui_event_win
#define rtgui_event_win_deactivate rtgui_event_win
#define rtgui_event_win_close rtgui_event_win
#define rtgui_event_win_modal_enter rtgui_event_win
/* window event init */
#define RTGUI_EVENT_WIN_CREATE_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_CREATE)
......@@ -223,19 +149,7 @@ struct rtgui_event_win_resize
#define RTGUI_EVENT_WIN_CLOSE_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_CLOSE)
#define RTGUI_EVENT_WIN_MOVE_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_MOVE)
#define RTGUI_EVENT_WIN_RESIZE_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_RESIZE)
/*
* RTGUI Workbench Manager Event
*/
struct rtgui_event_set_wm
{
struct rtgui_event parent;
/* the panel name to be managed */
char panel_name[RTGUI_NAME_MAX];
};
/* window event init */
#define RTGUI_EVENT_SET_WM_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_SET_WM)
#define RTGUI_EVENT_WIN_MODAL_ENTER_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_MODAL_ENTER)
/*
* RTGUI Other Event
......@@ -258,23 +172,16 @@ struct rtgui_event_update_end
struct rtgui_event_monitor
{
struct rtgui_event parent;
_RTGUI_EVENT_WIN_ELEMENTS
/* the monitor rect */
rtgui_rect_t rect;
/* under panel */
rtgui_panel_t* panel;
/* or under window */
rtgui_win_t* wid;
};
struct rtgui_event_paint
{
struct rtgui_event parent;
_RTGUI_EVENT_WIN_ELEMENTS
rtgui_win_t* wid; /* destination window */
rtgui_rect_t rect; /* rect to be updated */
};
......@@ -290,13 +197,10 @@ typedef struct rtgui_event_timer rtgui_event_timer_t;
struct rtgui_event_clip_info
{
struct rtgui_event parent;
/* destination window */
rtgui_win_t* wid;
_RTGUI_EVENT_WIN_ELEMENTS
/* the number of rects */
rt_uint32_t num_rect;
//rt_uint32_t num_rect;
/* rtgui_rect_t *rects */
};
......@@ -315,9 +219,7 @@ struct rtgui_event_clip_info
*/
struct rtgui_event_mouse
{
struct rtgui_event parent;
rtgui_win_t* wid; /* destination window */
_RTGUI_EVENT_WIN_ELEMENTS
rt_uint16_t x, y;
rt_uint16_t button;
......@@ -333,9 +235,7 @@ struct rtgui_event_mouse
struct rtgui_event_kbd
{
struct rtgui_event parent;
rtgui_win_t* wid; /* destination window */
_RTGUI_EVENT_WIN_ELEMENTS
rt_uint16_t type; /* key down or up */
rt_uint16_t key; /* current key */
......@@ -354,7 +254,7 @@ struct rtgui_event_kbd
struct rtgui_event_command
{
struct rtgui_event parent;
_RTGUI_EVENT_WIN_ELEMENTS
/* command type */
rt_int32_t type;
......@@ -420,4 +320,33 @@ struct rtgui_event_resize
};
#define RTGUI_EVENT_RESIZE_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_RESIZE)
#undef _RTGUI_EVENT_WIN_ELEMENTS
union rtgui_event_generic
{
struct rtgui_event base;
struct rtgui_event_win win_base;
struct rtgui_event_win_create win_create;
struct rtgui_event_win_move win_move;
struct rtgui_event_win_resize win_resize;
struct rtgui_event_win_destroy win_destroy;
struct rtgui_event_win_show win_show;
struct rtgui_event_win_hide win_hide;
struct rtgui_event_win_activate win_activate;
struct rtgui_event_win_deactivate win_deactivate;
struct rtgui_event_win_close win_close;
struct rtgui_event_win_modal_enter win_modal_enter;
struct rtgui_event_update_begin update_begin;
struct rtgui_event_update_end update_end;
struct rtgui_event_monitor monitor;
struct rtgui_event_paint paint;
struct rtgui_event_timer timer;
struct rtgui_event_clip_info clip_info;
struct rtgui_event_mouse mouse;
struct rtgui_event_kbd kbd;
struct rtgui_event_command command;
struct rtgui_event_scrollbar scrollbar;
struct rtgui_event_focused focused;
struct rtgui_event_resize resize;
};
#endif
......@@ -21,17 +21,16 @@
#define RT_INT16_MIN (-RT_INT16_MAX-1)
#define RTGUI_NOT_FOUND (-1)
struct rtgui_panel;
struct rtgui_event;
struct rtgui_object;
struct rtgui_widget;
struct rtgui_win;
struct rtgui_font;
typedef struct rtgui_panel rtgui_panel_t;
typedef struct rtgui_win rtgui_win_t;
typedef struct rtgui_workbench rtgui_workbench_t;
typedef rt_bool_t (*rtgui_event_handler_ptr)(struct rtgui_widget* widget, struct rtgui_event* event);
typedef rt_bool_t (*rtgui_event_handler_ptr)(struct rtgui_object* widget, struct rtgui_event* event);
typedef void (*rtgui_onbutton_func_t)(struct rtgui_widget* widget, struct rtgui_event* event);
struct rtgui_point
......
/*
* File : rtgui_application.h
* This file is part of RTGUI in RT-Thread RTOS
* COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2012-01-13 Grissiom first version
*/
#ifndef __RTGUI_APPLICATION_H__
#define __RTGUI_APPLICATION_H__
#include <rtthread.h>
#include <rtgui/rtgui.h>
#include <rtgui/event.h>
#include <rtgui/rtgui_system.h>
DECLARE_CLASS_TYPE(application);
/** Gets the type of a application */
#define RTGUI_APPLICATION_TYPE (RTGUI_TYPE(application))
/** Casts the object to an rtgui_workbench */
#define RTGUI_APPLICATION(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_APPLICATION_TYPE, struct rtgui_application))
/** Checks if the object is an rtgui_workbench */
#define RTGUI_IS_APPLICATION(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_APPLICATION_TYPE))
enum rtgui_application_flag
{
RTGUI_APPLICATION_FLAG_EXITED = 0x04,
RTGUI_APPLICATION_FLAG_SHOWN = 0x08
};
typedef void (*rtgui_idle_func)(struct rtgui_object* obj, struct rtgui_event *event);
struct rtgui_application
{
struct rtgui_object parent;
/* application name */
unsigned char *name;
enum rtgui_application_flag state_flag;
rt_uint16_t ref_count;
rt_uint16_t exit_code;
/* the thread id */
rt_thread_t tid;
rt_thread_t server;
/* the message queue of thread */
rt_mq_t mq;
/* event buffer */
rt_uint8_t event_buffer[sizeof(union rtgui_event_generic)];
/* if not RT_NULL, the application is modaled by modal_object. If is
* RT_NULL, nothing modals. */
struct rtgui_object *modal_object;
/* on idle event handler */
rtgui_idle_func on_idle;
};
/**
* create an application named @myname on thread @param tid
*/
struct rtgui_application* rtgui_application_create(
rt_thread_t tid,
const char *myname);
void rtgui_application_destroy(struct rtgui_application *app);
rt_err_t rtgui_application_show(struct rtgui_application *app);
rt_err_t rtgui_application_hide(struct rtgui_application *app);
rt_base_t rtgui_application_run(struct rtgui_application *app);
void rtgui_application_exit(struct rtgui_application *app, rt_uint16_t code);
void rtgui_application_set_onidle(rtgui_idle_func onidle);
rtgui_idle_func rtgui_application_get_onidle(void);
struct rtgui_application* rtgui_application_self(void);
rt_thread_t rtgui_application_get_server(void);
void rtgui_application_set_root_object(struct rtgui_object* object);
struct rtgui_object* rtgui_application_get_root_object(void);
struct rtgui_event;
rt_err_t rtgui_application_send(rt_thread_t tid, struct rtgui_event* event, rt_size_t event_size);
rt_err_t rtgui_application_send_urgent(rt_thread_t tid, struct rtgui_event* event, rt_size_t event_size);
rt_err_t rtgui_application_send_sync(rt_thread_t tid, struct rtgui_event* event, rt_size_t event_size);
rt_err_t rtgui_application_ack(struct rtgui_event* event, rt_int32_t status);
rt_err_t rtgui_application_recv(struct rtgui_event* event, rt_size_t event_size);
rt_err_t rtgui_application_recv_nosuspend(struct rtgui_event* event, rt_size_t event_size);
rt_err_t rtgui_application_recv_filter(rt_uint32_t type, struct rtgui_event* event, rt_size_t event_size);
#endif /* end of include guard: RTGUI_APPLICATION_H */
......@@ -26,7 +26,7 @@
/* support Chinese font */
#define RTGUI_USING_FONTHZ
/* support FreeType TTF font */
// #define RTGUI_USING_TTF
//#define RTGUI_USING_TTF
/* use small size in RTGUI */
#define RTGUI_USING_SMALL_SIZE
/* use mouse cursor */
......@@ -72,4 +72,10 @@
#define RTGUI_APP_THREAD_STACK_SIZE 2048
#endif
#define RTGUI_USING_CAST_CHECK
//#define RTGUI_USING_DESKTOP_WINDOW
#define RTGUI_EVENT_DEBUG
#endif
......@@ -16,6 +16,7 @@
#include <rtthread.h>
#include <rtgui/rtgui.h>
#ifdef __cplusplus
extern "C" {
......@@ -85,23 +86,45 @@ DECLARE_CLASS_TYPE(type);
/** Gets the type of an object */
#define RTGUI_OBJECT_TYPE RTGUI_TYPE(type)
/** Casts the object to an rtgui_object_t */
#define RTGUI_OBJECT(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_OBJECT_TYPE, rtgui_object_t))
#define RTGUI_OBJECT(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_OBJECT_TYPE, struct rtgui_object))
/** Checks if the object is an rtgui_Object */
#define RTGUI_IS_OBJECT(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_OBJECT_TYPE))
enum rtgui_object_flag
{
RTGUI_OBJECT_FLAG_NONE = 0x00,
RTGUI_OBJECT_FLAG_STATIC = 0x01,
RTGUI_OBJECT_FLAG_DISABLED = 0x02
};
/* rtgui base object */
struct rtgui_object
{
/* object type */
const rtgui_type_t* type;
rt_bool_t is_static;
/* the event handler */
rtgui_event_handler_ptr event_handler;
enum rtgui_object_flag flag;
};
rtgui_type_t *rtgui_object_type_get(void);
rtgui_object_t *rtgui_object_create(rtgui_type_t *object_type);
void rtgui_object_destroy(rtgui_object_t *object);
/* set the event handler of object */
void rtgui_object_set_event_handler(struct rtgui_object *object, rtgui_event_handler_ptr handler);
/* object default event handler */
rt_bool_t rtgui_object_event_handler(struct rtgui_object *object, struct rtgui_event* event);
/* helper micro. widget event handlers could use this. */
#define RTGUI_WIDGET_EVENT_HANDLER_PREPARE \
struct rtgui_widget *widget; \
RT_ASSERT(object != RT_NULL); \
RT_ASSERT(event != RT_NULL); \
widget = RTGUI_WIDGET(object); \
/* supress compiler warning */ \
widget = widget;
void rtgui_object_name_set(rtgui_object_t *object, const char *name);
const char *rtgui_object_name_get(rtgui_object_t *object);
......
......@@ -15,6 +15,7 @@
#define __RTGUI_SERVER_H__
#include <rtgui/list.h>
#include <rtgui/dlist.h>
/* RTGUI server definitions */
......@@ -27,7 +28,13 @@ enum
WINTITLE_CLOSEBOX = 0x08,
WINTITLE_MOVE = 0x0C,
WINTITLE_CB_PRESSED = 0x10,
WINTITLE_NOFOCUS = 0x20
WINTITLE_NOFOCUS = 0x20,
/* window is hidden by default */
WINTITLE_SHOWN = 0x40,
/* window is modaled by other window */
WINTITLE_MODALED = 0x80,
/* window is modaling other window */
WINTITLE_MODALING = 0x100
};
#define WINTITLE_HEIGHT 20
......@@ -53,8 +60,12 @@ struct rtgui_topwin
/* the extent information */
rtgui_rect_t extent;
/* the top window list */
rtgui_list_t list;
struct rtgui_topwin *parent;
/* we need to iterate the topwin list with usual order(get target window)
* or reversely(painting). So it's better to use a double linked list */
struct rtgui_dlist_node list;
struct rtgui_dlist_node child_list;
/* the monitor rect list */
rtgui_list_t monitor_list;
......@@ -67,13 +78,7 @@ void rtgui_server_init(void);
/* post an event to server */
void rtgui_server_post_event(struct rtgui_event* event, rt_size_t size);
/* register or deregister panel in server */
void rtgui_panel_register(char* name, rtgui_rect_t* extent);
void rtgui_panel_deregister(char* name);
void rtgui_panel_set_default_focused(char* name);
void rtgui_panel_set_nofocused(char* name);
rt_err_t rtgui_server_post_event_sync(struct rtgui_event* event, rt_size_t size);
#endif
......@@ -21,32 +21,8 @@ struct rtgui_dc;
struct rtgui_event;
struct rtgui_widget;
#ifdef RTGUI_USING_SMALL_SIZE
#define RTGUI_EVENT_BUFFER_SIZE 64
#else
#define RTGUI_EVENT_BUFFER_SIZE 256
#endif
struct rtgui_thread
{
/* the thread id */
rt_thread_t tid;
/* the message queue of thread */
rt_mq_t mq;
/* the owner of 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
{
......@@ -67,25 +43,6 @@ void rtgui_timer_destory(rtgui_timer_t* timer);
void rtgui_timer_start(rtgui_timer_t* timer);
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(void);
rtgui_thread_t* rtgui_thread_self(void);
rt_thread_t rtgui_thread_get_server(void);
void rtgui_thread_set_widget(struct rtgui_widget* widget);
struct rtgui_widget* rtgui_thread_get_widget(void);
rt_err_t rtgui_thread_send(rt_thread_t tid, struct rtgui_event* event, rt_size_t event_size);
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);
/* rtgui system initialization function */
void rtgui_system_server_init(void);
......
......@@ -18,7 +18,7 @@
#include <rtgui/rtgui.h>
#include <rtgui/image.h>
#include <rtgui/rtgui_system.h>
#include <rtgui/widgets/view.h>
#include <rtgui/widgets/container.h>
DECLARE_CLASS_TYPE(aboutview);
/** Gets the type of a about view */
......@@ -30,7 +30,7 @@ DECLARE_CLASS_TYPE(aboutview);
struct rtgui_about_view
{
struct rtgui_view parent;
struct rtgui_container parent;
/* widget private data */
rtgui_image_t* logo;
......@@ -38,9 +38,7 @@ struct rtgui_about_view
};
typedef struct rtgui_about_view rtgui_about_view_t;
rtgui_type_t *rtgui_about_view_type_get(void);
rtgui_about_view_t* rtgui_about_view_create(rtgui_image_t *logo, const char* description);
rt_bool_t rtgui_about_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t rtgui_about_view_event_handler(struct rtgui_object* widget, struct rtgui_event* event);
#endif
......@@ -70,7 +70,7 @@ void rtgui_button_set_unpressed_image(rtgui_button_t* btn, rtgui_image_t* image)
void rtgui_button_set_onbutton(rtgui_button_t* btn, rtgui_onbutton_func_t func);
rt_bool_t rtgui_button_event_handler(struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t rtgui_button_event_handler(struct rtgui_object* object, struct rtgui_event* event);
/** @} */
......
......@@ -10,7 +10,7 @@ DECLARE_CLASS_TYPE(checkbox);
/** Gets the type of a checkbox */
#define RTGUI_CHECKBOX_TYPE (RTGUI_TYPE(checkbox))
/** Casts the object to an rtgui_button */
#define RTGUI_CHECKBOX(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_CHECKBOX_TYPE, rtgui_checkbox))
#define RTGUI_CHECKBOX(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_CHECKBOX_TYPE, struct rtgui_checkbox))
/** Checks if the object is an rtgui_button */
#define RTGUI_IS_CHECKBOX(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_CHECKBOX_TYPE))
......@@ -38,6 +38,6 @@ rt_bool_t rtgui_checkbox_get_checked(rtgui_checkbox_t* checkbox);
void rtgui_checkbox_set_onbutton(rtgui_checkbox_t* checkbox, rtgui_onbutton_func_t func);
rt_bool_t rtgui_checkbox_event_handler(struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t rtgui_checkbox_event_handler(struct rtgui_object* object, struct rtgui_event* event);
#endif
......@@ -34,16 +34,16 @@ struct rtgui_combobox
rt_uint16_t current_item;
/* call back */
void (*on_selected) (struct rtgui_widget* widget, struct rtgui_event* event);
rtgui_event_handler_ptr on_selected;
};
typedef struct rtgui_combobox rtgui_combobox_t;
rtgui_combobox_t *rtgui_combobox_create(struct rtgui_listbox_item* items, rt_uint16_t counter, struct rtgui_rect* rect);
void rtgui_combobox_destroy(rtgui_combobox_t* box);
rt_bool_t rtgui_combobox_event_handler(struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t rtgui_combobox_event_handler(struct rtgui_object* object, struct rtgui_event* event);
struct rtgui_listbox_item* rtgui_combox_get_select(struct rtgui_combobox* box);
void rtgui_combobox_set_onselected(struct rtgui_combobox* box, rtgui_onitem_func_t func);
void rtgui_combobox_set_onselected(struct rtgui_combobox* box, rtgui_event_handler_ptr func);
#endif
......@@ -16,32 +16,53 @@
#include <rtgui/widgets/widget.h>
#ifdef __cplusplus
extern "C" {
#endif
DECLARE_CLASS_TYPE(container);
/** Gets the type of a container */
#define RTGUI_CONTAINER_TYPE (RTGUI_TYPE(container))
/** Casts the object to a rtgui_container */
/** Casts the object to an rtgui_container */
#define RTGUI_CONTAINER(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_CONTAINER_TYPE, rtgui_container_t))
/** Checks if the object is a rtgui_container */
/** Checks if the object is an rtgui_container */
#define RTGUI_IS_CONTAINER(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_CONTAINER_TYPE))
/*
* the container widget
*/
struct rtgui_container
{
/* inherit from widget */
struct rtgui_widget parent;
struct rtgui_widget* focused;
rtgui_list_t children;
};
typedef struct rtgui_container rtgui_container_t;
rtgui_container_t* rtgui_container_create(void);
void rtgui_container_destroy(rtgui_container_t* container);
rt_bool_t rtgui_container_event_handler(struct rtgui_object* widget, struct rtgui_event* event);
#ifndef RTGUI_USING_SMALL_SIZE
struct rtgui_box;
void rtgui_container_set_box(struct rtgui_container* container, struct rtgui_box* box);
#endif
void rtgui_container_hide(rtgui_container_t* container);
void rtgui_container_add_child(rtgui_container_t *container, rtgui_widget_t* child);
void rtgui_container_remove_child(rtgui_container_t *container, rtgui_widget_t* child);
void rtgui_container_destroy_children(rtgui_container_t *container);
rtgui_widget_t* rtgui_container_get_first_child(rtgui_container_t* container);
rt_bool_t rtgui_container_event_handler(rtgui_widget_t* widget, rtgui_event_t* event);
rt_bool_t rtgui_container_event_handler(struct rtgui_object* widget, rtgui_event_t* event);
rt_bool_t rtgui_container_dispatch_event(rtgui_container_t *container, rtgui_event_t* event);
rt_bool_t rtgui_container_dispatch_mouse_event(rtgui_container_t *container, struct rtgui_event_mouse* event);
#ifdef __cplusplus
}
#endif
#endif
#ifndef __RTGUI_FILELIST_VIEW_H__
#define __RTGUI_FILELIST_VIEW_H__
#include <rtgui/widgets/view.h>
#include <rtgui/widgets/container.h>
#if defined(RTGUI_USING_DFS_FILERW) || defined(RTGUI_USING_STDIO_FILERW)
#define RTGUI_FITEM_FILE 0x0
......@@ -24,7 +24,7 @@ DECLARE_CLASS_TYPE(filelist);
struct rtgui_filelist_view
{
struct rtgui_view parent;
struct rtgui_container parent;
/* widget private data */
......@@ -44,8 +44,9 @@ struct rtgui_filelist_view
};
typedef struct rtgui_filelist_view rtgui_filelist_view_t;
rtgui_filelist_view_t* rtgui_filelist_view_create(rtgui_workbench_t* workbench,
const char* directory, const char* pattern, const rtgui_rect_t* rect);
rtgui_filelist_view_t* rtgui_filelist_view_create(const char* directory,
const char* pattern,
const rtgui_rect_t* rect);
void rtgui_filelist_view_destroy(rtgui_filelist_view_t* view);
rt_bool_t rtgui_filelist_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event);
......
......@@ -48,7 +48,7 @@ typedef struct rtgui_iconbox rtgui_iconbox_t;
struct rtgui_iconbox* rtgui_iconbox_create(struct rtgui_image* image, const char* text, int position);
void rtgui_iconbox_destroy(struct rtgui_iconbox* iconbox);
rt_bool_t rtgui_iconbox_event_handler(struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t rtgui_iconbox_event_handler(struct rtgui_object* object, struct rtgui_event* event);
void rtgui_iconbox_set_text_position(struct rtgui_iconbox* iconbox, int position);
......
......@@ -41,7 +41,7 @@ typedef struct rtgui_label rtgui_label_t;
rtgui_label_t* rtgui_label_create(const char* text);
void rtgui_label_destroy(rtgui_label_t* label);
rt_bool_t rtgui_label_event_handler(struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t rtgui_label_event_handler(struct rtgui_object* object, struct rtgui_event* event);
void rtgui_label_set_text(rtgui_label_t* label, const char* text);
char* rtgui_label_get_text(rtgui_label_t* label);
......
......@@ -19,7 +19,7 @@
#include <rtgui/image.h>
#include <rtgui/rtgui_system.h>
#include <rtgui/widgets/view.h>
#include <rtgui/widgets/container.h>
typedef void (*item_action)(struct rtgui_widget* widget, void* parameter);
struct rtgui_list_item
......@@ -45,7 +45,7 @@ DECLARE_CLASS_TYPE(listview);
struct rtgui_list_view
{
struct rtgui_view parent;
struct rtgui_container parent;
/* widget private data */
/* list item */
......@@ -59,20 +59,18 @@ struct rtgui_list_view
/* the number of item in a page */
rt_uint16_t page_items;
/* current item */
rt_int16_t current_item;
rt_uint16_t current_item;
/* icon layout */
rt_uint8_t row_items, col_items;
};
typedef struct rtgui_list_view rtgui_list_view_t;
rtgui_type_t *rtgui_list_view_type_get(void);
rtgui_list_view_t* rtgui_list_view_create(const struct rtgui_list_item* items, rt_uint16_t count,
rtgui_rect_t *rect, rt_uint16_t flag);
void rtgui_list_view_destroy(rtgui_list_view_t* view);
rt_bool_t rtgui_list_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t rtgui_list_view_event_handler(struct rtgui_object* widget, struct rtgui_event* event);
#endif
......@@ -43,7 +43,7 @@ struct rtgui_listbox
const struct rtgui_listbox_item* items;
/* item event handler */
void (*on_item)(rtgui_widget_t *widgets, struct rtgui_event* event);
rtgui_event_handler_ptr on_item;
/* total number of items */
rt_uint16_t items_count;
......@@ -53,14 +53,13 @@ struct rtgui_listbox
rt_int16_t current_item;
};
typedef struct rtgui_listbox rtgui_listbox_t;
typedef void (*rtgui_onitem_func_t)(struct rtgui_widget* widget, rtgui_event_t *event);
rtgui_listbox_t* rtgui_listbox_create(const struct rtgui_listbox_item* items, rt_uint16_t count,
rtgui_rect_t *rect);
void rtgui_listbox_destroy(rtgui_listbox_t* box);
rt_bool_t rtgui_listbox_event_handler(struct rtgui_widget* widget, struct rtgui_event* event);
void rtgui_listbox_set_onitem(rtgui_listbox_t* box, rtgui_onitem_func_t func);
rt_bool_t rtgui_listbox_event_handler(struct rtgui_object* object, struct rtgui_event* event);
void rtgui_listbox_set_onitem(rtgui_listbox_t* box, rtgui_event_handler_ptr func);
void rtgui_listbox_set_items(rtgui_listbox_t* box, struct rtgui_listbox_item* items, rt_uint16_t count);
void rtgui_listbox_set_current_item(rtgui_listbox_t* box, int index);
......
......@@ -44,22 +44,19 @@ struct rtgui_listctrl
rt_int16_t current_item;
/* item event handler */
void (*on_item)(rtgui_widget_t *widget, struct rtgui_event* event);
rtgui_event_handler_ptr on_item;
void (*on_item_draw)(struct rtgui_listctrl *list, struct rtgui_dc* dc, rtgui_rect_t* rect, rt_uint16_t index);
};
typedef struct rtgui_listctrl rtgui_listctrl_t;
typedef void (*rtgui_onitem_func_t)(struct rtgui_widget* widget, rtgui_event_t *event);
typedef void (*rtgui_onitem_draw_t)(struct rtgui_listctrl *list, struct rtgui_dc* dc, rtgui_rect_t* rect, rt_uint16_t index);
rtgui_type_t *rtgui_listctrl_type_get(void);
rtgui_listctrl_t* rtgui_listctrl_create(rt_uint32_t items, rt_uint16_t count,
rtgui_rect_t *rect, rtgui_onitem_draw_t ondraw);
void rtgui_listctrl_destroy(rtgui_listctrl_t* ctrl);
rt_bool_t rtgui_listctrl_event_handler(struct rtgui_widget* widget, struct rtgui_event* event);
void rtgui_listctrl_set_onitem(rtgui_listctrl_t* ctrl, rtgui_onitem_func_t func);
rt_bool_t rtgui_listctrl_event_handler(struct rtgui_object* object, struct rtgui_event* event);
void rtgui_listctrl_set_onitem(rtgui_listctrl_t* ctrl, rtgui_event_handler_ptr func);
void rtgui_listctrl_set_items(rtgui_listctrl_t* ctrl, rt_uint32_t items, rt_uint16_t count);
rt_bool_t rtgui_listctrl_get_item_rect(rtgui_listctrl_t* ctrl, rt_uint16_t item, rtgui_rect_t* item_rect);
......
......@@ -59,13 +59,11 @@ struct rtgui_menu
struct rtgui_listctrl *items_list;
/* pop event handle */
rt_bool_t (*on_menupop)(rtgui_widget_t* widget, rtgui_event_t* event);
rt_bool_t (*on_menuhide)(rtgui_widget_t* widget, rtgui_event_t* event);
rtgui_event_handler_ptr on_menupop;
rtgui_event_handler_ptr on_menuhide;
};
typedef struct rtgui_menu rtgui_menu_t;
rtgui_type_t *rtgui_menu_type_get(void);
struct rtgui_menu* rtgui_menu_create(const char* title, struct rtgui_menu* parent_menu,
const struct rtgui_menu_item* items, rt_uint16_t count);
void rtgui_menu_destroy(struct rtgui_menu* menu);
......
......@@ -2,13 +2,13 @@
#define __RTGUI_NOTEBOOK_H__
#include <rtgui/rtgui.h>
#include <rtgui/widgets/container.h>
#include <rtgui/widgets/widget.h>
DECLARE_CLASS_TYPE(notebook);
/** Gets the type of a notebook */
#define RTGUI_NOTEBOOK_TYPE (RTGUI_TYPE(notebook))
/** Casts the object to a notebook control */
#define RTGUI_NOTEBOOK(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_NOTEBOOK_TYPE, rtgui_notebook_t))
#define RTGUI_NOTEBOOK(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_NOTEBOOK_TYPE, struct rtgui_notebook))
/** Checks if the object is a notebook control */
#define RTGUI_IS_NOTEBOOK(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_NOTEBOOK_TYPE))
......@@ -16,38 +16,34 @@ DECLARE_CLASS_TYPE(notebook);
#define RTGUI_NOTEBOOK_BOTTOM 0x01
#define RTGUI_NOTEBOOK_NOTAB 0x02
struct rtgui_notebook_tab
{
char* title;
struct rtgui_widget* widget;
};
typedef struct rtgui_notebook_tab rtgui_notebook_tab_t;
struct rtgui_notebook_tab;
struct rtgui_notebook
{
struct rtgui_container parent;
struct rtgui_widget parent;
rt_uint8_t flag;
/* widget private data */
rtgui_notebook_tab_t* childs;
struct rtgui_notebook_tab *childs;
rt_uint16_t count;
rt_int16_t current;
};
typedef struct rtgui_notebook rtgui_notebook_t;
rtgui_type_t *rtgui_notebook_type_get(void);
struct rtgui_notebook* rtgui_notebook_create(const rtgui_rect_t* rect, rt_uint8_t style);
void rtgui_notebook_destroy(struct rtgui_notebook* notebook);
void rtgui_notebook_add(struct rtgui_notebook* notebook, const char* label, struct rtgui_widget* child);
struct rtgui_widget* rtgui_notebook_get_current(struct rtgui_notebook* notebook);
rt_int16_t rtgui_notebook_get_current_index(struct rtgui_notebook* notebook);
int rtgui_notebook_get_count(struct rtgui_notebook* notebook);
rtgui_notebook_t* rtgui_notebook_create(const rtgui_rect_t* rect, rt_uint8_t style);
void rtgui_notebook_destroy(rtgui_notebook_t* notebook);
void rtgui_notebook_set_current(struct rtgui_notebook* notebook, struct rtgui_widget* child);
void rtgui_notebook_set_current_by_index(struct rtgui_notebook* notebook, rt_uint16_t index);
void rtgui_notebook_add(rtgui_notebook_t* notebook, const char* label, rtgui_widget_t* child);
int rtgui_notebook_get_count(rtgui_notebook_t* notebook);
rtgui_widget_t* rtgui_notebook_get_current(rtgui_notebook_t* notebook);
void rtgui_notebook_set_current(rtgui_notebook_t* notebook, rtgui_widget_t* widget);
void rtgui_notebook_set_current_by_index(rtgui_notebook_t* notebook, rt_uint16_t index);
rtgui_widget_t* rtgui_notebook_get_index(rtgui_notebook_t* notebook, rt_uint16_t index);
struct rtgui_widget* rtgui_notebook_get_widget_at(struct rtgui_notebook* notebook, rt_uint16_t index);
rt_bool_t rtgui_notebook_event_handler(struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t rtgui_notebook_event_handler(struct rtgui_object* widget, struct rtgui_event* event);
#endif
......@@ -29,7 +29,7 @@ typedef struct rtgui_progressbar rtgui_progressbar_t;
struct rtgui_progressbar* rtgui_progressbar_create(int orientation, int range, rtgui_rect_t* r);
void rtgui_progressbar_destroy(struct rtgui_progressbar* p_bar);
rt_bool_t rtgui_progressbar_event_handler(struct rtgui_widget* widget,
rt_bool_t rtgui_progressbar_event_handler(struct rtgui_object* object,
struct rtgui_event* event);
void rtgui_progressbar_set_value(struct rtgui_progressbar *p_bar, int value);
......
......@@ -37,7 +37,7 @@ void rtgui_radiobox_destroy(struct rtgui_radiobox* radiobox);
void rtgui_radiobox_set_selection(struct rtgui_radiobox* radiobox, int selection);
int rtgui_radiobox_get_selection(struct rtgui_radiobox* radiobox);
rt_bool_t rtgui_radiobox_event_handler(struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t rtgui_radiobox_event_handler(struct rtgui_object* object, struct rtgui_event* event);
void rtgui_radiobox_set_orientation(struct rtgui_radiobox* radiobox, int orientation);
......
......@@ -62,7 +62,7 @@ struct rtgui_scrollbar
/* position 1:1 width of scrollbar */
rt_int16_t min_position, max_position;
rt_bool_t (*on_scroll) (struct rtgui_widget* widget, struct rtgui_event* event);
rtgui_event_handler_ptr on_scroll;
};
typedef struct rtgui_scrollbar rtgui_scrollbar_t;
......@@ -80,7 +80,7 @@ void rtgui_scrollbar_set_orientation(struct rtgui_scrollbar* bar, int orientatio
void rtgui_scrollbar_set_page_step(struct rtgui_scrollbar* bar, int step);
void rtgui_scrollbar_set_line_step(struct rtgui_scrollbar* bar, int step);
rt_bool_t rtgui_scrollbar_event_handler(struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t rtgui_scrollbar_event_handler(struct rtgui_object* object, struct rtgui_event* event);
#ifdef __cplusplus
}
......
......@@ -42,7 +42,7 @@ typedef struct rtgui_slider rtgui_slider_t;
struct rtgui_slider* rtgui_slider_create(rt_size_t min, rt_size_t max, int orient);
void rtgui_slider_destroy(struct rtgui_slider* slider);
rt_bool_t rtgui_slider_event_handler(struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t rtgui_slider_event_handler(struct rtgui_object* object, struct rtgui_event* event);
void rtgui_slider_set_range(struct rtgui_slider* slider, rt_size_t min, rt_size_t max);
void rtgui_slider_set_value(struct rtgui_slider* slider, rt_size_t value);
......
......@@ -28,7 +28,7 @@ typedef struct rtgui_staticline rtgui_staticline_t;
rtgui_staticline_t *rtgui_staticline_create(int orientation);
void rtgui_staticline_destroy(rtgui_staticline_t* staticline);
rt_bool_t rtgui_staticline_event_handler(struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t rtgui_staticline_event_handler(struct rtgui_object* object, struct rtgui_event* event);
void rtgui_staticline_set_orientation(rtgui_staticline_t* staticline, int orientation);
#endif
......
......@@ -65,7 +65,7 @@ typedef struct rtgui_textbox rtgui_textbox_t;
struct rtgui_textbox* rtgui_textbox_create(const char* text, rt_uint8_t flag);
void rtgui_textbox_destroy(struct rtgui_textbox* box);
rt_bool_t rtgui_textbox_event_handler(struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t rtgui_textbox_event_handler(struct rtgui_object* object, struct rtgui_event* event);
void rtgui_textbox_set_value(struct rtgui_textbox* box, const char* text);
const char* rtgui_textbox_get_value(struct rtgui_textbox* box);
......
......@@ -55,7 +55,7 @@ typedef struct rtgui_textview rtgui_textview_t;
rtgui_textview_t* rtgui_textview_create(const char* text, const rtgui_rect_t *rect);
void rtgui_textview_destroy(rtgui_textview_t* textview);
rt_bool_t rtgui_textview_event_handler(struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t rtgui_textview_event_handler(struct rtgui_object* object, struct rtgui_event* event);
void rtgui_textview_set_text(rtgui_textview_t* textview, const char* text);
/** @} */
......
......@@ -24,12 +24,9 @@ DECLARE_CLASS_TYPE(toplevel);
/** Checks if the object is an rtgui_toplevel */
#define RTGUI_IS_TOPLEVEL(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_TOPLEVEL_TYPE))
/* last mouse event handled widget */
#define RTGUI_TOPLEVEL_LAST_MEVENT_WIDGET(obj) (RTGUI_TOPLEVEL(obj)->last_mevent_widget)
struct rtgui_toplevel
{
/* inherit from container */
/* inherit from view */
rtgui_container_t parent;
/* drawing count */
......@@ -38,16 +35,10 @@ struct rtgui_toplevel
/* external clip info */
rtgui_rect_t* external_clip_rect;
rt_uint32_t external_clip_size;
/* server thread id */
rt_thread_t server;
/* last mouse event handled widget */
rtgui_widget_t* last_mevent_widget;
};
typedef struct rtgui_toplevel rtgui_toplevel_t;
rt_bool_t rtgui_toplevel_event_handler(rtgui_widget_t* widget, rtgui_event_t* event);
rt_bool_t rtgui_toplevel_event_handler(struct rtgui_object* widget, struct rtgui_event* event);
void rtgui_toplevel_update_clip(rtgui_toplevel_t* top);
#endif
/*
* File : view.h
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2009-10-16 Bernard first version
*/
#ifndef __RTGUI_VIEW_H__
#define __RTGUI_VIEW_H__
#include <rtgui/widgets/box.h>
#include <rtgui/widgets/container.h>
#ifdef __cplusplus
extern "C" {
#endif
DECLARE_CLASS_TYPE(view);
/** Gets the type of a view */
#define RTGUI_VIEW_TYPE (RTGUI_TYPE(view))
/** Casts the object to an rtgui_view */
#define RTGUI_VIEW(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_VIEW_TYPE, rtgui_view_t))
/** Checks if the object is an rtgui_view */
#define RTGUI_IS_VIEW(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_VIEW_TYPE))
/*
* the view widget
*/
struct rtgui_view
{
/* inherit from container */
struct rtgui_container parent;
/* private field */
char* title;
rt_bool_t modal_show;
};
typedef struct rtgui_view rtgui_view_t;
rtgui_view_t* rtgui_view_create(const char* title);
void rtgui_view_destroy(rtgui_view_t* view);
rt_bool_t rtgui_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event);
#ifndef RTGUI_USING_SMALL_SIZE
void rtgui_view_set_box(rtgui_view_t* view, rtgui_box_t* box);
#endif
rtgui_modal_code_t rtgui_view_show(rtgui_view_t* view, rt_bool_t is_modal);
void rtgui_view_hide(rtgui_view_t* view);
void rtgui_view_end_modal(rtgui_view_t* view, rtgui_modal_code_t modal_code);
char* rtgui_view_get_title(rtgui_view_t* view);
void rtgui_view_set_title(rtgui_view_t* view, const char* title);
#ifdef __cplusplus
}
#endif
#endif
......@@ -76,8 +76,10 @@ struct rtgui_widget
/* inherit from rtgui_object */
struct rtgui_object object;
/* the parent and root widget */
struct rtgui_widget *parent, *toplevel;
/* the widget that contains this widget */
struct rtgui_widget *parent;
/* the window that contains this widget */
struct rtgui_win *toplevel;
/* the widget children and sibling */
rtgui_list_t sibling;
......@@ -106,18 +108,25 @@ struct rtgui_widget
/* the rect clip */
rtgui_region_t clip;
/* the event handler */
rt_bool_t (*event_handler) (struct rtgui_widget* widget, struct rtgui_event* event);
/* call back */
rt_bool_t (*on_focus_in) (struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t (*on_focus_out) (struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t (*on_focus_in) (struct rtgui_object* widget, struct rtgui_event* event);
rt_bool_t (*on_focus_out) (struct rtgui_object* widget, struct rtgui_event* event);
/* will be called just before the widget is shown. You can setup your
* widget in this call back. It's return value is ignored. The @param event
* will always be RT_NULL
*/
rt_bool_t (*on_show) (struct rtgui_object* widget, struct rtgui_event* event);
/* will be called just before the widget is hiden. You can setup your
* widget in this call back. It's return value is ignored. The @param event
* will always be RT_NULL
*/
rt_bool_t (*on_hide) (struct rtgui_object* widget, struct rtgui_event* event);
#ifndef RTGUI_USING_SMALL_SIZE
rt_bool_t (*on_draw) (struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t (*on_mouseclick) (struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t (*on_key) (struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t (*on_size) (struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t (*on_command) (struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t (*on_draw) (struct rtgui_object* widget, struct rtgui_event* event);
rt_bool_t (*on_mouseclick) (struct rtgui_object* widget, struct rtgui_event* event);
rt_bool_t (*on_key) (struct rtgui_object* widget, struct rtgui_event* event);
rt_bool_t (*on_size) (struct rtgui_object* widget, struct rtgui_event* event);
rt_bool_t (*on_command) (struct rtgui_object* widget, struct rtgui_event* event);
#endif
/* user private data */
......@@ -125,14 +134,10 @@ struct rtgui_widget
};
typedef struct rtgui_widget rtgui_widget_t;
rtgui_type_t *rtgui_widget_type_get(void);
rtgui_widget_t *rtgui_widget_create(rtgui_type_t *widget_type);
void rtgui_widget_destroy(rtgui_widget_t* widget);
/* set the event handler of widget */
void rtgui_widget_set_event_handler(rtgui_widget_t* widget, rtgui_event_handler_ptr handler);
/* widget default event handler */
rt_bool_t rtgui_widget_event_handler(rtgui_widget_t* widget, rtgui_event_t* event);
rt_bool_t rtgui_widget_event_handler(struct rtgui_object* object, rtgui_event_t* event);
/* focus and unfocus */
void rtgui_widget_focus(rtgui_widget_t * widget);
......@@ -141,6 +146,8 @@ void rtgui_widget_unfocus(rtgui_widget_t *widget);
/* event handler for each command */
void rtgui_widget_set_onfocus(rtgui_widget_t* widget, rtgui_event_handler_ptr handler);
void rtgui_widget_set_onunfocus(rtgui_widget_t* widget, rtgui_event_handler_ptr handler);
void rtgui_widget_set_onshow(rtgui_widget_t* widget, rtgui_event_handler_ptr handler);
void rtgui_widget_set_onhide(rtgui_widget_t* widget, rtgui_event_handler_ptr handler);
#ifndef RTGUI_USING_SMALL_SIZE
void rtgui_widget_set_ondraw(rtgui_widget_t* widget, rtgui_event_handler_ptr handler);
void rtgui_widget_set_onmouseclick(rtgui_widget_t* widget, rtgui_event_handler_ptr handler);
......@@ -179,7 +186,7 @@ void rtgui_widget_move_to_logic(rtgui_widget_t* widget, int dx, int dy);
void rtgui_widget_update_clip(rtgui_widget_t* widget);
/* get the toplevel widget of widget */
rtgui_widget_t* rtgui_widget_get_toplevel(rtgui_widget_t* widget);
struct rtgui_win* rtgui_widget_get_toplevel(rtgui_widget_t* widget);
void rtgui_widget_show(rtgui_widget_t* widget);
void rtgui_widget_hide(rtgui_widget_t* widget);
......
......@@ -29,21 +29,47 @@ DECLARE_CLASS_TYPE(win);
/** Checks if the object is an rtgui_win */
#define RTGUI_IS_WIN(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_WIN_TYPE))
#define RTGUI_WIN_STYLE_MODAL 0x001 /* modal mode window */
#define RTGUI_WIN_STYLE_CLOSED 0x002 /* window is closed */
#define RTGUI_WIN_STYLE_ACTIVATE 0x004 /* window is activated */
#define RTGUI_WIN_STYLE_NO_FOCUS 0x008 /* non-focused window */
#define RTGUI_WIN_STYLE_NO_TITLE 0x010 /* no title window */
#define RTGUI_WIN_STYLE_NO_BORDER 0x020 /* no border window */
#define RTGUI_WIN_STYLE_CLOSEBOX 0x040 /* window has the close button */
#define RTGUI_WIN_STYLE_MINIBOX 0x080 /* window has the mini button */
#define RTGUI_WIN_STYLE_UNDER_MODAL 0x100 /* window is under modal show (show
* sub-win as modal window) */
#define RTGUI_WIN_STYLE_NO_FOCUS 0x001 /* non-focused window */
#define RTGUI_WIN_STYLE_NO_TITLE 0x002 /* no title window */
#define RTGUI_WIN_STYLE_NO_BORDER 0x004 /* no border window */
#define RTGUI_WIN_STYLE_CLOSEBOX 0x008 /* window has the close button */
#define RTGUI_WIN_STYLE_MINIBOX 0x010 /* window has the mini button */
#define RTGUI_WIN_STYLE_DESTROY_ON_CLOSE 0x020 /* window is destroyed when closed */
#ifdef RTGUI_USING_DESKTOP_WINDOW
/* A desktop window is a full screen window which will beneath all other windows.
* There will be only one desktop window in a system. And this window should be
* created _before_ any other windows.
*/
#define RTGUI_WIN_STYLE_DESKTOP 0x8000
#define RTGUI_WIN_STYLE_DESKTOP_DEFAULT RTGUI_WIN_STYLE_DESKTOP |\
RTGUI_WIN_STYLE_NO_BORDER |\
RTGUI_WIN_STYLE_NO_TITLE
#endif
#define RTGUI_WIN_STYLE_DEFAULT (RTGUI_WIN_STYLE_CLOSEBOX | RTGUI_WIN_STYLE_MINIBOX)
enum rtgui_win_flag
{
RTGUI_WIN_FLAG_INIT = 0x00, /* init state */
RTGUI_WIN_FLAG_MODAL = 0x01, /* modal mode window */
RTGUI_WIN_FLAG_CLOSED = 0x02, /* window is closed */
RTGUI_WIN_FLAG_ACTIVATE = 0x04, /* window is activated */
RTGUI_WIN_FLAG_UNDER_MODAL = 0x08, /* window is under modal
show(modaled by other) */
RTGUI_WIN_FLAG_CONNECTED = 0x10, /* connected to server */
/* window is event_key dispatcher(dispatch it to the focused widget in
* current window) _and_ a key handler(it should be able to handle keys
* such as ESC). Both of dispatching and handling are in the same
* function(rtgui_win_event_handler). So we have to distinguish between the
* two modes.
*
* If this flag is set, we are in key-handling mode.
*/
RTGUI_WIN_FLAG_HANDLE_KEY = 0x20
};
struct rtgui_win_title;
struct rtgui_win_area;
......@@ -52,33 +78,59 @@ struct rtgui_win
/* inherit from toplevel */
struct rtgui_toplevel parent;
/* parent toplevel */
rtgui_toplevel_t* parent_toplevel;
/* parent window. RT_NULL if the window is a top level window */
struct rtgui_win *parent_window;
/* the widget that will grab the focus in current window */
struct rtgui_widget *focused_widget;
/* top window style */
rt_uint16_t style;
/* window state flag */
enum rtgui_win_flag flag;
rtgui_modal_code_t modal_code;
rtgui_widget_t* modal_widget;
/* last mouse event handled widget */
rtgui_widget_t* last_mevent_widget;
/* window title */
char* title;
/* call back */
rt_bool_t (*on_activate) (struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t (*on_deactivate) (struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t (*on_close) (struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t (*on_activate) (struct rtgui_object* widget, struct rtgui_event* event);
rt_bool_t (*on_deactivate) (struct rtgui_object* widget, struct rtgui_event* event);
rt_bool_t (*on_close) (struct rtgui_object* widget, struct rtgui_event* event);
/* the key is sent to the focused widget by default. If the focused widget
* and all of it's parents didn't handle the key event, it will be handled
* by @func on_key
*
* If you want to handle key event on your own, it's better to overload
* this function other than handle EVENT_KBD in event_handler.
*/
rt_bool_t (*on_key) (struct rtgui_object* widget, struct rtgui_event* event);
/* reserved user data */
rt_uint32_t user_data;
};
rtgui_win_t* rtgui_win_create(rtgui_toplevel_t* parent_toplevel, const char* title,
rtgui_rect_t *rect, rt_uint8_t flag);
rtgui_win_t* rtgui_win_create(struct rtgui_win *parent_window, const char* title,
rtgui_rect_t *rect, rt_uint16_t style);
void rtgui_win_destroy(rtgui_win_t* win);
void rtgui_win_close(struct rtgui_win* win);
rtgui_modal_code_t rtgui_win_show(rtgui_win_t* win, rt_bool_t is_modal);
/** Close window.
*
* @param win the window you want to close
*
* @return RT_TRUE if the window is closed. RT_FALSE if not. If the onclose
* callback returns RT_FALSE, the window won't be closed.
*
* \sa rtgui_win_set_onclose .
*/
rt_bool_t rtgui_win_close(struct rtgui_win* win);
rt_base_t rtgui_win_show(struct rtgui_win *win, rt_bool_t is_modal);
void rtgui_win_hiden(rtgui_win_t* win);
void rtgui_win_end_modal(rtgui_win_t* win, rtgui_modal_code_t modal_code);
......@@ -96,8 +148,9 @@ void rtgui_win_set_box(rtgui_win_t* win, rtgui_box_t* box);
void rtgui_win_set_onactivate(rtgui_win_t* win, rtgui_event_handler_ptr handler);
void rtgui_win_set_ondeactivate(rtgui_win_t* win, rtgui_event_handler_ptr handler);
void rtgui_win_set_onclose(rtgui_win_t* win, rtgui_event_handler_ptr handler);
void rtgui_win_set_onkey(rtgui_win_t* win, rtgui_event_handler_ptr handler);
rt_bool_t rtgui_win_event_handler(rtgui_widget_t* win, struct rtgui_event* event);
rt_bool_t rtgui_win_event_handler(struct rtgui_object* win, struct rtgui_event* event);
void rtgui_win_event_loop(rtgui_win_t* wnd);
......
/*
* File : workbench.h
* This file is part of RTGUI in RT-Thread RTOS
* COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2009-10-04 Bernard first version
*/
#ifndef __RTGUI_WORKBENCH_H__
#define __RTGUI_WORKBENCH_H__
#include <rtgui/rtgui.h>
#include <rtgui/list.h>
#include <rtgui/region.h>
#include <rtgui/dc.h>
#include <rtgui/widgets/view.h>
#include <rtgui/widgets/toplevel.h>
#define RTGUI_WORKBENCH_FLAG_VISIBLE 0x00 /* workbench is visible */
#define RTGUI_WORKBENCH_FLAG_INVISIBLE 0x01 /* workbench is invisible */
#define RTGUI_WORKBENCH_FLAG_FULLSCREEN 0x02 /* workbench is full screen */
#define RTGUI_WORKBENCH_FLAG_MODAL_MODE 0x04 /* workbench is modal mode showing */
#define RTGUI_WORKBENCH_FLAG_CLOSEBLE 0x00
#define RTGUI_WORKBENCH_FLAG_UNCLOSEBLE 0x10
#define RTGUI_WORKBENCH_FLAG_CLOSED 0x20
#define RTGUI_WORKBENCH_FLAG_DEFAULT RTGUI_WORKBENCH_FLAG_VISIBLE | RTGUI_WORKBENCH_FLAG_CLOSEBLE
#define RTGUI_WORKBENCH_IS_MODAL_MODE(w) ((w)->flag & RTGUI_WORKBENCH_FLAG_MODAL_MODE)
DECLARE_CLASS_TYPE(workbench);
/** Gets the type of a workbench */
#define RTGUI_WORKBENCH_TYPE (RTGUI_TYPE(workbench))
/** Casts the object to an rtgui_workbench */
#define RTGUI_WORKBENCH(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_WORKBENCH_TYPE, rtgui_workbench_t))
/** Checks if the object is an rtgui_workbench */
#define RTGUI_IS_WORKBENCH(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_WORKBENCH_TYPE))
struct rtgui_workbench
{
/* inherit from toplevel */
struct rtgui_toplevel parent;
/* panel id */
rtgui_panel_t* panel;
/* workbench flag */
rt_uint8_t flag;
rtgui_modal_code_t modal_code;
rtgui_widget_t *modal_widget;
/* workbench title */
unsigned char* title;
rtgui_view_t* current_view;
};
rtgui_type_t* rtgui_workbench_type_get(void);
rtgui_workbench_t *rtgui_workbench_create(const char* panel_name, const unsigned char* title);
void rtgui_workbench_destroy(rtgui_workbench_t* workbench);
void rtgui_workbench_close(rtgui_workbench_t* workbench);
rt_bool_t rtgui_workbench_event_handler(rtgui_widget_t* widget, rtgui_event_t* event);
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 rtgui_workbench_show (rtgui_workbench_t* workbench);
rt_err_t rtgui_workbench_hide (rtgui_workbench_t* workbench);
void rtgui_workbench_add_view(rtgui_workbench_t* workbench, rtgui_view_t* view);
void rtgui_workbench_remove_view(rtgui_workbench_t* workbench, rtgui_view_t* view);
void rtgui_workbench_show_view(rtgui_workbench_t* workbench, rtgui_view_t* view);
void rtgui_workbench_hide_view(rtgui_workbench_t* workbench, rtgui_view_t* view);
rtgui_view_t *rtgui_workbench_get_current_view(rtgui_workbench_t * workbench);
#endif
......@@ -432,7 +432,7 @@ static void rtgui_winrect_show()
rt_uint16_t x, y;
rtgui_color_t c;
rtgui_rect_t screen_rect, win_rect, win_rect_inner;
void (*set_pixel) (rtgui_color_t *c, rt_base_t x, rt_base_t y);
void (*set_pixel) (rtgui_color_t *c, int x, int y);
c = black;
set_pixel = rtgui_graphic_driver_get_default()->ops->set_pixel;
......
/*
* File : panel.c
* This file is part of RTGUI in RT-Thread RTOS
* COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2009-10-04 Bernard first version
*/
#include "panel.h"
#include "mouse.h"
#include <rtgui/rtgui_system.h>
/* the global parameter */
struct rtgui_list_node _rtgui_panel_list = {RT_NULL};
void rtgui_panel_register(char* name, rtgui_rect_t* extent)
{
register rt_base_t temp;
struct rtgui_panel* panel;
panel = rtgui_panel_find(name);
if (panel != RT_NULL )
{
/* there are already a same named panel exist. */
return;
}
panel = rtgui_malloc(sizeof(struct rtgui_panel));
if (panel == RT_NULL)
{
/* can't alloc memory */
return;
}
/* copy name */
for (temp = 0; temp < RTGUI_NAME_MAX; temp ++)
{
panel->name[temp] = name[temp];
}
/* copy extent */
panel->extent = *extent;
panel->wm_thread = RT_NULL;
panel->is_focusable = RT_TRUE;
/* init list */
rtgui_list_init(&(panel->sibling));
rtgui_list_init(&(panel->thread_list));
/* add panel to panel list */
rtgui_list_insert(&_rtgui_panel_list, &(panel->sibling));
}
void rtgui_panel_deregister(char* name)
{
struct rtgui_panel* panel;
panel = rtgui_panel_find(name);
if (panel != RT_NULL)
{
rtgui_list_remove(&_rtgui_panel_list, &(panel->sibling));
/* free pane node */
rtgui_free(panel);
}
}
/* set default focused panel, please use it after registered panel */
void rtgui_panel_set_default_focused(char* name)
{
extern struct rtgui_panel* rtgui_server_focus_panel;
struct rtgui_panel* panel;
panel = rtgui_panel_find(name);
if (panel != RT_NULL)
{
rtgui_server_focus_panel = panel;
}
}
void rtgui_panel_set_nofocused(char* name)
{
extern struct rtgui_panel* rtgui_server_focus_panel;
struct rtgui_panel* panel;
panel = rtgui_panel_find(name);
if (panel != RT_NULL)
{
panel->is_focusable = RT_FALSE;
}
}
struct rtgui_panel* rtgui_panel_find(char* name)
{
struct rtgui_list_node* node;
struct rtgui_panel* panel;
rtgui_list_foreach(node, &_rtgui_panel_list)
{
panel = rtgui_list_entry(node, struct rtgui_panel, sibling);
if (rt_strncmp(panel->name, name, RTGUI_NAME_MAX) == 0)
{
return panel;
}
}
return RT_NULL;
}
struct rtgui_panel* rtgui_panel_thread_add(char* name, rt_thread_t tid)
{
struct rtgui_panel* panel;
panel = rtgui_panel_find(name);
if (panel != RT_NULL )
{
struct rtgui_panel_thread* thread;
/* allocate panel thread node */
thread = rtgui_malloc(sizeof(struct rtgui_panel_thread));
if (thread == RT_NULL)
{
return RT_NULL;
}
/* construct panel thread node */
thread->tid = tid;
/* init list */
rtgui_list_init(&(thread->list));
rtgui_list_init(&(thread->monitor_list));
/* append thread to the list */
rtgui_list_append(&(panel->thread_list), &(thread->list));
}
return panel;
}
void rtgui_panel_thread_remove(rtgui_panel_t* panel, rt_thread_t tid)
{
if (panel != RT_NULL )
{
struct rtgui_list_node* node;
struct rtgui_panel_thread* thread;
rtgui_list_foreach(node, &(panel->thread_list))
{
thread = rtgui_list_entry(node, struct rtgui_panel_thread, list);
if (thread->tid == tid)
{
/* remove node from list */
rtgui_list_remove(&(panel->thread_list), &(thread->list));
/* free the panel thread node */
rtgui_free(thread);
return;
}
}
}
}
rt_thread_t rtgui_panel_get_active_thread(rtgui_panel_t* panel)
{
if (panel != RT_NULL)
{
if (panel->thread_list.next != RT_NULL)
{
struct rtgui_panel_thread* thread;
thread = rtgui_list_entry(panel->thread_list.next, struct rtgui_panel_thread, list);
return thread->tid;
}
}
return RT_NULL;
}
void rtgui_panel_set_active_thread(rtgui_panel_t* panel, rt_thread_t tid)
{
/* get old active thread */
rt_thread_t prev_actived = rtgui_panel_get_active_thread(panel);
if (prev_actived != tid)
{
/* de-active old active workbench */
struct rtgui_event_panel_hide ehide;
RTGUI_EVENT_PANEL_HIDE_INIT(&ehide);
ehide.panel = panel;
ehide.workbench = RT_NULL;
rtgui_thread_send_urgent(prev_actived, &(ehide.parent), sizeof (ehide));
}
if (panel != RT_NULL )
{
struct rtgui_list_node* node;
struct rtgui_panel_thread* thread;
rtgui_list_foreach(node, &(panel->thread_list))
{
thread = rtgui_list_entry(node, struct rtgui_panel_thread, list);
if (thread->tid == tid)
{
/* remove node from list */
rtgui_list_remove(&(panel->thread_list), &(thread->list));
/* insert node to the header */
rtgui_list_insert(&(panel->thread_list), &(thread->list));
return;
}
}
}
}
/* deactivate current activated thread -- move it to the end of list */
void rtgui_panel_deactive_thread(rtgui_panel_t* panel)
{
RT_ASSERT(panel == RT_NULL);
if (panel->thread_list.next != RT_NULL)
{
struct rtgui_panel_thread* thread;
thread = rtgui_list_entry(panel->thread_list.next, struct rtgui_panel_thread, list);
/* remove it */
panel->thread_list.next = thread->list.next;
/* append to the tail of thread list */
rtgui_list_append(&(panel->thread_list), &(thread->list));
}
}
/**
* get the panel which contains a point(x, y)
*/
rtgui_panel_t* rtgui_panel_get_contain(int x, int y)
{
struct rtgui_list_node* node;
struct rtgui_panel* panel;
rtgui_list_foreach(node, &(_rtgui_panel_list))
{
panel = rtgui_list_entry(node, struct rtgui_panel, sibling);
if (rtgui_rect_contains_point(&(panel->extent), x, y) == RT_EOK)
{
return panel;
}
}
return RT_NULL;
}
/**
* append a rect to panel mouse monitor rect list
*/
void rtgui_panel_append_monitor_rect(rtgui_panel_t* panel, rt_thread_t tid, rtgui_rect_t* rect)
{
if (panel != RT_NULL )
{
struct rtgui_list_node* node;
struct rtgui_panel_thread* thread;
rtgui_list_foreach(node, &(panel->thread_list))
{
thread = rtgui_list_entry(node, struct rtgui_panel_thread, list);
if (thread->tid == tid)
{
/* add the monitor rect to list */
rtgui_mouse_monitor_append(&(thread->monitor_list), rect);
return;
}
}
}
}
/**
* remove a rect from panel mouse monitor rect list
*/
void rtgui_panel_remove_monitor_rect(rtgui_panel_t* panel, rt_thread_t tid, rtgui_rect_t* rect)
{
if (panel != RT_NULL )
{
struct rtgui_list_node* node;
struct rtgui_panel_thread* thread;
rtgui_list_foreach(node, &(panel->thread_list))
{
thread = rtgui_list_entry(node, struct rtgui_panel_thread, list);
if (thread->tid == tid)
{
/* remove the monitor rect from list */
rtgui_mouse_monitor_remove(&(thread->monitor_list), rect);
return;
}
}
}
}
void rtgui_panel_set_wm(rtgui_panel_t* panel, rt_thread_t wm)
{
RT_ASSERT(wm != RT_NULL);
RT_ASSERT(panel != RT_NULL);
panel->wm_thread = wm;
}
/*
* File : panel.h
* This file is part of RTGUI in RT-Thread RTOS
* COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2009-10-04 Bernard first version
*/
#ifndef __RT_PANEL_H__
#define __RT_PANEL_H__
#include <rtgui/rtgui.h>
#include <rtgui/list.h>
#include <rtgui/region.h>
struct rtgui_panel_thread
{
/* thread id */
rt_thread_t tid;
/* the list of thread */
rtgui_list_t list;
/* monitor rect list */
rtgui_list_t monitor_list;
};
typedef struct rtgui_panel_thread rtgui_panel_thread_list_t;
struct rtgui_panel
{
char name[RTGUI_NAME_MAX];
/* the extent of panel */
rtgui_rect_t extent;
/* the list of panel */
rtgui_list_t sibling;
/* the thread list in this panel */
rtgui_list_t thread_list;
/* the workbench manager thread */
rt_thread_t wm_thread;
/* is focusable */
rt_bool_t is_focusable;
};
/* find panel by name */
struct rtgui_panel* rtgui_panel_find(char* name);
/* add or remove application thread from specified panel */
rtgui_panel_t* rtgui_panel_thread_add(char* name, rt_thread_t tid);
void rtgui_panel_thread_remove(rtgui_panel_t* panel, rt_thread_t tid);
rt_thread_t rtgui_panel_get_active_thread(rtgui_panel_t* panel);
void rtgui_panel_set_active_thread(rtgui_panel_t* panel, rt_thread_t tid);
rtgui_panel_t* rtgui_panel_get_contain(int x, int y);
void rtgui_panel_set_wm(rtgui_panel_t* panel, rt_thread_t wm);
void rtgui_panel_append_monitor_rect(rtgui_panel_t* panel, rt_thread_t tid, rtgui_rect_t* rect);
void rtgui_panel_remove_monitor_rect(rtgui_panel_t* panel, rt_thread_t tid, rtgui_rect_t* rect);
#endif
/*
* File : rtgui_application.c
* This file is part of RTGUI in RT-Thread RTOS
* COPYRIGHT (C) 2012, RT-Thread Development Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2012-01-13 Grissiom first version(just a prototype of application API)
*/
#include <rtgui/rtgui_system.h>
#include <rtgui/rtgui_application.h>
#include <rtgui/widgets/window.h>
#ifdef _WIN32
#define RTGUI_EVENT_DEBUG
#endif
#ifdef RTGUI_EVENT_DEBUG
const char *event_string[] =
{
/* window event */
"WIN_CREATE", /* create a window */
"WIN_DESTROY", /* destroy a window */
"WIN_SHOW", /* show a window */
"WIN_HIDE", /* hide a window */
"WIN_ACTIVATE", /* activate a window */
"WIN_DEACTIVATE", /* deactivate a window */
"WIN_CLOSE", /* close a window */
"WIN_MOVE", /* move a window */
"WIN_RESIZE", /* resize a window */
"WIN_MODAL_ENTER", /* a window modals */
"SET_WM", /* set window manager */
"UPDATE_BEGIN", /* begin of update rect */
"UPDATE_END", /* end of update rect */
"MONITOR_ADD", /* add a monitor rect */
"MONITOR_REMOVE", /* remove a monitor rect*/
"PAINT", /* paint on screen */
"TIMER", /* timer */
/* clip rect information */
"CLIP_INFO", /* clip rect info */
/* mouse and keyboard event */
"MOUSE_MOTION", /* mouse motion */
"MOUSE_BUTTON", /* mouse button info */
"KBD", /* keyboard info */
/* user command event */
"COMMAND", /* user command */
/* request's status event */
"STATUS", /* request result */
"SCROLLED", /* scroll bar scrolled */
"RESIZE", /* widget resize */
};
#define DBG_MSG(x) rt_kprintf x
static void rtgui_event_dump(rt_thread_t tid, rtgui_event_t* event)
{
char* sender = "(unknown)";
if ((event->type == RTGUI_EVENT_TIMER) ||
(event->type == RTGUI_EVENT_UPDATE_BEGIN) ||
(event->type == RTGUI_EVENT_MOUSE_MOTION) ||
(event->type == RTGUI_EVENT_UPDATE_END))
{
/* don't dump timer event */
return ;
}
if (event->sender != RT_NULL)
sender = event->sender->name;
rt_kprintf("%s -- %s --> %s ", sender, event_string[event->type], tid->name);
switch (event->type)
{
case RTGUI_EVENT_PAINT:
{
struct rtgui_event_paint *paint = (struct rtgui_event_paint *)event;
if(paint->wid != RT_NULL)
rt_kprintf("win: %s", paint->wid->title);
}
break;
case RTGUI_EVENT_KBD:
{
struct rtgui_event_kbd *ekbd = (struct rtgui_event_kbd*) event;
if (ekbd->wid != RT_NULL)
rt_kprintf("win: %s", ekbd->wid->title);
if (RTGUI_KBD_IS_UP(ekbd)) rt_kprintf(", up");
else rt_kprintf(", down");
}
break;
case RTGUI_EVENT_CLIP_INFO:
{
struct rtgui_event_clip_info *info = (struct rtgui_event_clip_info *)event;
if(info->wid != RT_NULL)
rt_kprintf("win: %s", info->wid->title);
}
break;
case RTGUI_EVENT_WIN_CREATE:
{
struct rtgui_event_win_create *create = (struct rtgui_event_win_create*)event;
rt_kprintf(" win: %s at (x1:%d, y1:%d, x2:%d, y2:%d), addr: %p",
#ifdef RTGUI_USING_SMALL_SIZE
create->wid->title,
RTGUI_WIDGET(create->wid)->extent.x1,
RTGUI_WIDGET(create->wid)->extent.y1,
RTGUI_WIDGET(create->wid)->extent.x2,
RTGUI_WIDGET(create->wid)->extent.y2,
#else
create->title,
create->extent.x1,
create->extent.y1,
create->extent.x2,
create->extent.y2,
#endif
create->wid
);
}
break;
case RTGUI_EVENT_UPDATE_END:
{
struct rtgui_event_update_end* update_end = (struct rtgui_event_update_end*)event;
rt_kprintf("(x:%d, y1:%d, x2:%d, y2:%d)", update_end->rect.x1,
update_end->rect.y1,
update_end->rect.x2,
update_end->rect.y2);
}
break;
case RTGUI_EVENT_WIN_ACTIVATE:
case RTGUI_EVENT_WIN_DEACTIVATE:
case RTGUI_EVENT_WIN_SHOW:
case RTGUI_EVENT_WIN_MODAL_ENTER:
{
struct rtgui_event_win *win = (struct rtgui_event_win *)event;
if(win->wid != RT_NULL)
rt_kprintf("win: %s", win->wid->title);
}
break;
case RTGUI_EVENT_WIN_MOVE:
{
struct rtgui_event_win_move *win = (struct rtgui_event_win_move *)event;
if(win->wid != RT_NULL)
{
rt_kprintf("win: %s", win->wid->title);
rt_kprintf(" to (x:%d, y:%d)", win->x, win->y);
}
}
break;
case RTGUI_EVENT_WIN_RESIZE:
{
struct rtgui_event_win_resize* win = (struct rtgui_event_win_resize *)event;
if (win->wid != RT_NULL)
{
rt_kprintf("win: %s, rect(x1:%d, y1:%d, x2:%d, y2:%d)", win->wid->title,
RTGUI_WIDGET(win->wid)->extent.x1,
RTGUI_WIDGET(win->wid)->extent.y1,
RTGUI_WIDGET(win->wid)->extent.x2,
RTGUI_WIDGET(win->wid)->extent.y2);
}
}
break;
case RTGUI_EVENT_MOUSE_BUTTON:
case RTGUI_EVENT_MOUSE_MOTION:
{
struct rtgui_event_mouse *mouse = (struct rtgui_event_mouse*)event;
if (mouse->button & RTGUI_MOUSE_BUTTON_LEFT) rt_kprintf("left ");
else rt_kprintf("right ");
if (mouse->button & RTGUI_MOUSE_BUTTON_DOWN) rt_kprintf("down ");
else rt_kprintf("up ");
if (mouse->wid != RT_NULL)
rt_kprintf("win: %s at (%d, %d)", mouse->wid->title,
mouse->x, mouse->y);
else
rt_kprintf("(%d, %d)", mouse->x, mouse->y);
}
break;
case RTGUI_EVENT_MONITOR_ADD:
{
struct rtgui_event_monitor *monitor = (struct rtgui_event_monitor*)event;
if (monitor->wid != RT_NULL)
{
rt_kprintf("win: %s, the rect is:(%d, %d) - (%d, %d)", monitor->wid->title,
monitor->rect.x1, monitor->rect.y1,
monitor->rect.x2, monitor->rect.y2);
}
}
break;
}
rt_kprintf("\n");
}
#else
#define DBG_MSG(x)
#define rtgui_event_dump(tid, event)
#endif
rt_bool_t rtgui_application_event_handler(struct rtgui_object* obj, rtgui_event_t* event);
static void _rtgui_application_constructor(struct rtgui_application *app)
{
/* set event handler */
rtgui_object_set_event_handler(RTGUI_OBJECT(app),
rtgui_application_event_handler);
app->name = RT_NULL;
/* set EXITED so we can destroy an application that just created */
app->state_flag = RTGUI_APPLICATION_FLAG_EXITED;
app->ref_count = 0;
app->exit_code = 0;
app->tid = RT_NULL;
app->server = RT_NULL;
app->mq = RT_NULL;
app->modal_object = RT_NULL;
app->on_idle = RT_NULL;
}
static void _rtgui_application_destructor(struct rtgui_application *app)
{
RT_ASSERT(app != RT_NULL);
rt_free(app->name);
app->name = RT_NULL;
}
DEFINE_CLASS_TYPE(application, "application",
RTGUI_OBJECT_TYPE,
_rtgui_application_constructor,
_rtgui_application_destructor,
sizeof(struct rtgui_application));
struct rtgui_application* rtgui_application_create(
rt_thread_t tid,
const char *myname)
{
struct rtgui_application *app;
RT_ASSERT(tid != RT_NULL);
RT_ASSERT(myname != RT_NULL);
/* create application */
app = RTGUI_APPLICATION(rtgui_object_create(RTGUI_APPLICATION_TYPE));
if (app == RT_NULL)
return RT_NULL;
DBG_MSG(("register a rtgui application(%s) on thread %s\n", myname, tid->name));
app->tid = tid;
/* set user thread */
tid->user_data = (rt_uint32_t)app;
app->mq = rt_mq_create("rtgui", sizeof(union rtgui_event_generic), 32, RT_IPC_FLAG_FIFO);
if (app->mq == RT_NULL)
{
rt_kprintf("mq err\n");
goto __mq_err;
}
/* set application title */
app->name = (unsigned char*)rt_strdup((char*)myname);
if (app->name != RT_NULL)
return app;
__mq_err:
rtgui_object_destroy(RTGUI_OBJECT(app));
tid->user_data = 0;
return RT_NULL;
}
#define _rtgui_application_check(app) \
do { \
RT_ASSERT(app != RT_NULL); \
RT_ASSERT(app->tid != RT_NULL); \
RT_ASSERT(app->tid->user_data != 0); \
RT_ASSERT(app->mq != RT_NULL); \
} while (0)
void rtgui_application_destroy(struct rtgui_application *app)
{
_rtgui_application_check(app);
if (!(app->state_flag & RTGUI_APPLICATION_FLAG_EXITED))
{
rt_kprintf("cannot destroy a running application: %s.\n",
app->name);
return;
}
app->tid->user_data = 0;
rt_mq_delete(app->mq);
rtgui_object_destroy(RTGUI_OBJECT(app));
}
struct rtgui_application* rtgui_application_self(void)
{
struct rtgui_application *app;
rt_thread_t self;
/* get current thread */
self = rt_thread_self();
app = (struct rtgui_application*)(self->user_data);
return app;
}
void rtgui_application_set_onidle(rtgui_idle_func onidle)
{
struct rtgui_application *app;
app = rtgui_application_self();
if (app != RT_NULL)
app->on_idle = onidle;
}
rtgui_idle_func rtgui_application_get_onidle(void)
{
struct rtgui_application *app;
app = rtgui_application_self();
if (app != RT_NULL)
return app->on_idle;
else
return RT_NULL;
}
extern rt_thread_t rt_thread_find(char* name);
rt_thread_t rtgui_application_get_server(void)
{
return rt_thread_find("rtgui");
}
rt_err_t rtgui_application_send(rt_thread_t tid, rtgui_event_t* event, rt_size_t event_size)
{
rt_err_t result;
struct rtgui_application *app;
RT_ASSERT(tid != RT_NULL);
RT_ASSERT(event != RT_NULL);
RT_ASSERT(event_size != 0);
rtgui_event_dump(tid, event);
/* find struct rtgui_application */
app = (struct rtgui_application*) (tid->user_data);
if (app == RT_NULL)
return -RT_ERROR;
result = rt_mq_send(app->mq, event, event_size);
if (result != RT_EOK)
{
if (event->type != RTGUI_EVENT_TIMER)
rt_kprintf("send event to %s failed\n", app->tid->name);
}
return result;
}
rt_err_t rtgui_application_send_urgent(rt_thread_t tid, rtgui_event_t* event, rt_size_t event_size)
{
rt_err_t result;
struct rtgui_application *app;
RT_ASSERT(tid != RT_NULL);
RT_ASSERT(event != RT_NULL);
RT_ASSERT(event_size != 0);
rtgui_event_dump(tid, event);
/* find rtgui_application */
app = (struct rtgui_application*) (tid->user_data);
if (app == RT_NULL)
return -RT_ERROR;
result = rt_mq_urgent(app->mq, event, event_size);
if (result != RT_EOK)
rt_kprintf("send ergent event failed\n");
return result;
}
rt_err_t rtgui_application_send_sync(rt_thread_t tid, rtgui_event_t* event, rt_size_t event_size)
{
rt_err_t r;
struct rtgui_application *app;
rt_int32_t ack_buffer, ack_status;
struct rt_mailbox ack_mb;
RT_ASSERT(tid != RT_NULL);
RT_ASSERT(event != RT_NULL);
RT_ASSERT(event_size != 0);
rtgui_event_dump(tid, event);
/* init ack mailbox */
r = rt_mb_init(&ack_mb, "ack", &ack_buffer, 1, 0);
if (r!= RT_EOK)
goto __return;
app = (struct rtgui_application*) (tid->user_data);
if (app == RT_NULL)
{
r = -RT_ERROR;
goto __return;
}
event->ack = &ack_mb;
r = rt_mq_send(app->mq, event, event_size);
if (r != RT_EOK)
{
rt_kprintf("send sync event failed\n");
goto __return;
}
r = rt_mb_recv(&ack_mb, (rt_uint32_t*)&ack_status, RT_WAITING_FOREVER);
if (r!= RT_EOK)
goto __return;
if (ack_status != RTGUI_STATUS_OK)
r = -RT_ERROR;
else
r = RT_EOK;
__return:
/* fini ack mailbox */
rt_mb_detach(&ack_mb);
return r;
}
rt_err_t rtgui_application_ack(rtgui_event_t* event, rt_int32_t status)
{
RT_ASSERT(event != RT_NULL);
RT_ASSERT(event->ack != RT_NULL);
rt_mb_send(event->ack, status);
return RT_EOK;
}
rt_err_t rtgui_application_recv(rtgui_event_t* event, rt_size_t event_size)
{
struct rtgui_application* app;
rt_err_t r;
RT_ASSERT(event != RT_NULL);
RT_ASSERT(event_size != 0);
app = (struct rtgui_application*) (rt_thread_self()->user_data);
if (app == RT_NULL)
return -RT_ERROR;
r = rt_mq_recv(app->mq, event, event_size, RT_WAITING_FOREVER);
return r;
}
rt_err_t rtgui_application_recv_nosuspend(rtgui_event_t* event, rt_size_t event_size)
{
struct rtgui_application *app;
rt_err_t r;
RT_ASSERT(event != RT_NULL);
RT_ASSERT(event != 0);
app = (struct rtgui_application*) (rt_thread_self()->user_data);
if (app == RT_NULL)
return -RT_ERROR;
r = rt_mq_recv(app->mq, event, event_size, 0);
return r;
}
rt_err_t rtgui_application_recv_filter(rt_uint32_t type, rtgui_event_t* event, rt_size_t event_size)
{
struct rtgui_application *app;
RT_ASSERT(event != RT_NULL);
RT_ASSERT(event_size != 0);
app = (struct rtgui_application*) (rt_thread_self()->user_data);
if (app == RT_NULL)
return -RT_ERROR;
while (rt_mq_recv(app->mq, event, event_size, RT_WAITING_FOREVER) == RT_EOK)
{
if (event->type == type)
{
return RT_EOK;
}
else
{
if (RTGUI_OBJECT(app)->event_handler != RT_NULL)
{
RTGUI_OBJECT(app)->event_handler(RTGUI_OBJECT(app), event);
}
}
}
return -RT_ERROR;
}
rt_inline rt_bool_t _rtgui_application_dest_handle(
struct rtgui_application *app,
struct rtgui_event *event)
{
struct rtgui_event_win* wevent = (struct rtgui_event_win*)event;
struct rtgui_object* dest_object = RTGUI_OBJECT(wevent->wid);
if (dest_object != RT_NULL)
{
if (dest_object->event_handler != RT_NULL)
return dest_object->event_handler(RTGUI_OBJECT(dest_object), event);
else
return RT_FALSE;
}
else
{
rt_kprintf("RTGUI ERROR:server sent a event(%d) without wid\n", event->type);
return RT_FALSE;
}
}
rt_bool_t rtgui_application_event_handler(struct rtgui_object* object, rtgui_event_t* event)
{
struct rtgui_application* app;
RT_ASSERT(object != RT_NULL);
RT_ASSERT(event != RT_NULL);
app = RTGUI_APPLICATION(object);
switch (event->type)
{
case RTGUI_EVENT_PAINT:
case RTGUI_EVENT_CLIP_INFO:
case RTGUI_EVENT_WIN_ACTIVATE:
case RTGUI_EVENT_WIN_DEACTIVATE:
case RTGUI_EVENT_WIN_CLOSE:
case RTGUI_EVENT_WIN_MOVE:
case RTGUI_EVENT_KBD:
_rtgui_application_dest_handle(app, event);
break;
case RTGUI_EVENT_MOUSE_BUTTON:
case RTGUI_EVENT_MOUSE_MOTION:
{
struct rtgui_event_win* wevent = (struct rtgui_event_win*)event;
struct rtgui_object* dest_object = RTGUI_OBJECT(wevent->wid);
// FIXME: let application determine the dest_wiget but not in sever
// so we can combine this handler with above one
if (app->modal_object != RT_NULL &&
dest_object != app->modal_object)
{
// rt_kprintf("discard event %s that is not sent to modal object\n",
// event_string[event->type]);
}
else
{
_rtgui_application_dest_handle(app, event);
}
}
break;
case RTGUI_EVENT_TIMER:
{
struct rtgui_timer* timer;
struct rtgui_event_timer* etimer = (struct rtgui_event_timer*) event;
timer = etimer->timer;
if (timer->timeout != RT_NULL)
{
/* call timeout function */
timer->timeout(timer, timer->user_data);
}
}
break;
case RTGUI_EVENT_COMMAND:
{
struct rtgui_event_command *ecmd = (struct rtgui_event_command*)event;
if (ecmd->wid != RT_NULL)
return _rtgui_application_dest_handle(app, event);
}
default:
return rtgui_object_event_handler(object, event);
}
return RT_TRUE;
}
rt_inline void _rtgui_application_event_loop(struct rtgui_application *app)
{
rt_err_t result;
rt_uint16_t current_ref;
struct rtgui_event *event;
_rtgui_application_check(app);
/* point to event buffer */
event = (struct rtgui_event*)app->event_buffer;
current_ref = ++app->ref_count;
while (current_ref <= app->ref_count)
{
RT_ASSERT(current_ref == app->ref_count);
if (app->on_idle != RT_NULL)
{
result = rtgui_application_recv_nosuspend(event, sizeof(union rtgui_event_generic));
if (result == RT_EOK)
RTGUI_OBJECT(app)->event_handler(RTGUI_OBJECT(app), event);
else if (result == -RT_ETIMEOUT)
app->on_idle(RTGUI_OBJECT(app), RT_NULL);
}
else
{
result = rtgui_application_recv(event, sizeof(union rtgui_event_generic));
if (result == RT_EOK)
RTGUI_OBJECT(app)->event_handler(RTGUI_OBJECT(app), event);
}
}
}
rt_base_t rtgui_application_run(struct rtgui_application *app)
{
_rtgui_application_check(app);
app->state_flag &= ~RTGUI_APPLICATION_FLAG_EXITED;
_rtgui_application_event_loop(app);
if (app->ref_count == 0)
app->state_flag |= RTGUI_APPLICATION_FLAG_EXITED;
return app->exit_code;
}
void rtgui_application_exit(struct rtgui_application* app, rt_uint16_t code)
{
--app->ref_count;
app->exit_code = code;
}
......@@ -15,176 +15,15 @@
#include <rtgui/rtgui.h>
#include <rtgui/event.h>
#include <rtgui/rtgui_system.h>
#include <rtgui/rtgui_object.h>
#include <rtgui/rtgui_application.h>
#include <rtgui/driver.h>
#include "mouse.h"
#include "panel.h"
#include "topwin.h"
static struct rt_thread *rtgui_server_tid;
static struct rt_messagequeue *rtgui_server_mq;
extern struct rtgui_topwin* rtgui_server_focus_topwin;
struct rtgui_panel* rtgui_server_focus_panel = RT_NULL;
void rtgui_server_create_application(struct rtgui_event_panel_attach* event)
{
struct rtgui_panel* panel = rtgui_panel_find(event->panel_name);
if (panel != RT_NULL)
{
struct rtgui_event_panel_info ep;
RTGUI_EVENT_PANEL_INFO_INIT(&ep);
if (panel->wm_thread != RT_NULL)
{
/* notify to workbench */
rtgui_thread_send(panel->wm_thread, &(event->parent), sizeof(struct rtgui_event_panel_attach));
}
/* send the responses - ok */
rtgui_thread_ack(RTGUI_EVENT(event), RTGUI_STATUS_OK);
/* send the panel info */
ep.panel = panel;
ep.extent = panel->extent;
rtgui_thread_send(event->parent.sender, (struct rtgui_event*)&ep, sizeof(ep));
rtgui_panel_thread_add(event->panel_name, event->parent.sender);
}
else
{
/* send the responses - failure */
rtgui_thread_ack(RTGUI_EVENT(event), RTGUI_STATUS_NRC);
}
}
void rtgui_server_destroy_application(struct rtgui_event_panel_detach* event)
{
struct rtgui_panel* panel = event->panel;
if (panel != RT_NULL)
{
if (panel->wm_thread != RT_NULL)
{
/* notify to workbench */
rtgui_thread_send(panel->wm_thread, &(event->parent), sizeof(struct rtgui_event_panel_detach));
}
/* send the responses */
rtgui_thread_ack(RTGUI_EVENT(event), RTGUI_STATUS_OK);
rtgui_panel_thread_remove(panel, event->parent.sender);
{
/* get next thread and active it */
rt_thread_t tid = rtgui_panel_get_active_thread(panel);
if (tid != RT_NULL)
{
/* let this thread repaint */
struct rtgui_event_paint epaint;
RTGUI_EVENT_PAINT_INIT(&epaint);
epaint.wid = RT_NULL;
rtgui_thread_send(tid, (struct rtgui_event*)&epaint, sizeof(epaint));
}
}
}
else
{
/* send the responses - failure */
rtgui_thread_ack(RTGUI_EVENT(event), RTGUI_STATUS_NRC);
}
}
void rtgui_server_thread_panel_show(struct rtgui_event_panel_show* event)
{
struct rtgui_panel* panel = event->panel;
if (panel != RT_NULL)
{
struct rtgui_event_paint epaint;
/* send the responses */
rtgui_thread_ack(RTGUI_EVENT(event), RTGUI_STATUS_OK);
if (panel->wm_thread != RT_NULL)
{
/* notify to workbench */
rtgui_thread_send(panel->wm_thread, &(event->parent), sizeof(struct rtgui_event_panel_show));
}
rtgui_panel_set_active_thread(panel, event->parent.sender);
/* send all topwin clip info */
rtgui_topwin_update_clip_to_panel(panel);
/* send paint event */
RTGUI_EVENT_PAINT_INIT(&epaint);
epaint.wid = RT_NULL;
rtgui_thread_send(event->parent.sender, (struct rtgui_event*)&epaint,
sizeof(epaint));
}
else
{
/* send failed */
rtgui_thread_ack(RTGUI_EVENT(event), RTGUI_STATUS_ERROR);
}
}
void rtgui_server_thread_panel_hide(struct rtgui_event_panel_hide* event)
{
struct rtgui_panel* panel = event->panel;
if (panel != RT_NULL)
{
rt_thread_t tid;
/* send the responses */
rtgui_thread_ack(RTGUI_EVENT(event), RTGUI_STATUS_OK);
if (panel->thread_list.next != RT_NULL)
{
struct rtgui_panel_thread* thread;
thread = rtgui_list_entry(panel->thread_list.next, struct rtgui_panel_thread, list);
/* remove it */
panel->thread_list.next = thread->list.next;
/* append to the tail of thread list */
rtgui_list_append(&(panel->thread_list), &(thread->list));
}
/* send all topwin clip info */
rtgui_topwin_update_clip_to_panel(panel);
/* get new active thread */
tid = rtgui_panel_get_active_thread(panel);
if (tid != RT_NULL)
{
struct rtgui_event_paint epaint;
/* send paint event */
RTGUI_EVENT_PAINT_INIT(&epaint);
epaint.wid = RT_NULL;
rtgui_thread_send(tid, (struct rtgui_event*)&epaint, sizeof(epaint));
}
}
else
{
/* send failed */
rtgui_thread_ack(RTGUI_EVENT(event), RTGUI_STATUS_ERROR);
}
}
void rtgui_server_handle_set_wm(struct rtgui_event_set_wm *event)
{
struct rtgui_panel* panel = rtgui_panel_find(event->panel_name);
if (panel != RT_NULL)
{
rtgui_panel_set_wm(panel, event->parent.sender);
}
}
static struct rtgui_application *rtgui_server_application;
void rtgui_server_handle_update(struct rtgui_event_update_end* event)
{
......@@ -199,36 +38,19 @@ void rtgui_server_handle_update(struct rtgui_event_update_end* event)
void rtgui_server_handle_monitor_add(struct rtgui_event_monitor* event)
{
if (event->panel != RT_NULL)
{
/* append monitor rect to panel list */
rtgui_panel_append_monitor_rect(event->panel, event->parent.sender, &(event->rect));
}
else
{
/* add monitor rect to top window list */
rtgui_topwin_append_monitor_rect(event->wid, &(event->rect));
}
}
void rtgui_server_handle_monitor_remove(struct rtgui_event_monitor* event)
{
if (event->panel != RT_NULL)
{
/* add monitor rect to panel list */
rtgui_panel_remove_monitor_rect(event->panel, event->parent.sender, &(event->rect));
}
else
{
/* add monitor rect to top window list */
rtgui_topwin_remove_monitor_rect(event->wid, &(event->rect));
}
}
void rtgui_server_handle_mouse_btn(struct rtgui_event_mouse* event)
{
struct rtgui_topwin* wnd;
struct rtgui_panel* panel;
/* re-init to server thread */
RTGUI_EVENT_MOUSE_BUTTON_INIT(event);
......@@ -263,7 +85,7 @@ void rtgui_server_handle_mouse_btn(struct rtgui_event_mouse* event)
}
/* send to client thread */
rtgui_thread_send(topwin->tid, &(ewin.parent), sizeof(ewin));
rtgui_application_send(topwin->tid, &(ewin.parent), sizeof(ewin));
return;
}
......@@ -271,16 +93,15 @@ void rtgui_server_handle_mouse_btn(struct rtgui_event_mouse* event)
#endif
/* get the wnd which contains the mouse */
wnd = rtgui_topwin_get_wnd(event->x, event->y);
wnd = rtgui_topwin_get_wnd_no_modaled(event->x, event->y);
if (wnd != RT_NULL)
{
event->wid = wnd->wid;
if (rtgui_server_focus_topwin != wnd)
if (rtgui_topwin_get_focus() != wnd)
{
/* raise this window */
rtgui_topwin_activate_win(wnd);
rtgui_server_focus_panel = RT_NULL;
}
if (wnd->title != RT_NULL &&
......@@ -291,137 +112,39 @@ void rtgui_server_handle_mouse_btn(struct rtgui_event_mouse* event)
else
{
/* send mouse event to thread */
rtgui_thread_send(wnd->tid, (struct rtgui_event*)event, sizeof(struct rtgui_event_mouse));
rtgui_application_send(wnd->tid, (struct rtgui_event*)event, sizeof(struct rtgui_event_mouse));
}
return ;
}
/* get the panel which contains the mouse */
panel = rtgui_panel_get_contain(event->x, event->y);
if ((panel != RT_NULL) && (panel->is_focusable == RT_TRUE))
{
/* deactivate old window */
if (rtgui_server_focus_topwin != RT_NULL)
{
rtgui_topwin_deactivate_win(rtgui_server_focus_topwin);
}
rtgui_server_focus_panel = panel;
rtgui_server_focus_topwin = RT_NULL;
/* set destination window to null */
event->wid = RT_NULL;
/* send mouse event to thread */
if (rtgui_panel_get_active_thread(panel) != RT_NULL)
{
rtgui_thread_send(rtgui_panel_get_active_thread(panel),
(struct rtgui_event*)event,
sizeof(struct rtgui_event_mouse));
}
}
}
static struct rtgui_panel* last_monitor_panel = RT_NULL;
static struct rtgui_topwin* last_monitor_topwin = RT_NULL;
void rtgui_server_handle_mouse_motion(struct rtgui_event_mouse* event)
{
/* the topwin contains current mouse */
struct rtgui_topwin* win = RT_NULL;
struct rtgui_panel* panel = RT_NULL;
/* re-init mouse event */
RTGUI_EVENT_MOUSE_MOTION_INIT(event);
/* find the panel or topwin which monitor the mouse motion */
win = rtgui_topwin_get_wnd(event->x, event->y);
if (win == RT_NULL)
{
/* try to find monitor on the panel */
panel = rtgui_panel_get_contain(event->x, event->y);
if (panel != RT_NULL)
{
struct rtgui_panel_thread* thread;
/* get active panel thread */
if (panel->thread_list.next != RT_NULL)
{
thread = rtgui_list_entry(panel->thread_list.next, struct rtgui_panel_thread, list);
if (!rtgui_mouse_monitor_contains_point(&(thread->monitor_list),
event->x, event->y) == RT_TRUE)
{
/* no monitor in this panel */
panel = RT_NULL;
}
}
}
}
else if (win->monitor_list.next != RT_NULL)
win = rtgui_topwin_get_wnd_no_modaled(event->x, event->y);
if (win != RT_NULL && win->monitor_list.next != RT_NULL)
{
// FIXME:
/* check whether the monitor exist */
if (rtgui_mouse_monitor_contains_point(&(win->monitor_list), event->x, event->y) != RT_TRUE)
if (rtgui_mouse_monitor_contains_point(&(win->monitor_list),
event->x, event->y) != RT_TRUE)
{
win = RT_NULL;
/* try to find monitor on the panel */
panel = rtgui_panel_get_contain(event->x, event->y);
if (panel != RT_NULL)
{
struct rtgui_panel_thread* thread;
/* get active panel thread */
if (panel->thread_list.next != RT_NULL)
{
thread = rtgui_list_entry(panel->thread_list.next, struct rtgui_panel_thread, list);
if (!rtgui_mouse_monitor_contains_point(&(thread->monitor_list),
event->x, event->y) == RT_TRUE)
{
/* no monitor in this panel */
panel = RT_NULL;
}
}
}
}
}
else
{
win = RT_NULL;
}
/* check old panel or window */
if (last_monitor_panel != RT_NULL)
{
rt_thread_t tid = rtgui_panel_get_active_thread(last_monitor_panel);
/* send mouse motion event */
if (tid != RT_NULL)
{
event->wid = RT_NULL;
rtgui_thread_send(tid, &(event->parent), sizeof(struct rtgui_event_mouse));
}
}
else if (last_monitor_topwin != RT_NULL)
if (last_monitor_topwin != RT_NULL)
{
event->wid = last_monitor_topwin->wid;
/* send mouse motion event */
rtgui_thread_send(last_monitor_topwin->tid, &(event->parent), sizeof(struct rtgui_event_mouse));
}
if (last_monitor_panel != panel)
{
last_monitor_panel = panel;
if (last_monitor_panel != RT_NULL)
{
rt_thread_t tid = rtgui_panel_get_active_thread(last_monitor_panel);
event->wid = RT_NULL;
/* send mouse motion event */
if (tid != RT_NULL)
rtgui_thread_send(tid, &(event->parent), sizeof(struct rtgui_event_mouse));
}
rtgui_application_send(last_monitor_topwin->tid, &(event->parent), sizeof(struct rtgui_event_mouse));
}
if (last_monitor_topwin != win)
......@@ -432,7 +155,7 @@ void rtgui_server_handle_mouse_motion(struct rtgui_event_mouse* event)
event->wid = last_monitor_topwin->wid;
/* send mouse motion event */
rtgui_thread_send(last_monitor_topwin->tid, &(event->parent), sizeof(struct rtgui_event_mouse));
rtgui_application_send(last_monitor_topwin->tid, &(event->parent), sizeof(struct rtgui_event_mouse));
}
}
......@@ -443,141 +166,84 @@ void rtgui_server_handle_mouse_motion(struct rtgui_event_mouse* event)
void rtgui_server_handle_kbd(struct rtgui_event_kbd* event)
{
struct rtgui_topwin* wnd;
struct rtgui_panel* panel;
/* re-init to server thread */
RTGUI_EVENT_KBD_INIT(event);
/* todo: handle input method and global shortcut */
/* send to focus window or focus panel */
wnd = rtgui_server_focus_topwin;
if (wnd != RT_NULL && wnd->flag & WINTITLE_ACTIVATE)
wnd = rtgui_topwin_get_focus();
if (wnd != RT_NULL)
{
RT_ASSERT(wnd->flag & WINTITLE_ACTIVATE)
/* send to focus window */
event->wid = wnd->wid;
/* send keyboard event to thread */
rtgui_thread_send(wnd->tid, (struct rtgui_event*)event, sizeof(struct rtgui_event_kbd));
rtgui_application_send(wnd->tid, (struct rtgui_event*)event, sizeof(struct rtgui_event_kbd));
return;
}
panel = rtgui_server_focus_panel;
if (panel != RT_NULL)
{
rt_thread_t tid;
/* get active thread in this panel */
tid = rtgui_panel_get_active_thread(panel);
if (tid != RT_NULL)
{
/* send to focus panel */
event->wid = RT_NULL;
/* send keyboard event to thread */
rtgui_thread_send(tid, (struct rtgui_event*)event, sizeof(struct rtgui_event_kbd));
}
}
}
#ifdef __WIN32__
#ifdef _WIN32
#include <windows.h>
#endif
/**
* rtgui server thread's entry
*/
static void rtgui_server_entry(void* parameter)
static rt_bool_t rtgui_server_event_handler(struct rtgui_object *object,
struct rtgui_event *event)
{
#ifdef __WIN32__
/* set the server thread to highest */
HANDLE hCurrentThread = GetCurrentThread();
SetThreadPriority(hCurrentThread, THREAD_PRIORITY_HIGHEST);
#endif
#ifdef RTGUI_USING_SMALL_SIZE
/* create rtgui server msgq */
rtgui_server_mq = rt_mq_create("rtgui",
32, 16, RT_IPC_FLAG_FIFO);
#else
/* create rtgui server msgq */
rtgui_server_mq = rt_mq_create("rtgui",
256, 8, RT_IPC_FLAG_FIFO);
#endif
/* register rtgui server thread */
rtgui_thread_register(rtgui_server_tid, rtgui_server_mq);
/* init mouse and show */
rtgui_mouse_init();
#ifdef RTGUI_USING_MOUSE_CURSOR
rtgui_mouse_show_cursor();
#endif
while (1)
{
/* the buffer uses to receive event */
#ifdef RTGUI_USING_SMALL_SIZE
char event_buf[64];
#else
char event_buf[256];
#endif
struct rtgui_event* event = (struct rtgui_event*)&(event_buf[0]);
RT_ASSERT(object != RT_NULL);
RT_ASSERT(event != RT_NULL);
if (rtgui_thread_recv(event, sizeof(event_buf)) == RT_EOK)
{
/* dispatch event */
switch (event->type)
{
/* panel event */
case RTGUI_EVENT_PANEL_ATTACH:
/* register an application in panel */
rtgui_server_create_application((struct rtgui_event_panel_attach*)event);
break;
case RTGUI_EVENT_PANEL_DETACH:
/* unregister an application */
rtgui_server_destroy_application((struct rtgui_event_panel_detach*)event);
break;
case RTGUI_EVENT_PANEL_SHOW:
/* handle raise an application */
rtgui_server_thread_panel_show((struct rtgui_event_panel_show*)event);
break;
case RTGUI_EVENT_PANEL_HIDE:
/* handle hide an application */
rtgui_server_thread_panel_hide((struct rtgui_event_panel_hide*)event);
break;
case RTGUI_EVENT_SET_WM:
/* handle set workbench manager event */
rtgui_server_handle_set_wm((struct rtgui_event_set_wm*)event);
break;
/* window event */
case RTGUI_EVENT_WIN_CREATE:
rtgui_thread_ack(event, RTGUI_STATUS_OK);
rtgui_topwin_add((struct rtgui_event_win_create*)event);
if (rtgui_topwin_add((struct rtgui_event_win_create*)event) == RT_EOK)
rtgui_application_ack(event, RTGUI_STATUS_OK);
else
rtgui_application_ack(event, RTGUI_STATUS_ERROR);
break;
case RTGUI_EVENT_WIN_DESTROY:
if (last_monitor_topwin != RT_NULL &&
last_monitor_topwin->wid == ((struct rtgui_event_win*)event)->wid)
last_monitor_topwin = RT_NULL;
if (rtgui_topwin_remove(((struct rtgui_event_win*)event)->wid) == RT_EOK)
rtgui_thread_ack(event, RTGUI_STATUS_OK);
rtgui_application_ack(event, RTGUI_STATUS_OK);
else
rtgui_thread_ack(event, RTGUI_STATUS_ERROR);
rtgui_application_ack(event, RTGUI_STATUS_ERROR);
break;
case RTGUI_EVENT_WIN_SHOW:
rtgui_topwin_show((struct rtgui_event_win*)event);
if (rtgui_topwin_show((struct rtgui_event_win*)event) == RT_EOK)
rtgui_application_ack(event, RTGUI_STATUS_OK);
else
rtgui_application_ack(event, RTGUI_STATUS_ERROR);
break;
case RTGUI_EVENT_WIN_HIDE:
rtgui_topwin_hide((struct rtgui_event_win*)event);
if (rtgui_topwin_hide((struct rtgui_event_win*)event) == RT_EOK)
rtgui_application_ack(event, RTGUI_STATUS_OK);
else
rtgui_application_ack(event, RTGUI_STATUS_ERROR);
break;
case RTGUI_EVENT_WIN_MOVE:
rtgui_topwin_move((struct rtgui_event_win_move*)event);
if (rtgui_topwin_move((struct rtgui_event_win_move*)event) == RT_EOK)
rtgui_application_ack(event, RTGUI_STATUS_OK);
else
rtgui_application_ack(event, RTGUI_STATUS_ERROR);
break;
case RTGUI_EVENT_WIN_MODAL_ENTER:
if (rtgui_topwin_modal_enter((struct rtgui_event_win_modal_enter*)event) == RT_EOK)
rtgui_application_ack(event, RTGUI_STATUS_OK);
else
rtgui_application_ack(event, RTGUI_STATUS_ERROR);
break;
case RTGUI_EVENT_WIN_RESIZE:
......@@ -626,20 +292,65 @@ static void rtgui_server_entry(void* parameter)
case RTGUI_EVENT_COMMAND:
break;
}
}
}
/* unregister in rtgui thread */
// rtgui_thread_deregister(rt_thread_self());
return RT_TRUE;
}
/**
* rtgui server thread's entry
*/
static void rtgui_server_entry(void* parameter)
{
#ifdef _WIN32
/* set the server thread to highest */
HANDLE hCurrentThread = GetCurrentThread();
SetThreadPriority(hCurrentThread, THREAD_PRIORITY_HIGHEST);
#endif
/* register rtgui server thread */
rtgui_server_application = rtgui_application_create(rtgui_server_tid,
"rtgui");
if (rtgui_server_application == RT_NULL)
return;
rtgui_object_set_event_handler(RTGUI_OBJECT(rtgui_server_application),
rtgui_server_event_handler);
/* init mouse and show */
rtgui_mouse_init();
#ifdef RTGUI_USING_MOUSE_CURSOR
rtgui_mouse_show_cursor();
#endif
rtgui_application_run(rtgui_server_application);
rtgui_application_destroy(rtgui_server_application);
rtgui_server_application = RT_NULL;
}
void rtgui_server_post_event(struct rtgui_event* event, rt_size_t size)
{
rt_mq_send(rtgui_server_mq, event, size);
if (rtgui_server_tid != RT_NULL)
rtgui_application_send(rtgui_server_tid, event, size);
else
rt_kprintf("post when server is not running\n");
}
void rtgui_server_init()
rt_err_t rtgui_server_post_event_sync(struct rtgui_event* event, rt_size_t size)
{
if (rtgui_server_tid != RT_NULL)
return rtgui_application_send_sync(rtgui_server_tid, event, size);
else
{
rt_kprintf("post when server is not running\n");
return -RT_ENOSYS;
}
}
void rtgui_server_init(void)
{
if (rtgui_server_tid != RT_NULL)
return;
rtgui_server_tid = rt_thread_create("rtgui",
rtgui_server_entry, RT_NULL,
RTGUI_SVR_THREAD_STACK_SIZE,
......
此差异已折叠。
......@@ -15,7 +15,6 @@
#define __RTGUI_TOPWIN_H__
#include <rtgui/rtgui.h>
#include <rtgui/list.h>
#include <rtgui/region.h>
#include <rtgui/event.h>
#include <rtgui/widgets/title.h>
......@@ -25,25 +24,24 @@
rt_err_t rtgui_topwin_add(struct rtgui_event_win_create* event);
rt_err_t rtgui_topwin_remove(struct rtgui_win* wid);
/* raise window to front */
void rtgui_topwin_raise(struct rtgui_win* wid, rt_thread_t sender);
/* update clip info to a panel */
void rtgui_topwin_update_clip_to_panel(struct rtgui_panel* panel);
void rtgui_topwin_activate_win(struct rtgui_topwin* win);
/* show a window */
void rtgui_topwin_show(struct rtgui_event_win* event);
rt_err_t rtgui_topwin_show(struct rtgui_event_win* event);
/* hide a window */
void rtgui_topwin_hide(struct rtgui_event_win* event);
rt_err_t rtgui_topwin_hide(struct rtgui_event_win* event);
/* move a window */
void rtgui_topwin_move(struct rtgui_event_win_move* event);
rt_err_t rtgui_topwin_move(struct rtgui_event_win_move* event);
/* resize a window */
void rtgui_topwin_resize(struct rtgui_win* wid, rtgui_rect_t* r);
/* a window is entering modal mode */
rt_err_t rtgui_topwin_modal_enter(struct rtgui_event_win_modal_enter* event);
/* get window at (x, y) */
struct rtgui_topwin* rtgui_topwin_get_wnd(int x, int y);
struct rtgui_topwin* rtgui_topwin_get_wnd_no_modaled(int x, int y);
void rtgui_topwin_activate_win(struct rtgui_topwin* win);
void rtgui_topwin_deactivate_win(struct rtgui_topwin* win);
//void rtgui_topwin_deactivate_win(struct rtgui_topwin* win);
/* window title */
void rtgui_topwin_title_ondraw(struct rtgui_topwin* win);
......@@ -53,7 +51,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_do_clip(rtgui_widget_t* widget);
/* get the topwin that is currently focused */
struct rtgui_topwin* rtgui_topwin_get_focus(void);
#endif
......@@ -21,7 +21,7 @@ static void _rtgui_about_view_constructor(struct rtgui_about_view *view)
struct rtgui_rect rect = {0, 0, 200, 200};
/* set default widget rect and set event handler */
rtgui_widget_set_event_handler(RTGUI_WIDGET(view),rtgui_about_view_event_handler);
rtgui_object_set_event_handler(RTGUI_OBJECT(view),rtgui_about_view_event_handler);
rtgui_widget_set_rect(RTGUI_WIDGET(view), &rect);
RTGUI_WIDGET(view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
......@@ -33,7 +33,7 @@ static void _rtgui_about_view_constructor(struct rtgui_about_view *view)
}
DEFINE_CLASS_TYPE(aboutview, "aboutview",
RTGUI_VIEW_TYPE,
RTGUI_CONTAINER_TYPE,
_rtgui_about_view_constructor,
RT_NULL,
sizeof(struct rtgui_about_view));
......@@ -64,7 +64,7 @@ void rtgui_about_view_ondraw(struct rtgui_about_view* view)
rtgui_dc_end_drawing(dc);
}
rt_bool_t rtgui_about_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
rt_bool_t rtgui_about_view_event_handler(struct rtgui_object* widget, struct rtgui_event* event)
{
struct rtgui_about_view* view = RT_NULL;
......@@ -77,7 +77,7 @@ rt_bool_t rtgui_about_view_event_handler(struct rtgui_widget* widget, struct rtg
}
/* use view event handler */
return rtgui_view_event_handler(widget, event);
return rtgui_container_event_handler(widget, event);
}
rtgui_about_view_t* rtgui_about_view_create(rtgui_image_t *logo, const char* description)
......
......@@ -18,10 +18,10 @@
static void _rtgui_box_constructor(rtgui_box_t *box)
{
/* init widget and set event handler */
rtgui_widget_set_event_handler(RTGUI_WIDGET(box), rtgui_box_event_handler);
rtgui_object_set_event_handler(RTGUI_OBJECT(box), rtgui_box_event_handler);
RTGUI_WIDGET(box)->flag |= RTGUI_WIDGET_FLAG_TRANSPARENT;
rtgui_widget_set_event_handler(RTGUI_WIDGET(box), rtgui_box_event_handler);
rtgui_object_set_event_handler(RTGUI_OBJECT(box), rtgui_box_event_handler);
/* set proper of control */
box->orient = RTGUI_HORIZONTAL;
......@@ -34,7 +34,7 @@ DEFINE_CLASS_TYPE(box, "box",
RT_NULL,
sizeof(struct rtgui_box));
rt_bool_t rtgui_box_event_handler(rtgui_widget_t* widget, rtgui_event_t* event)
rt_bool_t rtgui_box_event_handler(struct rtgui_object *widget, rtgui_event_t *event)
{
struct rtgui_box* box = (struct rtgui_box*)widget;
......@@ -48,7 +48,7 @@ rt_bool_t rtgui_box_event_handler(rtgui_widget_t* widget, rtgui_event_t* event)
break;
default:
return rtgui_container_event_handler(RTGUI_WIDGET(box), event);
return rtgui_container_event_handler(RTGUI_OBJECT(box), event);
}
return RT_FALSE;
......@@ -166,7 +166,8 @@ static void rtgui_box_layout_vertical(rtgui_box_t* box)
size_event.y = rect->y1;
size_event.w = rect->x2 - rect->x1;
size_event.h = rect->y2 - rect->y1;
widget->event_handler(widget, &size_event.parent);
RTGUI_OBJECT(widget)->event_handler(RTGUI_OBJECT(widget),
&size_event.parent);
/* point to next height */
next_y = rect->y2;
......@@ -258,7 +259,8 @@ static void rtgui_box_layout_horizontal(rtgui_box_t* box)
size_event.y = rect->y1;
size_event.w = rect->x2 - rect->x1;
size_event.h = rect->y2 - rect->y1;
widget->event_handler(widget, &size_event.parent);
RTGUI_OBJECT(widget)->event_handler(RTGUI_OBJECT(widget),
&size_event.parent);
/* point to next width */
next_x = rect->x2;
......
......@@ -14,13 +14,13 @@
#include <rtgui/dc.h>
#include <rtgui/rtgui_theme.h>
#include <rtgui/widgets/button.h>
#include <rtgui/widgets/toplevel.h>
#include <rtgui/widgets/window.h>
static void _rtgui_button_constructor(rtgui_button_t *button)
{
/* init widget and set event handler */
RTGUI_WIDGET(button)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
rtgui_widget_set_event_handler(RTGUI_WIDGET(button), rtgui_button_event_handler);
rtgui_object_set_event_handler(RTGUI_OBJECT(button), rtgui_button_event_handler);
/* un-press button */
button->flag = 0;
......@@ -57,13 +57,16 @@ DEFINE_CLASS_TYPE(button, "button",
_rtgui_button_destructor,
sizeof(struct rtgui_button));
rt_bool_t rtgui_button_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
rt_bool_t rtgui_button_event_handler(struct rtgui_object* object, struct rtgui_event* event)
{
struct rtgui_button* btn;
struct rtgui_widget *widget;
struct rtgui_button *btn;
RT_ASSERT(widget != RT_NULL);
RT_ASSERT(event != RT_NULL);
btn = (struct rtgui_button*) widget;
widget = RTGUI_WIDGET(object);
btn = RTGUI_BUTTON(widget);
switch (event->type)
{
case RTGUI_EVENT_PAINT:
......@@ -150,10 +153,10 @@ rt_bool_t rtgui_button_event_handler(struct rtgui_widget* widget, struct rtgui_e
if (emouse->button & RTGUI_MOUSE_BUTTON_LEFT)
{
/* set the last mouse event handled widget */
rtgui_toplevel_t* toplevel;
struct rtgui_win* win;
toplevel = RTGUI_TOPLEVEL(RTGUI_WIDGET(btn)->toplevel);
toplevel->last_mevent_widget = RTGUI_WIDGET(btn);
win = RTGUI_WIN(RTGUI_WIDGET(btn)->toplevel);
win->last_mevent_widget = RTGUI_WIDGET(btn);
/* it's a normal button */
if (emouse->button & RTGUI_MOUSE_BUTTON_DOWN)
......
......@@ -6,7 +6,7 @@ static void _rtgui_checkbox_constructor(rtgui_checkbox_t *box)
{
/* init widget and set event handler */
RTGUI_WIDGET(box)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
rtgui_widget_set_event_handler(RTGUI_WIDGET(box), rtgui_checkbox_event_handler);
rtgui_object_set_event_handler(RTGUI_OBJECT(box), rtgui_checkbox_event_handler);
/* set status */
box->status_down = RTGUI_CHECKBOX_STATUS_UNCHECKED;
......@@ -29,9 +29,16 @@ void rtgui_checkbox_set_onbutton(rtgui_checkbox_t* checkbox, rtgui_onbutton_func
checkbox->on_button = func;
}
rt_bool_t rtgui_checkbox_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
rt_bool_t rtgui_checkbox_event_handler(struct rtgui_object* object, struct rtgui_event* event)
{
struct rtgui_checkbox* box = (struct rtgui_checkbox*)widget;
struct rtgui_widget *widget;
struct rtgui_checkbox *box = (struct rtgui_checkbox*)widget;
RT_ASSERT(widget != RT_NULL);
RT_ASSERT(event != RT_NULL);
widget = RTGUI_WIDGET(object);
box = RTGUI_CHECKBOX(object);
switch (event->type)
{
......
......@@ -2,7 +2,7 @@
#include <rtgui/rtgui_theme.h>
#include <rtgui/widgets/combobox.h>
static rt_bool_t rtgui_combobox_pulldown_hide(struct rtgui_widget* widget, struct rtgui_event* event);
static rt_bool_t rtgui_combobox_pulldown_hide(struct rtgui_object* object, struct rtgui_event* event);
const static rt_uint8_t down_arrow[] = {0xff, 0x7e, 0x3c, 0x18};
static void _rtgui_combobox_constructor(rtgui_combobox_t *box)
......@@ -10,7 +10,7 @@ static void _rtgui_combobox_constructor(rtgui_combobox_t *box)
rtgui_rect_t rect = {0, 0, RTGUI_COMBOBOX_WIDTH, RTGUI_COMBOBOX_HEIGHT};
/* init widget and set event handler */
rtgui_widget_set_event_handler(RTGUI_WIDGET(box), rtgui_combobox_event_handler);
rtgui_object_set_event_handler(RTGUI_OBJECT(box), rtgui_combobox_event_handler);
rtgui_widget_set_rect(RTGUI_WIDGET(box), &rect);
RTGUI_WIDGET_TEXTALIGN(RTGUI_WIDGET(box)) = RTGUI_ALIGN_CENTER_VERTICAL;
......@@ -30,29 +30,34 @@ static void _rtgui_combobox_destructor(rtgui_combobox_t *box)
box->pd_win = RT_NULL;
}
void rtgui_combobox_pdwin_onitem(struct rtgui_widget* widget, struct rtgui_event* event)
rt_bool_t rtgui_combobox_pdwin_onitem(struct rtgui_object* object, struct rtgui_event* event)
{
struct rtgui_widget *widget;
rtgui_win_t* pd_win;
rtgui_combobox_t* combo;
rtgui_listbox_t* list;
RT_ASSERT(object != RT_NULL);
RT_ASSERT(event != RT_NULL);
widget = RTGUI_WIDGET(object);
list = RTGUI_LISTBOX(widget);
pd_win = RTGUI_WIN(rtgui_widget_get_toplevel(widget));
combo = RTGUI_COMBOBOX(pd_win->user_data);
combo->current_item = list->current_item;
if (combo->on_selected != RT_NULL)
combo->on_selected(RTGUI_WIDGET(combo), RT_NULL);
combo->on_selected(RTGUI_OBJECT(combo), RT_NULL);
rtgui_win_hiden(pd_win);
rtgui_widget_update(RTGUI_WIDGET(combo));
return ;
return RT_FALSE;
}
rt_bool_t rtgui_combobox_pdwin_ondeactive(struct rtgui_widget* widget, struct rtgui_event* event)
rt_bool_t rtgui_combobox_pdwin_ondeactive(struct rtgui_object* object, struct rtgui_event* event)
{
rtgui_win_hiden(RTGUI_WIN(widget));
rtgui_win_hiden(RTGUI_WIN(object));
return RT_TRUE;
}
......@@ -186,9 +191,14 @@ static rt_bool_t rtgui_combobox_onmouse_button(struct rtgui_combobox* box, struc
return RT_FALSE;
}
rt_bool_t rtgui_combobox_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
rt_bool_t rtgui_combobox_event_handler(struct rtgui_object* object, struct rtgui_event* event)
{
struct rtgui_combobox* box = (struct rtgui_combobox*)widget;
struct rtgui_combobox *box;
RT_ASSERT(object != RT_NULL);
RT_ASSERT(event != RT_NULL);
box = RTGUI_COMBOBOX(object);
switch (event->type)
{
......@@ -224,9 +234,16 @@ rt_bool_t rtgui_combobox_event_handler(struct rtgui_widget* widget, struct rtgui
return RT_FALSE;
}
static rt_bool_t rtgui_combobox_pulldown_hide(struct rtgui_widget* widget, struct rtgui_event* event)
static rt_bool_t rtgui_combobox_pulldown_hide(struct rtgui_object* object, struct rtgui_event* event)
{
struct rtgui_combobox* box;
struct rtgui_widget *widget;
struct rtgui_combobox *box;
RT_ASSERT(object != RT_NULL);
RT_ASSERT(event != RT_NULL);
widget = RTGUI_WIDGET(object);
box = RTGUI_COMBOBOX(object);
if (widget == RT_NULL) return RT_TRUE;
......@@ -253,7 +270,7 @@ struct rtgui_listbox_item* rtgui_combox_get_select(struct rtgui_combobox* box)
return RT_NULL;
}
void rtgui_combobox_set_onselected(struct rtgui_combobox* box, rtgui_onitem_func_t func)
void rtgui_combobox_set_onselected(struct rtgui_combobox* box, rtgui_event_handler_ptr func)
{
box->on_selected = func;
}
......@@ -10,37 +10,55 @@
* Change Logs:
* Date Author Notes
* 2009-10-16 Bernard first version
* 2010-09-24 Bernard fix container destroy issue
*/
#include <rtgui/widgets/toplevel.h>
#include <rtgui/dc.h>
#include <rtgui/rtgui_system.h>
#include <rtgui/rtgui_application.h>
#include <rtgui/widgets/container.h>
#include <rtgui/widgets/window.h>
static void _rtgui_container_constructor(rtgui_container_t *container)
{
/* set event handler and init field */
rtgui_widget_set_event_handler(RTGUI_WIDGET(container), rtgui_container_event_handler);
/* init container */
rtgui_object_set_event_handler(RTGUI_OBJECT(container),
rtgui_container_event_handler);
rtgui_list_init(&(container->children));
/* set focused widget to itself */
container->focused = RTGUI_WIDGET(container);
/* set container as focusable widget */
RTGUI_WIDGET(container)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
/* container is used to 'contain'(show) widgets and dispatch events to
* them, not interact with user. So no need to grab focus. If we did it,
* some widget inherited from container(e.g. notebook) will grab the focus
* annoyingly.
*
* For example, a focusable notebook N has a widget W. When the user press
* W, N will gain the focus and W will lose it at first. Then N will set
* focus to W because it is W that eventually interact with people. N will
* yield focus and W will gain the focus again. This loop will make W
* repaint twice every time user press it.
*
* Just eliminate it.
*/
RTGUI_WIDGET(container)->flag &= ~RTGUI_WIDGET_FLAG_FOCUSABLE;
}
static void _rtgui_container_destructor(rtgui_container_t *container)
{
/* destroy children of container */
rtgui_container_destroy_children(container);
}
static void _rtgui_container_update_toplevel(rtgui_container_t* container)
{
struct rtgui_win *window;
struct rtgui_list_node* node;
window = rtgui_widget_get_toplevel(RTGUI_WIDGET(container));
rtgui_list_foreach(node, &(container->children))
{
rtgui_widget_t* child = rtgui_list_entry(node, rtgui_widget_t, sibling);
/* set child toplevel */
child->toplevel = rtgui_widget_get_toplevel(RTGUI_WIDGET(container));
child->toplevel = window;
if (RTGUI_IS_CONTAINER(child))
{
......@@ -65,7 +83,8 @@ rt_bool_t rtgui_container_dispatch_event(rtgui_container_t *container, rtgui_eve
struct rtgui_widget* w;
w = rtgui_list_entry(node, struct rtgui_widget, sibling);
if (w->event_handler(w, event) == RT_TRUE) return RT_TRUE;
if (RTGUI_OBJECT(w)->event_handler(RTGUI_OBJECT(w), event) == RT_TRUE)
return RT_TRUE;
}
return RT_FALSE;
......@@ -75,64 +94,106 @@ rt_bool_t rtgui_container_dispatch_mouse_event(rtgui_container_t *container, str
{
/* handle in child widget */
struct rtgui_list_node* node;
rtgui_widget_t *focus;
struct rtgui_widget *old_focus;
old_focus = RTGUI_WIDGET(container)->toplevel->focused_widget;
/* get focus widget on toplevel */
focus = RTGUI_CONTAINER(RTGUI_WIDGET(container)->toplevel)->focused;
rtgui_list_foreach(node, &(container->children))
{
struct rtgui_widget* w;
w = rtgui_list_entry(node, struct rtgui_widget, sibling);
if (rtgui_rect_contains_point(&(w->extent), event->x, event->y) == RT_EOK)
if (rtgui_rect_contains_point(&(w->extent),
event->x, event->y) == RT_EOK)
{
if ((focus != w) && RTGUI_WIDGET_IS_FOCUSABLE(w))
if ((old_focus != w) && RTGUI_WIDGET_IS_FOCUSABLE(w))
rtgui_widget_focus(w);
if (w->event_handler(w, (rtgui_event_t*)event) == RT_TRUE) return RT_TRUE;
if (RTGUI_OBJECT(w)->event_handler(RTGUI_OBJECT(w),
(rtgui_event_t*)event) == RT_TRUE)
return RT_TRUE;
}
}
return RT_FALSE;
}
rt_bool_t rtgui_container_event_handler(rtgui_widget_t* widget, rtgui_event_t* event)
rt_bool_t rtgui_container_event_handler(struct rtgui_object* object, struct rtgui_event* event)
{
rtgui_container_t *container = RTGUI_CONTAINER(widget);
struct rtgui_container *container;
struct rtgui_widget *widget;
RT_ASSERT(object != RT_NULL);
RT_ASSERT(event != RT_NULL);
container = RTGUI_CONTAINER(object);
widget = RTGUI_WIDGET(object);
switch (event->type)
{
case RTGUI_EVENT_PAINT:
case RTGUI_EVENT_COMMAND:
case RTGUI_EVENT_RESIZE:
{
struct rtgui_dc* dc;
struct rtgui_rect rect;
dc = rtgui_dc_begin_drawing(widget);
if (dc == RT_NULL)
return RT_FALSE;
rtgui_widget_get_rect(widget, &rect);
/* fill container with background */
rtgui_dc_fill_rect(dc, &rect);
/* paint on each child */
rtgui_container_dispatch_event(container, event);
rtgui_dc_end_drawing(dc);
}
break;
case RTGUI_EVENT_KBD:
{
/* let parent to handle keyboard event */
if (widget->parent != RT_NULL && widget->parent != widget->toplevel)
if (widget->parent != RT_NULL &&
widget->parent != RTGUI_WIDGET(widget->toplevel))
{
return widget->parent->event_handler(widget->parent, event);
}
return RTGUI_OBJECT(widget->parent)->event_handler(
RTGUI_OBJECT(widget->parent),
event);
}
break;
case RTGUI_EVENT_MOUSE_BUTTON:
case RTGUI_EVENT_MOUSE_MOTION:
/* handle in child widget */
return rtgui_container_dispatch_mouse_event(container,
(struct rtgui_event_mouse*)event);
case RTGUI_EVENT_MOUSE_MOTION:
return rtgui_container_dispatch_mouse_event(container,
(struct rtgui_event_mouse*)event);
case RTGUI_EVENT_COMMAND:
case RTGUI_EVENT_RESIZE:
rtgui_container_dispatch_event(container, event);
break;
default:
/* call parent widget event handler */
return rtgui_widget_event_handler(widget, event);
return rtgui_widget_event_handler(RTGUI_OBJECT(widget), event);
}
return RT_FALSE;
}
rtgui_container_t* rtgui_container_create(void)
{
struct rtgui_container* container;
/* allocate container */
container = (struct rtgui_container*) rtgui_widget_create (RTGUI_CONTAINER_TYPE);
return container;
}
void rtgui_container_destroy(rtgui_container_t* container)
{
rtgui_container_hide(container);
rtgui_widget_destroy(RTGUI_WIDGET(container));
}
/*
* This function will add a child to a container widget
* Note: this function will not change the widget layout
......@@ -168,13 +229,7 @@ void rtgui_container_remove_child(rtgui_container_t *container, rtgui_widget_t*
RT_ASSERT(container != RT_NULL);
RT_ASSERT(child != RT_NULL);
if (child == container->focused)
{
/* set focused to itself */
container->focused = RTGUI_WIDGET(container);
rtgui_widget_focus(RTGUI_WIDGET(container));
}
rtgui_widget_unfocus(child);
/* remove widget from parent's children list */
rtgui_list_remove(&(container->children), &(child->sibling));
......@@ -218,9 +273,6 @@ void rtgui_container_destroy_children(rtgui_container_t *container)
}
container->children.next = RT_NULL;
container->focused = RTGUI_WIDGET(container);
if (RTGUI_WIDGET(container)->parent != RT_NULL)
rtgui_widget_focus(RTGUI_WIDGET(container));
/* update widget clip */
rtgui_toplevel_update_clip(RTGUI_TOPLEVEL(RTGUI_WIDGET(container)->toplevel));
......@@ -237,3 +289,26 @@ rtgui_widget_t* rtgui_container_get_first_child(rtgui_container_t* container)
return child;
}
#ifndef RTGUI_USING_SMALL_SIZE
void rtgui_container_set_box(rtgui_container_t* container, struct rtgui_box* box)
{
if (container == RT_NULL || box == RT_NULL)
return;
rtgui_container_add_child(RTGUI_CONTAINER(container), RTGUI_WIDGET(box));
rtgui_widget_set_rect(RTGUI_WIDGET(box), &(RTGUI_WIDGET(container)->extent));
}
#endif
void rtgui_container_hide(rtgui_container_t* container)
{
if (container == RT_NULL) return;
if (RTGUI_WIDGET(container)->parent == RT_NULL)
{
RTGUI_WIDGET_HIDE(RTGUI_WIDGET(container));
return;
}
}
......@@ -15,11 +15,11 @@
#include <rtgui/rtgui_object.h>
#include <rtgui/rtgui_system.h>
#include <rtgui/rtgui_theme.h>
#include <rtgui/rtgui_application.h>
#include <rtgui/list.h>
#include <rtgui/image.h>
#include <rtgui/widgets/view.h>
#include <rtgui/widgets/workbench.h>
#include <rtgui/widgets/container.h>
#include <rtgui/widgets/filelist_view.h>
#include <rtgui/widgets/listbox.h>
#include <rtgui/widgets/window.h>
......@@ -224,9 +224,9 @@ static rtgui_image_t *file_image, *folder_image;
static struct rtgui_listbox_item items[] =
{
#ifdef RTGUI_USING_FONTHZ
{"打开文件夹", RT_NULL},
{"选择文件夹", RT_NULL},
{"退出", RT_NULL}
{"ː`", RT_NULL},
{"v`", RT_NULL},
{"X", RT_NULL}
#else
{"Open folder", RT_NULL},
{"Select folder", RT_NULL},
......@@ -266,10 +266,6 @@ static void rtgui_filelist_view_on_folder_item(rtgui_widget_t* widget, struct rt
case 1:
/* destroy menu window */
rtgui_win_destroy(menu);
if (RTGUI_VIEW(view)->modal_show == RT_TRUE)
{
rtgui_view_end_modal(RTGUI_VIEW(view), RTGUI_MODAL_OK);
}
break;
default:
......@@ -323,7 +319,7 @@ static void _rtgui_filelist_view_constructor(struct rtgui_filelist_view *view)
struct rtgui_rect rect = {0, 0, 200, 200};
/* set default widget rect and set event handler */
rtgui_widget_set_event_handler(RTGUI_WIDGET(view), rtgui_filelist_view_event_handler);
rtgui_object_set_event_handler(RTGUI_WIDGET(view), rtgui_filelist_view_event_handler);
rtgui_widget_set_rect(RTGUI_WIDGET(view), &rect);
RTGUI_WIDGET(view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
......@@ -357,7 +353,7 @@ static void _rtgui_filelist_view_destructor(struct rtgui_filelist_view *view)
}
DEFINE_CLASS_TYPE(filelist, "filelist",
RTGUI_VIEW_TYPE,
RTGUI_CONTAINER_TYPE,
_rtgui_filelist_view_constructor,
_rtgui_filelist_view_destructor,
sizeof(struct rtgui_filelist_view));
......@@ -404,7 +400,6 @@ void rtgui_filelist_view_ondraw(struct rtgui_filelist_view* view)
}
/* draw item */
if (item->type == RTGUI_FITEM_FILE)
rtgui_image_blit(file_image, dc, &image_rect);
else
......@@ -519,19 +514,13 @@ static void rtgui_filelist_view_onenturn(struct rtgui_filelist_view* view)
}
else if (view->current_item == 0 &&
#ifdef _WIN32
(view->current_directory[1] == ':') && (view->current_directory[2] == '\\'))
(view->current_directory[1] == ':') && (view->current_directory[2] == '\\')
#else
(view->current_directory[0] == '/') && (view->current_directory[1] == '\0'))
(view->current_directory[0] == '/') && (view->current_directory[1] == '\0')
#endif
{
if (RTGUI_VIEW(view)->modal_show == RT_TRUE)
{
rtgui_view_end_modal(RTGUI_VIEW(view), RTGUI_MODAL_CANCEL);
}
else
)
{
rtgui_filelist_view_destroy(view);
}
return ;
}
......@@ -542,13 +531,6 @@ static void rtgui_filelist_view_onenturn(struct rtgui_filelist_view* view)
}
rtgui_filelist_view_set_directory(view, new_path);
}
else
{
if (RTGUI_VIEW(view)->modal_show == RT_TRUE)
{
rtgui_view_end_modal(RTGUI_VIEW(view), RTGUI_MODAL_OK);
}
}
}
rt_bool_t rtgui_filelist_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
......@@ -668,11 +650,12 @@ rt_bool_t rtgui_filelist_view_event_handler(struct rtgui_widget* widget, struct
}
/* use view event handler */
return rtgui_view_event_handler(widget, event);
return rtgui_container_event_handler(widget, event);
}
rtgui_filelist_view_t* rtgui_filelist_view_create(rtgui_workbench_t* workbench,
const char* directory, const char* pattern, const rtgui_rect_t* rect)
rtgui_filelist_view_t* rtgui_filelist_view_create(const char* directory,
const char* pattern,
const rtgui_rect_t* rect)
{
struct rtgui_filelist_view* view = RT_NULL;
......@@ -684,8 +667,6 @@ rtgui_filelist_view_t* rtgui_filelist_view_create(rtgui_workbench_t* workbench,
view->pattern = rt_strdup(pattern);
view->page_items = rtgui_rect_height(*rect) / (1 + rtgui_theme_get_selected_height());
rtgui_filelist_view_set_directory(view, directory);
rtgui_workbench_add_view(workbench, RTGUI_VIEW(view));
}
return view;
......@@ -778,7 +759,7 @@ void rtgui_filelist_view_set_directory(rtgui_filelist_view_t* view, const char*
item = &(view->items[0]);
/* add .. directory */
item->name = rt_strdup("退出文件浏览");
item->name = rt_strdup("X̐`㚔M");
item->type = RTGUI_FITEM_DIR;
item->size = 0;
......
......@@ -19,7 +19,7 @@ static void _rtgui_iconbox_constructor(rtgui_iconbox_t *iconbox)
{
/* init widget and set event handler */
RTGUI_WIDGET(iconbox)->flag |= RTGUI_WIDGET_FLAG_TRANSPARENT;
rtgui_widget_set_event_handler(RTGUI_WIDGET(iconbox), rtgui_iconbox_event_handler);
rtgui_object_set_event_handler(RTGUI_OBJECT(iconbox), rtgui_iconbox_event_handler);
/* set proper of control */
iconbox->image = RT_NULL;
......@@ -46,9 +46,14 @@ DEFINE_CLASS_TYPE(iconbox, "iconbox",
_rtgui_iconbox_destructor,
sizeof(struct rtgui_iconbox));
rt_bool_t rtgui_iconbox_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
rt_bool_t rtgui_iconbox_event_handler(struct rtgui_object* object, struct rtgui_event* event)
{
struct rtgui_iconbox* iconbox = (struct rtgui_iconbox*)widget;
struct rtgui_iconbox* iconbox;
RT_ASSERT(object != RT_NULL);
RT_ASSERT(event != RT_NULL);
iconbox = RTGUI_ICONBOX(object);
switch (event->type)
{
......
......@@ -19,7 +19,7 @@
static void _rtgui_label_constructor(rtgui_label_t *label)
{
/* init widget and set event handler */
rtgui_widget_set_event_handler(RTGUI_WIDGET(label), rtgui_label_event_handler);
rtgui_object_set_event_handler(RTGUI_OBJECT(label), rtgui_label_event_handler);
/* set field */
label->text = RT_NULL;
......@@ -38,13 +38,12 @@ DEFINE_CLASS_TYPE(label, "label",
_rtgui_label_destructor,
sizeof(struct rtgui_label));
rt_bool_t rtgui_label_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
rt_bool_t rtgui_label_event_handler(struct rtgui_object *object, struct rtgui_event* event)
{
struct rtgui_label* label;
RT_ASSERT(widget != RT_NULL);
struct rtgui_label *label;
RTGUI_WIDGET_EVENT_HANDLER_PREPARE
label = (struct rtgui_label*) widget;
label = RTGUI_LABEL(object);
switch (event->type)
{
case RTGUI_EVENT_PAINT:
......
......@@ -23,7 +23,7 @@ static void _rtgui_list_view_constructor(struct rtgui_list_view *view)
struct rtgui_rect rect = {0, 0, 200, 200};
/* set default widget rect and set event handler */
rtgui_widget_set_event_handler(RTGUI_WIDGET(view),rtgui_list_view_event_handler);
rtgui_object_set_event_handler(RTGUI_OBJECT(view),rtgui_list_view_event_handler);
rtgui_widget_set_rect(RTGUI_WIDGET(view), &rect);
RTGUI_WIDGET(view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
......@@ -38,7 +38,7 @@ static void _rtgui_list_view_constructor(struct rtgui_list_view *view)
}
DEFINE_CLASS_TYPE(listview, "listview",
RTGUI_VIEW_TYPE,
RTGUI_CONTAINER_TYPE,
_rtgui_list_view_constructor,
RT_NULL,
sizeof(struct rtgui_list_view));
......@@ -96,7 +96,7 @@ static void rtgui_list_view_onicondraw(struct rtgui_list_view* view, struct rtgu
}
}
static void rtgui_list_view_update_icon(struct rtgui_list_view* view, rt_int16_t old_item)
static void rtgui_list_view_update_icon(struct rtgui_list_view* view, rt_uint16_t old_item)
{
struct rtgui_rect rect, item_rect, drawing_rect;
rt_ubase_t c, r; /* col and row index */
......@@ -230,7 +230,7 @@ static void rtgui_list_view_onlistdraw(struct rtgui_list_view* view, struct rtgu
}
}
void rtgui_list_view_update_list(struct rtgui_list_view* view, rt_int16_t old_item)
void rtgui_list_view_update_list(struct rtgui_list_view* view, rt_uint16_t old_item)
{
struct rtgui_dc* dc;
const struct rtgui_list_item* item;
......@@ -419,7 +419,7 @@ static rt_bool_t rtgui_list_view_onmouse(struct rtgui_list_view* view, struct rt
return RT_FALSE;
}
rt_bool_t rtgui_list_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
rt_bool_t rtgui_list_view_event_handler(struct rtgui_object* widget, struct rtgui_event* event)
{
struct rtgui_list_view* view = RT_NULL;
......@@ -562,7 +562,7 @@ rt_bool_t rtgui_list_view_event_handler(struct rtgui_widget* widget, struct rtgu
}
/* use view event handler */
return rtgui_view_event_handler(widget, event);
return rtgui_container_event_handler(widget, event);
}
static void rtgui_list_view_calc(struct rtgui_list_view* view)
......
......@@ -20,7 +20,7 @@
static void _rtgui_listbox_constructor(struct rtgui_listbox *box)
{
/* set default widget rect and set event handler */
rtgui_widget_set_event_handler(RTGUI_WIDGET(box),rtgui_listbox_event_handler);
rtgui_object_set_event_handler(RTGUI_OBJECT(box), rtgui_listbox_event_handler);
RTGUI_WIDGET(box)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
......@@ -172,11 +172,12 @@ static void rtgui_listbox_update_current(struct rtgui_listbox* box, rt_int16_t o
rtgui_dc_end_drawing(dc);
}
rt_bool_t rtgui_listbox_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
rt_bool_t rtgui_listbox_event_handler(struct rtgui_object* object, struct rtgui_event* event)
{
struct rtgui_listbox* box = RT_NULL;
struct rtgui_listbox* box;
RTGUI_WIDGET_EVENT_HANDLER_PREPARE
box = RTGUI_LISTBOX(widget);
box = RTGUI_LISTBOX(object);
switch (event->type)
{
case RTGUI_EVENT_PAINT:
......@@ -250,7 +251,7 @@ rt_bool_t rtgui_listbox_event_handler(struct rtgui_widget* widget, struct rtgui_
/* up event */
if (box->on_item != RT_NULL)
{
box->on_item(RTGUI_WIDGET(box), RT_NULL);
box->on_item(RTGUI_OBJECT(box), RT_NULL);
}
}
}
......@@ -309,7 +310,7 @@ rt_bool_t rtgui_listbox_event_handler(struct rtgui_widget* widget, struct rtgui_
case RTGUIK_RETURN:
if (box->on_item != RT_NULL)
{
box->on_item(RTGUI_WIDGET(box), RT_NULL);
box->on_item(RTGUI_OBJECT(box), RT_NULL);
}
return RT_FALSE;
......@@ -322,7 +323,7 @@ rt_bool_t rtgui_listbox_event_handler(struct rtgui_widget* widget, struct rtgui_
}
/* use box event handler */
return rtgui_widget_event_handler(widget, event);
return rtgui_widget_event_handler(RTGUI_OBJECT(widget), event);
}
rtgui_listbox_t* rtgui_listbox_create(const struct rtgui_listbox_item* items, rt_uint16_t count, rtgui_rect_t *rect)
......@@ -349,7 +350,7 @@ void rtgui_listbox_destroy(rtgui_listbox_t* box)
rtgui_widget_destroy(RTGUI_WIDGET(box));
}
void rtgui_listbox_set_onitem(rtgui_listbox_t* box, rtgui_onitem_func_t func)
void rtgui_listbox_set_onitem(rtgui_listbox_t* box, rtgui_event_handler_ptr func)
{
RT_ASSERT(box != RT_NULL);
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
......@@ -8,7 +8,7 @@ static void _rtgui_progressbar_constructor(rtgui_progressbar_t *bar)
{
rtgui_rect_t rect = {0, 0, DEFAULT_WIDTH, DEFAULT_HEIGHT};
rtgui_widget_set_event_handler(RTGUI_WIDGET(bar), rtgui_progressbar_event_handler);
rtgui_object_set_event_handler(RTGUI_OBJECT(bar), rtgui_progressbar_event_handler);
rtgui_widget_set_rect(RTGUI_WIDGET(bar), &rect);
bar->orient = RTGUI_HORIZONTAL;
......@@ -25,10 +25,13 @@ DEFINE_CLASS_TYPE(progressbar, "progressbar",
RT_NULL,
sizeof(struct rtgui_progressbar));
rt_bool_t rtgui_progressbar_event_handler(struct rtgui_widget* widget,
rt_bool_t rtgui_progressbar_event_handler(struct rtgui_object* object,
struct rtgui_event* event)
{
struct rtgui_progressbar* bar = (struct rtgui_progressbar*)widget;
struct rtgui_progressbar* bar;
RTGUI_WIDGET_EVENT_HANDLER_PREPARE
bar = RTGUI_PROGRESSBAR(object);
switch (event->type)
{
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册