From d24a6c7b67a8e85c37655e557b440f0c737bc8af Mon Sep 17 00:00:00 2001 From: Bradford Hovinen Date: Wed, 16 Aug 2000 22:40:02 +0000 Subject: [PATCH] Add support for --get and --set to cap_options (gnome_capplet_init): Add 2000-08-16 Bradford Hovinen * capplet-widget.c: Add support for --get and --set to cap_options (gnome_capplet_init): Add return values 3 for --get and 4 for --set 2000-08-16 Bradford Hovinen * rc-parse.c (write_screensaver_list): Don't try to write string if the screensaver has no command line * main.c (main): Register Popt table containing get and set options; call do_get_xml and do_set_xml when necessary (do_get_xml): (do_set_xml): Implement --- capplets/screensaver/ChangeLog | 23 ++++ capplets/screensaver/main.c | 57 +++++++++ capplets/screensaver/preferences.c | 185 +++++++++++++++++++++++++++++ capplets/screensaver/preferences.h | 7 ++ capplets/screensaver/rc-parse.c | 5 +- 5 files changed, 274 insertions(+), 3 deletions(-) diff --git a/capplets/screensaver/ChangeLog b/capplets/screensaver/ChangeLog index 2cb553039..e168f1f64 100644 --- a/capplets/screensaver/ChangeLog +++ b/capplets/screensaver/ChangeLog @@ -1,5 +1,28 @@ 2000-08-16 Bradford Hovinen + * rc-parse.c (write_screensaver_list): Don't try to write string + if the screensaver has no command line + + * main.c (main): Register Popt table containing get and set + options; call do_get_xml and do_set_xml when necessary + (do_get_xml): + (do_set_xml): Implement + + * preferences.c (xml_get_number): Implement. Interpret the XML + content of a node as a number and return it + (xml_get_programs_list): Implement. Iterate through a programs + node and form a list of screensavers + (preferences_read_xml): Implement. Read an XML description of the + screensaver's state and put it in a preferences object + (xml_write_programs_list): Implement. Write out an XML node + corresponding to a list of screensavers + (preferences_write_xml): Implement. Write out an XML document with + the state of the screensaver system + (screensaver_read_xml): Implement. Read an XML node describing a + screensaver + (screensaver_write_xml): Implement. Write an XML node describing a + screensaver + * screensaver-prefs-dialog.c (get_select_widget): Remove extraneous precondition check (read_command_line): Rewrote to support quoted strings in the diff --git a/capplets/screensaver/main.c b/capplets/screensaver/main.c index da7f55c2c..329a59fd7 100644 --- a/capplets/screensaver/main.c +++ b/capplets/screensaver/main.c @@ -28,6 +28,9 @@ #include #include #include +#include +#include +#include #include @@ -45,6 +48,8 @@ static PrefsWidget *prefs_widget; static CappletWidget *capplet; +static gboolean do_get, do_set; + static void state_changed_cb (GtkWidget *widget) { @@ -179,6 +184,50 @@ setup_capplet_widget (void) prefs->frozen = FALSE; } +static void +do_get_xml (void) +{ + Preferences *prefs; + xmlDocPtr doc; + + prefs = preferences_new (); + preferences_load (prefs); + doc = preferences_write_xml (prefs); + xmlDocDump (stdout, doc); + preferences_destroy (prefs); +} + +static void +do_set_xml (void) +{ + Preferences *prefs; + xmlDocPtr doc; + Preferences *old_prefs, *new_prefs; + char *buffer; + int len = 0; + + while (!feof (stdin)) { + if (!len) buffer = g_new (char, 16384); + else buffer = g_renew (char, buffer, len + 16384); + fread (buffer + len, 1, 16384, stdin); + len += 16384; + } + + doc = xmlParseMemory (buffer, strlen (buffer)); + + old_prefs = preferences_new (); + preferences_load (old_prefs); + + new_prefs = preferences_read_xml (doc); + + if (new_prefs) { + new_prefs->config_db = old_prefs->config_db; + preferences_save (new_prefs); + } else { + g_warning ("Error while reading the screensaver config file"); + } +} + int main (int argc, char **argv) { @@ -197,6 +246,14 @@ main (int argc, char **argv) if (res < 0) { g_error ("Could not initialize the capplet."); } + else if (res == 3) { + do_get_xml (); + return 0; + } + else if (res == 4) { + do_set_xml (); + return 0; + } client = gnome_master_client (); flags = gnome_client_get_flags (client); diff --git a/capplets/screensaver/preferences.c b/capplets/screensaver/preferences.c index caa7550ff..6e4e3f810 100644 --- a/capplets/screensaver/preferences.c +++ b/capplets/screensaver/preferences.c @@ -217,6 +217,145 @@ preferences_save (Preferences *prefs) gnome_config_sync (); } +static gint +xml_get_number (xmlNodePtr node) +{ + return atoi (xmlNodeGetContent (node)); +} + +static GList * +xml_get_programs_list (xmlNodePtr programs_node) +{ + GList *list_head = NULL, *list_tail = NULL; + xmlNodePtr node; + Screensaver *saver; + gint id = 0; + + for (node = programs_node->childs; node; node = node->next) { + saver = screensaver_read_xml (node); + if (!saver) continue; + saver->id = id++; + list_tail = g_list_append (list_tail, saver); + if (list_head) + list_tail = list_tail->next; + else + list_head = list_tail; + } + + return list_head; +} + +Preferences * +preferences_read_xml (xmlDocPtr xml_doc) +{ + Preferences *prefs; + xmlNodePtr root_node, node; + + prefs = preferences_new (); + + root_node = xmlDocGetRootElement (xml_doc); + + if (strcmp (root_node->name, "screensaver-prefs")) + return NULL; + + for (node = root_node->childs; node; node = node->next) { + if (!strcmp (node->name, "verbose")) + prefs->verbose = TRUE; + else if (!strcmp (node->name, "lock")) + prefs->lock = TRUE; + else if (!strcmp (node->name, "fade")) + prefs->fade = TRUE; + else if (!strcmp (node->name, "unfade")) + prefs->unfade = TRUE; + else if (!strcmp (node->name, "fade-seconds")) + prefs->fade_seconds = xml_get_number (node); + else if (!strcmp (node->name, "fade-ticks")) + prefs->fade_ticks = xml_get_number (node); + else if (!strcmp (node->name, "install-colormap")) + prefs->install_colormap = TRUE; + else if (!strcmp (node->name, "nice")) + prefs->nice = xml_get_number (node); + else if (!strcmp (node->name, "timeout")) + prefs->timeout = xml_get_number (node); + else if (!strcmp (node->name, "lock-timeout")) + prefs->lock_timeout = xml_get_number (node); + else if (!strcmp (node->name, "cycle")) + prefs->cycle = xml_get_number (node); + else if (!strcmp (node->name, "programs")) + prefs->screensavers = xml_get_programs_list (node); + } + + return prefs; +} + +static xmlNodePtr +xml_write_programs_list (GList *screensavers) +{ + xmlNodePtr node; + + node = xmlNewNode (NULL, "programs"); + + for (; screensavers; screensavers = screensavers->next) + xmlAddChild (node, screensaver_write_xml + (SCREENSAVER (screensavers->data))); + + return node; +} + +xmlDocPtr +preferences_write_xml (Preferences *prefs) +{ + xmlDocPtr doc; + xmlNodePtr node; + char *tmp; + + doc = xmlNewDoc ("1.0"); + + node = xmlNewDocNode (doc, NULL, "screensaver-prefs", NULL); + + if (prefs->verbose) + xmlNewChild (node, NULL, "verbose", NULL); + if (prefs->lock) + xmlNewChild (node, NULL, "lock", NULL); + if (prefs->fade) + xmlNewChild (node, NULL, "fade", NULL); + if (prefs->unfade) + xmlNewChild (node, NULL, "unfade", NULL); + + tmp = g_strdup_printf ("%d", prefs->fade_seconds); + xmlNewChild (node, NULL, "fade-seconds", tmp); + g_free (tmp); + + tmp = g_strdup_printf ("%d", prefs->fade_ticks); + xmlNewChild (node, NULL, "fade-ticks", tmp); + g_free (tmp); + + if (prefs->install_colormap) + xmlNewChild (node, NULL, "install-colormap", NULL); + + tmp = g_strdup_printf ("%d", prefs->nice); + xmlNewChild (node, NULL, "nice", tmp); + g_free (tmp); + + tmp = g_strdup_printf ("%d", prefs->timeout); + xmlNewChild (node, NULL, "timeout", tmp); + g_free (tmp); + + tmp = g_strdup_printf ("%d", prefs->lock_timeout); + xmlNewChild (node, NULL, "lock-timeout", tmp); + g_free (tmp); + + tmp = g_strdup_printf ("%d", prefs->cycle); + xmlNewChild (node, NULL, "cycle", tmp); + g_free (tmp); + + xmlAddChild (node, xml_write_programs_list (prefs->screensavers)); + + xmlDocSetRootElement (doc, node); + + return doc; +} + Screensaver * screensaver_new (void) { @@ -274,6 +413,52 @@ screensaver_remove (Screensaver *saver, GList *screensavers) return g_list_remove_link (screensavers, saver->link); } +Screensaver * +screensaver_read_xml (xmlNodePtr saver_node) +{ + Screensaver *saver; + xmlNodePtr node; + + if (strcmp (saver_node->name, "screensaver")) + return NULL; + + saver = screensaver_new (); + + for (node = saver_node->childs; node; node = node->next) { + if (!strcmp (node->name, "name")) + saver->name = g_strdup (xmlNodeGetContent (node)); + else if (!strcmp (node->name, "label")) + saver->label = g_strdup (xmlNodeGetContent (node)); + else if (!strcmp (node->name, "command-line")) + saver->command_line = + g_strdup (xmlNodeGetContent (node)); + else if (!strcmp (node->name, "visual")) + saver->visual = g_strdup (xmlNodeGetContent (node)); + else if (!strcmp (node->name, "enabled")) + saver->enabled = TRUE; + } + + return saver; +} + +xmlNodePtr +screensaver_write_xml (Screensaver *saver) +{ + xmlNodePtr saver_node; + + saver_node = xmlNewNode (NULL, "screensaver"); + + xmlNewChild (saver_node, NULL, "name", saver->name); + xmlNewChild (saver_node, NULL, "label", saver->label); + xmlNewChild (saver_node, NULL, "command-line", saver->command_line); + xmlNewChild (saver_node, NULL, "visual", saver->visual); + + if (saver->enabled) + xmlNewChild (saver_node, NULL, "enabled", NULL); + + return saver_node; +} + char * screensaver_get_desc (Screensaver *saver) { diff --git a/capplets/screensaver/preferences.h b/capplets/screensaver/preferences.h index e11130b0c..0a01b7a52 100644 --- a/capplets/screensaver/preferences.h +++ b/capplets/screensaver/preferences.h @@ -26,6 +26,7 @@ #include #include +#include enum _SelectionMode { SM_DISABLE_SCREENSAVER, @@ -99,12 +100,18 @@ void preferences_destroy (Preferences *prefs); void preferences_load (Preferences *prefs); void preferences_save (Preferences *prefs); +Preferences *preferences_read_xml (xmlDocPtr xml_doc); +xmlDocPtr preferences_write_xml (Preferences *prefs); + Screensaver *screensaver_new (void); void screensaver_destroy (Screensaver *saver); GList *screensaver_add (Screensaver *saver, GList *screensavers); GList *screensaver_remove (Screensaver *saver, GList *screensavers); +Screensaver *screensaver_read_xml (xmlNodePtr node); +xmlNodePtr screensaver_write_xml (Screensaver *saver); + char *screensaver_get_desc (Screensaver *saver); char *screensaver_get_label (gchar *name); diff --git a/capplets/screensaver/rc-parse.c b/capplets/screensaver/rc-parse.c index 7c7367ad7..b55836818 100644 --- a/capplets/screensaver/rc-parse.c +++ b/capplets/screensaver/rc-parse.c @@ -612,14 +612,13 @@ write_screensaver_list (GList *screensavers) gchar *str; hack_string = g_string_new (NULL); - node = screensavers; - while (node) { + for (node = screensavers; node; node = node->next) { saver = SCREENSAVER (node->data); + if (!saver->command_line) continue; str = format_hack (saver, TRUE); g_string_append (hack_string, str); g_string_append (hack_string, "\n"); - node = node->next; g_free (str); }