SF.net SVN: geany:[5621] trunk

colombanw at users.sourceforge.net colombanw at xxxxx
Thu Mar 24 16:51:03 UTC 2011


Revision: 5621
          http://geany.svn.sourceforge.net/geany/?rev=5621&view=rev
Author:   colombanw
Date:     2011-03-24 16:51:02 +0000 (Thu, 24 Mar 2011)

Log Message:
-----------
Make Shift-Enter in search dialog and toolbar search entries search backwards

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/doc/geany.html
    trunk/doc/geany.txt
    trunk/src/callbacks.c
    trunk/src/callbacks.h
    trunk/src/document.c
    trunk/src/document.h
    trunk/src/geanyentryaction.c
    trunk/src/search.c
    trunk/src/toolbar.c
    trunk/src/ui_utils.c
    trunk/src/ui_utils.h

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2011-03-24 16:34:10 UTC (rev 5620)
+++ trunk/ChangeLog	2011-03-24 16:51:02 UTC (rev 5621)
@@ -8,6 +8,11 @@
 
  * doc/geany.txt, doc/geany.html:
    Update the documentation to talk about real-time tag parsing.
+ * doc/geany.txt, doc/geany.html, src/callbacks.c, src/callbacks.h,
+   src/document.c, src/document.h, src/geanyentryaction.c,
+   src/search.c, src/toolbar.c, src/ui_utils.c, src/ui_utils.h:
+   Make Shift-Enter in search dialog and toolbar search entries search
+   backwards.
 
 
 2011-03-22  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>

Modified: trunk/doc/geany.html
===================================================================
--- trunk/doc/geany.html	2011-03-24 16:34:10 UTC (rev 5620)
+++ trunk/doc/geany.html	2011-03-24 16:51:02 UTC (rev 5621)
@@ -1578,7 +1578,8 @@
 <h4><a class="toc-backref" href="#id60">Search bar</a></h4>
 <p>The quickest way to find some text is to use the search bar entry in
 the toolbar. This performs a case-insensitive search in the current
-document whilst you type. Pressing Enter will search again.</p>
+document whilst you type. Pressing Enter will search again, and pressing
+Shift-Enter will search backwards.</p>
 </div>
 </div>
 <div class="section" id="find">
@@ -6483,7 +6484,7 @@
 <div class="footer">
 <hr class="footer" />
 <a class="reference external" href="geany.txt">View document source</a>.
-Generated on: 2011-03-24 02:06 UTC.
+Generated on: 2011-03-24 16:40 UTC.
 Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
 
 </div>

Modified: trunk/doc/geany.txt
===================================================================
--- trunk/doc/geany.txt	2011-03-24 16:34:10 UTC (rev 5620)
+++ trunk/doc/geany.txt	2011-03-24 16:51:02 UTC (rev 5621)
@@ -1167,7 +1167,8 @@
 ``````````
 The quickest way to find some text is to use the search bar entry in
 the toolbar. This performs a case-insensitive search in the current
-document whilst you type. Pressing Enter will search again.
+document whilst you type. Pressing Enter will search again, and pressing
+Shift-Enter will search backwards.
 
 Find
 ^^^^

Modified: trunk/src/callbacks.c
===================================================================
--- trunk/src/callbacks.c	2011-03-24 16:34:10 UTC (rev 5620)
+++ trunk/src/callbacks.c	2011-03-24 16:51:02 UTC (rev 5621)
@@ -535,24 +535,22 @@
 
 
 /* store text, clear search flags so we can use Search->Find Next/Previous */
-static void setup_find_next(const gchar *text)
+static void setup_find(const gchar *text, gboolean backwards)
 {
 	setptr(search_data.text, g_strdup(text));
 	search_data.flags = 0;
-	search_data.backwards = FALSE;
+	search_data.backwards = backwards;
 	search_data.search_bar = TRUE;
 }
 
 
-/* search text */
-void
-on_toolbar_search_entry_changed(GtkAction *action, const gchar *text, gpointer user_data)
+static void do_toolbar_search(const gchar *text, gboolean incremental, gboolean backwards)
 {
 	GeanyDocument *doc = document_get_current();
 	gboolean result;
 
-	setup_find_next(text);
-	result = document_search_bar_find(doc, search_data.text, 0, GPOINTER_TO_INT(user_data));
+	setup_find(text, backwards);
+	result = document_search_bar_find(doc, search_data.text, 0, incremental, backwards);
 	if (search_data.search_bar)
 		ui_set_search_entry_background(toolbar_get_widget_child_by_name("SearchEntry"), result);
 }
@@ -560,6 +558,22 @@
 
 /* search text */
 void
+on_toolbar_search_entry_changed(GtkAction *action, const gchar *text, gpointer user_data)
+{
+	do_toolbar_search(text, TRUE, FALSE);
+}
+
+
+/* search text */
+void
+on_toolbar_search_entry_activate(GtkAction *action, const gchar *text, gpointer user_data)
+{
+	do_toolbar_search(text, FALSE, GPOINTER_TO_INT(user_data));
+}
+
+
+/* search text */
+void
 on_toolbutton_search_clicked           (GtkAction       *action,
                                         gpointer         user_data)
 {
@@ -571,8 +585,8 @@
 	{
 		const gchar *text = gtk_entry_get_text(GTK_ENTRY(entry));
 
-		setup_find_next(text);
-		result = document_search_bar_find(doc, search_data.text, 0, FALSE);
+		setup_find(text, FALSE);
+		result = document_search_bar_find(doc, search_data.text, 0, FALSE, FALSE);
 		if (search_data.search_bar)
 			ui_set_search_entry_background(entry, result);
 	}

Modified: trunk/src/callbacks.h
===================================================================
--- trunk/src/callbacks.h	2011-03-24 16:34:10 UTC (rev 5620)
+++ trunk/src/callbacks.h	2011-03-24 16:51:02 UTC (rev 5621)
@@ -143,6 +143,11 @@
                                         gpointer user_data);
 
 void
+on_toolbar_search_entry_activate       (GtkAction *action,
+                                        const gchar *text,
+                                        gpointer user_data);
+
+void
 on_toggle_case1_activate               (GtkMenuItem     *menuitem,
                                         gpointer         user_data);
 

Modified: trunk/src/document.c
===================================================================
--- trunk/src/document.c	2011-03-24 16:34:10 UTC (rev 5620)
+++ trunk/src/document.c	2011-03-24 16:51:02 UTC (rev 5621)
@@ -1826,7 +1826,8 @@
 /* special search function, used from the find entry in the toolbar
  * return TRUE if text was found otherwise FALSE
  * return also TRUE if text is empty  */
-gboolean document_search_bar_find(GeanyDocument *doc, const gchar *text, gint flags, gboolean inc)
+gboolean document_search_bar_find(GeanyDocument *doc, const gchar *text, gint flags, gboolean inc,
+		gboolean backwards)
 {
 	gint start_pos, search_pos;
 	struct Sci_TextToFind ttf;
@@ -1836,20 +1837,28 @@
 	if (! *text)
 		return TRUE;
 
-	start_pos = (inc) ? sci_get_selection_start(doc->editor->sci) :
+	start_pos = (inc || backwards) ? sci_get_selection_start(doc->editor->sci) :
 		sci_get_selection_end(doc->editor->sci);	/* equal if no selection */
 
-	/* search cursor to end */
+	/* search cursor to end or start */
 	ttf.chrg.cpMin = start_pos;
-	ttf.chrg.cpMax = sci_get_length(doc->editor->sci);
+	ttf.chrg.cpMax = backwards ? 0 : sci_get_length(doc->editor->sci);
 	ttf.lpstrText = (gchar *)text;
 	search_pos = sci_find_text(doc->editor->sci, flags, &ttf);
 
-	/* if no match, search start to cursor */
+	/* if no match, search start (or end) to cursor */
 	if (search_pos == -1)
 	{
-		ttf.chrg.cpMin = 0;
-		ttf.chrg.cpMax = start_pos + strlen(text);
+		if (backwards)
+		{
+			ttf.chrg.cpMin = sci_get_length(doc->editor->sci);
+			ttf.chrg.cpMax = start_pos;
+		}
+		else
+		{
+			ttf.chrg.cpMin = 0;
+			ttf.chrg.cpMax = start_pos + strlen(text);
+		}
 		search_pos = sci_find_text(doc->editor->sci, flags, &ttf);
 	}
 

Modified: trunk/src/document.h
===================================================================
--- trunk/src/document.h	2011-03-24 16:34:10 UTC (rev 5620)
+++ trunk/src/document.h	2011-03-24 16:51:02 UTC (rev 5621)
@@ -214,7 +214,8 @@
 void document_open_files(const GSList *filenames, gboolean readonly, GeanyFiletype *ft,
 		const gchar *forced_enc);
 
-gboolean document_search_bar_find(GeanyDocument *doc, const gchar *text, gint flags, gboolean inc);
+gboolean document_search_bar_find(GeanyDocument *doc, const gchar *text, gint flags, gboolean inc,
+		gboolean backwards);
 
 gint document_find_text(GeanyDocument *doc, const gchar *text, gint flags, gboolean search_backwards,
 		gboolean scroll, GtkWidget *parent);

Modified: trunk/src/geanyentryaction.c
===================================================================
--- trunk/src/geanyentryaction.c	2011-03-24 16:34:10 UTC (rev 5620)
+++ trunk/src/geanyentryaction.c	2011-03-24 16:51:02 UTC (rev 5621)
@@ -47,6 +47,7 @@
 enum
 {
 	ENTRY_ACTIVATE,
+	ENTRY_ACTIVATE_BACKWARD,
 	ENTRY_CHANGED,
 
 	LAST_SIGNAL
@@ -67,6 +68,7 @@
 		gtk_entry_set_width_chars(GTK_ENTRY(priv->entry), 9);
 
 	ui_entry_add_clear_icon(GTK_ENTRY(priv->entry));
+	ui_entry_add_activate_backward_signal(GTK_ENTRY(priv->entry));
 
 	gtk_widget_show(priv->entry);
 
@@ -86,6 +88,15 @@
 }
 
 
+static void delegate_entry_activate_backward_cb(GtkEntry *entry, GeanyEntryAction *action)
+{
+	GeanyEntryActionPrivate *priv = GEANY_ENTRY_ACTION_GET_PRIVATE(action);
+	const gchar *text = gtk_entry_get_text(GTK_ENTRY(priv->entry));
+
+	g_signal_emit(action, signals[ENTRY_ACTIVATE_BACKWARD], 0, text);
+}
+
+
 static void delegate_entry_changed_cb(GtkEditable *editable, GeanyEntryAction *action)
 {
 	GeanyEntryActionPrivate *priv = GEANY_ENTRY_ACTION_GET_PRIVATE(action);
@@ -104,8 +115,10 @@
 			G_CALLBACK(ui_editable_insert_text_callback), NULL);
 	g_signal_connect(priv->entry, "changed", G_CALLBACK(delegate_entry_changed_cb), action);
 	g_signal_connect(priv->entry, "activate", G_CALLBACK(delegate_entry_activate_cb), action);
+	g_signal_connect(priv->entry, "activate-backward",
+		G_CALLBACK(delegate_entry_activate_backward_cb), action);
 
-    GTK_ACTION_CLASS(geany_entry_action_parent_class)->connect_proxy(action, widget);
+	GTK_ACTION_CLASS(geany_entry_action_parent_class)->connect_proxy(action, widget);
 }
 
 
@@ -121,18 +134,26 @@
 
 	signals[ENTRY_CHANGED] = g_signal_new("entry-changed",
 									G_TYPE_FROM_CLASS(klass),
-									(GSignalFlags) 0,
+									G_SIGNAL_RUN_LAST,
 									0,
-									0,
 									NULL,
+									NULL,
 									g_cclosure_marshal_VOID__STRING,
 									G_TYPE_NONE, 1, G_TYPE_STRING);
 	signals[ENTRY_ACTIVATE] = g_signal_new("entry-activate",
 									G_TYPE_FROM_CLASS(klass),
-									(GSignalFlags) 0,
+									G_SIGNAL_RUN_LAST,
 									0,
+									NULL,
+									NULL,
+									g_cclosure_marshal_VOID__STRING,
+									G_TYPE_NONE, 1, G_TYPE_STRING);
+	signals[ENTRY_ACTIVATE_BACKWARD] = g_signal_new("entry-activate-backward",
+									G_TYPE_FROM_CLASS(klass),
+									G_SIGNAL_RUN_LAST,
 									0,
 									NULL,
+									NULL,
 									g_cclosure_marshal_VOID__STRING,
 									G_TYPE_NONE, 1, G_TYPE_STRING);
 }

Modified: trunk/src/search.c
===================================================================
--- trunk/src/search.c	2011-03-24 16:34:10 UTC (rev 5620)
+++ trunk/src/search.c	2011-03-24 16:51:02 UTC (rev 5621)
@@ -160,6 +160,9 @@
 on_find_entry_activate(GtkEntry *entry, gpointer user_data);
 
 static void
+on_find_entry_activate_backward(GtkEntry *entry, gpointer user_data);
+
+static void
 on_replace_dialog_response(GtkDialog *dialog, gint response, gpointer user_data);
 
 static void
@@ -476,6 +479,9 @@
 
 	g_signal_connect(gtk_bin_get_child(GTK_BIN(entry)), "activate",
 			G_CALLBACK(on_find_entry_activate), NULL);
+	ui_entry_add_activate_backward_signal(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry))));
+	g_signal_connect(gtk_bin_get_child(GTK_BIN(entry)), "activate-backward",
+			G_CALLBACK(on_find_entry_activate_backward), NULL);
 	g_signal_connect(find_dlg.dialog, "response",
 			G_CALLBACK(on_find_dialog_response), entry);
 	g_signal_connect(find_dlg.dialog, "delete-event",
@@ -1109,6 +1115,18 @@
 }
 
 
+static void
+on_find_entry_activate_backward(GtkEntry *entry, gpointer user_data)
+{
+	/* can't search backwards with a regexp */
+	if (search_data.flags & SCFIND_REGEXP)
+		utils_beep();
+	else
+		on_find_dialog_response(NULL, GEANY_RESPONSE_FIND_PREVIOUS,
+					ui_lookup_widget(GTK_WIDGET(entry), "entry"));
+}
+
+
 #define int_search_flags(match_case, whole_word, regexp, word_start) \
 	((match_case ? SCFIND_MATCHCASE : 0) | \
 	(whole_word ? SCFIND_WHOLEWORD : 0) | \

Modified: trunk/src/toolbar.c
===================================================================
--- trunk/src/toolbar.c	2011-03-24 16:34:10 UTC (rev 5620)
+++ trunk/src/toolbar.c	2011-03-24 16:51:02 UTC (rev 5621)
@@ -381,9 +381,11 @@
 	action_searchentry = geany_entry_action_new(
 		"SearchEntry", _("Search"), _("Find the entered text in the current file"), FALSE);
 	g_signal_connect(action_searchentry, "entry-activate",
-		G_CALLBACK(on_toolbar_search_entry_changed), GINT_TO_POINTER(FALSE));
+		G_CALLBACK(on_toolbar_search_entry_activate), GINT_TO_POINTER(FALSE));
+	g_signal_connect(action_searchentry, "entry-activate-backward",
+		G_CALLBACK(on_toolbar_search_entry_activate), GINT_TO_POINTER(TRUE));
 	g_signal_connect(action_searchentry, "entry-changed",
-		G_CALLBACK(on_toolbar_search_entry_changed), GINT_TO_POINTER(TRUE));
+		G_CALLBACK(on_toolbar_search_entry_changed), NULL);
 	gtk_action_group_add_action(group, action_searchentry);
 
 	action_gotoentry = geany_entry_action_new(

Modified: trunk/src/ui_utils.c
===================================================================
--- trunk/src/ui_utils.c	2011-03-24 16:34:10 UTC (rev 5620)
+++ trunk/src/ui_utils.c	2011-03-24 16:51:02 UTC (rev 5621)
@@ -1436,6 +1436,35 @@
 }
 
 
+/* Adds a :activate-backwards signal emitted by default when <Shift>Return is pressed */
+void ui_entry_add_activate_backward_signal(GtkEntry *entry)
+{
+	static gboolean installed = FALSE;
+
+	g_return_if_fail(GTK_IS_ENTRY(entry));
+
+	if (G_UNLIKELY(! installed))
+	{
+		GtkBindingSet *binding_set;
+
+		installed = TRUE;
+
+		/* try to handle the unexpected case where GTK would already have installed the signal */
+		if (g_signal_lookup("activate-backward", G_TYPE_FROM_INSTANCE(entry)))
+		{
+			g_warning("Signal GtkEntry:activate-backward is unexpectedly already installed");
+			return;
+		}
+
+		g_signal_new("activate-backward", G_TYPE_FROM_INSTANCE(entry),
+			G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, 0, NULL, NULL,
+			g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+		binding_set = gtk_binding_set_by_class(GTK_ENTRY_GET_CLASS(entry));
+		gtk_binding_entry_add_signal(binding_set, GDK_Return, GDK_SHIFT_MASK, "activate-backward", 0);
+	}
+}
+
+
 static void add_to_size_group(GtkWidget *widget, gpointer size_group)
 {
 	g_return_if_fail(GTK_IS_SIZE_GROUP(size_group));

Modified: trunk/src/ui_utils.h
===================================================================
--- trunk/src/ui_utils.h	2011-03-24 16:34:10 UTC (rev 5620)
+++ trunk/src/ui_utils.h	2011-03-24 16:51:02 UTC (rev 5621)
@@ -211,6 +211,8 @@
 
 void ui_entry_add_clear_icon(GtkEntry *entry);
 
+void ui_entry_add_activate_backward_signal(GtkEntry *entry);
+
 void ui_editable_insert_text_callback(GtkEditable *editable, gchar *new_text,
 									  gint new_text_len, gint *position, gpointer data);
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list