From c095466a28b2f354dc5e8580a08bfcb3ce87e48a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrico=20Tr=C3=83=C2=B6ger?= <enrico@xfce.org> Date: Wed, 2 Apr 2008 13:21:39 +0000 Subject: [PATCH] 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. (Old svn revision: 4500) --- ChangeLog | 18 +- lib/common.c | 41 +++- lib/common.h | 70 +++--- lib/dictd.c | 15 +- lib/gui.c | 28 ++- lib/popup_def.h | 38 ---- lib/prefs.c | 361 ++++++++++++++++++++----------- panel-plugin/xfce4-dict-plugin.c | 30 ++- src/popup_plugin.c | 42 ++-- src/popup_plugin.h | 6 +- src/xfce4-dict.c | 67 +++++- 11 files changed, 445 insertions(+), 271 deletions(-) delete mode 100644 lib/popup_def.h diff --git a/ChangeLog b/ChangeLog index 0528e64..0965aba 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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) diff --git a/lib/common.c b/lib/common.c index 65ae9bc..b720e3e 100644 --- a/lib/common.c +++ b/lib/common.c @@ -213,6 +213,19 @@ static gboolean start_web_query(DictData *dd, const gchar *word) } +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 @@ void dict_search_word(DictData *dd, const gchar *word) 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 @@ void dict_search_word(DictData *dd, const gchar *word) 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_search_word(DictData *dd, const gchar *word) 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 @@ void dict_read_rc_file(DictData *dd) 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 @@ void dict_read_rc_file(DictData *dd) 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 @@ void dict_write_rc_file(DictData *dd) 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); diff --git a/lib/common.h b/lib/common.h index 84cc47f..01c538f 100644 --- a/lib/common.h +++ b/lib/common.h @@ -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 @@ enum 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 *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; + 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; + + /* 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); diff --git a/lib/dictd.c b/lib/dictd.c index 0d712bd..74a9d15 100644 --- a/lib/dictd.c +++ b/lib/dictd.c @@ -326,13 +326,10 @@ gboolean dict_dictd_get_list(GtkWidget *button, DictData *dd) 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 @@ gboolean dict_dictd_get_list(GtkWidget *button, DictData *dd) 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 @@ gboolean dict_dictd_get_list(GtkWidget *button, DictData *dd) 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 @@ gboolean dict_dictd_get_list(GtkWidget *button, DictData *dd) /* 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; } diff --git a/lib/gui.c b/lib/gui.c index 374153c..ecb6d54 100644 --- a/lib/gui.c +++ b/lib/gui.c @@ -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 @@ void dict_gui_clear_text_buffer(DictData *dd) 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 @@ static void search_mode_dict_toggled(GtkToggleButton *togglebutton, DictData *dd { 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 @@ static void search_mode_web_toggled(GtkToggleButton *togglebutton, DictData *dd) { 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 @@ static void search_mode_spell_toggled(GtkToggleButton *togglebutton, DictData *d { 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,6 +136,10 @@ const guint8 *dict_gui_get_icon_data(void) 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(); @@ -141,12 +148,15 @@ static GtkWidget *create_file_menu(DictData *dd) 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 @@ static GtkWidget *create_file_menu(DictData *dd) 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 @@ void dict_gui_create_main_window(DictData *dd) 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); diff --git a/lib/popup_def.h b/lib/popup_def.h deleted file mode 100644 index 1cb119c..0000000 --- a/lib/popup_def.h +++ /dev/null @@ -1,38 +0,0 @@ -/* $Id$ - * - * Copyright 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 POPUP_DEF_H -#define POPUP_DEF_H 1 - - -#ifndef XFCE_DICT_WINDOW_MESSAGE -#define XFCE_DICT_WINDOW_MESSAGE "xfce4-dict" -#endif - -#ifndef XFCE_DICT_TEXTFIELD_MESSAGE -#define XFCE_DICT_TEXTFIELD_MESSAGE "xfce4-dict-atptr" -#endif - -#ifndef XFCE_DICT_SELECTION -#define XFCE_DICT_SELECTION "XFCE_DICT_SEL" -#endif - - -#endif diff --git a/lib/prefs.c b/lib/prefs.c index 3390bc1..51c19b0 100644 --- a/lib/prefs.c +++ b/lib/prefs.c @@ -33,19 +33,40 @@ 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 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(DictData *dd) +static void get_spell_dictionaries(GtkWidget *spell_combo, DictData *dd) { if (NZV(dd->spell_bin)) { @@ -64,9 +85,9 @@ static void get_spell_dictionaries(DictData *dd) 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 @@ static void prefs_dialog_response(GtkWidget *dlg, gint response, DictData *dd) } /* 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 @@ static void prefs_dialog_response(GtkWidget *dlg, gint response, DictData *dd) 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 @@ static void prefs_dialog_response(GtkWidget *dlg, gint response, DictData *dd) } 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 @@ GtkWidget *dict_prefs_dialog_show(GtkWidget *parent, DictData *dd) /* * 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 @@ GtkWidget *dict_prefs_dialog_show(GtkWidget *parent, DictData *dd) 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); - - /* 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); - - 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); + if (dd->is_plugin) + { + GtkWidget *pe_hbox, *panel_entry_size_label, *panel_entry_size_spinner, *check_panel_entry; + + 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); + + 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); + + /* 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); + + 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 @@ GtkWidget *dict_prefs_dialog_show(GtkWidget *parent, DictData *dd) 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 @@ GtkWidget *dict_prefs_dialog_show(GtkWidget *parent, DictData *dd) (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 @@ GtkWidget *dict_prefs_dialog_show(GtkWidget *parent, DictData *dd) (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 @@ GtkWidget *dict_prefs_dialog_show(GtkWidget *parent, DictData *dd) (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 @@ GtkWidget *dict_prefs_dialog_show(GtkWidget *parent, DictData *dd) /* * 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,50 +415,67 @@ GtkWidget *dict_prefs_dialog_show(GtkWidget *parent, DictData *dd) 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)); - 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); + 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); - 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(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(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); + + 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); - - 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)); + 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); + + 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); - - dd->web_radio_other = gtk_radio_button_new_with_label(web_type, _("Use another website")); + 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); + + 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); - - dd->web_entry_label = gtk_label_new_with_mnemonic(_("URL:")); - gtk_widget_show(dd->web_entry_label); - dd->web_entry = gtk_entry_new(); + 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); + + 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); @@ -379,14 +485,15 @@ GtkWidget *dict_prefs_dialog_show(GtkWidget *parent, DictData *dd) 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,20 +504,24 @@ GtkWidget *dict_prefs_dialog_show(GtkWidget *parent, DictData *dd) 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); @@ -422,7 +533,7 @@ GtkWidget *dict_prefs_dialog_show(GtkWidget *parent, DictData *dd) (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 @@ GtkWidget *dict_prefs_dialog_show(GtkWidget *parent, DictData *dd) (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); } diff --git a/panel-plugin/xfce4-dict-plugin.c b/panel-plugin/xfce4-dict-plugin.c index edb3d56..bbb2605 100644 --- a/panel-plugin/xfce4-dict-plugin.c +++ b/panel-plugin/xfce4-dict-plugin.c @@ -40,7 +40,6 @@ #include <string.h> #include "libdict.h" -#include "popup_def.h" typedef struct @@ -147,22 +146,31 @@ static void dict_plugin_panel_button_clicked(GtkWidget *button, DictPanelData *d } -/* 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; diff --git a/src/popup_plugin.c b/src/popup_plugin.c index 11df4a5..9113faf 100644 --- a/src/popup_plugin.c +++ b/src/popup_plugin.c @@ -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 @@ static gboolean xfce4_check_is_running(GtkWidget *widget, Window *xid) } -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 @@ gboolean dict_find_panel_plugin(void) 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; diff --git a/src/popup_plugin.h b/src/popup_plugin.h index e92ef90..7145164 100644 --- a/src/popup_plugin.h +++ b/src/popup_plugin.h @@ -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 diff --git a/src/xfce4-dict.c b/src/xfce4-dict.c index 9191095..e0395b0 100644 --- a/src/xfce4-dict.c +++ b/src/xfce4-dict.c @@ -39,6 +39,22 @@ #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) { @@ -64,22 +80,61 @@ void pref_dialog_activated(GtkMenuItem *menuitem, DictData *dd) } +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 @@ gint main(gint argc, gchar *argv[]) 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 @@ gint main(gint argc, gchar *argv[]) 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); -- GitLab