diff --git a/ChangeLog b/ChangeLog index aa2fe564f..df719031b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2001-08-09 Richard Hestilow + + * configure.in: Check for xscreensaver and perl, and + generate capplets/screensaver/magic.pl. + 2001-08-07 Bradford Hovinen * configure.in: Corect behavior when prefix is not explicitly diff --git a/capplets/screensaver/ChangeLog b/capplets/screensaver/ChangeLog index ef0d2dfd4..c54233c8e 100644 --- a/capplets/screensaver/ChangeLog +++ b/capplets/screensaver/ChangeLog @@ -1,3 +1,47 @@ +2001-08-09 Richard Hestilow + + * Makeflie.am (EXTRA_DIST): Install all pixmaps. + (pixmaps_DATA): Add blank-screen.png. + + * pref-file.c: Replace "programs" value with a regenerated + string. + (print_aligned_row): Added. + (print_list_to_str): Added. + + * preferences.h (Screensaver): Add new fields "filename", + "compat_command_line", "fakepreview", and "fakes", + to deal with the new xml storage. + (Preferences): Add new fields "savers_hash" and "invalidsavers". + + * preferences.c (screensaver_list_prepend_dir): Added. + (screensaver_cmp_func): Added. + (screensaver_list_load): Added. + (preferences_new): Initialize savers_hash. + (clean_saver_list): Added. + (preferences_load): Load screensavers from xml. + (parse_arg_default): Added. + (screensaver_read_xml): Updated for the new format. + (screensaver_new_from_file): Added. + + * prefs-widget.c (double_click_cb): Added. + (): Remove right click menu, add double click handler. + (model_is_cell_editable): Fix for etable bug. + (random_timeout_cb): Avoid vidwhacker and webcollage. + * preview.c: Optionally show fakepreview if set, and + deal with compat_command_line, and refresh pixbufs. + (command_exists): Renamed to rc_command_exists. + + * rc-parse.c: (parse_screensaver_list): Merely update + the existing entries, via the provided hash. + + * screensaver-prefs-dialog.c (get_argument_data): Just + find the xml file using ::filename. + + * screensavers/magic.pl.in: Added. + * screensavers/Makefile.am: Generate .xml.h files for translators, + and install all .xml files and .png files, and run magic.pl on + make install. + 2001-07-31 Chema Celorio * Makefile.am (cappletname): add DISTDIR to install-data-local diff --git a/capplets/screensaver/Makefile.am b/capplets/screensaver/Makefile.am index fbac825bc..cfee9194f 100644 --- a/capplets/screensaver/Makefile.am +++ b/capplets/screensaver/Makefile.am @@ -19,7 +19,7 @@ screensaver_properties_capplet_SOURCES = \ resources.c resources.h\ XScreenSaver_ad.h -pixmaps_DATA = no-hack.png blank-screen.png +pixmaps_DATA = no-hack.png blank-screen.png screen.png ## ## You should not need to modify anything below this line @@ -39,7 +39,7 @@ install-data-am: install-data-local INCLUDES = $(GNOMECC_CAPPLETS_CFLAGS) CLEANFILES = $(GNOMECC_CAPPLETS_CLEANFILES) -EXTRA_DIST = $(GNOMECC_CAPPLETS_EXTRA_DIST) no-hack.png +EXTRA_DIST = $(GNOMECC_CAPPLETS_EXTRA_DIST) $(pixmaps_DATA) iconsdir = $(GNOMECC_ICONS_DIR) Gladedir = $(GNOMECC_GLADE_DIR) pixmapsdir = $(GNOMECC_PIXMAPS_DIR) diff --git a/capplets/screensaver/pref-file.c b/capplets/screensaver/pref-file.c index a5a7178ea..6b11b94c8 100644 --- a/capplets/screensaver/pref-file.c +++ b/capplets/screensaver/pref-file.c @@ -417,6 +417,115 @@ write_preference_cb (gchar *key, gchar *value, FILE *out) return FALSE; } +static gchar* +print_aligned_row (const gchar *lbl, const gchar *cmd, gboolean enabled) +{ + int len; + int ntab, nspc; + gchar *tab, *spc; + gchar *buf; + + len = strlen (lbl) + 2; /* Quotes */ + ntab = (30 - len) / 8; + nspc = (30 - len) % 8; + tab = g_strnfill (ntab, '\t'); + spc = g_strnfill (nspc, ' '); + buf = g_strdup_printf ("%s%s%s\"%s\" %s\n", + (enabled) ? "" : "-", + tab, spc, + lbl, cmd); + g_free (tab); + g_free (spc); + + return buf; +} + +static gchar* +print_list_to_str (Preferences *prefs) +{ + gchar *lbl, *cmd, *buf; + gchar *ret; + Screensaver *saver; + GList *l, *fake; + GString *s; + gboolean enabled; + + s = g_string_new (""); + + for (l = prefs->screensavers; l != NULL; l = l->next) + { + saver = l->data; + + if (saver->command_line) + cmd = saver->command_line; + else if (saver->compat_command_line) + cmd = saver->compat_command_line; + else + continue; + + if (prefs->selection_mode == SM_CHOOSE_RANDOMLY) + { + /* I wouldn't want these running unless I'd + * explicitly enabled them */ + if (!strcmp (saver->name, "webcollage") + || !strcmp (saver->name, "vidwhacker")) + enabled = FALSE; + else + enabled = TRUE; + } + else + enabled = saver->enabled; + if (saver->label) + lbl = saver->label; + else + lbl = saver->name; + + buf = print_aligned_row (lbl, cmd, enabled); + g_string_append (s, buf); + g_free (buf); + + for (fake = saver->fakes; fake != NULL; fake = fake->next) + { + buf = print_aligned_row (fake->data, cmd, FALSE); + g_string_append (s, buf); + g_free (buf); + } + } + + for (l = prefs->invalidsavers; l != NULL; l = l->next) + { + saver = l->data; + + if (saver->command_line) + cmd = saver->command_line; + else if (saver->compat_command_line) + cmd = saver->compat_command_line; + else + cmd = "/bin/true"; + + if (saver->label) + lbl = saver->label; + else + lbl = saver->name; + + buf = print_aligned_row (lbl, cmd, FALSE); + g_string_append (s, buf); + g_free (buf); + + for (fake = saver->fakes; fake != NULL; fake = fake->next) + { + buf = print_aligned_row (fake->data, cmd, FALSE); + g_string_append (s, buf); + g_free (buf); + } + } + + ret = s->str; + g_string_free (s, FALSE); + + return ret; +} + /* Adapted from xscreensaver 3.24 driver/prefs.c line 537 ... */ gint @@ -427,6 +536,7 @@ preferences_save_to_file (Preferences *prefs) const char *tmp_name = init_file_tmp_name(); char *n2 = chase_symlinks (name); struct stat st; + gchar *progs, *oldprogs; FILE *out; @@ -485,6 +595,15 @@ preferences_save_to_file (Preferences *prefs) "XScreenSaver", "xscreensaver", "3.24", whoami, timestr); } + /* Ok this is lame, but it is easier than rewriting stuff */ + progs = print_list_to_str (prefs); + oldprogs = g_tree_lookup (prefs->config_db, "programs"); + /* Is this the right way of doing it? */ + g_tree_remove (prefs->config_db, "programs"); + if (oldprogs) + g_free (oldprogs); + g_tree_insert (prefs->config_db, "programs", progs); + g_tree_traverse (prefs->config_db, (GTraverseFunc) write_preference_cb, G_IN_ORDER, out); diff --git a/capplets/screensaver/preferences.c b/capplets/screensaver/preferences.c index d4570334a..fc069d0b6 100644 --- a/capplets/screensaver/preferences.c +++ b/capplets/screensaver/preferences.c @@ -30,8 +30,11 @@ #include #include #include +#include +#include #include +#include #include "preferences.h" #include "preview.h" @@ -98,7 +101,7 @@ read_prefs_from_db (Preferences *prefs) if (value) { tmp = g_strdup (value); - prefs->screensavers = parse_screensaver_list (tmp); + parse_screensaver_list (prefs->savers_hash, tmp); g_free (tmp); } } @@ -155,6 +158,71 @@ store_prefs_in_db (Preferences *prefs) write_screensaver_list (prefs->screensavers)); } +static GList* +screensaver_list_prepend_dir (GHashTable *savers_hash, + GList *l, const gchar *dirname) +{ + DIR *dir; + struct dirent *dent; + gchar *filename; + Screensaver *saver; + + g_return_val_if_fail (savers_hash != NULL, NULL); + g_return_val_if_fail (dirname != NULL, NULL); + + dir = opendir (dirname); + if (!dir) + return l; + + while ((dent = readdir (dir))) + { + if (dent->d_name[0] == '.') + continue; + + filename = g_concat_dir_and_file (dirname, dent->d_name); + saver = screensaver_new_from_file (filename); + if (saver) + { + l = g_list_prepend (l, saver); + g_hash_table_insert (savers_hash, + saver->name, saver); + saver->link = l; + } + g_free (filename); + } + + return l; +} + +static gint +screensaver_cmp_func (gconstpointer a, gconstpointer b) +{ + const Screensaver *s1 = a; + const Screensaver *s2 = b; + + return strcmp (s1->name, s2->name); +} + +static GList* +screensaver_list_load (GHashTable *savers_hash) +{ + GList *l = NULL; + + gchar *userdir; + + l = screensaver_list_prepend_dir (savers_hash, + l, GNOMECC_SCREENSAVERS_DIR); + + userdir = g_concat_dir_and_file (g_get_home_dir (), ".screensavers"); + l = screensaver_list_prepend_dir (savers_hash, + l, userdir); + g_free (userdir); + + /* FIXME: Does not work with utf8 */ + l = g_list_sort (l, screensaver_cmp_func); + return l; +} + Preferences * preferences_new (void) { @@ -162,6 +230,8 @@ preferences_new (void) prefs = g_new0 (Preferences, 1); + prefs->savers_hash = g_hash_table_new (g_str_hash, g_str_equal); + /* Load default values */ preferences_load_from_xrdb (prefs); @@ -187,6 +257,8 @@ preferences_clone (Preferences *prefs) Preferences *new_prefs; new_prefs = g_new0 (Preferences, 1); + + new_prefs->savers_hash = g_hash_table_new (g_str_hash, g_str_equal); new_prefs->config_db = g_tree_new ((GCompareFunc) strcmp); @@ -219,9 +291,37 @@ preferences_destroy (Preferences *prefs) } if (prefs->programs_list) g_free (prefs->programs_list); + g_hash_table_destroy (prefs->savers_hash); g_free (prefs); } +static void +clean_saver_list (Preferences *prefs) +{ + GList *l, *next; + Screensaver *saver; + + l = prefs->screensavers; + while (l) + { + saver = l->data; + + if ((saver->command_line + && !rc_command_exists (saver->command_line)) + || (saver->compat_command_line + && !rc_command_exists (saver->compat_command_line)) + || !(saver->command_line || saver->compat_command_line)) + { + prefs->invalidsavers = g_list_append (prefs->invalidsavers, l->data); + next = l->next; + prefs->screensavers = g_list_remove_link (prefs->screensavers, l); + l = next; + continue; + } + l = l->next; + } +} + void preferences_load (Preferences *prefs) { @@ -230,7 +330,11 @@ preferences_load (Preferences *prefs) if (!preferences_load_from_file (prefs)) preferences_load_from_xrdb (prefs); + g_assert (prefs->screensavers == NULL); + prefs->screensavers = screensaver_list_load (prefs->savers_hash); + read_prefs_from_db (prefs); + clean_saver_list (prefs); prefs->selection_mode = gnome_config_get_int ("/Screensaver/Default/selection_mode=3"); @@ -325,8 +429,10 @@ preferences_read_xml (xmlDocPtr xml_doc) prefs->lock_timeout = xml_read_int (node); else if (!strcmp (node->name, "cycle")) prefs->cycle = xml_read_int (node); +#if 0 else if (!strcmp (node->name, "programs")) prefs->screensavers = xml_get_programs_list (node); +#endif else if (!strcmp (node->name, "selection-mode")) prefs->selection_mode = xml_read_int (node); else if (!strcmp (node->name, "use-dpms")) @@ -449,12 +555,50 @@ screensaver_remove (Screensaver *saver, GList *screensavers) return g_list_remove_link (screensavers, saver->link); } +#if 0 +static void +parse_select_default (GString *s, xmlNodePtr node) +{ + for (node = node->childs; node != NULL; node = node->next) + { + if (strcmp (node->name, "option")) + continue; + if (xmlGetProp (node, "test")) + continue; + g_string_append (s, xmlGetProp (node, "" + } +} +#endif + +static void +parse_arg_default (GString *s, xmlNodePtr node) +{ + gchar *arg; + gchar *val; + gchar **arr; + + arg = g_strdup (xmlGetProp (node, "arg")); + val = g_strdup (xmlGetProp (node, "default")); + if (!val) + return; + arr = g_strsplit (arg, "%", -1); + if (!arr) + return; + + g_string_append_c (s, ' '); + g_string_append (s, arr[0]); + g_string_append (s, val); + if (arr[1] && arg[2]) + g_string_append (s, arr[2]); +} Screensaver * screensaver_read_xml (xmlNodePtr saver_node) { Screensaver *saver; xmlNodePtr node; + GString *args; + gboolean have_args = FALSE; if (strcmp (saver_node->name, "screensaver")) return NULL; @@ -462,20 +606,56 @@ screensaver_read_xml (xmlNodePtr saver_node) saver = screensaver_new (); saver->enabled = FALSE; + saver->name = g_strdup (xmlGetProp (saver_node, "name")); saver->label = g_strdup (xmlGetProp (saver_node, "_label")); + args = g_string_new (saver->name); + 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, "command-line")) + 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 = xml_read_bool (node); + else if (!strcmp (node->name, "_description")) + saver->description = g_strdup (xmlNodeGetContent (node)); + else if (!strcmp (node->name, "fullcommand")) + saver->compat_command_line = g_strconcat (saver->name, " ", xmlGetProp (node, "arg"), NULL); + else if (!strcmp (node->name, "number")) + { + parse_arg_default (args, node); + have_args = TRUE; + } + else if (!strcmp (node->name, "command")) + { + g_string_append_c (args, ' '); + g_string_append (args, xmlGetProp (node, "arg")); + have_args = TRUE; + } + else if (!strcmp (node->name, "fakepreview")) + { + saver->fakepreview = g_concat_dir_and_file (GNOMECC_PIXMAPS_DIR "/screensavers", xmlNodeGetContent (node)); + } + else if (!strcmp (node->name, "fake")) + { + saver->fakes = g_list_append (saver->fakes, g_strdup (xmlGetProp (node, "name"))); + } } + if (have_args) + { + if (saver->compat_command_line) + { + g_warning ("Huh? Argument metadata and a fullcommand?"); + } + else + saver->command_line = g_strdup (args->str); + } + + g_string_free (args, TRUE); + return saver; } @@ -495,6 +675,35 @@ screensaver_write_xml (Screensaver *saver) return saver_node; } +Screensaver * +screensaver_new_from_file (const gchar *filename) +{ + Screensaver *saver; + xmlDocPtr doc; + xmlNodePtr node; + + g_return_val_if_fail (filename != NULL, NULL); + + doc = xmlParseFile (filename); + if (!doc) + return NULL; + + node = doc->root; + if (!node) + { + xmlFreeDoc (doc); + return NULL; + } + + saver = screensaver_read_xml (node); + if (saver) + saver->filename = g_strdup (filename); + xmlFreeDoc (doc); + + return saver; +} + + char * screensaver_get_desc (Screensaver *saver) { diff --git a/capplets/screensaver/preferences.h b/capplets/screensaver/preferences.h index e451af712..0e320341e 100644 --- a/capplets/screensaver/preferences.h +++ b/capplets/screensaver/preferences.h @@ -46,12 +46,17 @@ struct _Screensaver { guint id; gchar *name; + gchar *filename; gchar *label; gchar *description; gchar *command_line; + gchar *compat_command_line; gchar *visual; gboolean enabled; GList *link; + + gchar *fakepreview; + GList *fakes; }; struct _Preferences @@ -79,11 +84,14 @@ struct _Preferences SelectionMode selection_mode; GList *screensavers; + GHashTable *savers_hash; gint frozen; /* TRUE if we shouldn't reflect * preference changes in capplet */ GTree *config_db; /* key-value database of config options */ + GList *invalidsavers; + /* Settings that are not stored in .xscreensaver ... */ gboolean power_management; @@ -105,6 +113,7 @@ Preferences *preferences_read_xml (xmlDocPtr xml_doc); xmlDocPtr preferences_write_xml (Preferences *prefs); Screensaver *screensaver_new (void); +Screensaver *screensaver_new_from_file (const gchar *filename); void screensaver_destroy (Screensaver *saver); GList *screensaver_add (Screensaver *saver, GList *screensavers); diff --git a/capplets/screensaver/prefs-widget.c b/capplets/screensaver/prefs-widget.c index de0f6d556..83ff8c019 100644 --- a/capplets/screensaver/prefs-widget.c +++ b/capplets/screensaver/prefs-widget.c @@ -90,6 +90,9 @@ static void set_random_timeout (PrefsWidget *prefs_widget, static void popup_item_menu (ETable *table, int row, int col, GdkEvent *event, PrefsWidget *prefs_widget); +static void double_click_cb (ETable *table, + int row, int col, GdkEvent *event, + PrefsWidget *prefs_widget); static void about_cb (GtkWidget *widget, PrefsWidget *prefs_widget); @@ -237,10 +240,16 @@ prefs_widget_init (PrefsWidget *prefs_widget) gtk_signal_connect (GTK_OBJECT (table), "selection_change", GTK_SIGNAL_FUNC (selection_changed_cb), prefs_widget); + /* Disabled for now -- no need for Add/Remove/About */ +#if 0 gtk_signal_connect (GTK_OBJECT (table), "right_click", GTK_SIGNAL_FUNC (popup_item_menu), prefs_widget); - +#endif + gtk_signal_connect (GTK_OBJECT (table), "double_click", + GTK_SIGNAL_FUNC (double_click_cb), + prefs_widget); + widget = WID ("mode_option"); option_menu_connect (GTK_OPTION_MENU (widget), GTK_SIGNAL_FUNC (mode_changed_cb), @@ -604,7 +613,12 @@ model_set_value_at (ETableModel *etm, static gboolean model_is_cell_editable (ETableModel *etm, int col, int row, void *data) { - return (col == 0); + PrefsWidget *prefs_widget = PREFS_WIDGET (data); + + if (prefs_widget->selection_mode == SM_CHOOSE_FROM_LIST) + return (col == 0); + else + return FALSE; } static void * @@ -694,7 +708,7 @@ static void selection_foreach_func (int model_row, int *closure) { g_return_if_fail (closure != NULL); - + /* Selection mode is "single */ *closure = model_row; } @@ -703,6 +717,7 @@ static gint random_timeout_cb (PrefsWidget *prefs_widget) { GList *l, *old; + gboolean skippedwc = FALSE, skippedvw = FALSE; g_return_val_if_fail (prefs_widget != NULL, FALSE); @@ -716,6 +731,35 @@ random_timeout_cb (PrefsWidget *prefs_widget) /* Handles both "l initially NULL" and "end of list" */ if (!l) l = prefs_widget->screensavers; + old = l; + /* Strip out vidwhacker and webcollage -- don't want to sneak + * those into a random mode if the user didn't select them. + * Especially as a preview. */ + while (l) + { + if (skippedwc && skippedvw && old == l) + { + show_blank_preview (); + return FALSE; + } + if (!strcmp (((Screensaver*)l->data)->name, "webcollage")) + { + skippedwc = TRUE; + l = l->next; + if (!l) + l = prefs_widget->screensavers; + continue; + } + if (!strcmp (((Screensaver*)l->data)->name, "vidwhacker")) + { + skippedvw = TRUE; + l = l->next; + if (!l) + l = prefs_widget->screensavers; + continue; + } + break; + } } else /* Skip the non-enabled ones */ @@ -812,6 +856,14 @@ popup_item_menu (ETable *table, event->button.button, event->button.time); } +static void +double_click_cb (ETable *table, + int row, int col, GdkEvent *event, + PrefsWidget *prefs_widget) +{ + settings_cb (NULL, prefs_widget); +} + static void about_cb (GtkWidget *widget, PrefsWidget *prefs_widget) { @@ -823,7 +875,11 @@ about_cb (GtkWidget *widget, PrefsWidget *prefs_widget) label = gtk_label_new (desc); gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); +#if 0 name = screensaver_get_label (prefs_widget->selected_saver->name); +#endif + name = g_strdup (prefs_widget->selected_saver->label); + title = g_strdup_printf ("About %s\n", name); g_free (name); @@ -843,6 +899,19 @@ about_cb (GtkWidget *widget, PrefsWidget *prefs_widget) gtk_widget_show_all (dlg); } +static void +prefs_ok_cb (ScreensaverPrefsDialog *dlg, PrefsWidget *widget) +{ + if (dlg->saver == widget->selected_saver) + show_preview (widget->selected_saver); +} + +static void +prefs_demo_cb (ScreensaverPrefsDialog *dlg, PrefsWidget *widget) +{ + show_preview (widget->selected_saver); +} + static void settings_cb (GtkWidget *button, PrefsWidget *widget) { @@ -851,14 +920,12 @@ settings_cb (GtkWidget *button, PrefsWidget *widget) if (!widget->selected_saver) return; dialog = screensaver_prefs_dialog_new (widget->selected_saver); -#if 0 - gtk_signal_connect (GTK_OBJECT (dialog), "ok-clicked", - GTK_SIGNAL_FUNC (screensaver_prefs_ok_cb), + gtk_signal_connect_after (GTK_OBJECT (dialog), "ok-clicked", + GTK_SIGNAL_FUNC (prefs_ok_cb), widget); - gtk_signal_connect (GTK_OBJECT (dialog), "demo", + gtk_signal_connect_after (GTK_OBJECT (dialog), "demo", GTK_SIGNAL_FUNC (prefs_demo_cb), widget); -#endif gtk_widget_show_all (dialog); } diff --git a/capplets/screensaver/preview.c b/capplets/screensaver/preview.c index bf908dbf2..1e8ad0681 100644 --- a/capplets/screensaver/preview.c +++ b/capplets/screensaver/preview.c @@ -45,6 +45,8 @@ static GtkWidget *preview_window; static pid_t preview_pid; static int timeout_id; +static int expose_id = 0; +static GdkPixbuf *pixbuf = NULL; #if 0 @@ -63,10 +65,29 @@ print_args (char **args) #endif +static void +expose_func (GtkWidget *widget, GdkEventExpose *event, gpointer data) +{ + if (!pixbuf) + return; + + gdk_pixbuf_render_to_drawable + (pixbuf, (GdkDrawable *) preview_window->window, + preview_window->style->fg_gc[0], + event->area.x, event->area.y, + event->area.x, event->area.y, + event->area.width, event->area.height, + GDK_RGB_DITHER_NORMAL, 0, 0); +} + void set_preview_window (GtkWidget *widget) { + if (expose_id) + gtk_signal_disconnect (GTK_OBJECT (preview_window), expose_id); preview_window = widget; + expose_id = gtk_signal_connect (GTK_OBJECT (preview_window), + "expose_event", expose_func, NULL); } static char ** @@ -193,6 +214,14 @@ static void show_screensaver (GdkWindow *window, Screensaver *saver, pid_t *pid) { char **args; + gchar *command_line; + + if (saver->command_line) + command_line = saver->command_line; + else + { + command_line = saver->compat_command_line; + } *pid = fork (); @@ -203,7 +232,7 @@ show_screensaver (GdkWindow *window, Screensaver *saver, pid_t *pid) else if (*pid == 0) { nice (20); /* Very low priority */ - args = g_strsplit (saver->command_line, " ", -1); + args = g_strsplit (command_line, " ", -1); args = fix_arguments (args); args = strip_arg (args, "-root"); args = add_window_arg (args, window); @@ -222,7 +251,6 @@ show_screensaver (GdkWindow *window, Screensaver *saver, pid_t *pid) static gint show_screensaver_timeout (void) { - GdkPixbuf *pixbuf; int ret; ret = waitpid (preview_pid, NULL, WNOHANG); @@ -231,6 +259,9 @@ show_screensaver_timeout (void) g_error ("waitpid: %s", g_strerror (errno)); } else if (ret > 0) { + if (pixbuf) + gdk_pixbuf_unref (pixbuf); + pixbuf = gdk_pixbuf_new_from_file (GNOMECC_PIXMAPS_DIR "/no-hack.png"); gdk_pixbuf_render_to_drawable @@ -249,12 +280,32 @@ show_preview (Screensaver *saver) { /* Note: kill this next line for a very interesting effect ... */ close_preview (); - if (!saver->command_line) return; + if (!(saver->command_line || saver->compat_command_line || saver->fakepreview)) return; gtk_widget_map (preview_window); - show_screensaver (preview_window->window, saver, &preview_pid); - timeout_id = - gtk_timeout_add (500, (GtkFunction) - show_screensaver_timeout, NULL); + + if (pixbuf) + { + gdk_pixbuf_unref (pixbuf); + pixbuf = NULL; + } + + if (saver->fakepreview) + { + pixbuf = gdk_pixbuf_new_from_file (saver->fakepreview); + gdk_pixbuf_render_to_drawable + (pixbuf, (GdkDrawable *) preview_window->window, + preview_window->style->fg_gc[0], 0, 0, 0, 0, + gdk_pixbuf_get_width (pixbuf), + gdk_pixbuf_get_height (pixbuf), + GDK_RGB_DITHER_NONE, 0, 0); + } + else + { + show_screensaver (preview_window->window, saver, &preview_pid); + timeout_id = + gtk_timeout_add (500, (GtkFunction) + show_screensaver_timeout, NULL); + } } void @@ -275,11 +326,12 @@ close_preview (void) void show_blank_preview (void) { - GdkPixbuf *pixbuf; - close_preview (); gtk_widget_map (preview_window); + if (pixbuf) + gdk_pixbuf_unref (pixbuf); + pixbuf = gdk_pixbuf_new_from_file (GNOMECC_PIXMAPS_DIR "/blank-screen.png"); gdk_pixbuf_render_to_drawable (pixbuf, (GdkDrawable *) preview_window->window, diff --git a/capplets/screensaver/rc-parse.c b/capplets/screensaver/rc-parse.c index 1740527ce..a7c207b40 100644 --- a/capplets/screensaver/rc-parse.c +++ b/capplets/screensaver/rc-parse.c @@ -242,13 +242,13 @@ get_screensaver_dir_list (void) return screensaver_dir_list; } -/* command_exists +/* rc_command_exists * * Given a command line, determines if the command may be executed */ -static gboolean -command_exists (char *command) +gboolean +rc_command_exists (char *command) { GList *screensaver_dir_list; GList *node; @@ -342,7 +342,7 @@ parse_screensaver (const char *line) } h->command_line = strip_whitespace (line); - if (!command_exists (h->command_line)) { + if (!rc_command_exists (h->command_line)) { screensaver_destroy (h); return NULL; } @@ -355,8 +355,8 @@ parse_screensaver (const char *line) /* Adapted from xscreensaver 3.24 driver/prefs.c line 1076 ... */ -GList * -parse_screensaver_list (char *list) +void +parse_screensaver_list (GHashTable *savers_hash, char *list) { int start = 0; int end = 0; @@ -369,6 +369,9 @@ parse_screensaver_list (char *list) GList *list_head = NULL, *list_tail = NULL; Screensaver *saver; + g_return_if_fail (savers_hash != NULL); + g_return_if_fail (list != NULL); + size = strlen (list); /* Iterate over the lines in `d' (the string with newlines) @@ -392,19 +395,23 @@ parse_screensaver_list (char *list) saver = parse_screensaver (list + start); if (saver) { - saver->id = count++; - if (saver->enabled) number_enabled++; - total++; - list_tail = g_list_append (list_tail, saver); - if (!list_head) list_head = list_tail; - list_tail = g_list_last (list_tail); - saver->link = list_tail; + if (saver->enabled) + { + Screensaver *real_saver; + real_saver = g_hash_table_lookup (savers_hash, + saver->name); + if (real_saver) + { + real_saver->enabled = TRUE; + real_saver->command_line = + g_strdup (saver->command_line); + } + } + screensaver_destroy (saver); } start = end + 1; } - - return list_head; } gchar * diff --git a/capplets/screensaver/rc-parse.h b/capplets/screensaver/rc-parse.h index 7e68cd414..f5906dd05 100644 --- a/capplets/screensaver/rc-parse.h +++ b/capplets/screensaver/rc-parse.h @@ -32,7 +32,7 @@ double parse_float_resource (char *res); guint parse_time_resource (char *res, gboolean sec); guint parse_seconds_resource (char *res); gdouble parse_minutes_resource (char *res); -GList *parse_screensaver_list (char *list); +void parse_screensaver_list (GHashTable *savers_hash, char *list); gchar *write_boolean (gboolean value); gchar *write_integer (gint value); @@ -47,4 +47,6 @@ int string_columns (const char *string, int length, int start); GList *get_screensaver_dir_list (void); +gboolean rc_command_exists (char *command); + #endif /* __RC_PARSE_H */ diff --git a/capplets/screensaver/screensaver-prefs-dialog.c b/capplets/screensaver/screensaver-prefs-dialog.c index 348118074..4631b2c37 100644 --- a/capplets/screensaver/screensaver-prefs-dialog.c +++ b/capplets/screensaver/screensaver-prefs-dialog.c @@ -741,32 +741,38 @@ static xmlDocPtr get_argument_data (Screensaver *saver) { xmlDocPtr doc; - gchar *file_name; - gchar *lang; - + xmlNodePtr node; + gboolean options = FALSE; + g_return_val_if_fail (saver != NULL, NULL); - g_return_val_if_fail (saver->name != NULL, NULL); + g_return_val_if_fail (saver->filename != NULL, NULL); - lang = g_getenv ("LANG"); - if (lang) - lang = g_strconcat (lang, "/", NULL); - else - lang = g_strdup (""); + doc = xmlParseFile (saver->filename); + if (!doc) + return NULL; - file_name = g_strconcat (GNOMECC_SCREENSAVERS_DIR "/screensavers/", - lang, saver->name, ".xml", NULL); - doc = xmlParseFile (file_name); - g_free (file_name); - - /* Fall back on default language if given language is not found */ - if (!doc && *lang != '\0') { - file_name = g_strconcat (GNOMECC_SCREENSAVERS_DIR "/screensavers/", - saver->name, ".xml", NULL); - doc = xmlParseFile (file_name); - g_free (file_name); + if (!(doc->root && doc->root->childs)) + { + xmlFreeDoc (doc); + return NULL; + } + + for (node = doc->root->childs; node != NULL; node = node->next) + { + if (!strcmp (node->name, "select") + || !strcmp (node->name, "number") + || !strcmp (node->name, "boolean")) + { + options = TRUE; + break; + } + } + + if (!options) + { + xmlFreeDoc (doc); + return NULL; } - - g_free (lang); return doc; } @@ -1352,7 +1358,7 @@ static GtkWidget * get_basic_screensaver_widget (ScreensaverPrefsDialog *dialog) { GtkWidget *vbox, *label; - GList *node; + /*GList *node;*/ vbox = gtk_vbox_new (FALSE, 10); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); @@ -1675,20 +1681,15 @@ static gboolean arg_mapping_exists (Screensaver *saver) { struct stat buf; - char *filename; gboolean ret; - if (!saver->name) return FALSE; + if (!saver->filename) return FALSE; - filename = g_strconcat (GNOMECC_SCREENSAVERS_DIR "/screensavers/", - saver->name, ".xml", NULL); - - if (stat (filename, &buf)) + if (stat (saver->filename, &buf)) ret = FALSE; else ret = TRUE; - g_free (filename); return ret; } @@ -1730,6 +1731,7 @@ demo_cb (GtkWidget *widget, ScreensaverPrefsDialog *dialog) store_cli (dialog); gtk_signal_emit (GTK_OBJECT (dialog), screensaver_prefs_dialog_signals[DEMO_SIGNAL]); + show_blank_preview (); show_demo (dialog->saver); } diff --git a/capplets/screensaver/screensavers/3d_clock.xml b/capplets/screensaver/screensavers/3d_clock.xml index 336962996..22a2af445 100644 --- a/capplets/screensaver/screensavers/3d_clock.xml +++ b/capplets/screensaver/screensavers/3d_clock.xml @@ -1,6 +1,6 @@ - + diff --git a/capplets/screensaver/screensavers/Makefile.am b/capplets/screensaver/screensavers/Makefile.am index 2dec74efe..4ecb0ed66 100644 --- a/capplets/screensaver/screensavers/Makefile.am +++ b/capplets/screensaver/screensavers/Makefile.am @@ -1,99 +1,166 @@ -Screensaversdir = $(GNOMECC_SCREENSAVERS_DIR) -Screensavers_DATA = \ - 3d_clock.xml \ - ant.xml \ - atlantis.xml \ - attraction.xml \ - blitspin.xml \ - bouboule.xml \ - braid.xml \ - bsod.xml \ - bubble3d.xml \ - bubbles.xml \ - cage.xml \ - compass.xml \ - coral.xml \ - critical.xml \ - crystal.xml \ - cynosure.xml \ - decayscreen.xml\ - deco.xml \ - deluxe.xml \ - demon.xml \ - discrete.xml \ - distort.xml \ - drift.xml \ - epicycle.xml \ - fadeplot.xml \ - flag.xml \ - flame.xml \ - flow.xml \ - forest.xml \ - glplanet.xml \ - galaxy.xml \ - gears.xml \ - goop.xml \ - grav.xml \ - greynetic.xml \ - halo.xml \ - helix.xml \ - hopalong.xml \ - hypercube.xml \ - ifs.xml \ - imsmap.xml \ - interference.xml\ - jigsaw.xml \ - julia.xml \ - kaleidescope.xml\ - kumppa.xml \ - lament.xml \ - laser.xml \ - lightning.xml \ - lisa.xml \ - lissie.xml \ - lmorph.xml \ - loop.xml \ - maze.xml \ - moebius.xml \ - moire.xml \ - moire2.xml \ - morph3d.xml \ - mountain.xml \ - munch.xml \ - noseguy.xml \ - pedal.xml \ - penetrate.xml \ - penrose.xml \ - pipes.xml \ - pyro.xml \ - qix.xml \ - rd-bomb.xml \ - rocks.xml \ - rorschach.xml \ - rotor.xml \ - rubiks_cube.xml\ - sierpinski.xml \ - slidescreen.xml\ - slip.xml \ - sonar.xml \ - sphere.xml \ - spiral.xml \ - spotlight.xml \ - sproingies.xml \ - squiral.xml \ - stairs.xml \ - starfish.xml \ - strange.xml \ - superquadrics.xml \ - swirl.xml \ - triangle.xml \ - truchet.xml \ - vines.xml \ - worm.xml \ - xflame.xml \ - xjack.xml \ - xlyap.xml \ - xmatrix.xml \ - xroger.xml +pixmapsdir = $(GNOMECC_PIXMAPS_DIR)/screensavers -EXTRA_DIST = $(Screensavers_DATA) README +pixmaps_DATA = \ + decayscreen.png \ + distort.png \ + jigsaw.png \ + slip.png \ + vidwhacker.png \ + webcollage.png + +# This is not _DATA because we install _all_ xml files in install-data-local +Screensavers = \ + 3d_clock.xml \ + ant.xml \ + atlantis.xml \ + attraction.xml \ + blaster.xml \ + blitspin.xml \ + bouboule.xml \ + braid.xml \ + bsod.xml \ + bubble3d.xml \ + bubbles.xml \ + bumps.xml \ + cage.xml \ + ccurve.xml \ + compass.xml \ + coral.xml \ + cosmos.xml \ + critical.xml \ + crystal.xml \ + cynosure.xml \ + dangerball.xml \ + decayscreen.xml \ + deco.xml \ + deluxe.xml \ + demon.xml \ + discrete.xml \ + distort.xml \ + drift.xml \ + electricsheep.xml \ + epicycle.xml \ + extrusion.xml \ + fadeplot.xml \ + flag.xml \ + flame.xml \ + flow.xml \ + forest.xml \ + galaxy.xml \ + gears.xml \ + gflux.xml \ + glplanet.xml \ + gltext.xml \ + goban.xml \ + goop.xml \ + grav.xml \ + greynetic.xml \ + halo.xml \ + helix.xml \ + hopalong.xml \ + hyperball.xml \ + hypercube.xml \ + ifs.xml \ + imsmap.xml \ + interference.xml \ + jigsaw.xml \ + julia.xml \ + kaleidescope.xml \ + kumppa.xml \ + lament.xml \ + laser.xml \ + lightning.xml \ + lisa.xml \ + lissie.xml \ + lmorph.xml \ + loop.xml \ + maze.xml \ + moebius.xml \ + moire2.xml \ + moire.xml \ + molecule.xml \ + morph3d.xml \ + mountain.xml \ + munch.xml \ + nerverot.xml \ + noseguy.xml \ + pedal.xml \ + penetrate.xml \ + penrose.xml \ + petri.xml \ + phosphor.xml \ + pipes.xml \ + pulsar.xml \ + pyro.xml \ + qix.xml \ + rd-bomb.xml \ + ripples.xml \ + rocks.xml \ + rorschach.xml \ + rotor.xml \ + rotzoomer.xml \ + rubiks_cube.xml \ + rubik.xml \ + shadebobs.xml \ + sierpinski3d.xml \ + sierpinski.xml \ + slidescreen.xml \ + slip.xml \ + sonar.xml \ + speedmine.xml \ + sphere.xml \ + spiral.xml \ + spotlight.xml \ + sproingies.xml \ + squiral.xml \ + ssystem.xml \ + stairs.xml \ + starfish.xml \ + starwars.xml \ + stonerview.xml \ + strange.xml \ + superquadrics.xml \ + swirl.xml \ + t3d.xml \ + triangle.xml \ + truchet.xml \ + vidwhacker.xml \ + vines.xml \ + wander.xml \ + webcollage.xml \ + whirlwindwarp.xml \ + whirlygig.xml \ + worm.xml \ + xaos.xml \ + xdaliclock.xml \ + xearth.xml \ + xfishtank.xml \ + xflame.xml \ + xjack.xml \ + xlyap.xml \ + xmatrix.xml \ + xmountains.xml \ + xrayswarm.xml \ + xroger.xml \ + xsnow.xml \ + xspirograph.xml \ + xteevee.xml \ + zoom.xml + +Translatables = $(Screensavers:.xml=.xml.h) +$(Translatables): %.xml.h: %.xml + $(top_srcdir)/xml-i18n-extract --type=gettext/xml $< + +all: $(Translatables) + +EXTRA_DIST = $(Screensavers) README \ + $(Translatables) + +CLEANFILES = $(Translatables) + +ADFILE = $(XSCREENSAVER_PREFIX)/lib/X11/app-defaults/XScreenSaver + +install-data-local: + $(mkinstalldirs) $(DESTDIR)$(GNOMECC_SCREENSAVERS_DIR) + $(INSTALL_DATA) *.xml $(DESTDIR)$(GNOMECC_SCREENSAVERS_DIR) + @PERL@ $(top_srcdir)/capplets/screensaver/screensavers/magic.pl --adfile $(ADFILE) --merge $(DESTDIR)$(GNOMECC_SCREENSAVERS_DIR) diff --git a/capplets/screensaver/screensavers/TODO b/capplets/screensaver/screensavers/TODO new file mode 100644 index 000000000..2992e42ba --- /dev/null +++ b/capplets/screensaver/screensavers/TODO @@ -0,0 +1,3 @@ +* Check for argument mismatch between xscreensaver and xml. +* Handle output from xrdb. +* Get installed, and run on .xscreensaver at runtime. diff --git a/capplets/screensaver/screensavers/ant.xml b/capplets/screensaver/screensavers/ant.xml index d96ad9455..0ae4b2c1f 100644 --- a/capplets/screensaver/screensavers/ant.xml +++ b/capplets/screensaver/screensavers/ant.xml @@ -1,6 +1,6 @@ - + @@ -71,4 +71,5 @@ - + <_description>A cellular automaton that is really a two-dimensional Turing machine: as the heads (``ants'') walk along the screen, they change pixel values in their path. Then, as they pass over changed pixels, their behavior is influenced. Written by David Bagley. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/atlantis.xml b/capplets/screensaver/screensavers/atlantis.xml index 861dc53e5..ff86377f0 100644 --- a/capplets/screensaver/screensavers/atlantis.xml +++ b/capplets/screensaver/screensavers/atlantis.xml @@ -1,7 +1,8 @@ - + - + <_description>This is xfishtank writ large: a GL animation of a number of sharks, dolphins, and whales. The swimming motions are great. Originally written by Mark Kilgard. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/attraction.xml b/capplets/screensaver/screensavers/attraction.xml index 9482f8574..4d74d980a 100644 --- a/capplets/screensaver/screensavers/attraction.xml +++ b/capplets/screensaver/screensavers/attraction.xml @@ -1,6 +1,6 @@ - + - + <_description>BSOD stands for ``Blue Screen of Death.'' The finest in personal computer emulation, this hack simulates popular screen savers from a number of less robust operating systems. Written by Jamie Zawinski. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/bubble3d.xml b/capplets/screensaver/screensavers/bubble3d.xml index 339391350..4177bf781 100644 --- a/capplets/screensaver/screensavers/bubble3d.xml +++ b/capplets/screensaver/screensavers/bubble3d.xml @@ -1,7 +1,8 @@ - + - + <_description>Draws a stream of rising, undulating 3D bubbles, rising toward the top of the screen, with nice specular reflections. Written by Richard Jones. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/bubbles.xml b/capplets/screensaver/screensavers/bubbles.xml index e116547fa..e7c412af1 100644 --- a/capplets/screensaver/screensavers/bubbles.xml +++ b/capplets/screensaver/screensavers/bubbles.xml @@ -1,6 +1,6 @@ - + @@ -20,4 +20,5 @@ - + <_description>This simulates the kind of bubble formation that happens when water boils:small bubbles appear, and as they get closer to each other, they combine to form larger bubbles, which eventually pop. Written by James Macnicol. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/bumps.xml b/capplets/screensaver/screensavers/bumps.xml new file mode 100644 index 000000000..1b0eaaf1b --- /dev/null +++ b/capplets/screensaver/screensavers/bumps.xml @@ -0,0 +1,8 @@ + + + + + + + <_description>A bit like `Spotlight', except that instead of merely exposing part of your desktop, it creates a bump map from it. Basically, it 3D-izes a roaming section of your desktop, based on color intensity. Written by Shane Smit. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/cage.xml b/capplets/screensaver/screensavers/cage.xml index 1d44a1aad..be9dc438f 100644 --- a/capplets/screensaver/screensavers/cage.xml +++ b/capplets/screensaver/screensavers/cage.xml @@ -1,7 +1,8 @@ - + - + <_description>This draws Escher's ``Impossible Cage,'' a 3d analog of a moebius strip, and rotates it in three dimensions. Written by Marcelo Vianna. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/ccurve.xml b/capplets/screensaver/screensavers/ccurve.xml new file mode 100644 index 000000000..a78a491e3 --- /dev/null +++ b/capplets/screensaver/screensavers/ccurve.xml @@ -0,0 +1,8 @@ + + + + + + + <_description>Generates self-similar linear fractals, including the classic ``C Curve.'' Written by Rick Campbell. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/compass.xml b/capplets/screensaver/screensavers/compass.xml index 5ebac28b6..82d80375a 100644 --- a/capplets/screensaver/screensavers/compass.xml +++ b/capplets/screensaver/screensavers/compass.xml @@ -1,6 +1,6 @@ - + - + <_description>This draws a compass, with all elements spinning about randomly, for that ``lost and nauseous'' feeling. Written by Jamie Zawinski. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/coral.xml b/capplets/screensaver/screensavers/coral.xml index 6691a89aa..6833458c0 100644 --- a/capplets/screensaver/screensavers/coral.xml +++ b/capplets/screensaver/screensavers/coral.xml @@ -1,6 +1,6 @@ - + @@ -16,4 +16,5 @@ type="slider" default="2" arg="-delay %" low="1" _high-label="Slower" high="500000"/> - + <_description>Simulates coral growth, albeit somewhat slowly. This image doesn't really do it justice. Written by Frederick Roeber. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/cosmos.xml b/capplets/screensaver/screensavers/cosmos.xml new file mode 100644 index 000000000..87327b1b0 --- /dev/null +++ b/capplets/screensaver/screensavers/cosmos.xml @@ -0,0 +1,10 @@ + + + + + + <_description>Draws fireworks and zooming, fading flares. By Tom Campbell. You can find it at <http://www.mindspring.com/~campbell/cosmos/>. + +! (xrdb prevention kludge: whole file) */ + + diff --git a/capplets/screensaver/screensavers/critical.xml b/capplets/screensaver/screensavers/critical.xml index 2954b00c7..1a16df98b 100644 --- a/capplets/screensaver/screensavers/critical.xml +++ b/capplets/screensaver/screensavers/critical.xml @@ -1,7 +1,8 @@ - + - + <_description>Draws a system of self-organizing lines. It starts out as random squiggles, but after a few iterations, order begins to appear. Written by Martin Pool. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/crystal.xml b/capplets/screensaver/screensavers/crystal.xml index c7d45a9fe..cd6b6bc5b 100644 --- a/capplets/screensaver/screensavers/crystal.xml +++ b/capplets/screensaver/screensavers/crystal.xml @@ -1,6 +1,6 @@ - + @@ -28,4 +28,5 @@ - + <_description>Moving polygons, similar to a kaleidescope (more like a kaleidescope than the hack called `kaleid,' actually.) This one by Jouk Jansen. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/cynosure.xml b/capplets/screensaver/screensavers/cynosure.xml index b4e8cdacd..bed67ee7a 100644 --- a/capplets/screensaver/screensavers/cynosure.xml +++ b/capplets/screensaver/screensavers/cynosure.xml @@ -1,6 +1,6 @@ - + @@ -19,4 +19,5 @@ - + <_description>A hack similar to `greynetic', but less frenetic. The first implementation was by Stephen Linhart; then Ozymandias G. Desiderata wrote a Java applet clone. That clone was discovered by Jamie Zawinski, and ported to C for inclusion here. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/dangerball.xml b/capplets/screensaver/screensavers/dangerball.xml new file mode 100644 index 000000000..ab4db8a8b --- /dev/null +++ b/capplets/screensaver/screensavers/dangerball.xml @@ -0,0 +1,8 @@ + + + + + + <_description>Draws a ball that periodically extrudes many random spikes. Ouch! Written by Jamie Zawinski. + + diff --git a/capplets/screensaver/screensavers/decayscreen.png b/capplets/screensaver/screensavers/decayscreen.png new file mode 100644 index 000000000..e40d6333b Binary files /dev/null and b/capplets/screensaver/screensavers/decayscreen.png differ diff --git a/capplets/screensaver/screensavers/decayscreen.xml b/capplets/screensaver/screensavers/decayscreen.xml index 60e167d35..488c2c281 100644 --- a/capplets/screensaver/screensavers/decayscreen.xml +++ b/capplets/screensaver/screensavers/decayscreen.xml @@ -1,6 +1,6 @@ - + @@ -11,4 +11,6 @@ + decayscreen.png + <_description>This takes an image and makes it melt. You've no doubt seen this effect before, but no screensaver would really be complete without it. It works best if there's something colorful visible. Warning, if the effect continues after the screen saver is off, seek medical attention. Written by David Wald and Vivek Khera. diff --git a/capplets/screensaver/screensavers/deco.xml b/capplets/screensaver/screensavers/deco.xml index b733bcf4c..7e3aa3b56 100644 --- a/capplets/screensaver/screensavers/deco.xml +++ b/capplets/screensaver/screensavers/deco.xml @@ -1,6 +1,6 @@ - + @@ -14,4 +14,5 @@ - + <_description>This one subdivides and colors rectangles randomly. It looks kind of like Brady-Bunch-era rec-room wall paneling. (Raven says: ``this screensaver is ugly enough to peel paint.'') Written by Jamie Zawinski, inspired by Java code by Michael Bayne. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/deluxe.xml b/capplets/screensaver/screensavers/deluxe.xml index 318e805ee..369ad683c 100644 --- a/capplets/screensaver/screensavers/deluxe.xml +++ b/capplets/screensaver/screensavers/deluxe.xml @@ -1,7 +1,8 @@ - + - + <_description>This draws a pulsing sequence of stars, circles, and lines. It would look better if it was faster, but as far as I can tell, there is no way to make this be both: fast, and flicker-free. Yet another reason X sucks. Written by Jamie Zawinski. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/demon.xml b/capplets/screensaver/screensavers/demon.xml index 06fc093b8..c13aeb635 100644 --- a/capplets/screensaver/screensavers/demon.xml +++ b/capplets/screensaver/screensavers/demon.xml @@ -1,7 +1,8 @@ - + - + <_description>A cellular automaton that starts with a random field, and organizes it into stripes and spirals. Written by David Bagley. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/discrete.xml b/capplets/screensaver/screensavers/discrete.xml index 10f438c5e..7ab1bf08d 100644 --- a/capplets/screensaver/screensavers/discrete.xml +++ b/capplets/screensaver/screensavers/discrete.xml @@ -1,6 +1,6 @@ - + @@ -19,4 +19,5 @@ - + <_description>More ``discrete map'' systems, including new variants of Hopalong and Julia, and a few others. Written by Tim Auckland. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/distort.png b/capplets/screensaver/screensavers/distort.png new file mode 100644 index 000000000..e8c73cbbb Binary files /dev/null and b/capplets/screensaver/screensavers/distort.png differ diff --git a/capplets/screensaver/screensavers/distort.xml b/capplets/screensaver/screensavers/distort.xml index 9bc23e2a7..32aea8069 100644 --- a/capplets/screensaver/screensavers/distort.xml +++ b/capplets/screensaver/screensavers/distort.xml @@ -1,7 +1,10 @@ - + + distort.png + + <_description>This hack grabs an image of the screen, and then lets a transparent lens wander around the screen, magnifying whatever is underneath. Written by Jonas Munsin. diff --git a/capplets/screensaver/screensavers/drift.xml b/capplets/screensaver/screensavers/drift.xml index a29be9308..74246bb2c 100644 --- a/capplets/screensaver/screensavers/drift.xml +++ b/capplets/screensaver/screensavers/drift.xml @@ -1,6 +1,6 @@ - + @@ -25,4 +25,5 @@ - + <_description>How could one possibly describe this except as ``drifting recursive fractal cosmic flames?'' Another fine hack from the Scott Draves collection of fine hacks. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/electricsheep.xml b/capplets/screensaver/screensavers/electricsheep.xml new file mode 100644 index 000000000..30277763e --- /dev/null +++ b/capplets/screensaver/screensavers/electricsheep.xml @@ -0,0 +1,10 @@ + + + + + <_description>ElectricSheep is an xscreensaver module that displays mpeg video of an animated fractal flame. In the background, it contributes render cycles to the next animation. Periodically it uploades completed frames to the server, where they are compressed for distribution to all clients. + +This program is recommended only if you have a high bandwidth connection to the Internet. + +By Scott Draves. You can find it at <http://www.electricsheep.org/>. See that web site for configuration information. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/epicycle.xml b/capplets/screensaver/screensavers/epicycle.xml index 91de5bad7..90248cc62 100644 --- a/capplets/screensaver/screensavers/epicycle.xml +++ b/capplets/screensaver/screensavers/epicycle.xml @@ -1,6 +1,6 @@ - + @@ -15,4 +15,5 @@ - + <_description>This program draws the path traced out by a point on the edge of a circle. That circle rotates around a point on the rim of another circle, and so on, several times. These were the basis for the pre-heliocentric model of planetary motion. Written by James Youngman. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/extrusion.xml b/capplets/screensaver/screensavers/extrusion.xml new file mode 100644 index 000000000..b5aaf9b79 --- /dev/null +++ b/capplets/screensaver/screensavers/extrusion.xml @@ -0,0 +1,6 @@ + + + + + <_description>Draws various rotating extruded shapes that twist around, lengthen, and turn inside out. Created by David Konerding from the samples that come with the GL Extrusion library by Linas Vepstas. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/fadeplot.xml b/capplets/screensaver/screensavers/fadeplot.xml index 8ede30e39..e9d2c4b41 100644 --- a/capplets/screensaver/screensavers/fadeplot.xml +++ b/capplets/screensaver/screensavers/fadeplot.xml @@ -1,6 +1,6 @@ - + @@ -23,4 +23,5 @@ - + <_description>Draws what looks like a waving ribbon following a sinusoidal path. Written by Bas van Gaalen and Charles Vidal. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/flag.xml b/capplets/screensaver/screensavers/flag.xml index 045814b17..1ed46ac02 100644 --- a/capplets/screensaver/screensavers/flag.xml +++ b/capplets/screensaver/screensavers/flag.xml @@ -1,6 +1,6 @@ - + @@ -47,4 +47,5 @@ - + <_description>This draws a waving colored flag, that undulates its way around the screen. The trick is the flag can contain arbitrary text and images. By default, it displays either the current system name and OS type, or a picture of ``Bob,'' but you can replace the text or the image with a command-line option. Written by Charles Vidal and Jamie Zawinski. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/flame.xml b/capplets/screensaver/screensavers/flame.xml index 804235acb..014b41e3b 100644 --- a/capplets/screensaver/screensavers/flame.xml +++ b/capplets/screensaver/screensavers/flame.xml @@ -1,6 +1,6 @@ - + @@ -24,4 +24,5 @@ - + <_description>Another iterative fractal generator. Written by Scott Draves. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/flow.xml b/capplets/screensaver/screensavers/flow.xml index fc795665d..e8bad75a3 100644 --- a/capplets/screensaver/screensavers/flow.xml +++ b/capplets/screensaver/screensavers/flow.xml @@ -1,7 +1,8 @@ - + - + <_description>Another series of strange attractors: a flowing series of points, making strange rotational shapes. Written by Jeff Butterworth. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/forest.xml b/capplets/screensaver/screensavers/forest.xml index 6c3518b36..47c3f338e 100644 --- a/capplets/screensaver/screensavers/forest.xml +++ b/capplets/screensaver/screensavers/forest.xml @@ -1,6 +1,6 @@ - + @@ -8,15 +8,17 @@ type="spinbutton" default="100" arg="-ncolors %" low="1" high="256"/> - + - + <_description>This draws fractal trees. Written by Peter Baumung. Everybody loves fractals, right? + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/galaxy.xml b/capplets/screensaver/screensavers/galaxy.xml index a033d86cf..fae3dff59 100644 --- a/capplets/screensaver/screensavers/galaxy.xml +++ b/capplets/screensaver/screensavers/galaxy.xml @@ -1,7 +1,8 @@ - + - + <_description>This draws spinning galaxies, which then collide and scatter their stars to the, uh, four winds or something. Originally an Amiga program by Uli Siegmund. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/gears.xml b/capplets/screensaver/screensavers/gears.xml index 5de7b1a06..ed869380c 100644 --- a/capplets/screensaver/screensavers/gears.xml +++ b/capplets/screensaver/screensavers/gears.xml @@ -1,7 +1,9 @@ - + - + <_description>This draws sets of turning, interlocking gears, rotating in three dimensions. Another GL hack, by Danny Sung, Brian Paul, Ed Mackey, and Jamie Zawinski. + + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/gflux.xml b/capplets/screensaver/screensavers/gflux.xml new file mode 100644 index 000000000..3ffd4ee95 --- /dev/null +++ b/capplets/screensaver/screensavers/gflux.xml @@ -0,0 +1,8 @@ + + + + + + <_description>Draws a rippling waves on a rotating wireframe grid, using GL. Written by Josiah Pease. + + diff --git a/capplets/screensaver/screensavers/glplanet.xml b/capplets/screensaver/screensavers/glplanet.xml index 0fbb5bf34..8a6fc0585 100644 --- a/capplets/screensaver/screensavers/glplanet.xml +++ b/capplets/screensaver/screensavers/glplanet.xml @@ -1,7 +1,8 @@ - + - + <_description>Draws a planet bouncing around in space. Written by David Konerding. The built-in image is a map of the earth (extracted from `xearth'), but you can wrap any texture around the sphere, e.g., the planetary textures that come with `ssystem'. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/gltext.xml b/capplets/screensaver/screensavers/gltext.xml new file mode 100644 index 000000000..8a1f880e3 --- /dev/null +++ b/capplets/screensaver/screensavers/gltext.xml @@ -0,0 +1,9 @@ + + + + + + <_description>Displays a few lines of text spinning around in a solid 3D font. Written by Jamie Zawinski. + + + diff --git a/capplets/screensaver/screensavers/goban.xml b/capplets/screensaver/screensavers/goban.xml new file mode 100644 index 000000000..bd887a8a9 --- /dev/null +++ b/capplets/screensaver/screensavers/goban.xml @@ -0,0 +1,6 @@ + + + + + <_description>Replays historical games of go (aka wei-chi and baduk) on the screen. By Scott Draves. You can find it at <http://www.draves.org/goban/>. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/goop.xml b/capplets/screensaver/screensavers/goop.xml index afa325144..016b33b95 100644 --- a/capplets/screensaver/screensavers/goop.xml +++ b/capplets/screensaver/screensavers/goop.xml @@ -1,6 +1,6 @@ - + @@ -23,4 +23,5 @@ arg-unset="-subtractive" id="additive" arg-set="-additive"/> - + <_description>This draws set of animating, transparent, amoeba-like blobs. The blobs change shape as they wander around the screen, and they are translucent, so you can see the lower blobs through the higher ones, and when one passes over another, their colors merge. Written by Jamie Zawinski. I got the idea for this from a cool mouse pad I have, which achieves the same kind of effect in real life by having several layers plastic with colored oil between them. Written by Jamie Zawinski. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/grav.xml b/capplets/screensaver/screensavers/grav.xml index 5eb017db7..6db20558b 100644 --- a/capplets/screensaver/screensavers/grav.xml +++ b/capplets/screensaver/screensavers/grav.xml @@ -1,6 +1,6 @@ - + @@ -21,4 +21,6 @@ - + <_description>This program draws a simple orbital simulation. If you turn on trails, it looks kind of like a cloud-chamber photograph. Written by Greg Bowering. + + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/greynetic.xml b/capplets/screensaver/screensavers/greynetic.xml index ceb3a75f3..a3af0cc3d 100644 --- a/capplets/screensaver/screensavers/greynetic.xml +++ b/capplets/screensaver/screensavers/greynetic.xml @@ -1,6 +1,6 @@ - + @@ -11,4 +11,5 @@ - + <_description>This draws random colored and stippled rectangles. Written by Jamie Zawinski. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/halo.xml b/capplets/screensaver/screensavers/halo.xml index 96d4d66d0..a5c1598a4 100644 --- a/capplets/screensaver/screensavers/halo.xml +++ b/capplets/screensaver/screensavers/halo.xml @@ -1,11 +1,11 @@ - + - + <_description>This draws trippy psychedelic circular patterns that hurt to look at. It can also animate the control-points, but that takes a lot of CPU and bandwidth. Written by Jamie Zawinski. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/helix.xml b/capplets/screensaver/screensavers/helix.xml index 054aaf8db..0a8bca6cf 100644 --- a/capplets/screensaver/screensavers/helix.xml +++ b/capplets/screensaver/screensavers/helix.xml @@ -1,6 +1,6 @@ - + @@ -11,4 +11,5 @@ - + <_description>This repeatedly generates spirally string-art-ish patterns. Written by Jamie Zawinski. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/hopalong.xml b/capplets/screensaver/screensavers/hopalong.xml index 05ba70cff..818af7344 100644 --- a/capplets/screensaver/screensavers/hopalong.xml +++ b/capplets/screensaver/screensavers/hopalong.xml @@ -1,6 +1,6 @@ - + @@ -19,4 +19,5 @@ - + <_description>This draws lacy fractal patterns, based on iteration in the imaginary plane, from a 1986 Scientific American article. Mostly written by Patrick Naughton. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/hyperball.xml b/capplets/screensaver/screensavers/hyperball.xml new file mode 100644 index 000000000..20100c9a7 --- /dev/null +++ b/capplets/screensaver/screensavers/hyperball.xml @@ -0,0 +1,8 @@ + + + + + + <_description>Hyperball is to hypercube as dodecahedron is to cube: this displays a 2D projection of the sequence of 3D objects which are the projections of the 4D analog to the dodecahedron. Written by Joe Keane. + + diff --git a/capplets/screensaver/screensavers/hypercube.xml b/capplets/screensaver/screensavers/hypercube.xml index 27317e91f..d2328fc39 100644 --- a/capplets/screensaver/screensavers/hypercube.xml +++ b/capplets/screensaver/screensavers/hypercube.xml @@ -1,6 +1,6 @@ - + @@ -15,4 +15,5 @@ - + <_description>This displays 2D projections of the sequence of 3D objects which are the projections of the 4D analog to the cube: as a square is composed of four lines, each touching two others; and a cube is composed of six squares, each touching four others; a hypercube is composed of eight cubes, each touching six others. To make it easier to visualize the rotation, it uses a different color for the edges of each face. Don't think about it too long, or your brain will melt. Written by Joe Keane, Fritz Mueller, and Jamie Zawinski. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/ifs.xml b/capplets/screensaver/screensavers/ifs.xml index 63ff07177..14e787c8c 100644 --- a/capplets/screensaver/screensavers/ifs.xml +++ b/capplets/screensaver/screensavers/ifs.xml @@ -1,6 +1,6 @@ - + @@ -11,4 +11,5 @@ - + <_description>This one draws spinning, colliding iterated-function-system images. Written by Massimino Pascal. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/imsmap.xml b/capplets/screensaver/screensavers/imsmap.xml index 437a7262b..d25606188 100644 --- a/capplets/screensaver/screensavers/imsmap.xml +++ b/capplets/screensaver/screensavers/imsmap.xml @@ -1,7 +1,10 @@ - + - + <_description>This generates random cloud-like patterns. It looks quite different in monochrome and color. The basic idea is to take four points on the edge of the image, and assign each a random ``elevation''. Then find the point between them, and give it a value which is the average of the other four, plus some small random offset. Then coloration is done based on elevation. + +The color selection is done by binding the elevation to either hue, saturation, or brightness, and assigning random values to the others. The ``brightness'' mode tends to yield cloudlike patterns, and the others tend to generate images that look like heat-maps or CAT-scans. Written by Juergen Nickelsen and Jamie Zawinski. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/interference.xml b/capplets/screensaver/screensavers/interference.xml index 29cdb1159..09ca0f252 100644 --- a/capplets/screensaver/screensavers/interference.xml +++ b/capplets/screensaver/screensavers/interference.xml @@ -1,7 +1,8 @@ - + - + <_description>Another color-field hack, this one works by computing decaying sinusoidal waves, and allowing them to interfere with each other as their origins move. Written by Hannu Mallat. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/jigsaw.png b/capplets/screensaver/screensavers/jigsaw.png new file mode 100644 index 000000000..9a324d9f9 Binary files /dev/null and b/capplets/screensaver/screensavers/jigsaw.png differ diff --git a/capplets/screensaver/screensavers/jigsaw.xml b/capplets/screensaver/screensavers/jigsaw.xml index 4a7f5ede4..6b786af1b 100644 --- a/capplets/screensaver/screensavers/jigsaw.xml +++ b/capplets/screensaver/screensavers/jigsaw.xml @@ -1,6 +1,6 @@ - + @@ -8,4 +8,7 @@ type="slider" default="2" arg="-delay %" low="1" high-label="Slower" high="500000"/> + jigsaw.png + + <_description>This grabs a screen image, carves it up into a jigsaw puzzle, shuffles it, and then solves the puzzle. This works especially well when you feed it an external video signal instead of letting it grab the screen image (actually, I guess this is generally true...) When it is grabbing a video image, it is sometimes pretty hard to guess what the image is going to look like once the puzzle is solved. Written by Jamie Zawinski. diff --git a/capplets/screensaver/screensavers/julia.xml b/capplets/screensaver/screensavers/julia.xml index 103d2edd5..7319ce736 100644 --- a/capplets/screensaver/screensavers/julia.xml +++ b/capplets/screensaver/screensavers/julia.xml @@ -1,6 +1,6 @@ - + @@ -19,4 +19,5 @@ - + <_description>This one draws spinning, animating (are you detecting a pattern here yet?) explorations of the Julia set. You've probably seen static images of this fractal form before, but it's a lot of fun to watch in motion as well. One interesting thing is that there is a small swinging dot passing in front of the image, which indicates the control point from which the rest of the image was generated. Written by Sean McCullough. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/kaleidescope.xml b/capplets/screensaver/screensavers/kaleidescope.xml index 578852ad0..4c3901133 100644 --- a/capplets/screensaver/screensavers/kaleidescope.xml +++ b/capplets/screensaver/screensavers/kaleidescope.xml @@ -1,6 +1,6 @@ - + @@ -20,4 +20,5 @@ arg-unset="-color_mode nice" id="monochrome" arg-set="-color_mode mono"/> - + <_description>Another clone of an ancient meme, consisting largely of frenetic rotational motion of colored lines. This one is by Ron Tapia. The motion is nice, but I think it needs more solids, or perhaps just brighter colors. More variations in the rotational speed might help, too. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/kumppa.xml b/capplets/screensaver/screensavers/kumppa.xml index dedde07da..0379c1c10 100644 --- a/capplets/screensaver/screensavers/kumppa.xml +++ b/capplets/screensaver/screensavers/kumppa.xml @@ -1,7 +1,8 @@ - + - + <_description>Spiraling, spinning, and very, very fast splashes of color rush toward the screen. Written by Teemu Suutari. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/lament.xml b/capplets/screensaver/screensavers/lament.xml index adb326bd4..acf0430ba 100644 --- a/capplets/screensaver/screensavers/lament.xml +++ b/capplets/screensaver/screensavers/lament.xml @@ -1,7 +1,8 @@ - + - + <_description>Animates a simulation of Lemarchand's Box, repeatedly solving itself. Requires OpenGL, and a machine with fast hardware support for texture maps. Warning: occasionally opens doors. Written by Jamie Zawinski. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/laser.xml b/capplets/screensaver/screensavers/laser.xml index 6cf27b1f5..50018f4b0 100644 --- a/capplets/screensaver/screensavers/laser.xml +++ b/capplets/screensaver/screensavers/laser.xml @@ -1,6 +1,6 @@ - + @@ -15,4 +15,5 @@ - + <_description>Moving radiating lines, that look vaguely like scanning laser beams. Written by Pascal Pensa. (Frankie say: relax.) + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/lightning.xml b/capplets/screensaver/screensavers/lightning.xml index 774c2bad8..0a4d40824 100644 --- a/capplets/screensaver/screensavers/lightning.xml +++ b/capplets/screensaver/screensavers/lightning.xml @@ -1,6 +1,6 @@ - + @@ -11,4 +11,5 @@ - + <_description>This one draws crackling fractal lightning bolts. It's simple, direct, and to the point. If only it had sound... Written by Keith Romberg. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/lisa.xml b/capplets/screensaver/screensavers/lisa.xml index 7ad503623..5444606e7 100644 --- a/capplets/screensaver/screensavers/lisa.xml +++ b/capplets/screensaver/screensavers/lisa.xml @@ -1,6 +1,6 @@ - + @@ -23,4 +23,5 @@ - + <_description>This draws Lisajous loops, by Caleb Cullen. Remember that device they had the Phantom Zone prisoners in during their trial in Superman? I think that was one of these. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/lissie.xml b/capplets/screensaver/screensavers/lissie.xml index 3efbdfac9..972faae46 100644 --- a/capplets/screensaver/screensavers/lissie.xml +++ b/capplets/screensaver/screensavers/lissie.xml @@ -1,7 +1,8 @@ - + - + <_description>Another Lissajous figure. This one draws the progress of circular shapes along a path. Written by Alexander Jolk. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/lmorph.xml b/capplets/screensaver/screensavers/lmorph.xml index 69cf68c0c..0d38e537d 100644 --- a/capplets/screensaver/screensavers/lmorph.xml +++ b/capplets/screensaver/screensavers/lmorph.xml @@ -1,6 +1,6 @@ - + @@ -22,4 +22,5 @@ - + <_description>This generates random spline-ish line drawings and morphs between them. Written by Sverre H. Huseby and Glenn T. Lines. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/loop.xml b/capplets/screensaver/screensavers/loop.xml index f17e55fbf..dee6a6b3a 100644 --- a/capplets/screensaver/screensavers/loop.xml +++ b/capplets/screensaver/screensavers/loop.xml @@ -1,7 +1,8 @@ - + - + <_description>This one produces loop-shaped colonies that spawn, age, and eventually die. Written by David Bagley. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/magic.pl.in b/capplets/screensaver/screensavers/magic.pl.in new file mode 100755 index 000000000..ffcf94f9d --- /dev/null +++ b/capplets/screensaver/screensavers/magic.pl.in @@ -0,0 +1,510 @@ +#!@PERL@ -w +# +# magic.pl +# +# Script to convert Xscreensaver cruft into xml files. +# Copyright (C) 2001 Ximian, Inc. +# Authors: +# Richard Hestilow +# This program is licensed under the GNU GPL. See COPYING for details. + +use Getopt::Long; + +my $rcfile; # .xscreensaver usually +my $adfile; # app defaults file +my $outdir; +my @merge; +my @avoid; +my $suffix = ".xml"; +my $quiet; + +my $help; + +sub usage +{ + print << "EOF" +XScreensaver->XML conversion utility +Copyright (C) 2001 Ximian, Inc. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +Usage: $0 [options] + +Options: + --rcfile XScreensaver RC file + --adfile XScreensaver AppDefaults file + --outdir Directory to output to (defaults to current dir) + --merge Merge with preexisting XML files. If used in + conjunction with --outdir, will make copies in + the specified output directory rather than modifying + the existing files. + --avoid The opposite of --merge: Will not output XML files + that already exist in the specified directories. + Note that merging and avoiding the same directory + is meaningless. + --suffix Suffix for output files. Defaults to "$suffix". + --quiet Be quiet. + --help Display this error message. +EOF +; +exit 1; +} + +sub badopt +{ + my $opt = $_[0]; + + print "Unknown option $opt\n\n"; + usage (); +} + +sub find_file +{ + my ($file, @dirs) = @_; + + foreach $dir (@dirs) + { + if (-f "$dir/$file") + { + return "$dir/$file"; + } + } + + return ""; +} + +GetOptions ("rcfile=s", \$rcfile, + "adfile=s", \$adfile, + "outdir=s", \$outdir, + "merge=s", \@merge, + "avoid=s", \@avoid, + "suffix=s", \$suffix, + "quiet+", \$quiet, + "help+", \$help, + "<>", \&badopt); + +if ($help) +{ + usage (); +} + +my %savers = (); +my @updated_list; +my @added_list; + +# Sigh +foreach $thefile ($rcfile, $adfile) +{ +unless ($thefile) { next; } + +if ($thefile) +{ + unless (open RCFILE, "<$thefile") + { + die "Cannot open rcfile $thefile\n"; + } + + my $fcontents = ""; + my $progseen = 0; + while () + { + if (/\*programs:/) + { + $progseen = 1; + } + elsif ($progseen) + { + $fcontents .= $_; + } + if (/\\n\n/) + { + $fcontents =~ s/\\n$//g; + last; + } + } + + foreach $_ (split /\\n\\\n/, $fcontents) + { + $_ =~ s/\\/ /g; + my $name; + my $label; + my $command; + if ($_ =~ /\".+\".+\".+\"/) + { + # multiple quotes + if ($_ =~ /\"(.+)\"\s+((\w+) .+\".+\".+)[\t ]*/) + { + $label = $1; + $name = $3; + $command = $2; + } + } + elsif ($_ =~ /\"(.+)\"\s*([\w\-]+) ((.+\w)?)[\t ]+/) + { + $label = $1; + $name = $2; + $command = $3; + } + elsif ($_ =~ /\-?(\w[\w\-]+) ((.+\w)?)[\t ]+/) + { + if ($1 eq "-") { print "$1 $2\n";} + my %saver = ("name" => $1, + "command" => $2); + $savers{$1} = \%saver; + next; + } + + if ($name eq "rd-bomb") { print "$label $name $command\n";} + if ($name eq "cosmos") { print "$label $name $command\n";} + if ($name) + { + if ($savers{$name} and $label) + { + if ($name eq "xmountains") { print "erk\n"}; + my %saver = %{$savers{$name}}; + my @fakes; + if ($saver{"fakes"}) + { + @fakes = @{$saver{"fakes"}}; + } + push @fakes, $label; + $saver{"fakes"} = \@fakes; + $savers{$name} = \%saver; + } + else + { + my %saver = ("label" => $label, + "name" => $name, + "command" => $command); + $savers{$name} = \%saver; + } + } + } + + close RCFILE; +} +} + +if ($adfile) +{ + my $fcontents = ""; + + unless (open ADFILE, "<$adfile") + { + die "Cannot open app-defaults file $adfile\n"; + } + + while () + { + $fcontents .= $_; + } + + foreach $_ (split /\n\*/, $fcontents) + { + unless (/hacks\.(.+)\.(.+)\:(.+)/) + { + next; + } + unless ($2 eq "documentation" or $2 eq "name") + { + next; + } + $_ =~ s/hacks\.(.+)\.(.+)\://g; + my $name = $1; + my $type = $2; + $_ =~ s/[\t ]*\\[\t ]*\n/ /g; + $_ =~ s/\n[\t ]/\n/g; + $_ =~ s/\.[\t ]+/\. /g; + $_ =~ s/[\t ]+\n/\n/g; + $_ =~ s/^\n//g; + $_ =~ s/\\n/\n/g; + $_ =~ s/^[\t ]+//g; + $_ =~ s/\n[\t ]/\n/g; + $_ =~ s/\/>/g; + $_ =~ s/[\t ]*\n$//g; + $_ =~ s/\n\n\! \(xrdb prevention kludge\: whole file\) \*\///g; + my $desc; + my $label; + if ($type eq "documentation") + { + $desc = $_; + } + else + { + $label = $_; + } + + my %saver = (); + if ($savers{$name}) + { + %saver = %{$savers{$name}}; + } + $saver{"name"} = $name; + if ($desc) + { + $saver{"desc"} = $desc; + } + if ($label) + { + if ($saver{$label}) + { + my @fakes; + if ($saver{"fakes"}) + { + @fakes = @{$saver{"fakes"}}; + } + push @fakes, $label; + $saver{"fakes"} = \@fakes; + } + else + { + $saver{"label"} = $label; + } + } + + $savers{$name} = \%saver; + } + close ADFILE; +} + +my $key; +foreach $key (keys %savers) +{ + my %saver = %{$savers{$key}}; + my $name = $saver{"name"}; + my $label = $saver{"label"}; + if ($key eq "xmountains") + { + print "$name\n"; + } + my $command = $saver{"command"}; + my $desc = $saver{"desc"}; + my @fakes; + my $filename = "$name$suffix"; + my $fullname; + my $mergefile; + my $mergeexists = 0; + my $samefile = 0; + my $buf = ""; + my $str; + + if ($saver{"fakes"}) { + @fakes = @{$saver{"fakes"}}; + } + + if (!$label) + { + # luckily, we can pretty much assume $name is ascii. + $label = $name; + my @tmparr = split //, $label; + if (scalar (@tmparr)) + { + $tmparr[0] =~ tr/[a-z]/[A-Z]/; + $label = join "", @tmparr; + } + } + + if (@avoid) + { + my $avoidfile = find_file ($filename, @avoid); + if ($avoidfile and -f $avoidfile) + { + next; + } + } + + if (@merge) + { + $mergefile = find_file ($filename, @merge); + # FIXME: What about multiple-merge case? + if (!$mergefile and scalar (@merge) == 1) + { + $mergefile = $merge[0] . "/$filename"; + } + if ($mergefile and !$outdir) + { + $fullname = $mergefile; + if (-f $mergefile) + { + $samefile = 1; + } + } + } + + if (!defined $fullname) + { + if ($outdir) + { + unless (-d $outdir) + { + unless (mkdir $outdir) + { + die "Cannot create directory $outdir"; + } + } + + $fullname = "$outdir/$filename"; + } + else + { + $fullname = "$filename"; + } + } + + if (@merge and -f $mergefile) + { + $mergeexists = 1; + } + + if (!$samefile) + { + unless (open OUTFILE, ">$fullname") + { + die "Cannot open output file $fullname\n"; + } + } + + # note that we do not print out commands for merging. + # this is because we assume the file has argument metadata + if ($mergefile and $mergeexists) + { + unless (open XMLFILE, "<$mergefile") + { + die "Cannot open file $mergefile for merging\n"; + } + my $opendesc = 0; + my $foo; + foreach $foo () + { + if ($foo =~ /\/) + { + $str = ".*\<\/_description\>/) + { + $opendesc = 0; + } + elsif ($desc and $foo =~ /\<_description\>/) + { + $opendesc = 1; + } + elsif ($desc and $foo =~ /\<\/_description\>/) + { + $opendesc = 0; + } + elsif ($desc and $opendesc) + { + # part of an old description, do nothing + } + elsif ($foo =~ /\<\/screensaver\>/) + { + $str = ""; + if ($desc and !$opendesc) + { + $str .= " <_description>$desc\n"; + } + + foreach $fake (@fakes) + { + $str .= " \n"; + } + + $str .= ""; + + if ($samefile) + { + $buf .= $str; + } + else + { + print OUTFILE $str; + } + last; + } + else + { + if ($samefile) + { + $buf .= $foo; + } + else + { + print OUTFILE $foo; + } + } + } + + close OUTFILE; + unless (open OUTFILE, ">$mergefile") + { + die "Cannot open output file $mergefile"; + } + + print OUTFILE $buf; + close OUTFILE; + + push @updated_list, $fullname; + } + else + { + print OUTFILE "\n"; + print OUTFILE "\n\n"; + if ($command) + { + print OUTFILE " \n\n"; + } + if ($desc) + { + print OUTFILE " <_description>$desc\n\n"; + } + foreach $fake (@fakes) + { + print OUTFILE " \n"; + } + print OUTFILE "\n"; + close OUTFILE; + + push @added_list, $fullname; + } +} + +if ($quiet) +{ + exit 0; +} + +my $file; + +if (scalar (@added_list)) +{ + print "The following files have been added:\n"; + foreach $file (@added_list) + { + print "$file\n"; + } + print "\n"; +} diff --git a/capplets/screensaver/screensavers/maze.xml b/capplets/screensaver/screensavers/maze.xml index a8468d58d..1ce360dd2 100644 --- a/capplets/screensaver/screensavers/maze.xml +++ b/capplets/screensaver/screensavers/maze.xml @@ -1,6 +1,6 @@ - + @@ -24,4 +24,5 @@ - + <_description>This is the ancient X maze demo, modified to work with xscreensaver. It generates a random maze, then solves it with visual feedback. Originally by Jim Randell; modified by a cast of thousands. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/moebius.xml b/capplets/screensaver/screensavers/moebius.xml index 8cd6eba8d..dffbe67ff 100644 --- a/capplets/screensaver/screensavers/moebius.xml +++ b/capplets/screensaver/screensavers/moebius.xml @@ -1,7 +1,8 @@ - + - + <_description>Another M. C. Escher hack by Marcelo Vianna, this one draws ``Moebius Strip II,'' a GL image of ants walking along the surface of a moebius strip. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/moire.xml b/capplets/screensaver/screensavers/moire.xml index aa1f19c9b..86c57b22e 100644 --- a/capplets/screensaver/screensavers/moire.xml +++ b/capplets/screensaver/screensavers/moire.xml @@ -1,6 +1,6 @@ - + @@ -19,4 +19,5 @@ - + <_description>This one draws cool circular interference patterns. Most of the circles you see aren't explicitly rendered, but show up as a result of interactions between the other pixels that were drawn. Written by Jamie Zawinski, inspired by Java code by Michael Bayne. As he pointed out, the beauty of this one is that the heart of the display algorithm can be expressed with just a pair of loops and a handful of arithmetic, giving it a high ``display hack metric''. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/moire2.xml b/capplets/screensaver/screensavers/moire2.xml index 205589c9d..bac75258a 100644 --- a/capplets/screensaver/screensavers/moire2.xml +++ b/capplets/screensaver/screensavers/moire2.xml @@ -1,7 +1,8 @@ - + - + <_description>Another example of the fun you can have with moire interference patterns; this hack generates fields of concentric circles or ovals, and combines the planes with various operations. The planes are moving independently of one another, causing the interference lines to ``spray.'' Written by Jamie Zawinski. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/molecule.xml b/capplets/screensaver/screensavers/molecule.xml new file mode 100644 index 000000000..f26b1afd9 --- /dev/null +++ b/capplets/screensaver/screensavers/molecule.xml @@ -0,0 +1,9 @@ + + + + + + <_description>Draws several different representations of molecules. Some common molecules are built in, and it can also read PDB (Protein Data Base) files as input. Written by Jamie Zawinski. + + + diff --git a/capplets/screensaver/screensavers/morph3d.xml b/capplets/screensaver/screensavers/morph3d.xml index 5c0f7983a..b3c68ebf1 100644 --- a/capplets/screensaver/screensavers/morph3d.xml +++ b/capplets/screensaver/screensavers/morph3d.xml @@ -1,7 +1,8 @@ - + - + <_description>Another 3d shape-changing GL hack, by Marcelo Vianna. It has the same shiny-plastic feel as Superquadrics, as many computer-generated objects do... + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/mountain.xml b/capplets/screensaver/screensavers/mountain.xml index a6e5f1369..4ea1df8d7 100644 --- a/capplets/screensaver/screensavers/mountain.xml +++ b/capplets/screensaver/screensavers/mountain.xml @@ -1,7 +1,8 @@ - + - + <_description>Generates random 3d plots that look vaguely mountainous. Written by Pascal Pensa. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/munch.xml b/capplets/screensaver/screensavers/munch.xml index 445f54ade..698dbf8b0 100644 --- a/capplets/screensaver/screensavers/munch.xml +++ b/capplets/screensaver/screensavers/munch.xml @@ -1,6 +1,6 @@ - + @@ -17,4 +17,12 @@ - + <_description> + DATAI 2 + ADDB 1,2 + ROTC 2,-22 + XOR 1,2 + JRST .-4 + +As reported by HAKMEM, in 1962, Jackson Wright wrote the above PDP-1 code. That code still lives on in this screenhack, some 35 years later. The number of lines of enclosing code has increased substantially, however. This version is by Tim Showalter. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/nerverot.xml b/capplets/screensaver/screensavers/nerverot.xml new file mode 100644 index 000000000..a3901646d --- /dev/null +++ b/capplets/screensaver/screensavers/nerverot.xml @@ -0,0 +1,9 @@ + + + + + + <_description>Draws different shapes composed of nervously vibrating squiggles, as if seen through a camera operated by a monkey on crack. By Dan Bornstein. + + + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/noseguy.xml b/capplets/screensaver/screensavers/noseguy.xml index 6d93c5d14..7d7d73034 100644 --- a/capplets/screensaver/screensavers/noseguy.xml +++ b/capplets/screensaver/screensavers/noseguy.xml @@ -1,7 +1,8 @@ - + - + <_description>A little man with a big nose wanders around your screen saying things. The things which he says can come from a file, or from an external program like `zippy' or `fortune'. This was extracted from `xnlock' by Dan Heller. Colorized by Jamie Zawinski. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/pedal.xml b/capplets/screensaver/screensavers/pedal.xml index f072180c4..c0cfe13c2 100644 --- a/capplets/screensaver/screensavers/pedal.xml +++ b/capplets/screensaver/screensavers/pedal.xml @@ -1,6 +1,6 @@ - + @@ -20,4 +20,5 @@ - + <_description>This is sort of a combination spirograph/string-art. It generates a large, complex polygon, and lets the X server do the bulk of the work by giving it an even/odd winding rule. Written by Dale Moore, based on some ancient PDP-11 code. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/penetrate.xml b/capplets/screensaver/screensavers/penetrate.xml index c35161cba..9bb6c38cc 100644 --- a/capplets/screensaver/screensavers/penetrate.xml +++ b/capplets/screensaver/screensavers/penetrate.xml @@ -1,7 +1,8 @@ - + - + <_description>This hack simulates the classic arcade game Missile Command. Written by Adam Miller. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/penrose.xml b/capplets/screensaver/screensavers/penrose.xml index d38a51253..4c0dee2e7 100644 --- a/capplets/screensaver/screensavers/penrose.xml +++ b/capplets/screensaver/screensavers/penrose.xml @@ -1,7 +1,12 @@ - + - + <_description>Draws quasiperiodic tilings; think of the implications on modern formica technology. Written by Timo Korvola. + +In April 1997, Sir Roger Penrose, a British math professor who has worked with Stephen Hawking on such topics as relativity, black holes, and whether time has a beginning, filed a copyright-infringement lawsuit against the Kimberly-Clark Corporation, which Penrose said copied a pattern he created (a pattern demonstrating that ``a nonrepeating pattern could exist in nature'') for its Kleenex quilted toilet paper. Penrose said he doesn't like litigation but, ``When it comes to the population of Great Britain being invited by a multinational to wipe their bottoms on what appears to be the work of a Knight of the Realm, then a last stand must be taken.'' + +As reported by News of the Weird #491, 4-jul-1997. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/petri.xml b/capplets/screensaver/screensavers/petri.xml new file mode 100644 index 000000000..c15a1eca2 --- /dev/null +++ b/capplets/screensaver/screensavers/petri.xml @@ -0,0 +1,9 @@ + + + + + + + <_description>This simulates colonies of mold growing in a petri dish. Growing colored circles overlap and leave spiral interference in their wake. Written by Dan Bornstein. + + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/phosphor.xml b/capplets/screensaver/screensavers/phosphor.xml new file mode 100644 index 000000000..cc309e717 --- /dev/null +++ b/capplets/screensaver/screensavers/phosphor.xml @@ -0,0 +1,8 @@ + + + + + + + <_description>Draws a simulation of an old terminal, with large pixels and long-sustain phosphor. It can run any program as a source of the text it displays. Written by Jamie Zawinski. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/pipes.xml b/capplets/screensaver/screensavers/pipes.xml index 5c3e41a8b..c4ba16917 100644 --- a/capplets/screensaver/screensavers/pipes.xml +++ b/capplets/screensaver/screensavers/pipes.xml @@ -1,7 +1,8 @@ - + - + <_description>If you've ever been in the same room with a Windows NT machine, you've probably seen this GL hack. This version is by Marcelo Vianna. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/pulsar.xml b/capplets/screensaver/screensavers/pulsar.xml new file mode 100644 index 000000000..9184651aa --- /dev/null +++ b/capplets/screensaver/screensavers/pulsar.xml @@ -0,0 +1,9 @@ + + + + + + + <_description>Draws some intersecting planes, making use of alpha blending, fog, textures, and mipmaps, plus a ``frames per second'' meter so that you can tell how fast your graphics card is... Requires OpenGL. Written by David Konerding. + + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/pyro.xml b/capplets/screensaver/screensavers/pyro.xml index 91afe4de0..0b8490464 100644 --- a/capplets/screensaver/screensavers/pyro.xml +++ b/capplets/screensaver/screensavers/pyro.xml @@ -1,6 +1,6 @@ - + @@ -16,4 +16,5 @@ type="slider" default="20" arg="-scatter %" low="10" _high-label="More" high="100"/> - + <_description>Pyro draws exploding fireworks. Blah blah blah. Written by Jamie Zawinski. + \ No newline at end of file diff --git a/capplets/screensaver/screensavers/qix.xml b/capplets/screensaver/screensavers/qix.xml index 1856c7c37..b4b4c21a3 100644 --- a/capplets/screensaver/screensavers/qix.xml +++ b/capplets/screensaver/screensavers/qix.xml @@ -1,6 +1,6 @@ - +