The full log is at https://github.com/RTGUI/RTGUI/commits/merge_1 and it's difficult to merge the new tree commit by commit. I also converted all the file into unix eol so there are many fake diff. Big changes are noted in rtgui/doc/road_map.txt and rtgui/doc/attention.txt. Keep an eye on them if you want to migrate your old code. Note that the work is still in progress and the bsp is not prepared in trunk so far. git-svn-id: https://rt-thread.googlecode.com/svn/trunk@2092 bbd45198-f89e-11dd-88c7-29a3b14d5316
139 lines
4.3 KiB
C
139 lines
4.3 KiB
C
/*
|
|
* File : rtgui_object.h
|
|
* This file is part of RTGUI in RT-Thread RTOS
|
|
* COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
|
|
*
|
|
* The license and distribution terms for this file may be
|
|
* found in the file LICENSE in this distribution or at
|
|
* http://www.rt-thread.org/license/LICENSE
|
|
*
|
|
* Change Logs:
|
|
* Date Author Notes
|
|
* 2009-10-04 Bernard first version
|
|
*/
|
|
#ifndef __RTGUI_OBJECT_H__
|
|
#define __RTGUI_OBJECT_H__
|
|
|
|
|
|
#include <rtthread.h>
|
|
#include <rtgui/rtgui.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* rtgui object type */
|
|
#define RTGUI_CONTAINER_OF(obj, type, member) \
|
|
((type *)((char *)(obj) - (unsigned long)(&((type *)0)->member)))
|
|
|
|
/** Casts the function pointer to an rtgui_constructor */
|
|
#define RTGUI_CONSTRUCTOR(constructor) ((rtgui_constructor_t)(constructor))
|
|
/** Casts the function pointer to an rtgui_constructor */
|
|
#define RTGUI_DESTRUCTOR(destructor) ((rtgui_destructor_t)(destructor))
|
|
|
|
/* pre-definetion */
|
|
struct rtgui_object;
|
|
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;
|
|
|
|
/* parent type link */
|
|
struct rtgui_type *parent;
|
|
|
|
/* constructor and destructor */
|
|
rtgui_constructor_t constructor;
|
|
rtgui_destructor_t destructor;
|
|
|
|
/* size of type */
|
|
int size;
|
|
};
|
|
typedef struct rtgui_type rtgui_type_t;
|
|
#define RTGUI_TYPE(type) (struct rtgui_type*)&(_rtgui_##type)
|
|
|
|
#define DECLARE_CLASS_TYPE(type) extern const struct rtgui_type _rtgui_##type
|
|
#define DEFINE_CLASS_TYPE(type, name, parent, constructor, destructor, size) \
|
|
const struct rtgui_type _rtgui_##type = { \
|
|
name, \
|
|
parent, \
|
|
RTGUI_CONSTRUCTOR(constructor), \
|
|
RTGUI_DESTRUCTOR(destructor), \
|
|
size }
|
|
|
|
void rtgui_type_object_construct(const rtgui_type_t *type, rtgui_object_t *object);
|
|
void rtgui_type_destructors_call(const rtgui_type_t *type, rtgui_object_t *object);
|
|
rt_bool_t rtgui_type_inherits_from(const rtgui_type_t *type, const rtgui_type_t *parent);
|
|
const rtgui_type_t *rtgui_type_parent_type_get(const rtgui_type_t *type);
|
|
const char *rtgui_type_name_get(const rtgui_type_t *type);
|
|
const rtgui_type_t *rtgui_object_object_type_get(rtgui_object_t *object);
|
|
|
|
#ifdef RTGUI_USING_CAST_CHECK
|
|
#define RTGUI_OBJECT_CAST(obj, obj_type, c_type) \
|
|
((c_type *)rtgui_object_check_cast((rtgui_object_t *)(obj), (obj_type)))
|
|
#else
|
|
#define RTGUI_OBJECT_CAST(obj, obj_type, c_type) ((c_type *)(obj))
|
|
#endif
|
|
|
|
#define RTGUI_OBJECT_CHECK_TYPE(_obj, _type) \
|
|
(rtgui_type_inherits_from(((rtgui_object_t *)(_obj))->type, (_type)))
|
|
|
|
DECLARE_CLASS_TYPE(type);
|
|
/** Gets the type of an object */
|
|
#define RTGUI_OBJECT_TYPE RTGUI_TYPE(type)
|
|
/** Casts the object to an rtgui_object_t */
|
|
#define RTGUI_OBJECT(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_OBJECT_TYPE, struct rtgui_object))
|
|
/** Checks if the object is an rtgui_Object */
|
|
#define RTGUI_IS_OBJECT(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_OBJECT_TYPE))
|
|
|
|
enum rtgui_object_flag
|
|
{
|
|
RTGUI_OBJECT_FLAG_NONE = 0x00,
|
|
RTGUI_OBJECT_FLAG_STATIC = 0x01,
|
|
RTGUI_OBJECT_FLAG_DISABLED = 0x02
|
|
};
|
|
|
|
/* rtgui base object */
|
|
struct rtgui_object
|
|
{
|
|
/* object type */
|
|
const rtgui_type_t* type;
|
|
|
|
/* the event handler */
|
|
rtgui_event_handler_ptr event_handler;
|
|
|
|
enum rtgui_object_flag flag;
|
|
};
|
|
|
|
rtgui_object_t *rtgui_object_create(rtgui_type_t *object_type);
|
|
void rtgui_object_destroy(rtgui_object_t *object);
|
|
|
|
/* set the event handler of object */
|
|
void rtgui_object_set_event_handler(struct rtgui_object *object, rtgui_event_handler_ptr handler);
|
|
/* object default event handler */
|
|
rt_bool_t rtgui_object_event_handler(struct rtgui_object *object, struct rtgui_event* event);
|
|
/* helper micro. widget event handlers could use this. */
|
|
#define RTGUI_WIDGET_EVENT_HANDLER_PREPARE \
|
|
struct rtgui_widget *widget; \
|
|
RT_ASSERT(object != RT_NULL); \
|
|
RT_ASSERT(event != RT_NULL); \
|
|
widget = RTGUI_WIDGET(object); \
|
|
/* supress compiler warning */ \
|
|
widget = widget;
|
|
|
|
void rtgui_object_name_set(rtgui_object_t *object, const char *name);
|
|
const char *rtgui_object_name_get(rtgui_object_t *object);
|
|
|
|
rtgui_object_t *rtgui_object_check_cast(rtgui_object_t *object, rtgui_type_t *type);
|
|
rtgui_type_t *rtk_object_object_type_get(rtgui_object_t *object);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|