Răsfoiți Sursa

fix various bugs found by amsl

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@2131 bbd45198-f89e-11dd-88c7-29a3b14d5316
chaos.proton@gmail.com 13 ani în urmă
părinte
comite
87e992a574
2 a modificat fișierele cu 15 adăugiri și 11 ștergeri
  1. 3 6
      components/rtgui/widgets/checkbox.c
  2. 12 5
      components/rtgui/widgets/container.c

+ 3 - 6
components/rtgui/widgets/checkbox.c

@@ -16,7 +16,7 @@ static void _rtgui_checkbox_constructor(rtgui_checkbox_t *box)
 	RTGUI_WIDGET_TEXTALIGN(RTGUI_WIDGET(box)) = RTGUI_ALIGN_LEFT | RTGUI_ALIGN_CENTER_VERTICAL;
 }
 
-DEFINE_CLASS_TYPE(checkbox, "checkbox", 
+DEFINE_CLASS_TYPE(checkbox, "checkbox",
 	RTGUI_LABEL_TYPE,
 	_rtgui_checkbox_constructor,
 	RT_NULL,
@@ -31,13 +31,10 @@ void rtgui_checkbox_set_onbutton(rtgui_checkbox_t* checkbox, rtgui_onbutton_func
 
 rt_bool_t rtgui_checkbox_event_handler(struct rtgui_object* object, struct rtgui_event* event)
 {
-	struct rtgui_widget *widget;
-	struct rtgui_checkbox *box = (struct rtgui_checkbox*)widget;
+	struct rtgui_checkbox *box;
 
-	RT_ASSERT(widget != RT_NULL);
-	RT_ASSERT(event != RT_NULL);
+	RTGUI_WIDGET_EVENT_HANDLER_PREPARE
 
-	widget = RTGUI_WIDGET(object);
 	box = RTGUI_CHECKBOX(object);
 
 	switch (event->type)

+ 12 - 5
components/rtgui/widgets/container.c

@@ -83,7 +83,8 @@ rt_bool_t rtgui_container_dispatch_event(rtgui_container_t *container, rtgui_eve
 		struct rtgui_widget* w;
 		w = rtgui_list_entry(node, struct rtgui_widget, sibling);
 
-		if (RTGUI_OBJECT(w)->event_handler(RTGUI_OBJECT(w), event) == RT_TRUE)
+		if (RTGUI_OBJECT(w)->event_handler &&
+			RTGUI_OBJECT(w)->event_handler(RTGUI_OBJECT(w), event) == RT_TRUE)
 			return RT_TRUE;
 	}
 
@@ -107,7 +108,8 @@ rt_bool_t rtgui_container_dispatch_mouse_event(rtgui_container_t *container, str
 		{
 			if ((old_focus != w) && RTGUI_WIDGET_IS_FOCUSABLE(w))
 				rtgui_widget_focus(w);
-			if (RTGUI_OBJECT(w)->event_handler(RTGUI_OBJECT(w),
+			if (RTGUI_OBJECT(w)->event_handler &&
+				RTGUI_OBJECT(w)->event_handler(RTGUI_OBJECT(w),
 											   (rtgui_event_t*)event) == RT_TRUE)
 				return RT_TRUE;
 		}
@@ -152,7 +154,8 @@ rt_bool_t rtgui_container_event_handler(struct rtgui_object* object, struct rtgu
 	case RTGUI_EVENT_KBD:
 		/* let parent to handle keyboard event */
 		if (widget->parent != RT_NULL &&
-			widget->parent != RTGUI_WIDGET(widget->toplevel))
+			widget->parent != RTGUI_WIDGET(widget->toplevel) &&
+			RTGUI_OBJECT(widget->parent)->event_handler)
 		{
 			return RTGUI_OBJECT(widget->parent)->event_handler(
 					RTGUI_OBJECT(widget->parent),
@@ -244,7 +247,8 @@ void rtgui_container_destroy_children(rtgui_container_t *container)
 {
 	struct rtgui_list_node* node;
 
-	if (container == RT_NULL) return;
+	if (container == RT_NULL)
+		return;
 
 	node = container->children.next;
 	while (node != RT_NULL)
@@ -282,6 +286,8 @@ rtgui_widget_t* rtgui_container_get_first_child(rtgui_container_t* container)
 {
 	rtgui_widget_t* child = RT_NULL;
 
+	RT_ASSERT(container != RT_NULL);
+
 	if (container->children.next != RT_NULL)
 	{
 		child = rtgui_list_entry(container->children.next, rtgui_widget_t, sibling);
@@ -303,7 +309,8 @@ void rtgui_container_set_box(rtgui_container_t* container, struct rtgui_box* box
 
 void rtgui_container_hide(rtgui_container_t* container)
 {
-	if (container == RT_NULL) return;
+	if (container == RT_NULL)
+		return;
 
 	if (RTGUI_WIDGET(container)->parent == RT_NULL)
 	{