pass a single struct to e_gadget_new() instead of a ton of functions.

SVN revision: 19107
This commit is contained in:
rephorm 2005-12-18 07:37:53 +00:00 committed by rephorm
parent 517eb4c9cf
commit e3ead0ca7a
3 changed files with 70 additions and 35 deletions

View 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 */

View 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);

View 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);
if (!t) return;
api = E_NEW(E_Gadget_Api, 1);
if (!api) return;
gad = e_gadget_new(m,
"test_gadget",
_test_face_init,
_test_face_free,
_test_face_change,
_test_menu_init,
_test_face_menu_init,
t);
/*
* 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;
}