X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkselection.c;h=7195b86a51f062de0b5a3fe4904088f425b8e9e8;hb=81bc45ee69834215ffcf2c69fbd5b3f458287fec;hp=a7712ce2135ccc47c087cb1a0f773b0896346b90;hpb=371c875c908390fd7ef5274bf27b0661cce7f564;p=~andy%2Fgtk diff --git a/gtk/gtkselection.c b/gtk/gtkselection.c index a7712ce21..7195b86a5 100644 --- a/gtk/gtkselection.c +++ b/gtk/gtkselection.c @@ -51,7 +51,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#include +#include "config.h" #include #include #include "gdk.h" @@ -94,6 +94,7 @@ enum { MULTIPLE, TARGETS, TIMESTAMP, + SAVE_TARGETS, LAST_ATOM }; @@ -152,8 +153,8 @@ struct _GtkRetrievalInfo /* Local Functions */ static void gtk_selection_init (void); -static gint gtk_selection_incr_timeout (GtkIncrInfo *info); -static gint gtk_selection_retrieval_timeout (GtkRetrievalInfo *info); +static gboolean gtk_selection_incr_timeout (GtkIncrInfo *info); +static gboolean gtk_selection_retrieval_timeout (GtkRetrievalInfo *info); static void gtk_selection_retrieval_report (GtkRetrievalInfo *info, GdkAtom type, gint format, @@ -198,7 +199,7 @@ GtkTargetList * gtk_target_list_new (const GtkTargetEntry *targets, guint ntargets) { - GtkTargetList *result = g_new (GtkTargetList, 1); + GtkTargetList *result = g_slice_new (GtkTargetList); result->list = NULL; result->ref_count = 1; @@ -246,13 +247,13 @@ gtk_target_list_unref (GtkTargetList *list) while (tmp_list) { GtkTargetPair *pair = tmp_list->data; - g_free (pair); + g_slice_free (GtkTargetPair, pair); tmp_list = tmp_list->next; } g_list_free (list->list); - g_free (list); + g_slice_free (GtkTargetList, list); } } @@ -275,7 +276,7 @@ gtk_target_list_add (GtkTargetList *list, g_return_if_fail (list != NULL); - pair = g_new (GtkTargetPair, 1); + pair = g_slice_new (GtkTargetPair); pair->target = target; pair->flags = flags; pair->info = info; @@ -338,7 +339,8 @@ gtk_target_list_add_text_targets (GtkTargetList *list, gtk_target_list_add (list, text_atom, 0, info); gtk_target_list_add (list, GDK_TARGET_STRING, 0, info); gtk_target_list_add (list, text_plain_utf8_atom, 0, info); - gtk_target_list_add (list, text_plain_locale_atom, 0, info); + if (!g_get_charset (NULL)) + gtk_target_list_add (list, text_plain_locale_atom, 0, info); gtk_target_list_add (list, text_plain_atom, 0, info); } @@ -483,7 +485,7 @@ gtk_target_list_add_table (GtkTargetList *list, for (i=ntargets-1; i >= 0; i--) { - GtkTargetPair *pair = g_new (GtkTargetPair, 1); + GtkTargetPair *pair = g_slice_new (GtkTargetPair); pair->target = gdk_atom_intern (targets[i].target, FALSE); pair->flags = targets[i].flags; pair->info = targets[i].info; @@ -514,7 +516,7 @@ gtk_target_list_remove (GtkTargetList *list, if (pair->target == target) { - g_free (pair); + g_slice_free (GtkTargetPair, pair); list->list = g_list_remove_link (list->list, tmp_list); g_list_free_1 (tmp_list); @@ -530,10 +532,11 @@ gtk_target_list_remove (GtkTargetList *list, * gtk_target_list_find: * @list: a #GtkTargetList * @target: an interned atom representing the target to search for - * @info: a pointer to the location to store application info for target - * + * @info: a pointer to the location to store application info for target, + * or %NULL + * * Looks up a given target in a #GtkTargetList. - * + * * Return value: %TRUE if the target was found, otherwise %FALSE **/ gboolean @@ -541,16 +544,23 @@ gtk_target_list_find (GtkTargetList *list, GdkAtom target, guint *info) { - GList *tmp_list = list->list; + GList *tmp_list; + + g_return_val_if_fail (list != NULL, FALSE); + + tmp_list = list->list; while (tmp_list) { GtkTargetPair *pair = tmp_list->data; if (pair->target == target) { - *info = pair->info; + if (info) + *info = pair->info; + return TRUE; } + tmp_list = tmp_list->next; } @@ -682,14 +692,14 @@ gtk_selection_owner_set_for_display (GdkDisplay *display, current_selections = g_list_remove_link (current_selections, tmp_list); g_list_free (tmp_list); - g_free (selection_info); + g_slice_free (GtkSelectionInfo, selection_info); } } else { if (selection_info == NULL) { - selection_info = g_new (GtkSelectionInfo, 1); + selection_info = g_slice_new (GtkSelectionInfo); selection_info->selection = selection; selection_info->widget = widget; selection_info->time = time; @@ -787,7 +797,7 @@ gtk_selection_target_list_get (GtkWidget *widget, tmp_list = tmp_list->next; } - sellist = g_new (GtkSelectionTargetList, 1); + sellist = g_slice_new (GtkSelectionTargetList); sellist->selection = selection; sellist->list = gtk_target_list_new (NULL, 0); @@ -813,7 +823,7 @@ gtk_selection_target_list_remove (GtkWidget *widget) gtk_target_list_unref (sellist->list); - g_free (sellist); + g_slice_free (GtkSelectionTargetList, sellist); tmp_list = tmp_list->next; } @@ -850,7 +860,7 @@ gtk_selection_clear_targets (GtkWidget *widget, { lists = g_list_delete_link (lists, tmp_list); gtk_target_list_unref (sellist->list); - g_free (sellist); + g_slice_free (GtkSelectionTargetList, sellist); break; } @@ -943,7 +953,9 @@ gtk_selection_remove_all (GtkWidget *widget) GList *tmp_list; GList *next; GtkSelectionInfo *selection_info; - + + g_return_if_fail (GTK_IS_WIDGET (widget)); + /* Remove pending requests/incrs for this widget */ tmp_list = current_retrievals; @@ -977,7 +989,7 @@ gtk_selection_remove_all (GtkWidget *widget) current_selections = g_list_remove_link (current_selections, tmp_list); g_list_free (tmp_list); - g_free (selection_info); + g_slice_free (GtkSelectionInfo, selection_info); } tmp_list = next; @@ -997,7 +1009,7 @@ gtk_selection_remove_all (GtkWidget *widget) In emergency, you could use #GDK_CURRENT_TIME * * Requests the contents of a selection. When received, - * a "selection_received" signal will be generated. + * a "selection-received" signal will be generated. * * Return value: %TRUE if requested succeeded. %FALSE if we could not process * request. (e.g., there was already a request in process for @@ -1038,7 +1050,7 @@ gtk_selection_convert (GtkWidget *widget, tmp_list = tmp_list->next; } - info = g_new (GtkRetrievalInfo, 1); + info = g_slice_new (GtkRetrievalInfo); info->widget = widget; info->selection = selection; @@ -1056,6 +1068,7 @@ gtk_selection_convert (GtkWidget *widget, if (owner_window != NULL) { GtkWidget *owner_widget; + gpointer owner_widget_ptr; GtkSelectionData selection_data; selection_data.selection = selection; @@ -1064,7 +1077,8 @@ gtk_selection_convert (GtkWidget *widget, selection_data.length = -1; selection_data.display = display; - gdk_window_get_user_data (owner_window, (gpointer *)&owner_widget); + gdk_window_get_user_data (owner_window, &owner_widget_ptr); + owner_widget = owner_widget_ptr; if (owner_widget != NULL) { @@ -1080,8 +1094,10 @@ gtk_selection_convert (GtkWidget *widget, time_); g_free (selection_data.data); + selection_data.data = NULL; + selection_data.length = -1; - g_free (info); + g_slice_free (GtkRetrievalInfo, info); return TRUE; } } @@ -1090,11 +1106,137 @@ gtk_selection_convert (GtkWidget *widget, current_retrievals = g_list_append (current_retrievals, info); gdk_selection_convert (widget->window, selection, target, time_); - g_timeout_add (1000, (GSourceFunc) gtk_selection_retrieval_timeout, info); + gdk_threads_add_timeout (1000, + (GSourceFunc) gtk_selection_retrieval_timeout, info); return TRUE; } +/** + * gtk_selection_data_get_selection: + * @selection_data: a pointer to a #GtkSelectionData structure. + * + * Retrieves the selection #GdkAtom of the selection data. + * + * Returns: the selection #GdkAtom of the selection data. + * + * Since: 2.16 + **/ +GdkAtom +gtk_selection_data_get_selection (GtkSelectionData *selection_data) +{ + g_return_val_if_fail (selection_data != NULL, 0); + + return selection_data->selection; +} + +/** + * gtk_selection_data_get_target: + * @selection_data: a pointer to a #GtkSelectionData structure. + * + * Retrieves the target of the selection. + * + * Returns: the target of the selection. + * + * Since: 2.14 + **/ +GdkAtom +gtk_selection_data_get_target (GtkSelectionData *selection_data) +{ + g_return_val_if_fail (selection_data != NULL, 0); + + return selection_data->target; +} + +/** + * gtk_selection_data_get_data_type: + * @selection_data: a pointer to a #GtkSelectionData structure. + * + * Retrieves the data type of the selection. + * + * Returns: the data type of the selection. + * + * Since: 2.14 + **/ +GdkAtom +gtk_selection_data_get_data_type (GtkSelectionData *selection_data) +{ + g_return_val_if_fail (selection_data != NULL, 0); + + return selection_data->type; +} + +/** + * gtk_selection_data_get_format: + * @selection_data: a pointer to a #GtkSelectionData structure. + * + * Retrieves the format of the selection. + * + * Returns: the format of the selection. + * + * Since: 2.14 + **/ +gint +gtk_selection_data_get_format (GtkSelectionData *selection_data) +{ + g_return_val_if_fail (selection_data != NULL, 0); + + return selection_data->format; +} + +/** + * gtk_selection_data_get_data: + * @selection_data: a pointer to a #GtkSelectionData structure. + * + * Retrieves the raw data of the selection. + * + * Returns: the raw data of the selection. + * + * Since: 2.14 + **/ +const guchar* +gtk_selection_data_get_data (GtkSelectionData *selection_data) +{ + g_return_val_if_fail (selection_data != NULL, NULL); + + return selection_data->data; +} + +/** + * gtk_selection_data_get_length: + * @selection_data: a pointer to a #GtkSelectionData structure. + * + * Retrieves the length of the raw data of the selection. + * + * Returns: the length of the data of the selection. + * + * Since: 2.14 + */ +gint +gtk_selection_data_get_length (GtkSelectionData *selection_data) +{ + g_return_val_if_fail (selection_data != NULL, -1); + + return selection_data->length; +} + +/** + * gtk_selection_data_get_display: + * @selection_data: a pointer to a #GtkSelectionData structure. + * + * Retrieves the display of the selection. + * + * Returns: the display of the selection. + * + * Since: 2.14 + **/ +GdkDisplay * +gtk_selection_data_get_display (GtkSelectionData *selection_data) +{ + g_return_val_if_fail (selection_data != NULL, NULL); + + return selection_data->display; +} /** * gtk_selection_data_set: @@ -1115,8 +1257,9 @@ gtk_selection_data_set (GtkSelectionData *selection_data, const guchar *data, gint length) { - if (selection_data->data) - g_free (selection_data->data); + g_return_if_fail (selection_data != NULL); + + g_free (selection_data->data); selection_data->type = type; selection_data->format = format; @@ -1134,7 +1277,7 @@ gtk_selection_data_set (GtkSelectionData *selection_data, if (length < 0) selection_data->data = NULL; else - selection_data->data = g_strdup(""); + selection_data->data = (guchar *) g_strdup (""); } selection_data->length = length; @@ -1153,7 +1296,7 @@ selection_set_string (GtkSelectionData *selection_data, { gtk_selection_data_set (selection_data, GDK_SELECTION_TYPE_STRING, - 8, latin1, strlen (latin1)); + 8, (guchar *) latin1, strlen (latin1)); g_free (latin1); return TRUE; @@ -1197,8 +1340,9 @@ normalize_to_crlf (const gchar *str, { GString *result = g_string_sized_new (len); const gchar *p = str; + const gchar *end = str + len; - while (1) + while (p < end) { if (*p == '\n') g_string_append_c (result, '\r'); @@ -1207,13 +1351,12 @@ normalize_to_crlf (const gchar *str, { g_string_append_c (result, *p); p++; - if (*p != '\n') + if (p == end || *p != '\n') g_string_append_c (result, '\n'); + if (p == end) + break; } - if (*p == '\0') - break; - g_string_append_c (result, *p); p++; } @@ -1275,8 +1418,8 @@ selection_set_text_plain (GtkSelectionData *selection_data, if (!result) { - g_warning ("Error converting from UTF-8 to %s: %s", - charset, error->message); + g_warning ("Error converting from %s to %s: %s", + "UTF-8", charset, error->message); g_error_free (error); return FALSE; @@ -1284,13 +1427,13 @@ selection_set_text_plain (GtkSelectionData *selection_data, gtk_selection_data_set (selection_data, selection_data->target, - 8, result, strlen (result)); + 8, (guchar *) result, strlen (result)); g_free (result); return TRUE; } -static gchar * +static guchar * selection_get_text_plain (GtkSelectionData *selection_data) { const gchar *charset = NULL; @@ -1298,7 +1441,7 @@ selection_get_text_plain (GtkSelectionData *selection_data) gsize len; GError *error = NULL; - str = g_strdup (selection_data->data); + str = g_strdup ((const gchar *) selection_data->data); len = selection_data->length; if (selection_data->type == text_plain_atom) @@ -1310,14 +1453,14 @@ selection_get_text_plain (GtkSelectionData *selection_data) { gchar *tmp = str; str = g_convert_with_fallback (tmp, len, - charset, "UTF-8", + "UTF-8", charset, NULL, NULL, &len, &error); g_free (tmp); if (!str) { - g_warning ("Error converting from %s to UTF-8: %s", - charset, error->message); + g_warning ("Error converting from %s to %s: %s", + charset, "UTF-8", error->message); g_error_free (error); return NULL; @@ -1325,7 +1468,8 @@ selection_get_text_plain (GtkSelectionData *selection_data) } else if (!g_utf8_validate (str, -1, NULL)) { - g_warning ("Error converting from text/plain;charset=utf-8 to UTF-8"); + g_warning ("Error converting from %s to %s: %s", + "text/plain;charset=utf-8", "UTF-8", "invalid UTF-8"); g_free (str); return NULL; @@ -1334,7 +1478,7 @@ selection_get_text_plain (GtkSelectionData *selection_data) result = normalize_to_lf (str, len); g_free (str); - return result; + return (guchar *) result; } /** @@ -1355,6 +1499,8 @@ gtk_selection_data_set_text (GtkSelectionData *selection_data, const gchar *str, gint len) { + g_return_val_if_fail (selection_data != NULL, FALSE); + if (len < 0) len = strlen (str); @@ -1405,6 +1551,8 @@ gtk_selection_data_get_text (GtkSelectionData *selection_data) { guchar *result = NULL; + g_return_val_if_fail (selection_data != NULL, NULL); + init_atoms (); if (selection_data->length >= 0 && @@ -1421,7 +1569,7 @@ gtk_selection_data_get_text (GtkSelectionData *selection_data) selection_data->length, &list); if (count > 0) - result = list[0]; + result = (guchar *) list[0]; for (i = 1; i < count; i++) g_free (list[i]); @@ -1463,6 +1611,9 @@ gtk_selection_data_set_pixbuf (GtkSelectionData *selection_data, gchar *str, *type; gsize len; + g_return_val_if_fail (selection_data != NULL, FALSE); + g_return_val_if_fail (GDK_IS_PIXBUF (pixbuf), FALSE); + formats = gdk_pixbuf_get_formats (); for (f = formats; f; f = f->next) @@ -1521,6 +1672,8 @@ gtk_selection_data_get_pixbuf (GtkSelectionData *selection_data) GdkPixbufLoader *loader; GdkPixbuf *result = NULL; + g_return_val_if_fail (selection_data != NULL, NULL); + if (selection_data->length > 0) { loader = gdk_pixbuf_loader_new (); @@ -1544,7 +1697,7 @@ gtk_selection_data_get_pixbuf (GtkSelectionData *selection_data) /** * gtk_selection_data_set_uris: * @selection_data: a #GtkSelectionData - * @uris: a %NULL-terminated array of strings hilding URIs + * @uris: a %NULL-terminated array of strings holding URIs * * Sets the contents of the selection from a list of URIs. * The string is converted to the form determined by @@ -1559,6 +1712,9 @@ gboolean gtk_selection_data_set_uris (GtkSelectionData *selection_data, gchar **uris) { + g_return_val_if_fail (selection_data != NULL, FALSE); + g_return_val_if_fail (uris != NULL, FALSE); + init_atoms (); if (selection_data->target == text_uri_list_atom) @@ -1613,13 +1769,14 @@ gtk_selection_data_get_uris (GtkSelectionData *selection_data) { gchar **result = NULL; + g_return_val_if_fail (selection_data != NULL, 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, @@ -1656,9 +1813,14 @@ gtk_selection_data_get_targets (GtkSelectionData *selection_data, GdkAtom **targets, gint *n_atoms) { + g_return_val_if_fail (selection_data != NULL, FALSE); + + /* As usual, java gets it wrong and sets the type to TARGETS, not ATOM + */ if (selection_data->length >= 0 && selection_data->format == 32 && - selection_data->type == GDK_SELECTION_TYPE_ATOM) + (selection_data->type == GDK_SELECTION_TYPE_ATOM || + selection_data->type == gtk_selection_atoms[TARGETS])) { if (targets) *targets = g_memdup (selection_data->data, selection_data->length); @@ -1693,11 +1855,13 @@ gtk_selection_data_get_targets (GtkSelectionData *selection_data, **/ gboolean gtk_targets_include_text (GdkAtom *targets, - gint n_targets) + gint n_targets) { gint i; gboolean result = FALSE; + g_return_val_if_fail (targets != NULL || n_targets == 0, FALSE); + /* Keep in sync with gtk_target_list_add_text_targets() */ @@ -1745,6 +1909,7 @@ gtk_targets_include_rich_text (GdkAtom *targets, gint i, j; gboolean result = FALSE; + g_return_val_if_fail (targets != NULL || n_targets == 0, FALSE); g_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), FALSE); init_atoms (); @@ -1788,6 +1953,8 @@ gtk_selection_data_targets_include_text (GtkSelectionData *selection_data) gint n_targets; gboolean result = FALSE; + g_return_val_if_fail (selection_data != NULL, FALSE); + init_atoms (); if (gtk_selection_data_get_targets (selection_data, &targets, &n_targets)) @@ -1822,6 +1989,7 @@ gtk_selection_data_targets_include_rich_text (GtkSelectionData *selection_data, gint n_targets; gboolean result = FALSE; + g_return_val_if_fail (selection_data != NULL, FALSE); g_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), FALSE); init_atoms (); @@ -1860,6 +2028,8 @@ gtk_targets_include_image (GdkAtom *targets, gint i; gboolean result = FALSE; + g_return_val_if_fail (targets != NULL || n_targets == 0, FALSE); + list = gtk_target_list_new (NULL, 0); gtk_target_list_add_image_targets (list, 0, writable); for (i = 0; i < n_targets && !result; i++) @@ -1902,6 +2072,8 @@ gtk_selection_data_targets_include_image (GtkSelectionData *selection_data, gint n_targets; gboolean result = FALSE; + g_return_val_if_fail (selection_data != NULL, FALSE); + init_atoms (); if (gtk_selection_data_get_targets (selection_data, &targets, &n_targets)) @@ -1933,6 +2105,8 @@ gtk_targets_include_uri (GdkAtom *targets, gint i; gboolean result = FALSE; + g_return_val_if_fail (targets != NULL || n_targets == 0, FALSE); + /* Keep in sync with gtk_target_list_add_uri_targets() */ @@ -1959,7 +2133,7 @@ gtk_targets_include_uri (GdkAtom *targets, * provide a list or URIs. * * Return value: %TRUE if @selection_data holds a list of targets, - * and a suitable target for text is included, otherwise %FALSE. + * and a suitable target for URI lists is included, otherwise %FALSE. * * Since: 2.10 **/ @@ -1970,6 +2144,8 @@ gtk_selection_data_targets_include_uri (GtkSelectionData *selection_data) gint n_targets; gboolean result = FALSE; + g_return_val_if_fail (selection_data != NULL, FALSE); + init_atoms (); if (gtk_selection_data_get_targets (selection_data, &targets, &n_targets)) @@ -1997,6 +2173,7 @@ gtk_selection_init (void) gtk_selection_atoms[MULTIPLE] = gdk_atom_intern_static_string ("MULTIPLE"); gtk_selection_atoms[TIMESTAMP] = gdk_atom_intern_static_string ("TIMESTAMP"); gtk_selection_atoms[TARGETS] = gdk_atom_intern_static_string ("TARGETS"); + gtk_selection_atoms[SAVE_TARGETS] = gdk_atom_intern_static_string ("SAVE_TARGETS"); initialize = FALSE; } @@ -2006,7 +2183,7 @@ gtk_selection_init (void) * @widget: a #GtkWidget * @event: the event * - * The default handler for the GtkWidget::selection_clear_event + * The default handler for the #GtkWidget::selection-clear-event * signal. * * Return value: %TRUE if the event was handled, otherwise false @@ -2014,7 +2191,7 @@ gtk_selection_init (void) * Since: 2.2 * * Deprecated: 2.4: Instead of calling this function, chain up from - * your selection_clear_event handler. Calling this function + * your selection-clear-event handler. Calling this function * from any other context is illegal. **/ gboolean @@ -2044,7 +2221,7 @@ gtk_selection_clear (GtkWidget *widget, { current_selections = g_list_remove_link (current_selections, tmp_list); g_list_free (tmp_list); - g_free (selection_info); + g_slice_free (GtkSelectionInfo, selection_info); } return TRUE; @@ -2092,7 +2269,7 @@ _gtk_selection_request (GtkWidget *widget, if (tmp_list == NULL) return FALSE; - info = g_new (GtkIncrInfo, 1); + info = g_slice_new (GtkIncrInfo); g_object_ref (widget); @@ -2130,7 +2307,8 @@ _gtk_selection_request (GtkWidget *widget, GDK_NONE, event->time); g_free (mult_atoms); - g_free (info); + g_slice_free (GtkIncrInfo, info); + gdk_error_trap_pop (); return TRUE; } gdk_error_trap_pop (); @@ -2167,6 +2345,8 @@ _gtk_selection_request (GtkWidget *widget, info->conversions[i].target = ((GdkAtom *)mult_atoms)[2*i]; info->conversions[i].property = ((GdkAtom *)mult_atoms)[2*i+1]; } + + g_free (mult_atoms); } } else /* only a single conversion */ @@ -2199,7 +2379,6 @@ _gtk_selection_request (GtkWidget *widget, #endif gtk_selection_invoke_handler (widget, &data, event->time); - if (data.length < 0) { info->conversions[i].property = GDK_NONE; @@ -2260,7 +2439,7 @@ _gtk_selection_request (GtkWidget *widget, gdk_window_get_events (info->requestor) | GDK_PROPERTY_CHANGE_MASK); current_incrs = g_list_append (current_incrs, info); - g_timeout_add (1000, (GSourceFunc) gtk_selection_incr_timeout, info); + gdk_threads_add_timeout (1000, (GSourceFunc) gtk_selection_incr_timeout, info); } /* If it was a MULTIPLE request, set the property to indicate which @@ -2305,7 +2484,7 @@ _gtk_selection_request (GtkWidget *widget, if (info->num_incrs == 0) { g_free (info->conversions); - g_free (info); + g_slice_free (GtkIncrInfo, info); } g_object_unref (widget); @@ -2449,8 +2628,6 @@ gtk_selection_incr_timeout (GtkIncrInfo *info) GList *tmp_list; gboolean retval; - GDK_THREADS_ENTER (); - /* Determine if retrieval has finished by checking if it still in list of pending retrievals */ @@ -2475,7 +2652,7 @@ gtk_selection_incr_timeout (GtkIncrInfo *info) /* FIXME: we should check if requestor window is still in use, and if not, remove it? */ - g_free (info); + g_slice_free (GtkIncrInfo, info); retval = FALSE; /* remove timeout */ } @@ -2486,14 +2663,12 @@ gtk_selection_incr_timeout (GtkIncrInfo *info) retval = TRUE; /* timeout will happen again */ } - GDK_THREADS_LEAVE (); - return retval; } /************************************************************* * _gtk_selection_notify: - * Handler for "selection_notify_event" signals on windows + * Handler for "selection-notify-event" signals on windows * where a retrieval is currently in process. The selection * owner has responded to our conversion request. * arguments: @@ -2582,7 +2757,7 @@ _gtk_selection_notify (GtkWidget *widget, /************************************************************* * _gtk_selection_property_notify: - * Handler for "property_notify_event" signals on windows + * Handler for "property-notify-event" signals on windows * where a retrieval is currently in process. The selection * owner has added more data. * arguments: @@ -2693,14 +2868,12 @@ _gtk_selection_property_notify (GtkWidget *widget, * results: *************************************************************/ -static gint +static gboolean gtk_selection_retrieval_timeout (GtkRetrievalInfo *info) { GList *tmp_list; gboolean retval; - GDK_THREADS_ENTER (); - /* Determine if retrieval has finished by checking if it still in list of pending retrievals */ @@ -2723,7 +2896,7 @@ gtk_selection_retrieval_timeout (GtkRetrievalInfo *info) } g_free (info->buffer); - g_free (info); + g_slice_free (GtkRetrievalInfo, info); retval = FALSE; /* remove timeout */ } @@ -2734,14 +2907,12 @@ gtk_selection_retrieval_timeout (GtkRetrievalInfo *info) retval = TRUE; /* timeout will happen again */ } - GDK_THREADS_LEAVE (); - return retval; } /************************************************************* * gtk_selection_retrieval_report: - * Emits a "selection_received" signal. + * Emits a "selection-received" signal. * arguments: * info: information about the retrieval that completed * buffer: buffer containing data (NULL => errror) @@ -2767,7 +2938,7 @@ gtk_selection_retrieval_report (GtkRetrievalInfo *info, data.display = gtk_widget_get_display (info->widget); g_signal_emit_by_name (info->widget, - "selection_received", + "selection-received", &data, time); } @@ -2798,11 +2969,12 @@ gtk_selection_invoke_handler (GtkWidget *widget, g_return_if_fail (widget != NULL); target_list = gtk_selection_target_list_get (widget, data->selection); - if (target_list && + if (data->target != gtk_selection_atoms[SAVE_TARGETS] && + target_list && gtk_target_list_find (target_list, data->target, &info)) { g_signal_emit_by_name (widget, - "selection_get", + "selection-get", data, info, time); } @@ -2891,6 +3063,12 @@ gtk_selection_default_handler (GtkWidget *widget, tmp_list = tmp_list->next; } } + else if (data->target == gtk_selection_atoms[SAVE_TARGETS]) + { + gtk_selection_data_set (data, + gdk_atom_intern_static_string ("NULL"), + 32, "", 0); + } else { data->length = -1; @@ -2913,7 +3091,7 @@ gtk_selection_data_copy (GtkSelectionData *data) g_return_val_if_fail (data != NULL, NULL); - new_data = g_new (GtkSelectionData, 1); + new_data = g_slice_new (GtkSelectionData); *new_data = *data; if (data->data) @@ -2937,10 +3115,9 @@ gtk_selection_data_free (GtkSelectionData *data) { g_return_if_fail (data != NULL); - if (data->data) - g_free (data->data); + g_free (data->data); - g_free (data); + g_slice_free (GtkSelectionData, data); } GType