First pass for some ecore_config struct code. Works fine on my x86 machine, but raster reckons it will not if the architecture 'packs' structs.
SVN revision: 22302
This commit is contained in:
parent
09209320b6
commit
d8bc921c99
|
@ -52,6 +52,7 @@ typedef enum Ecore_Config_Type
|
|||
ECORE_CONFIG_RGB = 4, /**< Colour property type. */
|
||||
ECORE_CONFIG_THM = 5, /**< Theme property type. */
|
||||
ECORE_CONFIG_BLN = 6, /**< Boolean property type. */
|
||||
ECORE_CONFIG_SCT = 7, /**< Structure property type */
|
||||
} Ecore_Config_Type;
|
||||
|
||||
typedef enum Ecore_Config_Flag
|
||||
|
@ -97,6 +98,7 @@ typedef struct Ecore_Config_Prop
|
|||
Ecore_Config_Flag flags; /// < Configuration flags.
|
||||
Ecore_Config_Listener_List *listeners; /* List of change listeners. */
|
||||
void *data; /// < Stores extra data for the property.
|
||||
struct Ecore_Config_Prop *parent; /* if we are in a struct we have a parent to notify of changes etc */
|
||||
struct Ecore_Config_Prop *next; /* Pointer to the next property in the list. */
|
||||
} Ecore_Config_Prop;
|
||||
|
||||
|
@ -184,6 +186,13 @@ extern "C"
|
|||
EAPI int ecore_config_argbint_default(const char *key, long argb);
|
||||
EAPI int ecore_config_argbstr_default(const char *key, char *val);
|
||||
EAPI int ecore_config_theme_default(const char *key, char *val);
|
||||
EAPI int ecore_config_struct_default(const char *key);
|
||||
EAPI int ecore_config_struct_int_add(const char *key, const char *name, int val);
|
||||
EAPI int ecore_config_struct_float_add(const char *key, const char *name, float val);
|
||||
EAPI int ecore_config_struct_string_add(const char *key, const char *name, char* val);
|
||||
EAPI int ecore_config_struct_theme_add(const char *key, const char *name, char* val);
|
||||
EAPI int ecore_config_struct_boolean_add(const char *key, const char *name, int val);
|
||||
EAPI int ecore_config_struct_get(const char *key, void *data);
|
||||
|
||||
EAPI int ecore_config_listen(const char *name, const char *key,
|
||||
Ecore_Config_Listener listener,
|
||||
|
|
|
@ -31,7 +31,7 @@ static inline void *__ecore_argb_to_long(int a, int r, int g, int b, long *v);
|
|||
static inline void *__ecore_argbstr_to_long(char *argb, long *v);
|
||||
|
||||
static const char *_ecore_config_type[] =
|
||||
{ "undefined", "integer", "float", "string", "colour", "theme", "boolean" };
|
||||
{ "undefined", "integer", "float", "string", "colour", "theme", "boolean", "structure" };
|
||||
|
||||
/**
|
||||
* @defgroup Ecore_Config_Property_Group Ecore Config Property Functions
|
||||
|
@ -355,6 +355,8 @@ ecore_config_as_string_get(const char *key)
|
|||
case ECORE_CONFIG_THM:
|
||||
esprintf(&val, "\"%s\"", _ecore_config_theme_get(e));
|
||||
break;
|
||||
case ECORE_CONFIG_SCT:
|
||||
break;
|
||||
default:
|
||||
esprintf(&r, "%s:unknown_type", key);
|
||||
break;
|
||||
|
@ -470,7 +472,7 @@ ecore_config_typed_val(Ecore_Config_Prop * e, const void *val, int type)
|
|||
if (!e)
|
||||
return ECORE_CONFIG_ERR_NODATA;
|
||||
|
||||
if (!(val) && type != ECORE_CONFIG_NIL)
|
||||
if (!(val) && (type != ECORE_CONFIG_NIL && type != ECORE_CONFIG_SCT))
|
||||
e->ptr = NULL;
|
||||
else
|
||||
{
|
||||
|
@ -496,10 +498,14 @@ ecore_config_typed_val(Ecore_Config_Prop * e, const void *val, int type)
|
|||
e->val = (long) ((*((float *)val)) * ECORE_CONFIG_FLOAT_PRECISION);
|
||||
e->type = ECORE_CONFIG_FLT;
|
||||
}
|
||||
else if (type == ECORE_CONFIG_SCT)
|
||||
{
|
||||
e->type = ECORE_CONFIG_SCT;
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
e->type = ECORE_CONFIG_NIL;
|
||||
}
|
||||
}
|
||||
|
||||
ecore_config_bound(e);
|
||||
e->flags |= ECORE_CONFIG_FLAG_MODIFIED;
|
||||
|
@ -620,6 +626,18 @@ ecore_config_long_opt_set(const char *key, char *long_opt)
|
|||
return ECORE_CONFIG_ERR_SUCC;
|
||||
}
|
||||
|
||||
static void
|
||||
_ecore_config_listener_fire(Ecore_Config_Prop *prop)
|
||||
{
|
||||
Ecore_Config_Listener_List *l;
|
||||
for (l = prop->listeners; l; l = l->next)
|
||||
l->listener(prop->key, prop->type, l->tag, l->data);
|
||||
|
||||
/* fire change listeners for the generic struct container etc */
|
||||
if (prop->parent)
|
||||
_ecore_config_listener_fire(prop->parent);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the indicated property to the given value and type.
|
||||
* @param key The property key.
|
||||
|
@ -632,7 +650,6 @@ EAPI int
|
|||
ecore_config_typed_set(const char *key, const void *val, int type)
|
||||
{
|
||||
Ecore_Config_Prop *e;
|
||||
Ecore_Config_Listener_List *l;
|
||||
int ret;
|
||||
|
||||
if (!key)
|
||||
|
@ -650,8 +667,7 @@ ecore_config_typed_set(const char *key, const void *val, int type)
|
|||
|
||||
if ((ret = ecore_config_typed_val(e, val, type)) == ECORE_CONFIG_ERR_SUCC)
|
||||
{
|
||||
for (l = e->listeners; l; l = l->next)
|
||||
l->listener(e->key, e->type, l->tag, l->data);
|
||||
_ecore_config_listener_fire(e);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1119,6 +1135,229 @@ ecore_config_theme_default(const char *key, char *val)
|
|||
return ecore_config_typed_default(key, (void *)val, ECORE_CONFIG_THM);
|
||||
}
|
||||
|
||||
/**
|
||||
* @defgroup Ecore_Config_Struct_Group Ecore Config Structures
|
||||
*
|
||||
* Functions that are used to create structures of properties.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Sets the indicated property to a structure if the property has not yet
|
||||
* been set.
|
||||
* @param key The property key.
|
||||
* @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
|
||||
* @ingroup Ecore_Config_Struct_Group
|
||||
*/
|
||||
EAPI int
|
||||
ecore_config_struct_create(const char *key)
|
||||
{
|
||||
printf("WARNING: you are using ecore_config structures. These are very young");
|
||||
printf(" and not complete - you have been warned");
|
||||
|
||||
return ecore_config_typed_default(key, NULL, ECORE_CONFIG_SCT);
|
||||
}
|
||||
|
||||
static int
|
||||
_ecore_config_struct_append(Ecore_Config_Prop *sct, Ecore_Config_Prop *add)
|
||||
{
|
||||
Evas_List *l;
|
||||
|
||||
if (!sct || !add || sct->type != ECORE_CONFIG_SCT)
|
||||
return ECORE_CONFIG_ERR_IGNORED;
|
||||
|
||||
l = sct->data;
|
||||
sct->data = evas_list_append(l, add);
|
||||
add->parent = sct;
|
||||
|
||||
return ECORE_CONFIG_ERR_SUCC;
|
||||
}
|
||||
|
||||
static int
|
||||
_ecore_config_struct_typed_add(const char *key, const char *name, void *val,
|
||||
int type)
|
||||
{
|
||||
char *subkey;
|
||||
int ret;
|
||||
|
||||
subkey = malloc((strlen(key) + strlen(name) + 2) * sizeof(char));
|
||||
strcpy(subkey, key);
|
||||
strcat(subkey, ".");
|
||||
strcat(subkey, name);
|
||||
|
||||
ecore_config_typed_default(subkey, val, type);
|
||||
ret = _ecore_config_struct_append(ecore_config_get(key),
|
||||
ecore_config_get(subkey));
|
||||
free(subkey);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an int property to the named structure. The property is set if it has not
|
||||
* yet been set.
|
||||
* @param key The key of the structure to add to.
|
||||
* @param name The name of the item to add - this will be appended to the key
|
||||
* @param val the int to default to
|
||||
* @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
|
||||
* @ingroup Ecore_Config_Struct_Group
|
||||
*/
|
||||
EAPI int
|
||||
ecore_config_struct_int_add(const char *key, const char *name, int val)
|
||||
{
|
||||
return _ecore_config_struct_typed_add(key, name, (void *) &val,
|
||||
ECORE_CONFIG_INT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a float property to the named structure. The property is set if it has
|
||||
* not yet been set.
|
||||
* @param key The key of the structure to add to.
|
||||
* @param name The name of the item to add - this will be appended to the key
|
||||
* @param val The float to default to
|
||||
* @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
|
||||
* @ingroup Ecore_Config_Struct_Group
|
||||
*/
|
||||
EAPI int
|
||||
ecore_config_struct_float_add(const char *key, const char *name, float val)
|
||||
{
|
||||
return _ecore_config_struct_typed_add(key, name, (void *) &val,
|
||||
ECORE_CONFIG_FLT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a string property to the named structure. The property is set if it has
|
||||
* not yet been set.
|
||||
* @param key The key of the structure to add to.
|
||||
* @param name The name of the item to add - this will be appended to the key
|
||||
* @param val The string to default to
|
||||
* @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
|
||||
* @ingroup Ecore_Config_Struct_Group
|
||||
*/
|
||||
EAPI int
|
||||
ecore_config_struct_string_add(const char *key, const char *name, char* val)
|
||||
{
|
||||
return _ecore_config_struct_typed_add(key, name, (void *) val,
|
||||
ECORE_CONFIG_STR);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an argb property to the named structure. The property is set if it has
|
||||
* not yet been set.
|
||||
* @param key The key of the structure to add to.
|
||||
* @param name The name of the item to add - this will be appended to the key
|
||||
* @param a The alpha to default to
|
||||
* @param r The red to default to
|
||||
* @param g The green to default to
|
||||
* @param b The blue to default to
|
||||
* @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
|
||||
* @ingroup Ecore_Config_Struct_Group
|
||||
*/
|
||||
EAPI int
|
||||
ecore_config_struct_argb_add(const char *key, const char *name, int a, int r,
|
||||
int g, int b)
|
||||
{
|
||||
long argb;
|
||||
|
||||
__ecore_argb_to_long(a, r, g, b, &argb);
|
||||
return _ecore_config_struct_typed_add(key, name, (void *) &argb,
|
||||
ECORE_CONFIG_RGB);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a theme property to the named structure. The property is set if it has
|
||||
* not yet been set.
|
||||
* @param key The key of the structure to add to.
|
||||
* @param name The name of the item to add - this will be appended to the key
|
||||
* @param val The theme name to default to
|
||||
* @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
|
||||
* @ingroup Ecore_Config_Struct_Group
|
||||
*/
|
||||
EAPI int
|
||||
ecore_config_struct_theme_add(const char *key, const char *name, char* val)
|
||||
{
|
||||
return _ecore_config_struct_typed_add(key, name, (void *) val,
|
||||
ECORE_CONFIG_THM);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a boolean property to the named structure. The property is set if it has
|
||||
* not yet been set.
|
||||
* @param key The key of the structure to add to.
|
||||
* @param name The name of the item to add - this will be appended to the key
|
||||
* @param val The boolean to default to
|
||||
* @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
|
||||
* @ingroup Ecore_Config_Struct_Group
|
||||
*/
|
||||
EAPI int
|
||||
ecore_config_struct_boolean_add(const char *key, const char *name, int val)
|
||||
{
|
||||
val = val ? 1 : 0;
|
||||
return _ecore_config_struct_typed_add(key, name, (void *) &val,
|
||||
ECORE_CONFIG_BLN);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the contents of a defined structure property and load it into the passed
|
||||
* C struct
|
||||
* @param key The name of the structure property to look up.
|
||||
* @param data The struct to write into.
|
||||
* @return @c ECORE_CONFIG_ERR_SUCC if the structure is written successfully.
|
||||
* @ingroup Ecore_Config_Struct_Group
|
||||
*/
|
||||
EAPI int
|
||||
ecore_config_struct_get(const char *key, void *data)
|
||||
{
|
||||
Ecore_Config_Prop *e, *f;
|
||||
Evas_List *l;
|
||||
void *ptr;
|
||||
long argb;
|
||||
|
||||
e = ecore_config_get(key);
|
||||
if (!e)
|
||||
return ECORE_CONFIG_ERR_NODATA;
|
||||
|
||||
l = e->data;
|
||||
ptr = data;
|
||||
while (l)
|
||||
{
|
||||
f = (Ecore_Config_Prop *) l->data;
|
||||
switch (f->type)
|
||||
{
|
||||
case ECORE_CONFIG_INT:
|
||||
*((int *) ptr) = _ecore_config_int_get(f);
|
||||
ptr += sizeof(int);
|
||||
break;
|
||||
case ECORE_CONFIG_BLN:
|
||||
*((int *) ptr) = _ecore_config_boolean_get(f);
|
||||
ptr += sizeof(int);
|
||||
break;
|
||||
case ECORE_CONFIG_FLT:
|
||||
*((float *) ptr) = _ecore_config_float_get(f);
|
||||
ptr += sizeof(float);
|
||||
break;
|
||||
case ECORE_CONFIG_STR:
|
||||
case ECORE_CONFIG_THM:
|
||||
*((char **) ptr) = _ecore_config_string_get(f);
|
||||
ptr += sizeof(char *);
|
||||
break;
|
||||
case ECORE_CONFIG_RGB:
|
||||
argb = _ecore_config_argbint_get(f);
|
||||
*((int *) ptr) = (argb >> 24) & 0xff;
|
||||
ptr += sizeof(int);
|
||||
*((int *) ptr) = (argb >> 16) & 0xff;
|
||||
ptr += sizeof(int);
|
||||
*((int *) ptr) = (argb >> 8) & 0xff;
|
||||
ptr += sizeof(int);
|
||||
*((int *) ptr) = argb & 0xff;
|
||||
ptr += sizeof(int);
|
||||
break;
|
||||
default:
|
||||
printf("ARGH - STRUCT coding not implemented yet\n");
|
||||
}
|
||||
l = evas_list_next(l);
|
||||
}
|
||||
return ECORE_CONFIG_ERR_SUCC;
|
||||
}
|
||||
|
||||
/**
|
||||
* @defgroup Ecore_Config_Listeners_Group Ecore Config Listeners
|
||||
*
|
||||
|
|
|
@ -174,6 +174,9 @@ _ecore_config_db_read(Ecore_Config_DB_File *db, const char *key)
|
|||
case ECORE_CONFIG_THM:
|
||||
ecore_config_typed_set(key, (void *)value, type);
|
||||
break;
|
||||
case ECORE_CONFIG_SCT:
|
||||
printf("loading struct %s\n", key);
|
||||
break;
|
||||
default:
|
||||
E(0, "Type %d not handled\n", type);
|
||||
}
|
||||
|
|
|
@ -99,6 +99,9 @@ _ecore_config_ipc_global_prop_list(Ecore_Config_Server * srv __UNUSED__, long se
|
|||
case ECORE_CONFIG_THM:
|
||||
estring_appendf(s, "%s%s: theme", f ? "\n" : "", keys[x]);
|
||||
break;
|
||||
case ECORE_CONFIG_SCT:
|
||||
estring_appendf(s, "%s%s: structure", f ? "\n" : "", keys[x]);
|
||||
break;
|
||||
default:
|
||||
estring_appendf(s, "%s%s: unknown", f ? "\n" : "", keys[x]);
|
||||
continue;
|
||||
|
|
Loading…
Reference in New Issue