Add:osd_core:Initial support for on-screen-buttons
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Fri, 20 Jun 2008 08:38:22 +0000 (08:38 +0000)
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Fri, 20 Jun 2008 08:38:22 +0000 (08:38 +0000)
git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@1155 ffa7fe5e-494d-0410-b361-a75ebd5db220

navit/navit/attr_def.h
navit/navit/callback.h
navit/navit/graphics.c
navit/navit/graphics.h
navit/navit/navit.c
navit/navit/osd/core/osd_core.c

index 9807c06..f0dfc87 100644 (file)
@@ -75,6 +75,9 @@ ATTR(toolbar)
 ATTR(animate)
 ATTR(lazy)
 ATTR(mkdir)
+ATTR(predraw)
+ATTR(postdraw)
+ATTR(button)
 ATTR2(0x0002ffff,type_int_end)
 ATTR2(0x00030000,type_string_begin)
 ATTR(type)
@@ -121,6 +124,7 @@ ATTR(layout)
 ATTR(position_nmea)
 ATTR(gpsd_query)
 ATTR(on_eof)
+ATTR(command)
 ATTR2(0x0003ffff,type_string_end)
 ATTR(order_limit)
 ATTR2(0x00050000,type_double_start)
index 1bca566..e816a78 100644 (file)
@@ -110,6 +110,11 @@ static inline void callback_list_call_0(struct callback_list *l)
        callback_list_call(l, 0, NULL);
 }
 
+static inline void callback_list_call_attr_0(struct callback_list *l, enum attr_type type)
+{
+       callback_list_call_attr(l, type, 0, NULL);
+}
+
 static inline void callback_list_call_attr_1(struct callback_list *l, enum attr_type type, void *p1)
 {
        void *p[1];
@@ -140,6 +145,17 @@ static inline void callback_list_call_2(struct callback_list *l, void *p1, void
        callback_list_call(l, 2, p);
 }
 
+static inline void callback_list_call_attr_4(struct callback_list *l, enum attr_type type, void *p1, void *p2, void *p3, void *p4)
+{
+       void *p[4];
+       p[0]=p1;
+       p[1]=p2;
+       p[2]=p3;
+       p[3]=p4;
+       callback_list_call_attr(l, type, 4, p);
+}
+
+
 #define callback_cast(x) (void (*)(void))(x)
 #ifdef __cplusplus
 }
index 38de405..4f073b1 100644 (file)
@@ -45,6 +45,7 @@
 #include "layout.h"
 #include "route.h"
 #include "util.h"
+#include "callback.h"
 
 //##############################################################################################################
 //# Description: 
@@ -58,6 +59,7 @@ struct graphics
        struct graphics_font *font[16];
        struct graphics_gc *gc[3];
        struct attr **attrs;
+       struct callback_list *cbl;
        int ready;
 };
 //##############################################################################################################
@@ -87,6 +89,7 @@ struct graphics * graphics_new(struct attr *parent, struct attr **attrs)
        if (! graphicstype_new)
                return NULL;
        this_=g_new0(struct graphics, 1);
+       this_->cbl=callback_list_new();
        this_->priv=(*graphicstype_new)(&this_->meth, attrs);
        this_->attrs=attr_list_dup(attrs);
        return this_;
@@ -184,6 +187,11 @@ void graphics_register_keypress_callback(struct graphics *this_, void (*callback
        this_->meth.register_keypress_callback(this_->priv, callback, data);
 }
 
+void graphics_add_callback(struct graphics *this_, struct callback *cb)
+{
+       callback_list_add(this_->cbl, cb);
+}
+
 //##############################################################################################################
 //# Description: 
 //# Comment: 
@@ -820,7 +828,7 @@ int graphics_ready(struct graphics *this_)
 //# Comment: 
 //# Authors: Martin Schaller (04/2008)
 //##############################################################################################################
-void graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans, struct layout *l)
+void graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans, struct layout *l, int callback)
 {
        int order=transform_get_order(trans);
        struct point p;
@@ -833,6 +841,8 @@ void graphics_displaylist_draw(struct graphics *gra, struct displaylist *display
        gra->meth.draw_mode(gra->priv, draw_mode_begin);
        gra->meth.draw_rectangle(gra->priv, gra->gc[0]->priv, &p, 32767, 32767);
        xdisplay_draw(displaylist->dl, gra, l, order);
+       if (callback)
+               callback_list_call_attr_0(gra->cbl, attr_postdraw);
        gra->meth.draw_mode(gra->priv, draw_mode_end);
 }
 
@@ -884,7 +894,7 @@ void graphics_draw(struct graphics *gra, struct displaylist *displaylist, GList
        profile(0,NULL);
        do_draw(displaylist, trans, mapsets, order);
 //     profile(1,"do_draw");
-       graphics_displaylist_draw(gra, displaylist, trans, l);
+       graphics_displaylist_draw(gra, displaylist, trans, l, 1);
        profile(1,"xdisplay_draw");
        profile(0,"end");
   
index 378b1c8..a9837a1 100644 (file)
@@ -153,7 +153,7 @@ void graphics_overlay_disable(struct graphics *this_, int disable);
 void graphics_draw_image(struct graphics *this_, struct graphics_gc *gc, struct point *p, struct graphics_image *img);
 void display_add(struct displaylist *displaylist, struct item *item, int count, struct point *pnt, char *label);
 int graphics_ready(struct graphics *this_);
-void graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans, struct layout *l);
+void graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans, struct layout *l, int callback);
 void graphics_displaylist_move(struct displaylist *displaylist, int dx, int dy);
 void graphics_draw(struct graphics *gra, struct displaylist *displaylist, GList *mapsets, struct transformation *trans, struct layout *l);
 struct displaylist_handle *graphics_displaylist_open(struct displaylist *displaylist);
index c04b111..23b231d 100644 (file)
@@ -118,6 +118,7 @@ struct navit {
        struct point pressed, last, current;
        int button_pressed,moved,popped;
        guint button_timeout, motion_timeout;
+       int ignore_button;
        struct log *textfile_debug_log;
        struct pcoord destination;
        int destination_valid;
@@ -192,7 +193,7 @@ void
 navit_draw_displaylist(struct navit *this_)
 {
        if (this_->ready == 3)
-               graphics_displaylist_draw(this_->gra, this_->displaylist, this_->trans, this_->layout_current);
+               graphics_displaylist_draw(this_->gra, this_->displaylist, this_->trans, this_->layout_current, 1);
 }
 
 void
@@ -226,12 +227,22 @@ navit_handle_button_timeout(void *data)
        return FALSE;
 }
 
+int
+navit_ignore_button(struct navit *this_)
+{
+       this_->ignore_button=1;
+}
 
 int
 navit_handle_button(struct navit *this_, int pressed, int button, struct point *p, struct callback *popup_callback)
 {
        int border=16;
 
+       callback_list_call_attr_4(this_->attr_cbl, attr_button, this_, pressed, button, p);
+       if (this_->ignore_button) {
+               this_->ignore_button=0;
+               return 0;
+       }
        if (pressed) {
                this_->pressed=*p;
                this_->last=*p;
@@ -299,7 +310,7 @@ navit_motion_timeout(void *data)
        if (dx || dy) {
                this_->last=this_->current;
                graphics_displaylist_move(this_->displaylist, dx, dy);
-               graphics_displaylist_draw(this_->gra, this_->displaylist, this_->trans, this_->layout_current);
+               graphics_displaylist_draw(this_->gra, this_->displaylist, this_->trans, this_->layout_current, 0);
                this_->moved=1;
        }
        this_->motion_timeout=0;
index 9f73b06..52677a1 100644 (file)
@@ -586,6 +586,62 @@ osd_street_name_new(struct navit *nav, struct osd_methods *meth, struct attr **a
        return (struct osd_priv *) this;
 }
 
+struct osd_button {
+       struct point p;
+       struct navit *nav;
+       struct graphics *gra;
+       struct graphics_gc *gc;
+       struct callback *navit_init_cb;
+       struct callback *draw_cb;
+       struct graphics_image *img;
+};
+
+static void
+osd_button_click(struct osd_button *this, struct navit *nav, int pressed, int button, struct point *p)
+{
+       if (p->x < this->p.x || p->y < this->p.y || p->x > this->p.x+this->img->width || p->y > this->p.y+this->img->height)
+               return;
+       navit_ignore_button(nav);
+       if (pressed) {
+               dbg(0,"enter\n");
+       }
+}
+
+static void
+osd_button_draw(struct osd_button *this)
+{
+       graphics_draw_image(this->gra,this->gc, &this->p, this->img);
+}
+
+static void
+osd_button_init(struct osd_button *this, struct navit *nav)
+{
+       struct graphics *gra=navit_get_graphics(nav);
+       dbg(0,"enter\n");
+       this->nav=nav;
+       this->gra=gra;
+       this->gc=graphics_gc_new(gra);
+       this->img=graphics_image_new(gra, "xpm/gui_map.svg");
+       navit_add_callback(nav, this->navit_init_cb=callback_new_attr_1(callback_cast(osd_button_click), attr_button, this));
+       graphics_add_callback(gra, this->draw_cb=callback_new_attr_1(callback_cast(osd_button_draw), attr_postdraw, this));
+}
+
+static struct osd_priv *
+osd_button_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs)
+{
+       struct osd_button *this=g_new0(struct osd_button, 1);
+       struct attr *attr;
+       attr=attr_search(attrs, NULL, attr_x);
+       if (attr)
+               this->p.x=attr->u.num;
+       attr=attr_search(attrs, NULL, attr_y);
+       if (attr)
+               this->p.y=attr->u.num;
+       navit_add_callback(nav, this->navit_init_cb=callback_new_attr_1(callback_cast(osd_button_init), attr_navit, this));
+       
+       return (struct osd_priv *) this;
+}
+
 void
 plugin_init(void)
 {
@@ -593,5 +649,6 @@ plugin_init(void)
        plugin_register_osd_type("eta", osd_eta_new);
        plugin_register_osd_type("navigation", osd_navigation_new);
        plugin_register_osd_type("street_name", osd_street_name_new);
+       plugin_register_osd_type("button", osd_button_new);
 }