[Goodies-commits] r4137 - in xfce4-dict/trunk: . lib panel-plugin src

Enrico Troeger enrico at xfce.org
Sun Mar 30 11:01:41 CEST 2008


Author: enrico
Date: 2008-03-30 09:01:41 +0000 (Sun, 30 Mar 2008)
New Revision: 4137

Added:
   xfce4-dict/trunk/lib/gui.c
   xfce4-dict/trunk/lib/gui.h
   xfce4-dict/trunk/lib/inline-icon.h
   xfce4-dict/trunk/lib/libdict.h
   xfce4-dict/trunk/lib/prefs.c
   xfce4-dict/trunk/lib/prefs.h
Modified:
   xfce4-dict/trunk/ChangeLog
   xfce4-dict/trunk/lib/Makefile.am
   xfce4-dict/trunk/lib/aspell.c
   xfce4-dict/trunk/lib/common.c
   xfce4-dict/trunk/lib/common.h
   xfce4-dict/trunk/lib/dictd.c
   xfce4-dict/trunk/panel-plugin/xfce4-dict-plugin.c
   xfce4-dict/trunk/src/xfce4-dict.c
Log:
More code reorganisation and cleanup.

Modified: xfce4-dict/trunk/ChangeLog
===================================================================
--- xfce4-dict/trunk/ChangeLog	2008-03-30 05:59:30 UTC (rev 4136)
+++ xfce4-dict/trunk/ChangeLog	2008-03-30 09:01:41 UTC (rev 4137)
@@ -1,3 +1,8 @@
+2008-03-30  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>
+
+	* More code reorganisation and cleanup.
+
+
 2008-03-27  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>
 
 	* Reorganise most of the code base to separat commonly used code from the

Modified: xfce4-dict/trunk/lib/Makefile.am
===================================================================
--- xfce4-dict/trunk/lib/Makefile.am	2008-03-30 05:59:30 UTC (rev 4136)
+++ xfce4-dict/trunk/lib/Makefile.am	2008-03-30 09:01:41 UTC (rev 4137)
@@ -1,17 +1,26 @@
 
 
+inline-icon.h: $(top_srcdir)/xfce4-dict.svg
+	gdk-pixbuf-csource --raw --name=dict_icon_data $(top_srcdir)/xfce4-dict.svg > $(srcdir)/inline-icon.h
+
+
 noinst_LIBRARIES = 								\
 	libdict.a
 
 libdict_a_SOURCES =								\
 	inline-icon.h								\
 	popup_def.h									\
+	libdict.h									\
 	aspell.c									\
 	aspell.h									\
 	common.c									\
 	common.h									\
+	dictd.c										\
 	dictd.h										\
-	dictd.c
+	gui.c										\
+	gui.h										\
+	prefs.c										\
+	prefs.h
 
 libdict_a_CFLAGS =								\
 	-I$(top_srcdir)								\
@@ -19,6 +28,3 @@
 	$(LIBXFCE4PANEL_CFLAGS)						\
 	-DPACKAGE_LOCALE_DIR=\"$(localedir)\"		\
 	@GTHREAD_CFLAGS@
-
-inline-icon.h: $(top_srcdir)/xfce4-dict.svg
-	gdk-pixbuf-csource --raw --name=dict_icon_data $(top_srcdir)/xfce4-dict.svg > $(srcdir)/inline-icon.h

Modified: xfce4-dict/trunk/lib/aspell.c
===================================================================
--- xfce4-dict/trunk/lib/aspell.c	2008-03-30 05:59:30 UTC (rev 4136)
+++ xfce4-dict/trunk/lib/aspell.c	2008-03-30 09:01:41 UTC (rev 4137)
@@ -1,6 +1,6 @@
 /*  $Id$
  *
- *  Copyright 2007-2008 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
+ *  Copyright 2006-2008 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -31,11 +31,9 @@
 
 #include <libxfcegui4/libxfcegui4.h>
 
-/* Simple forward declaration to avoid inclusion of libxfce4panel headers */
-typedef struct XfcePanelPlugin_t XfcePanelPlugin;
-
 #include "common.h"
 #include "aspell.h"
+#include "gui.h"
 
 
 static GIOChannel *set_up_io_channel(gint fd, GIOCondition cond, GIOFunc func, gconstpointer data)
@@ -142,17 +140,32 @@
 	gint     stdout_fd;
 	gint     stderr_fd;
 	gint     stdin_fd;
+	gchar	*tts;
 
 	if (! NZV(dd->spell_bin))
 	{
 		dict_status_add(dd, _("Please set an appropriate aspell command."));
 		return;
 	}
+
 	if (! NZV(word))
 	{
 		dict_status_add(dd, _("Invalid input."));
 		return;
 	}
+
+	/* TODO search only for the first word when working on a sentence,
+	 * workout a better solution */
+	tts = g_strdup(word);
+	if ((tts = strchr(word, ' ')) ||
+		(tts = strchr(word, '-')) ||
+		(tts = strchr(word, '_')) ||
+		(tts = strchr(word, '.')) ||
+		(tts = strchr(word, ',')))
+	{
+		*tts = '\0';
+	}
+
 	locale_cmd = g_locale_from_utf8(dd->spell_bin, -1, NULL, NULL, NULL);
 	if (locale_cmd == NULL)
 		locale_cmd = g_strdup(dd->spell_bin);
@@ -164,13 +177,11 @@
 	argv[3] = g_strdup(dd->spell_dictionary);
 	argv[4] = NULL;
 
-	dict_clear_text_buffer(dd);
-
 	if (g_spawn_async_with_pipes(NULL, argv, NULL,
 			G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, NULL,
 			&stdin_fd, &stdout_fd, &stderr_fd, &error))
 	{
-		set_up_io_channel(stdin_fd, G_IO_OUT, iofunc_write, word);
+		set_up_io_channel(stdin_fd, G_IO_OUT, iofunc_write, tts);
 		set_up_io_channel(stdout_fd, G_IO_IN|G_IO_PRI|G_IO_HUP|G_IO_ERR|G_IO_NVAL, iofunc_read, dd);
 		set_up_io_channel(stderr_fd, G_IO_IN|G_IO_PRI|G_IO_HUP|G_IO_ERR|G_IO_NVAL, iofunc_read_err, dd);
 		dict_status_add(dd, _("Ready."));
@@ -182,5 +193,6 @@
 		error = NULL;
 	}
 
+	g_free(tts);
 	g_strfreev(argv);
 }

Modified: xfce4-dict/trunk/lib/common.c
===================================================================
--- xfce4-dict/trunk/lib/common.c	2008-03-30 05:59:30 UTC (rev 4136)
+++ xfce4-dict/trunk/lib/common.c	2008-03-30 09:01:41 UTC (rev 4137)
@@ -36,25 +36,16 @@
 
 
 
-/* Simple forward declaration to avoid inclusion of libxfce4panel headers */
-typedef struct XfcePanelPlugin_t XfcePanelPlugin;
-
 #include "common.h"
 #include "aspell.h"
 #include "dictd.h"
-#include "inline-icon.h"
+#include "gui.h"
 
 
 
-/* the following extern declared functions are called here for interaction with the panel
- * plugin (if in use) and to avoid to require linkage to libxfce4panel */
-extern void dict_panel_plugin_save_settings(DictData *dd);
-extern void dict_panel_plugin_unblock(DictData *dd);
 
-
-
 /* TODO make me UTF-8 safe */
-static gint dict_str_pos(const gchar *haystack, const gchar *needle)
+static gint str_pos(const gchar *haystack, const gchar *needle)
 {
 	gint haystack_length = strlen(haystack);
 	gint needle_length = strlen(needle);
@@ -93,7 +84,7 @@
 /* Replaces all occurrences of needle in haystack with replacement.
  * All strings have to be NULL-terminated and needle and replacement have to be different,
  * e.g. needle "%" and replacement "%%" causes an endless loop */
-static gchar *dict_str_replace(gchar *haystack, const gchar *needle, const gchar *replacement)
+static gchar *str_replace(gchar *haystack, const gchar *needle, const gchar *replacement)
 {
 	gint i;
 	gchar *start;
@@ -111,7 +102,7 @@
 		return haystack;
 
 	start = strstr(haystack, needle);
-	lt_pos = dict_str_pos(haystack, needle);
+	lt_pos = str_pos(haystack, needle);
 
 	if (start == NULL || lt_pos == -1)
 		return haystack;
@@ -128,53 +119,12 @@
 	result = str->str;
 	g_free(haystack);
 	g_string_free(str, FALSE);
-	return dict_str_replace(result, needle, replacement);
+	return str_replace(result, needle, replacement);
 }
 
 
-void dict_set_panel_entry_text(DictData *dd, const gchar *text)
-{
-	if (dd->panel_entry != NULL)
-		gtk_entry_set_text(GTK_ENTRY(dd->panel_entry), text);
-}
-
-
-void dict_show_main_window(DictData *dd)
-{
-	gtk_widget_show(dd->window);
-	gtk_window_deiconify(GTK_WINDOW(dd->window));
-	gtk_window_present(GTK_WINDOW(dd->window));
-}
-
-
-void dict_status_add(DictData *dd, const gchar *format, ...)
-{
-	static gchar string[512];
-	va_list args;
-
-	string[0] = ' ';
-	va_start(args, format);
-	g_vsnprintf(string + 1, (sizeof string) - 1, format, args);
-	va_end(args);
-
-	gtk_statusbar_pop(GTK_STATUSBAR(dd->statusbar), 1);
-	gtk_statusbar_push(GTK_STATUSBAR(dd->statusbar), 1, string);
-}
-
-
-void dict_clear_text_buffer(DictData *dd)
-{
-	GtkTextIter start_iter, end_iter;
-
-	/* clear the TextBuffer */
-	gtk_text_buffer_get_start_iter(dd->main_textbuffer, &start_iter);
-	gtk_text_buffer_get_end_iter(dd->main_textbuffer, &end_iter);
-	gtk_text_buffer_delete(dd->main_textbuffer, &start_iter, &end_iter);
-}
-
-
 /* taken from xarchiver, thanks Giuseppe */
-static gboolean dict_open_browser(DictData *dd, const gchar *uri)
+static gboolean open_browser(DictData *dd, const gchar *uri)
 {
 	gchar *argv[3];
 	gchar *browser_path;
@@ -202,7 +152,7 @@
 	argv[1] = (gchar*) uri;
 	argv[2] = NULL;
 
-	result = gdk_spawn_on_screen(gtk_widget_get_screen(GTK_WIDGET(dd->plugin)), NULL, argv, NULL,
+	result = gdk_spawn_on_screen(gtk_widget_get_screen(dd->window), NULL, argv, NULL,
 				G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL);
 
 	g_free (browser_path);
@@ -211,7 +161,7 @@
 }
 
 
-static gboolean dict_start_web_query(DictData *dd, const gchar *word)
+static gboolean start_web_query(DictData *dd, const gchar *word)
 {
 	gboolean use_leo = FALSE;
 	gboolean success = TRUE;
@@ -251,8 +201,8 @@
 			dd->searched_word = tmp;
 		}
 	}
-	uri = dict_str_replace(g_strdup(base), "{word}", dd->searched_word);
-	if (! dict_open_browser(dd, uri))
+	uri = str_replace(g_strdup(base), "{word}", dd->searched_word);
+	if (! open_browser(dd, uri))
 	{
 		xfce_err(_("Browser could not be opened. Please check your preferences."));
 		success = FALSE;
@@ -265,7 +215,6 @@
 
 void dict_search_word(DictData *dd, const gchar *word)
 {
-	gboolean browser_started = FALSE;
 
 	/* sanity checks */
 	if (! NZV(word))
@@ -293,6 +242,8 @@
 		dd->searched_word = g_strdup(word);
 	}
 
+	dict_clear_text_buffer(dd);
+
 	switch (dd->mode)
 	{
 		case DICTMODE_DICT:
@@ -302,39 +253,23 @@
 		}
 		case DICTMODE_WEB:
 		{
-			browser_started = dict_start_web_query(dd, dd->searched_word);
+			gboolean browser_started = start_web_query(dd, dd->searched_word);
+
+			/* If we started a web search, the browser was successfully started and we are not in the
+			 * stand-alone app, then hide the main window in favour of the started browser.
+			 * If we are in the stand-alone app, don't hide the main window, we don't want this */
+			if (browser_started && dd->is_plugin)
+			{
+				gtk_widget_hide(dd->window);
+			}
 			break;
 		}
 		case DICTMODE_SPELL:
 		{
-			/* TODO search only for the first word when working on a sentence,
-			 * workout a better solution */
-			gchar *first_word_end = dd->searched_word;
-			if ((first_word_end = strchr(dd->searched_word, ' ')) ||
-				(first_word_end = strchr(dd->searched_word, '-')) ||
-				(first_word_end = strchr(dd->searched_word, '_')) ||
-				(first_word_end = strchr(dd->searched_word, '.')) ||
-				(first_word_end = strchr(dd->searched_word, ',')))
-			{
-				*first_word_end = '\0';
-			}
-
 			dict_start_aspell_query(dd, dd->searched_word);
 			break;
 		}
 	}
-
-	/* If we started a web search, the browser was successfully started and we are not in the
-	 * stand-alone app, then hide the main window in favour of the started browser.
-	 * If we are in the stand-alone app, don't hide the main window, we don't want this */
-	if (browser_started && dd->plugin != NULL)
-	{
-		gtk_widget_hide(dd->window);
-	}
-	else
-	{
-		dict_show_main_window(dd);
-	}
 }
 
 
@@ -406,16 +341,9 @@
 
 void dict_free_data(DictData *dd)
 {
-	if (dd->plugin != NULL)
-	{
-		/* Destroy the setting dialog, if this open */
-		GtkWidget *dialog = g_object_get_data(G_OBJECT(dd->plugin), "dialog");
-		if (dialog)
-			gtk_widget_destroy(dialog);
-	}
+	g_message("dict: destroy window");
+	gtk_widget_destroy(dd->window);
 
-    gtk_widget_destroy(dd->window);
-
 	dict_write_rc_file(dd);
 	g_free(dd->searched_word);
 	g_free(dd->dictionary);
@@ -425,654 +353,11 @@
 
 	if (dd->icon != NULL)
 		g_object_unref(dd->icon);
-	if (dd->tooltips != NULL)
-		gtk_object_sink(GTK_OBJECT(dd->tooltips));
 
 	g_free(dd);
 }
 
 
-
-
-static void dict_properties_dialog_response(GtkWidget *dlg, gint response, DictData *dd)
-{
-	g_object_set_data(G_OBJECT(dd->plugin), "dialog", NULL);
-
-	if (response == GTK_RESPONSE_OK)
-	{
-		gchar *tmp;
-		/* MODE DICT */
-		tmp = gtk_combo_box_get_active_text(GTK_COMBO_BOX(dd->dict_combo));
-		if (tmp == NULL || tmp[0] == '0' || tmp[0] == '-')
-		{
-			xfce_err(_("You have chosen an invalid dictionary entry."));
-			g_free(tmp);
-			return;
-		}
-
-		dd->port = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(dd->port_spinner));
-
-		g_free(dd->server);
-		dd->server = g_strdup(gtk_entry_get_text(GTK_ENTRY(dd->server_entry)));
-
-		g_free(dd->dictionary);
-		dd->dictionary = tmp;
-
-		/* MODE WEB */
-		if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dd->web_radio_leo_gereng)))
-			dd->web_mode = WEBMODE_LEO_GERENG;
-		else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dd->web_radio_leo_gerfre)))
-			dd->web_mode = WEBMODE_LEO_GERFRE;
-		else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dd->web_radio_leo_gerspa)))
-			dd->web_mode = WEBMODE_LEO_GERSPA;
-		else
-		{
-			dd->web_mode = WEBMODE_OTHER;
-
-			g_free(dd->web_url);
-			dd->web_url = g_strdup(gtk_entry_get_text(GTK_ENTRY(dd->web_entry)));
-		}
-
-		/* MODE SPELL */
-		tmp = gtk_combo_box_get_active_text(GTK_COMBO_BOX(dd->spell_combo));
-		if (NZV(tmp))
-		{
-			g_free(dd->spell_dictionary);
-			dd->spell_dictionary = tmp;
-		}
-
-		g_free(dd->spell_bin);
-		dd->spell_bin = g_strdup(gtk_entry_get_text(GTK_ENTRY(dd->spell_entry)));
-
-		/* general settings */
-		dd->show_panel_entry = gtk_toggle_button_get_active(
-								GTK_TOGGLE_BUTTON(dd->check_panel_entry));
-		dd->panel_entry_size = gtk_spin_button_get_value_as_int(
-								GTK_SPIN_BUTTON(dd->panel_entry_size_spinner));
-
-		if (dd->plugin != NULL)
-			dict_panel_plugin_save_settings(dd);
-
-		/* save settings */
-		dict_write_rc_file(dd);
-	}
-	gtk_widget_destroy(dlg);
-
-	if (dd->plugin != NULL)
-		dict_panel_plugin_unblock(dd);
-}
-
-
-static void dict_show_panel_entry_toggled(GtkToggleButton *tb, DictData *dd)
-{
-	gtk_widget_set_sensitive(dd->panel_entry_size_spinner, gtk_toggle_button_get_active(tb));
-	gtk_widget_set_sensitive(dd->panel_entry_size_label, gtk_toggle_button_get_active(tb));
-}
-
-
-static void dict_use_webserver_toggled(GtkToggleButton *tb, DictData *dd)
-{
-	gtk_widget_set_sensitive(dd->web_entry, gtk_toggle_button_get_active(tb));
-	gtk_widget_set_sensitive(dd->web_entry_label, gtk_toggle_button_get_active(tb));
-}
-
-
-void dict_get_spell_dictionaries(DictData *dd)
-{
-	if (NZV(dd->spell_bin))
-	{
-		gchar *tmp = NULL, *cmd, *locale_cmd;
-
-		cmd = g_strconcat(dd->spell_bin, " dump dicts", NULL);
-		locale_cmd = g_locale_from_utf8(cmd, -1, NULL, NULL, NULL);
-		if (locale_cmd == NULL)
-			locale_cmd = g_strdup(cmd);
-		g_spawn_command_line_sync(locale_cmd, &tmp, NULL, NULL, NULL);
-		if (NZV(tmp))
-		{
-			gchar **list = g_strsplit_set(tmp, "\n\r", -1);
-			gchar *item;
-			guint i, len = g_strv_length(list);
-			for (i = 0; i < len; i++)
-			{
-				item = g_strstrip(list[i]);
-				gtk_combo_box_append_text(GTK_COMBO_BOX(dd->spell_combo), item);
-				if (strcmp(dd->spell_dictionary, item) == 0)
-					gtk_combo_box_set_active(GTK_COMBO_BOX(dd->spell_combo), i);
-			}
-			g_strfreev(list);
-		}
-
-		g_free(cmd);
-		g_free(locale_cmd);
-		g_free(tmp);
-	}
-}
-
-
-void dict_properties_dialog(DictData *dd)
-{
-	GtkWidget *dlg, *header, *vbox, *label3, *parent;
-
-	parent = (dd->plugin != NULL) ? GTK_WIDGET(dd->plugin) : dd->window;
-
-	dlg = gtk_dialog_new_with_buttons(_("Properties"),
-				GTK_WINDOW(gtk_widget_get_toplevel(parent)),
-				GTK_DIALOG_DESTROY_WITH_PARENT |
-				GTK_DIALOG_NO_SEPARATOR,
-				GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-				GTK_STOCK_CLOSE, GTK_RESPONSE_OK,
-				NULL);
-
-	if (dd->plugin != NULL)
-		g_object_set_data(G_OBJECT(dd->plugin), "dialog", dlg);
-
-	gtk_window_set_position(GTK_WINDOW(dlg), GTK_WIN_POS_CENTER);
-
-	g_signal_connect(dlg, "response", G_CALLBACK(dict_properties_dialog_response), dd);
-
-	gtk_container_set_border_width(GTK_CONTAINER(dlg), 2);
-
-	header = xfce_create_header(NULL, _("Dictionary plugin"));
-	gtk_container_set_border_width(GTK_CONTAINER(header), 6);
-	gtk_widget_show(header);
-	gtk_box_pack_start(GTK_BOX(GTK_DIALOG (dlg)->vbox), header, FALSE, TRUE, 0);
-
-	vbox = gtk_vbox_new(FALSE, 3);
-	gtk_container_set_border_width(GTK_CONTAINER(vbox), 6);
-	gtk_widget_show(vbox);
-	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->vbox), vbox, TRUE, TRUE, 0);
-
-	/*
-	 * Mode: DICT
-	 */
-	 {
-		GtkWidget *label1, *label2, *table, *button_get_list, *frame1;
-
-		/* server address */
-		label1 = gtk_label_new_with_mnemonic(_("Server:"));
-		gtk_widget_show(label1);
-
-		dd->server_entry = gtk_entry_new();
-		gtk_entry_set_max_length(GTK_ENTRY(dd->server_entry), 256);
-		if (dd->server != NULL)
-		{
-			gtk_entry_set_text(GTK_ENTRY(dd->server_entry), dd->server);
-		}
-		gtk_widget_show(dd->server_entry);
-
-		/* server port */
-		label2 = gtk_label_new_with_mnemonic(_("Server Port:"));
-		gtk_widget_show(label2);
-
-		dd->port_spinner = gtk_spin_button_new_with_range(0.0, 65536.0, 1.0);
-		gtk_spin_button_set_value(GTK_SPIN_BUTTON(dd->port_spinner), dd->port);
-		gtk_widget_show(dd->port_spinner);
-
-		/* dictionary */
-		label3 = gtk_label_new_with_mnemonic(_("Dictionary:"));
-		gtk_widget_show(label3);
-
-		dd->dict_combo = gtk_combo_box_new_text();
-		gtk_combo_box_append_text(GTK_COMBO_BOX(dd->dict_combo), _("* (use all)"));
-		gtk_combo_box_append_text(GTK_COMBO_BOX(dd->dict_combo),
-											_("! (use all, stop after first match)"));
-		gtk_combo_box_append_text(GTK_COMBO_BOX(dd->dict_combo), "----------------");
-		if (dd->dictionary != NULL)
-		{
-			if (dd->dictionary[0] == '*')
-				gtk_combo_box_set_active(GTK_COMBO_BOX(dd->dict_combo), 0);
-			else if (dd->dictionary[0] == '!')
-				gtk_combo_box_set_active(GTK_COMBO_BOX(dd->dict_combo), 1);
-			else
-			{
-				gtk_combo_box_append_text(GTK_COMBO_BOX(dd->dict_combo), dd->dictionary);
-				gtk_combo_box_set_active(GTK_COMBO_BOX(dd->dict_combo), 3);
-			}
-		}
-
-		gtk_widget_show(dd->dict_combo);
-
-		button_get_list = gtk_button_new_from_stock("gtk-find");
-		gtk_widget_show(button_get_list);
-		g_signal_connect(button_get_list, "clicked", G_CALLBACK(dict_get_dict_list_cb), dd);
-
-
-		/* put it all together */
-		table = gtk_table_new(3, 3, FALSE);
-		gtk_widget_show(table);
-		gtk_table_set_row_spacings(GTK_TABLE(table), 5);
-		gtk_table_set_col_spacings(GTK_TABLE(table), 5);
-
-		gtk_table_attach(GTK_TABLE(table), label1, 0, 1, 0, 1,
-						(GtkAttachOptions) (GTK_FILL),
-						(GtkAttachOptions) (0), 5, 5);
-		gtk_misc_set_alignment(GTK_MISC(label1), 1, 0);
-
-		gtk_table_attach(GTK_TABLE(table), dd->server_entry, 1, 2, 0, 1,
-						(GtkAttachOptions) (GTK_FILL),
-						(GtkAttachOptions) (0), 5, 5);
-
-		gtk_table_attach(GTK_TABLE(table), label2, 0, 1, 1, 2,
-						(GtkAttachOptions) (GTK_FILL),
-						(GtkAttachOptions) (0), 5, 0);
-		gtk_misc_set_alignment(GTK_MISC(label2), 1, 0);
-
-		gtk_table_attach(GTK_TABLE(table), dd->port_spinner, 1, 2, 1, 2,
-						(GtkAttachOptions) (GTK_FILL),
-						(GtkAttachOptions) (0), 5, 5);
-
-		gtk_table_attach(GTK_TABLE(table), label3, 0, 1, 2, 3,
-						(GtkAttachOptions) (GTK_FILL),
-						(GtkAttachOptions) (0), 5, 0);
-		gtk_misc_set_alignment(GTK_MISC(label3), 1, 0);
-
-		gtk_table_attach(GTK_TABLE(table), dd->dict_combo, 1, 2, 2, 3,
-						(GtkAttachOptions) (GTK_FILL),
-						(GtkAttachOptions) (0), 0, 0);
-
-		gtk_table_attach(GTK_TABLE(table), button_get_list, 2, 3, 2, 3,
-						(GtkAttachOptions) (GTK_FILL),
-						(GtkAttachOptions) (0), 5, 5);
-
-
-		frame1 = gtk_frame_new(_("Use a DICT server"));
-		gtk_frame_set_shadow_type(GTK_FRAME(frame1), GTK_SHADOW_ETCHED_OUT);
-		gtk_widget_show(frame1);
-		gtk_container_set_border_width(GTK_CONTAINER(frame1), 3);
-		gtk_container_add(GTK_CONTAINER(frame1), table);
-		gtk_box_pack_start(GTK_BOX(vbox), frame1, FALSE, FALSE, 0);
-	}
-
-	/*
-	 * Mode: WEB
-	 */
-	{
-		GtkWidget  *web_vbox, *entry_hbox, *help_label, *frame2;
-		GSList *web_type;
-
-		web_vbox = gtk_vbox_new(FALSE, 5);
-		gtk_widget_show(web_vbox);
-
-		dd->web_radio_leo_gereng = gtk_radio_button_new_with_label(NULL,
-													_("dict.leo.org - German <-> English"));
-		web_type = gtk_radio_button_get_group(GTK_RADIO_BUTTON(dd->web_radio_leo_gereng));
-		if (dd->web_mode == WEBMODE_LEO_GERENG)
-			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dd->web_radio_leo_gereng), TRUE);
-		gtk_widget_show(dd->web_radio_leo_gereng);
-		gtk_box_pack_start(GTK_BOX(web_vbox), dd->web_radio_leo_gereng, FALSE, FALSE, 0);
-
-		dd->web_radio_leo_gerfre = gtk_radio_button_new_with_label(web_type,
-													_("dict.leo.org - German <-> French"));
-		web_type = gtk_radio_button_get_group(GTK_RADIO_BUTTON(dd->web_radio_leo_gerfre));
-		if (dd->web_mode == WEBMODE_LEO_GERFRE)
-			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dd->web_radio_leo_gerfre), TRUE);
-		gtk_widget_show(dd->web_radio_leo_gerfre);
-		gtk_box_pack_start(GTK_BOX(web_vbox), dd->web_radio_leo_gerfre, FALSE, FALSE, 0);
-
-		dd->web_radio_leo_gerspa = gtk_radio_button_new_with_label(web_type,
-													_("dict.leo.org - German <-> Spanish"));
-		web_type = gtk_radio_button_get_group(GTK_RADIO_BUTTON(dd->web_radio_leo_gerspa));
-		if (dd->web_mode == WEBMODE_LEO_GERSPA)
-			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dd->web_radio_leo_gerspa), TRUE);
-		gtk_widget_show(dd->web_radio_leo_gerspa);
-		gtk_box_pack_start(GTK_BOX(web_vbox), dd->web_radio_leo_gerspa, FALSE, FALSE, 0);
-
-		dd->web_radio_other = gtk_radio_button_new_with_label(web_type, _("Use another website"));
-		if (dd->web_mode == WEBMODE_OTHER)
-			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dd->web_radio_other), TRUE);
-		gtk_widget_show(dd->web_radio_other);
-		g_signal_connect(G_OBJECT(dd->web_radio_other), "toggled",
-												G_CALLBACK(dict_use_webserver_toggled), dd);
-		gtk_box_pack_start(GTK_BOX(web_vbox), dd->web_radio_other, FALSE, FALSE, 0);
-
-		dd->web_entry_label = gtk_label_new_with_mnemonic(_("URL:"));
-		gtk_widget_show(dd->web_entry_label);
-		dd->web_entry = gtk_entry_new();
-		if (dd->web_url != NULL)
-			gtk_entry_set_text(GTK_ENTRY(dd->web_entry), dd->web_url);
-		gtk_widget_show(dd->web_entry);
-
-		entry_hbox = gtk_hbox_new(FALSE, 0);
-		gtk_widget_show(entry_hbox);
-		gtk_box_pack_start(GTK_BOX(entry_hbox), dd->web_entry_label, FALSE, TRUE, 5);
-		gtk_box_pack_start(GTK_BOX(entry_hbox), dd->web_entry, FALSE, FALSE, 0);
-		gtk_box_pack_start(GTK_BOX(web_vbox), entry_hbox, FALSE, FALSE, 0);
-
-		help_label = gtk_label_new(_("Enter an URL to a web site which offer translation services.\nUse {word} as placeholder for the searched word."));
-		gtk_label_set_line_wrap(GTK_LABEL(help_label), TRUE);
-		gtk_misc_set_alignment(GTK_MISC(help_label), 0, 0);
-		gtk_widget_show(help_label);
-		gtk_box_pack_start(GTK_BOX(web_vbox), help_label, TRUE, TRUE, 0);
-
-		frame2 = gtk_frame_new(_("Use a web site"));
-		gtk_frame_set_shadow_type(GTK_FRAME(frame2), GTK_SHADOW_ETCHED_OUT);
-		gtk_widget_show(frame2);
-		gtk_container_set_border_width(GTK_CONTAINER(frame2), 3);
-		gtk_container_add(GTK_CONTAINER(frame2), web_vbox);
-		gtk_box_pack_start(GTK_BOX(vbox), frame2, TRUE, TRUE, 0);
-	}
-
-	/*
-	 * Mode: ASPELL
-	 */
-	{
-		GtkWidget *label4, *label5, *table, *frame3;
-
-		label4 = gtk_label_new_with_mnemonic(_("Aspell program:"));
-		gtk_widget_show(label4);
-
-		dd->spell_entry = gtk_entry_new();
-		gtk_entry_set_max_length(GTK_ENTRY(dd->spell_entry), 256);
-		if (dd->spell_bin != NULL)
-		{
-			gtk_entry_set_text(GTK_ENTRY(dd->spell_entry), dd->spell_bin);
-		}
-		gtk_widget_show(dd->spell_entry);
-
-		label5 = gtk_label_new_with_mnemonic(_("Dictionary:"));
-		gtk_widget_show(label5);
-
-		dd->spell_combo = gtk_combo_box_new_text();
-		dict_get_spell_dictionaries(dd);
-		gtk_widget_show(dd->spell_combo);
-
-		table = gtk_table_new(2, 2, FALSE);
-		gtk_widget_show(table);
-		gtk_table_set_row_spacings(GTK_TABLE(table), 5);
-		gtk_table_set_col_spacings(GTK_TABLE(table), 5);
-
-		gtk_table_attach(GTK_TABLE(table), label4, 0, 1, 0, 1,
-						(GtkAttachOptions) (GTK_FILL),
-						(GtkAttachOptions) (0), 5, 5);
-		gtk_misc_set_alignment(GTK_MISC(label4), 1, 0);
-
-		gtk_table_attach(GTK_TABLE(table), dd->spell_entry, 1, 2, 0, 1,
-						(GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
-						(GtkAttachOptions) (0), 5, 5);
-
-		gtk_table_attach(GTK_TABLE(table), label5, 0, 1, 1, 2,
-						(GtkAttachOptions) (GTK_FILL),
-						(GtkAttachOptions) (0), 5, 0);
-		gtk_misc_set_alignment(GTK_MISC(label5), 1, 0);
-
-		gtk_table_attach(GTK_TABLE(table), dd->spell_combo, 1, 2, 1, 2,
-						(GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
-						(GtkAttachOptions) (0), 5, 5);
-
-		frame3 = gtk_frame_new(_("Use Aspell"));
-		gtk_frame_set_shadow_type(GTK_FRAME(frame3), GTK_SHADOW_ETCHED_OUT);
-		gtk_widget_show(frame3);
-		gtk_container_set_border_width(GTK_CONTAINER(frame3), 3);
-		gtk_container_add(GTK_CONTAINER(frame3), table);
-		gtk_box_pack_start(GTK_BOX(vbox), frame3, TRUE, FALSE, 0);
-	}
-
-	/* Display text entry in the panel */
-	{
-		GtkWidget *pe_hbox, *label;
-
-		/* show panel entry check box */
-		dd->check_panel_entry = gtk_check_button_new_with_label(
-													_("Show text field in the panel"));
-		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dd->check_panel_entry), dd->show_panel_entry);
-		gtk_tooltips_set_tip(dd->tooltips, dd->check_panel_entry,
-			_("This option can only be used when the panel has a horizontal orientation."), NULL);
-		gtk_widget_show(dd->check_panel_entry);
-		g_signal_connect(G_OBJECT(dd->check_panel_entry), "toggled",
-													G_CALLBACK(dict_show_panel_entry_toggled), dd);
-
-		/* panel entry size */
-		dd->panel_entry_size_label = gtk_label_new_with_mnemonic(_("Text field size:"));
-		gtk_widget_show(dd->panel_entry_size_label);
-		dd->panel_entry_size_spinner = gtk_spin_button_new_with_range(0.0, 500.0, 1.0);
-		gtk_spin_button_set_value(GTK_SPIN_BUTTON(dd->panel_entry_size_spinner),
-																		dd->panel_entry_size);
-		gtk_widget_show(dd->panel_entry_size_spinner);
-
-		pe_hbox = gtk_hbox_new(FALSE, 0);
-		gtk_widget_show(pe_hbox);
-
-		gtk_box_pack_start(GTK_BOX(pe_hbox), dd->panel_entry_size_label, FALSE, FALSE, 10);
-		gtk_box_pack_start(GTK_BOX(pe_hbox), dd->panel_entry_size_spinner, TRUE, TRUE, 0);
-
-		label = gtk_label_new(""); /* just to make some space, should be done better */
-		gtk_widget_show(label);
-		gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
-		gtk_box_pack_start(GTK_BOX(vbox), dd->check_panel_entry, FALSE, FALSE, 0);
-		gtk_box_pack_start(GTK_BOX(vbox), pe_hbox, FALSE, FALSE, 0);
-
-	}
-
-	/* init the sensitive widgets */
-	dict_use_webserver_toggled(GTK_TOGGLE_BUTTON(dd->web_radio_other), dd);
-	dict_show_panel_entry_toggled(GTK_TOGGLE_BUTTON(dd->check_panel_entry), dd);
-
-	gtk_widget_show(dlg);
-}
-
-
-void dict_entry_activate_cb(GtkEntry *entry, DictData *dd)
-{
-	const gchar *entered_text;
-
-	if (entry != NULL && GTK_WIDGET(entry) == dd->panel_entry)
-	{
-		entered_text = gtk_entry_get_text(GTK_ENTRY(dd->panel_entry));
-		gtk_entry_set_text(GTK_ENTRY(dd->main_entry), entered_text);
-	}
-	else
-		entered_text = gtk_entry_get_text(GTK_ENTRY(dd->main_entry));
-
-	dict_search_word(dd, entered_text);
-}
-
-
-void dict_entry_button_clicked_cb(GtkButton *button, DictData *dd)
-{
-	dict_entry_activate_cb(NULL, dd);
-	gtk_widget_grab_focus(dd->main_entry);
-}
-
-
-void dict_clear_button_clicked_cb(GtkButton *button, DictData *dd)
-{
-	dict_clear_text_buffer(dd);
-
-	/* clear the entries */
-	gtk_entry_set_text(GTK_ENTRY(dd->main_entry), "");
-	dict_set_panel_entry_text(dd, "");
-
-	dict_status_add(dd, _("Ready."));
-}
-
-
-void dict_search_mode_dict_toggled(GtkToggleButton *togglebutton, DictData *dd)
-{
-	if (gtk_toggle_button_get_active(togglebutton))
-	{
-		dd->mode = DICTMODE_DICT;
-		gtk_widget_grab_focus(dd->main_entry);
-	}
-}
-
-
-void dict_search_mode_web_toggled(GtkToggleButton *togglebutton, DictData *dd)
-{
-	if (gtk_toggle_button_get_active(togglebutton))
-	{
-		dd->mode = DICTMODE_WEB;
-		gtk_widget_grab_focus(dd->main_entry);
-	}
-}
-
-
-void dict_search_mode_spell_toggled(GtkToggleButton *togglebutton, DictData *dd)
-{
-	if (gtk_toggle_button_get_active(togglebutton))
-	{
-		dd->mode = DICTMODE_SPELL;
-		gtk_widget_grab_focus(dd->main_entry);
-	}
-}
-
-
-void dict_create_main_window(DictData *dd)
-{
-	GtkWidget *main_box;
-	GtkWidget *entry_box, *label_box, *entry_label, *entry_button, *clear_button;
-	GtkWidget *sep, *align, *scrolledwindow_results;
-	GdkPixbuf *icon;
-	GtkWidget *method_chooser, *radio, *label;
-
-	dd->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-	gtk_window_set_title(GTK_WINDOW(dd->window), "Xfce Dictionary");
-	gtk_window_set_default_size(GTK_WINDOW(dd->window), 500, 300);
-
-	icon = gdk_pixbuf_new_from_inline(-1, dict_icon_data, FALSE, NULL);
-	gtk_window_set_icon(GTK_WINDOW(dd->window), icon);
-	g_object_unref(icon);
-
-	main_box = gtk_vbox_new(FALSE, 0);
-	gtk_widget_show(main_box);
-	gtk_container_add(GTK_CONTAINER(dd->window), main_box);
-
-	/* entry box (label, entry, buttons) */
-	entry_box = gtk_hbox_new(FALSE, 10);
-	gtk_widget_show(entry_box);
-	gtk_container_set_border_width(GTK_CONTAINER(entry_box), 2);
-	gtk_box_pack_start(GTK_BOX(main_box), entry_box, FALSE, TRUE, 5);
-
-	label_box = gtk_hbox_new(FALSE, 5);
-	gtk_widget_show(label_box);
-	gtk_box_pack_start(GTK_BOX(entry_box), label_box, TRUE, TRUE, 0);
-
-	entry_label = gtk_label_new(_("Text to search:"));
-	gtk_widget_show(entry_label);
-	gtk_misc_set_alignment(GTK_MISC(entry_label), 1, 0.5);
-
-	align = gtk_alignment_new(1, 0.5, 0, 0);
-	gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 5, 0);
-	gtk_widget_show(align);
-	gtk_container_add(GTK_CONTAINER(align), entry_label);
-	gtk_box_pack_start(GTK_BOX(label_box), align, FALSE, FALSE, 2);
-
-	dd->main_entry = gtk_entry_new();
-	gtk_widget_show(dd->main_entry);
-	gtk_box_pack_start(GTK_BOX(label_box), dd->main_entry, TRUE, TRUE, 0);
-	g_signal_connect(dd->main_entry, "activate", G_CALLBACK(dict_entry_activate_cb), dd);
-
-	entry_button = gtk_button_new_from_stock("gtk-find");
-	gtk_widget_show(entry_button);
-	gtk_box_pack_start(GTK_BOX(entry_box), entry_button, FALSE, FALSE, 0);
-	g_signal_connect(entry_button, "clicked", G_CALLBACK(dict_entry_button_clicked_cb), dd);
-
-	clear_button = gtk_button_new_from_stock("gtk-clear");
-	gtk_widget_show(clear_button);
-	gtk_box_pack_start(GTK_BOX(entry_box), clear_button, FALSE, FALSE, 0);
-	g_signal_connect(clear_button, "clicked", G_CALLBACK(dict_clear_button_clicked_cb), dd);
-
-	/* just make some space */
-	align = gtk_alignment_new(1, 0.5, 0, 0);
-	gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 10, 0);
-	gtk_widget_show(align);
-	gtk_container_add(GTK_CONTAINER(align), gtk_label_new(""));
-	gtk_box_pack_start(GTK_BOX(entry_box), align, FALSE, FALSE, 0);
-
-	dd->close_button = gtk_button_new_from_stock("gtk-close");
-	gtk_widget_show(dd->close_button);
-	gtk_box_pack_end(GTK_BOX(entry_box), dd->close_button, FALSE, FALSE, 2);
-
-	/* insert it here and it will(hopefully) be placed before the Close button */
-	sep = gtk_vseparator_new();
-	gtk_widget_show(sep);
-	gtk_box_pack_end(GTK_BOX(entry_box), sep, FALSE, FALSE, 5);
-
-	/* search method chooser */
-	method_chooser = gtk_hbox_new(FALSE, 0);
-	gtk_widget_show(method_chooser);
-	gtk_box_pack_start(GTK_BOX(main_box), method_chooser, FALSE, FALSE, 0);
-
-	label = gtk_label_new(_("Search with:"));
-	gtk_widget_show(label);
-	gtk_box_pack_start(GTK_BOX(method_chooser), label, FALSE, FALSE, 6);
-
-	radio = gtk_radio_button_new_with_label(NULL, _("Dict"));
-	gtk_widget_show(radio);
-	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), (dd->mode == DICTMODE_DICT));
-	g_signal_connect(radio, "toggled", G_CALLBACK(dict_search_mode_dict_toggled), dd);
-	gtk_box_pack_start(GTK_BOX(method_chooser), radio, FALSE, FALSE, 6);
-
-	radio = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio), _("Web"));
-	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), (dd->mode == DICTMODE_WEB));
-	g_signal_connect(radio, "toggled", G_CALLBACK(dict_search_mode_web_toggled), dd);
-	gtk_widget_show(radio);
-	gtk_box_pack_start(GTK_BOX(method_chooser), radio, FALSE, FALSE, 6);
-
-	radio = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio), _("Spellcheck"));
-	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), (dd->mode == DICTMODE_SPELL));
-	g_signal_connect(radio, "toggled", G_CALLBACK(dict_search_mode_spell_toggled), dd);
-	gtk_widget_show(radio);
-	gtk_box_pack_start(GTK_BOX(method_chooser), radio, FALSE, FALSE, 6);
-
-	/* results area */
-	scrolledwindow_results = gtk_scrolled_window_new(NULL, NULL);
-	gtk_widget_show(scrolledwindow_results);
-	gtk_container_set_border_width(GTK_CONTAINER(scrolledwindow_results), 4);
-	gtk_box_pack_start(GTK_BOX(main_box), scrolledwindow_results, TRUE, TRUE, 0);
-	gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow_results),
-								GTK_SHADOW_IN);
-	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow_results),
-					GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-
-	/* searched words textview stuff */
-	dd->main_textview = gtk_text_view_new();
-	gtk_text_view_set_editable(GTK_TEXT_VIEW(dd->main_textview), FALSE);
-	gtk_text_view_set_left_margin(GTK_TEXT_VIEW(dd->main_textview), 5);
-	gtk_text_view_set_right_margin(GTK_TEXT_VIEW(dd->main_textview), 5);
-	gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(dd->main_textview), GTK_WRAP_WORD);
-	dd->main_textbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(dd->main_textview));
-	dd->main_boldtag = gtk_text_buffer_create_tag(dd->main_textbuffer,
-			"bold", "weight", PANGO_WEIGHT_BOLD, NULL);
-
-	gtk_widget_show(dd->main_textview);
-	gtk_container_add(GTK_CONTAINER(scrolledwindow_results), dd->main_textview);
-
-	/* status bar */
-	dd->statusbar = gtk_statusbar_new();
-	gtk_widget_show(dd->statusbar);
-	gtk_box_pack_end(GTK_BOX(main_box), dd->statusbar, FALSE, FALSE, 0);
-}
-
-
-const guint8 *dict_get_icon_data(void)
-{
-	return dict_icon_data;
-}
-
-
-void dict_about_dialog(GtkWidget *widget, DictData *dd)
-{
-	GtkWidget *dialog;
-	XfceAboutInfo *info;
-
-	info = xfce_about_info_new("xfce4-dict", VERSION,
-							   _("A client program to query different dictionaries."),
-							   XFCE_COPYRIGHT_TEXT("2006-2008", "Enrico Tröger"),
-							   XFCE_LICENSE_GPL);
-
-	xfce_about_info_add_credit(info, "Enrico Tröger", "enrico(dot)troeger(at)uvena(dot)de", _("Developer"));
-	xfce_about_info_set_homepage(info, "http://goodies.xfce.org");
-
-	dialog = xfce_about_dialog_new_with_values(GTK_WINDOW(widget), info, dd->icon);
-	g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), NULL);
-	gtk_window_set_title(GTK_WINDOW(dialog), "Xfce Dictionary");
-	gtk_dialog_run(GTK_DIALOG(dialog));
-
-	xfce_about_info_free(info);
-}
-
-
 void dict_drag_data_received(GtkWidget *widget, GdkDragContext *drag_context, gint x, gint y,
 							 GtkSelectionData *data, guint info, guint ltime, DictData *dd)
 {
@@ -1100,3 +385,18 @@
 }
 
 
+DictData *dict_create_dictdata()
+{
+	DictData *dd = g_new0(DictData, 1);
+
+	/* create a new DictData structure and fill relevant fields with NULL */
+
+	dd->searched_word = NULL;
+	dd->query_is_running = FALSE;
+	dd->query_status = NO_ERROR;
+	dd->panel_entry = NULL;
+
+	return dd;
+}
+
+

Modified: xfce4-dict/trunk/lib/common.h
===================================================================
--- xfce4-dict/trunk/lib/common.h	2008-03-30 05:59:30 UTC (rev 4136)
+++ xfce4-dict/trunk/lib/common.h	2008-03-30 09:01:41 UTC (rev 4137)
@@ -1,6 +1,6 @@
 /*  $Id$
  *
- *  Copyright 2007-2008 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
+ *  Copyright 2006-2008 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -52,8 +52,6 @@
 
 typedef struct
 {
-	XfcePanelPlugin *plugin; /* only used when loaded as panel plugin */
-
 	dict_mode_t mode;
 	web_mode_t web_mode;
 
@@ -73,10 +71,6 @@
 	GtkWidget *panel_entry_size_spinner;
 	GtkWidget *check_panel_entry;
 
-	GtkWidget *panel_button;
-	GtkWidget *panel_button_image;
-	GtkTooltips *tooltips;
-
 	gboolean show_panel_entry;
 	gint panel_entry_size;
 	gint port;
@@ -102,26 +96,20 @@
 	gchar *spell_dictionary;
 
 	GdkPixbuf *icon;
+
+	gboolean is_plugin;	/* specify whether the panel plugin loaded or not */
 } DictData;
 
 
-
-void dict_status_add(DictData *dd, const gchar *format, ...);
-void dict_set_panel_entry_text(DictData *dd, const gchar *text);
-void dict_clear_text_buffer(DictData *dd);
 void dict_free_data(DictData *dd);
 void dict_write_rc_file(DictData *dd);
 void dict_read_rc_file(DictData *dd);
 void dict_search_word(DictData *dd, const gchar *word);
-void dict_show_main_window(DictData *dd);
-void dict_properties_dialog(DictData *dd);
-void dict_about_dialog(GtkWidget *widget, DictData *dd);
-const guint8 *dict_get_icon_data(void);
 void dict_signal_cb(gint sig);
-void dict_create_main_window(DictData *dd);
-void dict_entry_activate_cb(GtkEntry *entry, DictData *dd);
 void dict_drag_data_received(GtkWidget *widget, GdkDragContext *drag_context, gint x, gint y,
 							 GtkSelectionData *data, guint info, guint ltime, DictData *dd);
 
+DictData *dict_create_dictdata();
 
+
 #endif

Modified: xfce4-dict/trunk/lib/dictd.c
===================================================================
--- xfce4-dict/trunk/lib/dictd.c	2008-03-30 05:59:30 UTC (rev 4136)
+++ xfce4-dict/trunk/lib/dictd.c	2008-03-30 09:01:41 UTC (rev 4137)
@@ -43,18 +43,17 @@
 #include <signal.h>
 #include <string.h>
 
-/* Simple forward declaration to avoid inclusion of libxfce4panel headers */
-typedef struct XfcePanelPlugin_t XfcePanelPlugin;
 
-
 #include "common.h"
 #include "dictd.h"
+#include "gui.h"
 
+
 #define BUF_SIZE 256
 
 
 
-static gint dict_open_socket(const gchar *host_name, gint port)
+static gint open_socket(const gchar *host_name, gint port)
 {
 	struct sockaddr_in addr;
 	struct hostent *host_p;
@@ -90,7 +89,7 @@
 }
 
 
-static void dict_send_command(gint fd, const gchar *str)
+static void send_command(gint fd, const gchar *str)
 {
 	gchar buf[256];
 	gint len = strlen (str);
@@ -100,7 +99,7 @@
 }
 
 
-static gboolean dict_process_server_response(DictData *dd)
+static gboolean process_server_response(DictData *dd)
 {
 	gint max_lines, i;
 	gint defs_found = 0;
@@ -216,13 +215,13 @@
 }
 
 
-static gchar *dict_get_answer(gint fd)
+static gchar *get_answer(gint fd)
 {
 	gboolean fol = FALSE;
 	gboolean sol = FALSE;
 	gboolean tol = FALSE;
 	GString *str = g_string_sized_new(100);
-	gchar c, *tmp;
+	gchar c;
 	gchar ec[3];
 
 	alarm(10); /* abort after 5 seconds, there should went wrong something */
@@ -262,22 +261,20 @@
 	alarm(0);
 
 	g_string_append_c(str, '\0');
-	tmp = str->str;
-	g_string_free(str, FALSE);
 
-	return tmp;
+	return g_string_free(str, FALSE);
 }
 
 
-static void dict_ask_server(DictData *dd)
+static void ask_server(DictData *dd)
 {
 	gint fd, i;
 	static gchar cmd[BUF_SIZE];
 
-	if ((fd = dict_open_socket(dd->server, dd->port)) == -1)
+	if ((fd = open_socket(dd->server, dd->port)) == -1)
 	{
 		dd->query_status = NO_CONNECTION;
-		g_idle_add((GSourceFunc) dict_process_server_response, dd);
+		g_idle_add((GSourceFunc) process_server_response, dd);
 		g_thread_exit(NULL);
 		return;
 	}
@@ -290,17 +287,17 @@
 	dd->dictionary[i] = '\0';
 
 	g_snprintf(cmd, BUF_SIZE, "define %s \"%s\"\n", dd->dictionary, dd->searched_word);
-	dict_send_command(fd, cmd);
+	send_command(fd, cmd);
 
 	/* and now, "append" again the rest of the dictionary string again */
 	dd->dictionary[i] = ' ';
 
-	dd->query_buffer = dict_get_answer(fd);
+	dd->query_buffer = get_answer(fd);
 	close(fd);
 
 	dd->query_is_running = FALSE;
 	/* delegate parsing the response and related GUI stuff to GTK's main thread through the main loop */
-	g_idle_add((GSourceFunc) dict_process_server_response, dd);
+	g_idle_add((GSourceFunc) process_server_response, dd);
 
 	g_thread_exit(NULL);
 }
@@ -314,12 +311,10 @@
 	}
 	else
 	{
-		dict_clear_text_buffer(dd);
+		dict_status_add(dd, _("Querying %s..."), dd->server);
 
-		dict_status_add(dd, _("Querying the server %s..."), dd->server);
-
 		/* start the thread to query the server */
-		g_thread_create((GThreadFunc) dict_ask_server, dd, FALSE, NULL);
+		g_thread_create((GThreadFunc) ask_server, dd, FALSE, NULL);
 	}
 }
 
@@ -337,16 +332,16 @@
 	host = gtk_entry_get_text(GTK_ENTRY(dd->server_entry));
 	port = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(dd->port_spinner));
 
-	if ((fd = dict_open_socket(host, port)) == -1)
+	if ((fd = open_socket(host, port)) == -1)
 	{
 		xfce_err(_("Could not connect to server."));
 		return FALSE;
 	}
 
-	dict_send_command(fd, "show databases");
+	send_command(fd, "show databases");
 
 	/* read all server output */
-	answer = buffer = dict_get_answer(fd);
+	answer = buffer = get_answer(fd);
 	close(fd);
 
 	/* go to next line */

Added: xfce4-dict/trunk/lib/gui.c
===================================================================
--- xfce4-dict/trunk/lib/gui.c	                        (rev 0)
+++ xfce4-dict/trunk/lib/gui.c	2008-03-30 09:01:41 UTC (rev 4137)
@@ -0,0 +1,280 @@
+/*  $Id$
+ *
+ *  Copyright 2006-2008 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  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 Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+/* Creation of main window and helper functions (GUI stuff). */
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <gtk/gtk.h>
+#include <libxfcegui4/libxfcegui4.h>
+
+#include "common.h"
+#include "gui.h"
+#include "inline-icon.h"
+
+
+
+void dict_set_panel_entry_text(DictData *dd, const gchar *text)
+{
+	if (dd->panel_entry != NULL)
+		gtk_entry_set_text(GTK_ENTRY(dd->panel_entry), text);
+}
+
+
+void dict_status_add(DictData *dd, const gchar *format, ...)
+{
+	static gchar string[512];
+	va_list args;
+
+	string[0] = ' ';
+	va_start(args, format);
+	g_vsnprintf(string + 1, (sizeof string) - 1, format, args);
+	va_end(args);
+
+	gtk_statusbar_pop(GTK_STATUSBAR(dd->statusbar), 1);
+	gtk_statusbar_push(GTK_STATUSBAR(dd->statusbar), 1, string);
+}
+
+
+void dict_clear_text_buffer(DictData *dd)
+{
+	GtkTextIter start_iter, end_iter;
+
+	gtk_text_buffer_get_start_iter(dd->main_textbuffer, &start_iter);
+	gtk_text_buffer_get_end_iter(dd->main_textbuffer, &end_iter);
+	gtk_text_buffer_delete(dd->main_textbuffer, &start_iter, &end_iter);
+}
+
+
+static void entry_activate_cb(GtkEntry *entry, DictData *dd)
+{
+	const gchar *entered_text = gtk_entry_get_text(GTK_ENTRY(dd->main_entry));
+
+	dict_search_word(dd, entered_text);
+}
+
+
+static void entry_button_clicked_cb(GtkButton *button, DictData *dd)
+{
+	entry_activate_cb(NULL, dd);
+	gtk_widget_grab_focus(dd->main_entry);
+}
+
+
+static void clear_button_clicked_cb(GtkButton *button, DictData *dd)
+{
+	dict_clear_text_buffer(dd);
+
+	/* clear the entries */
+	gtk_entry_set_text(GTK_ENTRY(dd->main_entry), "");
+	dict_set_panel_entry_text(dd, "");
+
+	dict_status_add(dd, _("Ready."));
+}
+
+
+static void search_mode_dict_toggled(GtkToggleButton *togglebutton, DictData *dd)
+{
+	if (gtk_toggle_button_get_active(togglebutton))
+	{
+		dd->mode = DICTMODE_DICT;
+		gtk_widget_grab_focus(dd->main_entry);
+	}
+}
+
+
+static void search_mode_web_toggled(GtkToggleButton *togglebutton, DictData *dd)
+{
+	if (gtk_toggle_button_get_active(togglebutton))
+	{
+		dd->mode = DICTMODE_WEB;
+		gtk_widget_grab_focus(dd->main_entry);
+	}
+}
+
+
+static void search_mode_spell_toggled(GtkToggleButton *togglebutton, DictData *dd)
+{
+	if (gtk_toggle_button_get_active(togglebutton))
+	{
+		dd->mode = DICTMODE_SPELL;
+		gtk_widget_grab_focus(dd->main_entry);
+	}
+}
+
+
+const guint8 *dict_get_icon_data(void)
+{
+	return dict_icon_data;
+}
+
+
+void dict_create_main_window(DictData *dd)
+{
+	GtkWidget *main_box;
+	GtkWidget *entry_box, *label_box, *entry_label, *entry_button, *clear_button;
+	GtkWidget *sep, *align, *scrolledwindow_results;
+	GdkPixbuf *icon;
+	GtkWidget *method_chooser, *radio, *label;
+
+	dd->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+	gtk_window_set_title(GTK_WINDOW(dd->window), "Xfce Dictionary");
+	gtk_window_set_default_size(GTK_WINDOW(dd->window), 500, 300);
+
+	icon = gdk_pixbuf_new_from_inline(-1, dict_icon_data, FALSE, NULL);
+	gtk_window_set_icon(GTK_WINDOW(dd->window), icon);
+	g_object_unref(icon);
+
+	main_box = gtk_vbox_new(FALSE, 0);
+	gtk_widget_show(main_box);
+	gtk_container_add(GTK_CONTAINER(dd->window), main_box);
+
+	/* entry box (label, entry, buttons) */
+	entry_box = gtk_hbox_new(FALSE, 10);
+	gtk_widget_show(entry_box);
+	gtk_container_set_border_width(GTK_CONTAINER(entry_box), 2);
+	gtk_box_pack_start(GTK_BOX(main_box), entry_box, FALSE, TRUE, 5);
+
+	label_box = gtk_hbox_new(FALSE, 5);
+	gtk_widget_show(label_box);
+	gtk_box_pack_start(GTK_BOX(entry_box), label_box, TRUE, TRUE, 0);
+
+	entry_label = gtk_label_new(_("Text to search:"));
+	gtk_widget_show(entry_label);
+	gtk_misc_set_alignment(GTK_MISC(entry_label), 1, 0.5);
+
+	align = gtk_alignment_new(1, 0.5, 0, 0);
+	gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 5, 0);
+	gtk_widget_show(align);
+	gtk_container_add(GTK_CONTAINER(align), entry_label);
+	gtk_box_pack_start(GTK_BOX(label_box), align, FALSE, FALSE, 2);
+
+	dd->main_entry = gtk_entry_new();
+	gtk_widget_show(dd->main_entry);
+	gtk_box_pack_start(GTK_BOX(label_box), dd->main_entry, TRUE, TRUE, 0);
+	g_signal_connect(dd->main_entry, "activate", G_CALLBACK(entry_activate_cb), dd);
+
+	entry_button = gtk_button_new_from_stock("gtk-find");
+	gtk_widget_show(entry_button);
+	gtk_box_pack_start(GTK_BOX(entry_box), entry_button, FALSE, FALSE, 0);
+	g_signal_connect(entry_button, "clicked", G_CALLBACK(entry_button_clicked_cb), dd);
+
+	clear_button = gtk_button_new_from_stock("gtk-clear");
+	gtk_widget_show(clear_button);
+	gtk_box_pack_start(GTK_BOX(entry_box), clear_button, FALSE, FALSE, 0);
+	g_signal_connect(clear_button, "clicked", G_CALLBACK(clear_button_clicked_cb), dd);
+
+	/* just make some space */
+	align = gtk_alignment_new(1, 0.5, 0, 0);
+	gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 10, 0);
+	gtk_widget_show(align);
+	gtk_container_add(GTK_CONTAINER(align), gtk_label_new(""));
+	gtk_box_pack_start(GTK_BOX(entry_box), align, FALSE, FALSE, 0);
+
+	dd->close_button = gtk_button_new_from_stock("gtk-close");
+	gtk_widget_show(dd->close_button);
+	gtk_box_pack_end(GTK_BOX(entry_box), dd->close_button, FALSE, FALSE, 2);
+
+	/* insert it here and it will(hopefully) be placed before the Close button */
+	sep = gtk_vseparator_new();
+	gtk_widget_show(sep);
+	gtk_box_pack_end(GTK_BOX(entry_box), sep, FALSE, FALSE, 5);
+
+	/* search method chooser */
+	method_chooser = gtk_hbox_new(FALSE, 0);
+	gtk_widget_show(method_chooser);
+	gtk_box_pack_start(GTK_BOX(main_box), method_chooser, FALSE, FALSE, 0);
+
+	label = gtk_label_new(_("Search with:"));
+	gtk_widget_show(label);
+	gtk_box_pack_start(GTK_BOX(method_chooser), label, FALSE, FALSE, 6);
+
+	radio = gtk_radio_button_new_with_label(NULL, _("Dict"));
+	gtk_widget_show(radio);
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), (dd->mode == DICTMODE_DICT));
+	g_signal_connect(radio, "toggled", G_CALLBACK(search_mode_dict_toggled), dd);
+	gtk_box_pack_start(GTK_BOX(method_chooser), radio, FALSE, FALSE, 6);
+
+	radio = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio), _("Web"));
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), (dd->mode == DICTMODE_WEB));
+	g_signal_connect(radio, "toggled", G_CALLBACK(search_mode_web_toggled), dd);
+	gtk_widget_show(radio);
+	gtk_box_pack_start(GTK_BOX(method_chooser), radio, FALSE, FALSE, 6);
+
+	radio = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio), _("Spellcheck"));
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), (dd->mode == DICTMODE_SPELL));
+	g_signal_connect(radio, "toggled", G_CALLBACK(search_mode_spell_toggled), dd);
+	gtk_widget_show(radio);
+	gtk_box_pack_start(GTK_BOX(method_chooser), radio, FALSE, FALSE, 6);
+
+	/* results area */
+	scrolledwindow_results = gtk_scrolled_window_new(NULL, NULL);
+	gtk_widget_show(scrolledwindow_results);
+	gtk_container_set_border_width(GTK_CONTAINER(scrolledwindow_results), 4);
+	gtk_box_pack_start(GTK_BOX(main_box), scrolledwindow_results, TRUE, TRUE, 0);
+	gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow_results),
+								GTK_SHADOW_IN);
+	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow_results),
+					GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+	/* searched words textview stuff */
+	dd->main_textview = gtk_text_view_new();
+	gtk_text_view_set_editable(GTK_TEXT_VIEW(dd->main_textview), FALSE);
+	gtk_text_view_set_left_margin(GTK_TEXT_VIEW(dd->main_textview), 5);
+	gtk_text_view_set_right_margin(GTK_TEXT_VIEW(dd->main_textview), 5);
+	gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(dd->main_textview), GTK_WRAP_WORD);
+	dd->main_textbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(dd->main_textview));
+	dd->main_boldtag = gtk_text_buffer_create_tag(dd->main_textbuffer,
+			"bold", "weight", PANGO_WEIGHT_BOLD, NULL);
+
+	gtk_widget_show(dd->main_textview);
+	gtk_container_add(GTK_CONTAINER(scrolledwindow_results), dd->main_textview);
+
+	/* status bar */
+	dd->statusbar = gtk_statusbar_new();
+	gtk_widget_show(dd->statusbar);
+	gtk_box_pack_end(GTK_BOX(main_box), dd->statusbar, FALSE, FALSE, 0);
+}
+
+
+void dict_about_dialog(GtkWidget *widget, DictData *dd)
+{
+	GtkWidget *dialog;
+	XfceAboutInfo *info;
+
+	info = xfce_about_info_new("xfce4-dict", VERSION,
+							   _("A client program to query different dictionaries."),
+							   XFCE_COPYRIGHT_TEXT("2006-2008", "Enrico Tröger"),
+							   XFCE_LICENSE_GPL);
+
+	xfce_about_info_add_credit(info, "Enrico Tröger", "enrico(dot)troeger(at)uvena(dot)de", _("Developer"));
+	xfce_about_info_set_homepage(info, "http://goodies.xfce.org");
+
+	dialog = xfce_about_dialog_new_with_values(GTK_WINDOW(widget), info, dd->icon);
+	g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), NULL);
+	gtk_window_set_title(GTK_WINDOW(dialog), "Xfce Dictionary");
+	gtk_dialog_run(GTK_DIALOG(dialog));
+
+	xfce_about_info_free(info);
+}


Property changes on: xfce4-dict/trunk/lib/gui.c
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Added: xfce4-dict/trunk/lib/gui.h
===================================================================
--- xfce4-dict/trunk/lib/gui.h	                        (rev 0)
+++ xfce4-dict/trunk/lib/gui.h	2008-03-30 09:01:41 UTC (rev 4137)
@@ -0,0 +1,33 @@
+/*  $Id$
+ *
+ *  Copyright 2006-2008 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  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 Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+#ifndef GUI_H
+#define GUI_H 1
+
+
+void dict_status_add(DictData *dd, const gchar *format, ...);
+void dict_create_main_window(DictData *dd);
+void dict_about_dialog(GtkWidget *widget, DictData *dd);
+void dict_clear_text_buffer(DictData *dd);
+void dict_set_panel_entry_text(DictData *dd, const gchar *text);
+const guint8 *dict_get_icon_data(void);
+
+
+#endif


Property changes on: xfce4-dict/trunk/lib/gui.h
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Added: xfce4-dict/trunk/lib/inline-icon.h
===================================================================
--- xfce4-dict/trunk/lib/inline-icon.h	                        (rev 0)
+++ xfce4-dict/trunk/lib/inline-icon.h	2008-03-30 09:01:41 UTC (rev 4137)
@@ -0,0 +1,420 @@
+/* GdkPixbuf RGBA C-Source image dump */
+
+#ifdef __SUNPRO_C
+#pragma align 4 (dict_icon_data)
+#endif
+#ifdef __GNUC__
+static const guint8 dict_icon_data[] __attribute__ ((__aligned__ (4))) = 
+#else
+static const guint8 dict_icon_data[] = 
+#endif
+{ ""
+  /* Pixbuf magic (0x47646b50) */
+  "GdkP"
+  /* length: header (24) + pixel_data (9216) */
+  "\0\0$\30"
+  /* pixdata_type (0x1010002) */
+  "\1\1\0\2"
+  /* rowstride (192) */
+  "\0\0\0\300"
+  /* width (48) */
+  "\0\0\0""0"
+  /* height (48) */
+  "\0\0\0""0"
+  /* pixel_data: */
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\252\252\252"
+  "\3\312\312\3125\313\313\313l\317\317\317\243\320\320\320\324\320\320"
+  "\320\351\322\322\322\367\324\324\324\367\323\323\323\361\321\321\321"
+  "\337\317\317\317\241\313\313\313S\377\377\377\2\306\306\306\11\315\315"
+  "\315\\\320\320\320\251\321\321\321\341\323\323\323\356\324\324\324\364"
+  "\322\322\322\366\317\317\317\351\313\313\313\330\311\311\311\257\306"
+  "\306\306y\306\306\306G\304\304\304\15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\317\317\317\20\315"
+  "\315\315`\317\317\317\300\315\315\315\366\326\326\326\362\350\350\350"
+  "\371\363\363\363\377\372\372\372\377\374\374\374\377\373\373\372\377"
+  "\367\370\367\377\364\365\363\377\361\362\360\377\351\352\350\377\333"
+  "\333\332\370\312\307\307\360y\0\0\377\330\331\327\370\352\353\352\377"
+  "\366\366\366\377\370\370\370\377\367\367\367\377\367\367\367\377\366"
+  "\366\366\377\364\364\364\377\355\355\355\377\341\341\341\374\320\320"
+  "\320\361\300\300\300\370\300\300\300\330\276\276\276\205\274\274\274"
+  ".\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\310\16\313\313\313]\317"
+  "\317\317\300\316\316\316\370\333\333\333\364\362\362\362\377\375\375"
+  "\375\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\375\375\375\377\366\366\365\377\357\360\355\377\346\347\344\377"
+  "\335\337\333\377\334\335\331\377\345\346\344\377\344\345\343\377y\0\0"
+  "\377\326\315\314\377\337\340\336\377\352\353\352\377\360\360\360\377"
+  "\356\356\356\377\355\355\355\377\354\354\354\377\353\353\353\377\355"
+  "\355\355\377\360\360\360\377\364\364\364\377\363\363\363\377\345\345"
+  "\345\377\320\320\320\371\274\274\274\363\271\271\271\343\266\266\266"
+  "t\270\270\270\22\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\314\314\314\5\314\314\314\377\326\326\326\365\352"
+  "\352\352\377\375\375\375\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\375\375\375\377\366\366\365\377\356\357\354\377\346\347\344\377"
+  "\335\337\333\377\324\326\321\377\311\314\306\377\313\315\307\377z\1\1"
+  "\377\256\223\220\377\331\332\327\377\352\353\352\377\357\357\357\377"
+  "\356\356\356\377\355\355\355\377\353\353\353\377\352\352\352\377\351"
+  "\351\351\377\350\350\350\377\346\346\346\377\351\351\351\377\357\357"
+  "\357\377\365\365\365\377\356\356\356\377\330\330\330\377\303\303\303"
+  "\365\261\261\261\377\231\231\231\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0""333\5Q<N\377\311\310\311\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\375\375\374\377\366\366\365\377\356\357\354\377\346\347\344"
+  "\377\335\337\333\377\324\326\321\377\311\314\306\377\277\302\273\377"
+  "}\4\4\377\230SR\377\331\333\330\377\353\353\352\377\357\357\357\377\356"
+  "\356\356\377\355\355\355\377\353\353\353\377\352\352\352\377\351\351"
+  "\351\377\347\347\347\377\346\346\346\377\345\345\345\377\343\343\343"
+  "\377\346\346\346\377\363\363\363\377\343\343\343\377\343\343\343\377"
+  "\254\253\254\377M8J\377333\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0;';'iZh\365\320\316\320\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\375\375\374"
+  "\377\364\365\364\377\355\357\354\377\345\347\344\377\334\336\332\377"
+  "\324\326\321\377\311\314\306\377\277\302\273\377\201\14\14\377\200\7"
+  "\7\377\332\333\330\377\352\352\351\377\357\357\357\377\356\356\356\377"
+  "\354\354\354\377\353\353\353\377\352\352\352\377\350\350\350\377\347"
+  "\347\347\377\346\346\346\377\344\344\344\377\343\343\343\377\343\343"
+  "\343\377\364\364\364\377\344\344\344\377\343\343\343\377\261\257\261"
+  "\377`O_\365;';'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0<%<L\201"
+  "r\200\366\330\327\330\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\374\374\373\377\364"
+  "\365\364\377\355\357\354\377\344\346\343\377\334\336\332\377\324\326"
+  "\321\377\311\314\306\377\277\302\273\377\221ea\377\202\11\11\377\321"
+  "\307\305\377\352\352\351\377\357\357\357\377\355\355\355\377\354\354"
+  "\354\377\353\353\353\377\352\352\352\377\350\350\350\377\347\347\347"
+  "\377\346\346\346\377\344\344\344\377\343\343\343\377\343\343\343\377"
+  "\360\360\360\377\350\350\350\377\343\343\343\377\266\265\267\377qbp\366"
+  "<%<L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\77&:r\224\212\224"
+  "\374\345\345\345\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\373\374\373\377\364\365"
+  "\363\377\354\355\353\377\344\346\343\377\334\335\331\377\323\325\320"
+  "\377\310\313\305\377\277\301\273\377\232\225\221\377\205\14\14\377\245"
+  "TS\377\352\353\352\377\356\356\356\377\355\355\355\377\354\354\354\377"
+  "\352\352\352\377\351\351\351\377\350\350\350\377\347\347\347\377\345"
+  "\345\345\377\344\344\344\377\343\343\343\377\343\343\343\377\355\355"
+  "\355\377\354\354\354\377\343\343\343\377\302\302\302\377|q{\374\77&:"
+  "r\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\77'<\242\252\244\253"
+  "\377\354\354\354\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\373\374\373\377\364\365"
+  "\363\377\354\355\353\377\344\346\343\377\334\335\331\377\322\324\317"
+  "\377\310\313\305\377\277\301\273\377\234\235\231\377\240SR\377\210\17"
+  "\17\377\314\247\247\377\356\356\356\377\355\355\355\377\354\354\354\377"
+  "\352\352\352\377\351\351\351\377\350\350\350\377\346\346\346\377\345"
+  "\345\345\377\344\344\344\377\343\343\343\377\343\343\343\377\351\351"
+  "\351\377\360\360\360\377\343\343\343\377\312\312\312\377\213\204\213"
+  "\377\77'<\242\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0@'<\317"
+  "\275\271\275\377\362\362\362\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\373\374\373"
+  "\377\364\365\363\377\354\355\353\377\344\346\343\377\334\335\331\377"
+  "\322\324\317\377\310\313\305\377\277\301\273\377\234\235\231\377\273"
+  "\262\256\377\213\21\21\377\215\26\26\377\342\323\323\377\355\355\355"
+  "\377\353\353\353\377\352\352\352\377\351\351\351\377\347\347\347\377"
+  "\346\346\346\377\345\345\345\377\344\344\344\377\343\343\343\377\343"
+  "\343\343\377\345\345\345\377\364\364\364\377\343\343\343\377\322\322"
+  "\322\377\226\222\226\377@'<\317\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0>'<\356\304\302\304\377\371\371\371\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\372\373\372\377\364\365\363\377\354\355\353\377\344\345\342\377"
+  "\333\335\331\377\321\324\317\377\310\313\305\377\276\301\273\377\234"
+  "\237\231\377\300\302\276\377\275\216\214\377\216\24\24\377\24077\377"
+  "\344\333\333\377\353\353\353\377\352\352\352\377\351\351\351\377\347"
+  "\347\347\377\346\346\346\377\345\345\345\377\343\343\343\377\343\343"
+  "\343\377\343\343\343\377\343\343\343\377\363\363\363\377\345\345\345"
+  "\377\333\333\333\377\232\231\233\377>'<\356\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0 at +@\14E.B\372\303\303\303\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\376"
+  "\376\376\377\372\373\372\377\364\365\363\377\354\355\353\377\344\345"
+  "\342\377\333\335\331\377\321\324\317\377\310\313\305\377\276\301\273"
+  "\377\235\237\232\377\300\302\276\377\332\332\330\377\251NN\377\227!!"
+  "\377\247BB\377\347\341\341\377\352\352\352\377\350\350\350\377\347\347"
+  "\347\377\346\346\346\377\344\344\344\377\343\343\343\377\343\343\343"
+  "\377\343\343\343\377\343\343\343\377\360\360\360\377\351\351\351\377"
+  "\342\342\342\377\234\233\234\377D-A\372 at +@\14\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0@%:0\\HZ\363\300\277\300\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\376\376"
+  "\376\377\372\373\372\377\364\365\363\377\354\355\353\377\344\345\342"
+  "\377\333\335\331\377\321\324\317\377\310\313\305\377\276\301\273\377"
+  "\234\236\231\377\300\302\276\377\333\334\331\377\345\335\334\377\242"
+  "66\377\24522\377\254NN\377\350\345\345\377\350\350\350\377\347\347\347"
+  "\377\345\345\345\377\344\344\344\377\343\343\343\377\343\343\343\377"
+  "\343\343\343\377\343\343\343\377\354\354\354\377\355\355\355\377\343"
+  "\343\343\377\237\236\237\377VBT\363@%:0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0>&;Wn^n\366\304\302\304\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\376\376\376\377"
+  "\372\372\372\377\363\364\362\377\354\355\352\377\343\345\342\377\333"
+  "\335\330\377\321\324\316\377\310\312\305\377\276\301\272\377\235\237"
+  "\232\377\301\303\277\377\333\334\331\377\351\352\351\377\340\316\316"
+  "\377\240--\377\255<<\377\265``\377\347\345\345\377\346\346\346\377\345"
+  "\345\345\377\344\344\344\377\343\343\343\377\343\343\343\377\343\343"
+  "\343\377\343\343\343\377\350\350\350\377\361\361\361\377\343\343\343"
+  "\377\246\244\246\377dTd\366>&;W\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\77';"
+  "}\177q\177\375\317\316\317\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\376\376\376\377"
+  "\371\371\371\377\363\364\362\377\354\355\352\377\342\344\341\377\333"
+  "\335\330\377\321\324\316\377\310\312\305\377\276\301\272\377\235\237"
+  "\233\377\301\303\277\377\332\333\331\377\351\352\351\377\355\355\355"
+  "\377\326\266\266\377\24411\377\260@@\377\275uu\377\346\346\346\377\345"
+  "\345\345\377\344\344\344\377\343\343\343\377\343\343\343\377\343\343"
+  "\343\377\343\343\343\377\344\344\344\377\364\364\364\377\343\343\343"
+  "\377\263\262\263\377ses\375\77';}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\77"
+  "(<\256\217\205\220\377\334\334\334\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\376\376"
+  "\376\377\371\371\371\377\363\364\362\377\354\355\352\377\342\344\341"
+  "\377\333\335\330\377\321\324\316\377\310\312\305\377\276\301\272\377"
+  "\235\237\233\377\301\302\277\377\332\334\331\377\352\352\351\377\355"
+  "\355\355\377\353\353\353\377\311\222\222\377\271KK\377\260@@\377\316"
+  "\244\244\377\345\345\345\377\343\343\343\377\343\343\343\377\343\343"
+  "\343\377\343\343\343\377\343\343\343\377\343\343\343\377\363\363\363"
+  "\377\346\346\346\377\301\301\301\377\177u\200\377\77(<\256\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\77)=\326\237\231\240\377\344\344\344\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\375\375\375\377\371\371\371\377\363\363\362\377\352"
+  "\353\351\377\342\344\340\377\332\335\330\377\321\323\316\377\310\312"
+  "\304\377\276\301\272\377\236\240\233\377\301\303\277\377\333\334\331"
+  "\377\352\352\351\377\354\354\354\377\353\353\353\377\352\351\351\377"
+  "\262QQ\377\316aa\377\253<<\377\337\325\325\377\343\343\343\377\343\343"
+  "\343\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343"
+  "\377\357\357\357\377\352\352\352\377\312\312\312\377\216\210\217\377"
+  "\77)=\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\77(<\365\250\245\251\377\355"
+  "\355\355\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\376\376\376\377\375\375\375\377\371\371\371\377"
+  "\362\362\361\377\352\353\351\377\342\344\340\377\332\335\330\377\321"
+  "\323\316\377\310\312\304\377\276\301\272\377\237\241\234\377\302\303"
+  "\277\377\333\334\331\377\351\351\351\377\354\354\354\377\353\353\353"
+  "\377\351\351\351\377\335\312\312\377\255<<\377\310XX\377\300tt\377\343"
+  "\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343"
+  "\343\377\343\343\343\377\353\353\353\377\355\355\355\377\323\323\323"
+  "\377\227\224\230\377\77(<\365\0\0\0\0\0\0\0\0\0\0\0\0=$=\25D+A\370\252"
+  "\250\252\377\367\367\367\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\376\376\376\377\375\375\375\377"
+  "\370\370\367\377\361\362\361\377\352\353\351\377\342\344\340\377\331"
+  "\334\327\377\321\323\316\377\310\312\304\377\276\301\272\377\237\241"
+  "\235\377\302\303\277\377\332\333\331\377\351\352\351\377\354\354\354"
+  "\377\352\352\352\377\351\351\351\377\350\350\350\377\270\\\\\377\313"
+  "UU\377\255;;\377\335\323\323\377\343\343\343\377\343\343\343\377\343"
+  "\343\343\377\343\343\343\377\343\343\343\377\347\347\347\377\361\361"
+  "\361\377\335\335\335\377\233\231\233\377D+A\370=$=\25\0\0\0\0\0\0\0\0"
+  "='=;N9N\361\250\247\250\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\376\376\376\377\375"
+  "\375\375\377\370\370\367\377\361\362\361\377\352\353\351\377\342\344"
+  "\340\377\331\334\327\377\321\323\316\377\307\312\304\377\275\300\272"
+  "\377\237\241\235\377\302\304\300\377\333\334\331\377\351\352\351\377"
+  "\354\354\354\377\352\352\352\377\351\351\351\377\350\350\350\377\316"
+  "\236\236\377\274FF\377\274EE\377\313\227\227\377\343\343\343\377\343"
+  "\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377\344\344"
+  "\344\377\364\364\364\377\343\343\343\377\233\233\233\377M8M\361='=;\0"
+  "\0\0\0\0\0\0\0=%:`_M_\366\252\251\252\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\376"
+  "\376\376\377\374\374\374\377\370\370\367\377\361\362\361\377\351\352"
+  "\350\377\342\344\340\377\331\334\327\377\321\323\316\377\307\312\304"
+  "\377\275\300\272\377\240\242\235\377\303\304\301\377\333\334\331\377"
+  "\351\352\351\377\353\353\353\377\352\352\352\377\351\351\351\377\347"
+  "\347\347\377\334\306\306\377\262\77\77\377\302BB\377\273__\377\343\343"
+  "\343\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343"
+  "\377\343\343\343\377\362\362\362\377\347\347\347\377\240\237\240\377"
+  "]K]\366=%:`\0\0\0\0\0\0\0\0\77%<\211m\\m\376\261\260\262\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\375\375\375\377\374\374\374\377\370\370\367\377\360"
+  "\361\357\377\351\352\347\377\342\344\340\377\331\333\327\377\320\323"
+  "\316\377\307\312\304\377\275\300\271\377\241\243\236\377\303\304\301"
+  "\377\333\334\332\377\351\351\350\377\353\353\353\377\352\352\352\377"
+  "\351\351\351\377\347\347\347\377\343\336\336\377\25788\377\30299\377"
+  "\264CC\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343"
+  "\377\343\343\343\377\343\343\343\377\356\356\356\377\352\352\352\377"
+  "\250\246\250\377kZk\376\77%<\211\0\0\0\0\0\0\0\0A'>\271xly\377\301\300"
+  "\301\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\376\376\376\377\376\376\376\377\375\375\375\377\372"
+  "\372\372\377\367\367\366\377\362\362\361\377\353\355\352\377\343\344"
+  "\341\377\323\326\321\377\307\312\304\377\275\300\271\377\241\243\236"
+  "\377\303\305\301\377\334\335\334\377\357\357\357\377\362\362\362\377"
+  "\362\362\362\377\362\362\362\377\361\361\361\377\360\360\360\377\260"
+  "66\377\272++\377\26199\377\344\344\344\377\343\343\343\377\343\343\343"
+  "\377\343\343\343\377\343\343\343\377\343\343\343\377\352\352\352\377"
+  "\356\356\356\377\265\264\265\377wkx\377A'>\271\0\0\0\0\0\0\0\0@'<\340"
+  "\206|\207\377\322\322\322\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\376\376\376\377\366\366\366\377\353\353\353\377\341\341\341\377"
+  "\332\332\332\377\322\322\322\377\321\321\321\377\333\333\332\377\341"
+  "\342\341\377\350\350\347\377\355\356\354\377\342\343\340\377\304\307"
+  "\300\377\254\255\251\377\340\341\337\377\360\361\360\377\350\350\350"
+  "\377\336\336\336\377\325\325\325\377\313\313\313\377\314\314\314\377"
+  "\320\313\313\377\26177\377\263\34\34\377\26066\377\364\364\364\377\362"
+  "\362\362\377\356\356\356\377\351\351\351\377\344\344\344\377\343\343"
+  "\343\377\347\347\347\377\362\362\362\377\303\303\303\377\206|\206\377"
+  "@'<\340\0\0\0\0\0\0\0\1@)>\372\223\215\224\377\340\340\340\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\372\372\372\377\353\353\353"
+  "\377\317\317\317\377\261\261\260\377\236\236\236\377\240\240\240\377"
+  "\241\242\240\377\240\242\237\377\240\242\236\377\242\244\240\377\242"
+  "\244\237\377\241\243\237\377\241\242\237\377\237\237\236\377\241\241"
+  "\241\377\315\315\313\377\351\352\350\377\337\337\335\377\306\307\306"
+  "\377\241\241\241\377\237\237\236\377\242\242\240\377\243\245\241\377"
+  "\245\247\243\377\245\247\243\377\247\206\204\377\25755\377\254\20\20"
+  "\377\26098\377\235\236\235\377\256\256\255\377\310\310\310\377\342\342"
+  "\342\377\360\360\360\377\360\360\360\377\352\352\352\377\365\365\365"
+  "\377\316\316\316\377\222\214\222\377@)>\372\0\0\0\1>#>\35D-C\365\231"
+  "\227\232\377\356\356\356\377\367\367\367\377\336\336\336\377\270\270"
+  "\270\377\241\241\241\377\235\235\233\377\237\240\233\377\250\254\244"
+  "\377\260\264\253\377\255\260\247\377\251\254\244\377\245\251\240\377"
+  "\244\251\237\377\244\250\237\377\245\251\240\377\247\253\242\377\252"
+  "\256\246\377\257\264\253\377\255\261\250\377\234\235\232\377\251\251"
+  "\250\377\243\243\242\377\234\235\233\377\257\261\253\377\263\267\256"
+  "\377\261\265\255\377\262\264\255\377\262\264\255\377\263\265\257\377"
+  "\261ro\377\252\37\37\377\246\12\12\377\261DC\377\270\273\264\377\262"
+  "\264\256\377\245\246\242\377\236\236\235\377\240\240\240\377\266\266"
+  "\266\377\330\330\330\377\357\357\357\377\333\333\333\377\230\225\230"
+  "\377D-C\365>#>\35@&<DK5I\361\233\233\233\377\246\246\246\377\242\243"
+  "\242\377\231\231\226\377\241\244\236\377\257\263\252\377\255\261\250"
+  "\377\245\251\237\377\237\243\230\377\232\236\224\377\232\237\224\377"
+  "\233\240\225\377\235\241\227\377\236\242\230\377\237\243\231\377\240"
+  "\245\233\377\242\246\234\377\243\247\235\377\245\251\241\377\256\261"
+  "\251\377\264\267\257\377\246\250\243\377\246\250\242\377\264\270\260"
+  "\377\262\264\255\377\256\261\251\377\256\261\251\377\257\263\253\377"
+  "\260\264\254\377\262\265\255\377\260EC\377\253\"\"\377\252\36\36\377"
+  "\260TR\377\270\273\264\377\271\274\265\377\272\275\266\377\272\275\266"
+  "\377\272\275\266\377\253\257\251\377\235\236\233\377\241\242\241\377"
+  "\245\245\245\377\233\233\233\377K5I\361@&<D\77&<jZGZ\367\222\223\221"
+  "\377\233\240\230\377\262\266\255\377\263\266\256\377\254\260\250\377"
+  "\245\251\237\377\242\247\234\377\245\251\240\377\247\253\241\377\251"
+  "\254\243\377\252\256\245\377\253\257\246\377\254\260\246\377\255\260"
+  "\250\377\253\257\246\377\251\255\244\377\247\253\242\377\255\262\251"
+  "\377\261\264\254\377\243\246\237\377\223\223\220\377\216\216\213\377"
+  "\215\215\213\377\223\223\220\377\243\246\240\377\262\266\257\377\264"
+  "\267\257\377\262\265\255\377\264\267\260\377\265\264\254\377\26066\377"
+  "\261DC\377\26066\377\262[Y\377\271\275\265\377\273\276\267\377\272\275"
+  "\266\377\272\275\266\377\272\275\266\377\272\275\266\377\272\275\266"
+  "\377\272\275\266\377\254\256\251\377\222\223\221\377ZGZ\367\77&<j>%;"
+  "\227gYg\377\207\210\204\377\246\252\241\377\262\266\255\377\252\255\245"
+  "\377\250\253\243\377\245\251\242\377\242\246\236\377\240\244\234\377"
+  "\236\241\232\377\232\234\226\377\227\231\224\377\227\231\223\377\225"
+  "\226\222\377\226\226\222\377\232\234\226\377\242\245\236\377\257\262"
+  "\253\377\237\243\235\377\210\211\206\377wov\377bQd\377YB\\\377YB\\\377"
+  "bQd\377wov\377\207\211\205\377\240\244\236\377\260\263\255\377\244\247"
+  "\240\377\235\232\224\377\231\222\217\377\227\230\224\377\236\202~\377"
+  "\243sp\377\233\235\230\377\241\243\236\377\244\247\241\377\250\252\245"
+  "\377\253\256\247\377\256\262\253\377\261\264\256\377\264\267\257\377"
+  "\267\271\263\377\220\221\216\377gYg\377>%;\227@'=\304sis\377\210\212"
+  "\205\377\206\207\203\377\204\204\202\377\203\202\200\377\201\177\177"
+  "\377~y{\377ysx\377tks\377nbo\377j]k\377gYi\377gYi\377gYi\377gYi\377i"
+  "\\k\377sjs\377\207\210\204\377\203\202\201\377hSk\377ZA^\377S9W\377R"
+  "8V\377R8V\377S9W\377ZA^\377hSk\377\203\202\202\377\210\211\205\377tk"
+  "t\377j\\k\377gYi\377gYi\377gYi\377gYi\377i\\k\377mam\377tjs\377ysx\377"
+  "\177y}\377\203\200\200\377\205\203\202\377\206\206\204\377\207\210\204"
+  "\377\210\212\205\377sis\377@'=\304\77(<\350fPi\377iSm\377hQk\377hQk\377"
+  "hQk\377hQk\377hQk\377hQk\377hQk\377hQk\377hQk\377hQk\377hQk\377hQk\377"
+  "hQk\377hQk\377hQk\377iTm\377O9M\372G1E\373^G_\377hQk\377fOi\377fOi\377"
+  "hQk\377^G_\377G1E\373N8M\372iTm\377hQk\377hQk\377hQk\377hQk\377hQk\377"
+  "hQk\377hQk\377hQk\377hQk\377hQk\377hQk\377hQk\377hQk\377hQk\377hQk\377"
+  "iSm\377fPi\377\77(<\350>&;\377\77'<\377@(=\377@(=\377@(=\377@(=\377@"
+  "(=\377@(=\377@(=\377@(=\377@(=\377@(=\377@(=\377@(=\377@(=\377@(=\377"
+  "@(=\377@(=\377@(=\377B-\77\316F8D\226A,\77\334A)=\365D,A\370D,A\370A"
+  ")=\365A,\77\334F8D\226B,A\315@(=\377@(=\377@(=\377@(=\377@(=\377@(=\377"
+  "@(=\377@(=\377@(=\377@(=\377@(=\377@(=\377@(=\377@(=\377@(=\377@(=\377"
+  "@(=\377\77'<\377>&;\377\0\0\0\0\0\0\0\0\0\0\0\0UUU\3```\10NNN\15UUU\22"
+  "Q]Q\26XXN\32RZR\37WWP#UUU'SYS+WWQ/WWR2UUU6UUU9UUU<VVR>TXT at UYQBTXTCVV"
+  "SDRRNKRRNKVVSDTXTCUYQBTXT at VVR>UUU<UUU9UUU6WWR2WWQ/SYS+UUU'WWP#RZR\37"
+  "XXN\32Q]Q\26UUU\22NNN\15```\10UUU\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1fff\5MMM\12[[[\16UUU\22U"
+  "UU\25R\\R\31R[R\34RZR\37SZS\"SZS%SYS(UUU*WWQ,SYS.WWQ/UUU0SXS1SXS1SXS"
+  "1SXS1UUU0WWQ/SYS.WWQ,UUU*SYS(SZS%SZS\"RZR\37R[R\34R\\R\31UUU\25UUU\22"
+  "[[[\16MMM\12fff\5\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\200\200\200\2fff\5UUU\11UUU\14UUU\17ZZZ\21YYY\24Q]Q\26UUU\30R"
+  "\\R\31UUU\33R[R\34XXO\35XXO\35UUU\36UUU\36XXO\35XXO\35R[R\34UUU\33R\\"
+  "R\31UUU\30Q]Q\26YYY\24ZZZ\21UUU\17UUU\14UUU\11fff\5\200\200\200\2\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\200\200"
+  "\200\2@@@\4fff\5UUU\6mmm\7```\10UUU\11MMM\12MMM\12UUU\11```\10mmm\7U"
+  "UU\6fff\5@@@\4\200\200\200\2\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
+
+


Property changes on: xfce4-dict/trunk/lib/inline-icon.h
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Added: xfce4-dict/trunk/lib/libdict.h
===================================================================
--- xfce4-dict/trunk/lib/libdict.h	                        (rev 0)
+++ xfce4-dict/trunk/lib/libdict.h	2008-03-30 09:01:41 UTC (rev 4137)
@@ -0,0 +1,31 @@
+/*  $Id$
+ *
+ *  Copyright 2006-2008 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  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 Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+#ifndef LIBDICT_H
+#define LIBDICT_H 1
+
+#include "common.h"
+#include "aspell.h"
+#include "dictd.h"
+#include "prefs.h"
+#include "gui.h"
+
+
+#endif


Property changes on: xfce4-dict/trunk/lib/libdict.h
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Added: xfce4-dict/trunk/lib/prefs.c
===================================================================
--- xfce4-dict/trunk/lib/prefs.c	                        (rev 0)
+++ xfce4-dict/trunk/lib/prefs.c	2008-03-30 09:01:41 UTC (rev 4137)
@@ -0,0 +1,432 @@
+/*  $Id$
+ *
+ *  Copyright 2006-2008 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  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 Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+/* Preferences dialog and helper functions. */
+
+
+#include <string.h>
+#include <gtk/gtk.h>
+#include <libxfcegui4/libxfcegui4.h>
+
+#include "common.h"
+#include "prefs.h"
+#include "dictd.h"
+
+
+
+static void show_panel_entry_toggled(GtkToggleButton *tb, DictData *dd)
+{
+	gtk_widget_set_sensitive(dd->panel_entry_size_spinner, gtk_toggle_button_get_active(tb));
+	gtk_widget_set_sensitive(dd->panel_entry_size_label, gtk_toggle_button_get_active(tb));
+}
+
+
+static void use_webserver_toggled(GtkToggleButton *tb, DictData *dd)
+{
+	gtk_widget_set_sensitive(dd->web_entry, gtk_toggle_button_get_active(tb));
+	gtk_widget_set_sensitive(dd->web_entry_label, gtk_toggle_button_get_active(tb));
+}
+
+
+static void get_spell_dictionaries(DictData *dd)
+{
+	if (NZV(dd->spell_bin))
+	{
+		gchar *tmp = NULL, *cmd, *locale_cmd;
+
+		cmd = g_strconcat(dd->spell_bin, " dump dicts", NULL);
+		locale_cmd = g_locale_from_utf8(cmd, -1, NULL, NULL, NULL);
+		if (locale_cmd == NULL)
+			locale_cmd = g_strdup(cmd);
+		g_spawn_command_line_sync(locale_cmd, &tmp, NULL, NULL, NULL);
+		if (NZV(tmp))
+		{
+			gchar **list = g_strsplit_set(tmp, "\n\r", -1);
+			gchar *item;
+			guint i, len = g_strv_length(list);
+			for (i = 0; i < len; i++)
+			{
+				item = g_strstrip(list[i]);
+				gtk_combo_box_append_text(GTK_COMBO_BOX(dd->spell_combo), item);
+				if (strcmp(dd->spell_dictionary, item) == 0)
+					gtk_combo_box_set_active(GTK_COMBO_BOX(dd->spell_combo), i);
+			}
+			g_strfreev(list);
+		}
+
+		g_free(cmd);
+		g_free(locale_cmd);
+		g_free(tmp);
+	}
+}
+
+
+void dict_prefs_dialog_response(GtkWidget *dlg, gint response, DictData *dd)
+{
+	if (response == GTK_RESPONSE_OK)
+	{
+		gchar *tmp;
+		/* MODE DICT */
+		tmp = gtk_combo_box_get_active_text(GTK_COMBO_BOX(dd->dict_combo));
+		if (tmp == NULL || tmp[0] == '0' || tmp[0] == '-')
+		{
+			xfce_err(_("You have chosen an invalid dictionary entry."));
+			g_free(tmp);
+			return;
+		}
+
+		dd->port = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(dd->port_spinner));
+
+		g_free(dd->server);
+		dd->server = g_strdup(gtk_entry_get_text(GTK_ENTRY(dd->server_entry)));
+
+		g_free(dd->dictionary);
+		dd->dictionary = tmp;
+
+		/* MODE WEB */
+		if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dd->web_radio_leo_gereng)))
+			dd->web_mode = WEBMODE_LEO_GERENG;
+		else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dd->web_radio_leo_gerfre)))
+			dd->web_mode = WEBMODE_LEO_GERFRE;
+		else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dd->web_radio_leo_gerspa)))
+			dd->web_mode = WEBMODE_LEO_GERSPA;
+		else
+		{
+			dd->web_mode = WEBMODE_OTHER;
+
+			g_free(dd->web_url);
+			dd->web_url = g_strdup(gtk_entry_get_text(GTK_ENTRY(dd->web_entry)));
+		}
+
+		/* MODE SPELL */
+		tmp = gtk_combo_box_get_active_text(GTK_COMBO_BOX(dd->spell_combo));
+		if (NZV(tmp))
+		{
+			g_free(dd->spell_dictionary);
+			dd->spell_dictionary = tmp;
+		}
+
+		g_free(dd->spell_bin);
+		dd->spell_bin = g_strdup(gtk_entry_get_text(GTK_ENTRY(dd->spell_entry)));
+
+		/* general settings */
+		dd->show_panel_entry = gtk_toggle_button_get_active(
+								GTK_TOGGLE_BUTTON(dd->check_panel_entry));
+		dd->panel_entry_size = gtk_spin_button_get_value_as_int(
+								GTK_SPIN_BUTTON(dd->panel_entry_size_spinner));
+
+		/* save settings */
+		dict_write_rc_file(dd);
+	}
+	gtk_widget_destroy(dlg);
+}
+
+
+GtkWidget *dict_prefs_dialog_show(DictData *dd)
+{
+	GtkWidget *dlg, *header, *vbox, *label3;
+
+	dlg = gtk_dialog_new_with_buttons(_("Properties"),
+				GTK_WINDOW(dd->window),
+				GTK_DIALOG_DESTROY_WITH_PARENT |
+				GTK_DIALOG_NO_SEPARATOR,
+				GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+				GTK_STOCK_CLOSE, GTK_RESPONSE_OK,
+				NULL);
+
+	gtk_window_set_position(GTK_WINDOW(dlg), GTK_WIN_POS_CENTER);
+
+	gtk_container_set_border_width(GTK_CONTAINER(dlg), 2);
+
+	header = xfce_create_header(NULL, _("Dictionary plugin"));
+	gtk_container_set_border_width(GTK_CONTAINER(header), 6);
+	gtk_widget_show(header);
+	gtk_box_pack_start(GTK_BOX(GTK_DIALOG (dlg)->vbox), header, FALSE, TRUE, 0);
+
+	vbox = gtk_vbox_new(FALSE, 3);
+	gtk_container_set_border_width(GTK_CONTAINER(vbox), 6);
+	gtk_widget_show(vbox);
+	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->vbox), vbox, TRUE, TRUE, 0);
+
+	/*
+	 * Mode: DICT
+	 */
+	 {
+		GtkWidget *label1, *label2, *table, *button_get_list, *frame1;
+
+		/* server address */
+		label1 = gtk_label_new_with_mnemonic(_("Server:"));
+		gtk_widget_show(label1);
+
+		dd->server_entry = gtk_entry_new();
+		gtk_entry_set_max_length(GTK_ENTRY(dd->server_entry), 256);
+		if (dd->server != NULL)
+		{
+			gtk_entry_set_text(GTK_ENTRY(dd->server_entry), dd->server);
+		}
+		gtk_widget_show(dd->server_entry);
+
+		/* server port */
+		label2 = gtk_label_new_with_mnemonic(_("Server Port:"));
+		gtk_widget_show(label2);
+
+		dd->port_spinner = gtk_spin_button_new_with_range(0.0, 65536.0, 1.0);
+		gtk_spin_button_set_value(GTK_SPIN_BUTTON(dd->port_spinner), dd->port);
+		gtk_widget_show(dd->port_spinner);
+
+		/* dictionary */
+		label3 = gtk_label_new_with_mnemonic(_("Dictionary:"));
+		gtk_widget_show(label3);
+
+		dd->dict_combo = gtk_combo_box_new_text();
+		gtk_combo_box_append_text(GTK_COMBO_BOX(dd->dict_combo), _("* (use all)"));
+		gtk_combo_box_append_text(GTK_COMBO_BOX(dd->dict_combo),
+											_("! (use all, stop after first match)"));
+		gtk_combo_box_append_text(GTK_COMBO_BOX(dd->dict_combo), "----------------");
+		if (dd->dictionary != NULL)
+		{
+			if (dd->dictionary[0] == '*')
+				gtk_combo_box_set_active(GTK_COMBO_BOX(dd->dict_combo), 0);
+			else if (dd->dictionary[0] == '!')
+				gtk_combo_box_set_active(GTK_COMBO_BOX(dd->dict_combo), 1);
+			else
+			{
+				gtk_combo_box_append_text(GTK_COMBO_BOX(dd->dict_combo), dd->dictionary);
+				gtk_combo_box_set_active(GTK_COMBO_BOX(dd->dict_combo), 3);
+			}
+		}
+
+		gtk_widget_show(dd->dict_combo);
+
+		button_get_list = gtk_button_new_from_stock("gtk-find");
+		gtk_widget_show(button_get_list);
+		g_signal_connect(button_get_list, "clicked", G_CALLBACK(dict_get_dict_list_cb), dd);
+
+
+		/* put it all together */
+		table = gtk_table_new(3, 3, FALSE);
+		gtk_widget_show(table);
+		gtk_table_set_row_spacings(GTK_TABLE(table), 5);
+		gtk_table_set_col_spacings(GTK_TABLE(table), 5);
+
+		gtk_table_attach(GTK_TABLE(table), label1, 0, 1, 0, 1,
+						(GtkAttachOptions) (GTK_FILL),
+						(GtkAttachOptions) (0), 5, 5);
+		gtk_misc_set_alignment(GTK_MISC(label1), 1, 0);
+
+		gtk_table_attach(GTK_TABLE(table), dd->server_entry, 1, 2, 0, 1,
+						(GtkAttachOptions) (GTK_FILL),
+						(GtkAttachOptions) (0), 5, 5);
+
+		gtk_table_attach(GTK_TABLE(table), label2, 0, 1, 1, 2,
+						(GtkAttachOptions) (GTK_FILL),
+						(GtkAttachOptions) (0), 5, 0);
+		gtk_misc_set_alignment(GTK_MISC(label2), 1, 0);
+
+		gtk_table_attach(GTK_TABLE(table), dd->port_spinner, 1, 2, 1, 2,
+						(GtkAttachOptions) (GTK_FILL),
+						(GtkAttachOptions) (0), 5, 5);
+
+		gtk_table_attach(GTK_TABLE(table), label3, 0, 1, 2, 3,
+						(GtkAttachOptions) (GTK_FILL),
+						(GtkAttachOptions) (0), 5, 0);
+		gtk_misc_set_alignment(GTK_MISC(label3), 1, 0);
+
+		gtk_table_attach(GTK_TABLE(table), dd->dict_combo, 1, 2, 2, 3,
+						(GtkAttachOptions) (GTK_FILL),
+						(GtkAttachOptions) (0), 0, 0);
+
+		gtk_table_attach(GTK_TABLE(table), button_get_list, 2, 3, 2, 3,
+						(GtkAttachOptions) (GTK_FILL),
+						(GtkAttachOptions) (0), 5, 5);
+
+
+		frame1 = gtk_frame_new(_("Use a DICT server"));
+		gtk_frame_set_shadow_type(GTK_FRAME(frame1), GTK_SHADOW_ETCHED_OUT);
+		gtk_widget_show(frame1);
+		gtk_container_set_border_width(GTK_CONTAINER(frame1), 3);
+		gtk_container_add(GTK_CONTAINER(frame1), table);
+		gtk_box_pack_start(GTK_BOX(vbox), frame1, FALSE, FALSE, 0);
+	}
+
+	/*
+	 * Mode: WEB
+	 */
+	{
+		GtkWidget  *web_vbox, *entry_hbox, *help_label, *frame2;
+		GSList *web_type;
+
+		web_vbox = gtk_vbox_new(FALSE, 5);
+		gtk_widget_show(web_vbox);
+
+		dd->web_radio_leo_gereng = gtk_radio_button_new_with_label(NULL,
+													_("dict.leo.org - German <-> English"));
+		web_type = gtk_radio_button_get_group(GTK_RADIO_BUTTON(dd->web_radio_leo_gereng));
+		if (dd->web_mode == WEBMODE_LEO_GERENG)
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dd->web_radio_leo_gereng), TRUE);
+		gtk_widget_show(dd->web_radio_leo_gereng);
+		gtk_box_pack_start(GTK_BOX(web_vbox), dd->web_radio_leo_gereng, FALSE, FALSE, 0);
+
+		dd->web_radio_leo_gerfre = gtk_radio_button_new_with_label(web_type,
+													_("dict.leo.org - German <-> French"));
+		web_type = gtk_radio_button_get_group(GTK_RADIO_BUTTON(dd->web_radio_leo_gerfre));
+		if (dd->web_mode == WEBMODE_LEO_GERFRE)
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dd->web_radio_leo_gerfre), TRUE);
+		gtk_widget_show(dd->web_radio_leo_gerfre);
+		gtk_box_pack_start(GTK_BOX(web_vbox), dd->web_radio_leo_gerfre, FALSE, FALSE, 0);
+
+		dd->web_radio_leo_gerspa = gtk_radio_button_new_with_label(web_type,
+													_("dict.leo.org - German <-> Spanish"));
+		web_type = gtk_radio_button_get_group(GTK_RADIO_BUTTON(dd->web_radio_leo_gerspa));
+		if (dd->web_mode == WEBMODE_LEO_GERSPA)
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dd->web_radio_leo_gerspa), TRUE);
+		gtk_widget_show(dd->web_radio_leo_gerspa);
+		gtk_box_pack_start(GTK_BOX(web_vbox), dd->web_radio_leo_gerspa, FALSE, FALSE, 0);
+
+		dd->web_radio_other = gtk_radio_button_new_with_label(web_type, _("Use another website"));
+		if (dd->web_mode == WEBMODE_OTHER)
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dd->web_radio_other), TRUE);
+		gtk_widget_show(dd->web_radio_other);
+		g_signal_connect(G_OBJECT(dd->web_radio_other), "toggled",
+												G_CALLBACK(use_webserver_toggled), dd);
+		gtk_box_pack_start(GTK_BOX(web_vbox), dd->web_radio_other, FALSE, FALSE, 0);
+
+		dd->web_entry_label = gtk_label_new_with_mnemonic(_("URL:"));
+		gtk_widget_show(dd->web_entry_label);
+		dd->web_entry = gtk_entry_new();
+		if (dd->web_url != NULL)
+			gtk_entry_set_text(GTK_ENTRY(dd->web_entry), dd->web_url);
+		gtk_widget_show(dd->web_entry);
+
+		entry_hbox = gtk_hbox_new(FALSE, 0);
+		gtk_widget_show(entry_hbox);
+		gtk_box_pack_start(GTK_BOX(entry_hbox), dd->web_entry_label, FALSE, TRUE, 5);
+		gtk_box_pack_start(GTK_BOX(entry_hbox), dd->web_entry, FALSE, FALSE, 0);
+		gtk_box_pack_start(GTK_BOX(web_vbox), entry_hbox, FALSE, FALSE, 0);
+
+		help_label = gtk_label_new(_("Enter an URL to a web site which offer translation services.\nUse {word} as placeholder for the searched word."));
+		gtk_label_set_line_wrap(GTK_LABEL(help_label), TRUE);
+		gtk_misc_set_alignment(GTK_MISC(help_label), 0, 0);
+		gtk_widget_show(help_label);
+		gtk_box_pack_start(GTK_BOX(web_vbox), help_label, TRUE, TRUE, 0);
+
+		frame2 = gtk_frame_new(_("Use a web site"));
+		gtk_frame_set_shadow_type(GTK_FRAME(frame2), GTK_SHADOW_ETCHED_OUT);
+		gtk_widget_show(frame2);
+		gtk_container_set_border_width(GTK_CONTAINER(frame2), 3);
+		gtk_container_add(GTK_CONTAINER(frame2), web_vbox);
+		gtk_box_pack_start(GTK_BOX(vbox), frame2, TRUE, TRUE, 0);
+	}
+
+	/*
+	 * Mode: ASPELL
+	 */
+	{
+		GtkWidget *label4, *label5, *table, *frame3;
+
+		label4 = gtk_label_new_with_mnemonic(_("Aspell program:"));
+		gtk_widget_show(label4);
+
+		dd->spell_entry = gtk_entry_new();
+		gtk_entry_set_max_length(GTK_ENTRY(dd->spell_entry), 256);
+		if (dd->spell_bin != NULL)
+		{
+			gtk_entry_set_text(GTK_ENTRY(dd->spell_entry), dd->spell_bin);
+		}
+		gtk_widget_show(dd->spell_entry);
+
+		label5 = gtk_label_new_with_mnemonic(_("Dictionary:"));
+		gtk_widget_show(label5);
+
+		dd->spell_combo = gtk_combo_box_new_text();
+		get_spell_dictionaries(dd);
+		gtk_widget_show(dd->spell_combo);
+
+		table = gtk_table_new(2, 2, FALSE);
+		gtk_widget_show(table);
+		gtk_table_set_row_spacings(GTK_TABLE(table), 5);
+		gtk_table_set_col_spacings(GTK_TABLE(table), 5);
+
+		gtk_table_attach(GTK_TABLE(table), label4, 0, 1, 0, 1,
+						(GtkAttachOptions) (GTK_FILL),
+						(GtkAttachOptions) (0), 5, 5);
+		gtk_misc_set_alignment(GTK_MISC(label4), 1, 0);
+
+		gtk_table_attach(GTK_TABLE(table), dd->spell_entry, 1, 2, 0, 1,
+						(GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
+						(GtkAttachOptions) (0), 5, 5);
+
+		gtk_table_attach(GTK_TABLE(table), label5, 0, 1, 1, 2,
+						(GtkAttachOptions) (GTK_FILL),
+						(GtkAttachOptions) (0), 5, 0);
+		gtk_misc_set_alignment(GTK_MISC(label5), 1, 0);
+
+		gtk_table_attach(GTK_TABLE(table), dd->spell_combo, 1, 2, 1, 2,
+						(GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
+						(GtkAttachOptions) (0), 5, 5);
+
+		frame3 = gtk_frame_new(_("Use Aspell"));
+		gtk_frame_set_shadow_type(GTK_FRAME(frame3), GTK_SHADOW_ETCHED_OUT);
+		gtk_widget_show(frame3);
+		gtk_container_set_border_width(GTK_CONTAINER(frame3), 3);
+		gtk_container_add(GTK_CONTAINER(frame3), table);
+		gtk_box_pack_start(GTK_BOX(vbox), frame3, TRUE, FALSE, 0);
+	}
+
+	/* Display text entry in the panel */
+	{
+		GtkWidget *pe_hbox, *label;
+
+		/* show panel entry check box */
+		dd->check_panel_entry = gtk_check_button_new_with_label(
+													_("Show text field in the panel"));
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dd->check_panel_entry), dd->show_panel_entry);
+		gtk_widget_show(dd->check_panel_entry);
+		g_signal_connect(G_OBJECT(dd->check_panel_entry), "toggled",
+													G_CALLBACK(show_panel_entry_toggled), dd);
+
+		/* panel entry size */
+		dd->panel_entry_size_label = gtk_label_new_with_mnemonic(_("Text field size:"));
+		gtk_widget_show(dd->panel_entry_size_label);
+		dd->panel_entry_size_spinner = gtk_spin_button_new_with_range(0.0, 500.0, 1.0);
+		gtk_spin_button_set_value(GTK_SPIN_BUTTON(dd->panel_entry_size_spinner),
+																		dd->panel_entry_size);
+		gtk_widget_show(dd->panel_entry_size_spinner);
+
+		pe_hbox = gtk_hbox_new(FALSE, 0);
+		gtk_widget_show(pe_hbox);
+
+		gtk_box_pack_start(GTK_BOX(pe_hbox), dd->panel_entry_size_label, FALSE, FALSE, 10);
+		gtk_box_pack_start(GTK_BOX(pe_hbox), dd->panel_entry_size_spinner, TRUE, TRUE, 0);
+
+		label = gtk_label_new(""); /* just to make some space, should be done better */
+		gtk_widget_show(label);
+		gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+		gtk_box_pack_start(GTK_BOX(vbox), dd->check_panel_entry, FALSE, FALSE, 0);
+		gtk_box_pack_start(GTK_BOX(vbox), pe_hbox, FALSE, FALSE, 0);
+
+	}
+
+	/* init the sensitive widgets */
+	use_webserver_toggled(GTK_TOGGLE_BUTTON(dd->web_radio_other), dd);
+	show_panel_entry_toggled(GTK_TOGGLE_BUTTON(dd->check_panel_entry), dd);
+
+	return dlg;
+}


Property changes on: xfce4-dict/trunk/lib/prefs.c
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Added: xfce4-dict/trunk/lib/prefs.h
===================================================================
--- xfce4-dict/trunk/lib/prefs.h	                        (rev 0)
+++ xfce4-dict/trunk/lib/prefs.h	2008-03-30 09:01:41 UTC (rev 4137)
@@ -0,0 +1,28 @@
+/*  $Id$
+ *
+ *  Copyright 2006-2008 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  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 Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+#ifndef PREFS_H
+#define PREFS_H 1
+
+GtkWidget *dict_prefs_dialog_show(DictData *dd);
+void dict_prefs_dialog_response(GtkWidget *dlg, gint response, DictData *dd);
+
+
+#endif


Property changes on: xfce4-dict/trunk/lib/prefs.h
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Modified: xfce4-dict/trunk/panel-plugin/xfce4-dict-plugin.c
===================================================================
--- xfce4-dict/trunk/panel-plugin/xfce4-dict-plugin.c	2008-03-30 05:59:30 UTC (rev 4136)
+++ xfce4-dict/trunk/panel-plugin/xfce4-dict-plugin.c	2008-03-30 09:01:41 UTC (rev 4137)
@@ -39,12 +39,23 @@
 #include <signal.h>
 #include <string.h>
 
-#include "common.h"
+#include "libdict.h"
 #include "popup_def.h"
 
 
+typedef struct
+{
+	DictData *dd;
+	XfcePanelPlugin *plugin;
 
-static GdkPixbuf *dict_load_and_scale(const guint8 *data, gint dstw, gint dsth)
+	GtkTooltips *tooltips;
+
+	GtkWidget *panel_button;
+	GtkWidget *panel_button_image;
+} DictPanelData;
+
+
+static GdkPixbuf *dict_plugin_load_and_scale(const guint8 *data, gint dstw, gint dsth)
 {
 	GdkPixbuf *pb, *pb_scaled;
 	int pb_w, pb_h;
@@ -67,21 +78,22 @@
 }
 
 
-static gboolean dict_plugin_panel_set_size(XfcePanelPlugin *plugin, gint wsize, DictData *dd)
+static gboolean dict_plugin_panel_set_size(XfcePanelPlugin *plugin, gint wsize, DictPanelData *dpd)
 {
 	gint width;
-	gint size = wsize - 2 - (2 * MAX(dd->panel_button->style->xthickness,
-									 dd->panel_button->style->ythickness));
+	gint size = wsize - 2 - (2 * MAX(dpd->panel_button->style->xthickness,
+									 dpd->panel_button->style->ythickness));
 
 	/*g_object_unref(G_OBJECT(dd->icon));*/
-	dd->icon = dict_load_and_scale(dict_get_icon_data(), size, -1);
+	dpd->dd->icon = dict_plugin_load_and_scale(dict_get_icon_data(), size, -1);
 
-	gtk_image_set_from_pixbuf(GTK_IMAGE(dd->panel_button_image), dd->icon);
+	gtk_image_set_from_pixbuf(GTK_IMAGE(dpd->panel_button_image), dpd->dd->icon);
 
-	if (dd->show_panel_entry && xfce_panel_plugin_get_orientation(dd->plugin) == GTK_ORIENTATION_HORIZONTAL)
+	if (dpd->dd->show_panel_entry &&
+		xfce_panel_plugin_get_orientation(plugin) == GTK_ORIENTATION_HORIZONTAL)
 	{
-		width = size + dd->panel_entry_size;
-		gtk_widget_set_size_request(dd->panel_entry, dd->panel_entry_size, -1);
+		width = size + dpd->dd->panel_entry_size;
+		gtk_widget_set_size_request(dpd->dd->panel_entry, dpd->dd->panel_entry_size, -1);
 	}
 	else
 		width = size;
@@ -92,7 +104,7 @@
 }
 
 
-/* unused
+/* TODO remove me, unused
 static void dict_toggle_main_window(GtkWidget *button, DictData *dd)
 {
 	if (GTK_WIDGET_VISIBLE(dd->window))
@@ -116,42 +128,48 @@
 */
 
 
-static void dict_plugin_panel_button_clicked(GtkWidget *button, DictData *dd)
+static void dict_plugin_show_main_window(DictData *dd)
 {
-	if (GTK_WIDGET_VISIBLE(dd->window))
-		gtk_widget_hide(dd->window);
+	gtk_widget_show(dd->window);
+	gtk_window_deiconify(GTK_WINDOW(dd->window));
+	gtk_window_present(GTK_WINDOW(dd->window));
+}
+
+
+static void dict_plugin_panel_button_clicked(GtkWidget *button, DictPanelData *dpd)
+{
+	if (GTK_WIDGET_VISIBLE(dpd->dd->window))
+		gtk_widget_hide(dpd->dd->window);
 	else
 	{
-		const gchar *panel_text = gtk_entry_get_text(GTK_ENTRY(dd->panel_entry));
+		const gchar *panel_text = gtk_entry_get_text(GTK_ENTRY(dpd->dd->panel_entry));
 
-		dict_show_main_window(dd);
+		dict_plugin_show_main_window(dpd->dd);
 		if (NZV(panel_text))
 		{
-			dict_search_word(dd, panel_text);
-			gtk_entry_set_text(GTK_ENTRY(dd->main_entry), panel_text);
+			dict_search_word(dpd->dd, panel_text);
+			gtk_entry_set_text(GTK_ENTRY(dpd->dd->main_entry), panel_text);
 		}
-		gtk_widget_grab_focus(dd->main_entry);
+		gtk_widget_grab_focus(dpd->dd->main_entry);
 	}
 }
 
 
 /* Handle user messages (xfce4-popup-dict) */
-static gboolean dict_plugin_message_received(GtkWidget *w, GdkEventClient *ev, gpointer user_data)
+static gboolean dict_plugin_message_received(GtkWidget *w, GdkEventClient *ev, DictPanelData *dpd)
 {
-	DictData *dd = user_data;
-
 	if (ev->data_format == 8 && *(ev->data.b) != '\0')
 	{
 		if (strcmp(XFCE_DICT_WINDOW_MESSAGE, ev->data.b) == 0)
 		{	/* open the main window */
-			dict_plugin_panel_button_clicked(NULL, dd);
+			dict_plugin_panel_button_clicked(NULL, dpd);
 			return TRUE;
 		}
 
 		if (strcmp(XFCE_DICT_TEXTFIELD_MESSAGE, ev->data.b) == 0)
 		{	/* put the focus onto the panel entry */
-			if (dd->show_panel_entry)
-				xfce_panel_plugin_focus_widget(dd->plugin, dd->panel_entry);
+			if (dpd->dd->show_panel_entry)
+				xfce_panel_plugin_focus_widget(dpd->plugin, dpd->dd->panel_entry);
 		}
 	}
 
@@ -159,7 +177,7 @@
 }
 
 
-static gboolean dict_plugin_set_selection(DictData *dd)
+static gboolean dict_plugin_set_selection(DictPanelData *dpd)
 {
 	GdkScreen *gscreen;
 	gchar      selection_name[32];
@@ -185,41 +203,53 @@
 	XSelectInput(GDK_DISPLAY(), xwin, PropertyChangeMask);
 	XSetSelectionOwner(GDK_DISPLAY(), selection_atom, xwin, GDK_CURRENT_TIME);
 
-	g_signal_connect(G_OBJECT(win), "client-event", G_CALLBACK(dict_plugin_message_received), dd);
+	g_signal_connect(G_OBJECT(win), "client-event", G_CALLBACK(dict_plugin_message_received), dpd);
 
 	return TRUE;
 }
 
 
-void dict_plugin_close_button_clicked(GtkWidget *button, DictData *dd)
+void dict_plugin_close_button_clicked(GtkWidget *button, DictPanelData *dpd)
 {
-	gtk_widget_hide(dd->window);
+	gtk_widget_hide(dpd->dd->window);
 }
 
 
-static void dict_plugin_free_data(XfcePanelPlugin *plugin, DictData *dd)
+static void dict_plugin_free_data(XfcePanelPlugin *plugin, DictPanelData *dpd)
 {
-	dict_free_data(dd);
+	/* Destroy the setting dialog, if this open */
+	GtkWidget *dialog = g_object_get_data(G_OBJECT(dpd->plugin), "dialog");
+
+	if (dialog != NULL)
+	{
+		g_message("dict: destroy dialog");
+		gtk_widget_destroy(dialog);
+	}
+
+	gtk_object_sink(GTK_OBJECT(dpd->tooltips));
+
+	dict_free_data(dpd->dd);
+	g_free(dpd);
 }
 
 
-static void dict_plugin_panel_change_orientation(
-		XfcePanelPlugin *plugin, GtkOrientation orientation, DictData *dd)
+static void dict_plugin_panel_change_orientation(XfcePanelPlugin *plugin,
+												 GtkOrientation orientation, DictPanelData *dpd)
 {
-	if (! dd->show_panel_entry || orientation == GTK_ORIENTATION_VERTICAL)
-		gtk_widget_hide(dd->panel_entry);
+	if (! dpd->dd->show_panel_entry || orientation == GTK_ORIENTATION_VERTICAL)
+		gtk_widget_hide(dpd->dd->panel_entry);
 	else
-		gtk_widget_show(dd->panel_entry);
+		gtk_widget_show(dpd->dd->panel_entry);
 }
 
 
-static void dict_plugin_style_set(XfcePanelPlugin *plugin, gpointer unused, DictData *dd)
+static void dict_plugin_style_set(XfcePanelPlugin *plugin, gpointer unused, DictPanelData *dpd)
 {
-	dict_plugin_panel_set_size(plugin, xfce_panel_plugin_get_size(plugin), dd);
+	dict_plugin_panel_set_size(plugin, xfce_panel_plugin_get_size(plugin), dpd);
 }
 
 
-static gboolean dict_panel_entry_buttonpress_cb(GtkWidget *entry, GdkEventButton *event, DictData *dd)
+static gboolean dict_plugin_panel_entry_buttonpress_cb(GtkWidget *entry, GdkEventButton *event, DictPanelData *dpd)
 {
 	GtkWidget *toplevel;
 
@@ -228,120 +258,145 @@
 
 	/* Grab entry focus if possible */
 	if (event->button != 3 && toplevel && toplevel->window)
-		xfce_panel_plugin_focus_widget(dd->plugin, entry);
+		xfce_panel_plugin_focus_widget(dpd->plugin, entry);
 
 	return FALSE;
 }
 
 
-static void dict_plugin_write_rc_file(XfcePanelPlugin *plugin, DictData *dd)
+static void dict_plugin_write_rc_file(XfcePanelPlugin *plugin, DictPanelData *dpd)
 {
-	dict_write_rc_file(dd);
+	dict_write_rc_file(dpd->dd);
 }
 
 
-static void dict_plugin_properties_dialog(XfcePanelPlugin *plugin, DictData *dd)
+static void dict_plugin_panel_save_settings(DictPanelData *dpd)
 {
-	xfce_panel_plugin_block_menu(plugin);
+	if (dpd->dd->show_panel_entry &&
+		xfce_panel_plugin_get_orientation(dpd->plugin) == GTK_ORIENTATION_HORIZONTAL)
+	{
+		gtk_widget_show(dpd->dd->panel_entry);
+	}
+	else
+		gtk_widget_hide(dpd->dd->panel_entry);
 
-	dict_properties_dialog(dd);
+	dict_plugin_panel_set_size(dpd->plugin, xfce_panel_plugin_get_size(dpd->plugin), dpd);
 }
 
 
-/* the following extern declared functions are called in libdict when panel plugin is in use */
-extern void dict_panel_plugin_save_settings(DictData *dd)
+static void dict_plugin_properties_dialog_response(GtkWidget *dlg, gint response, DictPanelData *dpd)
 {
-	if (dd->show_panel_entry &&
-		xfce_panel_plugin_get_orientation(dd->plugin) == GTK_ORIENTATION_HORIZONTAL)
-	{
-		gtk_widget_show(dd->panel_entry);
-	}
-	else
-		gtk_widget_hide(dd->panel_entry);
+	if (response == GTK_RESPONSE_OK)
+		dict_plugin_panel_save_settings(dpd);
 
-	dict_plugin_panel_set_size(dd->plugin, xfce_panel_plugin_get_size(dd->plugin), dd);
+	g_object_set_data(G_OBJECT(dpd->plugin), "dialog", NULL);
+	xfce_panel_plugin_unblock_menu(dpd->plugin);
 }
 
 
-extern void dict_panel_plugin_unblock(DictData *dd)
+static void dict_plugin_properties_dialog(XfcePanelPlugin *plugin, DictPanelData *dpd)
 {
-	xfce_panel_plugin_unblock_menu(dd->plugin);
+	GtkWidget *dlg;
+
+	xfce_panel_plugin_block_menu(plugin);
+
+	dlg = dict_prefs_dialog_show(dpd->dd);
+
+	g_object_set_data(G_OBJECT(dpd->plugin), "dialog", dlg);
+
+	g_signal_connect(dlg, "response", G_CALLBACK(dict_plugin_properties_dialog_response), dpd);
+	g_signal_connect(dlg, "response", G_CALLBACK(dict_prefs_dialog_response), dpd->dd);
+
+	gtk_widget_show(dlg);
 }
 
 
-static void dict_construct(XfcePanelPlugin *plugin)
+static void dict_plugin_panel_entry_activate_cb(GtkEntry *entry, DictPanelData *dpd)
 {
-	DictData *dd = g_new0(DictData, 1);
+	const gchar *entered_text = gtk_entry_get_text(GTK_ENTRY(dpd->dd->panel_entry));
+
+	gtk_entry_set_text(GTK_ENTRY(dpd->dd->main_entry), entered_text);
+
+	dict_search_word(dpd->dd, entered_text);
+}
+
+
+static void dict_plugin_construct(XfcePanelPlugin *plugin)
+{
+	DictPanelData *dpd = g_new0(DictPanelData, 1);
 	GtkWidget *hbox;
 
 	xfce_textdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8");
 
 	g_thread_init(NULL);
 
-	dd->plugin = plugin;
-	dd->searched_word = NULL;
-	dd->query_is_running = FALSE;
-	dd->query_status = NO_ERROR;
+	dpd->dd = dict_create_dictdata();
+	dpd->plugin = plugin;
 
-	dict_read_rc_file(dd);
+	dict_read_rc_file(dpd->dd);
 
-	dd->panel_button = xfce_create_panel_button();
+	dpd->panel_button = xfce_create_panel_button();
 
-	dd->tooltips = gtk_tooltips_new();
-	gtk_tooltips_set_tip(dd->tooltips, dd->panel_button, _("Look up a word"), NULL);
+	dpd->tooltips = gtk_tooltips_new();
+	gtk_tooltips_set_tip(dpd->tooltips, dpd->panel_button, _("Look up a word"), NULL);
 
-	dd->panel_button_image = gtk_image_new();
-	gtk_container_add(GTK_CONTAINER(dd->panel_button), GTK_WIDGET(dd->panel_button_image));
+	dpd->panel_button_image = gtk_image_new();
+	gtk_container_add(GTK_CONTAINER(dpd->panel_button), GTK_WIDGET(dpd->panel_button_image));
 
-	gtk_widget_show_all(dd->panel_button);
+	gtk_widget_show_all(dpd->panel_button);
 
-	g_signal_connect(dd->panel_button, "clicked", G_CALLBACK(dict_plugin_panel_button_clicked), dd);
+	g_signal_connect(dpd->panel_button, "clicked", G_CALLBACK(dict_plugin_panel_button_clicked), dpd);
 
-	dict_create_main_window(dd);
+	dict_create_main_window(dpd->dd);
 
-	g_signal_connect(dd->window, "delete_event", G_CALLBACK(gtk_widget_hide_on_delete), NULL);
-	g_signal_connect(dd->close_button, "clicked", G_CALLBACK(dict_plugin_close_button_clicked), dd);
-	g_signal_connect(plugin, "free-data", G_CALLBACK(dict_plugin_free_data), dd);
-	g_signal_connect(plugin, "size-changed", G_CALLBACK(dict_plugin_panel_set_size), dd);
-	g_signal_connect(plugin, "orientation-changed", G_CALLBACK(dict_plugin_panel_change_orientation), dd);
-	g_signal_connect(plugin, "style-set", G_CALLBACK(dict_plugin_style_set), dd);
-	g_signal_connect(plugin, "save", G_CALLBACK(dict_plugin_write_rc_file), dd);
-	g_signal_connect(plugin, "configure-plugin", G_CALLBACK(dict_plugin_properties_dialog), dd);
-	g_signal_connect(plugin, "about", G_CALLBACK(dict_about_dialog), dd);
+	g_signal_connect(dpd->dd->window, "delete_event", G_CALLBACK(gtk_widget_hide_on_delete), NULL);
+	g_signal_connect(dpd->dd->close_button, "clicked", G_CALLBACK(dict_plugin_close_button_clicked), dpd);
+	g_signal_connect(plugin, "free-data", G_CALLBACK(dict_plugin_free_data), dpd);
+	g_signal_connect(plugin, "size-changed", G_CALLBACK(dict_plugin_panel_set_size), dpd);
+	g_signal_connect(plugin, "orientation-changed", G_CALLBACK(dict_plugin_panel_change_orientation), dpd);
+	g_signal_connect(plugin, "style-set", G_CALLBACK(dict_plugin_style_set), dpd);
+	g_signal_connect(plugin, "save", G_CALLBACK(dict_plugin_write_rc_file), dpd);
+	g_signal_connect(plugin, "configure-plugin", G_CALLBACK(dict_plugin_properties_dialog), dpd);
+	g_signal_connect(plugin, "about", G_CALLBACK(dict_about_dialog), dpd->dd);
 
 	xfce_panel_plugin_menu_show_configure(plugin);
 	xfce_panel_plugin_menu_show_about(plugin);
 
 	/* panel entry */
-	dd->panel_entry = gtk_entry_new();
-	gtk_entry_set_width_chars(GTK_ENTRY(dd->panel_entry), 15);
-	g_signal_connect(dd->panel_entry, "activate", G_CALLBACK(dict_entry_activate_cb), dd);
-	g_signal_connect(dd->panel_entry, "button-press-event", G_CALLBACK(dict_panel_entry_buttonpress_cb), dd);
+	dpd->dd->panel_entry = gtk_entry_new();
+	gtk_entry_set_width_chars(GTK_ENTRY(dpd->dd->panel_entry), 15);
+	g_signal_connect(dpd->dd->panel_entry, "activate",
+		G_CALLBACK(dict_plugin_panel_entry_activate_cb), dpd);
+	g_signal_connect(dpd->dd->panel_entry, "button-press-event",
+		G_CALLBACK(dict_plugin_panel_entry_buttonpress_cb), dpd);
 
-	if (dd->show_panel_entry && xfce_panel_plugin_get_orientation(dd->plugin) == GTK_ORIENTATION_HORIZONTAL)
-		gtk_widget_show(dd->panel_entry);
+	if (dpd->dd->show_panel_entry &&
+		xfce_panel_plugin_get_orientation(dpd->plugin) == GTK_ORIENTATION_HORIZONTAL)
+	{
+		gtk_widget_show(dpd->dd->panel_entry);
+	}
 
 	hbox = gtk_hbox_new(FALSE, 0);
 	gtk_widget_show(hbox);
 
-	gtk_container_add(GTK_CONTAINER(hbox), dd->panel_button);
-	gtk_container_add(GTK_CONTAINER(hbox), dd->panel_entry);
+	gtk_container_add(GTK_CONTAINER(hbox), dpd->panel_button);
+	gtk_container_add(GTK_CONTAINER(hbox), dpd->dd->panel_entry);
 	gtk_container_add(GTK_CONTAINER(plugin), hbox);
 
-	xfce_panel_plugin_add_action_widget(plugin, dd->panel_button);
-	dict_plugin_set_selection(dd);
+	xfce_panel_plugin_add_action_widget(plugin, dpd->panel_button);
+	dict_plugin_set_selection(dpd);
 
 	/* DnD stuff */
-	gtk_drag_dest_set(GTK_WIDGET(dd->panel_button), GTK_DEST_DEFAULT_ALL,
+	gtk_drag_dest_set(GTK_WIDGET(dpd->panel_button), GTK_DEST_DEFAULT_ALL,
 		NULL, 0, GDK_ACTION_COPY | GDK_ACTION_MOVE);
-	gtk_drag_dest_add_text_targets(GTK_WIDGET(dd->panel_button));
-	g_signal_connect(dd->panel_button, "drag-data-received", G_CALLBACK(dict_drag_data_received), dd);
-	g_signal_connect(dd->main_entry, "drag-data-received", G_CALLBACK(dict_drag_data_received), dd);
-	g_signal_connect(dd->panel_entry, "drag-data-received", G_CALLBACK(dict_drag_data_received), dd);
+	gtk_drag_dest_add_text_targets(GTK_WIDGET(dpd->panel_button));
+	g_signal_connect(dpd->panel_button, "drag-data-received", G_CALLBACK(dict_drag_data_received), dpd->dd);
+	g_signal_connect(dpd->dd->main_entry, "drag-data-received", G_CALLBACK(dict_drag_data_received), dpd->dd);
+	g_signal_connect(dpd->dd->panel_entry, "drag-data-received", G_CALLBACK(dict_drag_data_received), dpd->dd);
 
-	dict_status_add(dd, _("Ready."));
+	dict_status_add(dpd->dd, _("Ready."));
 
 	siginterrupt(SIGALRM, 1);
 	signal(SIGALRM, dict_signal_cb);
 }
-XFCE_PANEL_PLUGIN_REGISTER_EXTERNAL(dict_construct);
+XFCE_PANEL_PLUGIN_REGISTER_EXTERNAL(dict_plugin_construct);

Modified: xfce4-dict/trunk/src/xfce4-dict.c
===================================================================
--- xfce4-dict/trunk/src/xfce4-dict.c	2008-03-30 05:59:30 UTC (rev 4136)
+++ xfce4-dict/trunk/src/xfce4-dict.c	2008-03-30 09:01:41 UTC (rev 4137)
@@ -1,6 +1,6 @@
 /*  $Id$
  *
- *  Copyright 2008 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
+ *  Copyright 2006-2008 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -35,28 +35,13 @@
 # include <locale.h>
 #endif
 
-/* Simple forward declaration to avoid inclusion of libxfce4panel headers */
-typedef struct XfcePanelPlugin_t XfcePanelPlugin;
-
-#include "common.h"
+#include "libdict.h"
 #include "popup_plugin.h"
 
 
 
-extern void dict_panel_plugin_unblock(DictData *dd)
+static gboolean main_quit(GtkWidget *widget, GdkEvent *event, DictData *dd)
 {
-	// no-op
-}
-
-
-extern void dict_panel_plugin_save_settings(DictData *dd)
-{
-	// no-op
-}
-
-
-gboolean main_quit(GtkWidget *widget, GdkEvent *event, DictData *dd)
-{
 	dict_free_data(dd);
     gtk_main_quit();
 
@@ -64,7 +49,7 @@
 }
 
 
-void close_button_clicked(GtkWidget *button, DictData *dd)
+static void close_button_clicked(GtkWidget *button, DictData *dd)
 {
 	main_quit(NULL, NULL, dd);
 }
@@ -87,20 +72,10 @@
 
 	/* no plugin found, start usual stand-alone app */
 
-	dd = g_new0(DictData, 1);
+	dd = dict_create_dictdata();
 
 	g_thread_init(NULL);
 
-	/* initialise some pointers, unused panel plugins pointers defaults to NULL when not used */
-	dd->plugin = NULL;
-	dd->searched_word = NULL;
-	dd->query_is_running = FALSE;
-	dd->query_status = NO_ERROR;
-	dd->panel_button = NULL;
-	dd->tooltips = NULL;
-	dd->panel_button_image = NULL;
-	dd->panel_entry = NULL;
-
 	dict_read_rc_file(dd);
 
 	dict_create_main_window(dd);




More information about the Goodies-commits mailing list