demo_workbench.c 2.6 KB
Newer Older
B
bernard.xiong 已提交
1 2 3 4 5 6
#include <rtgui/rtgui.h>
#include <rtgui/rtgui_system.h>

#include <rtgui/widgets/view.h>
#include <rtgui/widgets/workbench.h>

B
bernard.xiong 已提交
7
static rt_bool_t demo_workbench_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
B
bernard.xiong 已提交
8
{
B
bernard.xiong 已提交
9 10
	/* 我们目前只对按键事件感兴趣 */
	if (event->type == RTGUI_EVENT_KBD)
B
bernard.xiong 已提交
11
	{
B
bernard.xiong 已提交
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
		struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event;

		if (ekbd->type == RTGUI_KEYDOWN)
		{
			if (ekbd->key == RTGUIK_RIGHT)
			{
				demo_view_next(RT_NULL, RT_NULL);
				return RT_TRUE;
			}
			else if (ekbd->key == RTGUIK_LEFT)
			{
				demo_view_prev(RT_NULL, RT_NULL);
				return RT_TRUE;
			}
		}
B
bernard.xiong 已提交
27 28 29
	}

	/* 如果不是绘制事件,使用view原来的事件处理函数处理 */
B
bernard.xiong 已提交
30
	return rtgui_workbench_event_handler(widget, event);
B
bernard.xiong 已提交
31 32 33 34 35 36 37 38 39
}

static void workbench_entry(void* parameter)
{
	rt_mq_t mq;
	struct rtgui_view* view;
	struct rtgui_workbench* workbench;

	/* 创建GUI应用需要的消息队列 */
B
bernard.xiong 已提交
40 41 42 43 44
#ifdef RTGUI_USING_SMALL_SIZE
	mq = rt_mq_create("workbench", 64, 8, RT_IPC_FLAG_FIFO);
#else
	mq = rt_mq_create("workbench", 256, 8, RT_IPC_FLAG_FIFO);
#endif
B
bernard.xiong 已提交
45 46 47 48 49 50 51
	/* 注册当前线程为GUI线程 */
	rtgui_thread_register(rt_thread_self(), mq);

	/* 创建一个工作台 */
	workbench = rtgui_workbench_create("main", "workbench");
	if (workbench == RT_NULL) return;

B
bernard.xiong 已提交
52
	rtgui_widget_set_event_handler(RTGUI_WIDGET(workbench), demo_workbench_event_handler);
B
bernard.xiong 已提交
53

B
bernard.xiong 已提交
54
	/* 初始化各个例子的视图 */
B
bernard.xiong 已提交
55
	demo_view_dc(workbench);
B
bernard.xiong 已提交
56
	demo_view_animation(workbench);
B
bernard.xiong 已提交
57
	demo_view_window(workbench);
B
bernard.xiong 已提交
58 59 60 61 62
	demo_view_label(workbench);
	demo_view_button(workbench);
	demo_view_checkbox(workbench);
	demo_view_progressbar(workbench);
	demo_view_radiobox(workbench);
B
bernard.xiong 已提交
63
	demo_view_textbox(workbench);
B
bernard.xiong 已提交
64
	demo_view_slider(workbench);
B
bernard.xiong 已提交
65 66
	demo_view_mywidget(workbench);
	demo_view_image(workbench);
B
bernard.xiong 已提交
67
	demo_listview_view(workbench);
B
bernard.xiong 已提交
68
	demo_fn_view(workbench);
B
bernard.xiong 已提交
69 70 71

	/* 显示视图 */
	demo_view_show();
B
bernard.xiong 已提交
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107

	/* 执行工作台事件循环 */
	rtgui_workbench_event_loop(workbench);

	/* 去注册GUI线程 */
	rtgui_thread_deregister(rt_thread_self());
	rt_mq_delete(mq);
}

void workbench_init()
{
	static rt_bool_t inited = RT_FALSE;

	if (inited == RT_FALSE) /* 避免重复初始化而做的保护 */
	{
		rt_thread_t tid;

		tid = rt_thread_create("wb",
			workbench_entry, RT_NULL,
			2048, 25, 10);

		if (tid != RT_NULL) rt_thread_startup(tid);

		inited = RT_TRUE;
	}
}

#ifdef RT_USING_RTGUI
#include <finsh.h>
void workbench()
{
	workbench_init();
}
/* finsh的命令输出,可以直接执行workbench()函数以执行上面的函数 */
FINSH_FUNCTION_EXPORT(workbench, workbench demo)
#endif