Fix:gui_internal:Switch to numeric keyboard for house numbers
[navit-package] / navit / gui / internal / gui_internal.c
index 8bb8a7a..cb1733a 100644 (file)
@@ -239,6 +239,7 @@ struct gui_priv {
        struct search_list *sl;
        int ignore_button;
        int menu_on_map_click;
+       int signal_on_map_click;
        char *country_iso2;
        int speech;
        int keyboard;
@@ -1356,7 +1357,9 @@ gui_internal_cmd_return(struct gui_priv *this, struct widget *wm, void *data)
 static void
 gui_internal_cmd2_back(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid)
 {
+       graphics_draw_mode(this->gra, draw_mode_begin);
        gui_internal_back(this, NULL, NULL);
+       graphics_draw_mode(this->gra, draw_mode_end);
        gui_internal_check_exit(this);  
 }
 
@@ -1391,6 +1394,8 @@ gui_internal_top_bar(struct gui_priv *this)
        128:Show help
        256:Use background for menu headline
        512:Set osd_configuration and zoom to route when setting position
+       1024:Don't show back button
+       2048:No highlighting of keyboard
 */
 
        w=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|(this->flags & 1 ? 0:flags_fill));
@@ -1670,7 +1675,7 @@ gui_internal_menu(struct gui_priv *this, const char *label)
        w->spx=4*this->spacing;
        w->w=menu->w;
        gui_internal_widget_append(menu, w);
-       if (this->flags & 16) {
+       if (this->flags & 16 && (!this->flags & 1024)) {
                struct widget *wlb,*wb,*wm=w;
                wm->flags=gravity_center|orientation_vertical|flags_expand|flags_fill;
                w=gui_internal_box_new(this, gravity_center|orientation_horizontal|flags_expand|flags_fill);
@@ -2367,18 +2372,18 @@ gui_internal_cmd_position(struct gui_priv *this, struct widget *wm, void *data)
                flags=4|8|16|32|64;
                break;
        case 3:
-               flags=1|8|16|32|64;
+               flags=1|8|16|32|64|128;
                flags &= this->flags_town;
                break;
        case 4:
                gui_internal_search_town_in_country(this, wm);
                return;
        case 5:
-               flags=2|8|16|32|64;
+               flags=2|8|16|32|64|128;
                flags &= this->flags_street;
                break;
        case 6:
-               flags=8|16|32|64;
+               flags=8|16|32|64|128;
                flags &= this->flags_house_number;
                break;
        default:
@@ -2422,7 +2427,7 @@ gui_internal_cmd_bookmarks(struct gui_priv *this, struct widget *wm, void *data)
        struct map_rect *mr=NULL;
        struct item *item;
        char *label_full,*l,*prefix="",*pos;
-       int len,plen,hassub;
+       int len,plen,hassub,found=0;
        struct widget *wb,*w,*wbm;
        GHashTable *hash;
        struct coord c;
@@ -2435,8 +2440,12 @@ gui_internal_cmd_bookmarks(struct gui_priv *this, struct widget *wm, void *data)
        w->spy=this->spacing*3;
        gui_internal_widget_append(wb, w);
 
-       if (wm && wm->prefix)
-               prefix=wm->prefix;
+       if (data)
+               prefix=data;
+       else {
+               if (wm && wm->prefix)
+                       prefix=wm->prefix;
+       }
        plen=strlen(prefix);
 
        if(navit_get_attr(this->nav, attr_bookmark_map, &mattr, NULL) && mattr.u.map && (mr=map_rect_new(mattr.u.map, NULL))) {
@@ -2472,6 +2481,11 @@ gui_internal_cmd_bookmarks(struct gui_priv *this, struct widget *wm, void *data)
                                                wbm->prefix=g_malloc(len+2);
                                                strncpy(wbm->prefix, label_full, len+1);
                                                wbm->prefix[len+1]='\0';
+                                               if (!l[0]) {
+                                                       gui_internal_cmd_set_destination(this, wbm, wbm->name);
+                                                       found=1;
+                                                       break;
+                                               }
                                        } else {
                                                gui_internal_widget_destroy(this, wbm);
                                        }
@@ -2482,13 +2496,20 @@ gui_internal_cmd_bookmarks(struct gui_priv *this, struct widget *wm, void *data)
                }
                g_hash_table_destroy(hash);
        }
-       gui_internal_menu_render(this);
+       if (found)
+               gui_internal_check_exit(this);
+       else
+               gui_internal_menu_render(this);
 }
 
 static void
 gui_internal_cmd2_bookmarks(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid)
 {
-       gui_internal_cmd_bookmarks(this, NULL, NULL);
+       char *str=NULL;
+       if (in && in[0] && ATTR_IS_STRING(in[0]->type)) {
+               str=in[0]->u.str;
+       }
+       gui_internal_cmd_bookmarks(this, NULL, str);
 }
 
 static void gui_internal_keypress_do(struct gui_priv *this, char *key)
@@ -2596,7 +2617,7 @@ gui_internal_search_idle(struct gui_priv *this, char *wm_name, struct widget *se
                gui_internal_search_idle_end(this);
 
                struct menu_data *md=gui_internal_menu_data(this);
-               if (md && md->keyboard) {
+               if (md && md->keyboard && !(this->flags & 2048)) {
                        GList *lk=md->keyboard->children;
                        graphics_draw_mode(this->gra, draw_mode_begin);
                        while (lk) {
@@ -2632,18 +2653,25 @@ gui_internal_search_idle(struct gui_priv *this, char *wm_name, struct widget *se
                text=g_strdup_printf("%s", res->country->name);
        }
        if (! strcmp(wm_name,"Town")) {
+               char *postal=res->town->common.postal;
+               if (res->town->common.postal_mask)
+                       postal=res->town->common.postal_mask;
                name=res->town->name;
                item=&res->town->common.item;
                if (res->town->name && res->town->district)
-                       text=g_strdup_printf("%s%s%s (%s)", res->town->common.postal_mask ? res->town->common.postal_mask : "", res->town->common.postal_mask ? " ":"", res->town->name, res->town->district);
+                       text=g_strdup_printf("%s%s%s (%s)", postal ? postal : "", postal ? " ":"", res->town->name, res->town->district);
                else
-                       text=g_strdup_printf("%s%s%s", res->town->common.postal ? res->town->common.postal_mask : "", res->town->common.postal_mask ? " ":"", res->town->name);
+                       text=g_strdup_printf("%s%s%s", postal ? postal : "", postal ? " ":"", res->town->name);
        }
        if (! strcmp(wm_name,"Street")) {
                name=res->street->name;
                item=&res->street->common.item;
                text=g_strdup_printf("%s %s", res->town->name, res->street->name);
        }
+       if (! strcmp(wm_name,"House number")) {
+               name=res->house_number->house_number;
+               text=g_strdup_printf("%s", name);
+       }
        dbg(1,"res->country->flag=%s\n", res->country->flag);
                gui_internal_widget_append(search_list,
                                wc=gui_internal_button_new_with_callback(this, text,
@@ -2947,6 +2975,7 @@ gui_internal_search(struct gui_priv *this, char *what, char *type, int flags)
 {
        struct widget *wb,*wk,*w,*wr,*we,*wl,*wnext=NULL;
        char *country;
+       int keyboard_mode=2;
        gui_internal_search_list_new(this);
        wb=gui_internal_menu(this, what);
        w=gui_internal_box_new(this, gravity_center|orientation_vertical|flags_expand|flags_fill);
@@ -2989,6 +3018,7 @@ gui_internal_search(struct gui_priv *this, char *what, char *type, int flags)
                gui_internal_widget_append(we, wb=gui_internal_image_new(this, image_new_xs(this, "gui_select_street")));
                wb->state |= STATE_SENSITIVE;
                wb->func = gui_internal_back;
+               keyboard_mode=18;
        }
        gui_internal_widget_append(we, wk=gui_internal_label_new(this, NULL));
        if (wnext) {
@@ -3004,7 +3034,7 @@ gui_internal_search(struct gui_priv *this, char *what, char *type, int flags)
        wk->func = gui_internal_search_changed;
        wk->name=g_strdup(type);
        if (this->keyboard)
-               gui_internal_widget_append(w, gui_internal_keyboard(this,2));
+               gui_internal_widget_append(w, gui_internal_keyboard(this,keyboard_mode));
        gui_internal_menu_render(this);
 }
 
@@ -3570,10 +3600,7 @@ gui_internal_html_start(void *dummy, const char *tag_name, const char **names, c
                case html_tag_a:
                        html->name=find_attr_dup(names, values, "name");
                        if (html->name) {
-                               if (this->html_anchor_found)
-                                       html->skip=1;
-                               else
-                                       html->skip=this->html_anchor ? strcmp(html->name,this->html_anchor) : 0;
+                               html->skip=this->html_anchor ? strcmp(html->name,this->html_anchor) : 0;
                                if (!html->skip)
                                        this->html_anchor_found=1;
                        }
@@ -3907,6 +3934,36 @@ gui_internal_set_attr(struct gui_priv *this, struct attr *attr)
        }
 }
 
+static void gui_internal_dbus_signal(struct gui_priv *this, struct point *p)
+{
+       struct displaylist_handle *dlh;
+       struct displaylist *display;
+       struct displayitem *di;
+
+       display=navit_get_displaylist(this->nav);
+       dlh=graphics_displaylist_open(display);
+       while ((di=graphics_displaylist_next(dlh))) {
+               struct item *item=graphics_displayitem_get_item(di);
+               if (item_is_point(*item) && graphics_displayitem_get_displayed(di) &&
+                       graphics_displayitem_within_dist(display, di, p, 10)) {
+                       struct map_rect *mr=map_rect_new(item->map, NULL);
+                       struct item *itemo=map_rect_get_item_byid(mr, item->id_hi, item->id_lo);
+                       struct attr attr;
+                       if (item_attr_get(itemo, attr_data, &attr)) {
+                               struct attr cb,*attr_list[2];
+                               int valid=0;
+                               attr.type=attr_data;
+                               attr_list[0]=&attr;
+                               attr_list[1]=NULL;
+                                       if (navit_get_attr(this->nav, attr_callback_list, &cb, NULL)) 
+                                               callback_list_call_attr_4(cb.u.callback_list, attr_command, "dbus_send_signal", attr_list, NULL, &valid);
+                       }
+                       map_rect_destroy(mr);
+               }
+       }
+               graphics_displaylist_close(dlh);
+}
+
 
 //##############################################################################################################
 //# Description: Function to handle mouse clicks and scroll wheel movement
@@ -3922,6 +3979,7 @@ static void gui_internal_button(void *data, int pressed, int button, struct poin
        // if still on the map (not in the menu, yet):
        dbg(1,"children=%p ignore_button=%d\n",this->root.children,this->ignore_button);
        if (!this->root.children || this->ignore_button) {
+
                this->ignore_button=0;
                // check whether the position of the mouse changed during press/release OR if it is the scrollwheel
                if (!navit_handle_button(this->nav, pressed, button, p, NULL)) {
@@ -3929,8 +3987,16 @@ static void gui_internal_button(void *data, int pressed, int button, struct poin
                        return;
                }
                dbg(1,"menu_on_map_click=%d\n",this->menu_on_map_click);
-               if (this->menu_on_map_click && button == 1) 
+               if (button != 1)
+                       return;
+               if (this->menu_on_map_click) {
                        gui_internal_cmd_menu(this, p, 0);
+                       return;
+               }
+               if (this->signal_on_map_click) {
+                       gui_internal_dbus_signal(this, p);
+                       return;
+               }
                return;
        }
 
@@ -5318,6 +5384,9 @@ static struct gui_priv * gui_internal_new(struct navit *nav, struct gui_methods
                this->menu_on_map_click=attr->u.num;
        else
                this->menu_on_map_click=1;
+       if ((attr=attr_search(attrs, NULL, attr_signal_on_map_click)))
+               this->signal_on_map_click=attr->u.num;
+
        if ((attr=attr_search(attrs, NULL, attr_callback_list))) {
                command_add_table(attr->u.callback_list, commands, sizeof(commands)/sizeof(struct command_table), this);
        }