summaryrefslogtreecommitdiff
path: root/navit/osd.c
diff options
context:
space:
mode:
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>2013-04-28 15:18:17 +0000
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>2013-04-28 15:18:17 +0000
commitfe57f914b4ab318c3dd41607e3c6c8bb5bf407de (patch)
tree3e4e90ad0969e251b941f49f50f0b5ca6ffa4f09 /navit/osd.c
parent25c3ba43b0dc899af1ce9691a964b4647016380d (diff)
downloadnavit-fe57f914b4ab318c3dd41607e3c6c8bb5bf407de.tar.gz
Add:Core:Improved osd interface
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@5455 ffa7fe5e-494d-0410-b361-a75ebd5db220
Diffstat (limited to 'navit/osd.c')
-rw-r--r--navit/osd.c52
1 files changed, 41 insertions, 11 deletions
diff --git a/navit/osd.c b/navit/osd.c
index 637c38e45..436fcdd9c 100644
--- a/navit/osd.c
+++ b/navit/osd.c
@@ -37,12 +37,18 @@ struct osd {
struct osd_priv *priv;
};
+int
+osd_set_methods(struct osd_methods *in, int in_size, struct osd_methods *out)
+{
+ return navit_object_set_methods(in, in_size, out, sizeof(struct osd_methods));
+}
+
struct osd *
osd_new(struct attr *parent, struct attr **attrs)
{
struct osd *o;
struct osd_priv *(*new)(struct navit *nav, struct osd_methods *meth, struct attr **attrs);
- struct attr *type=attr_search(attrs, NULL, attr_type);
+ struct attr *type=attr_search(attrs, NULL, attr_type),cbl;
if (! type)
return NULL;
@@ -50,27 +56,50 @@ osd_new(struct attr *parent, struct attr **attrs)
if (! new)
return NULL;
o=g_new0(struct osd, 1);
- o->priv=new(parent->u.navit, &o->meth, attrs);
+ o->attrs=attr_list_dup(attrs);
+ cbl.type=attr_callback_list;
+ cbl.u.callback_list=callback_list_new();
+ o->attrs=attr_generic_prepend_attr(o->attrs, &cbl);
+
+ o->priv=new(parent->u.navit, &o->meth, o->attrs);
if (o->priv) {
o->func=&osd_func;
navit_object_ref((struct navit_object *)o);
- o->attrs=attr_list_dup(attrs);
} else {
+ attr_list_free(o->attrs);
g_free(o);
o=NULL;
}
+ dbg(0,"new osd %p\n",o);
return o;
}
int
+osd_get_attr(struct osd *osd, enum attr_type type, struct attr *attr, struct attr_iter *iter)
+{
+ int ret=0;
+ if(osd && osd->meth.get_attr)
+ /* values for ret: -1: Not possible, 0: Ignored by driver, 1 valid */
+ ret=osd->meth.get_attr(osd->priv, type, attr);
+ if (ret == -1)
+ return 0;
+ if (ret > 0)
+ return 1;
+ return navit_object_get_attr((struct navit_object *)osd, type, attr, iter);
+}
+
+int
osd_set_attr(struct osd *osd, struct attr* attr)
{
- if(osd && osd->meth.set_attr) {
- navit_object_set_attr((struct navit_object *)osd, attr);
- osd->meth.set_attr(osd->priv, attr);
+ int ret=0;
+ if(osd && osd->meth.set_attr)
+ /* values for ret: -1: Not possible, 0: Ignored by driver, 1 set and store, 2 set, don't store */
+ ret=osd->meth.set_attr(osd->priv, attr);
+ if (ret == -1)
+ return 0;
+ if (ret == 2)
return 1;
- }
- return 0;
+ return navit_object_set_attr((struct navit_object *)osd, attr);
}
void
@@ -79,6 +108,7 @@ osd_destroy(struct osd *osd)
if (osd && osd->meth.destroy) {
osd->meth.destroy(osd->priv);
}
+ attr_list_free(osd->attrs);
g_free(osd);
}
@@ -387,12 +417,12 @@ osd_std_draw(struct osd_item *item)
struct object_func osd_func = {
attr_osd,
(object_func_new)osd_new,
- (object_func_get_attr)navit_object_get_attr,
+ (object_func_get_attr)osd_get_attr,
(object_func_iter_new)navit_object_attr_iter_new,
(object_func_iter_destroy)navit_object_attr_iter_destroy,
(object_func_set_attr)osd_set_attr,
- (object_func_add_attr)NULL,
- (object_func_remove_attr)NULL,
+ (object_func_add_attr)navit_object_add_attr,
+ (object_func_remove_attr)navit_object_remove_attr,
(object_func_init)NULL,
(object_func_destroy)osd_destroy,
(object_func_dup)NULL,