pass a single struct to e_gadget_new() instead of a ton of functions.
authorrephorm <rephorm>
Sun, 18 Dec 2005 07:37:53 +0000 (07:37 +0000)
committerrephorm <rephorm@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 18 Dec 2005 07:37:53 +0000 (07:37 +0000)
SVN revision: 19107

src/bin/e_gadget.c
src/bin/e_gadget.h
src/modules/gadget_test/e_mod_main.c

index 7da8493763d377c62bac5594157bc3b51f5046a8..af9364c54a113aa0802b916f351735777682131c 100644 (file)
@@ -11,37 +11,55 @@ static void _e_gadget_menu_init(E_Gadget *gad);
 static void _e_gadget_face_menu_init(E_Gadget_Face *face);
 static void _e_gadget_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info);
 
-
+/**
+ * Create a new gadget. Takes an E_Gadget_Api struct.
+ * The module and name fields of the api struct are required. The rest are
+ * optional, however in order to be useful, at least func_face_init and
+ * func_face_free should be defined. The possible fields api fields are:
+ *
+ * E_Module *module - the module that contains this gadget
+ * char *name - a unique name for this module
+ * void (*func_face_init) (void *data, E_Gadget_Face *gadget_face) - 
+ *    A function that initializes the gadget's face. All evas objects should 
+ *    be drawn on gadget_face->evas.
+ * void (*func_face_free) (void *data, E_Gadget_Face *gadget_face) -
+ *    A function that frees all memory allocated in func_face_init
+ * void (*func_change) (void *data, E_Gadget_Face *gadget_face,
+ *                     E_Gadman_Client *gmc, E_Gadman_Change change) -
+ *    A function that is called whenever the gadget is resized.
+ * void (*func_menu_init) (void *data, E_Gadget *gadget) -
+ *    A function that initializes the gadget's main menu. 
+ * void (*func_face_menu_init) (void *data, E_Gadget_Face *gadget_face) -
+ *    A function that initializes the gadget's face menu. This is displayed
+ *    when the user right clicks on the gadget's face.
+ * void *data - a pointer to some data to be passed to all callbacks.
+ * 
+ */
 E_Gadget *
-e_gadget_new(E_Module *module,
-            const char *name,
-            void (*func_face_init) (void *data, E_Gadget_Face *gadget_face),
-            void (*func_face_free) (void *data, E_Gadget_Face *gadget_face),
-            void (*func_change) (void *data, E_Gadget_Face *gadget_face, E_Gadman_Client *gmc, E_Gadman_Change change),
-            void (*func_menu_init) (void *data, E_Gadget *gadget),
-            void (*func_face_menu_init) (void *data, E_Gadget_Face *gadget_face),
-            void *data)
+e_gadget_new(E_Gadget_Api *api)
 {
    E_Gadget *gad;
    Evas_List *managers, *l = NULL, *l2 = NULL;
    char buf[1024];
    int gadget_count = 0;
 
+   if (!api || !api->module || !api->name) return NULL;
+
    gad = E_OBJECT_ALLOC(E_Gadget, E_GADGET_TYPE, _e_gadget_free);
    if (!gad) return NULL;
 
-   gad->module = module;
+
+   gad->module = api->module;
    e_object_ref(E_OBJECT(gad->module));
 
-   if(!name) return NULL;
-   gad->name = evas_stringshare_add(name);
+   gad->name = evas_stringshare_add(api->name);
 
-   gad->funcs.face_init = func_face_init;
-   gad->funcs.face_free = func_face_free;
-   gad->funcs.change = func_change;
-   gad->funcs.menu_init = func_menu_init;
-   gad->funcs.face_menu_init = func_face_menu_init;
-   gad->data = data;
+   gad->funcs.face_init = api->func_face_init;
+   gad->funcs.face_free = api->func_face_free;
+   gad->funcs.change = api->func_change;
+   gad->funcs.menu_init = api->func_menu_init;
+   gad->funcs.face_menu_init = api->func_face_menu_init;
+   gad->data = api->data;
 
 
    /* get all desktop evases, and call init function on them */
index 029307420d633ea17ef2e6f6cbf28c2cbce96aa0..9c71820b0dae9570fd962d588bbddab292fbbb63 100644 (file)
@@ -3,6 +3,7 @@
 typedef struct _E_Gadget E_Gadget;
 typedef struct _E_Gadget_Face E_Gadget_Face;
 typedef struct _E_Gadget_Change E_Gadget_Change;
+typedef struct _E_Gadget_Api E_Gadget_Api;
 
 #else 
 #ifndef E_GADGET_H
@@ -10,6 +11,18 @@ typedef struct _E_Gadget_Change E_Gadget_Change;
 
 #define E_GADGET_TYPE 0xE0b01021
 
+struct _E_Gadget_Api
+{
+  E_Module *module;
+  const char *name;
+  void (*func_face_init) (void *data, E_Gadget_Face *gadget_face);
+  void (*func_face_free) (void *data, E_Gadget_Face *gadget_face);
+  void (*func_change) (void *data, E_Gadget_Face *gadget_face, E_Gadman_Client *gmc, E_Gadman_Change change);
+  void (*func_menu_init) (void *data, E_Gadget *gadget);
+  void (*func_face_menu_init) (void *data, E_Gadget_Face *gadget_face);
+  void *data;
+};
+
 struct _E_Gadget
 {
   E_Object e_obj_inherit;
@@ -52,14 +65,7 @@ struct _E_Gadget_Change
   E_Gadget_Face *face;
 };
 
-E_Gadget *e_gadget_new(E_Module *module,
-    const char *name, 
-    void (*func_face_init) (void *data, E_Gadget_Face *gadget_face),
-    void (*func_face_free) (void *data, E_Gadget_Face *gadget_face),
-    void (*func_change) (void *data, E_Gadget_Face *gadget_face, E_Gadman_Client *gmc, E_Gadman_Change change),
-    void (*func_menu_init) (void *data, E_Gadget *gadget),
-    void (*func_face_menu_init) (void *data, E_Gadget_Face *gadget_face),
-    void *data);
+E_Gadget *e_gadget_new(E_Gadget_Api *api);
 
 void e_gadget_face_theme_set(E_Gadget_Face *face, char *category, char *group);
 
index a0260cc39eb62b17556fbccdc66e00a97f27e5a7..175978d79efb2abf9d8d04472a6ce8b4dfda8a84 100644 (file)
@@ -20,18 +20,29 @@ static void _test_face_menu_init(void *data, E_Gadget_Face *face);
 void *
 e_modapi_init(E_Module *m)
 {
+   E_Gadget_Api *api = NULL;
    E_Gadget *gad = NULL;
-   
+  
    Test *t = E_NEW(Test, 1);
-
-   gad = e_gadget_new(m,
-        "test_gadget",
-        _test_face_init,
-        _test_face_free,
-        _test_face_change,
-        _test_menu_init,
-        _test_face_menu_init,
-        t);
+   if (!t) return;
+   api = E_NEW(E_Gadget_Api, 1);
+   if (!api) return;
+
+   /*
+    * set up gadget -- only module and name are required, but the gadget would
+    * be pretty useless without func_face_*
+    */
+   
+   api->module = m;
+   api->name = "test_gadget";
+   api->func_face_init = _test_face_init;
+   api->func_face_free = _test_face_free;
+   api->func_change = _test_face_change;
+   api->func_menu_init = _test_menu_init;
+   api->func_face_menu_init = _test_face_menu_init;
+   api->data = t;
+
+   gad = e_gadget_new(api);
 
    return gad;
 }