]> Pileus Git - ~andy/gtk/commitdiff
Use the new file DND api.
authorMatthias Clasen <mclasen@redhat.com>
Fri, 22 Oct 2004 22:50:32 +0000 (22:50 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Fri, 22 Oct 2004 22:50:32 +0000 (22:50 +0000)
2004-10-22  Matthias Clasen  <mclasen@redhat.com>

* gtk/gtkfilechooserbutton.c (gtk_file_chooser_button_drag_data_received)
(gtk_file_chooser_button_init): Use the new file DND api.

* gtk/gtkdnd.h:
* gtk/gtkdnd.c (gtk_drag_dest_add_uri_targets)
(gtk_drag_source_add_uri_targets):

* gtk/gtkselection.h:
* gtk/gtkselection.c (gtk_target_list_add_uri_targets):
(gtk_selection_data_set_uris):
(gtk_selection_data_get_uris): New functions to allow
handling file DND "without knowing jack shit".

* configure.in: Bump glib requirement to 2.5.4.

* gtk/gtkfilechooserdefault.c (shortcuts_drop_uris): Use
g_uri_list_extract_uris().

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-6
ChangeLog.pre-2-8
configure.in
gtk/gtkdnd.c
gtk/gtkdnd.h
gtk/gtkfilechooserbutton.c
gtk/gtkfilechooserdefault.c
gtk/gtkselection.c
gtk/gtkselection.h

index 3fee684f419a37beb0fe42fa53bd7286bd6e8052..f42f5683b6b6cb3b5564de237e36c1b2a3c9c1cd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2004-10-22  Matthias Clasen  <mclasen@redhat.com>
+
+       * gtk/gtkfilechooserbutton.c (gtk_file_chooser_button_drag_data_received) 
+       (gtk_file_chooser_button_init): Use the new file DND api.
+
+       * gtk/gtkdnd.h:
+       * gtk/gtkdnd.c (gtk_drag_dest_add_uri_targets) 
+       (gtk_drag_source_add_uri_targets): 
+
+       * gtk/gtkselection.h:
+       * gtk/gtkselection.c (gtk_target_list_add_uri_targets):
+       (gtk_selection_data_set_uris):  
+       (gtk_selection_data_get_uris): New functions to allow
+       handling file DND "without knowing jack shit".
+
+       * configure.in: Bump glib requirement to 2.5.4.
+
+       * gtk/gtkfilechooserdefault.c (shortcuts_drop_uris): Use
+       g_uri_list_extract_uris().
+
 Fri Oct 22 13:25:25 2004  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtktextbuffer.c (gtk_text_buffer_backspace): Fix 
index 3fee684f419a37beb0fe42fa53bd7286bd6e8052..f42f5683b6b6cb3b5564de237e36c1b2a3c9c1cd 100644 (file)
@@ -1,3 +1,23 @@
+2004-10-22  Matthias Clasen  <mclasen@redhat.com>
+
+       * gtk/gtkfilechooserbutton.c (gtk_file_chooser_button_drag_data_received) 
+       (gtk_file_chooser_button_init): Use the new file DND api.
+
+       * gtk/gtkdnd.h:
+       * gtk/gtkdnd.c (gtk_drag_dest_add_uri_targets) 
+       (gtk_drag_source_add_uri_targets): 
+
+       * gtk/gtkselection.h:
+       * gtk/gtkselection.c (gtk_target_list_add_uri_targets):
+       (gtk_selection_data_set_uris):  
+       (gtk_selection_data_get_uris): New functions to allow
+       handling file DND "without knowing jack shit".
+
+       * configure.in: Bump glib requirement to 2.5.4.
+
+       * gtk/gtkfilechooserdefault.c (shortcuts_drop_uris): Use
+       g_uri_list_extract_uris().
+
 Fri Oct 22 13:25:25 2004  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtktextbuffer.c (gtk_text_buffer_backspace): Fix 
index 3fee684f419a37beb0fe42fa53bd7286bd6e8052..f42f5683b6b6cb3b5564de237e36c1b2a3c9c1cd 100644 (file)
@@ -1,3 +1,23 @@
+2004-10-22  Matthias Clasen  <mclasen@redhat.com>
+
+       * gtk/gtkfilechooserbutton.c (gtk_file_chooser_button_drag_data_received) 
+       (gtk_file_chooser_button_init): Use the new file DND api.
+
+       * gtk/gtkdnd.h:
+       * gtk/gtkdnd.c (gtk_drag_dest_add_uri_targets) 
+       (gtk_drag_source_add_uri_targets): 
+
+       * gtk/gtkselection.h:
+       * gtk/gtkselection.c (gtk_target_list_add_uri_targets):
+       (gtk_selection_data_set_uris):  
+       (gtk_selection_data_get_uris): New functions to allow
+       handling file DND "without knowing jack shit".
+
+       * configure.in: Bump glib requirement to 2.5.4.
+
+       * gtk/gtkfilechooserdefault.c (shortcuts_drop_uris): Use
+       g_uri_list_extract_uris().
+
 Fri Oct 22 13:25:25 2004  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtktextbuffer.c (gtk_text_buffer_backspace): Fix 
index 3fee684f419a37beb0fe42fa53bd7286bd6e8052..f42f5683b6b6cb3b5564de237e36c1b2a3c9c1cd 100644 (file)
@@ -1,3 +1,23 @@
+2004-10-22  Matthias Clasen  <mclasen@redhat.com>
+
+       * gtk/gtkfilechooserbutton.c (gtk_file_chooser_button_drag_data_received) 
+       (gtk_file_chooser_button_init): Use the new file DND api.
+
+       * gtk/gtkdnd.h:
+       * gtk/gtkdnd.c (gtk_drag_dest_add_uri_targets) 
+       (gtk_drag_source_add_uri_targets): 
+
+       * gtk/gtkselection.h:
+       * gtk/gtkselection.c (gtk_target_list_add_uri_targets):
+       (gtk_selection_data_set_uris):  
+       (gtk_selection_data_get_uris): New functions to allow
+       handling file DND "without knowing jack shit".
+
+       * configure.in: Bump glib requirement to 2.5.4.
+
+       * gtk/gtkfilechooserdefault.c (shortcuts_drop_uris): Use
+       g_uri_list_extract_uris().
+
 Fri Oct 22 13:25:25 2004  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtktextbuffer.c (gtk_text_buffer_backspace): Fix 
index 969d1f8fd68c2a87566503fdc6fead7d6df89e06..0bf64095c6147446b86df4758ab6d2dd72fdce41 100644 (file)
@@ -29,7 +29,7 @@ m4_define([gtk_api_version], [2.0])
 m4_define([gtk_binary_version], [2.4.0])
 
 # required versions of other packages
-m4_define([glib_required_version], [2.5.2])
+m4_define([glib_required_version], [2.5.4])
 m4_define([pango_required_version], [1.5.1])
 m4_define([atk_required_version], [1.0.1])
 
index a2edb049ea51c6aebf6d06abc0ed3a82afafd396..c59bd0f99575740490fb1776f01ae3a3d3d53675 100644 (file)
@@ -1079,6 +1079,33 @@ gtk_drag_dest_add_image_targets (GtkWidget *widget)
   gtk_target_list_unref (target_list);
 }
 
+/**
+ * gtk_drag_dest_add_uri_targets:
+ * @widget: a #GtkWidget that's a drag destination
+ *
+ * Add the URI targets supported by #GtkSelection to
+ * the target list of the drag destination. The targets
+ * are added with @info = 0. If you need another value, 
+ * use gtk_target_list_add_uri_targets() and
+ * gtk_drag_dest_set_target_list().
+ * 
+ * Since: 2.6
+ **/
+void
+gtk_drag_dest_add_uri_targets (GtkWidget *widget)
+{
+  GtkTargetList *target_list;
+
+  target_list = gtk_drag_dest_get_target_list (widget);
+  if (target_list)
+    gtk_target_list_ref (target_list);
+  else
+    target_list = gtk_target_list_new (NULL, 0);
+  gtk_target_list_add_uri_targets (target_list, 0);
+  gtk_drag_dest_set_target_list (widget, target_list);
+  gtk_target_list_unref (target_list);
+}
+
 /*************************************************************
  * _gtk_drag_dest_handle_event:
  *     Called from widget event handling code on Drag events
@@ -2230,7 +2257,7 @@ gtk_drag_source_set_target_list (GtkWidget     *widget,
  * the target list of the drag source.  The targets
  * are added with @info = 0. If you need another value, 
  * use gtk_target_list_add_text_targets() and
- * gtk_drag_dest_set_target_list().
+ * gtk_drag_source_set_target_list().
  * 
  * Since: 2.6
  **/
@@ -2256,8 +2283,8 @@ gtk_drag_source_add_text_targets (GtkWidget *widget)
  * Add the writable image targets supported by #GtkSelection to
  * the target list of the drag source. The targets
  * are added with @info = 0. If you need another value, 
- * use gtk_target_list_add_text_targets() and
- * gtk_drag_dest_set_target_list().
+ * use gtk_target_list_add_image_targets() and
+ * gtk_drag_source_set_target_list().
  * 
  * Since: 2.6
  **/
@@ -2276,6 +2303,33 @@ gtk_drag_source_add_image_targets (GtkWidget *widget)
   gtk_target_list_unref (target_list);
 }
 
+/**
+ * gtk_drag_source_add_uri_targets:
+ * @widget: a #GtkWidget that's is a drag source
+ *
+ * Add the URI targets supported by #GtkSelection to
+ * the target list of the drag source.  The targets
+ * are added with @info = 0. If you need another value, 
+ * use gtk_target_list_add_uri_targets() and
+ * gtk_drag_source_set_target_list().
+ * 
+ * Since: 2.6
+ **/
+void
+gtk_drag_source_add_uri_targets (GtkWidget *widget)
+{
+  GtkTargetList *target_list;
+
+  target_list = gtk_drag_source_get_target_list (widget);
+  if (target_list)
+    gtk_target_list_ref (target_list);
+  else
+    target_list = gtk_target_list_new (NULL, 0);
+  gtk_target_list_add_uri_targets (target_list, 0);
+  gtk_drag_source_set_target_list (widget, target_list);
+  gtk_target_list_unref (target_list);
+}
+
 static void
 gtk_drag_source_unset_icon (GtkDragSourceSite *site)
 {
index 1932340290ed3e1a1f5b56ef822a08ee341d6946..586980b0611b721c1641bcebb265a545704ede79 100644 (file)
@@ -85,8 +85,9 @@ GdkAtom        gtk_drag_dest_find_target     (GtkWidget      *widget,
 GtkTargetList* gtk_drag_dest_get_target_list (GtkWidget      *widget);
 void           gtk_drag_dest_set_target_list (GtkWidget      *widget,
                                               GtkTargetList  *target_list);
-void           gtk_drag_dest_add_text_targets (GtkWidget     *widget);
+void           gtk_drag_dest_add_text_targets  (GtkWidget    *widget);
 void           gtk_drag_dest_add_image_targets (GtkWidget    *widget);
+void           gtk_drag_dest_add_uri_targets   (GtkWidget    *widget);
 
 /* Source side */
 
@@ -101,8 +102,9 @@ void gtk_drag_source_unset (GtkWidget        *widget);
 GtkTargetList* gtk_drag_source_get_target_list (GtkWidget     *widget);
 void           gtk_drag_source_set_target_list (GtkWidget     *widget,
                                                 GtkTargetList *target_list);
-void           gtk_drag_source_add_text_targets (GtkWidget     *widget);
+void           gtk_drag_source_add_text_targets  (GtkWidget     *widget);
 void           gtk_drag_source_add_image_targets (GtkWidget    *widget);
+void           gtk_drag_source_add_uri_targets   (GtkWidget    *widget);
 
 void gtk_drag_source_set_icon        (GtkWidget   *widget,
                                      GdkColormap *colormap,
index 01f9d9dacec8a51272c739a4cb72aabd4845aeae..5ebdac05b503f2ab4b5fad4e38cfb279aa766313 100644 (file)
@@ -58,7 +58,6 @@
 #define DEFAULT_FILENAME       N_("(None)")
 #define DEFAULT_SPACING                0
 
-
 /* ********************** *
  *  Private Enumerations  *
  * ********************** */
@@ -105,11 +104,6 @@ enum
   TEXT_URI_LIST
 };
 
-static const GtkTargetEntry drop_targets[] = {
-  { "text/uri-list", 0, TEXT_URI_LIST }
-};
-
-
 /* ********************* *
  *  Function Prototypes  *
  * ********************* */
@@ -291,9 +285,11 @@ gtk_file_chooser_button_init (GtkFileChooserButton *button)
   gtk_drag_dest_unset (priv->entry);
   gtk_drag_dest_set (GTK_WIDGET (button),
                      (GTK_DEST_DEFAULT_ALL),
-                    drop_targets, G_N_ELEMENTS (drop_targets),
+                    NULL, 0,
                     GDK_ACTION_COPY);
   gtk_drag_dest_add_text_targets (GTK_WIDGET (button));
+  gtk_target_list_add_uri_targets (gtk_drag_dest_get_target_list (GTK_WIDGET (button)), 
+                                  TEXT_URI_LIST);
 }
 
 
@@ -343,7 +339,8 @@ gtk_file_chooser_button_set_property (GObject      *object,
 
     case GTK_FILE_CHOOSER_PROP_ACTION:
       g_object_set_property (G_OBJECT (priv->dialog), pspec->name, value);
-      _gtk_file_chooser_entry_set_action (priv->entry, g_value_get_enum (value));
+      _gtk_file_chooser_entry_set_action (priv->entry, 
+                                         (GtkFileChooserAction)g_value_get_enum (value));
 
       switch (g_value_get_enum (value))
        {
@@ -491,7 +488,7 @@ gtk_file_chooser_button_drag_data_received (GtkWidget            *widget,
        guint i;
        gboolean selected;
 
-       uris = g_strsplit (data->data, "\r\n", -1);
+       uris = gtk_selection_data_get_uris (data);
 
        if (uris == NULL)
          break;
index 8a4d53bc38b43469af43dcf681fac371ae335490..f6a9b5c85a9e63651336f3af013f9cdb21730c95 100644 (file)
@@ -2478,70 +2478,23 @@ shortcuts_drag_drop_cb (GtkWidget             *widget,
   return TRUE;
 }
 
-/* Converts raw selection data from text/uri-list to a list of strings. */
-static GSList *
-split_uris (const char *data)
-{
-  GSList *uris;
-  const char *p, *q;
-
-  uris = NULL;
-
-  p = data;
-
-  /* We don't actually try to validate the URI according to RFC
-   * 2396, or even check for allowed characters - we just ignore
-   * comments and trim whitespace off the ends.  We also
-   * allow LF delimination as well as the specified CRLF.
-   *
-   * We do allow comments like specified in RFC 2483.
-   */
-  while (p)
-    {
-      if (*p != '#')
-       {
-         while (g_ascii_isspace (*p))
-           p++;
-
-         q = p;
-         while (*q && (*q != '\n') && (*q != '\r'))
-           q++;
-
-         if (q > p)
-           {
-             q--;
-             while (q > p && g_ascii_isspace (*q))
-               q--;
-
-             if (q > p)
-               uris = g_slist_prepend (uris, g_strndup (p, q - p + 1));
-           }
-       }
-      p = strchr (p, '\n');
-      if (p)
-       p++;
-    }
-
-  uris = g_slist_reverse (uris);
-  return uris;
-}
-
 /* Parses a "text/uri-list" string and inserts its URIs as bookmarks */
 static void
 shortcuts_drop_uris (GtkFileChooserDefault *impl,
                     const char            *data,
                     int                    position)
 {
-  GSList *uris, *l;
+  gchar **uris;
+  gint i;
 
-  uris = split_uris (data);
+  uris = g_uri_list_extract_uris (data);
 
-  for (l = uris; l; l = l->next)
+  for (i = 0; uris[i]; i++)
     {
       char *uri;
       GtkFilePath *path;
 
-      uri = l->data;
+      uri = uris[i];
       path = gtk_file_system_uri_to_path (impl->file_system, uri);
 
       if (path)
@@ -2560,11 +2513,9 @@ shortcuts_drop_uris (GtkFileChooserDefault *impl,
          error_message (impl, msg);
          g_free (msg);
        }
-
-      g_free (uri);
     }
 
-  g_slist_free (uris);
+  g_strfreev (uris);
 }
 
 /* Reorders the selected bookmark to the specified position */
index b792a3cf9353c7403da2c2d67816001e28d8c00c..7b3230843ca239a384644a38b109e98323e222ee 100644 (file)
@@ -246,6 +246,7 @@ static GdkAtom ctext_atom;
 static GdkAtom text_plain_atom;
 static GdkAtom text_plain_utf8_atom;
 static GdkAtom text_plain_locale_atom;
+static GdkAtom text_uri_list_atom;
 
 static void 
 init_atoms (void)
@@ -264,6 +265,8 @@ init_atoms (void)
       tmp = g_strdup_printf ("text/plain;charset=%s", charset);
       text_plain_locale_atom = gdk_atom_intern (tmp, FALSE);
       g_free (tmp);
+
+      text_uri_list_atom = gdk_atom_intern ("text/uri-list", FALSE);
     }
 }
 
@@ -340,6 +343,27 @@ gtk_target_list_add_image_targets (GtkTargetList *list,
   g_slist_free (formats);
 }
 
+/**
+ * gtk_target_list_add_uri_targets:
+ * @list: a #GtkTargetList
+ * @info: an ID that will be passed back to the application
+ * 
+ * Adds the URI targets supported by #GtkSelection to
+ * the target list. All targets are added with the same @info.
+ * 
+ * Since: 2.6
+ **/
+void 
+gtk_target_list_add_uri_targets (GtkTargetList *list,
+                                guint          info)
+{
+  g_return_if_fail (list != NULL);
+  
+  init_atoms ();
+
+  gtk_target_list_add (list, text_uri_list_atom, 0, info);  
+}
+
 void               
 gtk_target_list_add_table (GtkTargetList        *list,
                           const GtkTargetEntry *targets,
@@ -1303,6 +1327,100 @@ gtk_selection_data_get_pixbuf (GtkSelectionData *selection_data)
   return result;
 }
 
+/**
+ * gtk_selection_data_set_uris:
+ * @selection_data: a #GtkSelectionData
+ * @uris: a %NULL-terminated array of strings hilding URIs
+ * 
+ * Sets the contents of the selection from a list of URIs.
+ * The string is converted to the form determined by
+ * @selection_data->target.
+ * 
+ * Return value: %TRUE if the selection was successfully set,
+ *   otherwise %FALSE.
+ *
+ * Since: 2.6
+ **/
+gboolean
+gtk_selection_data_set_uris (GtkSelectionData  *selection_data,
+                            gchar            **uris)
+{
+  init_atoms ();
+
+  if (selection_data->target == text_uri_list_atom)
+    {
+      GString *list;
+      gint i;
+      gchar *result;
+      gsize length;
+      
+      list = g_string_new (0);
+      for (i = 0; uris[i]; i++)
+       {
+         g_string_append (list, uris[i]);
+         g_string_append (list, "\r\n");
+       }
+
+      result = g_convert (list->str, list->len,
+                         "ASCII", "UTF-8", 
+                         NULL, &length, NULL);
+      g_string_free (list, TRUE);
+      
+      if (result)
+       {
+         gtk_selection_data_set (selection_data,
+                                 text_uri_list_atom,
+                                 8, (guchar *)result, length);
+         
+         return TRUE;
+       }
+    }
+
+  return FALSE;
+}
+
+/**
+ * gtk_selection_data_get_uris:
+ * @selection_data: a #GtkSelectionData
+ * 
+ * Gets the contents of the selection data as array of URIs.
+ * 
+ * Return value: if the selection data contains a list of
+ *   URIs, a newly allocated %NULL-terminated string array
+ *   containing the URIs, otherwise %NULL. If the result is 
+ *   non-%NULL it must be freed with g_strfreev().
+ *
+ * Since: 2.6
+ **/
+gchar **
+gtk_selection_data_get_uris (GtkSelectionData *selection_data)
+{
+  gchar **result = NULL;
+
+  init_atoms ();
+  
+  if (selection_data->length >= 0 &&
+      selection_data->type == text_uri_list_atom)
+    {
+      gchar **list;
+      gint i;
+      gint count = gdk_text_property_to_utf8_list_for_display (selection_data->display,
+                                                              utf8_atom,
+                                                              selection_data->format, 
+                                                              selection_data->data,
+                                                              selection_data->length,
+                                                              &list);
+      if (count > 0)
+       result = g_uri_list_extract_uris (list[0]);
+      
+      for (i = 1; i < count; i++)
+       g_free (list[i]);
+      g_free (list);
+    }
+
+  return result;
+}
+
 
 /**
  * gtk_selection_data_get_targets:
index 12c341201d5530bdf33a3087b48bd42175822dc9..5623b440e477bb1067fcd81fe62ba1ab49f11a64 100644 (file)
@@ -95,11 +95,13 @@ void           gtk_target_list_add       (GtkTargetList  *list,
                                          GdkAtom         target,
                                          guint           flags,
                                          guint           info);
-void           gtk_target_list_add_text_targets (GtkTargetList  *list,
-                                                guint           info);
+void           gtk_target_list_add_text_targets  (GtkTargetList  *list,
+                                                 guint           info);
 void           gtk_target_list_add_image_targets (GtkTargetList  *list,
                                                  guint           info,
                                                  gboolean        writable);
+void           gtk_target_list_add_uri_targets   (GtkTargetList  *list,
+                                                 guint           info);
 void           gtk_target_list_add_table (GtkTargetList        *list,
                                          const GtkTargetEntry *targets,
                                          guint                 ntargets);
@@ -145,6 +147,9 @@ guchar * gtk_selection_data_get_text (GtkSelectionData     *selection_data);
 gboolean gtk_selection_data_set_pixbuf (GtkSelectionData   *selection_data,
                                        GdkPixbuf          *pixbuf);
 GdkPixbuf *gtk_selection_data_get_pixbuf (GtkSelectionData *selection_data);
+gboolean gtk_selection_data_set_uris (GtkSelectionData     *selection_data,
+                                     gchar               **uris);
+gchar  **gtk_selection_data_get_uris (GtkSelectionData     *selection_data);
 
 gboolean gtk_selection_data_get_targets          (GtkSelectionData  *selection_data,
                                                  GdkAtom          **targets,