Index: src/poi.c
===================================================================
--- src/poi.c	(revision 2)
+++ src/poi.c	(revision 3)
@@ -367,21 +367,33 @@
     return result;
 }
 
+static void
+write_selected_poi(PoiInfo *poi, gint *id,
+        GtkTreeModel *model, GtkTreeIter *iter)
+{
+    gtk_tree_model_get(model, iter,
+            POI_POIID, &(poi->poi_id),
+            POI_CATID, &(poi->cat_id),
+            POI_LAT, &(poi->lat),
+            POI_LON, &(poi->lon),
+            POI_LABEL, &(poi->label),
+            POI_DESC, &(poi->desc),
+            POI_CLABEL, &(poi->clabel),
+            -1);
+    *id = poi->poi_id;
+}
+
 gboolean
 select_poi(gint unitx, gint unity, PoiInfo *poi, gboolean quick)
 {
+    static gint selected_poi_id = -1;
+    GtkTreeIter *selected_poi = NULL;
     gint x, y;
     gdouble lat1, lon1, lat2, lon2;
-    static GtkWidget *dialog = NULL;
-    static GtkWidget *list = NULL;
-    static GtkWidget *sw = NULL;
-    static GtkTreeViewColumn *column = NULL;
-    static GtkCellRenderer *renderer = NULL;
-    GtkListStore *store = NULL;
-    GtkTreeIter iter;
+    GtkListStore *store;
     gboolean selected = FALSE;
     gchar tmp1[LL_FMT_LEN], tmp2[LL_FMT_LEN];
-    gint num_cats = 0;
+    gint num_pois = 0;
     printf("%s()\n", __PRETTY_FUNCTION__);
 
     x = unitx - pixel2unit(3 * _draw_width);
@@ -417,16 +429,19 @@
 
     while(SQLITE_ROW == sqlite3_step(_stmt_select_poi))
     {
+        GtkTreeIter iter;
         gdouble lat, lon;
+        gint poi_id;
         lat = sqlite3_column_double(_stmt_select_poi, 0);
         lon = sqlite3_column_double(_stmt_select_poi, 1);
+        poi_id = sqlite3_column_int(_stmt_select_poi, 2);
         
         format_lat_lon(lat, lon, tmp1, tmp2);
         //lat_format(lat, tmp1);
         //lon_format(lon, tmp2);
         gtk_list_store_append(store, &iter);
         gtk_list_store_set(store, &iter,
-                POI_POIID, sqlite3_column_int(_stmt_select_poi, 2),
+                POI_POIID, poi_id,
                 POI_CATID, sqlite3_column_int(_stmt_select_poi, 5),
                 POI_LAT, lat,
                 POI_LON, lon,
@@ -435,46 +450,50 @@
                 POI_DESC, sqlite3_column_text(_stmt_select_poi, 4),
                 POI_CLABEL, sqlite3_column_text(_stmt_select_poi, 6),
                 -1);
-        num_cats++;
+
+        /* get previously selected POI or the first one on the list */
+        if(poi_id == selected_poi_id || num_pois == 0)
+        {
+            if(selected_poi)
+                gtk_tree_iter_free(selected_poi);
+            selected_poi = gtk_tree_iter_copy(&iter);
+        }
+
+        num_pois++;
     }
     sqlite3_reset(_stmt_select_poi);
 
-    switch(num_cats)
+    /* nothing found */
+    if(num_pois == 0)
     {
-        case 0:
-            g_object_unref(G_OBJECT(store));
-            if(!quick)
-            {
-                MACRO_BANNER_SHOW_INFO(_window, _("No POIs found."));
-            }
-            return FALSE;
-            break;
-        case 1:
-            /* iter is still set to the most-recently added POI. */
-            gtk_tree_model_get(GTK_TREE_MODEL(store),
-                &iter,
-                POI_POIID, &(poi->poi_id),
-                POI_CATID, &(poi->cat_id),
-                POI_LAT, &(poi->lat),
-                POI_LON, &(poi->lon),
-                POI_LABEL, &(poi->label),
-                POI_DESC, &(poi->desc),
-                POI_CLABEL, &(poi->clabel),
-                -1);
-            g_object_unref(G_OBJECT(store));
-            return TRUE;
-            break;
-        default:
-            if(quick)
-            {
-                g_object_unref(G_OBJECT(store));
-                return get_nearest_poi(unitx, unity, poi);
-            }
+        if(!quick)
+            MACRO_BANNER_SHOW_INFO(_window, _("No POIs found."));
+        selected_poi_id = -1;
+        selected = FALSE;
     }
+    /* one match */
+    else if(num_pois == 1)
+    {
+        write_selected_poi(poi, &selected_poi_id,
+                GTK_TREE_MODEL(store), selected_poi);
+        selected = TRUE;
+    }
+    /* two or more -- picking the nearest */
+    else if(quick)
+    {
+        selected = get_nearest_poi(unitx, unity, poi);
+        if (selected)
+            selected_poi_id = poi->poi_id;
+    }
+    /* multiple matches -- let user decide */
+    else
+    {
+        GtkWidget *dialog;
+        GtkWidget *list;
+        GtkWidget *sw;
+        GtkTreeViewColumn *column;
+        GtkCellRenderer *renderer;
 
-    /* There are at least 2 matching POI's - let the user select one. */
-    if(dialog == NULL)
-    {
         dialog = gtk_dialog_new_with_buttons(_("Select POI"),
                 GTK_WINDOW(_window), GTK_DIALOG_MODAL,
                 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
@@ -514,39 +533,44 @@
         column = gtk_tree_view_column_new_with_attributes(
                 _("Category"), renderer, "text", POI_CLABEL, NULL);
         gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);
-    }
 
-    gtk_tree_view_set_model(GTK_TREE_VIEW(list), GTK_TREE_MODEL(store));
-    g_object_unref(G_OBJECT(store));
+        gtk_tree_view_set_model(GTK_TREE_VIEW(list), GTK_TREE_MODEL(store));
 
-    gtk_widget_show_all(dialog);
+        gtk_tree_selection_select_iter(
+                gtk_tree_view_get_selection(GTK_TREE_VIEW(list)),
+                selected_poi);
 
-    while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
-    {
-        if(gtk_tree_selection_get_selected(
-                    gtk_tree_view_get_selection(GTK_TREE_VIEW(list)),
-                    NULL, &iter))
+        gtk_widget_show_all(dialog);
+
+        while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
         {
-            gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
-                POI_POIID, &(poi->poi_id),
-                POI_CATID, &(poi->cat_id),
-                POI_LAT, &(poi->lat),
-                POI_LON, &(poi->lon),
-                POI_LABEL, &(poi->label),
-                POI_DESC, &(poi->desc),
-                POI_CLABEL, &(poi->clabel),
-                -1);
-            selected = TRUE;
-            break;
+            GtkTreeIter iter;
+            if(gtk_tree_selection_get_selected(
+                        gtk_tree_view_get_selection(GTK_TREE_VIEW(list)),
+                        NULL, &iter))
+            {
+                gtk_tree_iter_free(selected_poi);
+                selected_poi = gtk_tree_iter_copy(&iter);
+                selected = TRUE;
+                break;
+            }
+            else
+                popup_error(dialog, _("Select one POI from the list."));
         }
-        else
-            popup_error(dialog, _("Select one POI from the list."));
+
+        map_force_redraw();
+
+        if (selected)
+            write_selected_poi(poi, &selected_poi_id,
+                    GTK_TREE_MODEL(store), selected_poi);
+
+        gtk_widget_destroy(dialog);
     }
 
-    map_force_redraw();
+    if (selected_poi)
+        gtk_tree_iter_free(selected_poi);
+    g_object_unref(G_OBJECT(store));
 
-    gtk_widget_hide(dialog);
-
     vprintf("%s(): return %d\n", __PRETTY_FUNCTION__, selected);
     return selected;
 }
