Index: xfce4-tips/main.c =================================================================== --- xfce4-tips/main.c (Revision 26613) +++ xfce4-tips/main.c (Arbeitskopie) @@ -38,23 +38,61 @@ -#define OPTION_TIPS 0 -#define OPTION_FORTUNES 1 +static GtkWidget *dlg = NULL; +static GPtrArray *tips = NULL; -static const gchar *titles[] = { - N_("Tips and Tricks"), - N_("Fortunes") -}; +static void +read_tips_from_file() +{ + gchar *data; + gchar *entry; + gsize len; + guint i, j; + GError *error = NULL; + // read the whole file + g_file_get_contents(TIPSDIR "/tips", &data, &len, &error); + tips = g_ptr_array_new(); + if (error) + { + g_ptr_array_add(tips, g_strdup_printf(_("Could not load tips database (%s)."), + error->message)); + g_free(data); + g_error_free(error); + return; + } -static GtkWidget *dlg = NULL; -static guint option = OPTION_TIPS; + entry = g_malloc(len + 1); + i = j = 0; + while (data[i]) + { + if (data[i] == '%') + { + // add a new tip + entry[j] = '\0'; + j = 0; + if (entry[0]) + g_ptr_array_add(tips, g_strdup(entry)); + // skip the following line break character(s) + if (data[i] == '\r' && (i + 1) < len && data[i + 1] == '\n') + i += 2; + else + i += 1; + } + else + entry[j++] = data[i]; + i++; + } + g_free(data); + g_free(entry); +} + static gboolean autostart_enabled (void) { @@ -92,48 +130,34 @@ static void -item_cb (GtkWidget *btn, - gpointer data) +next_cb(GtkWidget *btn, GtkTextBuffer *textbuf) { - option = GPOINTER_TO_UINT(data); - gtk_window_set_title (GTK_WINDOW (dlg), _(titles[option])); + gchar *text; + + if (! tips || tips->len == 0) + gtk_text_buffer_set_text(textbuf, _("Error while loading tips."), -1); + + text = g_ptr_array_index(tips, g_random_int_range(0, tips->len)); + gtk_text_buffer_set_text(textbuf, text, -1); } static void -next_cb(GtkWidget *btn, GtkTextBuffer *textbuf) +free_tip(gpointer data, gpointer user_data) { - gchar buffer[1024]; - GtkTextIter start; - GtkTextIter end; - FILE *fp; + g_free(data); +} - /* clear the text buffer */ - gtk_text_buffer_get_bounds(textbuf, &start, &end); - gtk_text_buffer_delete(textbuf, &start, &end); - switch (option) { - case OPTION_TIPS: - strcpy(buffer, "fortune " TIPSDIR "/tips"); - break; - case OPTION_FORTUNES: - strcpy(buffer, "fortune"); - break; - } +static void +quit(GtkWidget *widget, gpointer data) +{ + g_ptr_array_foreach(tips, free_tip, NULL); + g_ptr_array_free(tips, TRUE); - if ((fp = popen(buffer, "r")) == NULL) { - perror("Unable to execute fortune"); - return; - } - - while (fgets(buffer, sizeof(buffer), fp) != NULL) { - gtk_text_buffer_get_end_iter(textbuf, &end); - gtk_text_buffer_insert(textbuf, &end, buffer, -1); - } - - pclose (fp); + gtk_main_quit(); } @@ -145,16 +169,15 @@ GtkWidget *view; GtkWidget *vbox2; GtkWidget *check; - GtkWidget *item; - GtkWidget *menu; - GtkWidget *opt; GtkWidget *next; GtkWidget *close; xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8"); - + gtk_init (&argc, &argv); + read_tips_from_file(); + /* fake a SM client id, so the session manager does not restart us */ gdk_set_sm_client_id ("FAKED CLIENTID"); @@ -193,26 +216,6 @@ gtk_box_pack_start (GTK_BOX (vbox2), check, FALSE, FALSE, 0); gtk_widget_show (check); - menu = gtk_menu_new (); - gtk_widget_show (menu); - - item = gtk_menu_item_new_with_label (_("Tips and tricks")); - g_signal_connect (item, "activate", G_CALLBACK (item_cb), GUINT_TO_POINTER (OPTION_TIPS)); - g_signal_connect (item, "activate", G_CALLBACK (next_cb), gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); - gtk_widget_show (item); - - item = gtk_menu_item_new_with_label (_("Fortunes")); - g_signal_connect (item, "activate", G_CALLBACK (item_cb), GUINT_TO_POINTER (OPTION_FORTUNES)); - g_signal_connect (item, "activate", G_CALLBACK (next_cb), gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); - gtk_widget_show (item); - - opt = gtk_option_menu_new(); - gtk_option_menu_set_menu(GTK_OPTION_MENU(opt), menu); - gtk_dialog_add_action_widget (GTK_DIALOG (dlg), opt, GTK_RESPONSE_NONE); - gtk_widget_show(opt); - next = gtk_button_new_with_label (_("Next")); gtk_dialog_add_action_widget (GTK_DIALOG (dlg), next, GTK_RESPONSE_NONE); gtk_widget_show (next); @@ -221,9 +224,9 @@ gtk_dialog_add_action_widget (GTK_DIALOG (dlg), close, GTK_RESPONSE_DELETE_EVENT); gtk_widget_show (close); - g_signal_connect (dlg, "delete-event", G_CALLBACK (gtk_main_quit), NULL); - g_signal_connect (dlg, "destroy-event", G_CALLBACK (gtk_main_quit), NULL); - g_signal_connect (close, "clicked", G_CALLBACK (gtk_main_quit), NULL); + g_signal_connect (dlg, "delete-event", G_CALLBACK (quit), NULL); + g_signal_connect (dlg, "destroy-event", G_CALLBACK (quit), NULL); + g_signal_connect (close, "clicked", G_CALLBACK (quit), NULL); g_signal_connect (next, "clicked", G_CALLBACK (next_cb), gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); next_cb (next, gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); Index: xfce4-tips/data/Makefile.am =================================================================== --- xfce4-tips/data/Makefile.am (Revision 26613) +++ xfce4-tips/data/Makefile.am (Arbeitskopie) @@ -1,10 +1,5 @@ tipsdir = $(datadir)/xfce4/tips -tips_DATA = \ - tips \ - tips.dat +tips_DATA = tips -tips.dat: $(srcdir)/tips - strfile $(srcdir)/tips tips.dat - EXTRA_DIST = $(tips_DATA)