Diff of /trunk/src/gconf.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 17 by harbaum, Mon Jun 29 08:24:41 2009 UTC revision 122 by harbaum, Mon Sep 21 13:15:25 2009 UTC
# Line 20  Line 20 
20  #include <stddef.h>  #include <stddef.h>
21  #include <stdlib.h>  #include <stdlib.h>
22  #include <ctype.h>  #include <ctype.h>
23    #include <math.h>     // for isnan
24  #include "gpxview.h"  #include "gpxview.h"
25    
26  #define GCONF_PATH         "/apps/gpxview/"  #define GCONF_PATH         "/apps/gpxview/"
# Line 83  static store_t store[] = { Line 84  static store_t store[] = {
84    { "goto_dss",         STORE_BOOL,   OFFSET(goto_disable_screensaver) },    { "goto_dss",         STORE_BOOL,   OFFSET(goto_disable_screensaver) },
85    { "cachelist_update", STORE_BOOL,   OFFSET(cachelist_update) },    { "cachelist_update", STORE_BOOL,   OFFSET(cachelist_update) },
86  #endif  #endif
87    #ifdef ENABLE_OSM_GPS_MAP
88      { "map_lat",          STORE_FLOAT,  OFFSET(map.pos.lat) },
89      { "map_lon",          STORE_FLOAT,  OFFSET(map.pos.lon) },
90      { "map_zoom",         STORE_INT,    OFFSET(map.zoom) },
91      { "map_source",       STORE_INT,    OFFSET(map.source) },
92    #endif
93    { NULL, -1, -1 }    { NULL, -1, -1 }
94  };  };
95    
# Line 156  void gconf_save_state(appdata_t *appdata Line 162  void gconf_save_state(appdata_t *appdata
162    /* store everything listed in the store table */    /* store everything listed in the store table */
163    store_t *st = store;    store_t *st = store;
164    while(st->key) {    while(st->key) {
     char key[256];  
165      void **ptr = ((void*)appdata) + st->offset;      void **ptr = ((void*)appdata) + st->offset;
166      snprintf(key, sizeof(key), GCONF_PATH "%s", st->key);      char *key = g_strdup_printf(GCONF_PATH "%s", st->key);
167    
168      switch(st->type) {      switch(st->type) {
169      case STORE_STRING:      case STORE_STRING:
# Line 176  void gconf_save_state(appdata_t *appdata Line 181  void gconf_save_state(appdata_t *appdata
181        break;        break;
182    
183      case STORE_FLOAT:      case STORE_FLOAT:
184        gconf_client_set_float(appdata->gconf_client, key, *((float*)ptr), NULL);        if(!isnan(*((float*)ptr)))
185            gconf_client_set_float(appdata->gconf_client, key, *((float*)ptr), NULL);
186        break;        break;
187    
188      default:      default:
# Line 184  void gconf_save_state(appdata_t *appdata Line 190  void gconf_save_state(appdata_t *appdata
190        break;        break;
191      }      }
192    
193        g_free(key);
194      st++;      st++;
195    }    }
196  }  }
# Line 195  void gconf_load_state(appdata_t *appdata Line 202  void gconf_load_state(appdata_t *appdata
202    
203    gpx_dialog_t *dialog = NULL;    gpx_dialog_t *dialog = NULL;
204    
205      /* default positions are invalid */
206      appdata->home.lat = appdata->home.lon = NAN;
207      appdata->manual_goto.lat = appdata->manual_goto.lon = NAN;
208      appdata->gps.lat = appdata->gps.lon = NAN;
209    
210    int i, entries = gconf_client_get_int(appdata->gconf_client,    int i, entries = gconf_client_get_int(appdata->gconf_client,
211                                   GCONF_KEY_CNT, NULL);                                   GCONF_KEY_CNT, NULL);
212    
# Line 205  void gconf_load_state(appdata_t *appdata Line 217  void gconf_load_state(appdata_t *appdata
217      char str[128];      char str[128];
218      snprintf(str, sizeof(str), GCONF_KEY_GPX, i);      snprintf(str, sizeof(str), GCONF_KEY_GPX, i);
219      char *fname = gconf_client_get_string(appdata->gconf_client, str, NULL);      char *fname = gconf_client_get_string(appdata->gconf_client, str, NULL);
   
220      if(fname) {      if(fname) {
221        /* check if there's a valid name stored for this file. */        /* check if there's a valid name stored for this file. */
222        /* if yes it's a "closed" file */        /* if yes it's a "closed" file */
# Line 221  void gconf_load_state(appdata_t *appdata Line 232  void gconf_load_state(appdata_t *appdata
232          else          else
233            *gpx = gpx_parse(dialog, fname);            *gpx = gpx_parse(dialog, fname);
234    
235          free(fname);          if(!*gpx) {
236              /* restoring the gpx file failed, mark it as unusable, but save */
237              /* its presence for later use */
238    
239              /* create "closed" entry to remember this file for next */
240              /* load attempt */
241              *gpx = g_new0(gpx_t, 1);
242              (*gpx)->filename = fname;
243              char *p = fname;
244              if(strrchr(fname, '/'))
245                p = strrchr(fname, '/')+1;
246    
247              (*gpx)->name = g_strdup_printf(_("Failed to load: %s"), p);
248              (*gpx)->closed = TRUE;
249            } else
250              free(fname);
251        }        }
     }  
   
     /* use next gpx entry of this was loaded successfully */  
     if(*gpx)  
252        gpx = &((*gpx)->next);        gpx = &((*gpx)->next);
253        }
254    }    }
255    
256    gpx_busy_dialog_destroy(dialog);    gpx_busy_dialog_destroy(dialog);
# Line 255  void gconf_load_state(appdata_t *appdata Line 278  void gconf_load_state(appdata_t *appdata
278    /* restore everything listed in the store table */    /* restore everything listed in the store table */
279    store_t *st = store;    store_t *st = store;
280    while(st->key) {    while(st->key) {
     char key[256];  
281      void **ptr = ((void*)appdata) + st->offset;      void **ptr = ((void*)appdata) + st->offset;
282      snprintf(key, sizeof(key), GCONF_PATH "%s", st->key);      char *key = g_strdup_printf(GCONF_PATH "%s", st->key);
283    
284      switch(st->type) {      /* check if key is present */
285      case STORE_STRING: {      GConfValue *value = gconf_client_get(appdata->gconf_client, key, NULL);
286        char **str = (char**)ptr;      if(value) {
287        *str = gconf_client_get_string(appdata->gconf_client, key, NULL);        gconf_value_free(value);
288    
289          switch(st->type) {
290          case STORE_STRING: {
291            char **str = (char**)ptr;
292            *str = gconf_client_get_string(appdata->gconf_client, key, NULL);
293        } break;        } break;
294    
295      case STORE_BOOL:        case STORE_BOOL:
296        *((int*)ptr) = gconf_client_get_bool(appdata->gconf_client, key, NULL);          *((int*)ptr) = gconf_client_get_bool(appdata->gconf_client, key, NULL);
297        break;          break;
298    
299      case STORE_INT:        case STORE_INT:
300        *((int*)ptr) = gconf_client_get_int(appdata->gconf_client, key, NULL);          *((int*)ptr) = gconf_client_get_int(appdata->gconf_client, key, NULL);
301        break;          break;
302    
303      case STORE_FLOAT:        case STORE_FLOAT:
304        *((float*)ptr) = gconf_client_get_float(appdata->gconf_client, key, NULL);          *((float*)ptr) = gconf_client_get_float(appdata->gconf_client, key, NULL);
305        break;          break;
306    
307      default:        default:
308        printf("Unsupported type %d\n", st->type);          printf("Unsupported type %d\n", st->type);
309        break;          break;
310          }
311      }      }
312        g_free(key);
313      st++;      st++;
314    }    }
315    
316    /* ----- set all kinds of defaults ------- */    /* ----- set all kinds of defaults ------- */
317    
 #if 0  
   if(!appdata->home.lon || !appdata->home.lat) {  
     appdata->home.lat = DEFAULT_LAT;  
     appdata->home.lon = DEFAULT_LON;  
   }  
   
   if(!appdata->manual_goto.lon || !appdata->manual_goto.lat) {  
     appdata->manual_goto.lat = DEFAULT_LAT;  
     appdata->manual_goto.lon = DEFAULT_LON;  
   }  
   
   if(!appdata->gps.lon || !appdata->gps.lat) {  
     appdata->gps.lat = DEFAULT_LAT;  
     appdata->gps.lon = DEFAULT_LON;  
   }  
 #endif  
   
318    if(!appdata->compass_damping) appdata->compass_damping = 1;    if(!appdata->compass_damping) appdata->compass_damping = 1;
319    
320    if(!appdata->mmpoi_radius)    if(!appdata->mmpoi_radius)
# Line 313  void gconf_load_state(appdata_t *appdata Line 324  void gconf_load_state(appdata_t *appdata
324      appdata->search = SEARCH_NAME | SEARCH_ID;      appdata->search = SEARCH_NAME | SEARCH_ID;
325    
326    if(!appdata->image_path) {    if(!appdata->image_path) {
327    #ifdef USE_MAEMO
328        /* update cachelist by default */
329        appdata->cachelist_update = TRUE;
330    #endif
331    
332      /* use gps by default */      /* use gps by default */
333      appdata->use_gps = TRUE;      appdata->use_gps = TRUE;
# Line 331  void gconf_load_state(appdata_t *appdata Line 346  void gconf_load_state(appdata_t *appdata
346  #endif  #endif
347      appdata->image_path = strdup(DEFAULT_IMAGE_PATH);      appdata->image_path = strdup(DEFAULT_IMAGE_PATH);
348    
349        /* check if this path is actually accessible */
350        /* and change it to the current users home if not */
351        /* (this should only happen on scratchbox) */
352        if(!g_file_test(appdata->image_path, G_FILE_TEST_IS_DIR)) {
353          if(g_mkdir_with_parents(appdata->image_path, 0700) != 0) {
354            char *p = getenv("HOME");
355            if(!p) p = "/tmp/";
356    
357            appdata->image_path =
358              g_strdup_printf("%s%s%s", p,
359                              (p[strlen(p)-1]!='/')?"/":"",
360                              DEFAULT_IMAGE_PATH_HOME);
361            printf("using alt path %s\n", appdata->image_path);
362          }
363        }
364    
365    } else {    } else {
366      /* some versions old versions messed up the path */      /* some versions old versions messed up the path */
367      if(appdata->image_path[strlen(appdata->image_path)-1] != '/') {      if(appdata->image_path[strlen(appdata->image_path)-1] != '/') {

Legend:
Removed from v.17  
changed lines
  Added in v.122