[Xfce4-commits] <terminal:master> Add search dialog.
Nick Schermer
noreply at xfce.org
Thu Dec 27 20:36:01 CET 2012
Updating branch refs/heads/master
to 5e15028e1996f53490687414c2ceac2c80521979 (commit)
from 8370e736a1bcf4fc585dece42dc328fd1b7d4d70 (commit)
commit 5e15028e1996f53490687414c2ceac2c80521979
Author: Nick Schermer <nick at xfce.org>
Date: Thu Dec 27 20:04:14 2012 +0100
Add search dialog.
po/POTFILES.in | 1 +
terminal/Makefile.am | 2 +
terminal/terminal-screen.c | 39 +++++
terminal/terminal-screen.h | 11 ++
terminal/terminal-search-dialog.c | 279 +++++++++++++++++++++++++++++++++++++
terminal/terminal-search-dialog.h | 55 +++++++
terminal/terminal-window-ui.xml | 6 +
terminal/terminal-window.c | 110 +++++++++++++++
8 files changed, 503 insertions(+), 0 deletions(-)
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 3e11c35..36d1199 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -17,6 +17,7 @@ terminal/terminal-preferences-dialog.c
terminal/terminal-preferences.glade
terminal/terminal-preferences.c
terminal/terminal-screen.c
+terminal/terminal-search-dialog.c
terminal/terminal-widget.c
terminal/terminal-window.c
diff --git a/terminal/Makefile.am b/terminal/Makefile.am
index eeb1817..cb1b96f 100644
--- a/terminal/Makefile.am
+++ b/terminal/Makefile.am
@@ -24,6 +24,7 @@ xfce4_terminal_headers = \
terminal-options.h \
terminal-preferences.h \
terminal-preferences-dialog.h \
+ terminal-search-dialog.h \
terminal-private.h \
terminal-screen.h \
terminal-widget.h \
@@ -42,6 +43,7 @@ xfce4_terminal_SOURCES = \
terminal-options.c \
terminal-preferences.c \
terminal-preferences-dialog.c \
+ terminal-search-dialog.c \
terminal-screen.c \
terminal-widget.c \
terminal-window.c
diff --git a/terminal/terminal-screen.c b/terminal/terminal-screen.c
index 98a2840..2f93ab0 100644
--- a/terminal/terminal-screen.c
+++ b/terminal/terminal-screen.c
@@ -2188,3 +2188,42 @@ terminal_screen_set_encoding (TerminalScreen *screen,
terminal_return_if_fail (TERMINAL_IS_SCREEN (screen));
vte_terminal_set_encoding (VTE_TERMINAL (screen->terminal), charset);
}
+
+
+
+void
+terminal_screen_search_set_gregex (TerminalScreen *screen,
+ GRegex *regex,
+ gboolean wrap_around)
+{
+ terminal_return_if_fail (TERMINAL_IS_SCREEN (screen));
+ vte_terminal_search_set_gregex (VTE_TERMINAL (screen->terminal), regex);
+ vte_terminal_search_set_wrap_around (VTE_TERMINAL (screen->terminal), wrap_around);
+}
+
+
+
+gboolean
+terminal_screen_search_has_gregex (TerminalScreen *screen)
+{
+ terminal_return_val_if_fail (TERMINAL_IS_SCREEN (screen), FALSE);
+ return vte_terminal_search_get_gregex (VTE_TERMINAL (screen->terminal)) != NULL;
+}
+
+
+
+void
+terminal_screen_search_find_next (TerminalScreen *screen)
+{
+ terminal_return_if_fail (TERMINAL_IS_SCREEN (screen));
+ vte_terminal_search_find_next (VTE_TERMINAL (screen->terminal));
+}
+
+
+
+void
+terminal_screen_search_find_previous (TerminalScreen *screen)
+{
+ terminal_return_if_fail (TERMINAL_IS_SCREEN (screen));
+ vte_terminal_search_find_previous (VTE_TERMINAL (screen->terminal));
+}
diff --git a/terminal/terminal-screen.h b/terminal/terminal-screen.h
index cf4badc..1a03a42 100644
--- a/terminal/terminal-screen.h
+++ b/terminal/terminal-screen.h
@@ -95,6 +95,17 @@ const gchar *terminal_screen_get_encoding (TerminalScreen *scree
void terminal_screen_set_encoding (TerminalScreen *screen,
const gchar *charset);
+void terminal_screen_search_set_gregex (TerminalScreen *screen,
+ GRegex *regex,
+ gboolean wrap_around);
+
+gboolean terminal_screen_search_has_gregex (TerminalScreen *screen);
+
+void terminal_screen_search_find_next (TerminalScreen *screen);
+
+void terminal_screen_search_find_previous (TerminalScreen *screen);
+
+
G_END_DECLS
#endif /* !__TERMINAL_SCREEN_H__ */
diff --git a/terminal/terminal-search-dialog.c b/terminal/terminal-search-dialog.c
new file mode 100644
index 0000000..ef3cdb7
--- /dev/null
+++ b/terminal/terminal-search-dialog.c
@@ -0,0 +1,279 @@
+/*-
+ * Copyright 2012 Nick Schermer <nick at xfce.org>
+ *
+ * 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 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., 59 Temple
+ * Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_MEMORY_H
+#include <memory.h>
+#endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include <libxfce4ui/libxfce4ui.h>
+
+#include <terminal/terminal-search-dialog.h>
+#include <terminal/terminal-private.h>
+
+
+
+static void terminal_search_dialog_finalize (GObject *object);
+static void terminal_search_dialog_clear_gregex (TerminalSearchDialog *dialog);
+static void terminal_search_dialog_entry_icon_release (GtkWidget *entry,
+ GtkEntryIconPosition icon_pos);
+static void terminal_search_dialog_entry_changed (GtkWidget *entry,
+ TerminalSearchDialog *dialog);
+
+
+struct _TerminalSearchDialogClass
+{
+ GtkDialogClass __parent__;
+};
+
+struct _TerminalSearchDialog
+{
+ GtkDialog __parent__;
+
+ GRegex *last_gregex;
+
+ GtkWidget *button_prev;
+ GtkWidget *button_next;
+
+ GtkWidget *entry;
+
+ GtkWidget *match_case;
+ GtkWidget *match_regex;
+ GtkWidget *match_word;
+ GtkWidget *wrap_around;
+};
+
+
+
+G_DEFINE_TYPE (TerminalSearchDialog, terminal_search_dialog, GTK_TYPE_DIALOG)
+
+
+
+static void
+terminal_search_dialog_class_init (TerminalSearchDialogClass *klass)
+{
+ GObjectClass *gobject_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gobject_class->finalize = terminal_search_dialog_finalize;
+}
+
+
+
+static void
+terminal_search_dialog_init (TerminalSearchDialog *dialog)
+{
+ GtkWidget *hbox;
+ GtkWidget *vbox;
+ GtkWidget *label;
+
+ gtk_window_set_title (GTK_WINDOW (dialog), _("Find"));
+ gtk_window_set_default_size (GTK_WINDOW (dialog), 400, -1);
+
+ gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
+
+ dialog->button_prev = xfce_gtk_button_new_mixed (GTK_STOCK_GO_BACK, _("_Previous"));
+ gtk_dialog_add_action_widget (GTK_DIALOG (dialog), dialog->button_prev, TERMINAL_RESPONSE_SEARCH_PREV);
+ gtk_widget_set_can_default (dialog->button_prev, TRUE);
+
+ dialog->button_next = xfce_gtk_button_new_mixed (GTK_STOCK_GO_FORWARD, _("_Next"));
+ gtk_dialog_add_action_widget (GTK_DIALOG (dialog), dialog->button_next, TERMINAL_RESPONSE_SEARCH_NEXT);
+
+ vbox = gtk_vbox_new (FALSE, 6);
+ gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), vbox, TRUE, TRUE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
+
+ hbox = gtk_hbox_new (FALSE, 12);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+
+ label = gtk_label_new_with_mnemonic (_("_Search for:"));
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+ dialog->entry = gtk_entry_new ();
+ gtk_box_pack_start (GTK_BOX (hbox), dialog->entry, TRUE, TRUE, 0);
+ gtk_label_set_mnemonic_widget (GTK_LABEL (label), dialog->entry);
+ gtk_entry_set_activates_default (GTK_ENTRY (dialog->entry), TRUE);
+ gtk_entry_set_icon_from_stock (GTK_ENTRY (dialog->entry), GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_CLEAR);
+ g_signal_connect (G_OBJECT (dialog->entry), "icon-release",
+ G_CALLBACK (terminal_search_dialog_entry_icon_release), NULL);
+ g_signal_connect (G_OBJECT (dialog->entry), "changed",
+ G_CALLBACK (terminal_search_dialog_entry_changed), dialog);
+
+ dialog->match_case = gtk_check_button_new_with_mnemonic (_("C_ase sensitive"));
+ gtk_box_pack_start (GTK_BOX (vbox), dialog->match_case, FALSE, FALSE, 0);
+ g_signal_connect_swapped (G_OBJECT (dialog->match_case), "toggled",
+ G_CALLBACK (terminal_search_dialog_clear_gregex), dialog);
+
+ dialog->match_regex = gtk_check_button_new_with_mnemonic (_("Match as _regular expression"));
+ gtk_box_pack_start (GTK_BOX (vbox), dialog->match_regex, FALSE, FALSE, 0);
+ g_signal_connect_swapped (G_OBJECT (dialog->match_regex), "toggled",
+ G_CALLBACK (terminal_search_dialog_clear_gregex), dialog);
+
+ dialog->match_word = gtk_check_button_new_with_mnemonic (_("Match _entire word only"));
+ gtk_box_pack_start (GTK_BOX (vbox), dialog->match_word, FALSE, FALSE, 0);
+ g_signal_connect_swapped (G_OBJECT (dialog->match_word), "toggled",
+ G_CALLBACK (terminal_search_dialog_clear_gregex), dialog);
+
+ dialog->wrap_around = gtk_check_button_new_with_mnemonic (_("_Wrap around"));
+ gtk_box_pack_start (GTK_BOX (vbox), dialog->wrap_around, FALSE, FALSE, 0);
+ g_signal_connect_swapped (G_OBJECT (dialog->wrap_around), "toggled",
+ G_CALLBACK (terminal_search_dialog_clear_gregex), dialog);
+
+ terminal_search_dialog_entry_changed (dialog->entry, dialog);
+}
+
+
+
+static void
+terminal_search_dialog_finalize (GObject *object)
+{
+ terminal_search_dialog_clear_gregex (TERMINAL_SEARCH_DIALOG (object));
+
+ (*G_OBJECT_CLASS (terminal_search_dialog_parent_class)->finalize) (object);
+}
+
+
+
+static void
+terminal_search_dialog_clear_gregex (TerminalSearchDialog *dialog)
+{
+ if (dialog->last_gregex != NULL)
+ {
+ g_regex_unref (dialog->last_gregex);
+ dialog->last_gregex = NULL;
+ }
+}
+
+
+
+static void
+terminal_search_dialog_entry_icon_release (GtkWidget *entry,
+ GtkEntryIconPosition icon_pos)
+{
+ if (icon_pos == GTK_ENTRY_ICON_SECONDARY)
+ gtk_entry_set_text (GTK_ENTRY (entry), "");
+}
+
+
+
+static void
+terminal_search_dialog_entry_changed (GtkWidget *entry,
+ TerminalSearchDialog *dialog)
+{
+ const gchar *text;
+ gboolean has_text;
+
+ text = gtk_entry_get_text (GTK_ENTRY (dialog->entry));
+ has_text = IS_STRING (text);
+
+ terminal_search_dialog_clear_gregex (dialog);
+
+ gtk_widget_set_sensitive (dialog->button_prev, has_text);
+ gtk_widget_set_sensitive (dialog->button_next, has_text);
+
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog),
+ has_text ? TERMINAL_RESPONSE_SEARCH_PREV : GTK_RESPONSE_CLOSE);
+}
+
+
+
+GtkWidget *
+terminal_search_dialog_new (GtkWindow *parent)
+{
+ return g_object_new (TERMINAL_TYPE_SEARCH_DIALOG,
+ "transient-for", parent, NULL);
+}
+
+
+
+gboolean
+terminal_search_dialog_get_wrap_around (TerminalSearchDialog *dialog)
+{
+ terminal_return_val_if_fail (TERMINAL_IS_SEARCH_DIALOG (dialog), FALSE);
+ return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->wrap_around));
+}
+
+
+
+GRegex *
+terminal_search_dialog_get_regex (TerminalSearchDialog *dialog,
+ GError **error)
+{
+ const gchar *pattern;
+ GRegexCompileFlags flags = G_REGEX_OPTIMIZE;
+ gchar *pattern_escaped = NULL;
+ gchar *word_regex = NULL;
+ GRegex *regex;
+
+ terminal_return_val_if_fail (TERMINAL_IS_SEARCH_DIALOG (dialog), NULL);
+ terminal_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+ /* if not cleared, use the old regex */
+ if (dialog->last_gregex != NULL)
+ return g_regex_ref (dialog->last_gregex);
+
+ /* unset if no pattern is typed */
+ pattern = gtk_entry_get_text (GTK_ENTRY (dialog->entry));
+ if (!IS_STRING (pattern))
+ return NULL;
+
+ if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->match_case)))
+ flags |= G_REGEX_CASELESS;
+
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->match_regex)))
+ flags |= G_REGEX_MULTILINE;
+ else
+ {
+ pattern_escaped = g_regex_escape_string (pattern, -1);
+ pattern = pattern_escaped;
+ }
+
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->match_word)))
+ {
+ word_regex = g_strdup_printf ("\\b%s\\b", pattern);
+ pattern = word_regex;
+ }
+
+ regex = g_regex_new (pattern, flags, 0, error);
+
+ g_free (pattern_escaped);
+ g_free (word_regex);
+
+ /* keep around */
+ if (regex != NULL)
+ dialog->last_gregex = g_regex_ref (regex);
+
+ return regex;
+}
+
+
+
+void
+terminal_search_dialog_present (TerminalSearchDialog *dialog)
+{
+ terminal_return_if_fail (TERMINAL_IS_SEARCH_DIALOG (dialog));
+
+ gtk_window_present (GTK_WINDOW (dialog));
+ gtk_widget_grab_focus (dialog->entry);
+}
diff --git a/terminal/terminal-search-dialog.h b/terminal/terminal-search-dialog.h
new file mode 100644
index 0000000..6abe0d6
--- /dev/null
+++ b/terminal/terminal-search-dialog.h
@@ -0,0 +1,55 @@
+/*-
+ * Copyright 2012 Nick Schermer <nick at xfce.org>
+ *
+ * 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 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., 59 Temple
+ * Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef __TERMINAL_SEARCH_DIALOG_H__
+#define __TERMINAL_SEARCH_DIALOG_H__
+
+#include <vte/vte.h>
+
+G_BEGIN_DECLS
+
+#define TERMINAL_TYPE_SEARCH_DIALOG (terminal_search_dialog_get_type ())
+#define TERMINAL_SEARCH_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TERMINAL_TYPE_SEARCH_DIALOG, TerminalSearchDialog))
+#define TERMINAL_SEARCH_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TERMINAL_TYPE_SEARCH_DIALOG, TerminalSearchDialogClass))
+#define TERMINAL_IS_SEARCH_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TERMINAL_TYPE_SEARCH_DIALOG))
+#define TERMINAL_IS_SEARCH_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TERMINAL_TYPE_SEARCH_DIALOG))
+#define TERMINAL_SEARCH_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TERMINAL_TYPE_SEARCH_DIALOG, TerminalSearchDialogClass))
+
+typedef struct _TerminalSearchDialog TerminalSearchDialog;
+typedef struct _TerminalSearchDialogClass TerminalSearchDialogClass;
+
+enum
+{
+ TERMINAL_RESPONSE_SEARCH_NEXT,
+ TERMINAL_RESPONSE_SEARCH_PREV
+};
+
+GType terminal_search_dialog_get_type (void) G_GNUC_CONST;
+
+GtkWidget *terminal_search_dialog_new (GtkWindow *parent);
+
+gboolean terminal_search_dialog_get_wrap_around (TerminalSearchDialog *dialog);
+
+GRegex *terminal_search_dialog_get_regex (TerminalSearchDialog *dialog,
+ GError **error);
+
+void terminal_search_dialog_present (TerminalSearchDialog *dialog);
+
+G_END_DECLS
+
+#endif /* !__TERMINAL_SEARCH_DIALOG_H__ */
diff --git a/terminal/terminal-window-ui.xml b/terminal/terminal-window-ui.xml
index 089a3ed..c278142 100644
--- a/terminal/terminal-window-ui.xml
+++ b/terminal/terminal-window-ui.xml
@@ -35,6 +35,10 @@
<menu action="terminal-menu">
<menuitem action="set-title"/>
<separator/>
+ <menuitem action="search"/>
+ <menuitem action="search-next"/>
+ <menuitem action="search-prev"/>
+ <separator/>
<menuitem action="set-encoding"/>
<separator/>
<menuitem action="reset"/>
@@ -87,6 +91,8 @@
<toolitem action="copy"/>
<toolitem action="paste"/>
<separator/>
+ <toolitem action="search"/>
+ <separator/>
<toolitem action="fullscreen"/>
<toolitem action="preferences"/>
<separator/>
diff --git a/terminal/terminal-window.c b/terminal/terminal-window.c
index a59ca32..d3c7b43 100644
--- a/terminal/terminal-window.c
+++ b/terminal/terminal-window.c
@@ -47,6 +47,7 @@
#include <terminal/terminal-enum-types.h>
#include <terminal/terminal-options.h>
#include <terminal/terminal-preferences-dialog.h>
+#include <terminal/terminal-search-dialog.h>
#include <terminal/terminal-private.h>
#include <terminal/terminal-marshal.h>
#include <terminal/terminal-encoding-action.h>
@@ -171,6 +172,12 @@ static void terminal_window_action_goto_tab (GtkRadioAc
GtkNotebook *notebook);
static void terminal_window_action_set_title (GtkAction *action,
TerminalWindow *window);
+static void terminal_window_action_search (GtkAction *action,
+ TerminalWindow *window);
+static void terminal_window_action_search_next (GtkAction *action,
+ TerminalWindow *window);
+static void terminal_window_action_search_prev (GtkAction *action,
+ TerminalWindow *window);
static void terminal_window_action_reset (GtkAction *action,
TerminalWindow *window);
static void terminal_window_action_reset_and_clear (GtkAction *action,
@@ -206,6 +213,8 @@ struct _TerminalWindow
GtkWidget *toolbar;
GtkWidget *notebook;
+ GtkWidget *search_dialog;
+
/* pushed size of screen */
glong grid_width;
glong grid_height;
@@ -222,6 +231,8 @@ struct _TerminalWindow
GtkAction *action_move_tab_left;
GtkAction *action_move_tab_right;
GtkAction *action_copy;
+ GtkAction *action_search_next;
+ GtkAction *action_search_prev;
};
@@ -249,6 +260,9 @@ static const GtkActionEntry action_entries[] =
{ "view-menu", NULL, N_ ("_View"), NULL, NULL, NULL, },
{ "terminal-menu", NULL, N_ ("_Terminal"), NULL, NULL, NULL, },
{ "set-title", NULL, N_ ("_Set Title..."), NULL, NULL, G_CALLBACK (terminal_window_action_set_title), },
+ { "search", GTK_STOCK_FIND, N_ ("_Find..."), "<control><shift>f", NULL, G_CALLBACK (terminal_window_action_search), },
+ { "search-next", NULL, N_ ("Find Ne_xt"), NULL, NULL, G_CALLBACK (terminal_window_action_search_next), },
+ { "search-prev", NULL, N_ ("Find Pre_vious"), NULL, NULL, G_CALLBACK (terminal_window_action_search_prev), },
{ "reset", NULL, N_ ("_Clear Scrollback"), NULL, NULL, G_CALLBACK (terminal_window_action_reset), },
{ "reset-and-clear", NULL, N_ ("Clear Scrollback and _Reset"), NULL, NULL, G_CALLBACK (terminal_window_action_reset_and_clear), },
{ "go-menu", NULL, N_ ("_Go"), NULL, NULL, NULL, },
@@ -432,6 +446,8 @@ terminal_window_init (TerminalWindow *window)
window->action_move_tab_left = gtk_action_group_get_action (window->action_group, "move-tab-left");
window->action_move_tab_right = gtk_action_group_get_action (window->action_group, "move-tab-right");
window->action_copy = gtk_action_group_get_action (window->action_group, "copy");
+ window->action_search_next = gtk_action_group_get_action (window->action_group, "search-next");
+ window->action_search_prev = gtk_action_group_get_action (window->action_group, "search-prev");
}
@@ -445,6 +461,7 @@ terminal_window_finalize (GObject *object)
g_object_unref (G_OBJECT (window->action_group));
g_object_unref (G_OBJECT (window->ui_manager));
g_object_unref (G_OBJECT (window->encoding_action));
+
g_slist_free (window->gomenu_actions);
(*G_OBJECT_CLASS (terminal_window_parent_class)->finalize) (object);
@@ -709,6 +726,7 @@ terminal_window_update_actions (TerminalWindow *window)
gboolean cycle_tabs;
gint page_num;
gint n_pages;
+ gboolean can_search;
/* determine the number of pages */
n_pages = gtk_notebook_get_n_pages (notebook);
@@ -739,6 +757,10 @@ terminal_window_update_actions (TerminalWindow *window)
gtk_action_set_sensitive (window->action_copy,
terminal_screen_has_selection (window->active));
+ can_search = terminal_screen_search_has_gregex (window->active);
+ gtk_action_set_sensitive (window->action_search_next, can_search);
+ gtk_action_set_sensitive (window->action_search_prev, can_search);
+
/* update the "Go" menu */
action = g_object_get_qdata (G_OBJECT (window->active), gomenu_action_quark);
if (G_LIKELY (action != NULL))
@@ -1682,6 +1704,94 @@ terminal_window_action_set_title (GtkAction *action,
static void
+terminal_window_action_search_response (GtkWidget *dialog,
+ gint response_id,
+ TerminalWindow *window)
+{
+ GRegex *regex;
+ GError *error = NULL;
+ gboolean wrap_around;
+ gboolean can_search;
+
+ terminal_return_if_fail (TERMINAL_IS_WINDOW (window));
+ terminal_return_if_fail (TERMINAL_IS_SEARCH_DIALOG (dialog));
+ terminal_return_if_fail (TERMINAL_IS_SCREEN (window->active));
+ terminal_return_if_fail (window->search_dialog == dialog);
+
+ if (response_id == TERMINAL_RESPONSE_SEARCH_NEXT
+ || response_id == TERMINAL_RESPONSE_SEARCH_PREV)
+ {
+ regex = terminal_search_dialog_get_regex (TERMINAL_SEARCH_DIALOG (dialog), &error);
+ if (G_LIKELY (error == NULL))
+ {
+ wrap_around = terminal_search_dialog_get_wrap_around (TERMINAL_SEARCH_DIALOG (dialog));
+ terminal_screen_search_set_gregex (window->active, regex, wrap_around);
+ if (regex != NULL)
+ g_regex_unref (regex);
+
+ if (response_id == TERMINAL_RESPONSE_SEARCH_NEXT)
+ terminal_screen_search_find_next (window->active);
+ else
+ terminal_screen_search_find_previous (window->active);
+ }
+ else
+ {
+ xfce_dialog_show_error (GTK_WINDOW (dialog), error, _("Failed to create the regular expression"));
+ g_error_free (error);
+ }
+ }
+ else
+ {
+ /* hide dialog */
+ gtk_widget_hide (dialog);
+ }
+
+ /* update actions */
+ can_search = terminal_screen_search_has_gregex (window->active);
+ gtk_action_set_sensitive (window->action_search_next, can_search);
+ gtk_action_set_sensitive (window->action_search_prev, can_search);
+}
+
+
+
+static void
+terminal_window_action_search (GtkAction *action,
+ TerminalWindow *window)
+{
+ if (window->search_dialog == NULL)
+ {
+ window->search_dialog = terminal_search_dialog_new (GTK_WINDOW (window));
+ g_signal_connect (G_OBJECT (window->search_dialog), "response",
+ G_CALLBACK (terminal_window_action_search_response), window);
+ gtk_widget_show_all (window->search_dialog);
+ }
+
+ terminal_search_dialog_present (TERMINAL_SEARCH_DIALOG (window->search_dialog));
+}
+
+
+
+static void
+terminal_window_action_search_next (GtkAction *action,
+ TerminalWindow *window)
+{
+ if (G_LIKELY (window->active != NULL))
+ terminal_screen_search_find_next (window->active);
+}
+
+
+
+static void
+terminal_window_action_search_prev (GtkAction *action,
+ TerminalWindow *window)
+{
+ if (G_LIKELY (window->active != NULL))
+ terminal_screen_search_find_previous (window->active);
+}
+
+
+
+static void
terminal_window_action_reset (GtkAction *action,
TerminalWindow *window)
{
More information about the Xfce4-commits
mailing list