diff options
Diffstat (limited to 'components/rtgui_win/include/rtgui')
46 files changed, 4237 insertions, 0 deletions
diff --git a/components/rtgui_win/include/rtgui/blit.h b/components/rtgui_win/include/rtgui/blit.h new file mode 100644 index 0000000000..615e5b6d7e --- /dev/null +++ b/components/rtgui_win/include/rtgui/blit.h @@ -0,0 +1,9 @@ +#ifndef __RTGUI_BLIT_H__
+#define __RTGUI_BLIT_H__
+
+#include <rtgui/rtgui.h>
+
+typedef void (*rtgui_blit_line_func)(rt_uint8_t* dst, rt_uint8_t* src, int line);
+rtgui_blit_line_func rtgui_blit_line_get(int dst_bpp, int src_bpp);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/color.h b/components/rtgui_win/include/rtgui/color.h new file mode 100644 index 0000000000..d5b17b8e5e --- /dev/null +++ b/components/rtgui_win/include/rtgui/color.h @@ -0,0 +1,104 @@ +/*
+ * File : color.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_COLOR_H__
+#define __RTGUI_COLOR_H__
+
+#include <rtgui/rtgui.h>
+
+
+extern const rtgui_color_t default_foreground;
+extern const rtgui_color_t default_background;
+extern const rtgui_color_t selected_color;
+
+extern const rtgui_color_t red;
+extern const rtgui_color_t green;
+extern const rtgui_color_t blue;
+extern const rtgui_color_t black;
+extern const rtgui_color_t white;
+extern const rtgui_color_t yellow;
+extern const rtgui_color_t cyan;
+extern const rtgui_color_t purple;
+extern const rtgui_color_t dark;
+
+extern const rtgui_color_t high_light;
+extern const rtgui_color_t dark_grey;
+extern const rtgui_color_t light_grey;
+
+
+#define RTGUI_ARGB(a, r, g, b) \
+ ((rtgui_color_t)(((rt_uint8_t)(r)|\
+ (((unsigned)(rt_uint8_t)(g))<<8))|\
+ (((unsigned long)(rt_uint8_t)(b))<<16)|\
+ (((unsigned long)(rt_uint8_t)(a))<<24)))
+#define RTGUI_RGB(r, g, b) RTGUI_ARGB(255, (r), (g), (b))
+
+#define RTGUI_RGB_R(c) (((c) >> 0) & 0xFF)
+#define RTGUI_RGB_G(c) (((c) >> 8) & 0xFF)
+#define RTGUI_RGB_B(c) (((c) >> 16) & 0xFF)
+#define RTGUI_RGB_A(c) (((c) >> 24) & 0xFF)
+
+/*
+ * RTGUI default color format
+ * BBBB BBBB GGGG GGGG RRRR RRRR
+ */
+
+/* convert rtgui color to BBBBB_GGGGGG_RRRRR */
+rt_inline rt_uint16_t rtgui_color_to_565(rt_uint32_t c)
+{
+ rt_uint16_t pixel;
+
+ pixel = (rt_uint16_t)(((RTGUI_RGB_B(c)*31/255) << 11) | ((RTGUI_RGB_G(c)*63/255) << 5) | (RTGUI_RGB_R(c)*31/255));
+ return pixel;
+}
+
+rt_inline rt_uint32_t rtgui_color_from_565(rt_uint16_t pixel)
+{
+ rt_uint16_t r, g, b;
+ rtgui_color_t color;
+
+ r = pixel & 0x1f;
+ g = (pixel >> 5) & 0x3f;
+ b = (pixel >> 11) & 0x1f;
+
+ color = r * 255 / 31 + ((g * 255 / 63) << 8) + ((b * 255 / 31) << 16);
+
+ return color;
+}
+
+/* convert rtgui color to RRRRR_GGGGGG)BBBBB */
+rt_inline rt_uint16_t rtgui_color_to_565p(rt_uint32_t c)
+{
+ rt_uint16_t pixel;
+
+ pixel = (rt_uint16_t)(((RTGUI_RGB_R(c)*31/255) << 11) | ((RTGUI_RGB_G(c)*63/255) << 5) | (RTGUI_RGB_B(c)*31/255));
+ return pixel;
+}
+
+rt_inline rt_uint32_t rtgui_color_from_565p(rt_uint16_t pixel)
+{
+ rt_uint8_t r, g, b;
+ rtgui_color_t color;
+
+ r = (pixel >> 11) & 0x1f;
+ g = (pixel >> 5) & 0x3f;
+ b = pixel & 0x1f;
+
+ color = r * 255 / 31 + ((g * 255 / 63) << 8) + ((b * 255 / 31) << 16);
+
+ return color;
+}
+
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/dc.h b/components/rtgui_win/include/rtgui/dc.h new file mode 100644 index 0000000000..4239283e55 --- /dev/null +++ b/components/rtgui_win/include/rtgui/dc.h @@ -0,0 +1,197 @@ +/*
+ * File : dc.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_DC_H__
+#define __RTGUI_DC_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/font.h>
+#include <rtgui/driver.h>
+#include <rtgui/widgets/widget.h>
+
+enum rtgui_dc_type
+{
+ RTGUI_DC_HW,
+ RTGUI_DC_CLIENT,
+ RTGUI_DC_BUFFER,
+ RTGUI_DC_IMLIB2,
+};
+
+struct rtgui_dc_engine
+{
+ /* interface */
+ void (*draw_point)(struct rtgui_dc* dc, int x, int y);
+ void (*draw_color_point)(struct rtgui_dc* dc, int x, int y, rtgui_color_t color);
+ void (*draw_vline)(struct rtgui_dc* dc, int x, int y1, int y2);
+ void (*draw_hline)(struct rtgui_dc* dc, int x1, int x2, int y);
+ void (*fill_rect )(struct rtgui_dc* dc, rtgui_rect_t* rect);
+ void (*blit_line) (struct rtgui_dc* dc, int x1, int x2, int y, rt_uint8_t* line_data);
+ void (*blit )(struct rtgui_dc* dc, struct rtgui_point* dc_point, struct rtgui_dc* dest, rtgui_rect_t* rect);
+
+ /* set and get graphic context */
+ void (*set_gc)(struct rtgui_dc* dc, struct rtgui_gc *gc);
+ struct rtgui_gc* (*get_gc)(struct rtgui_dc* dc);
+
+ /* get dc visible */
+ rt_bool_t (*get_visible)(struct rtgui_dc* dc);
+
+ /* get dc rect */
+ void (*get_rect )(struct rtgui_dc* dc, rtgui_rect_t* rect);
+
+ rt_bool_t (*fini )(struct rtgui_dc* dc);
+};
+
+/* the abstract device context */
+struct rtgui_dc
+{
+ /* type of device context */
+ rt_uint32_t type;
+
+ /* dc engine */
+ const struct rtgui_dc_engine* engine;
+};
+
+#define RTGUI_DC_FC(dc) (rtgui_dc_get_gc(dc)->foreground)
+#define RTGUI_DC_BC(dc) (rtgui_dc_get_gc(dc)->background)
+#define RTGUI_DC_FONT(dc) (rtgui_dc_get_gc(dc)->font)
+#define RTGUI_DC_TEXTALIGN(dc) (rtgui_dc_get_gc(dc)->textalign)
+
+/* create a buffer dc */
+struct rtgui_dc* rtgui_dc_buffer_create(int width, int height);
+rt_uint8_t* rtgui_dc_buffer_get_pixel(struct rtgui_dc* dc);
+
+/* begin and end a drawing */
+struct rtgui_dc* rtgui_dc_begin_drawing(PVOID wdt);
+void rtgui_dc_end_drawing(struct rtgui_dc* dc);
+
+/* destroy a dc */
+void rtgui_dc_destory(struct rtgui_dc* dc);
+
+void rtgui_dc_draw_line (struct rtgui_dc* dc, int x1, int y1, int x2, int y2);
+void rtgui_dc_draw_rect (struct rtgui_dc* dc, struct rtgui_rect* rect);
+void rtgui_dc_fill_rect_forecolor(struct rtgui_dc* dc, struct rtgui_rect* rect);
+void rtgui_dc_draw_round_rect(struct rtgui_dc* dc, struct rtgui_rect* rect, int r);
+void rtgui_dc_fill_round_rect(struct rtgui_dc* dc, struct rtgui_rect* rect, int r);
+void rtgui_dc_draw_annulus(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_int16_t r1, rt_int16_t r2, rt_int16_t start, rt_int16_t end);
+void rtgui_dc_draw_sector(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_int16_t r, rt_int16_t start, rt_int16_t end);
+void rtgui_dc_fill_sector(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_int16_t r, rt_int16_t start, rt_int16_t end);
+
+void rtgui_dc_draw_text (struct rtgui_dc* dc, const char* text, struct rtgui_rect* rect);
+
+void rtgui_dc_draw_mono_bmp(struct rtgui_dc* dc, int x, int y, int w, int h, const rt_uint8_t* data);
+void rtgui_dc_draw_byte(struct rtgui_dc*dc, int x, int y, int h, const rt_uint8_t* data);
+void rtgui_dc_draw_word(struct rtgui_dc*dc, int x, int y, int h, const rt_uint8_t* data);
+
+void rtgui_dc_draw_border(struct rtgui_dc* dc, rtgui_rect_t* rect, int flag);
+void rtgui_dc_draw_horizontal_line(struct rtgui_dc* dc, int x1, int x2, int y);
+void rtgui_dc_draw_vertical_line(struct rtgui_dc* dc, int x, int y1, int y2);
+void rtgui_dc_draw_focus_rect(struct rtgui_dc* dc, rtgui_rect_t* rect);
+
+void rtgui_dc_draw_polygon(struct rtgui_dc* dc, const int *vx, const int *vy, int count);
+void rtgui_dc_fill_polygon(struct rtgui_dc* dc, const int* vx, const int* vy, int count);
+
+void rtgui_dc_draw_circle(struct rtgui_dc* dc, int x, int y, int r);
+void rtgui_dc_fill_circle(struct rtgui_dc* dc, rt_int16_t x, rt_int16_t y, rt_int16_t r);
+void rtgui_dc_draw_arc(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_int16_t r, rt_int16_t start, rt_int16_t end);
+
+void rtgui_dc_draw_ellipse(struct rtgui_dc* dc, rt_int16_t x, rt_int16_t y, rt_int16_t rx, rt_int16_t ry);
+void rtgui_dc_fill_ellipse(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_int16_t rx, rt_int16_t ry);
+
+/*
+ * dc inline function
+ *
+ * Note:
+ * In order to improve drawing speed, put most of common function of dc to inline
+ */
+
+/*
+ * draw a point on dc
+ */
+rt_inline void rtgui_dc_draw_point(struct rtgui_dc* dc, int x, int y)
+{
+ dc->engine->draw_point(dc, x, y);
+}
+
+/*
+ * draw a color point on dc
+ */
+rt_inline void rtgui_dc_draw_color_point(struct rtgui_dc* dc, int x, int y, rtgui_color_t color)
+{
+ dc->engine->draw_color_point(dc, x, y, color);
+}
+
+/*
+ * draw a vertical line on dc
+ */
+rt_inline void rtgui_dc_draw_vline(struct rtgui_dc* dc, int x, int y1, int y2)
+{
+ dc->engine->draw_vline(dc, x, y1, y2);
+}
+
+/*
+ * draw a horizontal line on dc
+ */
+rt_inline void rtgui_dc_draw_hline(struct rtgui_dc* dc, int x1, int x2, int y)
+{
+ dc->engine->draw_hline(dc, x1, x2, y);
+}
+
+/*
+ * fill a rect with background color
+ */
+rt_inline void rtgui_dc_fill_rect (struct rtgui_dc* dc, struct rtgui_rect* rect)
+{
+ dc->engine->fill_rect(dc, rect);
+}
+
+/*
+ * blit a dc on hardware dc
+ */
+rt_inline void rtgui_dc_blit(struct rtgui_dc* dc, struct rtgui_point* dc_point, struct rtgui_dc* dest, rtgui_rect_t* rect)
+{
+ dc->engine->blit(dc, dc_point, dest, rect);
+}
+
+/*
+ * set gc of dc
+ */
+rt_inline void rtgui_dc_set_gc(struct rtgui_dc* dc, rtgui_gc_t* gc)
+{
+ dc->engine->set_gc(dc, gc);
+}
+
+/*
+ * get gc of dc
+ */
+rt_inline rtgui_gc_t *rtgui_dc_get_gc(struct rtgui_dc* dc)
+{
+ return dc->engine->get_gc(dc);
+}
+
+/*
+ * get visible status of dc
+ */
+rt_inline rt_bool_t rtgui_dc_get_visible(struct rtgui_dc* dc)
+{
+ return dc->engine->get_visible(dc);
+}
+
+/*
+ * get rect of dc
+ */
+rt_inline void rtgui_dc_get_rect(struct rtgui_dc*dc, rtgui_rect_t* rect)
+{
+ dc->engine->get_rect(dc, rect);
+}
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/dc_client.h b/components/rtgui_win/include/rtgui/dc_client.h new file mode 100644 index 0000000000..297307c875 --- /dev/null +++ b/components/rtgui_win/include/rtgui/dc_client.h @@ -0,0 +1,27 @@ +/*
+ * File : dc_buffer.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2010, 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
+ * 2010-04-10 Bernard first version
+ * 2010-06-14 Bernard embedded hardware dc to each widget
+ * 2010-08-09 Bernard rename hardware dc to client dc
+ */
+
+#ifndef __RTGUI_DC_CLIENT_H__
+#define __RTGUI_DC_CLIENT_H__
+
+#include <rtgui/dc.h>
+
+/* create a hardware dc */
+struct rtgui_dc* rtgui_dc_client_create(rtgui_widget_t* owner);
+void rtgui_dc_client_init(rtgui_widget_t* owner);
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/dc_hw.h b/components/rtgui_win/include/rtgui/dc_hw.h new file mode 100644 index 0000000000..f4c84dd755 --- /dev/null +++ b/components/rtgui_win/include/rtgui/dc_hw.h @@ -0,0 +1,24 @@ +/*
+ * File : dc_buffer.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2010, 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
+ * 2010-04-10 Bernard first version
+ * 2010-06-14 Bernard embedded hardware dc to each widget
+ */
+#ifndef __RTGUI_DC_HW_H__
+#define __RTGUI_DC_HW_H__
+
+#include <rtgui/dc.h>
+
+/* create a hardware dc */
+struct rtgui_dc* rtgui_dc_hw_create(rtgui_widget_t* owner);
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/driver.h b/components/rtgui_win/include/rtgui/driver.h new file mode 100644 index 0000000000..9b3db0e19b --- /dev/null +++ b/components/rtgui_win/include/rtgui/driver.h @@ -0,0 +1,67 @@ +/*
+ * File : driver.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_DRIVER_H__
+#define __RTGUI_DRIVER_H__
+
+#include <rtgui/list.h>
+#include <rtgui/color.h>
+
+struct rtgui_graphic_driver
+{
+ /* driver name */
+ char* name;
+
+ /* byte per pixel */
+ rt_uint16_t byte_per_pixel;
+
+ /* screen width and height */
+ rt_uint16_t width;
+ rt_uint16_t height;
+
+ /* screen update */
+ void (*screen_update)(rtgui_rect_t* rect);
+
+ /* get video frame buffer */
+ rt_uint8_t* (*get_framebuffer)(void);
+
+ /* set and get pixel in (x, y) */
+ void (*set_pixel) (rtgui_color_t *c, rt_base_t x, rt_base_t y);
+ void (*get_pixel) (rtgui_color_t *c, rt_base_t x, rt_base_t y);
+
+ void (*draw_hline)(rtgui_color_t *c, rt_base_t x1, rt_base_t x2, rt_base_t y);
+ void (*draw_vline)(rtgui_color_t *c, rt_base_t x , rt_base_t y1, rt_base_t y2);
+
+ /* draw raw rt_hw_lcd_draw_hline */
+ void (*draw_raw_hline)(rt_uint8_t *pixels, rt_base_t x1, rt_base_t x2, rt_base_t y);
+
+ /* the driver list */
+ rtgui_list_t list;
+};
+
+#ifdef RTGUI_USING_GRAPHIC_DRIVER_LIST
+void rtgui_graphic_driver_add(struct rtgui_graphic_driver* driver);
+void rtgui_graphic_driver_remove(struct rtgui_graphic_driver* driver);
+
+struct rtgui_graphic_driver* rtgui_graphic_driver_find(char* name);
+#else
+void rtgui_graphic_driver_add(const struct rtgui_graphic_driver* driver);
+#endif
+
+const struct rtgui_graphic_driver* rtgui_graphic_driver_get_default(void);
+
+void rtgui_graphic_driver_get_rect(const struct rtgui_graphic_driver *driver, rtgui_rect_t *rect);
+void rtgui_graphic_driver_get_default_rect(rtgui_rect_t *rect);
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/event.h b/components/rtgui_win/include/rtgui/event.h new file mode 100644 index 0000000000..7f5241ab20 --- /dev/null +++ b/components/rtgui_win/include/rtgui/event.h @@ -0,0 +1,341 @@ +/*
+ * File : event.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_EVENT_H__
+#define __RTGUI_EVENT_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/rtgui_system.h>
+
+/* Use new name & namespace */
+typedef struct rtgui_event rtgui_event_t;
+typedef struct rtgui_event_win rtgui_event_win_t;
+typedef struct rtgui_event_win_move rtgui_event_win_move_t;
+typedef struct rtgui_event_win_resize rtgui_event_win_resize_t;
+
+typedef struct rtgui_event_set_wm rtgui_event_set_wm_t;
+typedef struct rtgui_event_update rtgui_event_update_t;
+typedef struct rtgui_event_monitor rtgui_event_monitor_t;
+typedef struct rtgui_event_paint rtgui_event_paint_t;
+typedef struct rtgui_event_timer rtgui_event_timer_t;
+typedef struct rtgui_event_clip rtgui_event_clip_t;
+
+typedef struct rtgui_event_mouse rtgui_event_mouse_t;
+typedef struct rtgui_event_kbd rtgui_event_kbd_t;
+typedef struct rtgui_event_current_pos rtgui_event_current_pos_t;//���������¼�
+typedef struct rtgui_event_backlight rtgui_event_backlight_t;//LCD����
+typedef struct rtgui_event_command rtgui_event_command_t;
+typedef struct rtgui_event_scrollbar rtgui_event_scrollbar_t;
+
+typedef struct rtgui_event_focused rtgui_event_focused_t;
+typedef struct rtgui_event_resize rtgui_event_resize_t;
+
+
+/* panel event NULL */
+
+/* window event */
+#define RTGUI_EVENT_PANEL_ATTACH 0 /* attach to a panel */
+#define RTGUI_EVENT_PANEL_DETACH 1 /* detach from a panel */
+#define RTGUI_EVENT_PANEL_SHOW 2 /* show in a panel */
+#define RTGUI_EVENT_PANEL_HIDE 3 /* hide from a panel */
+#define RTGUI_EVENT_PANEL_INFO 4 /* panel information */
+#define RTGUI_EVENT_PANEL_RESIZE 5 /* resize panel */
+#define RTGUI_EVENT_PANEL_FULLSCREEN 6 /* to full screen */
+#define RTGUI_EVENT_PANEL_NORMAL 7 /* to normal screen */
+
+#define RTGUI_EVENT_WIN_CREATE 8 /* create a window */
+#define RTGUI_EVENT_WIN_DESTROY 9 /* destroy a window */
+#define RTGUI_EVENT_WIN_SHOW 10 /* show a window */
+#define RTGUI_EVENT_WIN_HIDE 11 /* hide a window */
+#define RTGUI_EVENT_WIN_ACTIVATE 12 /* activate a window */
+#define RTGUI_EVENT_WIN_DEACTIVATE 13 /* deactivate a window */
+#define RTGUI_EVENT_WIN_CLOSE 14 /* close a window */
+#define RTGUI_EVENT_WIN_MAX 15 /* max a window */
+#define RTGUI_EVENT_WIN_MIN 16 /* min a window */
+#define RTGUI_EVENT_WIN_MOVE 17 /* move a window */
+#define RTGUI_EVENT_WIN_RESIZE 18 /* resize a window */
+#define RTGUI_EVENT_UPDATE 19 /* update a rect */
+#define RTGUI_EVENT_PAINT 23 /* paint on screen */
+#define RTGUI_EVENT_TIMER 24 /* timer 0x17 */
+/* clip rect information */
+#define RTGUI_EVENT_CLIP 25 /* ��������Ϣ */
+/* mouse and keyboard event */
+#define RTGUI_EVENT_MOUSE_MOTION 26 /* ������� */
+#define RTGUI_EVENT_MOUSE_BUTTON 27 /* ����� */
+#define RTGUI_EVENT_KBD 28 /* keyboard info 0x1B*/
+/* user command event */
+#define RTGUI_EVENT_COMMAND 29 /* �û����� */
+/* widget event */
+#define RTGUI_EVENT_FOCUSED 30 /* �ؼ����� */
+#define RTGUI_EVENT_SCROLLED 31 /* scroll bar scrolled */
+#define RTGUI_EVENT_RESIZE 32 /* widget resize */
+#define RTGUI_EVENT_CURRENT_POS 33 /* ���µ�ǰ����� */
+#define RTGUI_EVENT_BACKLIGHT 34 /* Һ�������� */
+
+enum {
+ RTGUI_STATUS_OK = 0, /* status ok */
+ RTGUI_STATUS_ERROR, /* generic error */
+ RTGUI_STATUS_NRC, /* no resource */
+};
+
+struct rtgui_event
+{
+ /* the event type */
+ rt_uint16_t type;
+ /* user field of event */
+ rt_uint16_t user;
+
+ /* the event sender */
+ struct rt_thread* sender;
+
+ /* mailbox to acknowledge request */
+ struct rt_mailbox* ack;
+};
+
+#define RTGUI_EVENT(e) ((rtgui_event_t*)(e))
+
+#define RTGUI_EVENT_INIT(e, t) do \
+{ \
+ (e)->type = (t); \
+ (e)->user = 0; \
+ (e)->sender = rt_thread_self(); \
+ (e)->ack = RT_NULL; \
+} while(0)
+
+/*
+ * RTGUI Window Event
+ */
+struct rtgui_event_win
+{
+ rtgui_event_t parent;
+
+ /* the window id */
+ rtgui_win_t* wid;
+};
+
+struct rtgui_event_win_move
+{
+ rtgui_event_t parent;
+
+ /* the window id */
+ rtgui_win_t* wid;
+
+ rt_int16_t x, y;
+};
+
+struct rtgui_event_win_resize
+{
+ rtgui_event_t parent;
+
+ /* the window id */
+ rtgui_win_t* wid;
+
+ rtgui_rect_t rect;
+};
+
+/* window event init */
+#define RTGUI_EVENT_WIN_CREATE_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_CREATE)
+#define RTGUI_EVENT_WIN_DESTROY_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_DESTROY)
+#define RTGUI_EVENT_WIN_SHOW_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_SHOW)
+#define RTGUI_EVENT_WIN_HIDE_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_HIDE)
+#define RTGUI_EVENT_WIN_ACTIVATE_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_ACTIVATE)
+#define RTGUI_EVENT_WIN_DEACTIVATE_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_DEACTIVATE)
+#define RTGUI_EVENT_WIN_CLOSE_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_CLOSE)
+#define RTGUI_EVENT_WIN_MAX_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_MAX)
+#define RTGUI_EVENT_WIN_MIN_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_MIN)
+#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 Other Event
+ */
+struct rtgui_event_update
+{
+ rtgui_event_t parent;
+
+ /* the update rect */
+ rtgui_rect_t rect;
+};
+
+struct rtgui_event_monitor
+{
+ rtgui_event_t parent;
+
+ /* the monitor rect */
+ rtgui_rect_t rect;
+
+ /* under panel */
+ rtgui_panel_t* panel;
+
+ /* or under window */
+ rtgui_win_t* wid;
+};
+
+struct rtgui_event_paint
+{
+ rtgui_event_t parent;
+ rtgui_win_t* wid; /* destination window */
+ rt_bool_t bfull;//����ȫ��,���Ǹ����ӿؼ�
+};
+
+struct rtgui_event_timer
+{
+ rtgui_event_t parent;
+
+ rtgui_timer_t *timer;
+};
+
+struct rtgui_event_clip
+{
+ rtgui_event_t parent;
+ /* destination window */
+ rtgui_win_t* wid;
+ /* the number of rects */
+ rt_uint32_t num_rect;
+ /* rtgui_rect_t *rects */
+};
+#define RTGUI_EVENT_GET_RECT(e, i) &(((rtgui_rect_t*)(e + 1))[i])
+
+#define RTGUI_EVENT_UPDATE_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_UPDATE)
+#define RTGUI_EVENT_CLIP_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_CLIP)
+#define RTGUI_EVENT_PAINT_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_PAINT)
+#define RTGUI_EVENT_TIMER_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_TIMER)
+
+/*
+ * RTGUI Mouse and Keyboard Event
+ */
+struct rtgui_event_mouse
+{
+ rtgui_event_t parent;
+
+ rtgui_win_t* wid; /* destination window */
+
+ rt_uint16_t x, y;
+ rt_uint16_t button;
+};
+
+#define RTGUI_MOUSE_BUTTON_RIGHT 0x01
+#define RTGUI_MOUSE_BUTTON_LEFT 0x02
+#define RTGUI_MOUSE_BUTTON_MIDDLE 0x03
+#define RTGUI_MOUSE_BUTTON_WHEELUP 0x04
+#define RTGUI_MOUSE_BUTTON_WHEELDOWN 0x08
+
+#define RTGUI_MOUSE_BUTTON_DOWN 0x10
+#define RTGUI_MOUSE_BUTTON_UP 0x20
+
+struct rtgui_event_kbd
+{
+ rtgui_event_t parent;
+
+ rtgui_win_t* wid; /* destination window */
+
+ rt_uint16_t type; /* key down or up */
+ rt_uint16_t key; /* current key */
+ rt_uint16_t mod; /* current key modifiers */
+ rt_uint16_t unicode; /* translated character */
+};
+
+struct rtgui_event_current_pos
+{
+ rtgui_event_t parent;
+};
+
+//Һ��������
+struct rtgui_event_backlight
+{
+ rtgui_event_t parent;
+ rt_uint16_t light;
+};
+
+#define RTGUI_KBD_IS_SET_CTRL(e) ((e)->mod & (RTGUI_KMOD_LCTRL | RTGUI_KMOD_RCTRL))
+#define RTGUI_KBD_IS_SET_ALT(e) ((e)->mod & (RTGUI_KMOD_LALT | RTGUI_KMOD_RALT))
+#define RTGUI_KBD_IS_SET_SHIFT(e) ((e)->mod & (RTGUI_KMOD_LSHIFT| RTGUI_KMOD_RSHIFT))
+#define RTGUI_KBD_IS_UP(e) ((e)->type == RTGUI_KEYUP)
+#define RTGUI_KBD_IS_DOWN(e) ((e)->type == RTGUI_KEYDOWN)
+
+#define RTGUI_EVENT_MOUSE_MOTION_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_MOUSE_MOTION)
+#define RTGUI_EVENT_MOUSE_BUTTON_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_MOUSE_BUTTON)
+#define RTGUI_EVENT_KBD_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_KBD)
+#define RTGUI_EVENT_CURRENT_POS_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_CURRENT_POS)
+#define RTGUI_EVENT_BACKLIGHT_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_BACKLIGHT)
+
+struct rtgui_event_command
+{
+ rtgui_event_t parent;
+
+ /* command type */
+ rt_int32_t type;
+
+ /* command id */
+ rt_int32_t command;
+
+ /* command string */
+ char command_string[RTGUI_NAME_MAX];
+};
+#define RTGUI_EVENT_COMMAND_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_COMMAND)
+
+#define RTGUI_CMD_UNKNOWN 0x00
+#define RTGUI_CMD_WM_CLOSE 0x10
+
+#define RTGUI_CMD_USER_INT 0x20
+#define RTGUI_CMD_USER_STRING 0x21
+
+/************************************************************************/
+/* Widget Event */
+/************************************************************************/
+#define RTGUI_WIDGET_EVENT_INIT(e, t) do \
+{ \
+ (e)->type = (t); \
+ (e)->sender = RT_NULL; \
+ (e)->ack = RT_NULL; \
+} while(0)
+
+/*
+ * RTGUI Scrollbar Event
+ */
+struct rtgui_event_scrollbar
+{
+ rtgui_event_t parent;
+
+ rt_uint8_t event;
+};
+#define RTGUI_SCROLL_LINEUP 0x01
+#define RTGUI_SCROLL_LINEDOWN 0x02
+#define RTGUI_SCROLL_PAGEUP 0x03
+#define RTGUI_SCROLL_PAGEDOWN 0x04
+#define RTGUI_EVENT_SCROLLED_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_SCROLLED)
+
+/*
+ * RTGUI Widget Focused Event
+ */
+struct rtgui_event_focused
+{
+ rtgui_event_t parent;
+
+ rtgui_widget_t* widget;
+};
+#define RTGUI_EVENT_FOCUSED_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_FOCUSED)
+
+/*
+ * RTGUI Widget Resize Event
+ */
+struct rtgui_event_resize
+{
+ rtgui_event_t parent;
+ rt_int16_t x, y;
+ rt_int16_t w, h;
+};
+#define RTGUI_EVENT_RESIZE_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_RESIZE)
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/filerw.h b/components/rtgui_win/include/rtgui/filerw.h new file mode 100644 index 0000000000..95e419621f --- /dev/null +++ b/components/rtgui_win/include/rtgui/filerw.h @@ -0,0 +1,48 @@ +/*
+ * File : filerw.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_FILERW_H__
+#define __RTGUI_FILERW_H__
+
+#include <rtgui/rtgui.h>
+
+#define RTGUI_FILE_SEEK_SET 0
+#define RTGUI_FILE_SEEK_CUR 1
+#define RTGUI_FILE_SEEK_END 2
+
+typedef struct rtgui_filerw rtgui_filerw_t;
+
+struct rtgui_filerw
+{
+ int (*seek) (struct rtgui_filerw *context, rt_off_t offset, int whence);
+ int (*read) (struct rtgui_filerw *context, void *buffer, rt_size_t size, rt_size_t count);
+ int (*write)(struct rtgui_filerw *context, const void *buffer, rt_size_t size, rt_size_t count);
+ int (*tell) (struct rtgui_filerw *context);
+ int (*eof) (struct rtgui_filerw *context);
+ int (*close)(struct rtgui_filerw *context);
+};
+
+struct rtgui_filerw* rtgui_filerw_create_file(const char *filename, const char *mode);
+struct rtgui_filerw* rtgui_filerw_create_mem(const rt_uint8_t *data, rt_size_t size);
+
+int rtgui_filerw_seek (struct rtgui_filerw *context, rt_off_t offset, int whence);
+int rtgui_filerw_read (struct rtgui_filerw *context, void *buffer, rt_size_t size, rt_size_t count);
+int rtgui_filerw_write(struct rtgui_filerw *context, const void *buffer, rt_size_t size, rt_size_t count);
+int rtgui_filerw_tell (struct rtgui_filerw *context);
+int rtgui_filerw_eof (struct rtgui_filerw *context);
+int rtgui_filerw_close(struct rtgui_filerw *context);
+
+/* get memory data from filerw memory object */
+const rt_uint8_t* rtgui_filerw_mem_getdata(struct rtgui_filerw* context);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/font.h b/components/rtgui_win/include/rtgui/font.h new file mode 100644 index 0000000000..f56de6ae4e --- /dev/null +++ b/components/rtgui_win/include/rtgui/font.h @@ -0,0 +1,116 @@ +/*
+ * File : font.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_FONT_H__
+#define __RTGUI_FONT_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/list.h>
+
+extern rtgui_font_t rtgui_font_asc12,rtgui_font_asc16,font_dotum;
+
+struct rtgui_font_engine
+{
+ /* font engine function */
+ void (*font_init)(rtgui_font_t* font);
+ void (*font_load)(rtgui_font_t* font);
+
+ void (*font_draw_text)(rtgui_font_t* font, rtgui_dc_t *dc, const char* text, rt_uint32_t len, rtgui_rect_t* rect);
+ void (*font_get_metrics)(rtgui_font_t* font, const char* text, rtgui_rect_t* rect);
+};
+
+/*
+ * bitmap font engine
+ */
+/* bitmap font private data */
+struct rtgui_font_bitmap
+{
+ /* bitmap data */
+ const rt_uint8_t* bmp;
+ const rt_uint8_t* char_width; /* each character width, NULL for fixed font */ + const rt_uint32_t* offset; /* offset for each character */
+
+ rt_uint16_t width;
+ rt_uint16_t height;
+
+ rt_uint8_t first_char;
+ rt_uint8_t last_char;
+};
+extern const struct rtgui_font_engine bmp_font_engine;
+
+#include <rtgui/tree.h>
+SPLAY_HEAD(cache_tree, hz_cache);
+struct hz_cache
+{
+ SPLAY_ENTRY(hz_cache) hz_node;
+
+ rt_uint16_t hz_id;
+};
+
+struct rtgui_hz_file_font
+{
+ struct cache_tree cache_root;
+ rt_uint16_t cache_size;
+
+ /* font size */
+ rt_uint16_t font_size;
+ rt_uint16_t font_data_size;
+
+ /* file descriptor */
+ int fd;
+
+ /* font file name */
+ const char* font_fn;
+};
+extern struct rtgui_font_engine rtgui_hz_file_font_engine;
+
+struct rtgui_font
+{
+ /* font name */
+ char* family;
+
+ /* font height */
+ rt_uint16_t height;
+
+ /* refer count */
+ rt_uint32_t refer_count;
+
+ /* font engine */
+ const struct rtgui_font_engine* engine;
+
+ /* font private data */
+ void* data;
+
+ /* the font list */
+ rtgui_list_t list;
+};
+typedef struct rtgui_font rtgui_font_t;
+
+void rtgui_font_system_init(void);
+void rtgui_font_system_add_font(rtgui_font_t* font);
+void rtgui_font_system_remove_font(rtgui_font_t* font);
+rtgui_font_t* rtgui_font_default(void);
+void rtgui_font_set_defaut(rtgui_font_t* font);
+
+rtgui_font_t* rtgui_font_refer(const rt_uint8_t* family, rt_uint16_t height);
+void rtgui_font_derefer(rtgui_font_t* font);
+
+/* draw a text */
+void rtgui_font_draw(rtgui_font_t* font, rtgui_dc_t *dc, const char* text, rt_uint32_t len, rtgui_rect_t* rect);
+int rtgui_font_get_string_width(rtgui_font_t* font, const char* text);//ȡ���ַ����Ŀ���
+int rtgui_font_get_font_width(rtgui_font_t* font); //ȡ������Ŀ���
+int rtgui_font_get_font_height(rtgui_font_t* font);//ȡ������ĸ߶�
+void rtgui_font_get_string_rect(rtgui_font_t* font, const char* text, rtgui_rect_t* rect);//ȡ���ַ����ľ�������
+void rtgui_font_get_metrics(struct rtgui_font* font, const char* text, rtgui_rect_t* rect);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/image.h b/components/rtgui_win/include/rtgui/image.h new file mode 100644 index 0000000000..8a2611cd87 --- /dev/null +++ b/components/rtgui_win/include/rtgui/image.h @@ -0,0 +1,78 @@ +/*
+ * File : image.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_IMAGE_H__
+#define __RTGUI_IMAGE_H__
+
+#include <rtgui/list.h>
+#include <rtgui/dc.h>
+#include <rtgui/driver.h>
+#include <rtgui/color.h>
+#include <rtgui/filerw.h>
+#include <rtgui/region.h>
+
+typedef struct rtgui_image rtgui_image_t;
+
+struct rtgui_image_engine
+{
+ const char* name; //��������,ͼ������
+ rtgui_list_t list;
+
+ /* image engine function */
+ rt_bool_t (*image_check)(struct rtgui_filerw* file);
+
+ rt_bool_t (*image_load)(rtgui_image_t* image, struct rtgui_filerw* file, rt_bool_t load);
+ void (*image_unload)(rtgui_image_t* image);
+
+ void (*image_blit)(rtgui_image_t *image, rtgui_dc_t *dc, rtgui_rect_t *rect);
+ void (*image_paste)(rtgui_image_t *image, rtgui_dc_t *dc, rtgui_rect_t *rect, rtgui_color_t shield_color);
+};
+
+struct rtgui_image_palette
+{
+ rtgui_color_t* colors;
+ rt_uint32_t ncolors;
+};
+typedef struct rtgui_image_palette rtgui_image_palette_t;
+
+struct rtgui_image
+{
+ /* image metricsͼ��Ĵ�С */
+ rt_uint16_t w, h;
+
+ /* image engine ͼ������ */
+ const struct rtgui_image_engine* engine;
+
+ /* image palette */
+ rtgui_image_palette_t* palette;
+
+ /* image private data ͼ��˽������ */
+ void* data;
+};
+
+/* init rtgui image system */
+void rtgui_system_image_init(void);
+
+rtgui_image_t* rtgui_image_create_from_file(const char* type, const char* filename, rt_bool_t load);
+rtgui_image_t* rtgui_image_create_from_mem(const char* type, const rt_uint8_t* data, rt_size_t length, rt_bool_t load);
+void rtgui_image_destroy(rtgui_image_t* image);
+
+/* register an image engine */
+void rtgui_image_register_engine(struct rtgui_image_engine* engine);
+
+/* blit an image */
+void rtgui_image_blit(rtgui_image_t* image, rtgui_dc_t *dc, rtgui_rect_t* rect);
+void rtgui_image_paste(rtgui_image_t *image, rtgui_dc_t *dc, rtgui_rect_t *rect, rtgui_color_t shield_color);
+struct rtgui_image_palette* rtgui_image_palette_create(rt_uint32_t ncolors);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/image_bmp.h b/components/rtgui_win/include/rtgui/image_bmp.h new file mode 100644 index 0000000000..1dbcccff90 --- /dev/null +++ b/components/rtgui_win/include/rtgui/image_bmp.h @@ -0,0 +1,19 @@ +/*
+ * File : image_bmp.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
+ * 2010-08-10 Bernard first version
+ */
+#ifndef __RTGUI_IMAGE_BMP_H__
+#define __RTGUI_IMAGE_BMP_H__
+
+void rtgui_image_bmp_init(void);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/image_hdc.h b/components/rtgui_win/include/rtgui/image_hdc.h new file mode 100644 index 0000000000..aa91609058 --- /dev/null +++ b/components/rtgui_win/include/rtgui/image_hdc.h @@ -0,0 +1,37 @@ +/*
+ * File : image_xpm.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_IMAGE_HDC_H__
+#define __RTGUI_IMAGE_HDC_H__
+
+#include <rtgui/image.h>
+
+struct rtgui_image_hdcmm
+{
+ rtgui_image_t parent;
+
+ /* hdc image information */
+ rt_uint16_t byte_per_pixel;
+ rt_uint16_t pitch;
+
+ rt_uint8_t *pixels;
+};
+
+void rtgui_image_hdc_init(void);
+extern const struct rtgui_image_engine rtgui_image_hdcmm_engine;
+
+#define HDC_HEADER_SIZE (5 * 4)
+#define RTGUI_IMAGE_HDC_DEF(bpp, w, h, pixels) \
+ {{w, h, &rtgui_image_hdcmm_engine, RT_NULL}, bpp, (bpp * w), ((rt_uint8_t*)pixels + HDC_HEADER_SIZE)}
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/image_jpeg.h b/components/rtgui_win/include/rtgui/image_jpeg.h new file mode 100644 index 0000000000..d89d1ed290 --- /dev/null +++ b/components/rtgui_win/include/rtgui/image_jpeg.h @@ -0,0 +1,8 @@ +#ifndef __RTGUI_IMAGE_JPEG_H__
+#define __RTGUI_IMAGE_JPEG_H__
+
+#include <image.h>
+
+void rtgui_image_jpeg_init(void);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/image_png.h b/components/rtgui_win/include/rtgui/image_png.h new file mode 100644 index 0000000000..5722e72e97 --- /dev/null +++ b/components/rtgui_win/include/rtgui/image_png.h @@ -0,0 +1,21 @@ +/*
+ * File : image_png.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_IMAGE_PNG_H__
+#define __RTGUI_IMAGE_PNG_H__
+
+#include <image.h>
+
+void rtgui_image_png_init(void);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/image_xpm.h b/components/rtgui_win/include/rtgui/image_xpm.h new file mode 100644 index 0000000000..e580327f6d --- /dev/null +++ b/components/rtgui_win/include/rtgui/image_xpm.h @@ -0,0 +1,21 @@ +/*
+ * File : image_xpm.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_IMAGE_XPM_H__
+#define __RTGUI_IMAGE_XPM_H__
+
+#include <rtgui/image.h>
+
+void rtgui_image_xpm_init(void);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/kbddef.h b/components/rtgui_win/include/rtgui/kbddef.h new file mode 100644 index 0000000000..650e67314d --- /dev/null +++ b/components/rtgui_win/include/rtgui/kbddef.h @@ -0,0 +1,293 @@ +/*
+ * File : kbddef.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 __KBD_DEF_H__
+#define __KBD_DEF_H__
+
+/* The keyboard key have been cleverly chosen to map to ASCII */
+typedef enum
+{
+ RTGUIK_UNKNOWN = 0,
+ RTGUIK_FIRST = 0,
+ RTGUIK_BACKSPACE = 8,
+ RTGUIK_TAB = 9,
+ RTGUIK_CLEAR = 12,
+ RTGUIK_RETURN = 13,
+ RTGUIK_PAUSE = 19,
+ RTGUIK_ESCAPE = 27,
+ RTGUIK_SPACE = 32,
+ RTGUIK_EXCLAIM = 33,
+ RTGUIK_QUOTEDBL = 34,
+ RTGUIK_HASH = 35,
+ RTGUIK_DOLLAR = 36,
+ RTGUIK_AMPERSAND = 38,
+ RTGUIK_QUOTE = 39,
+ RTGUIK_LEFTPAREN = 40,
+ RTGUIK_RIGHTPAREN = 41,
+ RTGUIK_ASTERISK = 42,
+ RTGUIK_PLUS = 43,
+ RTGUIK_COMMA = 44,
+ RTGUIK_MINUS = 45,
+ RTGUIK_PERIOD = 46,
+ RTGUIK_SLASH = 47,
+ RTGUIK_0 = 48,
+ RTGUIK_1 = 49,
+ RTGUIK_2 = 50,
+ RTGUIK_3 = 51,
+ RTGUIK_4 = 52,
+ RTGUIK_5 = 53,
+ RTGUIK_6 = 54,
+ RTGUIK_7 = 55,
+ RTGUIK_8 = 56,
+ RTGUIK_9 = 57,
+ RTGUIK_COLON = 58,
+ RTGUIK_SEMICOLON = 59,
+ RTGUIK_LESS = 60,
+ RTGUIK_EQUALS = 61,
+ RTGUIK_GREATER = 62,
+ RTGUIK_QUESTION = 63,
+ RTGUIK_AT = 64,
+
+ /*
+ Skip uppercase letters
+ */
+ RTGUIK_LEFTBRACKET = 91,
+ RTGUIK_BACKSLASH = 92,
+ RTGUIK_RIGHTBRACKET = 93,
+ RTGUIK_CARET = 94,
+ RTGUIK_UNDERSCORE = 95,
+ RTGUIK_BACKQUOTE = 96,
+ RTGUIK_a = 97,
+ RTGUIK_b = 98,
+ RTGUIK_c = 99,
+ RTGUIK_d = 100,
+ RTGUIK_e = 101,
+ RTGUIK_f = 102,
+ RTGUIK_g = 103,
+ RTGUIK_h = 104,
+ RTGUIK_i = 105,
+ RTGUIK_j = 106,
+ RTGUIK_k = 107,
+ RTGUIK_l = 108,
+ RTGUIK_m = 109,
+ RTGUIK_n = 110,
+ RTGUIK_o = 111,
+ RTGUIK_p = 112,
+ RTGUIK_q = 113,
+ RTGUIK_r = 114,
+ RTGUIK_s = 115,
+ RTGUIK_t = 116,
+ RTGUIK_u = 117,
+ RTGUIK_v = 118,
+ RTGUIK_w = 119,
+ RTGUIK_x = 120,
+ RTGUIK_y = 121,
+ RTGUIK_z = 122,
+ RTGUIK_DELETE = 127,
+
+ /* International keyboard */
+ RTGUIK_WORLD_0 = 160, /* 0xA0 */
+ RTGUIK_WORLD_1 = 161,
+ RTGUIK_WORLD_2 = 162,
+ RTGUIK_WORLD_3 = 163,
+ RTGUIK_WORLD_4 = 164,
+ RTGUIK_WORLD_5 = 165,
+ RTGUIK_WORLD_6 = 166,
+ RTGUIK_WORLD_7 = 167,
+ RTGUIK_WORLD_8 = 168,
+ RTGUIK_WORLD_9 = 169,
+ RTGUIK_WORLD_10 = 170,
+ RTGUIK_WORLD_11 = 171,
+ RTGUIK_WORLD_12 = 172,
+ RTGUIK_WORLD_13 = 173,
+ RTGUIK_WORLD_14 = 174,
+ RTGUIK_WORLD_15 = 175,
+ RTGUIK_WORLD_16 = 176,
+ RTGUIK_WORLD_17 = 177,
+ RTGUIK_WORLD_18 = 178,
+ RTGUIK_WORLD_19 = 179,
+ RTGUIK_WORLD_20 = 180,
+ RTGUIK_WORLD_21 = 181,
+ RTGUIK_WORLD_22 = 182,
+ RTGUIK_WORLD_23 = 183,
+ RTGUIK_WORLD_24 = 184,
+ RTGUIK_WORLD_25 = 185,
+ RTGUIK_WORLD_26 = 186,
+ RTGUIK_WORLD_27 = 187,
+ RTGUIK_WORLD_28 = 188,
+ RTGUIK_WORLD_29 = 189,
+ RTGUIK_WORLD_30 = 190,
+ RTGUIK_WORLD_31 = 191,
+ RTGUIK_WORLD_32 = 192,
+ RTGUIK_WORLD_33 = 193,
+ RTGUIK_WORLD_34 = 194,
+ RTGUIK_WORLD_35 = 195,
+ RTGUIK_WORLD_36 = 196,
+ RTGUIK_WORLD_37 = 197,
+ RTGUIK_WORLD_38 = 198,
+ RTGUIK_WORLD_39 = 199,
+ RTGUIK_WORLD_40 = 200,
+ RTGUIK_WORLD_41 = 201,
+ RTGUIK_WORLD_42 = 202,
+ RTGUIK_WORLD_43 = 203,
+ RTGUIK_WORLD_44 = 204,
+ RTGUIK_WORLD_45 = 205,
+ RTGUIK_WORLD_46 = 206,
+ RTGUIK_WORLD_47 = 207,
+ RTGUIK_WORLD_48 = 208,
+ RTGUIK_WORLD_49 = 209,
+ RTGUIK_WORLD_50 = 210,
+ RTGUIK_WORLD_51 = 211,
+ RTGUIK_WORLD_52 = 212,
+ RTGUIK_WORLD_53 = 213,
+ RTGUIK_WORLD_54 = 214,
+ RTGUIK_WORLD_55 = 215,
+ RTGUIK_WORLD_56 = 216,
+ RTGUIK_WORLD_57 = 217,
+ RTGUIK_WORLD_58 = 218,
+ RTGUIK_WORLD_59 = 219,
+ RTGUIK_WORLD_60 = 220,
+ RTGUIK_WORLD_61 = 221,
+ RTGUIK_WORLD_62 = 222,
+ RTGUIK_WORLD_63 = 223,
+ RTGUIK_WORLD_64 = 224,
+ RTGUIK_WORLD_65 = 225,
+ RTGUIK_WORLD_66 = 226,
+ RTGUIK_WORLD_67 = 227,
+ RTGUIK_WORLD_68 = 228,
+ RTGUIK_WORLD_69 = 229,
+ RTGUIK_WORLD_70 = 230,
+ RTGUIK_WORLD_71 = 231,
+ RTGUIK_WORLD_72 = 232,
+ RTGUIK_WORLD_73 = 233,
+ RTGUIK_WORLD_74 = 234,
+ RTGUIK_WORLD_75 = 235,
+ RTGUIK_WORLD_76 = 236,
+ RTGUIK_WORLD_77 = 237,
+ RTGUIK_WORLD_78 = 238,
+ RTGUIK_WORLD_79 = 239,
+ RTGUIK_WORLD_80 = 240,
+ RTGUIK_WORLD_81 = 241,
+ RTGUIK_WORLD_82 = 242,
+ RTGUIK_WORLD_83 = 243,
+ RTGUIK_WORLD_84 = 244,
+ RTGUIK_WORLD_85 = 245,
+ RTGUIK_WORLD_86 = 246,
+ RTGUIK_WORLD_87 = 247,
+ RTGUIK_WORLD_88 = 248,
+ RTGUIK_WORLD_89 = 249,
+ RTGUIK_WORLD_90 = 250,
+ RTGUIK_WORLD_91 = 251,
+ RTGUIK_WORLD_92 = 252,
+ RTGUIK_WORLD_93 = 253,
+ RTGUIK_WORLD_94 = 254,
+ RTGUIK_WORLD_95 = 255, /* 0xFF */
+
+ /* Numeric keypad */
+ RTGUIK_KP0 = 256,
+ RTGUIK_KP1 = 257,
+ RTGUIK_KP2 = 258,
+ RTGUIK_KP3 = 259,
+ RTGUIK_KP4 = 260,
+ RTGUIK_KP5 = 261,
+ RTGUIK_KP6 = 262,
+ RTGUIK_KP7 = 263,
+ RTGUIK_KP8 = 264,
+ RTGUIK_KP9 = 265,
+ RTGUIK_KP_PERIOD = 266,
+ RTGUIK_KP_DIVIDE = 267, /* ��/ */
+ RTGUIK_KP_MULTIPLY = 268, /* ��* */
+ RTGUIK_KP_MINUS = 269, /* ��- */
+ RTGUIK_KP_PLUS = 270, /* ��+ */
+ RTGUIK_KP_ENTER = 271,
+ RTGUIK_KP_EQUALS = 272, /* ����= */
+
+ /* Arrows + Home/End pad */
+ RTGUIK_UP = 273,
+ RTGUIK_DOWN = 274,
+ RTGUIK_RIGHT = 275,
+ RTGUIK_LEFT = 276,
+ RTGUIK_INSERT = 277,
+ RTGUIK_HOME = 278,
+ RTGUIK_END = 279,
+ RTGUIK_PAGEUP = 280,
+ RTGUIK_PAGEDOWN = 281,
+
+ /* Function keys */
+ RTGUIK_F1 = 282,
+ RTGUIK_F2 = 283,
+ RTGUIK_F3 = 284,
+ RTGUIK_F4 = 285,
+ RTGUIK_F5 = 286,
+ RTGUIK_F6 = 287,
+ RTGUIK_F7 = 288,
+ RTGUIK_F8 = 289,
+ RTGUIK_F9 = 290,
+ RTGUIK_F10 = 291,
+ RTGUIK_F11 = 292,
+ RTGUIK_F12 = 293,
+ RTGUIK_F13 = 294,
+ RTGUIK_F14 = 295,
+ RTGUIK_F15 = 296,
+
+ /* Key state modifier keys */
+ RTGUIK_NUMLOCK = 300,
+ RTGUIK_CAPSLOCK = 301,
+ RTGUIK_SCROLLOCK = 302,
+ RTGUIK_RSHIFT = 303,
+ RTGUIK_LSHIFT = 304,
+ RTGUIK_RCTRL = 305,
+ RTGUIK_LCTRL = 306,
+ RTGUIK_RALT = 307,
+ RTGUIK_LALT = 308,
+ RTGUIK_RMETA = 309,
+ RTGUIK_LMETA = 310,
+ RTGUIK_LSUPER = 311, /* Left "Windows" key */
+ RTGUIK_RSUPER = 312, /* Right "Windows" key */
+ RTGUIK_MODE = 313, /* "Alt Gr" key */
+ RTGUIK_COMPOSE = 314, /* Multi-key compose key */
+
+ /* Miscellaneous function keys */
+ RTGUIK_HELP = 315,
+ RTGUIK_PRINT = 316,
+ RTGUIK_SYSREQ = 317,
+ RTGUIK_BREAK = 318,
+ RTGUIK_MENU = 319,
+ RTGUIK_POWER = 320, /* Power key */
+
+ RTGUIK_LAST
+} RTGUI_KBD_KEY;
+
+/* Enumeration of valid key mods (possibly OR'd together) */
+typedef enum {
+ RTGUI_KMOD_NONE = 0x0000,
+ RTGUI_KMOD_LSHIFT = 0x0001,
+ RTGUI_KMOD_RSHIFT = 0x0002,
+ RTGUI_KMOD_LCTRL = 0x0040,
+ RTGUI_KMOD_RCTRL = 0x0080,
+ RTGUI_KMOD_LALT = 0x0100,
+ RTGUI_KMOD_RALT = 0x0200,
+ RTGUI_KMOD_LMETA = 0x0400,
+ RTGUI_KMOD_RMETA = 0x0800,
+ RTGUI_KMOD_NUM = 0x1000,
+ RTGUI_KMOD_CAPS = 0x2000,
+ RTGUI_KMOD_MODE = 0x4000,
+ RTGUI_KMOD_RESERVED = 0x8000
+} RTGUI_KBD_MOD;
+
+typedef enum {
+ RTGUI_KEYDOWN, /* Keys pressed */
+ RTGUI_KEYUP, /* Keys released */
+} RTGUI_KBD_TYPE;
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/list.h b/components/rtgui_win/include/rtgui/list.h new file mode 100644 index 0000000000..eb8afb62ea --- /dev/null +++ b/components/rtgui_win/include/rtgui/list.h @@ -0,0 +1,66 @@ +/* + * File : list.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_LIST_H__ +#define __RTGUI_LIST_H__ + +#include <rtgui/rtgui.h>
+ +typedef struct rtgui_list_node rtgui_list_t;/* (template),ע����CCList������ */
+ +struct rtgui_list_node +{ + rtgui_list_t* next; +}; +rt_inline void rtgui_list_init(rtgui_list_t *l) +{ + l->next = (rtgui_list_t *)0; +}
+ +rt_inline void rtgui_list_append(rtgui_list_t *l, rtgui_list_t *n) +{ + rtgui_list_t* node; + + node = l; + while(node->next) node = node->next; + + /* append the node to the tail */ + node->next = n; + n->next = (rtgui_list_t*) 0; +} + +rt_inline void list_insert(rtgui_list_t *l, rtgui_list_t *n) +{ + n->next = l->next; + l->next = n; +} + +rt_inline rtgui_list_t* rtgui_list_remove(rtgui_list_t *l, rtgui_list_t *n) +{ + /* remove slist head */ + rtgui_list_t* node = l; + while(node->next && node->next != n) node = node->next; + + /* remove node */ + if(node->next != (rtgui_list_t *)0) node->next = node->next->next; + + return l; +} + +#define rtgui_list_entry(node, type, member) \ + ((type *)((char*)(node)-(unsigned long)(&((type *)0)->member))) + +#define rtgui_list_foreach(node, list) \ + for((node) = (list)->next; (node) != RT_NULL; (node) = (node)->next) + +#endif diff --git a/components/rtgui_win/include/rtgui/region.h b/components/rtgui_win/include/rtgui/region.h new file mode 100644 index 0000000000..8cd14eb83b --- /dev/null +++ b/components/rtgui_win/include/rtgui/region.h @@ -0,0 +1,101 @@ +/* + * File : region.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_REGION_H__ +#define __RTGUI_REGION_H__ + +#include <rtgui/rtgui.h> + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +typedef struct rtgui_region_data rtgui_region_data_t; + +struct rtgui_region_data +{ + rt_uint32_t size; + rt_uint32_t numRects; + /* XXX: And why, exactly, do we have this bogus struct definition? */ + /* rtgui_rect_t rects[size]; in memory but not explicitly declared */ +}; + +typedef struct rtgui_region +{ + rtgui_rect_t extents; + rtgui_region_data_t *data; +}rtgui_region_t; + +typedef enum +{ + RTGUI_REGION_STATUS_FAILURE, + RTGUI_REGION_STATUS_SUCCESS +}rtgui_region_status_t; + +/* creation/destruction */ + +void rtgui_region_init(rtgui_region_t *region); +void rtgui_region_init_rect(rtgui_region_t *region, int x, int y, unsigned int width, unsigned int height); +void rtgui_region_init_with_extents(rtgui_region_t *region, const rtgui_rect_t *extents); +void rtgui_region_fini (rtgui_region_t *region); + +void rtgui_region_translate (rtgui_region_t *region, int x, int y); + +rtgui_region_status_t rtgui_region_copy (rtgui_region_t *dest, rtgui_region_t *source); + +rtgui_region_status_t rtgui_region_intersect (rtgui_region_t *newReg, rtgui_region_t *reg1, rtgui_region_t *reg2); +rtgui_region_status_t rtgui_region_intersect_rect (rtgui_region_t *newReg, rtgui_region_t *reg1, rtgui_rect_t *rect); +rtgui_region_status_t rtgui_region_union (rtgui_region_t *newReg, rtgui_region_t *reg1, rtgui_region_t *reg2); +rtgui_region_status_t rtgui_region_union_rect(rtgui_region_t *dest, rtgui_region_t *source, rtgui_rect_t* rect); +rtgui_region_status_t rtgui_region_subtract (rtgui_region_t *regD, rtgui_region_t *regM, rtgui_region_t *regS); +rtgui_region_status_t rtgui_region_subtract_rect (rtgui_region_t *regD, rtgui_region_t *regM, rtgui_rect_t* rect); +rtgui_region_status_t rtgui_region_inverse (rtgui_region_t *newReg, rtgui_region_t *reg1, rtgui_rect_t *invRect); + +int rtgui_region_num_rects (rtgui_region_t *region); + +rtgui_rect_t* rtgui_region_rects (rtgui_region_t *region); + +#define RTGUI_REGION_OUT 0 +#define RTGUI_REGION_IN 1 +#define RTGUI_REGION_PART 2 + +int rtgui_region_contains_point (rtgui_region_t *region, int x, int y, rtgui_rect_t *box); +int rtgui_region_contains_rectangle (rtgui_region_t *rtgui_region_t, rtgui_rect_t *prect); + +int rtgui_region_not_empty (rtgui_region_t *region); +rtgui_rect_t *rtgui_region_extents (rtgui_region_t *region); + +rtgui_region_status_t rtgui_region_append (rtgui_region_t *dest, rtgui_region_t *region); +rtgui_region_status_t rtgui_region_validate (rtgui_region_t *badreg, int *pOverlap); + +void rtgui_region_reset(rtgui_region_t *region, rtgui_rect_t* rect); +void rtgui_region_empty (rtgui_region_t *region); +void rtgui_region_dump(rtgui_region_t* region); +int rtgui_region_is_flat(rtgui_region_t* region); + +/* rect functions */ +extern rtgui_rect_t rtgui_empty_rect; + +void rtgui_rect_moveto(rtgui_rect_t *rect, int x, int y); +void rtgui_rect_moveto_align(rtgui_rect_t *rect, rtgui_rect_t *to, int align); +void rtgui_rect_inflate(rtgui_rect_t *rect, int d); +void rtgui_rect_intersect(rtgui_rect_t *src, rtgui_rect_t *dest); +int rtgui_rect_contains_point(const rtgui_rect_t *rect, int x, int y); +int rtgui_rect_is_intersect(const rtgui_rect_t *rect1, const rtgui_rect_t *rect2); +int rtgui_rect_is_equal(const rtgui_rect_t *rect1, const rtgui_rect_t *rect2); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif /* _PIXMAN_H_ */ diff --git a/components/rtgui_win/include/rtgui/rtgui.h b/components/rtgui_win/include/rtgui/rtgui.h new file mode 100644 index 0000000000..f68954bd7d --- /dev/null +++ b/components/rtgui_win/include/rtgui/rtgui.h @@ -0,0 +1,154 @@ +/* + * File : rtgui.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_GUI_H__ +#define __RT_GUI_H__ + +#include <rtthread.h> +#include <rtgui/rtgui_config.h>
+#include <string.h> + +#define RT_INT16_MAX 32767 +#define RT_INT16_MIN (-RT_INT16_MAX-1)
+ +#define SELECTED_HEIGHT 20 //��ѡ���еĸ߶�
+
+#define RT_COUNT(array) sizeof(array)/sizeof(array[0])
+ +/* Use new name & namespace */
+typedef struct rtgui_point rtgui_point_t;
+typedef struct rtgui_rect rtgui_rect_t;
+typedef rt_uint32_t rtgui_color_t;
+typedef struct rtgui_event rtgui_event_t;
+typedef struct rtgui_font rtgui_font_t;
+typedef struct rtgui_dc rtgui_dc_t;
+typedef struct rtgui_gc rtgui_gc_t;
+
+typedef void* PVOID;
+typedef struct rtgui_type rtgui_type_t;
+typedef struct rtgui_object rtgui_object_t;
+typedef struct rtgui_widget rtgui_widget_t;
+typedef struct rtgui_panel rtgui_panel_t;
+typedef struct rtgui_container rtgui_container_t;
+typedef struct rtgui_win rtgui_win_t;
+typedef struct rtgui_staticline rtgui_staticline_t;
+typedef struct rtgui_label rtgui_label_t;
+typedef struct rtgui_textbox rtgui_textbox_t;
+typedef struct rtgui_button rtgui_button_t;
+typedef struct rtgui_view rtgui_view_t;
+typedef struct rtgui_checkbox rtgui_checkbox_t;
+typedef struct rtgui_radiobox rtgui_radiobox_t;
+typedef struct rtgui_listbox rtgui_listbox_t;
+typedef struct rtgui_list_view rtgui_list_view_t;
+typedef struct rtgui_fileview rtgui_filelist_view_t;
+typedef struct rtgui_scrollbar rtgui_scrollbar_t;
+typedef struct rtgui_iconbox rtgui_iconbox_t;
+typedef struct rtgui_menu_item rtgui_menu_item_t;
+typedef struct rtgui_menu rtgui_menu_t;
+typedef struct rtgui_combo rtgui_combo_t;
+
+ +typedef rt_bool_t (*rtgui_event_handler_ptr)(PVOID wdt, rtgui_event_t* event); + +struct rtgui_point +{ + rt_int16_t x, y; +};
+ +struct rtgui_rect +{ + rt_int16_t x1, y1, x2, y2; +};
+ +extern rtgui_point_t rtgui_empty_point;
+
+#define rtgui_rect_width(r) ((r).x2 - (r).x1) +#define rtgui_rect_height(r) ((r).y2 - (r).y1)
+
+struct rtgui_gc +{ + /* foreground and background color */ + rtgui_color_t foreground, background; + + /* text style */ + rt_uint16_t textstyle; + /* text align */ + rt_uint16_t textalign; + + /* font */ + struct rtgui_font* font; +};
+ +enum RTGUI_MARGIN_STYLE +{ + RTGUI_MARGIN_LEFT = 0x01, + RTGUI_MARGIN_RIGHT = 0x02, + RTGUI_MARGIN_TOP = 0x04, + RTGUI_MARGIN_BOTTOM = 0x08, + RTGUI_MARGIN_ALL = (RTGUI_MARGIN_LEFT | RTGUI_MARGIN_RIGHT | RTGUI_MARGIN_TOP | RTGUI_MARGIN_BOTTOM) +}; + +enum RTGUI_BORDER_STYLE +{ + RTGUI_BORDER_NONE = 0, + RTGUI_BORDER_SIMPLE, + RTGUI_BORDER_RAISE, + RTGUI_BORDER_SUNKEN, + RTGUI_BORDER_BOX, + RTGUI_BORDER_STATIC, + RTGUI_BORDER_EXTRA, + RTGUI_BORDER_UP, + RTGUI_BORDER_DOWN +}; + +#define RTGUI_BORDER_DEFAULT_WIDTH 2
+#define RTGUI_WIDGET_DEFAULT_MARGIN 3 + +enum RTGUI_ORIENTATION +{ + RTGUI_HORIZONTAL = 0x01, + RTGUI_VERTICAL = 0x02, + RTGUI_ORIENTATION_BOTH = RTGUI_HORIZONTAL | RTGUI_VERTICAL +};
+ +enum RTGUI_ALIGN +{ + RTGUI_ALIGN_NOT = 0x00, + RTGUI_ALIGN_CENTER_HORIZONTAL = 0x01, + RTGUI_ALIGN_LEFT = RTGUI_ALIGN_NOT, + RTGUI_ALIGN_TOP = RTGUI_ALIGN_NOT, + RTGUI_ALIGN_RIGHT = 0x02, + RTGUI_ALIGN_BOTTOM = 0x04, + RTGUI_ALIGN_CENTER_VERTICAL = 0x08, + RTGUI_ALIGN_EXPAND = 0x10, + RTGUI_ALIGN_STRETCH = 0x20, +};
+ +enum RTGUI_TEXTSTYLE +{ + RTGUI_TEXTSTYLE_NORMAL = 0x00, + RTGUI_TEXTSTYLE_DRAW_BACKGROUND = 0x01, + RTGUI_TEXTSTYLE_SHADOW = 0x02, + RTGUI_TEXTSTYLE_OUTLINE = 0x04, +}; + +enum RTGUI_MODAL_CODE +{ + RTGUI_MODAL_OK, + RTGUI_MODAL_CANCEL +}; +typedef enum RTGUI_MODAL_CODE rtgui_modal_code_t; + +#include <rtgui/rtgui_object.h>
+ +#endif diff --git a/components/rtgui_win/include/rtgui/rtgui_config.h b/components/rtgui_win/include/rtgui/rtgui_config.h new file mode 100644 index 0000000000..ecdd03fc67 --- /dev/null +++ b/components/rtgui_win/include/rtgui/rtgui_config.h @@ -0,0 +1,41 @@ +/*
+ * File : rtgui_config.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
+ * 2010-02-08 Bernard move some RTGUI options to bsp
+ */
+
+#ifndef __RTGUI_CONFIG_H__
+#define __RTGUI_CONFIG_H__
+
+/* RTGUI options */
+
+/* native running under RT-Thread */
+#ifndef RT_USING_DFS
+ #undef RTGUI_USING_DFS_FILERW
+ #undef RTGUI_USING_HZ_FILE
+#endif
+
+#define RTGUI_USING_WINMOVE
+
+//#define RTGUI_IMAGE_BMP
+
+#define RTGUI_DEFAULT_FONT_SIZE 16
+
+#define RTGUI_SVR_THREAD_PRIORITY 3
+#define RTGUI_SVR_THREAD_TIMESLICE 5
+#ifdef RTGUI_USING_SMALL_SIZE
+#define RTGUI_SVR_THREAD_STACK_SIZE 1024
+#else
+#define RTGUI_SVR_THREAD_STACK_SIZE 4096
+#endif
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/rtgui_object.h b/components/rtgui_win/include/rtgui/rtgui_object.h new file mode 100644 index 0000000000..1ff0c6c947 --- /dev/null +++ b/components/rtgui_win/include/rtgui/rtgui_object.h @@ -0,0 +1,107 @@ +/*
+ * File : rtgui_object.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_OBJECT_H__
+#define __RTGUI_OBJECT_H__
+
+
+#include <rtthread.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* rtgui object type */
+#define RTGUI_CONTAINER_OF(obj, type, member) \
+ ((type *)((char *)(obj) - (unsigned long)(&((type *)0)->member)))
+
+/** Casts the function pointer to an rtgui_constructor */
+#define RTGUI_CONSTRUCTOR(c) ((rtgui_constructor_t)(c))
+/** Casts the function pointer to an rtgui_constructor */
+#define RTGUI_DESTRUCTOR(d) ((rtgui_destructor_t)(d))
+
+/* pre-definetion */
+typedef struct rtgui_type rtgui_type_t;
+typedef struct rtgui_object rtgui_object_t;
+
+typedef void (*rtgui_constructor_t)(rtgui_object_t *object);
+typedef void (*rtgui_destructor_t)(rtgui_object_t *object);
+
+/* rtgui type structure */
+struct rtgui_type
+{
+ /* type name */
+ char* name;
+
+ /* hierarchy and depth */
+ rtgui_type_t **hierarchy;
+ int hierarchy_depth;
+
+ /* constructor and destructor */
+ rtgui_constructor_t constructor;
+ rtgui_destructor_t destructor;
+
+ /* size of type */
+ int size;
+};
+typedef struct rtgui_type rtgui_type_t;
+
+rtgui_type_t *rtgui_type_create(const char *type_name, rtgui_type_t *parent_type,
+ int type_size, rtgui_constructor_t c,
+ rtgui_destructor_t d);
+void rtgui_type_destroy(rtgui_type_t *type);
+
+void rtgui_type_object_construct(rtgui_type_t *type, rtgui_object_t *object);
+void rtgui_type_destructors_call(rtgui_type_t *type, rtgui_object_t *object);
+rt_bool_t rtgui_type_inherits_from(rtgui_type_t *type, rtgui_type_t *parent);
+rtgui_type_t *rtgui_type_parent_type_get(rtgui_type_t *type);
+const char *rtgui_type_name_get(rtgui_type_t *type);
+rtgui_type_t *GetTypeFromName(const char *name);
+
+#ifdef RTGUI_USING_CAST_CHECK
+ #define RTGUI_OBJECT_CAST(obj, rtgui_type_t, c_type) \
+ ((c_type *)rtgui_object_check_cast((rtgui_object_t *)(obj), (rtgui_type_t)))
+#else
+ #define RTGUI_OBJECT_CAST(obj, rtgui_type_t, c_type) ((c_type *)(obj))
+#endif
+
+#define RTGUI_OBJECT_CHECK_TYPE(_obj, _type) \
+ (rtgui_type_inherits_from(((rtgui_object_t *)(_obj))->type, (_type)))
+
+/** Gets the type of an object */
+#define RTGUI_OBJECT_TYPE (rtgui_object_type_get())
+/** Casts the object to an rtgui_object_t */
+#define RTGUI_OBJECT(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_OBJECT_TYPE, rtgui_object_t))
+/** Checks if the object is an rtgui_Object */
+#define RTGUI_IS_OBJECT(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_OBJECT_TYPE))
+
+/* rtgui base object */
+struct rtgui_object
+{
+ /* object type */
+ rtgui_type_t* type;
+
+ rt_bool_t is_static;
+};
+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);
+
+rtgui_object_t *rtgui_object_check_cast(rtgui_object_t *object, rtgui_type_t *type);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/rtgui_server.h b/components/rtgui_win/include/rtgui/rtgui_server.h new file mode 100644 index 0000000000..234d433eb8 --- /dev/null +++ b/components/rtgui_win/include/rtgui/rtgui_server.h @@ -0,0 +1,32 @@ +/*
+ * File : rtgui_server.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_SERVER_H__
+#define __RTGUI_SERVER_H__
+
+#include <rtgui/list.h>
+
+/* RTGUI server definitions */
+
+#define WINTITLE_HEIGHT 20
+#define WINTITLE_BORDER_SIZE 2
+
+/* top win manager init */
+void rtgui_win_init(void);
+void rtgui_server_init(void);
+
+/* post an event to server */
+void rtgui_server_post_event(rtgui_event_t* event, rt_size_t size);
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/rtgui_system.h b/components/rtgui_win/include/rtgui/rtgui_system.h new file mode 100644 index 0000000000..655834d68b --- /dev/null +++ b/components/rtgui_win/include/rtgui/rtgui_system.h @@ -0,0 +1,94 @@ +/*
+ * File : rtgui_system.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_SYSTEM_H__
+#define __RTGUI_SYSTEM_H__
+
+#include <rtthread.h>
+#include <rtgui/rtgui.h>
+
+#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 */
+ struct rt_thread* tid;
+
+ /* the message queue of thread */
+ struct rt_messagequeue* mq;
+
+ /* the owner of thread */
+ PVOID widget;
+ /* event buffer */
+ rt_uint8_t event_buffer[RTGUI_EVENT_BUFFER_SIZE];
+
+ /* on idle event handler */
+ void (*on_idle)(PVOID wdt, rtgui_event_t *event);
+};
+typedef struct rtgui_thread rtgui_thread_t;
+
+typedef struct rtgui_timer rtgui_timer_t;
+typedef void (*rtgui_timeout_func)(rtgui_timer_t* timer, void* parameter);
+typedef void (*rtgui_idle_func)(PVOID wdt, rtgui_event_t *event);
+
+struct rtgui_timer
+{
+ /* context thread id */
+ struct rt_thread* tid;
+ /* rt timer */
+ struct rt_timer timer;
+
+ /* timeout function and user data */
+ rtgui_timeout_func timeout;
+ void* user_data;
+};
+
+
+rtgui_timer_t* rtgui_timer_create(rt_int32_t time, rt_int32_t flag, rtgui_timeout_func timeout, void* parameter);
+void rtgui_timer_destory(rtgui_timer_t* timer);
+
+void rtgui_timer_start(rtgui_timer_t* timer);
+void rtgui_timer_stop(rtgui_timer_t* timer);
+
+void rtgui_thread_register(struct rt_thread* tid, struct rt_messagequeue* mq);
+void rtgui_thread_deregister(struct rt_thread* tid);
+rtgui_thread_t* rtgui_thread_self(void);
+void rtgui_thread_set_onidle(rtgui_idle_func onidle);
+rtgui_idle_func rtgui_thread_get_onidle(void);
+
+struct rt_thread* rtgui_thread_get_server(void);
+
+void rtgui_thread_set_widget(PVOID widget);
+PVOID rtgui_thread_get_widget(void);
+
+rt_err_t rtgui_thread_send(struct rt_thread* tid, rtgui_event_t* event, rt_size_t event_size);
+rt_err_t rtgui_thread_send_urgent(struct rt_thread* tid, rtgui_event_t* event, rt_size_t event_size);
+rt_err_t rtgui_thread_send_sync(struct rt_thread* tid, rtgui_event_t* event, rt_size_t event_size);
+rt_err_t rtgui_thread_recv(rtgui_event_t* event, rt_size_t event_size);
+rt_err_t rtgui_thread_recv_nosuspend(rtgui_event_t* event, rt_size_t event_size);
+rt_err_t rtgui_thread_recv_filter(rt_uint32_t type, rtgui_event_t* event, rt_size_t event_size);
+rt_err_t rtgui_thread_ack(rtgui_event_t* event, rt_err_t errcode);
+
+/* rtgui system initialization function */
+void rtgui_system_server_init(void);
+
+void* rtgui_malloc(rt_size_t size);
+void rtgui_free(void* ptr);
+void* rtgui_realloc(void* ptr, rt_size_t size);
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/rtgui_theme.h b/components/rtgui_win/include/rtgui/rtgui_theme.h new file mode 100644 index 0000000000..2fddf29951 --- /dev/null +++ b/components/rtgui_win/include/rtgui/rtgui_theme.h @@ -0,0 +1,80 @@ +/*
+ * File : rtgui_theme.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_THEME_H__
+#define __RTGUI_THEME_H__
+
+#include <rtgui/rtgui.h>
+
+#define CHECK_BOX_W 13
+#define CHECK_BOX_H 13
+
+#define RADIO_BOX_W 12
+#define RADIO_BOX_H 12
+
+#include <rtgui/widgets/widget.h>
+#include <rtgui/widgets/container.h>
+#include <rtgui/widgets/label.h>
+#include <rtgui/widgets/button.h>
+#include <rtgui/widgets/textbox.h>
+#include <rtgui/widgets/iconbox.h>
+#include <rtgui/widgets/checkbox.h>
+#include <rtgui/widgets/radiobox.h>
+#include <rtgui/widgets/listbox.h>
+#include <rtgui/widgets/scrollbar.h>
+#include <rtgui/widgets/slider.h>
+#include <rtgui/widgets/progressbar.h>
+#include <rtgui/widgets/staticline.h>
+#include <rtgui/widgets/window.h>
+#include <rtgui/widgets/view.h>
+#include <rtgui/widgets/menu.h>
+#include <rtgui/widgets/combobox.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void rtgui_system_theme_init(void);
+
+void rtgui_theme_draw_win_closebox(rtgui_win_t *win);
+void rtgui_theme_draw_win_maxbox(rtgui_win_t *win);
+void rtgui_theme_draw_win_minbox(rtgui_win_t *win);
+void rtgui_theme_draw_win_title(rtgui_win_t *win);
+void rtgui_theme_draw_win(rtgui_win_t* win);
+void rtgui_theme_draw_button(rtgui_button_t* btn);
+void rtgui_theme_draw_label(rtgui_label_t* label);
+void rtgui_theme_draw_textbox(rtgui_textbox_t* box);
+void rtgui_theme_draw_iconbox(rtgui_iconbox_t* iconbox);
+void rtgui_theme_draw_checkbox(rtgui_checkbox_t* checkbox);
+void rtgui_theme_draw_radiobutton(rtgui_radiobox_t* rbox, rt_uint32_t index); +void rtgui_theme_draw_radiobox(rtgui_radiobox_t* rbox);
+void rtgui_theme_draw_menu(rtgui_menu_t* menu);
+void rtgui_theme_draw_menu_item(rtgui_menu_t* menu, rtgui_menu_item_t *item);
+void rtgui_theme_draw_slider(rtgui_slider_t* slider);
+void rtgui_theme_draw_scrollbar(rtgui_scrollbar_t* bar);
+void rtgui_theme_draw_progressbar(rtgui_progressbar_t* bar);
+void rtgui_theme_draw_staticline(rtgui_staticline_t* sline);
+
+void rtgui_theme_draw_selected(rtgui_dc_t *dc, rtgui_color_t *color, rtgui_rect_t *rect);
+
+rtgui_color_t rtgui_theme_default_bc(void);//default black ground color
+rtgui_color_t rtgui_theme_default_fc(void);
+void rtgui_theme_draw_panel(rtgui_panel_t *panel);
+void rtgui_theme_draw_combo(rtgui_combo_t *cbo);
+void rtgui_theme_draw_combo_downarrow(rtgui_combo_t *cbo);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/rtgui_xml.h b/components/rtgui_win/include/rtgui/rtgui_xml.h new file mode 100644 index 0000000000..abdc5c79af --- /dev/null +++ b/components/rtgui_win/include/rtgui/rtgui_xml.h @@ -0,0 +1,34 @@ +#ifndef __RTGUI_XML_H__ +#define __RTGUI_XML_H__ + +#include <rtgui/rtgui.h> + +/* Types of events: start element, end element, text, attr name, attr + val and start/end document. Other events can be ignored! */ +enum { + EVENT_START = 0, /* Start tag */ + EVENT_END, /* End tag */ + EVENT_TEXT, /* Text */ + EVENT_NAME, /* Attribute name */ + EVENT_VAL, /* Attribute value */ + EVENT_END_DOC, /* End of document */ + EVENT_COPY, /* Internal only; copies to internal buffer */ + EVENT_NONE /* Internal only; should never see this event */ +}; + +/* xml structure typedef */ +typedef struct rtgui_xml rtgui_xml_t; +typedef int (*XML_handle)(rt_uint8_t event, const char* text, rt_size_t len, void* user); + +/* create a xml parser context */ +rtgui_xml_t* rtgui_xml_create(rt_size_t buffer_size, XML_handle handler, void* user); +/* destroy a xml parser context */ +void rtgui_xml_destroy(rtgui_xml_t* rtgui_xml); + +/* parse xml buffer */ +int rtgui_xml_parse(rtgui_xml_t* rtgui_xml, const char* buf, rt_size_t len); + +/* event string */ +const char* rtgui_xml_event_str(rt_uint8_t event); + +#endif diff --git a/components/rtgui_win/include/rtgui/tree.h b/components/rtgui_win/include/rtgui/tree.h new file mode 100644 index 0000000000..f447c3c382 --- /dev/null +++ b/components/rtgui_win/include/rtgui/tree.h @@ -0,0 +1,748 @@ +/* $NetBSD: tree.h,v 1.8 2004/03/28 19:38:30 provos Exp $ */ +/* $OpenBSD: tree.h,v 1.7 2002/10/17 21:51:54 art Exp $ */ +/* $FreeBSD$ */ + +/*- + * Copyright 2002 Niels Provos <[email protected]> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _SYS_TREE_H_ +#define _SYS_TREE_H_
+ +#ifndef NULL
+#define NULL NULL
+#endif +// #include <sys/cdefs.h> + +/* + * This file defines data structures for different types of trees: + * splay trees and red-black trees. + * + * A splay tree is a self-organizing data structure. Every operation + * on the tree causes a splay to happen. The splay moves the requested + * node to the root of the tree and partly rebalances it. + * + * This has the benefit that request locality causes faster lookups as + * the requested nodes move to the top of the tree. On the other hand, + * every lookup causes memory writes. + * + * The Balance Theorem bounds the total access time for m operations + * and n inserts on an initially empty tree as O((m + n)lg n). The + * amortized cost for a sequence of m accesses to a splay tree is O(lg n); + * + * A red-black tree is a binary search tree with the node color as an + * extra attribute. It fulfills a set of conditions: + * - every search path from the root to a leaf consists of the + * same number of black nodes, + * - each red node (except for the root) has a black parent, + * - each leaf node is black. + * + * Every operation on a red-black tree is bounded as O(lg n). + * The maximum height of a red-black tree is 2lg (n+1). + */ + +#define SPLAY_HEAD(name, type) \ +struct name { \ + struct type *sph_root; /* root of the tree */ \ +} + +#define SPLAY_INITIALIZER(root) \ + { RT_NULL } + +#define SPLAY_INIT(root) do { \ + (root)->sph_root = RT_NULL; \ +} while(/*CONSTCOND*/ 0) + +#define SPLAY_ENTRY(type) \ +struct { \ + struct type *spe_left; /* left element */ \ + struct type *spe_right; /* right element */ \ +} + +#define SPLAY_LEFT(elm, field) (elm)->field.spe_left +#define SPLAY_RIGHT(elm, field) (elm)->field.spe_right +#define SPLAY_ROOT(head) (head)->sph_root +#define SPLAY_EMPTY(head) (SPLAY_ROOT(head) == RT_NULL) + +/* SPLAY_ROTATE_{LEFT,RIGHT} expect that tmp hold SPLAY_{RIGHT,LEFT} */ +#define SPLAY_ROTATE_RIGHT(head, tmp, field) do { \ + SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(tmp, field); \ + SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ + (head)->sph_root = tmp; \ +} while(/*CONSTCOND*/ 0) + +#define SPLAY_ROTATE_LEFT(head, tmp, field) do { \ + SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(tmp, field); \ + SPLAY_LEFT(tmp, field) = (head)->sph_root; \ + (head)->sph_root = tmp; \ +} while(/*CONSTCOND*/ 0) + +#define SPLAY_LINKLEFT(head, tmp, field) do { \ + SPLAY_LEFT(tmp, field) = (head)->sph_root; \ + tmp = (head)->sph_root; \ + (head)->sph_root = SPLAY_LEFT((head)->sph_root, field); \ +} while(/*CONSTCOND*/ 0) + +#define SPLAY_LINKRIGHT(head, tmp, field) do { \ + SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ + tmp = (head)->sph_root; \ + (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field); \ +} while(/*CONSTCOND*/ 0) + +#define SPLAY_ASSEMBLE(head, node, left, right, field) do { \ + SPLAY_RIGHT(left, field) = SPLAY_LEFT((head)->sph_root, field); \ + SPLAY_LEFT(right, field) = SPLAY_RIGHT((head)->sph_root, field);\ + SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(node, field); \ + SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(node, field); \ +} while(/*CONSTCOND*/ 0) + +/* Generates prototypes and inline functions */ + +#define SPLAY_PROTOTYPE(name, type, field, cmp) \ +void name##_SPLAY(struct name *, struct type *); \ +void name##_SPLAY_MINMAX(struct name *, int); \ +struct type *name##_SPLAY_INSERT(struct name *, struct type *); \ +struct type *name##_SPLAY_REMOVE(struct name *, struct type *); \ + \ +/* Finds the node with the same key as elm */ \ +static __inline struct type * \ +name##_SPLAY_FIND(struct name *head, struct type *elm) \ +{ \ + if(SPLAY_EMPTY(head)) \ + return(RT_NULL); \ + name##_SPLAY(head, elm); \ + if((cmp)(elm, (head)->sph_root) == 0) \ + return (head->sph_root); \ + return (RT_NULL); \ +} \ + \ +static __inline struct type * \ +name##_SPLAY_NEXT(struct name *head, struct type *elm) \ +{ \ + name##_SPLAY(head, elm); \ + if(SPLAY_RIGHT(elm, field) != RT_NULL) { \ + elm = SPLAY_RIGHT(elm, field); \ + while(SPLAY_LEFT(elm, field) != RT_NULL) { \ + elm = SPLAY_LEFT(elm, field); \ + } \ + } else \ + elm = RT_NULL; \ + return (elm); \ +} \ + \ +static __inline struct type * \ +name##_SPLAY_MIN_MAX(struct name *head, int val) \ +{ \ + name##_SPLAY_MINMAX(head, val); \ + return (SPLAY_ROOT(head)); \ +} + +/* Main splay operation. + * Moves node close to the key of elm to top + */ +#define SPLAY_GENERATE(name, type, field, cmp) \ +struct type * \ +name##_SPLAY_INSERT(struct name *head, struct type *elm) \ +{ \ + if(SPLAY_EMPTY(head)) { \ + SPLAY_LEFT(elm, field) = SPLAY_RIGHT(elm, field) = RT_NULL; \ + } else { \ + int __comp; \ + name##_SPLAY(head, elm); \ + __comp = (cmp)(elm, (head)->sph_root); \ + if(__comp < 0) { \ + SPLAY_LEFT(elm, field) = SPLAY_LEFT((head)->sph_root, field);\ + SPLAY_RIGHT(elm, field) = (head)->sph_root; \ + SPLAY_LEFT((head)->sph_root, field) = RT_NULL; \ + } else if(__comp > 0) { \ + SPLAY_RIGHT(elm, field) = SPLAY_RIGHT((head)->sph_root, field);\ + SPLAY_LEFT(elm, field) = (head)->sph_root; \ + SPLAY_RIGHT((head)->sph_root, field) = RT_NULL; \ + } else \ + return ((head)->sph_root); \ + } \ + (head)->sph_root = (elm); \ + return (RT_NULL); \ +} \ + \ +struct type * \ +name##_SPLAY_REMOVE(struct name *head, struct type *elm) \ +{ \ + struct type *__tmp; \ + if(SPLAY_EMPTY(head)) \ + return (RT_NULL); \ + name##_SPLAY(head, elm); \ + if((cmp)(elm, (head)->sph_root) == 0) { \ + if(SPLAY_LEFT((head)->sph_root, field) == RT_NULL) { \ + (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field);\ + } else { \ + __tmp = SPLAY_RIGHT((head)->sph_root, field); \ + (head)->sph_root = SPLAY_LEFT((head)->sph_root, field);\ + name##_SPLAY(head, elm); \ + SPLAY_RIGHT((head)->sph_root, field) = __tmp; \ + } \ + return (elm); \ + } \ + return (RT_NULL); \ +} \ + \ +void \ +name##_SPLAY(struct name *head, struct type *elm) \ +{ \ + struct type __node, *__left, *__right, *__tmp; \ + int __comp; \ +\ + SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = RT_NULL;\ + __left = __right = &__node; \ +\ + while((__comp = (cmp)(elm, (head)->sph_root)) != 0) { \ + if(__comp < 0) { \ + __tmp = SPLAY_LEFT((head)->sph_root, field); \ + if(__tmp == RT_NULL) \ + break; \ + if((cmp)(elm, __tmp) < 0){ \ + SPLAY_ROTATE_RIGHT(head, __tmp, field); \ + if(SPLAY_LEFT((head)->sph_root, field) == RT_NULL)\ + break; \ + } \ + SPLAY_LINKLEFT(head, __right, field); \ + } else if(__comp > 0) { \ + __tmp = SPLAY_RIGHT((head)->sph_root, field); \ + if(__tmp == RT_NULL) \ + break; \ + if((cmp)(elm, __tmp) > 0){ \ + SPLAY_ROTATE_LEFT(head, __tmp, field); \ + if(SPLAY_RIGHT((head)->sph_root, field) == RT_NULL)\ + break; \ + } \ + SPLAY_LINKRIGHT(head, __left, field); \ + } \ + } \ + SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \ +} \ + \ +/* Splay with either the minimum or the maximum element \ + * Used to find minimum or maximum element in tree. \ + */ \ +void name##_SPLAY_MINMAX(struct name *head, int __comp) \ +{ \ + struct type __node, *__left, *__right, *__tmp; \ +\ + SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = RT_NULL;\ + __left = __right = &__node; \ +\ + while(1) { \ + if(__comp < 0) { \ + __tmp = SPLAY_LEFT((head)->sph_root, field); \ + if(__tmp == RT_NULL) \ + break; \ + if(__comp < 0){ \ + SPLAY_ROTATE_RIGHT(head, __tmp, field); \ + if(SPLAY_LEFT((head)->sph_root, field) == RT_NULL)\ + break; \ + } \ + SPLAY_LINKLEFT(head, __right, field); \ + } else if(__comp > 0) { \ + __tmp = SPLAY_RIGHT((head)->sph_root, field); \ + if(__tmp == RT_NULL) \ + break; \ + if(__comp > 0) { \ + SPLAY_ROTATE_LEFT(head, __tmp, field); \ + if(SPLAY_RIGHT((head)->sph_root, field) == RT_NULL)\ + break; \ + } \ + SPLAY_LINKRIGHT(head, __left, field); \ + } \ + } \ + SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \ +} + +#define SPLAY_NEGINF -1 +#define SPLAY_INF 1 + +#define SPLAY_INSERT(name, x, y) name##_SPLAY_INSERT(x, y) +#define SPLAY_REMOVE(name, x, y) name##_SPLAY_REMOVE(x, y) +#define SPLAY_FIND(name, x, y) name##_SPLAY_FIND(x, y) +#define SPLAY_NEXT(name, x, y) name##_SPLAY_NEXT(x, y) +#define SPLAY_MIN(name, x) (SPLAY_EMPTY(x) ? RT_NULL \ + : name##_SPLAY_MIN_MAX(x, SPLAY_NEGINF)) +#define SPLAY_MAX(name, x) (SPLAY_EMPTY(x) ? RT_NULL \ + : name##_SPLAY_MIN_MAX(x, SPLAY_INF)) + +#define SPLAY_FOREACH(x, name, head) \ + for((x) = SPLAY_MIN(name, head); \ + (x) != RT_NULL; \ + (x) = SPLAY_NEXT(name, head, x)) + +/* Macros that define a red-black tree */ +#define RB_HEAD(name, type) \ +struct name { \ + struct type *rbh_root; /* root of the tree */ \ +} + +#define RB_INITIALIZER(root) \ + { RT_NULL } + +#define RB_INIT(root) do { \ + (root)->rbh_root = RT_NULL; \ +} while(/*CONSTCOND*/ 0) + +#define RB_BLACK 0 +#define RB_RED 1 +#define RB_ENTRY(type) \ +struct { \ + struct type *rbe_left; /* left element */ \ + struct type *rbe_right; /* right element */ \ + struct type *rbe_parent; /* parent element */ \ + int rbe_color; /* node color */ \ +} + +#define RB_LEFT(elm, field) (elm)->field.rbe_left +#define RB_RIGHT(elm, field) (elm)->field.rbe_right +#define RB_PARENT(elm, field) (elm)->field.rbe_parent +#define RB_COLOR(elm, field) (elm)->field.rbe_color +#define RB_ROOT(head) (head)->rbh_root +#define RB_EMPTY(head) (RB_ROOT(head) == RT_NULL) + +#define RB_SET(elm, parent, field) do { \ + RB_PARENT(elm, field) = parent; \ + RB_LEFT(elm, field) = RB_RIGHT(elm, field) = RT_NULL; \ + RB_COLOR(elm, field) = RB_RED; \ +} while(/*CONSTCOND*/ 0) + +#define RB_SET_BLACKRED(black, red, field) do { \ + RB_COLOR(black, field) = RB_BLACK; \ + RB_COLOR(red, field) = RB_RED; \ +} while(/*CONSTCOND*/ 0) + +#ifndef RB_AUGMENT +#define RB_AUGMENT(x) do {} while(0) +#endif + +#define RB_ROTATE_LEFT(head, elm, tmp, field) do { \ + (tmp) = RB_RIGHT(elm, field); \ + if((RB_RIGHT(elm, field) = RB_LEFT(tmp, field)) != RT_NULL) { \ + RB_PARENT(RB_LEFT(tmp, field), field) = (elm); \ + } \ + RB_AUGMENT(elm); \ + if((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != RT_NULL) { \ + if((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \ + RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \ + else \ + RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \ + } else \ + (head)->rbh_root = (tmp); \ + RB_LEFT(tmp, field) = (elm); \ + RB_PARENT(elm, field) = (tmp); \ + RB_AUGMENT(tmp); \ + if((RB_PARENT(tmp, field))) \ + RB_AUGMENT(RB_PARENT(tmp, field)); \ +} while(/*CONSTCOND*/ 0) + +#define RB_ROTATE_RIGHT(head, elm, tmp, field) do { \ + (tmp) = RB_LEFT(elm, field); \ + if((RB_LEFT(elm, field) = RB_RIGHT(tmp, field)) != RT_NULL) { \ + RB_PARENT(RB_RIGHT(tmp, field), field) = (elm); \ + } \ + RB_AUGMENT(elm); \ + if((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != RT_NULL) { \ + if((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \ + RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \ + else \ + RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \ + } else \ + (head)->rbh_root = (tmp); \ + RB_RIGHT(tmp, field) = (elm); \ + RB_PARENT(elm, field) = (tmp); \ + RB_AUGMENT(tmp); \ + if((RB_PARENT(tmp, field))) \ + RB_AUGMENT(RB_PARENT(tmp, field)); \ +} while(/*CONSTCOND*/ 0) + +/* Generates prototypes and inline functions */ +#define RB_PROTOTYPE(name, type, field, cmp) \ + RB_PROTOTYPE_INTERNAL(name, type, field, cmp,) +#define RB_PROTOTYPE_STATIC(name, type, field, cmp) \ + RB_PROTOTYPE_INTERNAL(name, type, field, cmp, __unused static) +#define RB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr) \ +attr void name##_RB_INSERT_COLOR(struct name *, struct type *); \ +attr void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *);\ +attr struct type *name##_RB_REMOVE(struct name *, struct type *); \ +attr struct type *name##_RB_INSERT(struct name *, struct type *); \ +attr struct type *name##_RB_FIND(struct name *, struct type *); \ +attr struct type *name##_RB_NFIND(struct name *, struct type *); \ +attr struct type *name##_RB_NEXT(struct type *); \ +attr struct type *name##_RB_PREV(struct type *); \ +attr struct type *name##_RB_MINMAX(struct name *, int); \ + \ + +/* Main rb operation. + * Moves node close to the key of elm to top + */ +#define RB_GENERATE(name, type, field, cmp) \ + RB_GENERATE_INTERNAL(name, type, field, cmp,) +#define RB_GENERATE_STATIC(name, type, field, cmp) \ + RB_GENERATE_INTERNAL(name, type, field, cmp, __unused static) +#define RB_GENERATE_INTERNAL(name, type, field, cmp, attr) \ +attr void \ +name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \ +{ \ + struct type *parent, *gparent, *tmp; \ + while((parent = RB_PARENT(elm, field)) != RT_NULL && \ + RB_COLOR(parent, field) == RB_RED) { \ + gparent = RB_PARENT(parent, field); \ + if(parent == RB_LEFT(gparent, field)) { \ + tmp = RB_RIGHT(gparent, field); \ + if(tmp && RB_COLOR(tmp, field) == RB_RED) { \ + RB_COLOR(tmp, field) = RB_BLACK; \ + RB_SET_BLACKRED(parent, gparent, field);\ + elm = gparent; \ + continue; \ + } \ + if(RB_RIGHT(parent, field) == elm) { \ + RB_ROTATE_LEFT(head, parent, tmp, field);\ + tmp = parent; \ + parent = elm; \ + elm = tmp; \ + } \ + RB_SET_BLACKRED(parent, gparent, field); \ + RB_ROTATE_RIGHT(head, gparent, tmp, field); \ + } else { \ + tmp = RB_LEFT(gparent, field); \ + if(tmp && RB_COLOR(tmp, field) == RB_RED) { \ + RB_COLOR(tmp, field) = RB_BLACK; \ + RB_SET_BLACKRED(parent, gparent, field);\ + elm = gparent; \ + continue; \ + } \ + if(RB_LEFT(parent, field) == elm) { \ + RB_ROTATE_RIGHT(head, parent, tmp, field);\ + tmp = parent; \ + parent = elm; \ + elm = tmp; \ + } \ + RB_SET_BLACKRED(parent, gparent, field); \ + RB_ROTATE_LEFT(head, gparent, tmp, field); \ + } \ + } \ + RB_COLOR(head->rbh_root, field) = RB_BLACK; \ +} \ + \ +attr void \ +name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm) \ +{ \ + struct type *tmp; \ + while((elm == RT_NULL || RB_COLOR(elm, field) == RB_BLACK) && \ + elm != RB_ROOT(head)) { \ + if(RB_LEFT(parent, field) == elm) { \ + tmp = RB_RIGHT(parent, field); \ + if(RB_COLOR(tmp, field) == RB_RED) { \ + RB_SET_BLACKRED(tmp, parent, field); \ + RB_ROTATE_LEFT(head, parent, tmp, field);\ + tmp = RB_RIGHT(parent, field); \ + } \ + if((RB_LEFT(tmp, field) == RT_NULL || \ + RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) &&\ + (RB_RIGHT(tmp, field) == RT_NULL || \ + RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) {\ + RB_COLOR(tmp, field) = RB_RED; \ + elm = parent; \ + parent = RB_PARENT(elm, field); \ + } else { \ + if(RB_RIGHT(tmp, field) == RT_NULL || \ + RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK) {\ + struct type *oleft; \ + if((oleft = RB_LEFT(tmp, field)) \ + != RT_NULL) \ + RB_COLOR(oleft, field) = RB_BLACK;\ + RB_COLOR(tmp, field) = RB_RED; \ + RB_ROTATE_RIGHT(head, tmp, oleft, field);\ + tmp = RB_RIGHT(parent, field); \ + } \ + RB_COLOR(tmp, field) = RB_COLOR(parent, field);\ + RB_COLOR(parent, field) = RB_BLACK; \ + if(RB_RIGHT(tmp, field)) \ + RB_COLOR(RB_RIGHT(tmp, field), field) = RB_BLACK;\ + RB_ROTATE_LEFT(head, parent, tmp, field);\ + elm = RB_ROOT(head); \ + break; \ + } \ + } else { \ + tmp = RB_LEFT(parent, field); \ + if(RB_COLOR(tmp, field) == RB_RED) { \ + RB_SET_BLACKRED(tmp, parent, field); \ + RB_ROTATE_RIGHT(head, parent, tmp, field);\ + tmp = RB_LEFT(parent, field); \ + } \ + if((RB_LEFT(tmp, field) == RT_NULL || \ + RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) &&\ + (RB_RIGHT(tmp, field) == RT_NULL || \ + RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) {\ + RB_COLOR(tmp, field) = RB_RED; \ + elm = parent; \ + parent = RB_PARENT(elm, field); \ + } else { \ + if(RB_LEFT(tmp, field) == RT_NULL || \ + RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) {\ + struct type *oright; \ + if((oright = RB_RIGHT(tmp, field)) \ + != RT_NULL) \ + RB_COLOR(oright, field) = RB_BLACK;\ + RB_COLOR(tmp, field) = RB_RED; \ + RB_ROTATE_LEFT(head, tmp, oright, field);\ + tmp = RB_LEFT(parent, field); \ + } \ + RB_COLOR(tmp, field) = RB_COLOR(parent, field);\ + RB_COLOR(parent, field) = RB_BLACK; \ + if(RB_LEFT(tmp, field)) \ + RB_COLOR(RB_LEFT(tmp, field), field) = RB_BLACK;\ + RB_ROTATE_RIGHT(head, parent, tmp, field);\ + elm = RB_ROOT(head); \ + break; \ + } \ + } \ + } \ + if(elm) \ + RB_COLOR(elm, field) = RB_BLACK; \ +} \ + \ +attr struct type * \ +name##_RB_REMOVE(struct name *head, struct type *elm) \ +{ \ + struct type *child, *parent, *old = elm; \ + int color; \ + if(RB_LEFT(elm, field) == RT_NULL) \ + child = RB_RIGHT(elm, field); \ + else if(RB_RIGHT(elm, field) == RT_NULL) \ + child = RB_LEFT(elm, field); \ + else { \ + struct type *left; \ + elm = RB_RIGHT(elm, field); \ + while((left = RB_LEFT(elm, field)) != RT_NULL) \ + elm = left; \ + child = RB_RIGHT(elm, field); \ + parent = RB_PARENT(elm, field); \ + color = RB_COLOR(elm, field); \ + if(child) \ + RB_PARENT(child, field) = parent; \ + if(parent) { \ + if(RB_LEFT(parent, field) == elm) \ + RB_LEFT(parent, field) = child; \ + else \ + RB_RIGHT(parent, field) = child; \ + RB_AUGMENT(parent); \ + } else \ + RB_ROOT(head) = child; \ + if(RB_PARENT(elm, field) == old) \ + parent = elm; \ + (elm)->field = (old)->field; \ + if(RB_PARENT(old, field)) { \ + if(RB_LEFT(RB_PARENT(old, field), field) == old)\ + RB_LEFT(RB_PARENT(old, field), field) = elm;\ + else \ + RB_RIGHT(RB_PARENT(old, field), field) = elm;\ + RB_AUGMENT(RB_PARENT(old, field)); \ + } else \ + RB_ROOT(head) = elm; \ + RB_PARENT(RB_LEFT(old, field), field) = elm; \ + if(RB_RIGHT(old, field)) \ + RB_PARENT(RB_RIGHT(old, field), field) = elm; \ + if(parent) { \ + left = parent; \ + do { \ + RB_AUGMENT(left); \ + } while((left = RB_PARENT(left, field)) != RT_NULL); \ + } \ + goto color; \ + } \ + parent = RB_PARENT(elm, field); \ + color = RB_COLOR(elm, field); \ + if(child) \ + RB_PARENT(child, field) = parent; \ + if(parent) { \ + if(RB_LEFT(parent, field) == elm) \ + RB_LEFT(parent, field) = child; \ + else \ + RB_RIGHT(parent, field) = child; \ + RB_AUGMENT(parent); \ + } else \ + RB_ROOT(head) = child; \ +color: \ + if(color == RB_BLACK) \ + name##_RB_REMOVE_COLOR(head, parent, child); \ + return (old); \ +} \ + \ +/* Inserts a node into the RB tree */ \ +attr struct type * \ +name##_RB_INSERT(struct name *head, struct type *elm) \ +{ \ + struct type *tmp; \ + struct type *parent = RT_NULL; \ + int comp = 0; \ + tmp = RB_ROOT(head); \ + while(tmp) { \ + parent = tmp; \ + comp = (cmp)(elm, parent); \ + if(comp < 0) \ + tmp = RB_LEFT(tmp, field); \ + else if(comp > 0) \ + tmp = RB_RIGHT(tmp, field); \ + else \ + return (tmp); \ + } \ + RB_SET(elm, parent, field); \ + if(parent != RT_NULL) { \ + if(comp < 0) \ + RB_LEFT(parent, field) = elm; \ + else \ + RB_RIGHT(parent, field) = elm; \ + RB_AUGMENT(parent); \ + } else \ + RB_ROOT(head) = elm; \ + name##_RB_INSERT_COLOR(head, elm); \ + return (RT_NULL); \ +} \ + \ +/* Finds the node with the same key as elm */ \ +attr struct type * \ +name##_RB_FIND(struct name *head, struct type *elm) \ +{ \ + struct type *tmp = RB_ROOT(head); \ + int comp; \ + while(tmp) { \ + comp = cmp(elm, tmp); \ + if(comp < 0) \ + tmp = RB_LEFT(tmp, field); \ + else if(comp > 0) \ + tmp = RB_RIGHT(tmp, field); \ + else \ + return (tmp); \ + } \ + return (RT_NULL); \ +} \ + \ +/* Finds the first node greater than or equal to the search key */ \ +attr struct type * \ +name##_RB_NFIND(struct name *head, struct type *elm) \ +{ \ + struct type *tmp = RB_ROOT(head); \ + struct type *res = RT_NULL; \ + int comp; \ + while(tmp) { \ + comp = cmp(elm, tmp); \ + if(comp < 0) { \ + res = tmp; \ + tmp = RB_LEFT(tmp, field); \ + } \ + else if(comp > 0) \ + tmp = RB_RIGHT(tmp, field); \ + else \ + return (tmp); \ + } \ + return (res); \ +} \ + \ +/* ARGSUSED */ \ +attr struct type * \ +name##_RB_NEXT(struct type *elm) \ +{ \ + if(RB_RIGHT(elm, field)) { \ + elm = RB_RIGHT(elm, field); \ + while(RB_LEFT(elm, field)) \ + elm = RB_LEFT(elm, field); \ + } else { \ + if(RB_PARENT(elm, field) && \ + (elm == RB_LEFT(RB_PARENT(elm, field), field))) \ + elm = RB_PARENT(elm, field); \ + else { \ + while(RB_PARENT(elm, field) && \ + (elm == RB_RIGHT(RB_PARENT(elm, field), field)))\ + elm = RB_PARENT(elm, field); \ + elm = RB_PARENT(elm, field); \ + } \ + } \ + return (elm); \ +} \ + \ +/* ARGSUSED */ \ +attr struct type * \ +name##_RB_PREV(struct type *elm) \ +{ \ + if(RB_LEFT(elm, field)) { \ + elm = RB_LEFT(elm, field); \ + while(RB_RIGHT(elm, field)) \ + elm = RB_RIGHT(elm, field); \ + } else { \ + if(RB_PARENT(elm, field) && \ + (elm == RB_RIGHT(RB_PARENT(elm, field), field))) \ + elm = RB_PARENT(elm, field); \ + else { \ + while(RB_PARENT(elm, field) && \ + (elm == RB_LEFT(RB_PARENT(elm, field), field)))\ + elm = RB_PARENT(elm, field); \ + elm = RB_PARENT(elm, field); \ + } \ + } \ + return (elm); \ +} \ + \ +attr struct type * \ +name##_RB_MINMAX(struct name *head, int val) \ +{ \ + struct type *tmp = RB_ROOT(head); \ + struct type *parent = RT_NULL; \ + while(tmp) { \ + parent = tmp; \ + if(val < 0) \ + tmp = RB_LEFT(tmp, field); \ + else \ + tmp = RB_RIGHT(tmp, field); \ + } \ + return (parent); \ +} + +#define RB_NEGINF -1 +#define RB_INF 1 + +#define RB_INSERT(name, x, y) name##_RB_INSERT(x, y) +#define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y) +#define RB_FIND(name, x, y) name##_RB_FIND(x, y) +#define RB_NFIND(name, x, y) name##_RB_NFIND(x, y) +#define RB_NEXT(name, x, y) name##_RB_NEXT(y) +#define RB_PREV(name, x, y) name##_RB_PREV(y) +#define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF) +#define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF) + +#define RB_FOREACH(x, name, head) \ + for((x) = RB_MIN(name, head); \ + (x) != RT_NULL; \ + (x) = name##_RB_NEXT(x)) + +#define RB_FOREACH_REVERSE(x, name, head) \ + for((x) = RB_MAX(name, head); \ + (x) != RT_NULL; \ + (x) = name##_RB_PREV(x)) + +#endif /* _SYS_TREE_H_ */ diff --git a/components/rtgui_win/include/rtgui/widgets/button.h b/components/rtgui_win/include/rtgui/widgets/button.h new file mode 100644 index 0000000000..a0fa703168 --- /dev/null +++ b/components/rtgui_win/include/rtgui/widgets/button.h @@ -0,0 +1,84 @@ +/*
+ * File : button.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_BUTTON_H__
+#define __RTGUI_BUTTON_H__
+
+#include <rtgui/image.h>
+#include <rtgui/widgets/widget.h>
+#include <rtgui/widgets/label.h>
+#include <rtgui/kbddef.h>
+#include <rtgui/color.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup rtgui_button_t
+ * @{
+ */
+
+/** Gets the type of a button */
+#define RTGUI_BUTTON_TYPE (rtgui_button_type_get())
+/** Casts the object to an rtgui_button_t */
+#define RTGUI_BUTTON(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_BUTTON_TYPE, rtgui_button_t))
+/** Checks if the object is an rtgui_button_t */
+#define RTGUI_IS_BUTTON(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_BUTTON_TYPE))
+
+#define RTGUI_BUTTON_FLAG_PRESS 0x01
+#define RTGUI_BUTTON_FLAG_DEFAULT 0x02
+
+#define RTGUI_BUTTON_TYPE_NORMAL 0x00
+#define RTGUI_BUTTON_TYPE_PUSH 0x10
+
+/*
+ * the button widget
+ */
+struct rtgui_button
+{
+ /* inherit from label */
+ rtgui_label_t parent;
+
+ /* button flag */
+ rt_uint32_t flag;
+
+ /* pressed and unpressed image */
+ rtgui_image_t *image;
+
+ /* click button event handler */
+ void (*on_button)(PVOID wdt, rtgui_event_t *event);
+};
+typedef struct rtgui_button rtgui_button_t;
+typedef void (*rtgui_onbutton_func_t)(PVOID wdt, rtgui_event_t *event);
+
+rtgui_type_t *rtgui_button_type_get(void);
+
+rtgui_button_t* rtgui_button_create(PVOID parent,char* text,int left,int top,int w,int h);
+void rtgui_button_destroy(rtgui_button_t* btn);
+
+void rtgui_button_set_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(PVOID wdt, rtgui_event_t* event);
+
+void rtgui_button_set_text(rtgui_button_t* button, const char* text);
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/checkbox.h b/components/rtgui_win/include/rtgui/widgets/checkbox.h new file mode 100644 index 0000000000..fed9c6cbd8 --- /dev/null +++ b/components/rtgui_win/include/rtgui/widgets/checkbox.h @@ -0,0 +1,35 @@ +#ifndef __RTGUI_CHECKBOX_H__
+#define __RTGUI_CHECKBOX_H__
+
+#include <rtgui/rtgui.h>
+
+
+#define RTGUI_CHECKBOX_TYPE (rtgui_checkbox_type_get())
+#define RTGUI_CHECKBOX(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_CHECKBOX_TYPE, rtgui_checkbox_t))
+#define RTGUI_IS_CHECKBOX(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_CHECKBOX_TYPE))
+
+//#define RTGUI_CHECKBOX_STATUS_CHECKED 1
+//#define RTGUI_CHECKBOX_STATUS_UNCHECKED 0
+
+struct rtgui_checkbox
+{
+ /* inherit from label */
+ rtgui_label_t parent;
+
+ /* check box status */
+ int value;
+};
+typedef struct rtgui_checkbox rtgui_checkbox_t;
+
+rtgui_type_t *rtgui_checkbox_type_get(void);
+
+rtgui_checkbox_t* rtgui_checkbox_create(PVOID wdt,const char* text, rt_bool_t checked,rtgui_color_t fc,int left,int top);
+void rtgui_checkbox_destroy(rtgui_checkbox_t* checkbox);
+
+void rtgui_checkbox_set_checked(rtgui_checkbox_t* checkbox, rt_bool_t checked);
+rt_bool_t rtgui_checkbox_get_checked(rtgui_checkbox_t* checkbox);
+
+rt_bool_t rtgui_checkbox_event_handler(PVOID wdt, rtgui_event_t* event);
+void rtgui_checkbox_set_text(rtgui_checkbox_t *box, const char* text);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/combobox.h b/components/rtgui_win/include/rtgui/widgets/combobox.h new file mode 100644 index 0000000000..3da90e1389 --- /dev/null +++ b/components/rtgui_win/include/rtgui/widgets/combobox.h @@ -0,0 +1,62 @@ +#ifndef __RTGUI_COMBO_H__
+#define __RTGUI_COMBO_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/rtgui_system.h>
+#include <rtgui/widgets/widget.h>
+#include <rtgui/widgets/textbox.h>
+#include <rtgui/widgets/button.h>
+#include <rtgui/widgets/view.h>
+#include <rtgui/widgets/listbox.h>
+
+#define RTGUI_COMBOBOX_HEIGHT 24
+#define RTGUI_COMBOBOX_BUTTON_WIDTH 16
+
+#define RTGUI_COMBO_STYLE_DOWNARROW_UP 0x01
+#define RTGUI_COMBO_STYLE_DOWNARROW_DOWN 0x02
+
+typedef struct rtgui_combo rtgui_combo_t;
+
+/** Gets the type of a textbox */
+#define RTGUI_COMBOBOX_TYPE (rtgui_combo_type_get())
+/** Casts the object to a rtgui_textbox_t */
+#define RTGUI_COMBOBOX(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_COMBOBOX_TYPE, rtgui_combo_t))
+/** Checks if the object is a rtgui_textbox_t */
+#define RTGUI_IS_COMBOBOX(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_COMBOBOX_TYPE))
+
+typedef struct rtgui_combo_item
+{
+ char *name;
+}rtgui_combo_item_t;
+
+struct rtgui_combo
+{
+ rtgui_container_t parent;
+
+ /* widget private data */
+ rt_uint32_t style;
+
+ rtgui_textbox_t *tbox;
+ rtgui_listbox_t *lbox;
+
+ /* call back */
+ void (*on_selected) (PVOID wdt, rtgui_event_t* event);
+ rt_uint32_t (*get_count)(rtgui_combo_t* box);
+ void (*add_string)(rtgui_combo_t* box,char* string);
+};
+
+
+rtgui_type_t *rtgui_combo_type_get(void);
+rtgui_combo_t* rtgui_combo_create(PVOID parent,const char* text,int left,int top,int w,int h);
+void rtgui_combo_destroy(rtgui_combo_t* cbo);
+
+void rtgui_combo_set_onitem(rtgui_combo_t* cbo, rtgui_event_handler_ptr func);
+rt_bool_t rtgui_combo_event_handler(PVOID wdt, rtgui_event_t* event);
+rt_bool_t rtgui_combo_onitem(PVOID wdt, rtgui_event_t* event);
+void rtgui_combo_set_items(rtgui_combo_t* cbo, rtgui_listbox_item_t* items, rt_uint32_t count);
+
+rt_uint32_t rtgui_combo_get_select(rtgui_combo_t* cbo);
+char* rtgui_combo_get_string(rtgui_combo_t* cbo);
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/widgets/container.h b/components/rtgui_win/include/rtgui/widgets/container.h new file mode 100644 index 0000000000..abf90af16b --- /dev/null +++ b/components/rtgui_win/include/rtgui/widgets/container.h @@ -0,0 +1,50 @@ +/*
+ * File : box.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_BOX_H__
+#define __RTGUI_BOX_H__
+
+#include <rtgui/widgets/widget.h>
+#include <rtgui/event.h>
+
+/** Gets the type of a box */
+#define RTGUI_CONTAINER_TYPE (rtgui_container_type_get())
+/** Casts the object to a rtgui_container_t */
+#define RTGUI_CONTAINER(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_CONTAINER_TYPE, rtgui_container_t))
+/** Checks if the object is a rtgui_container_t */
+#define RTGUI_IS_CONTAINER(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_CONTAINER_TYPE))
+
+struct rtgui_container
+{
+ /* inherit from widget */
+ rtgui_widget_t parent;
+
+ rtgui_widget_t *focused;
+ rtgui_list_t children;
+};
+typedef struct rtgui_container rtgui_container_t;
+
+rtgui_type_t *rtgui_container_type_get(void);
+
+void rtgui_container_add_child(PVOID cbox, PVOID wdt);
+void rtgui_container_remove_child(rtgui_container_t *box, PVOID wdt);
+void rtgui_container_destroy_children(rtgui_container_t *box);
+rtgui_widget_t* rtgui_container_get_first_child(rtgui_container_t* box);
+
+rt_bool_t rtgui_container_event_handler(PVOID wdt, rtgui_event_t* event);
+
+rt_bool_t rtgui_container_dispatch_event(rtgui_container_t *box, rtgui_event_t* event);
+rt_bool_t rtgui_container_dispatch_mouse_event(rtgui_container_t *box, rtgui_event_mouse_t* event);
+
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/dialog.h b/components/rtgui_win/include/rtgui/widgets/dialog.h new file mode 100644 index 0000000000..7790aff028 --- /dev/null +++ b/components/rtgui_win/include/rtgui/widgets/dialog.h @@ -0,0 +1,32 @@ +#ifndef __DIALOG_H__
+#define __DIALOG_H__
+
+/* �Ի����е�һЩ���� */
+struct OpenDlgSt
+{
+ char* path; //����·��
+ char* filename; //�ļ�(��)����
+ rt_uint32_t size;//�ļ���С/�ļ����µ��ļ�����
+ rt_uint32_t type;//�ļ�����:�ļ�/�ļ���
+ char* pattern; //�����;
+
+ rtgui_filelist_view_t* fview;
+ rtgui_textbox_t* tbox_path; //�ؼ�ָ��
+ rtgui_textbox_t* tbox_filename;
+ rtgui_combo_t* cbox_pattern;
+};
+
+
+rtgui_win_t* rtgui_win_get_win_by_widget(PVOID wdt);
+void OpenFileDialog(PVOID wdt, rtgui_event_t* event);
+void NewFileDialog(PVOID wdt, rtgui_event_t *event);
+void SaveFileDialog(PVOID wdt, rtgui_event_t *event);
+
+void GoToTopFolder(PVOID wdt, rtgui_event_t *event);
+void GoToSubFolder(PVOID wdt, rtgui_event_t *event);
+
+
+
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/widgets/filelist_view.h b/components/rtgui_win/include/rtgui/widgets/filelist_view.h new file mode 100644 index 0000000000..d669f064b1 --- /dev/null +++ b/components/rtgui_win/include/rtgui/widgets/filelist_view.h @@ -0,0 +1,60 @@ +#ifndef __RTGUI_FILELIST_VIEW_H__
+#define __RTGUI_FILELIST_VIEW_H__
+
+#include <rtgui/widgets/view.h>
+#include <rtgui/widgets/scrollbar.h>
+#include <rtgui/kbddef.h>
+#include <rtgui/color.h>
+
+#define RTGUI_FITEM_FILE 0x0
+#define RTGUI_FITEM_DIR 0x1
+
+
+typedef struct rtgui_fileview rtgui_filelist_view_t;
+
+/** Gets the type of a filelist view */
+#define RTGUI_FILELIST_VIEW_TYPE (rtgui_filelist_view_type_get())
+/** Casts the object to a filelist */
+#define RTGUI_FILELIST_VIEW(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_FILELIST_VIEW_TYPE, rtgui_filelist_view_t))
+/** Checks if the object is a filelist view */
+#define RTGUI_IS_FILELIST_VIEW(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_FILELIST_VIEW_TYPE))
+
+
+typedef struct rtgui_file_item
+{
+ char* name;
+ rt_uint32_t type;
+ rt_uint32_t size;
+}rtgui_filelist_view_item_t;
+
+struct rtgui_fileview
+{
+ rtgui_container_t parent;
+
+ /* widget private data */
+ char* current_dir; //��ǰ�ļ���current_dir
+ char* pattern; //���������
+
+ rt_int16_t item_per_page; //ÿҳ����ʾ����
+ rt_int16_t item_count; //������
+
+ rt_int16_t frist_aloc;/* frist item */
+ rt_int16_t now_aloc; /* now item */
+ rt_int16_t old_aloc; /* old item */
+
+ rtgui_scrollbar_t *sbar; //����
+
+ rtgui_filelist_view_item_t *items; /* items array */
+};
+
+rtgui_type_t *rtgui_filelist_view_type_get(void);
+
+rtgui_filelist_view_t* rtgui_filelist_view_create(PVOID parent, const char* directory, const char* pattern, int left, int top, int w, int h);
+void rtgui_filelist_view_destroy(rtgui_filelist_view_t* view);
+
+rt_bool_t rtgui_filelist_view_event_handler(PVOID wdt, rtgui_event_t* event);
+void rtgui_filelist_view_set_directory(rtgui_filelist_view_t* view, const char* directory);
+void rtgui_filelist_view_on_enter(rtgui_filelist_view_t* fview);
+void rtgui_filelist_view_get_fullpath(rtgui_filelist_view_t* view, char* path, rt_size_t len);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/iconbox.h b/components/rtgui_win/include/rtgui/widgets/iconbox.h new file mode 100644 index 0000000000..ef82d58a7a --- /dev/null +++ b/components/rtgui_win/include/rtgui/widgets/iconbox.h @@ -0,0 +1,58 @@ +/*
+ * File : iconbox.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_ICONBOX_H__
+#define __RTGUI_ICONBOX_H__
+
+#include <rtgui/rtgui.h>
+#include <topwin.h>
+#include <rtgui/image.h>
+#include <rtgui/font.h>
+#include <rtgui/widgets/widget.h>
+
+/** Gets the type of a iconbox */
+#define RTGUI_ICONBOX_TYPE (rtgui_iconbox_type_get())
+/** Casts the object to a rtgui_iconbox_t */
+#define RTGUI_ICONBOX(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_ICONBOX_TYPE, rtgui_iconbox_t))
+/** Checks if the object is a rtgui_iconbox_t */
+#define RTGUI_IS_ICONBOX(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_ICONBOX_TYPE))
+
+#define RTGUI_ICONBOX_NOTEXT 0x00
+#define RTGUI_ICONBOX_TEXT_RIGHT 0x01
+#define RTGUI_ICONBOX_TEXT_BELOW 0x02
+
+#define RTGUI_ICONBOX_AREA 76
+
+struct rtgui_iconbox
+{
+ rtgui_widget_t parent; /* inherit from widget */
+
+ rtgui_image_t* image; /* widget private data */
+ char *text;
+ void (*call)(void);
+ rt_uint32_t text_position;
+
+ rt_bool_t selected;
+};
+typedef struct rtgui_iconbox rtgui_iconbox_t;
+
+rtgui_type_t *rtgui_iconbox_type_get(void);
+
+rtgui_iconbox_t* rtgui_iconbox_create(PVOID parent, rtgui_image_t* image, const char* text, int position);
+void rtgui_iconbox_destroy(rtgui_iconbox_t* iconbox);
+
+rt_bool_t rtgui_iconbox_event_handler(PVOID wdt, rtgui_event_t* event);
+
+void rtgui_iconbox_set_text_position(rtgui_iconbox_t* iconbox, int position);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/label.h b/components/rtgui_win/include/rtgui/widgets/label.h new file mode 100644 index 0000000000..ddc447edc3 --- /dev/null +++ b/components/rtgui_win/include/rtgui/widgets/label.h @@ -0,0 +1,48 @@ +/*
+ * File : label.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_LABEL_H__
+#define __RTGUI_LABEL_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/widgets/widget.h>
+
+/** Gets the type of a button */
+#define RTGUI_LABEL_TYPE (rtgui_label_type_get())
+/** Casts the object to an rtgui_label_t */
+#define RTGUI_LABEL(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_LABEL_TYPE, rtgui_label_t))
+/** Checks if the object is an rtgui_label_t */
+#define RTGUI_IS_LABEL(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_LABEL_TYPE))
+
+/*
+ * the label widget
+ */
+struct rtgui_label
+{
+ rtgui_widget_t parent;
+ /* label */
+ char* text;
+};
+typedef struct rtgui_label rtgui_label_t;
+
+rtgui_type_t *rtgui_label_type_get(void);
+
+rtgui_label_t* rtgui_label_create(PVOID wdt, const char* text, int left, int top, int w, int h);
+void rtgui_label_destroy(rtgui_label_t* label);
+
+rt_bool_t rtgui_label_event_handler(PVOID wdt, rtgui_event_t* event);
+
+void rtgui_label_set_text(rtgui_label_t* label, const char* text);
+char* rtgui_label_get_text(rtgui_label_t* label);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/list_view.h b/components/rtgui_win/include/rtgui/widgets/list_view.h new file mode 100644 index 0000000000..2af23061b3 --- /dev/null +++ b/components/rtgui_win/include/rtgui/widgets/list_view.h @@ -0,0 +1,76 @@ +/*
+ * File : list_view.h
+ * This file is part of RTGUI in RT-Thread RTOS
+ * COPYRIGHT (C) 2010, 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
+ * 2010-01-06 Bernard first version
+ */
+
+#ifndef __RTGUI_LIST_VIEW_H__
+#define __RTGUI_LIST_VIEW_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/kbddef.h>
+#include <rtgui/color.h>
+#include <rtgui/event.h>
+#include <rtgui/widgets/view.h>
+
+typedef void (*item_action)(void* parameter);
+typedef struct rtgui_list_item rtgui_list_view_item_t;
+struct rtgui_list_item
+{
+ char* name;
+ rtgui_image_t *image;
+ item_action action;
+ void *parameter;
+};
+
+/** Gets the type of a list view */
+#define RTGUI_LIST_VIEW_TYPE (rtgui_list_view_type_get())
+/** Casts the object to a rtgui_list_view_t */
+#define RTGUI_LIST_VIEW(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_LIST_VIEW_TYPE, rtgui_list_view_t))
+/** Checks if the object is a rtgui_list_view_t */
+#define RTGUI_IS_LIST_VIEW(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_LIST_VIEW_TYPE))
+
+#define RTGUI_LIST_VIEW_LIST 0x00
+#define RTGUI_LIST_VIEW_ICON 0x01
+#define RTGUI_LIST_VIEW_REPORT 0x02
+
+struct rtgui_list_view
+{
+ rtgui_view_t parent;
+
+ /* widget private data */
+ /* list item */
+ const rtgui_list_view_item_t* items;
+
+ /* layout flag */
+ rt_uint16_t flag;
+
+ /* total number of items */
+ rt_uint16_t item_count;
+ /* the number of item in a page */
+ rt_uint16_t page;
+ /* current item */
+ rt_int16_t item_current;
+
+ /* icon layout */
+ rt_uint32_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(PVOID parent,const rtgui_list_view_item_t* items, rt_uint16_t count, int left,int top,int w,int h, rt_uint16_t flag);
+void rtgui_list_view_destroy(rtgui_list_view_t* view);
+
+rt_bool_t rtgui_list_view_event_handler(PVOID wdt, rtgui_event_t* event);
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/widgets/listbox.h b/components/rtgui_win/include/rtgui/widgets/listbox.h new file mode 100644 index 0000000000..3b86eef281 --- /dev/null +++ b/components/rtgui_win/include/rtgui/widgets/listbox.h @@ -0,0 +1,75 @@ +/*
+ * File : listbox.h
+ * This file is part of RTGUI in RT-Thread RTOS
+ * COPYRIGHT (C) 2010, 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
+ * 2010-01-06 Bernard first version
+ */
+
+#ifndef __RTGUI_LISTBOX_H__
+#define __RTGUI_LISTBOX_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/kbddef.h>
+#include <rtgui/color.h>
+#include <rtgui/image.h>
+
+struct rtgui_listbox_item
+{
+ char *name;
+ rtgui_image_t *image;
+};
+typedef struct rtgui_listbox_item rtgui_listbox_item_t;
+/** Gets the type of a list box */
+#define RTGUI_LISTBOX_TYPE (rtgui_listbox_type_get())
+/** Casts the object to a filelist */
+#define RTGUI_LISTBOX(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_LISTBOX_TYPE, rtgui_listbox_t))
+/** Checks if the object is a filelist box */
+#define RTGUI_IS_LISTBOX(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_LISTBOX_TYPE))
+
+typedef struct rtgui_listbox rtgui_listbox_t;
+
+struct rtgui_listbox
+{
+ rtgui_container_t parent;
+
+ /* widget private data */
+ rt_int16_t item_per_page; /* the number of item in a page */
+ rt_int16_t item_count; /* total number of items */
+ rt_int16_t item_size; /* item size */
+ rt_int16_t frist_aloc; /* frist item */
+ rt_int16_t now_aloc; /* now item */
+ rt_int16_t old_aloc; /* old item */
+ rt_bool_t ispopup; /* �ǵ��������б� */
+ PVOID widgetlnk; /* ���ӵĿؼ� */
+ rtgui_scrollbar_t *sbar;
+ rtgui_listbox_item_t *items; /* items array */
+
+ /* item event handler */
+ rt_bool_t (*on_item)(PVOID wdt, rtgui_event_t* event);
+
+ rt_uint32_t (*get_count)(rtgui_listbox_t* box);
+ void (*add_item)(rtgui_listbox_t* box, rtgui_listbox_item_t* item);
+};
+
+
+rtgui_type_t *rtgui_listbox_type_get(void);
+
+rtgui_listbox_t* rtgui_listbox_create(PVOID wdt, int left,int top,int w,int h,rt_uint32_t style);
+void rtgui_listbox_destroy(rtgui_listbox_t* box);
+
+void rtgui_listbox_update(rtgui_listbox_t* box);
+rt_bool_t rtgui_listbox_event_handler(PVOID wdt, rtgui_event_t* event);
+void rtgui_listbox_set_onitem(rtgui_listbox_t* box, rtgui_event_handler_ptr func);
+void rtgui_listbox_set_items(rtgui_listbox_t* box, rtgui_listbox_item_t* items, rt_uint32_t count);
+
+void rtgui_listbox_delete_item(rtgui_listbox_t* box, rt_uint32_t item_num);
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/widgets/menu.h b/components/rtgui_win/include/rtgui/widgets/menu.h new file mode 100644 index 0000000000..591d8a682a --- /dev/null +++ b/components/rtgui_win/include/rtgui/widgets/menu.h @@ -0,0 +1,106 @@ +/*
+ * 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_MENU_H__
+#define __RTGUI_MENU_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/image.h>
+#include <rtgui/widgets/widget.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef int HMENU;
+
+#define RTGUI_MENU_HEIGHT 43 /*�˵���߶�*/
+#define RTGUI_MENU_BORDER 2
+
+#define RTGUI_MENU_IMAGE_W 24
+#define RTGUI_MENU_IMAGE_H 24
+
+#define ITEM (System,Name,ID) \
+rtgui_menu_append(hPopupMenu_##System, MF_ENABLED, ID, Name);
+
+/*�˵����־*/
+#define RTGUI_MENU_POPUP 0x00000080L
+
+typedef struct rtgui_menu_item rtgui_menu_item_t; //��ͨ�˵�
+typedef struct rtgui_menu rtgui_menu_t;//�˵�
+
+
+/** Gets the type of a view */
+#define RTGUI_MENU_TYPE (rtgui_menu_type_get())
+/** Casts the object to an rtgui_view_t */
+#define RTGUI_MENU(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_MENU_TYPE, rtgui_menu_t))
+/** Checks if the object is an rtgui_view_t */
+#define RTGUI_IS_MENU(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_MENU_TYPE))
+
+struct rtgui_menu
+{
+ rtgui_widget_t parent;
+ char* name;
+ /* ���ڸ�����ͼ�IJ���,��������ͼ,ȥ����Щ����û��Ӱ�� */
+ rt_uint32_t orient; /* ����� */
+ rt_uint32_t item_size; /* �˵���ߴ� */
+ rt_uint16_t item_count; /* �˵����� */
+
+ rtgui_menu_item_t* current_item; /* ��ǰ�IJ˵��� */
+ rtgui_menu_item_t* forego_item; /* ��һ���˵��� */
+
+ /*�¼��˵��� */
+ rtgui_menu_item_t* head; /*ͷ*/
+ rtgui_menu_item_t* tail; /*β*/
+ /*�ϼ��˵��� */
+ rtgui_menu_item_t* farther;
+};
+
+struct rtgui_menu_item
+{
+ char* caption; //�˵���
+ rt_uint32_t item_id;
+ rt_uint32_t type; //�˵��Ĵ�������
+ rt_uint32_t shortcut;
+ rt_bool_t bexit; //���øò˵����Ƿ��˳��˵�
+
+ rtgui_menu_item_t* next;
+ rtgui_menu_item_t* prev;
+
+ rtgui_image_t* image; //��ͼ��
+ rtgui_menu_t* sub_menu; //�Ӳ˵�
+
+ void(*func_updown)(rtgui_menu_t *menu); //��UP/DOWN����֮�����еĺ���
+ void(*func_enter)(void); //��ȷ�Ϻ�ִ�еĺ���
+};
+
+rtgui_type_t *rtgui_menu_type_get(void);
+
+rtgui_menu_t* rtgui_menu_create(PVOID parent, const char* name);
+void rtgui_menu_destroy(rtgui_menu_t* menu);
+
+
+HMENU rtgui_menu_popup_create (void);
+rt_bool_t rtgui_menu_append(rtgui_menu_t *menu,rt_uint32_t flags,rt_uint32_t ID,char * caption);
+void rtgui_menu_popup_delete(rtgui_menu_t* menu);
+rtgui_menu_t* rtgui_menu_item_delete(rtgui_menu_t* menu,rtgui_menu_item_t* pItem);
+void rtgui_menu_on_down(rtgui_menu_t* menu);
+void rtgui_menu_on_up(rtgui_menu_t* menu);
+void rtgui_menu_on_exit(rtgui_menu_t* menu);
+void rtgui_menu_set_selected(rtgui_menu_t* menu, int selected);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/progressbar.h b/components/rtgui_win/include/rtgui/widgets/progressbar.h new file mode 100644 index 0000000000..c2133a93dd --- /dev/null +++ b/components/rtgui_win/include/rtgui/widgets/progressbar.h @@ -0,0 +1,40 @@ +#ifndef __RTGUI_PROGRESSBAR_H__
+#define __RTGUI_PROGRESSBAR_H__
+
+#include <rtgui/rtgui.h>
+
+typedef struct rtgui_progressbar rtgui_progressbar_t;
+
+/** Gets the type of a progressbar */
+#define RTGUI_PROGRESSBAR_TYPE (rtgui_progressbar_type_get())
+/** Casts the object to a rtgui_progressbar */
+#define RTGUI_PROGRESSBAR(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_PROGRESSBAR_TYPE, rtgui_progressbar_t))
+/** Checks if the object is a rtgui_progressbar */
+#define RTGUI_IS_PROGRESSBAR(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_PROGRESSBAR_TYPE))
+
+#define DEFAULT_WIDTH 100
+#define DEFAULT_HEIGHT 20
+
+struct rtgui_progressbar
+{
+ rtgui_widget_t parent;
+
+ int orient;
+
+ int range;
+ int position;
+};
+
+rtgui_type_t *rtgui_progressbar_type_get(void);
+
+rtgui_progressbar_t* rtgui_progressbar_create(PVOID parent, int orient, int range, int left, int top, int w, int h);
+void rtgui_progressbar_destroy(rtgui_progressbar_t* p_bar);
+
+rt_bool_t rtgui_progressbar_event_handler(PVOID wdt, rtgui_event_t* event);
+
+void rtgui_progressbar_set_value(rtgui_progressbar_t *p_bar, int value);
+int rtgui_progressbar_get_value(rtgui_progressbar_t *p_bar);
+void rtgui_progressbar_set_range(rtgui_progressbar_t *p_bar, int range);
+int rtgui_progressbar_get_range(rtgui_progressbar_t *p_bar);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/radiobox.h b/components/rtgui_win/include/rtgui/widgets/radiobox.h new file mode 100644 index 0000000000..3856c98bff --- /dev/null +++ b/components/rtgui_win/include/rtgui/widgets/radiobox.h @@ -0,0 +1,42 @@ +#ifndef __RTGUI_RADIOBOX_H__
+#define __RTGUI_RADIOBOX_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/kbddef.h>
+#include <rtgui/widgets/container.h>
+
+/** Gets the type of a rbox */
+#define RTGUI_RADIOBOX_TYPE (rtgui_radiobox_type_get())
+/** Casts the object to an rtgui_radiobox_t */
+#define RTGUI_RADIOBOX(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_RADIOBOX_TYPE, rtgui_radiobox_t))
+/** Checks if the object is an rtgui_radiobox_t */
+#define RTGUI_IS_RADIOBOX(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_RADIOBOX_TYPE))
+
+struct rtgui_radiobox
+{
+ rtgui_container_t parent;
+
+ char* name;
+
+ rt_uint32_t orient;
+ rt_uint32_t item_count;
+ rt_bool_t item_sel;
+
+ char **items;
+};
+
+typedef struct rtgui_radiobox rtgui_radiobox_t;
+
+rtgui_type_t *rtgui_radiobox_type_get(void);
+
+rtgui_radiobox_t* rtgui_radiobox_create(PVOID parent, const char* name, int orient, char **items, int count,
+ int left, int top, int w, int h);
+void rtgui_radiobox_destroy(rtgui_radiobox_t* rbox);
+
+void rtgui_radiobox_set_selection(rtgui_radiobox_t* rbox, int selection);
+int rtgui_radiobox_get_selection(rtgui_radiobox_t* rbox);
+
+rt_bool_t rtgui_radiobox_event_handler(PVOID wdt, rtgui_event_t* event);
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/widgets/scrollbar.h b/components/rtgui_win/include/rtgui/widgets/scrollbar.h new file mode 100644 index 0000000000..934114e755 --- /dev/null +++ b/components/rtgui_win/include/rtgui/widgets/scrollbar.h @@ -0,0 +1,92 @@ +/*
+ * File : scrollbar.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2010, 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
+ * 2010-08-09 Bernard first version
+ */
+#ifndef __RTGUI_SCROLLBAR_H__
+#define __RTGUI_SCROLLBAR_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/widgets/widget.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Gets the type of a scrollbar */
+#define RTGUI_SCROLLBAR_TYPE (rtgui_scrollbar_type_get())
+/** Casts the object to an rtgui_scrollbar */
+#define RTGUI_SCROLLBAR(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_SCROLLBAR_TYPE, rtgui_scrollbar_t))
+/** Checks if the object is an rtgui_scrollbar */
+#define RTGUI_IS_SCROLLBAR(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_SCROLLBAR_TYPE))
+
+#define RTGUI_DEFAULT_SB_WIDTH 16
+
+/* scrollbar status/positions*/
+#define SBAR_UNKNOWN 0x0000
+#define SBAR_LEFTARROW 0x0001 //������ť��
+#define SBAR_RIGHTARROW 0x0002 //�����Ұ�ť��
+#define SBAR_LEFTSPACE 0x0004 //�ڻ�����հ״�
+#define SBAR_RIGHTSPACE 0x0008 //�ڻ���Ҳ�հ״�
+#define SBAR_HORZTHUMB 0x0010 //���ˮƽ����
+#define SBAR_UPARROW 0x0020 //״̬����
+#define SBAR_DOWNARROW 0x0040 //״̬����
+#define SBAR_UPSPACE 0x0080 //�ڻ���ϲ�հ״�
+#define SBAR_DOWNSPACE 0x0100 //�ڻ���²�հ״�
+#define SBAR_VERTTHUMB 0x0200 //��鴹ֱ����
+
+#define SBAR_UPTHUMB 0x0400 //������ϻ���
+#define SBAR_DOWNTHUMB 0x0800 //������»���
+#define SBAR_LEFTTHUMB 0x1000 //�������
+#define SBAR_RIGHTTHUMB 0x2000 //������һ���
+
+struct rtgui_scrollbar
+{
+ /* inherit from widget */
+ rtgui_widget_t parent;
+
+ rt_uint32_t orient;
+ rt_uint32_t status;
+
+ /* page_step = display lines of scrollbar */
+ /* thumb_len = line_step * page_step / (page_step - (button width * 2)) */
+ rt_int16_t line_step, page_step;
+ rt_int16_t value, thumb_len,thumb_w;
+ /* position 1:1 width of scrollbar */
+ rt_int16_t count;
+
+ PVOID widgetlnk;//���ӵĿؼ�
+ rt_bool_t (*on_scroll) (PVOID wdt, rtgui_event_t* event);
+};
+typedef struct rtgui_scrollbar rtgui_scrollbar_t;
+
+rtgui_type_t *rtgui_scrollbar_type_get(void);
+
+rtgui_scrollbar_t* rtgui_scrollbar_create(PVOID wdt,int left,int top,int w,int len,int orient);
+void rtgui_scrollbar_destroy(rtgui_scrollbar_t* bar);
+
+void rtgui_scrollbar_get_thumb_rect(rtgui_scrollbar_t *bar, rtgui_rect_t *erect);
+
+void rtgui_scrollbar_set_range(rtgui_scrollbar_t* bar, int count);
+void rtgui_scrollbar_set_value(rtgui_scrollbar_t* bar, rt_int16_t value);
+
+void rtgui_scrollbar_set_onscroll(rtgui_scrollbar_t* bar, rtgui_event_handler_ptr handler);
+void rtgui_scrollbar_set_orientation(rtgui_scrollbar_t* bar, int orient);
+void rtgui_scrollbar_set_page_step(rtgui_scrollbar_t* bar, int step);
+void rtgui_scrollbar_set_line_step(rtgui_scrollbar_t* bar, int step);
+
+rt_bool_t rtgui_scrollbar_event_handler(PVOID wdt, rtgui_event_t* event);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/slider.h b/components/rtgui_win/include/rtgui/widgets/slider.h new file mode 100644 index 0000000000..b94ced24e4 --- /dev/null +++ b/components/rtgui_win/include/rtgui/widgets/slider.h @@ -0,0 +1,40 @@ +#ifndef __RTGUI_SLIDER_H__
+#define __RTGUI_SLIDER_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/kbddef.h>
+
+typedef struct rtgui_slider rtgui_slider_t;
+
+/** Gets the type of a slider */
+#define RTGUI_SLIDER_TYPE (rtgui_slider_type_get())
+/** Casts the object to an rtgui_slider */
+#define RTGUI_SLIDER(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_SLIDER_TYPE, rtgui_slider_t))
+/** Checks if the object is an rtgui_slider */
+#define RTGUI_IS_SLIDER(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_SLIDER_TYPE))
+
+struct rtgui_slider
+{
+ rtgui_widget_t parent;
+
+ /* widget private data */
+ rt_size_t min, max, value, ticks;
+ rt_size_t thumb_width;
+
+ int orient;
+};
+
+rtgui_type_t *rtgui_slider_type_get(void);
+
+rtgui_slider_t* rtgui_slider_create(PVOID parent, rt_size_t min, rt_size_t max, int left, int top, int w, int h, int orient);
+void rtgui_slider_destroy(rtgui_slider_t* slider);
+
+rt_bool_t rtgui_slider_event_handler(PVOID wdt, rtgui_event_t* event);
+
+void rtgui_slider_set_range(rtgui_slider_t* slider, rt_size_t min, rt_size_t max);
+void rtgui_slider_set_value(rtgui_slider_t* slider, rt_size_t value);
+void rtgui_slider_set_orientation(rtgui_slider_t* slider, int orient);
+
+rt_size_t rtgui_slider_get_value(rtgui_slider_t* slider);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/staticline.h b/components/rtgui_win/include/rtgui/widgets/staticline.h new file mode 100644 index 0000000000..b63e6c25af --- /dev/null +++ b/components/rtgui_win/include/rtgui/widgets/staticline.h @@ -0,0 +1,32 @@ +#ifndef __RTGUI_STATICLINE__H__
+#define __RTGUI_STATICLINE__H__
+
+#include <rtgui/rtgui.h>
+
+/*
+ * the static line widget
+ */
+
+/** Gets the type of a sline */
+#define RTGUI_STATICLINE_TYPE (rtgui_staticline_type_get())
+/** Casts the object to an rtgui_staticline_t */
+#define RTGUI_STATICLINE(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_STATICLINE_TYPE, rtgui_staticline_t))
+/** Checks if the object is an rtgui_staticline_t */
+#define RTGUI_IS_STATICLINE(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_STATICLINE_TYPE))
+
+struct rtgui_staticline
+{
+ /* inherit from widget */
+ rtgui_widget_t parent;
+
+ int orient;
+};
+typedef struct rtgui_staticline rtgui_staticline_t;
+
+rtgui_staticline_t *rtgui_staticline_create(PVOID wdt,int left,int top,int w,int len,int orient);
+void rtgui_staticline_destroy(rtgui_staticline_t* sline);
+
+rt_bool_t rtgui_staticline_event_handler(PVOID wdt, rtgui_event_t* event);
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/widgets/textbox.h b/components/rtgui_win/include/rtgui/widgets/textbox.h new file mode 100644 index 0000000000..4638da48a1 --- /dev/null +++ b/components/rtgui_win/include/rtgui/widgets/textbox.h @@ -0,0 +1,78 @@ +/*
+ * File : textbox.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_TEXTBOX_H__
+#define __RTGUI_TEXTBOX_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/rtgui_system.h>
+
+/** Gets the type of a textbox */
+#define RTGUI_TEXTBOX_TYPE (rtgui_textbox_type_get())
+/** Casts the object to a rtgui_textbox_t */
+#define RTGUI_TEXTBOX(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_TEXTBOX_TYPE, rtgui_textbox_t))
+/** Checks if the object is a rtgui_textbox_t */
+#define RTGUI_IS_TEXTBOX(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_TEXTBOX_TYPE))
+
+#define RTGUI_TEXTBOX_DEFAULT_WIDTH 80
+#define RTGUI_TEXTBOX_DEFAULT_HEIGHT 20
+
+#define RTGUI_TEXTBOX_NONE 0x00
+#define RTGUI_TEXTBOX_MULTI 0x01 //����
+#define RTGUI_TEXTBOX_MASK 0x02 //����
+#define RTGUI_TEXTBOX_DIGIT 0x04 //������������
+#define RTGUI_TEXTBOX_CARET_SHOW 0x10
+#define RTGUI_TEXTBOX_CARET_STAT 0x20
+
+#define RTGUI_TEXTBOX_LINE_MAX 128 //���ij���
+
+struct rtgui_textbox
+{
+ /* inherit from widget */
+ rtgui_widget_t parent;
+
+ /* text box flag */
+ rt_uint32_t flag;
+ rt_uint32_t isedit;//�Ƿ�ɱ༭
+
+ /* current line and position */
+ rt_uint16_t line, line_begin, position, line_length;
+ rt_uint16_t dis_length; /*may be display length.*/
+ char* text;
+ rt_size_t font_width;
+
+ rtgui_timer_t* caret_timer;
+
+ /* widget private data */
+ rt_bool_t (*on_change)(PVOID wdt, rtgui_event_t* event);
+ rt_bool_t (*on_enter) (PVOID wdt, rtgui_event_t* event);
+};
+typedef struct rtgui_textbox rtgui_textbox_t;
+
+void _rtgui_textbox_constructor(rtgui_textbox_t *box);
+void _rtgui_textbox_deconstructor(rtgui_textbox_t *textbox);
+rtgui_type_t *rtgui_textbox_type_get(void);
+
+rtgui_textbox_t* rtgui_textbox_create(PVOID wdt,const char* text,int left,int top,int w,int h, rt_uint32_t flag);
+void rtgui_textbox_destroy(rtgui_textbox_t* box);
+
+rt_bool_t rtgui_textbox_event_handler(PVOID wdt, rtgui_event_t* event);
+
+void rtgui_textbox_set_value(rtgui_textbox_t* box, const char* text);
+const char* rtgui_textbox_get_value(rtgui_textbox_t* box);
+
+void rtgui_textbox_set_line_length(rtgui_textbox_t* box, rt_size_t length);
+
+void rtgui_textbox_get_edit_rect(rtgui_textbox_t *box,rtgui_rect_t *rect);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/view.h b/components/rtgui_win/include/rtgui/widgets/view.h new file mode 100644 index 0000000000..f0639c3f45 --- /dev/null +++ b/components/rtgui_win/include/rtgui/widgets/view.h @@ -0,0 +1,62 @@ +/*
+ * 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/container.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Gets the type of a view */
+#define RTGUI_VIEW_TYPE (rtgui_view_type_get())
+/** Casts the object to an rtgui_view_t */
+#define RTGUI_VIEW(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_VIEW_TYPE, rtgui_view_t))
+/** Checks if the object is an rtgui_view_t */
+#define RTGUI_IS_VIEW(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_VIEW_TYPE))
+
+/*
+ * the view widget
+ */
+struct rtgui_view
+{
+ /* inherit from box */
+ rtgui_container_t parent;
+
+ /* private field */
+ char* title;
+};
+typedef struct rtgui_view rtgui_view_t;
+
+rtgui_type_t *rtgui_view_type_get(void);
+
+rtgui_view_t *rtgui_view_create(PVOID wdt,const char* title,int left,int top,int w,int h);
+void rtgui_view_destroy(rtgui_view_t* view);
+
+rt_bool_t rtgui_view_event_handler(PVOID wdt, rtgui_event_t* event);
+
+rt_bool_t rtgui_view_show(rtgui_view_t* view);
+void rtgui_view_hide(rtgui_view_t* view);
+
+char* rtgui_view_get_title(rtgui_view_t* view);
+void rtgui_view_set_title(rtgui_view_t* view, const char* title);
+void rtgui_view_show_child(PVOID wdt,const char* name);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/widget.h b/components/rtgui_win/include/rtgui/widgets/widget.h new file mode 100644 index 0000000000..1cddfd267b --- /dev/null +++ b/components/rtgui_win/include/rtgui/widgets/widget.h @@ -0,0 +1,168 @@ +/* + * File : widget.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_WIDGET_H__ +#define __RTGUI_WIDGET_H__ + +#include <rtgui/rtgui.h>
+#include <rtgui/color.h>
+#include <rtgui/font.h>
+#include <rtgui/list.h>
+#include <rtgui/region.h> + +#ifdef __cplusplus +extern "C" { +#endif
+ +typedef struct rtgui_widget rtgui_widget_t; + +/** Gets the type of a widget */ +#define RTGUI_WIDGET_TYPE (rtgui_widget_type_get()) +/** Casts the object to a rtgui_widget */ +#define RTGUI_WIDGET(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_WIDGET_TYPE, rtgui_widget_t)) +/** Check if the object is a rtgui_widget */ +#define RTGUI_IS_WIDGET(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_WIDGET_TYPE)) + +/* + * the base widget object + */ +struct rtgui_widget +{ + rtgui_object_t object; /* inherit from rtgui_object_t */ + rtgui_widget_t *parent, *toplevel; /* the parent and root widget */ + rtgui_list_t sibling; /* the widget child and sibling */ + rt_uint32_t flag; /* widget flag */
+
+ rt_uint32_t dc_type; /* hardware device context */ + const struct rtgui_dc_engine* dc_engine; + rtgui_gc_t gc; /* the graphic context of widget */
+ rt_uint16_t tab_index; /* table detect order */
+ rt_uint16_t tab_stop; + rtgui_rect_t extent; /* the widget extent */
+ rt_uint32_t align; /* widget align */ + rt_uint16_t border,border_style; + rtgui_region_t clip; /* the rect clip */ + + rt_bool_t (*event_handler)(PVOID wdt, rtgui_event_t* event);/* the event handler */ + + rt_bool_t (*on_focus_in)(PVOID wdt, rtgui_event_t* event);/* call back */ + rt_bool_t (*on_focus_out)(PVOID wdt, rtgui_event_t* event); + rt_bool_t (*on_draw)(PVOID wdt, rtgui_event_t* event); + rt_bool_t (*on_mouseclick)(PVOID wdt, rtgui_event_t* event); + rt_bool_t (*on_key)(PVOID wdt, rtgui_event_t* event); + rt_bool_t (*on_size)(PVOID wdt, rtgui_event_t* event); + rt_bool_t (*on_command)(PVOID wdt, rtgui_event_t* event);
+
+ rt_uint32_t user_data; /* reserved user data */ +};
+ +#define RTGUI_WIDGET_FOREGROUND(w) (RTGUI_WIDGET(w))->gc.foreground
+#define RTGUI_WIDGET_BACKGROUND(w) (RTGUI_WIDGET(w))->gc.background
+#define RTGUI_WIDGET_FONT(w) (RTGUI_WIDGET(w))->gc.font
+#define RTGUI_WIDGET_TEXTALIGN(w) (RTGUI_WIDGET(w))->gc.textalign
+
+#define RTGUI_WIDGET_FLAG(w) (RTGUI_WIDGET(w))->flag
+#define RTGUI_WIDGET_ALIGN(w) (RTGUI_WIDGET(w))->align
+#define RTGUI_WIDGET_EVENT_HANDLE(w) (RTGUI_WIDGET(w))->event_handler
+#define RTGUI_WIDGET_EVENT_CALL(w,e) (RTGUI_WIDGET(w))->event_handler(w,e)
+#define RTGUI_WIDGET_PARENT(w) (RTGUI_WIDGET(w))->parent
+#define RTGUI_WIDGET_EXTENT(w) (RTGUI_WIDGET(w))->extent
+#define RTGUI_WIDGET_BORDER(w) (RTGUI_WIDGET(w))->border
+#define RTGUI_WIDGET_BORDER_STYLE(w) (RTGUI_WIDGET(w))->border_style
+#define RTGUI_WIDGET_CLIP(w) (RTGUI_WIDGET(w))->clip
+
+#define RTGUI_WIDGET_FLAG_DEFAULT 0x0000 //Ĭ��
+#define RTGUI_WIDGET_FLAG_HIDE 0x0001 //���ص� +#define RTGUI_WIDGET_FLAG_DISABLE 0x0002 //��Ч�� +#define RTGUI_WIDGET_FLAG_FOCUS 0x0004 //�����
+#define RTGUI_WIDGET_FLAG_TRANSPARENT 0x0008 //���� +#define RTGUI_WIDGET_FLAG_FOCUSABLE 0x0010 //�ɻ�ý���� +#define RTGUI_WIDGET_FLAG_DC_VISIBLE 0x0100 + +#define RTGUI_WIDGET_UNHIDE(w) RTGUI_WIDGET_FLAG(w) &= ~RTGUI_WIDGET_FLAG_HIDE +#define RTGUI_WIDGET_HIDE(w) RTGUI_WIDGET_FLAG(w) |= RTGUI_WIDGET_FLAG_HIDE +#define RTGUI_WIDGET_IS_HIDE(w) (RTGUI_WIDGET_FLAG(w) & RTGUI_WIDGET_FLAG_HIDE) + +#define RTGUI_WIDGET_ENABLE(w) RTGUI_WIDGET_FLAG(w) &= ~RTGUI_WIDGET_FLAG_DISABLE +#define RTGUI_WIDGET_DISABLE(w) RTGUI_WIDGET_FLAG(w) |= RTGUI_WIDGET_FLAG_DISABLE +#define RTGUI_WIDGET_IS_ENABLE(w) !(RTGUI_WIDGET_FLAG(w) & RTGUI_WIDGET_FLAG_DISABLE) + +#define RTGUI_WIDGET_UNFOCUS(w) RTGUI_WIDGET_FLAG(w) &= ~RTGUI_WIDGET_FLAG_FOCUS +#define RTGUI_WIDGET_FOCUS(w) RTGUI_WIDGET_FLAG(w) |= RTGUI_WIDGET_FLAG_FOCUS +#define RTGUI_WIDGET_IS_FOCUSED(w) (RTGUI_WIDGET_FLAG(w) & RTGUI_WIDGET_FLAG_FOCUS) + +#define RTGUI_WIDGET_IS_FOCUSABLE(w) (RTGUI_WIDGET_FLAG(w) & RTGUI_WIDGET_FLAG_FOCUSABLE)
+
+#define RTGUI_WIDGET_IS_DC_VISIBLE(w) (RTGUI_WIDGET_FLAG(w) & RTGUI_WIDGET_FLAG_DC_VISIBLE) +#define RTGUI_WIDGET_DC_SET_VISIBLE(w) RTGUI_WIDGET_FLAG(w) |= RTGUI_WIDGET_FLAG_DC_VISIBLE +#define RTGUI_WIDGET_DC_SET_UNVISIBLE(w) RTGUI_WIDGET_FLAG(w) &= ~RTGUI_WIDGET_FLAG_DC_VISIBLE +#define RTGUI_WIDGET_DC(w) ((rtgui_dc_t*)&(RTGUI_WIDGET(w)->dc_type)) + +rtgui_type_t *rtgui_widget_type_get(void); +PVOID rtgui_widget_create(rtgui_type_t *widget_type); +void rtgui_widget_destroy(PVOID wdt); + +/* set the event handler of widget */ +void rtgui_widget_set_event_handler(PVOID wdt, rtgui_event_handler_ptr handler); +/* widget default event handler */ +rt_bool_t rtgui_widget_event_handler(PVOID wdt, rtgui_event_t* event); + +/* focus and unfocus */
+PVOID rtgui_widget_get_focus(PVOID wdt); +void rtgui_widget_focus(PVOID wdt); +void rtgui_widget_unfocus(PVOID wdt); + +/* event handler for each command */ +void rtgui_widget_set_onfocus(PVOID wdt, rtgui_event_handler_ptr handler); +void rtgui_widget_set_onunfocus(PVOID wdt, rtgui_event_handler_ptr handler); + +void rtgui_widget_set_ondraw(PVOID wdt, rtgui_event_handler_ptr handler); +void rtgui_widget_set_onmouseclick(PVOID wdt, rtgui_event_handler_ptr handler); +void rtgui_widget_set_onkey(PVOID wdt, rtgui_event_handler_ptr handler); +void rtgui_widget_set_onsize(PVOID wdt, rtgui_event_handler_ptr handler); +void rtgui_widget_set_oncommand(PVOID wdt, rtgui_event_handler_ptr handler); + +void rtgui_widget_get_rect(PVOID wdt, rtgui_rect_t *rect);/* get and set rect of widget */
+void rtgui_widget_set_rect(PVOID wdt, rtgui_rect_t* rect);
+void rtgui_widget_get_position(PVOID wdt, rtgui_point_t *p);
+rt_uint16_t rtgui_widget_get_width(PVOID wdt);
+rt_uint16_t rtgui_widget_get_height(PVOID wdt);
+
+void rtgui_widget_set_style(PVOID wdt, rt_uint32_t style); +void rtgui_widget_point_to_device(PVOID wdt, rtgui_point_t *point);/* get the physical position of a logic point on widget */ +void rtgui_widget_rect_to_device(PVOID wdt, rtgui_rect_t *rect);/* get the physical position of a logic rect on widget */ +void rtgui_widget_point_to_logic(PVOID wdt, rtgui_point_t *point);/* get the logic position of a physical point on widget */ +void rtgui_widget_rect_to_logic(PVOID wdt, rtgui_rect_t *rect);/* get the logic position of a physical rect on widget */ +void rtgui_widget_move_to_logic(PVOID wdt, int dx, int dy);/* move widget and its child to a logic point */
+ +/* update the clip info of widget */
+void rtgui_widget_update_clip(PVOID wdt);
+void rtgui_widget_update_clip_pirate(PVOID wdt,PVOID topwdt);
+ +PVOID rtgui_widget_get_toplevel(PVOID wdt); /* get the toplevel widget of widget */ +void rtgui_widget_show(PVOID wdt); +void rtgui_widget_hide(PVOID wdt); +void rtgui_widget_update(PVOID wdt);
+/* get parent color */ +rtgui_color_t rtgui_widget_get_parent_foreground(PVOID wdt); +rtgui_color_t rtgui_widget_get_parent_background(PVOID wdt); +/* get the next sibling of widget */
+rtgui_widget_t* rtgui_widget_get_next_sibling(PVOID wdt); +/* get the prev sibling of widget */
+rtgui_widget_t* rtgui_widget_get_prev_sibling(PVOID wdt); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/components/rtgui_win/include/rtgui/widgets/window.h b/components/rtgui_win/include/rtgui/widgets/window.h new file mode 100644 index 0000000000..7a5f32a346 --- /dev/null +++ b/components/rtgui_win/include/rtgui/widgets/window.h @@ -0,0 +1,130 @@ +/*
+ * File : window.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
+ * 2010-05-03 Bernard add win close function
+ */
+#ifndef __RTGUI_WINDOW_H__
+#define __RTGUI_WINDOW_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/widgets/container.h>
+
+/** Gets the type of a win */
+#define RTGUI_WIN_TYPE (rtgui_win_type_get())
+/** Casts the object to an rtgui_win_t */
+#define RTGUI_WIN(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_WIN_TYPE, rtgui_win_t))
+/** Checks if the object is an rtgui_win_t */
+#define RTGUI_IS_WIN(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_WIN_TYPE))
+
+#define RTGUI_WIN_CLOSEBOX_WIDTH 16
+#define RTGUI_WIN_CLOSEBOX_HEIGHT 16
+
+#define RTGUI_WIN_TITLE_HEIGHT 20 //�������߶�
+#define RTGUI_WIN_STATUS_HEIGHT 20 //״̬���߶�
+#define RTGUI_WIN_MENU_HEIGHT 20 //�˵����߶�
+
+//���ڵ�״̬
+#define RTGUI_WIN_STATUS_MODAL (1ul << 0) //ģʽ����
+#define RTGUI_WIN_STATUS_MIN (1ul << 1)
+#define RTGUI_WIN_STATUS_MAX (1ul << 2) //���ڴ������״̬
+#define RTGUI_WIN_STATUS_CLOSED (1ul << 3) //�رյ�
+#define RTGUI_WIN_STATUS_ACTIVATE (1ul << 4) //���
+#define RTGUI_WIN_STATUS_FOCUS (1ul << 5) //��ý����
+
+#define RTGUI_WIN_IS_MODAL_MODE(w) (w->status & RTGUI_WIN_STATUS_MODAL)
+//���ڵ���ʽ,����
+#define RTGUI_WIN_TITLE (1ul << 1) //������
+#define RTGUI_WIN_STATUS (1ul << 2) //״̬��
+#define RTGUI_WIN_MENU (1ul << 3) //�˵���
+#define RTGUI_WIN_BORDER (1ul << 4) //�߿�
+#define RTGUI_WIN_MINBOX (1ul << 5) //��С����ť
+#define RTGUI_WIN_MAXBOX (1ul << 6) //���ť
+#define RTGUI_WIN_CLOSEBOX (1ul << 7) //�رհ�ť
+#define RTGUI_WIN_MINBOX_PRESSED (1ul << 8)
+#define RTGUI_WIN_MAXBOX_PRESSED (1ul << 9)
+#define RTGUI_WIN_CLOSEBOX_PRESSED (1ul << 10) //�رհ�ť������
+
+#define RTGUI_WIN_NOTITLE (0)
+#define RTGUI_WIN_DEFAULT (RTGUI_WIN_BORDER|RTGUI_WIN_TITLE|RTGUI_WIN_CLOSEBOX)
+#define RTGUI_WIN_DIALOG (RTGUI_WIN_BORDER|RTGUI_WIN_TITLE|RTGUI_WIN_CLOSEBOX|RTGUI_WIN_MINBOX)
+#define RTGUI_WIN_NORMAL (RTGUI_WIN_BORDER|RTGUI_WIN_TITLE|RTGUI_WIN_CLOSEBOX|RTGUI_WIN_MINBOX|RTGUI_WIN_MAXBOX)
+
+
+struct rtgui_win_title;
+struct rtgui_win_area;
+
+struct rtgui_win
+{
+ /* inherit from top */
+ rtgui_container_t parent;
+
+ /* window title */
+ char* title;
+
+ /* parent top */
+ PVOID modal_widget;
+ rtgui_list_t list; /* window list */
+
+ /* the thread id */
+ struct rt_thread* tid; //�����߳�
+
+ rt_uint32_t style; //���ڵ���ʽ
+ rt_uint32_t status; //���ڵ�״̬
+ rt_uint16_t title_height; //�������߶�
+ rt_uint16_t status_height; //״̬���߶�
+ rt_uint16_t menu_height; //�˵����߶�
+ rt_uint16_t border_size; //����߿����
+
+ /* call back */
+ rt_bool_t (*on_activate)(PVOID wdt, rtgui_event_t* event);
+ rt_bool_t (*on_deactivate)(PVOID wdt, rtgui_event_t* event);
+ rt_bool_t (*on_close)(PVOID wdt, rtgui_event_t* event);
+
+ /* reserved user data */
+ void* user_data;
+};
+
+rtgui_type_t *rtgui_win_type_get(void);
+rtgui_win_t* rtgui_win_create(PVOID parent, const char* title, rtgui_rect_t *rect, rt_uint32_t flag);
+void rtgui_win_destroy(rtgui_win_t* win);
+rtgui_win_t* rtgui_win_get_win_by_widget(PVOID wdt);
+void rtgui_win_close(PVOID wdt, rtgui_event_t *event);
+rt_bool_t rtgui_win_ondraw(rtgui_win_t* win);
+
+void rtgui_win_show(rtgui_win_t* win, rt_bool_t modal);
+void rtgui_win_hiden(rtgui_win_t* win);
+void rtgui_win_end_modal(rtgui_win_t* win);
+
+rt_bool_t rtgui_win_is_activated(rtgui_win_t* win);
+
+void rtgui_win_move(rtgui_win_t* win, int x, int y);
+
+/* reset extent of window */
+void rtgui_win_set_rect(rtgui_win_t* win, rtgui_rect_t* rect);
+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);
+
+rt_bool_t rtgui_win_event_handler(PVOID wdt, rtgui_event_t* event);
+void rtgui_win_event_loop(rtgui_win_t* win);
+
+void rtgui_win_set_title(rtgui_win_t* win, const char *title);
+char* rtgui_win_get_title(rtgui_win_t* win);
+
+rtgui_point_t rtgui_win_get_client_zero(rtgui_win_t *win);
+void rtgui_win_get_client_rect(rtgui_win_t *win, rtgui_rect_t *rect);
+void rtgui_win_get_title_rect(rtgui_win_t *win, rtgui_rect_t *rect);
+void rtgui_win_get_closebox_rect(rtgui_win_t *win, rtgui_rect_t *rect);
+void rtgui_win_get_maxbox_rect(rtgui_win_t *win, rtgui_rect_t *rect);
+void rtgui_win_get_minbox_rect(rtgui_win_t *win, rtgui_rect_t *rect);
+
+#endif
|
