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

Enrico Troeger enrico at xfce.org
Wed Apr 2 15:21:39 CEST 2008


Author: enrico
Date: 2008-04-02 13:21:39 +0000 (Wed, 02 Apr 2008)
New Revision: 4500

Removed:
   xfce4-dict/trunk/lib/popup_def.h
Modified:
   xfce4-dict/trunk/ChangeLog
   xfce4-dict/trunk/lib/common.c
   xfce4-dict/trunk/lib/common.h
   xfce4-dict/trunk/lib/dictd.c
   xfce4-dict/trunk/lib/gui.c
   xfce4-dict/trunk/lib/prefs.c
   xfce4-dict/trunk/panel-plugin/xfce4-dict-plugin.c
   xfce4-dict/trunk/src/popup_plugin.c
   xfce4-dict/trunk/src/popup_plugin.h
   xfce4-dict/trunk/src/xfce4-dict.c
Log:
Show panel-only options in preferences dialog only if panel plugin is actually loaded.
After clicking on the Clear button, bring the input focus back to the main entry.
Add keyboard shortcuts for file menu items.
Cleanup DictData struct, reorder elements and remove elements which are only used in the preferences dialog.
Add search method selection to the preferences dialog, including new mode to use the search method from the last time.
Add support for command line options for xfce4-dict command.

Modified: xfce4-dict/trunk/ChangeLog
===================================================================
--- xfce4-dict/trunk/ChangeLog	2008-04-02 12:22:29 UTC (rev 4499)
+++ xfce4-dict/trunk/ChangeLog	2008-04-02 13:21:39 UTC (rev 4500)
@@ -1,3 +1,19 @@
+2008-04-02  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>
+
+	* Fix broken aspell search.
+	* Update package name for autotools.
+	* Show panel-only options in preferences dialog only if panel plugin
+	  is actually loaded.
+	* After clicking on the Clear button, bring the input focus back to the
+	  main entry.
+	* Add keyboard shortcuts for file menu items.
+	* Cleanup DictData struct, reorder elements and remove elements which
+	  are only used in the preferences dialog.
+	* Add search method selection to the preferences dialog, including new
+	  mode to use the search method from the last time.
+	* Add support for command line options for xfce4-dict command.
+
+
 2008-03-31  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>
 
 	* Prefix some more functions.
@@ -20,7 +36,7 @@
 	  panel plugin into a static library.
 	  Move dictd server query code into an own file for better readibility.
 	  Bump version requirement of libxfce*-libs to 4.4.0.
-	  Add stand-alone application xfce4-dict.
+	  Add stand-alone application xfce4-dict (replaces xfce4-dict-popup command).
 	  (not yet finished, to be continued)
 
 

Modified: xfce4-dict/trunk/lib/common.c
===================================================================
--- xfce4-dict/trunk/lib/common.c	2008-04-02 12:22:29 UTC (rev 4499)
+++ xfce4-dict/trunk/lib/common.c	2008-04-02 13:21:39 UTC (rev 4500)
@@ -213,6 +213,19 @@
 }
 
 
+dict_mode_t dict_set_search_mode_from_flags(dict_mode_t mode, gchar flags)
+{
+	if (flags & DICT_FLAGS_MODE_DICT)
+		mode = DICTMODE_DICT;
+	else if (flags & DICT_FLAGS_MODE_WEB)
+		mode = DICTMODE_WEB;
+	else if (flags & DICT_FLAGS_MODE_SPELL)
+		mode = DICTMODE_SPELL;
+
+	return mode;
+}
+
+
 void dict_search_word(DictData *dd, const gchar *word)
 {
 	gboolean browser_started = FALSE;
@@ -245,13 +258,8 @@
 
 	dict_gui_clear_text_buffer(dd);
 
-	switch (dd->mode)
+	switch (dd->mode_in_use)
 	{
-		case DICTMODE_DICT:
-		{
-			dict_dictd_start_query(dd, dd->searched_word);
-			break;
-		}
 		case DICTMODE_WEB:
 		{
 			browser_started = start_web_query(dd, dd->searched_word);
@@ -263,6 +271,11 @@
 			dict_aspell_start_query(dd, dd->searched_word);
 			break;
 		}
+		default:
+		{
+			dict_dictd_start_query(dd, dd->searched_word);
+			break;
+		}
 	}
 	/* If 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.
@@ -281,7 +294,8 @@
 void dict_read_rc_file(DictData *dd)
 {
 	XfceRc *rc;
-	gint mode = DICTMODE_DICT;
+	gint mode_in_use = DICTMODE_DICT;
+	gint mode_default = DICTMODE_LAST_USED;
 	gint webmode = WEBMODE_LEO_GERENG;
 	gint port = 2628;
 	gint panel_entry_size = 120;
@@ -294,7 +308,8 @@
 
 	if ((rc = xfce_rc_config_open(XFCE_RESOURCE_CONFIG, "xfce4-dict/xfce4-dict.rc", TRUE)) != NULL)
 	{
-		mode = xfce_rc_read_int_entry(rc, "mode", mode);
+		mode_in_use = xfce_rc_read_int_entry(rc, "mode_in_use", mode_in_use);
+		mode_default = xfce_rc_read_int_entry(rc, "mode_default", mode_default);
 		webmode = xfce_rc_read_int_entry(rc, "web_mode", webmode);
 		weburl = xfce_rc_read_entry(rc, "web_url", weburl);
 		show_panel_entry = xfce_rc_read_bool_entry(rc, "show_panel_entry", show_panel_entry);
@@ -308,7 +323,12 @@
 		xfce_rc_close(rc);
 	}
 
-	dd->mode = mode;
+	dd->mode_default = mode_default;
+	if (dd->mode_default == DICTMODE_LAST_USED)
+		dd->mode_in_use = mode_in_use;
+	else
+		dd->mode_in_use = dd->mode_default;
+
 	dd->web_mode = webmode;
 	dd->web_url = g_strdup(weburl);
 	dd->show_panel_entry = show_panel_entry;
@@ -327,7 +347,8 @@
 
 	if ((rc = xfce_rc_config_open(XFCE_RESOURCE_CONFIG, "xfce4-dict/xfce4-dict.rc", FALSE)) != NULL)
 	{
-		xfce_rc_write_int_entry(rc, "mode", dd->mode);
+		xfce_rc_write_int_entry(rc, "mode_in_use", dd->mode_in_use);
+		xfce_rc_write_int_entry(rc, "mode_default", dd->mode_default);
 		xfce_rc_write_int_entry(rc, "web_mode", dd->web_mode);
 		if (dd->web_url != NULL)
 			xfce_rc_write_entry(rc, "web_url", dd->web_url);

Modified: xfce4-dict/trunk/lib/common.h
===================================================================
--- xfce4-dict/trunk/lib/common.h	2008-04-02 12:22:29 UTC (rev 4499)
+++ xfce4-dict/trunk/lib/common.h	2008-04-02 13:21:39 UTC (rev 4500)
@@ -29,17 +29,25 @@
 
 #define PLUGIN_WEBSITE "http://goodies.xfce.org/projects/xfce4-dict"
 
+#define DICT_FLAGS_FOCUS_PANEL_ENTRY	1
+#define DICT_FLAGS_MODE_DICT			2
+#define DICT_FLAGS_MODE_WEB				4
+#define DICT_FLAGS_MODE_SPELL			8
 
+#define XFCE_DICT_SELECTION	"XFCE_DICT_SEL"
+
+
 typedef enum
 {
 	DICTMODE_DICT = 0,
 	DICTMODE_WEB,
-	DICTMODE_SPELL
+	DICTMODE_SPELL,
+	DICTMODE_LAST_USED
 } dict_mode_t;
 
 typedef enum
 {
-	WEBMODE_OTHER,
+	WEBMODE_OTHER = 0,
 	WEBMODE_LEO_GERENG,
 	WEBMODE_LEO_GERFRE,
 	WEBMODE_LEO_GERSPA
@@ -55,57 +63,49 @@
 
 typedef struct
 {
-	dict_mode_t mode;
+	/* settings */
+	dict_mode_t mode_in_use;
+	dict_mode_t mode_default;
 	web_mode_t web_mode;
 
-	GtkWidget *window;
-	GtkWidget *statusbar;
-	GtkWidget *close_button;
-	GtkWidget *close_menu_item;
-	GtkWidget *pref_menu_item;
-	GtkWidget *main_entry;
-	GtkWidget *panel_entry;
-	GtkWidget *main_textview;
-	GtkTextBuffer *main_textbuffer;
-	GtkTextTag *main_boldtag;
-
-	GtkWidget *server_entry;
-	GtkWidget *dict_combo;
-	GtkWidget *port_spinner;
-	GtkWidget *panel_entry_size_label;
-	GtkWidget *panel_entry_size_spinner;
-	GtkWidget *check_panel_entry;
-
 	gboolean show_panel_entry;
 	gint panel_entry_size;
+
 	gint port;
 	gchar *server;
 	gchar *dictionary;
 
+	gchar *web_url;
+
+	gchar *spell_bin;
+	gchar *spell_dictionary;
+
+	gboolean is_plugin;	/* specify whether the panel plugin loaded or not */
+
+	/* status values */
 	gchar *searched_word;  /* word to query the server */
 	gboolean query_is_running;
 	gint query_status;
 	gchar *query_buffer;
 
-	GtkWidget *web_entry_label;
-	GtkWidget *web_entry;
-	GtkWidget *web_radio_leo_gereng;
-	GtkWidget *web_radio_leo_gerfre;
-	GtkWidget *web_radio_leo_gerspa;
-	GtkWidget *web_radio_other;
-	gchar *web_url;
-
-	GtkWidget *spell_entry;
-	GtkWidget *spell_combo;
-	gchar *spell_bin;
-	gchar *spell_dictionary;
-
+	/* widgets */
+	GtkWidget *window;
+	GtkWidget *statusbar;
+	GtkWidget *close_button;
+	GtkWidget *close_menu_item;
+	GtkWidget *pref_menu_item;
+	GtkWidget *main_entry;
+	GtkWidget *panel_entry;
+	GtkWidget *main_textview;
+	GtkTextBuffer *main_textbuffer;
+	GtkTextTag *main_boldtag;
 	GdkPixbuf *icon;
 
-	gboolean is_plugin;	/* specify whether the panel plugin loaded or not */
+	GtkWidget *web_entry_box;
 } DictData;
 
 
+dict_mode_t dict_set_search_mode_from_flags(dict_mode_t mode, gchar flags);
 void dict_free_data(DictData *dd);
 void dict_write_rc_file(DictData *dd);
 void dict_read_rc_file(DictData *dd);

Modified: xfce4-dict/trunk/lib/dictd.c
===================================================================
--- xfce4-dict/trunk/lib/dictd.c	2008-04-02 12:22:29 UTC (rev 4499)
+++ xfce4-dict/trunk/lib/dictd.c	2008-04-02 13:21:39 UTC (rev 4500)
@@ -326,13 +326,10 @@
 	gchar *buffer = NULL;
 	gchar *answer = NULL;
 	gchar **lines;
-	const gchar *host;
-	gint port;
+	GtkWidget *dict_combo = g_object_get_data(G_OBJECT(button), "dict_combo");
 
-	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 = open_socket(host, port)) == -1)
+	if ((fd = open_socket(dd->server, dd->port)) == -1)
 	{
 		xfce_err(_("Could not connect to server."));
 		return FALSE;
@@ -366,10 +363,10 @@
 	buffer++;
 
 	/* clear the combo box */
-	i = gtk_tree_model_iter_n_children(gtk_combo_box_get_model(GTK_COMBO_BOX(dd->dict_combo)), NULL);
+	i = gtk_tree_model_iter_n_children(gtk_combo_box_get_model(GTK_COMBO_BOX(dict_combo)), NULL);
 	for (i -= 1; i > 2; i--)  /* first three entries (*, ! and ----) should always exist */
 	{
-		gtk_combo_box_remove_text(GTK_COMBO_BOX(dd->dict_combo), i);
+		gtk_combo_box_remove_text(GTK_COMBO_BOX(dict_combo), i);
 	}
 
 	/* parse output */
@@ -380,7 +377,7 @@
 	i = 0;
 	while (i < max_lines && lines[i][0] != '.')
 	{
-		gtk_combo_box_append_text(GTK_COMBO_BOX(dd->dict_combo), lines[i]);
+		gtk_combo_box_append_text(GTK_COMBO_BOX(dict_combo), lines[i]);
 		i++;
 	}
 
@@ -389,7 +386,7 @@
 
 	/* set the active entry to * because we don't know where the previously selected item now is in
 	 * the list and we also don't know whether it exists at all, and I don't walk through the list */
-	gtk_combo_box_set_active(GTK_COMBO_BOX(dd->dict_combo), 0);
+	gtk_combo_box_set_active(GTK_COMBO_BOX(dict_combo), 0);
 
 	return TRUE;
 }

Modified: xfce4-dict/trunk/lib/gui.c
===================================================================
--- xfce4-dict/trunk/lib/gui.c	2008-04-02 12:22:29 UTC (rev 4499)
+++ xfce4-dict/trunk/lib/gui.c	2008-04-02 13:21:39 UTC (rev 4500)
@@ -27,6 +27,7 @@
 
 #include <string.h>
 #include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
 #include <libxfcegui4/libxfcegui4.h>
 
 #include "common.h"
@@ -64,6 +65,8 @@
 	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);
+
+	gtk_widget_grab_focus(dd->main_entry);
 }
 
 
@@ -98,7 +101,7 @@
 {
 	if (gtk_toggle_button_get_active(togglebutton))
 	{
-		dd->mode = DICTMODE_DICT;
+		dd->mode_in_use = DICTMODE_DICT;
 		gtk_widget_grab_focus(dd->main_entry);
 	}
 }
@@ -108,7 +111,7 @@
 {
 	if (gtk_toggle_button_get_active(togglebutton))
 	{
-		dd->mode = DICTMODE_WEB;
+		dd->mode_in_use = DICTMODE_WEB;
 		gtk_widget_grab_focus(dd->main_entry);
 	}
 }
@@ -118,7 +121,7 @@
 {
 	if (gtk_toggle_button_get_active(togglebutton))
 	{
-		dd->mode = DICTMODE_SPELL;
+		dd->mode_in_use = DICTMODE_SPELL;
 		gtk_widget_grab_focus(dd->main_entry);
 	}
 }
@@ -133,7 +136,11 @@
 static GtkWidget *create_file_menu(DictData *dd)
 {
 	GtkWidget *menubar, *file, *file_menu, *help, *help_menu, *menu_item;
+	GtkAccelGroup *accel_group;
 
+	accel_group = gtk_accel_group_new();
+	gtk_window_add_accel_group(GTK_WINDOW(dd->window), accel_group);
+
 	menubar = gtk_menu_bar_new();
 
 	file = gtk_menu_item_new_with_mnemonic(_("_File"));
@@ -141,12 +148,15 @@
 	file_menu = gtk_menu_new();
 	gtk_menu_item_set_submenu(GTK_MENU_ITEM(file), file_menu);
 
-	dd->pref_menu_item = gtk_image_menu_item_new_from_stock("gtk-preferences", NULL);
+	dd->pref_menu_item = gtk_image_menu_item_new_from_stock("gtk-preferences", accel_group);
+	gtk_widget_add_accelerator(dd->pref_menu_item, "activate", accel_group,
+			GDK_p, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
 	gtk_container_add(GTK_CONTAINER(file_menu), dd->pref_menu_item);
 
 	gtk_container_add(GTK_CONTAINER(file_menu), gtk_separator_menu_item_new());
 
-	dd->close_menu_item = gtk_image_menu_item_new_from_stock((dd->is_plugin) ? "gtk-close" : "gtk-quit", NULL);
+	dd->close_menu_item = gtk_image_menu_item_new_from_stock(
+			(dd->is_plugin) ? "gtk-close" : "gtk-quit", accel_group);
 	gtk_container_add(GTK_CONTAINER(file_menu), dd->close_menu_item);
 
 	help = gtk_menu_item_new_with_mnemonic(_("_Help"));
@@ -154,7 +164,7 @@
 	help_menu = gtk_menu_new();
 	gtk_menu_item_set_submenu(GTK_MENU_ITEM(help), help_menu);
 
-	menu_item = gtk_image_menu_item_new_from_stock("gtk-about", NULL);
+	menu_item = gtk_image_menu_item_new_from_stock("gtk-about", accel_group);
 	gtk_container_add(GTK_CONTAINER(help_menu), menu_item);
 	g_signal_connect(menu_item, "activate", G_CALLBACK(dict_gui_about_dialog), dd);
 
@@ -251,18 +261,18 @@
 
 	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));
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), (dd->mode_in_use == 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));
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), (dd->mode_in_use == 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));
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), (dd->mode_in_use == 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);

Deleted: xfce4-dict/trunk/lib/popup_def.h

Modified: xfce4-dict/trunk/lib/prefs.c
===================================================================
--- xfce4-dict/trunk/lib/prefs.c	2008-04-02 12:22:29 UTC (rev 4499)
+++ xfce4-dict/trunk/lib/prefs.c	2008-04-02 13:21:39 UTC (rev 4500)
@@ -33,20 +33,41 @@
 
 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));
+	if (dd->is_plugin)
+	{
+		gtk_widget_set_sensitive(g_object_get_data(G_OBJECT(tb), "spinner"),
+			gtk_toggle_button_get_active(tb));
+		gtk_widget_set_sensitive(g_object_get_data(G_OBJECT(tb), "label"),
+			gtk_toggle_button_get_active(tb));
+	}
 }
 
 
-static void use_webserver_toggled(GtkToggleButton *tb, DictData *dd)
+static void web_search_type_changed(GtkRadioButton *radiobutton, 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));
+	if (! gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radiobutton)))
+		return; /* ignore the toggled event when a button is deselected */
+
+	dd->web_mode = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(radiobutton), "type"));
+
+	gtk_widget_set_sensitive(g_object_get_data(G_OBJECT(dd->web_entry_box), "web_entry"),
+		(dd->web_mode == WEBMODE_OTHER));
+	gtk_widget_set_sensitive(g_object_get_data(G_OBJECT(dd->web_entry_box), "web_entry_label"),
+		(dd->web_mode == WEBMODE_OTHER));
 }
 
 
-static void get_spell_dictionaries(DictData *dd)
+static void search_method_changed(GtkRadioButton *radiobutton, DictData *dd)
 {
+	if (! gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radiobutton)))
+		return; /* ignore the toggled event when a button is deselected */
+
+	dd->mode_default = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(radiobutton), "type"));
+}
+
+
+static void get_spell_dictionaries(GtkWidget *spell_combo, DictData *dd)
+{
 	if (NZV(dd->spell_bin))
 	{
 		gchar *tmp = NULL, *cmd, *locale_cmd;
@@ -64,9 +85,9 @@
 			for (i = 0; i < len; i++)
 			{
 				item = g_strstrip(list[i]);
-				gtk_combo_box_append_text(GTK_COMBO_BOX(dd->spell_combo), item);
+				gtk_combo_box_append_text(GTK_COMBO_BOX(spell_combo), item);
 				if (strcmp(dd->spell_dictionary, item) == 0)
-					gtk_combo_box_set_active(GTK_COMBO_BOX(dd->spell_combo), i);
+					gtk_combo_box_set_active(GTK_COMBO_BOX(spell_combo), i);
 			}
 			g_strfreev(list);
 		}
@@ -94,7 +115,8 @@
 	}
 
 	/* MODE DICT */
-	tmp = gtk_combo_box_get_active_text(GTK_COMBO_BOX(dd->dict_combo));
+	tmp = gtk_combo_box_get_active_text(
+		GTK_COMBO_BOX(g_object_get_data(G_OBJECT(dlg), "dict_combo")));
 	if (tmp == NULL || tmp[0] == '0' || tmp[0] == '-')
 	{
 		xfce_err(_("You have chosen an invalid dictionary entry."));
@@ -102,31 +124,27 @@
 		return;
 	}
 
-	dd->port = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(dd->port_spinner));
+	dd->port = gtk_spin_button_get_value_as_int(
+		GTK_SPIN_BUTTON(g_object_get_data(G_OBJECT(dlg), "port_spinner")));
 
 	g_free(dd->server);
-	dd->server = g_strdup(gtk_entry_get_text(GTK_ENTRY(dd->server_entry)));
+	dd->server = g_strdup(gtk_entry_get_text(
+		GTK_ENTRY(g_object_get_data(G_OBJECT(dlg), "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
+	if (dd->web_mode == WEBMODE_OTHER)
 	{
-		dd->web_mode = WEBMODE_OTHER;
-
 		g_free(dd->web_url);
-		dd->web_url = g_strdup(gtk_entry_get_text(GTK_ENTRY(dd->web_entry)));
+		dd->web_url = g_strdup(gtk_entry_get_text(
+			GTK_ENTRY(g_object_get_data(G_OBJECT(dlg), "web_entry"))));
 	}
 
 	/* MODE SPELL */
-	tmp = gtk_combo_box_get_active_text(GTK_COMBO_BOX(dd->spell_combo));
+	tmp = gtk_combo_box_get_active_text(
+			GTK_COMBO_BOX(g_object_get_data(G_OBJECT(dlg), "spell_combo")));
 	if (NZV(tmp))
 	{
 		g_free(dd->spell_dictionary);
@@ -134,14 +152,17 @@
 	}
 
 	g_free(dd->spell_bin);
-	dd->spell_bin = g_strdup(gtk_entry_get_text(GTK_ENTRY(dd->spell_entry)));
+	dd->spell_bin = g_strdup(gtk_entry_get_text(
+			GTK_ENTRY(g_object_get_data(G_OBJECT(dlg), "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->is_plugin)
+	{
+		dd->show_panel_entry = gtk_toggle_button_get_active(
+					GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(dlg), "check_panel_entry")));
+		dd->panel_entry_size = gtk_spin_button_get_value_as_int(
+					GTK_SPIN_BUTTON(g_object_get_data(G_OBJECT(dlg), "panel_entry_size_spinner")));
+	}
 	/* save settings */
 	dict_write_rc_file(dd);
 
@@ -173,8 +194,10 @@
 	/*
 	 * Page: general
 	 */
+#define PAGE_GENERAL /* only navigation in Geany's symbol list ;-) */
 	{
-		GtkWidget *pe_hbox;
+		GtkWidget *radio_button, *label;
+		GSList *search_method;
 
 		notebook_vbox = gtk_vbox_new(FALSE, 2);
 		gtk_widget_show(notebook_vbox);
@@ -182,41 +205,101 @@
 		gtk_widget_show(inner_vbox);
 		gtk_notebook_append_page(GTK_NOTEBOOK(notebook), notebook_vbox, gtk_label_new(_("General")));
 
+		label = gtk_label_new(_("<b>Default search method:</b>"));
+		gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
+		gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
+		gtk_widget_show(label);
+		gtk_box_pack_start(GTK_BOX(inner_vbox), label, FALSE, FALSE, 0);
+
+		radio_button = gtk_radio_button_new_with_label(NULL, _("Dict"));
+		search_method = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_button));
+		if (dd->mode_default == DICTMODE_DICT)
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button), TRUE);
+		gtk_widget_show(radio_button);
+		gtk_box_pack_start(GTK_BOX(inner_vbox), radio_button, FALSE, FALSE, 0);
+		g_object_set_data(G_OBJECT(radio_button), "type", GINT_TO_POINTER(DICTMODE_DICT));
+		g_signal_connect(G_OBJECT(radio_button), "toggled", G_CALLBACK(search_method_changed), dd);
+
+		radio_button = gtk_radio_button_new_with_label(search_method, _("Web"));
+		search_method = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_button));
+		if (dd->mode_default == DICTMODE_WEB)
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button), TRUE);
+		gtk_widget_show(radio_button);
+		gtk_box_pack_start(GTK_BOX(inner_vbox), radio_button, FALSE, FALSE, 0);
+		g_object_set_data(G_OBJECT(radio_button), "type", GINT_TO_POINTER(DICTMODE_WEB));
+		g_signal_connect(G_OBJECT(radio_button), "toggled", G_CALLBACK(search_method_changed), dd);
+
+		radio_button = gtk_radio_button_new_with_label(search_method, _("Spellcheck"));
+		search_method = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_button));
+		if (dd->mode_default == DICTMODE_SPELL)
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button), TRUE);
+		gtk_widget_show(radio_button);
+		gtk_box_pack_start(GTK_BOX(inner_vbox), radio_button, FALSE, FALSE, 0);
+		g_object_set_data(G_OBJECT(radio_button), "type", GINT_TO_POINTER(DICTMODE_SPELL));
+		g_signal_connect(G_OBJECT(radio_button), "toggled", G_CALLBACK(search_method_changed), dd);
+
+		radio_button = gtk_radio_button_new_with_label(search_method, _("Last used method"));
+		search_method = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_button));
+		if (dd->mode_default == DICTMODE_LAST_USED)
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button), TRUE);
+		gtk_widget_show(radio_button);
+		gtk_box_pack_start(GTK_BOX(inner_vbox), radio_button, FALSE, FALSE, 0);
+		g_object_set_data(G_OBJECT(radio_button), "type", GINT_TO_POINTER(DICTMODE_LAST_USED));
+		g_signal_connect(G_OBJECT(radio_button), "toggled", G_CALLBACK(search_method_changed), dd);
+
 		/* 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);
+		if (dd->is_plugin)
+		{
+			GtkWidget *pe_hbox, *panel_entry_size_label, *panel_entry_size_spinner, *check_panel_entry;
 
-		/* 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);
+			label = gtk_label_new(_("<b>Panel text field:</b>"));
+			gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
+			gtk_misc_set_alignment(GTK_MISC(label), 0, 1);
+			gtk_widget_show(label);
+			gtk_box_pack_start(GTK_BOX(inner_vbox), label, FALSE, FALSE, 5);
 
-		pe_hbox = gtk_hbox_new(FALSE, 0);
-		gtk_widget_show(pe_hbox);
+			check_panel_entry = gtk_check_button_new_with_label(_("Show text field in the panel"));
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_panel_entry), dd->show_panel_entry);
+			gtk_widget_show(check_panel_entry);
+			g_signal_connect(G_OBJECT(check_panel_entry), "toggled",
+														G_CALLBACK(show_panel_entry_toggled), dd);
 
-		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);
+			/* panel entry size */
+			panel_entry_size_label = gtk_label_new_with_mnemonic(_("Text field size:"));
+			gtk_widget_show(panel_entry_size_label);
+			panel_entry_size_spinner = gtk_spin_button_new_with_range(0.0, 500.0, 1.0);
+			gtk_spin_button_set_value(GTK_SPIN_BUTTON(panel_entry_size_spinner),
+																			dd->panel_entry_size);
 
-		gtk_box_pack_start(GTK_BOX(inner_vbox), dd->check_panel_entry, FALSE, FALSE, 0);
-		gtk_box_pack_start(GTK_BOX(inner_vbox), pe_hbox, FALSE, FALSE, 0);
+			g_object_set_data(G_OBJECT(dialog), "check_panel_entry", check_panel_entry);
+			g_object_set_data(G_OBJECT(dialog), "panel_entry_size_spinner", panel_entry_size_spinner);
+			g_object_set_data(G_OBJECT(check_panel_entry), "spinner", panel_entry_size_spinner);
+			g_object_set_data(G_OBJECT(check_panel_entry), "label", panel_entry_size_label);
+
+			gtk_widget_show(panel_entry_size_spinner);
+
+			pe_hbox = gtk_hbox_new(FALSE, 0);
+			gtk_widget_show(pe_hbox);
+
+			gtk_box_pack_start(GTK_BOX(pe_hbox), panel_entry_size_label, FALSE, FALSE, 10);
+			gtk_box_pack_start(GTK_BOX(pe_hbox), panel_entry_size_spinner, TRUE, TRUE, 0);
+
+			gtk_box_pack_start(GTK_BOX(inner_vbox), check_panel_entry, FALSE, FALSE, 0);
+			gtk_box_pack_start(GTK_BOX(inner_vbox), pe_hbox, FALSE, FALSE, 0);
+
+			/* init the sensitive widgets */
+			show_panel_entry_toggled(GTK_TOGGLE_BUTTON(check_panel_entry), dd);
+		}
 		gtk_box_pack_start(GTK_BOX(notebook_vbox), inner_vbox, TRUE, TRUE, 5);
 
-		/* init the sensitive widgets */
-		show_panel_entry_toggled(GTK_TOGGLE_BUTTON(dd->check_panel_entry), dd);
 	}
 
 	/*
 	 * Page: DICTD
 	 */
+#define PAGE_DICTD /* only navigation in Geany's symbol list ;-) */
 	 {
-		GtkWidget *table, *button_get_list;
+		GtkWidget *table, *button_get_list, *server_entry, *port_spinner, *dict_combo;
 
 		notebook_vbox = gtk_vbox_new(FALSE, 2);
 		gtk_widget_show(notebook_vbox);
@@ -228,49 +311,54 @@
 		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);
+		server_entry = gtk_entry_new();
+		gtk_entry_set_max_length(GTK_ENTRY(server_entry), 256);
 		if (dd->server != NULL)
 		{
-			gtk_entry_set_text(GTK_ENTRY(dd->server_entry), dd->server);
+			gtk_entry_set_text(GTK_ENTRY(server_entry), dd->server);
 		}
-		gtk_widget_show(dd->server_entry);
+		gtk_widget_show(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);
+		port_spinner = gtk_spin_button_new_with_range(0.0, 65536.0, 1.0);
+		gtk_spin_button_set_value(GTK_SPIN_BUTTON(port_spinner), dd->port);
+		gtk_widget_show(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),
+		dict_combo = gtk_combo_box_new_text();
+		gtk_combo_box_append_text(GTK_COMBO_BOX(dict_combo), _("* (use all)"));
+		gtk_combo_box_append_text(GTK_COMBO_BOX(dict_combo),
 											_("! (use all, stop after first match)"));
-		gtk_combo_box_append_text(GTK_COMBO_BOX(dd->dict_combo), "----------------");
+		gtk_combo_box_append_text(GTK_COMBO_BOX(dict_combo), "----------------");
 		if (dd->dictionary != NULL)
 		{
 			if (dd->dictionary[0] == '*')
-				gtk_combo_box_set_active(GTK_COMBO_BOX(dd->dict_combo), 0);
+				gtk_combo_box_set_active(GTK_COMBO_BOX(dict_combo), 0);
 			else if (dd->dictionary[0] == '!')
-				gtk_combo_box_set_active(GTK_COMBO_BOX(dd->dict_combo), 1);
+				gtk_combo_box_set_active(GTK_COMBO_BOX(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_combo_box_append_text(GTK_COMBO_BOX(dict_combo), dd->dictionary);
+				gtk_combo_box_set_active(GTK_COMBO_BOX(dict_combo), 3);
 			}
 		}
 
-		gtk_widget_show(dd->dict_combo);
+		gtk_widget_show(dict_combo);
 
+		g_object_set_data(G_OBJECT(dialog), "server_entry", server_entry);
+		g_object_set_data(G_OBJECT(dialog), "port_spinner", port_spinner);
+		g_object_set_data(G_OBJECT(dialog), "dict_combo", 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_dictd_get_list), dd);
+		g_object_set_data(G_OBJECT(button_get_list), "dict_combo", dict_combo);
 
 		/* put it all together */
 		table = gtk_table_new(3, 3, FALSE);
@@ -283,7 +371,7 @@
 						(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,
+		gtk_table_attach(GTK_TABLE(table), server_entry, 1, 2, 0, 1,
 						(GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
 						(GtkAttachOptions) (0), 5, 5);
 
@@ -292,7 +380,7 @@
 						(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,
+		gtk_table_attach(GTK_TABLE(table), port_spinner, 1, 2, 1, 2,
 						(GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
 						(GtkAttachOptions) (0), 5, 5);
 
@@ -301,7 +389,7 @@
 						(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,
+		gtk_table_attach(GTK_TABLE(table), dict_combo, 1, 2, 2, 3,
 						(GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
 						(GtkAttachOptions) (0), 0, 0);
 
@@ -316,8 +404,9 @@
 	/*
 	 * Page: WEB
 	 */
+#define PAGE_WEB /* only navigation in Geany's symbol list ;-) */
 	{
-		GtkWidget  *entry_hbox;
+		GtkWidget *radio_button, *label, *web_entry_label, *web_entry;
 		GSList *web_type;
 
 		notebook_vbox = gtk_vbox_new(FALSE, 5);
@@ -326,51 +415,68 @@
 		gtk_widget_show(inner_vbox);
 		gtk_notebook_append_page(GTK_NOTEBOOK(notebook), notebook_vbox, gtk_label_new(_("Web")));
 
-		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));
+		label = gtk_label_new(_("<b>Web search URL:</b>"));
+		gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
+		gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
+		gtk_widget_show(label);
+		gtk_box_pack_start(GTK_BOX(inner_vbox), label, FALSE, FALSE, 0);
+
+		radio_button = gtk_radio_button_new_with_label(NULL,
+							_("dict.leo.org - German <-> English"));
+		web_type = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_button));
 		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(inner_vbox), dd->web_radio_leo_gereng, FALSE, FALSE, 0);
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button), TRUE);
+		gtk_widget_show(radio_button);
+		gtk_box_pack_start(GTK_BOX(inner_vbox), radio_button, FALSE, FALSE, 0);
+		g_object_set_data(G_OBJECT(radio_button), "type", GINT_TO_POINTER(WEBMODE_LEO_GERENG));
+		g_signal_connect(G_OBJECT(radio_button), "toggled", G_CALLBACK(web_search_type_changed), dd);
 
-		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));
+		radio_button = gtk_radio_button_new_with_label(web_type,
+							_("dict.leo.org - German <-> French"));
+		web_type = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_button));
 		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(inner_vbox), dd->web_radio_leo_gerfre, FALSE, FALSE, 0);
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button), TRUE);
+		gtk_widget_show(radio_button);
+		gtk_box_pack_start(GTK_BOX(inner_vbox), radio_button, FALSE, FALSE, 0);
+		g_object_set_data(G_OBJECT(radio_button), "type", GINT_TO_POINTER(WEBMODE_LEO_GERFRE));
+		g_signal_connect(G_OBJECT(radio_button), "toggled", G_CALLBACK(web_search_type_changed), dd);
 
-		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));
+		radio_button = gtk_radio_button_new_with_label(web_type,
+							_("dict.leo.org - German <-> Spanish"));
+		web_type = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_button));
 		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(inner_vbox), dd->web_radio_leo_gerspa, FALSE, FALSE, 0);
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button), TRUE);
+		gtk_widget_show(radio_button);
+		gtk_box_pack_start(GTK_BOX(inner_vbox), radio_button, FALSE, FALSE, 0);
+		g_object_set_data(G_OBJECT(radio_button), "type", GINT_TO_POINTER(WEBMODE_LEO_GERSPA));
+		g_signal_connect(G_OBJECT(radio_button), "toggled", G_CALLBACK(web_search_type_changed), dd);
 
-		dd->web_radio_other = gtk_radio_button_new_with_label(web_type, _("Use another website"));
+		radio_button = gtk_radio_button_new_with_label(web_type, _("Use another website"));
+		web_type = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_button));
 		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(inner_vbox), dd->web_radio_other, FALSE, FALSE, 0);
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button), TRUE);
+		gtk_widget_show(radio_button);
+		gtk_box_pack_start(GTK_BOX(inner_vbox), radio_button, FALSE, FALSE, 0);
+		g_object_set_data(G_OBJECT(radio_button), "type", GINT_TO_POINTER(WEBMODE_OTHER));
+		g_signal_connect(G_OBJECT(radio_button), "toggled", G_CALLBACK(web_search_type_changed), dd);
 
-		dd->web_entry_label = gtk_label_new_with_mnemonic(_("URL:"));
-		gtk_widget_show(dd->web_entry_label);
-		dd->web_entry = gtk_entry_new();
+		web_entry_label = gtk_label_new_with_mnemonic(_("URL:"));
+		gtk_widget_show(web_entry_label);
+		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);
+			gtk_entry_set_text(GTK_ENTRY(web_entry), dd->web_url);
+		gtk_widget_show(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(inner_vbox), entry_hbox, FALSE, FALSE, 0);
+		dd->web_entry_box = gtk_hbox_new(FALSE, 0);
+		gtk_widget_show(dd->web_entry_box);
+		gtk_box_pack_start(GTK_BOX(dd->web_entry_box), web_entry_label, FALSE, TRUE, 5);
+		gtk_box_pack_start(GTK_BOX(dd->web_entry_box), web_entry, FALSE, FALSE, 0);
+		gtk_box_pack_start(GTK_BOX(inner_vbox), dd->web_entry_box, FALSE, FALSE, 0);
 
+		g_object_set_data(G_OBJECT(dialog), "web_entry", web_entry);
+		g_object_set_data(G_OBJECT(dd->web_entry_box), "web_entry", web_entry);
+		g_object_set_data(G_OBJECT(dd->web_entry_box), "web_entry_label", web_entry_label);
+
 		label1 = 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(label1), TRUE);
 		gtk_misc_set_alignment(GTK_MISC(label1), 0, 0);
@@ -379,14 +485,15 @@
 		gtk_box_pack_start(GTK_BOX(notebook_vbox), inner_vbox, TRUE, TRUE, 5);
 
 		/* init the sensitive widgets */
-		use_webserver_toggled(GTK_TOGGLE_BUTTON(dd->web_radio_other), dd);
+		web_search_type_changed(GTK_RADIO_BUTTON(radio_button), dd);
 	}
 
 	/*
 	 * Page: ASPELL
 	 */
+#define PAGE_ASPELL /* only navigation in Geany's symbol list ;-) */
 	{
-		GtkWidget *table;
+		GtkWidget *table, *spell_entry, *spell_combo;
 
 		notebook_vbox = gtk_vbox_new(FALSE, 5);
 		gtk_widget_show(notebook_vbox);
@@ -397,21 +504,25 @@
 		label1 = gtk_label_new_with_mnemonic(_("Aspell program:"));
 		gtk_widget_show(label1);
 
-		dd->spell_entry = gtk_entry_new();
-		gtk_entry_set_max_length(GTK_ENTRY(dd->spell_entry), 256);
+		spell_entry = gtk_entry_new();
+		gtk_entry_set_max_length(GTK_ENTRY(spell_entry), 256);
 		if (dd->spell_bin != NULL)
 		{
-			gtk_entry_set_text(GTK_ENTRY(dd->spell_entry), dd->spell_bin);
+			gtk_entry_set_text(GTK_ENTRY(spell_entry), dd->spell_bin);
 		}
-		gtk_widget_show(dd->spell_entry);
+		gtk_widget_show(spell_entry);
 
 		label2 = gtk_label_new_with_mnemonic(_("Dictionary:"));
 		gtk_widget_show(label2);
 
-		dd->spell_combo = gtk_combo_box_new_text();
-		get_spell_dictionaries(dd);
-		gtk_widget_show(dd->spell_combo);
+		spell_combo = gtk_combo_box_new_text();
+		get_spell_dictionaries(spell_combo, dd);
+		gtk_widget_show(spell_combo);
 
+		g_object_set_data(G_OBJECT(dialog), "spell_combo", spell_combo);
+		g_object_set_data(G_OBJECT(dialog), "spell_entry", spell_entry);
+
+
 		table = gtk_table_new(2, 2, FALSE);
 		gtk_widget_show(table);
 		gtk_table_set_row_spacings(GTK_TABLE(table), 5);
@@ -422,7 +533,7 @@
 						(GtkAttachOptions) (0), 5, 5);
 		gtk_misc_set_alignment(GTK_MISC(label1), 1, 0);
 
-		gtk_table_attach(GTK_TABLE(table), dd->spell_entry, 1, 2, 0, 1,
+		gtk_table_attach(GTK_TABLE(table), spell_entry, 1, 2, 0, 1,
 						(GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
 						(GtkAttachOptions) (0), 5, 5);
 
@@ -431,11 +542,11 @@
 						(GtkAttachOptions) (0), 5, 0);
 		gtk_misc_set_alignment(GTK_MISC(label2), 1, 0);
 
-		gtk_table_attach(GTK_TABLE(table), dd->spell_combo, 1, 2, 1, 2,
+		gtk_table_attach(GTK_TABLE(table), spell_combo, 1, 2, 1, 2,
 						(GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
 						(GtkAttachOptions) (0), 5, 5);
 
-		gtk_box_pack_start(GTK_BOX(inner_vbox), table, TRUE, FALSE, 0);
+		gtk_box_pack_start(GTK_BOX(inner_vbox), table, FALSE, FALSE, 0);
 		gtk_box_pack_start(GTK_BOX(notebook_vbox), inner_vbox, TRUE, TRUE, 5);
 	}
 

Modified: xfce4-dict/trunk/panel-plugin/xfce4-dict-plugin.c
===================================================================
--- xfce4-dict/trunk/panel-plugin/xfce4-dict-plugin.c	2008-04-02 12:22:29 UTC (rev 4499)
+++ xfce4-dict/trunk/panel-plugin/xfce4-dict-plugin.c	2008-04-02 13:21:39 UTC (rev 4500)
@@ -40,7 +40,6 @@
 #include <string.h>
 
 #include "libdict.h"
-#include "popup_def.h"
 
 
 typedef struct
@@ -147,22 +146,31 @@
 }
 
 
-/* Handle user messages (xfce4-popup-dict) */
+/* Handle user messages (xfce4-dict) */
 static gboolean dict_plugin_message_received(GtkWidget *w, GdkEventClient *ev, DictPanelData *dpd)
 {
-	if (ev->data_format == 8 && *(ev->data.b) != '\0')
+	if (ev->data_format == 8 && strncmp(ev->data.b, "xfdict", 6) == 0)
 	{
-		if (strcmp(XFCE_DICT_WINDOW_MESSAGE, ev->data.b) == 0)
-		{	/* open the main window */
+		gchar flags = ev->data.b[6];
+		gchar *tts = ev->data.b + 7;
+
+		dpd->dd->mode_in_use = dict_set_search_mode_from_flags(dpd->dd->mode_in_use, flags);
+
+		if (NZV(tts))
+		{
+			gtk_entry_set_text(GTK_ENTRY(dpd->dd->main_entry), tts);
+			dict_search_word(dpd->dd, tts);
+		}
+		else if (flags & DICT_FLAGS_FOCUS_PANEL_ENTRY && dpd->dd->show_panel_entry)
+		{
+			xfce_panel_plugin_focus_widget(dpd->plugin, dpd->dd->panel_entry);
+		}
+		else
+		{
 			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 (dpd->dd->show_panel_entry)
-				xfce_panel_plugin_focus_widget(dpd->plugin, dpd->dd->panel_entry);
-		}
+		return TRUE;
 	}
 
 	return FALSE;

Modified: xfce4-dict/trunk/src/popup_plugin.c
===================================================================
--- xfce4-dict/trunk/src/popup_plugin.c	2008-04-02 12:22:29 UTC (rev 4499)
+++ xfce4-dict/trunk/src/popup_plugin.c	2008-04-02 13:21:39 UTC (rev 4500)
@@ -25,10 +25,10 @@
 #include <X11/Xlib.h>
 #include <string.h>
 
-#include "popup_def.h"
+#include "libdict.h"
 
 
-static gboolean xfce4_check_is_running(GtkWidget *widget, Window *xid)
+static gboolean check_is_running(GtkWidget *widget, Window *xid)
 {
 	GdkScreen *gscreen;
 	gchar selection_name[32];
@@ -46,15 +46,13 @@
 }
 
 
-gboolean dict_find_panel_plugin(void)
+gboolean dict_find_panel_plugin(gchar flags, const gchar *text)
 {
 	gboolean ret = FALSE;
 	GdkEventClient gev;
 	GtkWidget *win;
 	Window id;
 
-    gtk_window_set_default_icon_name("xfce4-dict");
-
 	win = gtk_invisible_new();
 	gtk_widget_realize(win);
 
@@ -63,30 +61,18 @@
 	gev.send_event = TRUE;
 	gev.message_type = gdk_atom_intern("STRING", FALSE);
 	gev.data_format = 8;
-	/* temporary disabled */
-#if 0
-	if (argc > 1 && (strcmp(argv[1], "--text-field") == 0 || strcmp(argv[1], "-t") == 0))
-	{
-		strcpy(gev.data.b, XFCE_DICT_TEXTFIELD_MESSAGE);
-	}
-	else if (argc > 1 && (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-h") == 0))
-	{
-		g_print(_("Usage: %s [options]\n"), argv[0]);
-		g_print(_("Options:\n"));
-		g_print(_("    -t, --text-field    grap the focus on the text field in the panel\n"));
-		g_print(_("    -h, --help          show this help and exit\n"));
-		g_print(_("If called without any options, the xfce4-dict-plugin main window is shown.\n"));
-		return 0;
-	}
-	else
-	{
-		strcpy(gev.data.b, XFCE_DICT_WINDOW_MESSAGE);
-	}
-#else
-	strcpy(gev.data.b, XFCE_DICT_WINDOW_MESSAGE);
-#endif
 
-	if (xfce4_check_is_running(win, &id))
+	if (text == NULL)
+		text = "";
+
+	/* format of the send string: "xfdict?text":
+	 * "xfdict" is for identification of ourselves
+	 * ? is a bitmask to control the behaviour, it can contain one or more of DICT_FLAGS_*,
+	 * we send it as %c to ensure it takes only one char in the string,
+	 * everything after this is the text to search, given on command line */
+	g_snprintf(gev.data.b, sizeof gev.data.b, "xfdict%c%s", flags, text);
+
+	if (check_is_running(win, &id))
 	{
 		gdk_event_send_client_message((GdkEvent*) &gev, (GdkNativeWindow) id);
 		ret = TRUE;

Modified: xfce4-dict/trunk/src/popup_plugin.h
===================================================================
--- xfce4-dict/trunk/src/popup_plugin.h	2008-04-02 12:22:29 UTC (rev 4499)
+++ xfce4-dict/trunk/src/popup_plugin.h	2008-04-02 13:21:39 UTC (rev 4500)
@@ -18,10 +18,10 @@
  */
 
 
-#ifndef POPUP_DEF_H
-#define POPUP_DEF_H 1
+#ifndef POPUP_PLUGIN_H
+#define POPUP_PLUGIN_H 1
 
 
-gboolean dict_find_panel_plugin(void);
+gboolean dict_find_panel_plugin(gboolean focus_panel_entry, const gchar *text);
 
 #endif

Modified: xfce4-dict/trunk/src/xfce4-dict.c
===================================================================
--- xfce4-dict/trunk/src/xfce4-dict.c	2008-04-02 12:22:29 UTC (rev 4499)
+++ xfce4-dict/trunk/src/xfce4-dict.c	2008-04-02 13:21:39 UTC (rev 4500)
@@ -39,7 +39,23 @@
 #include "popup_plugin.h"
 
 
+static gboolean show_version = FALSE;
+static gboolean focus_panel_entry = FALSE;
+static gboolean mode_dict = FALSE;
+static gboolean mode_web = FALSE;
+static gboolean mode_spell = FALSE;
 
+static GOptionEntry cli_options[] =
+{
+	{ "dict", 'd', 0, G_OPTION_ARG_NONE, &mode_dict, N_("Search the given text using a DICTD server"), NULL },
+	{ "web", 'w', 0, G_OPTION_ARG_NONE, &mode_web, N_("Search the given text using a web-based search engine"), NULL },
+	{ "spell", 's', 0, G_OPTION_ARG_NONE, &mode_spell, N_("Check the given text with a spellchecker"), NULL },
+	{ "text-field", 't', 0, G_OPTION_ARG_NONE, &focus_panel_entry, N_("Grab the focus on the text field in the panel"), NULL },
+	{ "version", 'v', 0, G_OPTION_ARG_NONE, &show_version, N_("Show version and exit"), NULL },
+	{ NULL, 0, 0, 0, NULL, NULL, NULL }
+};
+//~ If called without any options, the xfce4-dict-plugin main window is shown.
+
 static gboolean main_quit(GtkWidget *widget, GdkEvent *event, DictData *dd)
 {
 	dict_free_data(dd);
@@ -64,22 +80,61 @@
 }
 
 
+static gchar get_flags()
+{
+	gchar flags = 0;
+
+	if (focus_panel_entry)
+		flags |= DICT_FLAGS_FOCUS_PANEL_ENTRY;
+	if (mode_dict)
+		flags |= DICT_FLAGS_MODE_DICT;
+	if (mode_web)
+		flags |= DICT_FLAGS_MODE_WEB;
+	if (mode_spell)
+		flags |= DICT_FLAGS_MODE_SPELL;
+
+	return flags;
+}
+
+
 gint main(gint argc, gchar *argv[])
 {
 	DictData *dd;
+	GOptionContext *context;
+	gchar flags;
 
 #ifdef ENABLE_NLS
 	xfce_textdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8");
 #endif
 
+	context = g_option_context_new(_("[TEXT]"));
+	g_option_context_add_main_entries(context, cli_options, GETTEXT_PACKAGE);
+	g_option_group_set_translation_domain(g_option_context_get_main_group(context), GETTEXT_PACKAGE);
+	g_option_context_add_group(context, gtk_get_option_group(FALSE));
+	g_option_context_parse(context, &argc, &argv, NULL);
+	g_option_context_free(context);
+
 	gtk_init(&argc, &argv);
     gtk_window_set_default_icon_name("xfce4-dict");
 
+	if (show_version)
+	{
+		printf(PACKAGE " " VERSION " ");
+		printf(_("(built on %s with GTK %d.%d.%d, GLib %d.%d.%d)"),
+				__DATE__, GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION,
+				GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION);
+		printf("\n");
+
+		exit(0);
+	}
+
+	flags = get_flags();
+
 	/* try to find an existing panel plugin and pop it up */
-	if (dict_find_panel_plugin())
+	if (dict_find_panel_plugin(flags, (argc > 1) ? argv[1] : NULL))
 		exit(0);
 
-	/* no plugin found, start usual stand-alone app */
+	/* no plugin found, start stand-alone app */
 
 	dd = dict_create_dictdata();
 	dd->is_plugin = FALSE;
@@ -88,6 +143,9 @@
 
 	dict_read_rc_file(dd);
 
+	/* set search mode from command line flags, if any */
+	dd->mode_in_use = dict_set_search_mode_from_flags(dd->mode_in_use, flags);
+
 	dict_gui_create_main_window(dd);
 
 	g_signal_connect(dd->window, "delete-event", G_CALLBACK(main_quit), dd);
@@ -96,6 +154,11 @@
 	g_signal_connect(dd->close_menu_item, "activate", G_CALLBACK(close_button_clicked), dd);
 	g_signal_connect(dd->pref_menu_item, "activate", G_CALLBACK(pref_dialog_activated), dd);
 
+	/* search text from command line options, if any */
+	/* TODO take all remaining args, not only argv[1] */
+	if (argc > 1)
+		dict_search_word(dd, argv[1]);
+
 	dict_gui_status_add(dd, _("Ready."));
 
 	siginterrupt(SIGALRM, 1);




More information about the Goodies-commits mailing list