]> spindle.queued.net Git - midori/commitdiff
Validate URIs and render entry red if invalid
authorChristian Dywan <christian@twotoasts.de>
Sun, 15 May 2011 14:45:14 +0000 (16:45 +0200)
committerChristian Dywan <christian@twotoasts.de>
Sun, 15 May 2011 14:46:23 +0000 (16:46 +0200)
Fixes: https://bugs.launchpad.net/midori/+bug/710855
extensions/adblock.c
katze/katze-utils.c
katze/katze-utils.h
midori/midori-browser.c
midori/midori-preferences.c

index a6acc3e77d15ed31ec0f560d2f62033e58455125..062a77eb762059ee6338fabf7881e964bfee4e72 100644 (file)
@@ -460,7 +460,7 @@ adblock_get_preferences_dialog (MidoriExtension* extension)
     g_free (description);
     gtk_label_set_line_wrap (GTK_LABEL (button), TRUE);
     gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 4);
-    entry = gtk_entry_new ();
+    entry = katze_uri_entry_new (NULL);
     gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 4);
     liststore = gtk_list_store_new (1, G_TYPE_STRING);
     treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (liststore));
index fab3d9bb713ecdcabd136475a33bbba18e60189c..9cbd72fd75bd2a6ac50824258c80ba1f7122cb54 100644 (file)
@@ -477,6 +477,9 @@ g_icon_to_string (GIcon *icon)
  *     Since 0.2.9 the following hints are also supported:
  *     "languages": the widget will be particularly suitable for choosing
  *         multiple language codes, ie. "de,en_GB".
+ *     Since 0.3.6 the following hints are also supported:
+ *     "address": the widget will be particularly suitable for typing
+ *         a valid URI or IP address and highlight errors.
  *
  * Any other values for @hint are silently ignored.
  *
@@ -741,7 +744,10 @@ katze_property_proxy (gpointer     object,
     {
         gchar* notify_property;
 
-        widget = gtk_entry_new ();
+        if (_hint == I_("address"))
+            widget = katze_uri_entry_new (NULL);
+        else
+            widget = gtk_entry_new ();
         g_object_get (object, property, &string, NULL);
         if (!string)
             string = g_strdup (G_PARAM_SPEC_STRING (pspec)->default_value);
@@ -1559,3 +1565,55 @@ katze_load_cached_icon (const gchar* uri,
         GTK_STOCK_FILE, GTK_ICON_SIZE_MENU, NULL);
 }
 
+static void
+katze_uri_entry_changed_cb (GtkWidget* entry,
+                            GtkWidget* other_widget)
+{
+    const gchar* uri = gtk_entry_get_text (GTK_ENTRY (entry));
+    gboolean valid = g_str_has_prefix (uri, "http://")
+                  || g_str_has_prefix (uri, "https://")
+                  || g_str_has_prefix (uri, "file://")
+                  || g_str_has_prefix (uri, "data:")
+                  || g_str_has_prefix (uri, "about:")
+                  || g_str_has_prefix (uri, "javascript:");
+    if (*uri && !valid)
+    {
+        GdkColor bg_color = { 0 };
+        GdkColor fg_color = { 0 };
+        gdk_color_parse ("#ef7070", &bg_color);
+        gdk_color_parse ("#000", &fg_color);
+        gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &bg_color);
+        gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &fg_color);
+    }
+    else
+    {
+        gtk_widget_modify_base (entry, GTK_STATE_NORMAL, NULL);
+        gtk_widget_modify_text (entry, GTK_STATE_NORMAL, NULL);
+    }
+
+    if (other_widget != NULL)
+        gtk_widget_set_sensitive (other_widget, *uri && valid);
+}
+
+/**
+ * katze_uri_entry_new:
+ * @other_widget: a #GtkWidget, or %NULL
+ *
+ * Creates an entry that validates the typed URI.
+ *
+ * If @other_widget is given, it will become insensitive if
+ * the input is not a valid URI.
+ *
+ * Returns: a #GtkEntry
+ *
+ * Since: 0.3.6
+ */
+GtkWidget*
+katze_uri_entry_new (GtkWidget* other_widget)
+{
+    GtkWidget* entry = gtk_entry_new ();
+    g_signal_connect (entry, "changed",
+        G_CALLBACK (katze_uri_entry_changed_cb), other_widget);
+    return entry;
+}
+
index 5382173f61e175d95fbfeafdea2e044c2a0664d2..eb67a1ff9973e62b7d298a41dccf3648f7de5c73 100644 (file)
@@ -139,6 +139,9 @@ GdkPixbuf*
 katze_load_cached_icon               (const gchar*    uri,
                                       GtkWidget*      widget);
 
+GtkWidget*
+katze_uri_entry_new                  (GtkWidget*      other_widget);
+
 G_END_DECLS
 
 #endif /* __KATZE_UTILS_H__ */
index 1fcbdde08be41dbebc8a8fef4422115ad3db9f01..13998260aa6172a1015abc399cfe16160a9e35fd 100644 (file)
@@ -670,19 +670,6 @@ midori_view_notify_statusbar_text_cb (GtkWidget*     view,
     }
 }
 
-static void
-midori_browser_edit_bookmark_uri_changed_cb (GtkEntry*      entry,
-                                             GtkDialog*     dialog)
-{
-    const gchar* uri = gtk_entry_get_text (entry);
-    gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_ACCEPT,
-        uri && (g_str_has_prefix (uri, "http://")
-        || g_str_has_prefix (uri, "https://")
-        || g_str_has_prefix (uri, "file://")
-        || g_str_has_prefix (uri, "data:")
-        || g_str_has_prefix (uri, "javascript:")));
-}
-
 static void
 midori_browser_edit_bookmark_title_changed_cb (GtkEntry*      entry,
                                                GtkDialog*     dialog)
@@ -803,7 +790,12 @@ midori_browser_edit_bookmark_dialog_new (MidoriBrowser* browser,
         label = gtk_label_new_with_mnemonic (_("_Address:"));
         gtk_size_group_add_widget (sizegroup, label);
         gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
-        entry_uri = gtk_entry_new ();
+        entry_uri = katze_uri_entry_new (
+        #if GTK_CHECK_VERSION (2, 20, 0)
+            gtk_dialog_get_widget_for_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT));
+        #else
+            NULL);
+        #endif
         #if HAVE_HILDON
         HildonGtkInputMode mode = hildon_gtk_entry_get_input_mode (GTK_ENTRY (entry_uri));
         mode &= ~HILDON_GTK_INPUT_MODE_AUTOCAP;
@@ -811,10 +803,6 @@ midori_browser_edit_bookmark_dialog_new (MidoriBrowser* browser,
         #endif
         gtk_entry_set_activates_default (GTK_ENTRY (entry_uri), TRUE);
         gtk_entry_set_text (GTK_ENTRY (entry_uri), katze_item_get_uri (bookmark));
-        midori_browser_edit_bookmark_uri_changed_cb (GTK_ENTRY (entry_uri),
-                                                     GTK_DIALOG (dialog));
-        g_signal_connect (entry_uri, "changed",
-            G_CALLBACK (midori_browser_edit_bookmark_uri_changed_cb), dialog);
         gtk_box_pack_start (GTK_BOX (hbox), entry_uri, TRUE, TRUE, 0);
         gtk_container_add (GTK_CONTAINER (content_area), hbox);
         gtk_widget_show_all (hbox);
index 1b255b75ea1abddd202e95a215e9b6a466441a9d..429fe5053bb67f6eea7f978b9cfff93308ef2caa 100644 (file)
@@ -299,7 +299,7 @@ midori_preferences_set_settings (MidoriPreferences* preferences,
     SPANNED_ADD (button);
     label = katze_property_label (settings, "homepage");
     INDENTED_ADD (label);
-    entry = katze_property_proxy (settings, "homepage", NULL);
+    entry = katze_property_proxy (settings, "homepage", "address");
     SPANNED_ADD (entry);
     if (parent && katze_object_has_property (parent, "uri"))
     {