Browse Source

Add a macro to declare fltk derived classes to handle virtual method "handle"

mingodad 13 years ago
parent
commit
cbee9a6924
1 changed files with 26 additions and 56 deletions
  1. 26 56
      SquiLu-ext/sq_fltk.cpp

+ 26 - 56
SquiLu-ext/sq_fltk.cpp

@@ -85,7 +85,6 @@ CREATE_TAG(Fl_Menu_Item);
 CREATE_TAG(Fl_Choice);
 CREATE_TAG(Fl_Input_);
 CREATE_TAG(Fl_Float_Input);
-CREATE_TAG(Fl_Float_Input_Fmt);
 CREATE_TAG(Fl_Int_Input);
 CREATE_TAG(Fl_Output);
 CREATE_TAG(Fl_Secret_Input);
@@ -602,6 +601,23 @@ static SQRESULT getInstance_for_##Klass(HSQUIRRELVM v, Klass *widget){\
 static SQRESULT _##Klass##_className(HSQUIRRELVM v){sq_pushstring(v, Klass::className(), -1); return 1;};\
 static SQRESULT _##Klass##_cheap_rtti_info(HSQUIRRELVM v){sq_pushuserpointer(v, (SQUserPointer)Klass::cheap_rtti_info()); return 1;};
 
+#define MY_FL_CLASS_HANDLE(klass, setup_fl) \
+MY_FL_CLASS(klass,\
+    int handle(int event){\
+        int rc;\
+        if(sq_call_fl_virtual_va(this, "handle", "i>i", event, &rc) == 0) return rc;\
+        return klass::handle(event);\
+    }\
+);\
+static SQRESULT _My##klass##_handle(HSQUIRRELVM v)\
+{\
+    SQ_FUNC_VARS_NO_TOP(v);\
+    setup_fl(v);\
+    SQ_GET_INTEGER(v, 2, event);\
+    sq_pushinteger(v, ((My##klass *)self)->klass::handle(event));\
+    return 1;\
+}
+
 #define CHEAP_RTTI_REG_FUN_FOR(Klass) \
 {_SC("className"),_##Klass##_className, 1,_SC("y"), SQTrue},\
 {_SC("cheap_rtti_info"),_##Klass##_cheap_rtti_info, 1,_SC("y"), SQTrue},
@@ -1038,24 +1054,8 @@ static SQRegFunction fl_progress_obj_funcs[]={
 };
 #undef _DECL_FUNC
 
-MY_FL_CLASS(Fl_Button,
-    int handle(int event){
-        int rc;
-        if(sq_call_fl_virtual_va(this, "handle", "i>i", event, &rc) == 0) return rc;
-        return Fl_Button::handle(event);
-    }
-)
-
 #define SETUP_FL_BUTTON(v) SETUP_FL_KLASS(v, Fl_Button)
-
-static SQRESULT _MyFl_Button_handle(HSQUIRRELVM v)
-{
-    SQ_FUNC_VARS_NO_TOP(v);
-    SETUP_FL_BUTTON(v);
-    SQ_GET_INTEGER(v, 2, event);
-    sq_pushinteger(v, ((MyFl_Button*)self)->Fl_Button::handle(event));
-    return 1;
-}
+MY_FL_CLASS_HANDLE(Fl_Button, SETUP_FL_BUTTON);
 
 #define FL_BUTTON_GETSET_INT_CAST(funcNAME, typeNAME) FUNC_GETSET_INT(_MyFl_Button_, SETUP_FL_BUTTON, self->, funcNAME, typeNAME)
 FL_BUTTON_GETSET_INT_CAST(down_box, Fl_Boxtype);
@@ -1393,24 +1393,8 @@ static SQRegFunction fl_input__obj_funcs[]={
 };
 #undef _DECL_FUNC
 
-MY_FL_CLASS(Fl_Input,
-    int handle(int event){
-        int rc;
-        if(sq_call_fl_virtual_va(this, "handle", "i>i", event, &rc) == 0) return rc;
-        return Fl_Input::handle(event);
-    }
-)
-
 #define SETUP_FL_INPUT(v) SETUP_FL_KLASS(v, Fl_Input)
-
-static SQRESULT _MyFl_Input_handle(HSQUIRRELVM v)
-{
-    SQ_FUNC_VARS_NO_TOP(v);
-    SETUP_FL_INPUT(v);
-    SQ_GET_INTEGER(v, 2, event);
-    sq_pushinteger(v, ((MyFl_Input*)self)->Fl_Input::handle(event));
-    return 1;
-}
+MY_FL_CLASS_HANDLE(Fl_Input, SETUP_FL_INPUT);
 
 FUNC_GETSET_STR(_MyFl_Input_, NOTHING, Fl_Input::, default_number_format);
 FUNC_GETSET_STR(_MyFl_Input_, SETUP_FL_INPUT, self->, number_format);
@@ -1445,10 +1429,13 @@ static SQRegFunction fl_float_input_obj_funcs[]={
 };
 #undef _DECL_FUNC
 
-FLTK_CONSTRUCTOR(Fl_Float_Input_Fmt);
-#define _DECL_FUNC(name,nparams,pmask,isStatic) {_SC(#name),_Fl_Float_Input_Fmt_##name,nparams,pmask,isStatic}
+#define SETUP_FL_FLOAT_INPUT_FMT(v) SETUP_FL_KLASS(v, Fl_Float_Input_Fmt)
+MY_FL_CLASS_HANDLE(Fl_Float_Input_Fmt, SETUP_FL_FLOAT_INPUT_FMT);
+
+#define _DECL_FUNC(name,nparams,pmask,isStatic) {_SC(#name),_MyFl_Float_Input_Fmt_##name,nparams,pmask,isStatic}
 static SQRegFunction fl_float_input_fmt_obj_funcs[]={
 	_DECL_FUNC(constructor,-5,FLTK_constructor_Mask, SQFalse),
+	_DECL_FUNC(handle,2,_SC("xi"),SQFalse),
 	{0,0}
 };
 #undef _DECL_FUNC
@@ -1765,25 +1752,8 @@ static SQRegFunction flu_tree_browser_node_obj_funcs[]={
 };
 #undef _DECL_FUNC
 
-MY_FL_CLASS(Flu_Tree_Browser,
-    int handle(int event){
-        int rc;
-        if(sq_call_fl_virtual_va(this, "handle", "i>i", event, &rc) == 0) return rc;
-        return Flu_Tree_Browser::handle(event);
-    }
-)
-
-#define SETUP_FLU_TREE_BROWSER(v) SETUP_FL_KLASS(v, Flu_Tree_Browser)
-
-static SQRESULT _MyFlu_Tree_Browser_handle(HSQUIRRELVM v)
-{
-    SQ_FUNC_VARS_NO_TOP(v);
-    SETUP_FLU_TREE_BROWSER(v);
-    SQ_GET_INTEGER(v, 2, event);
-    sq_pushinteger(v, ((MyFlu_Tree_Browser*)self)->Flu_Tree_Browser::handle(event));
-    return 1;
-}
-
+#define SETUP_FLU_TREE_BROWSER(v) SETUP_FL_KLASS(v, Flu_Tree_Browser)
+MY_FL_CLASS_HANDLE(Flu_Tree_Browser, SETUP_FLU_TREE_BROWSER);
 
 FUNC_GETSET_BOOL(_MyFlu_Tree_Browser_, SETUP_FLU_TREE_BROWSER, self->, auto_branches);
 FUNC_GETSET_BOOL(_MyFlu_Tree_Browser_, SETUP_FLU_TREE_BROWSER, self->, show_branches);