[Xfce4-commits] <midori:master> Revise completion to react on paste/ cursor/ backspace

Christian Dywan noreply at xfce.org
Wed Jan 20 23:22:01 CET 2010


Updating branch refs/heads/master
         to 897af36ed59ad5a14e7f6f23871ae0b5ccfc0283 (commit)
       from 33d90b247c7c4eb0a539a6f3430f612ce0476575 (commit)

commit 897af36ed59ad5a14e7f6f23871ae0b5ccfc0283
Author: Christian Dywan <christian at twotoasts.de>
Date:   Wed Jan 20 23:11:25 2010 +0100

    Revise completion to react on paste/ cursor/ backspace
    
    We need to avoid updating the real text afterall, but update it
    in the event of a cursor movement.
    
    We also need to trigger completion on backspace or paste.
    
    We need to remove the timer when we popdown completion.
    
    We need to make sure to not show completion for empty text.

 midori/midori-locationaction.c |   70 +++++++++++++++++++++++++++++++++-------
 1 files changed, 58 insertions(+), 12 deletions(-)

diff --git a/midori/midori-locationaction.c b/midori/midori-locationaction.c
index c3cfa2b..9cfc0a1 100644
--- a/midori/midori-locationaction.c
+++ b/midori/midori-locationaction.c
@@ -354,6 +354,19 @@ midori_location_action_popup_timeout_cb (gpointer data)
     if (!gtk_widget_has_focus (action->entry))
         return FALSE;
 
+    if (!*action->key)
+    {
+        const gchar* uri = gtk_entry_get_text (GTK_ENTRY (action->entry));
+        #if HAVE_SQLITE
+        katze_assign (action->key, g_strdup (uri));
+        #else
+        katze_assign (action->key, katze_collfold (uri));
+        #endif
+    }
+
+    if (!(action->key && *action->key))
+        return FALSE;
+
     if (G_UNLIKELY (!action->popup))
     {
         GtkWidget* popup;
@@ -405,16 +418,6 @@ midori_location_action_popup_timeout_cb (gpointer data)
             G_CALLBACK (gtk_widget_destroyed), &action->popup);
     }
 
-    if (!*action->key)
-    {
-        const gchar* uri = gtk_entry_get_text (GTK_ENTRY (action->entry));
-        #if HAVE_SQLITE
-        katze_assign (action->key, g_strdup (uri));
-        #else
-        katze_assign (action->key, katze_collfold (uri));
-        #endif
-    }
-
     #if HAVE_SQLITE
     store = GTK_LIST_STORE (model);
     gtk_list_store_clear (store);
@@ -504,7 +507,11 @@ midori_location_action_popdown_completion (MidoriLocationAction* location_action
         gtk_tree_selection_unselect_all (gtk_tree_view_get_selection (
             GTK_TREE_VIEW (location_action->treeview)));
     }
-    location_action->completion_timeout = 0;
+    if (location_action->completion_timeout)
+    {
+        g_source_remove (location_action->completion_timeout);
+        location_action->completion_timeout = 0;
+    }
     location_action->completion_index = -1;
 }
 
@@ -843,6 +850,36 @@ midori_location_action_changed_cb (GtkEntry*             entry,
     katze_assign (location_action->text, g_strdup (gtk_entry_get_text (entry)));
 }
 
+static void
+midori_location_action_move_cursor_cb (GtkEntry*             entry,
+                                       GtkMovementStep       step,
+                                       gint                  count,
+                                       gboolean              extend_selection,
+                                       MidoriLocationAction* action)
+{
+    gchar* text = g_strdup (pango_layout_get_text (gtk_entry_get_layout (entry)));
+    /* Update entry with the completed text */
+    gtk_entry_set_text (entry, text);
+    g_free (text);
+    midori_location_action_popdown_completion (action);
+}
+
+static void
+midori_location_action_backspace_cb (GtkWidget*            entry,
+                                     MidoriLocationAction* action)
+{
+    midori_location_action_popup_completion (action, entry, "");
+    action->completion_index = -1;
+}
+
+static void
+midori_location_action_paste_clipboard_cb (GtkWidget*            entry,
+                                           MidoriLocationAction* action)
+{
+    midori_location_action_popup_completion (action, entry, "");
+    action->completion_index = -1;
+}
+
 static gboolean
 midori_location_action_button_press_event_cb (GtkEntry*             entry,
                                               GdkEventKey*          event,
@@ -911,6 +948,8 @@ midori_location_action_key_press_event_cb (GtkEntry*    entry,
         if (location_action->popup && GTK_WIDGET_VISIBLE (location_action->popup))
         {
             midori_location_action_popdown_completion (location_action);
+            text = gtk_entry_get_text (entry);
+            pango_layout_set_text (gtk_entry_get_layout (entry), text, -1);
             return TRUE;
         }
 
@@ -955,7 +994,8 @@ midori_location_action_key_press_event_cb (GtkEntry*    entry,
             {
                 gchar* uri;
                 gtk_tree_model_get (model, &iter, URI_COL, &uri, -1);
-                gtk_entry_set_text (entry, uri);
+                /* Update the layout without actually changing the text */
+                pango_layout_set_text (gtk_entry_get_layout (entry), uri, -1);
                 g_free (uri);
             }
             location_action->completion_index = selected;
@@ -1446,6 +1486,12 @@ midori_location_action_connect_proxy (GtkAction* action,
         g_object_connect (child,
                       "signal::changed",
                       midori_location_action_changed_cb, action,
+                      "signal::move-cursor",
+                      midori_location_action_move_cursor_cb, action,
+                      "signal::backspace",
+                      midori_location_action_backspace_cb, action,
+                      "signal::paste-clipboard",
+                      midori_location_action_paste_clipboard_cb, action,
                       "signal::button-press-event",
                       midori_location_action_button_press_event_cb, action,
                       "signal::key-press-event",



More information about the Xfce4-commits mailing list