From 0e93e6809c7beac4597148edc1dc09bcdf9a2ab3 Mon Sep 17 00:00:00 2001 From: "iamyhw@gmail.com" Date: Thu, 24 Mar 2011 14:00:19 +0000 Subject: add rtgui_win subfield,Highlight the ease of use git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1345 bbd45198-f89e-11dd-88c7-29a3b14d5316 --- components/rtgui_win/include/rtgui/blit.h | 9 + components/rtgui_win/include/rtgui/color.h | 104 +++ components/rtgui_win/include/rtgui/dc.h | 197 ++++++ components/rtgui_win/include/rtgui/dc_client.h | 27 + components/rtgui_win/include/rtgui/dc_hw.h | 24 + components/rtgui_win/include/rtgui/driver.h | 67 ++ components/rtgui_win/include/rtgui/event.h | 341 ++++++++++ components/rtgui_win/include/rtgui/filerw.h | 48 ++ components/rtgui_win/include/rtgui/font.h | 116 ++++ components/rtgui_win/include/rtgui/image.h | 78 +++ components/rtgui_win/include/rtgui/image_bmp.h | 19 + components/rtgui_win/include/rtgui/image_hdc.h | 37 + components/rtgui_win/include/rtgui/image_jpeg.h | 8 + components/rtgui_win/include/rtgui/image_png.h | 21 + components/rtgui_win/include/rtgui/image_xpm.h | 21 + components/rtgui_win/include/rtgui/kbddef.h | 293 ++++++++ components/rtgui_win/include/rtgui/list.h | 66 ++ components/rtgui_win/include/rtgui/region.h | 101 +++ components/rtgui_win/include/rtgui/rtgui.h | 154 +++++ components/rtgui_win/include/rtgui/rtgui_config.h | 41 ++ components/rtgui_win/include/rtgui/rtgui_object.h | 107 +++ components/rtgui_win/include/rtgui/rtgui_server.h | 32 + components/rtgui_win/include/rtgui/rtgui_system.h | 94 +++ components/rtgui_win/include/rtgui/rtgui_theme.h | 80 +++ components/rtgui_win/include/rtgui/rtgui_xml.h | 34 + components/rtgui_win/include/rtgui/tree.h | 748 +++++++++++++++++++++ .../rtgui_win/include/rtgui/widgets/button.h | 84 +++ .../rtgui_win/include/rtgui/widgets/checkbox.h | 35 + .../rtgui_win/include/rtgui/widgets/combobox.h | 62 ++ .../rtgui_win/include/rtgui/widgets/container.h | 50 ++ .../rtgui_win/include/rtgui/widgets/dialog.h | 32 + .../include/rtgui/widgets/filelist_view.h | 60 ++ .../rtgui_win/include/rtgui/widgets/iconbox.h | 58 ++ components/rtgui_win/include/rtgui/widgets/label.h | 48 ++ .../rtgui_win/include/rtgui/widgets/list_view.h | 76 +++ .../rtgui_win/include/rtgui/widgets/listbox.h | 75 +++ components/rtgui_win/include/rtgui/widgets/menu.h | 106 +++ .../rtgui_win/include/rtgui/widgets/progressbar.h | 40 ++ .../rtgui_win/include/rtgui/widgets/radiobox.h | 42 ++ .../rtgui_win/include/rtgui/widgets/scrollbar.h | 92 +++ .../rtgui_win/include/rtgui/widgets/slider.h | 40 ++ .../rtgui_win/include/rtgui/widgets/staticline.h | 32 + .../rtgui_win/include/rtgui/widgets/textbox.h | 78 +++ components/rtgui_win/include/rtgui/widgets/view.h | 62 ++ .../rtgui_win/include/rtgui/widgets/widget.h | 168 +++++ .../rtgui_win/include/rtgui/widgets/window.h | 130 ++++ 46 files changed, 4237 insertions(+) create mode 100644 components/rtgui_win/include/rtgui/blit.h create mode 100644 components/rtgui_win/include/rtgui/color.h create mode 100644 components/rtgui_win/include/rtgui/dc.h create mode 100644 components/rtgui_win/include/rtgui/dc_client.h create mode 100644 components/rtgui_win/include/rtgui/dc_hw.h create mode 100644 components/rtgui_win/include/rtgui/driver.h create mode 100644 components/rtgui_win/include/rtgui/event.h create mode 100644 components/rtgui_win/include/rtgui/filerw.h create mode 100644 components/rtgui_win/include/rtgui/font.h create mode 100644 components/rtgui_win/include/rtgui/image.h create mode 100644 components/rtgui_win/include/rtgui/image_bmp.h create mode 100644 components/rtgui_win/include/rtgui/image_hdc.h create mode 100644 components/rtgui_win/include/rtgui/image_jpeg.h create mode 100644 components/rtgui_win/include/rtgui/image_png.h create mode 100644 components/rtgui_win/include/rtgui/image_xpm.h create mode 100644 components/rtgui_win/include/rtgui/kbddef.h create mode 100644 components/rtgui_win/include/rtgui/list.h create mode 100644 components/rtgui_win/include/rtgui/region.h create mode 100644 components/rtgui_win/include/rtgui/rtgui.h create mode 100644 components/rtgui_win/include/rtgui/rtgui_config.h create mode 100644 components/rtgui_win/include/rtgui/rtgui_object.h create mode 100644 components/rtgui_win/include/rtgui/rtgui_server.h create mode 100644 components/rtgui_win/include/rtgui/rtgui_system.h create mode 100644 components/rtgui_win/include/rtgui/rtgui_theme.h create mode 100644 components/rtgui_win/include/rtgui/rtgui_xml.h create mode 100644 components/rtgui_win/include/rtgui/tree.h create mode 100644 components/rtgui_win/include/rtgui/widgets/button.h create mode 100644 components/rtgui_win/include/rtgui/widgets/checkbox.h create mode 100644 components/rtgui_win/include/rtgui/widgets/combobox.h create mode 100644 components/rtgui_win/include/rtgui/widgets/container.h create mode 100644 components/rtgui_win/include/rtgui/widgets/dialog.h create mode 100644 components/rtgui_win/include/rtgui/widgets/filelist_view.h create mode 100644 components/rtgui_win/include/rtgui/widgets/iconbox.h create mode 100644 components/rtgui_win/include/rtgui/widgets/label.h create mode 100644 components/rtgui_win/include/rtgui/widgets/list_view.h create mode 100644 components/rtgui_win/include/rtgui/widgets/listbox.h create mode 100644 components/rtgui_win/include/rtgui/widgets/menu.h create mode 100644 components/rtgui_win/include/rtgui/widgets/progressbar.h create mode 100644 components/rtgui_win/include/rtgui/widgets/radiobox.h create mode 100644 components/rtgui_win/include/rtgui/widgets/scrollbar.h create mode 100644 components/rtgui_win/include/rtgui/widgets/slider.h create mode 100644 components/rtgui_win/include/rtgui/widgets/staticline.h create mode 100644 components/rtgui_win/include/rtgui/widgets/textbox.h create mode 100644 components/rtgui_win/include/rtgui/widgets/view.h create mode 100644 components/rtgui_win/include/rtgui/widgets/widget.h create mode 100644 components/rtgui_win/include/rtgui/widgets/window.h (limited to 'components/rtgui_win/include/rtgui') 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 + +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 + + +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 +#include +#include +#include + +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 + +/* 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 + +/* 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 +#include + +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 +#include + +/* 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 + +#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 +#include + +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 +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 +#include +#include +#include +#include +#include + +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 + +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 + +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 + +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 + +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 + +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 + +#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 +#include +#include + +#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 + +#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 + +#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 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 +#include + +#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 + +#define CHECK_BOX_W 13 +#define CHECK_BOX_H 13 + +#define RADIO_BOX_W 12 +#define RADIO_BOX_H 12 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 + +/* 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 + * 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 + +/* + * 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 +#include +#include +#include +#include + +#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 + + +#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 +#include +#include +#include +#include +#include +#include + +#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 +#include + +/** 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 +#include +#include +#include + +#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 +#include +#include +#include +#include + +/** 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 +#include + +/** 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 +#include +#include +#include +#include + +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 +#include +#include +#include + +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 +#include +#include + +#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; + /* 用于辅助绘图的参数,如果无需绘图,去掉这些参数没有影响 */ + rt_uint32_t orient; /* 排列方向 */ + rt_uint32_t item_size; /* 菜单项尺寸 */ + rt_uint16_t item_count; /* 菜单项数 */ + + rtgui_menu_item_t* current_item; /* 当前的菜单项 */ + 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 + +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 +#include +#include + +/** 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 +#include + +#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 +#include + +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 + +/* + * 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 +#include + +/** 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 //行缓存的长度 + +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 + +#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 +#include +#include +#include +#include + +#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 +#include + +/** 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 -- cgit v1.3.1