Mercurial > pidgin.yaz
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 |