forked from AuroraMiddleware/gtk
Use the new file DND api.
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().
This commit is contained in:
parent
9d0a283f34
commit
a811584d01
20
ChangeLog
20
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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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])
|
||||
|
||||
|
60
gtk/gtkdnd.c
60
gtk/gtkdnd.c
@ -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)
|
||||
{
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
@ -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 */
|
||||
|
@ -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:
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user