[Goodies-commits] r6066 - xfce4-dict/trunk/lib
Enrico Troeger
enrico at xfce.org
Tue Nov 11 23:25:07 CET 2008
Author: enrico
Date: 2008-11-11 22:25:07 +0000 (Tue, 11 Nov 2008)
New Revision: 6066
Modified:
xfce4-dict/trunk/lib/common.h
xfce4-dict/trunk/lib/gui.c
Log:
Add a 'Search' menu item to the textview popup menu for quick search of any text in search results.
Modified: xfce4-dict/trunk/lib/common.h
===================================================================
--- xfce4-dict/trunk/lib/common.h 2008-11-11 22:25:04 UTC (rev 6065)
+++ xfce4-dict/trunk/lib/common.h 2008-11-11 22:25:07 UTC (rev 6066)
@@ -99,6 +99,7 @@
GtkTextIter textiter;
GtkTextTag *link_tag;
GtkTextTag *phon_tag;
+ GtkTextMark *mark_click;
GdkPixbuf *icon;
GdkColor *link_color;
Modified: xfce4-dict/trunk/lib/gui.c
===================================================================
--- xfce4-dict/trunk/lib/gui.c 2008-11-11 22:25:04 UTC (rev 6065)
+++ xfce4-dict/trunk/lib/gui.c 2008-11-11 22:25:07 UTC (rev 6066)
@@ -79,15 +79,14 @@
static gboolean textview_key_press_event(GtkWidget *text_view, GdkEventKey *event, DictData *dd)
{
GtkTextIter iter;
- GtkTextBuffer *buffer;
switch (event->keyval)
{
case GDK_Return:
case GDK_KP_Enter:
{
- buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view));
- gtk_text_buffer_get_iter_at_mark(buffer, &iter, gtk_text_buffer_get_insert(buffer));
+ gtk_text_buffer_get_iter_at_mark(dd->main_textbuffer, &iter,
+ gtk_text_buffer_get_insert(dd->main_textbuffer));
textview_follow_if_link(text_view, &iter, dd);
break;
}
@@ -102,7 +101,6 @@
static gboolean textview_event_after(GtkWidget *text_view, GdkEvent *ev, DictData *dd)
{
GtkTextIter start, end, iter;
- GtkTextBuffer *buffer;
GdkEventButton *event;
gint x, y;
@@ -114,10 +112,8 @@
if (event->button != 1)
return FALSE;
- buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view));
-
/* we shouldn't follow a link if the user has selected something */
- gtk_text_buffer_get_selection_bounds(buffer, &start, &end);
+ gtk_text_buffer_get_selection_bounds(dd->main_textbuffer, &start, &end);
if (gtk_text_iter_get_offset(&start) != gtk_text_iter_get_offset(&end))
return FALSE;
@@ -207,6 +203,71 @@
}
+static void textview_popup_item_cb(GtkWidget *widget, DictData *dd)
+{
+ gchar *word;
+ GtkTextIter start, end;
+
+ if (! gtk_text_buffer_get_selection_bounds(dd->main_textbuffer, &start, &end))
+ {
+ gint wx, wy, bx, by;
+
+ gdk_window_get_pointer(dd->main_textview->window, &wx, &wy, NULL);
+
+ gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(dd->main_textview),
+ GTK_TEXT_WINDOW_WIDGET, wx, wy, &bx, &by);
+
+ gtk_text_buffer_get_iter_at_mark(dd->main_textbuffer, &start, dd->mark_click);
+ if (! gtk_text_iter_starts_word(&start))
+ gtk_text_iter_backward_word_start(&start);
+
+ end = start;
+
+ if (gtk_text_iter_inside_word(&end))
+ gtk_text_iter_forward_word_end(&end);
+ }
+
+ word = gtk_text_buffer_get_text(dd->main_textbuffer, &start, &end, FALSE);
+
+ gtk_entry_set_text(GTK_ENTRY(dd->main_entry), word);
+ dict_search_word(dd, word);
+ gtk_widget_grab_focus(dd->main_entry);
+
+ g_free(word);
+}
+
+
+static void textview_populate_popup_cb(GtkTextView *textview, GtkMenu *menu, DictData *dd)
+{
+ GtkWidget *search = gtk_image_menu_item_new_from_stock(GTK_STOCK_FIND, NULL);
+ GtkWidget *sep = gtk_separator_menu_item_new();
+
+ gtk_widget_show(sep);
+ gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), sep);
+
+ gtk_widget_show(search);
+ gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), search);
+
+ g_signal_connect(search, "activate", G_CALLBACK(textview_popup_item_cb), dd);
+}
+
+
+static gboolean textview_button_press_cb(GtkTextView *view, GdkEventButton *event, DictData *dd)
+{
+ if (event->button == 3)
+ {
+ gint x, y;
+ GtkTextIter iter;
+
+ gtk_text_view_window_to_buffer_coords(view, GTK_TEXT_WINDOW_TEXT, event->x, event->y, &x, &y);
+ gtk_text_view_get_iter_at_location(view, &iter, x, y);
+ gtk_text_buffer_move_mark(dd->main_textbuffer, dd->mark_click, &iter);
+ }
+
+ return FALSE;
+}
+
+
void dict_gui_set_panel_entry_text(DictData *dd, const gchar *text)
{
if (dd->panel_entry != NULL)
@@ -591,7 +652,18 @@
g_signal_connect(dd->main_textview, "visibility-notify-event",
G_CALLBACK(textview_visibility_notify_event), NULL);
}
+ /* support for 'Search' menu item in the textview popup menu */
+ {
+ GtkTextIter start;
+ gtk_text_buffer_get_bounds(dd->main_textbuffer, &start, &start);
+ dd->mark_click = gtk_text_buffer_create_mark(dd->main_textbuffer, NULL, &start, TRUE);
+ g_signal_connect(dd->main_textview, "button-press-event",
+ G_CALLBACK(textview_button_press_cb), dd);
+ g_signal_connect(dd->main_textview, "populate-popup",
+ G_CALLBACK(textview_populate_popup_cb), dd);
+ }
+
gtk_widget_show(dd->main_textview);
gtk_container_add(GTK_CONTAINER(scrolledwindow_results), dd->main_textview);
More information about the Goodies-commits
mailing list