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)

