comparison src/prefs.c @ 5534:0aa4d089125c

[gaim-migrate @ 5934] prefs is finally starting to look the way I wanted it to. now there is no explicit saving of prefs (except on quit). prefs are saved automagically when a pref is changed. i also went in and finished the job of moving the debug window over to new prefs committer: Tailor Script <tailor@pidgin.im>
author Nathan Walp <nwalp@pidgin.im>
date Mon, 26 May 2003 15:44:21 +0000
parents b4c32b9a797d
children de09863bd4b5
comparison
equal deleted inserted replaced
5533:b4c32b9a797d 5534:0aa4d089125c
61 static GHashTable *prefs_hash = NULL; 61 static GHashTable *prefs_hash = NULL;
62 62
63 static struct gaim_pref prefs = { GAIM_PREF_NONE, NULL, {NULL}, NULL, 63 static struct gaim_pref prefs = { GAIM_PREF_NONE, NULL, {NULL}, NULL,
64 NULL, NULL, NULL }; 64 NULL, NULL, NULL };
65 65
66 static guint prefs_save_timer = 0;
67 static gboolean prefs_is_loaded = FALSE;
68
69
70 static gboolean prefs_save_callback(gpointer who_cares) {
71 gaim_prefs_sync();
72 prefs_save_timer = 0;
73 return FALSE;
74 }
75
76 static void schedule_prefs_save() {
77 if(!prefs_save_timer)
78 prefs_save_timer = g_timeout_add(5000, prefs_save_callback, NULL);
79 }
80
81 static void prefs_save_cb(const char *name, GaimPrefType type, gpointer val,
82 gpointer user_data) {
83
84 if(!prefs_is_loaded)
85 return;
86
87 gaim_debug(GAIM_DEBUG_MISC, "prefs", "%s changed, scheduling save.\n", name);
88
89 schedule_prefs_save();
90 }
91
66 void gaim_prefs_init() { 92 void gaim_prefs_init() {
67 prefs_hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); 93 prefs_hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
94
95 gaim_prefs_connect_callback("/", prefs_save_cb, NULL);
68 96
69 gaim_prefs_add_none("/core"); 97 gaim_prefs_add_none("/core");
70 98
71 /* XXX: this is where you would want to put prefs declarations */ 99 /* XXX: this is where you would want to put prefs declarations */
72 } 100 }
442 } else { 470 } else {
443 fprintf(f, " />\n"); 471 fprintf(f, " />\n");
444 } 472 }
445 } 473 }
446 474
447 void gaim_prefs_save() {
448 /* FIXME: do this with timers so we don't save so damn often */
449 gaim_prefs_sync();
450 }
451
452 void gaim_prefs_sync() { 475 void gaim_prefs_sync() {
453 FILE *file; 476 FILE *file;
454 const char *user_dir = gaim_user_dir(); 477 const char *user_dir = gaim_user_dir();
455 char *filename; 478 char *filename;
456 char *filename_real; 479 char *filename_real;
457 480
481 if(!prefs_is_loaded) {
482 gaim_debug(GAIM_DEBUG_WARNING, "prefs", "prefs saved before loading! scheduling save.\n");
483 schedule_prefs_save(); /* schedule a save for after we read in */
484 return;
485 }
486
458 if(!user_dir) 487 if(!user_dir)
459 return; 488 return;
489
490 gaim_debug(GAIM_DEBUG_INFO, "prefs", "writing prefs out to disk.\n");
460 491
461 file = fopen(user_dir, "r"); 492 file = fopen(user_dir, "r");
462 if(!file) 493 if(!file)
463 mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR); 494 mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR);
464 else 495 else
568 gchar *contents = NULL; 599 gchar *contents = NULL;
569 gsize length; 600 gsize length;
570 GMarkupParseContext *context; 601 GMarkupParseContext *context;
571 GError *error = NULL; 602 GError *error = NULL;
572 603
573 if(!filename) 604
574 return; 605 if(!filename) {
606 prefs_is_loaded = TRUE;
607 return;
608 }
575 609
576 gaim_debug(GAIM_DEBUG_INFO, "prefs", "Reading %s\n", filename); 610 gaim_debug(GAIM_DEBUG_INFO, "prefs", "Reading %s\n", filename);
577 611
578 if(!g_file_get_contents(filename, &contents, &length, &error)) { 612 if(!g_file_get_contents(filename, &contents, &length, &error)) {
579 gaim_debug(GAIM_DEBUG_ERROR, "prefs", "Error reading prefs: %s\n", 613 gaim_debug(GAIM_DEBUG_ERROR, "prefs", "Error reading prefs: %s\n",
580 error->message); 614 error->message);
581 g_error_free(error); 615 g_error_free(error);
616 prefs_is_loaded = TRUE;
582 return; 617 return;
583 } 618 }
584 619
585 context = g_markup_parse_context_new(&prefs_parser, 0, NULL, NULL); 620 context = g_markup_parse_context_new(&prefs_parser, 0, NULL, NULL);
586 621
587 if(!g_markup_parse_context_parse(context, contents, length, NULL)) { 622 if(!g_markup_parse_context_parse(context, contents, length, NULL)) {
588 g_markup_parse_context_free(context); 623 g_markup_parse_context_free(context);
589 g_free(contents); 624 g_free(contents);
625 prefs_is_loaded = TRUE;
590 return; 626 return;
591 } 627 }
592 628
593 if(!g_markup_parse_context_end_parse(context, NULL)) { 629 if(!g_markup_parse_context_end_parse(context, NULL)) {
594 gaim_debug(GAIM_DEBUG_ERROR, "prefs", "Error parsing %s\n", filename); 630 gaim_debug(GAIM_DEBUG_ERROR, "prefs", "Error parsing %s\n", filename);
595 g_markup_parse_context_free(context); 631 g_markup_parse_context_free(context);
596 g_free(contents); 632 g_free(contents);
633 prefs_is_loaded = TRUE;
597 return; 634 return;
598 } 635 }
599 636
600 g_markup_parse_context_free(context); 637 g_markup_parse_context_free(context);
601 g_free(contents); 638 g_free(contents);
602 639
603 gaim_debug(GAIM_DEBUG_INFO, "prefs", "Finished reading %s\n", filename); 640 gaim_debug(GAIM_DEBUG_INFO, "prefs", "Finished reading %s\n", filename);
604 g_free(filename); 641 g_free(filename);
605 } 642 prefs_is_loaded = TRUE;
606 643 }
607 644
645