X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkselection.c;h=67a774f7683107abffe95c8d9a9ddef0e1b6f7f7;hb=ea043cab5718304d9b6170afa2d3f959fc99c718;hp=fc0f031c4f28ee1f58aac8b8602214ffbfc2dbdb;hpb=18578b33c59c2c4c5852cab9cda03f087a28dbc3;p=~andy%2Fgtk diff --git a/gtk/gtkselection.c b/gtk/gtkselection.c index fc0f031c4..67a774f76 100644 --- a/gtk/gtkselection.c +++ b/gtk/gtkselection.c @@ -12,9 +12,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ /* This file implements most of the work of the ICCCM selection protocol. @@ -51,14 +49,43 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ +/** + * SECTION:gtkselection + * @Title: Selections + * @Short_description: Functions for handling inter-process communication + * via selections + * @See_also: #GtkWidget - Much of the operation of selections happens via + * signals for #GtkWidget. In particular, if you are using the functions + * in this section, you may need to pay attention to + * #GtkWidget::selection-get, #GtkWidget::selection-received and + * #GtkWidget::selection-clear-event signals + * + * The selection mechanism provides the basis for different types + * of communication between processes. In particular, drag and drop and + * #GtkClipboard work via selections. You will very seldom or + * never need to use most of the functions in this section directly; + * #GtkClipboard provides a nicer interface to the same functionality. + * + * Some of the datatypes defined this section are used in + * the #GtkClipboard and drag-and-drop API's as well. The + * #GtkTargetEntry structure and #GtkTargetList objects represent + * lists of data types that are supported when sending or + * receiving data. The #GtkSelectionData object is used to + * store a chunk of data along with the data type and other + * associated information. + */ + #include "config.h" + +#include "gtkselection.h" +#include "gtkselectionprivate.h" + #include #include #include "gdk.h" #include "gtkmain.h" #include "gtkdebug.h" -#include "gtkselection.h" #include "gtktextbufferrichtext.h" #include "gtkintl.h" #include "gdk-pixbuf/gdk-pixbuf.h" @@ -187,12 +214,12 @@ static const char gtk_selection_handler_key[] = "gtk-selection-handlers"; /** * gtk_target_list_new: - * @targets: Pointer to an array of #GtkTargetEntry - * @ntargets: number of entries in @targets. + * @targets: (array length=ntargets): Pointer to an array of #GtkTargetEntry + * @ntargets: number of entries in @targets. * * Creates a new #GtkTargetList from an array of #GtkTargetEntry. * - * Return value: the new #GtkTargetList. + * Return value: (transfer full): the new #GtkTargetList. **/ GtkTargetList * gtk_target_list_new (const GtkTargetEntry *targets, @@ -470,7 +497,7 @@ gtk_target_list_add_uri_targets (GtkTargetList *list, /** * gtk_target_list_add_table: * @list: a #GtkTargetList - * @targets: the table of #GtkTargetEntry + * @targets: (array length=ntargets): the table of #GtkTargetEntry * @ntargets: number of targets in the table * * Prepends a table of #GtkTargetEntry to a target list. @@ -569,14 +596,14 @@ gtk_target_list_find (GtkTargetList *list, /** * gtk_target_table_new_from_list: * @list: a #GtkTargetList - * @n_targets: return location for the number ot targets in the table + * @n_targets: (out): return location for the number ot targets in the table * * This function creates an #GtkTargetEntry array that contains the * same targets as the passed %list. The returned table is newly * allocated and should be freed using gtk_target_table_free() when no * longer needed. * - * Return value: the new table. + * Return value: (array length=n_targets) (transfer full): the new table. * * Since: 2.10 **/ @@ -610,7 +637,7 @@ gtk_target_table_new_from_list (GtkTargetList *list, /** * gtk_target_table_free: - * @targets: a #GtkTargetEntry array + * @targets: (array length=n_targets): a #GtkTargetEntry array * @n_targets: the number of entries in the array * * This function frees a target table as returned by @@ -634,8 +661,8 @@ gtk_target_table_free (GtkTargetEntry *targets, /** * gtk_selection_owner_set_for_display: - * @display: the #Gdkdisplay where the selection is set - * @widget: (allow-none): new selection owner (a #GdkWidget), or %NULL. + * @display: the #GdkDisplay where the selection is set + * @widget: (allow-none): new selection owner (a #GtkWidget), or %NULL. * @selection: an interned atom representing the selection to claim. * @time_: timestamp with which to claim the selection * @@ -902,7 +929,7 @@ gtk_selection_add_target (GtkWidget *widget, * gtk_selection_add_targets: * @widget: a #GtkWidget * @selection: the selection - * @targets: a table of targets to add + * @targets: (array length=ntargets): a table of targets to add * @ntargets: number of entries in @targets * * Prepends a table of targets to the list of supported targets @@ -1068,11 +1095,10 @@ gtk_selection_convert (GtkWidget *widget, { GtkWidget *owner_widget; gpointer owner_widget_ptr; - GtkSelectionData selection_data; + GtkSelectionData selection_data = {0}; selection_data.selection = selection; selection_data.target = target; - selection_data.data = NULL; selection_data.length = -1; selection_data.display = display; @@ -1117,12 +1143,12 @@ gtk_selection_convert (GtkWidget *widget, * * Retrieves the selection #GdkAtom of the selection data. * - * Returns: the selection #GdkAtom of the selection data. + * Returns: (transfer none): the selection #GdkAtom of the selection data. * * Since: 2.16 **/ GdkAtom -gtk_selection_data_get_selection (GtkSelectionData *selection_data) +gtk_selection_data_get_selection (const GtkSelectionData *selection_data) { g_return_val_if_fail (selection_data != NULL, 0); @@ -1135,12 +1161,12 @@ gtk_selection_data_get_selection (GtkSelectionData *selection_data) * * Retrieves the target of the selection. * - * Returns: the target of the selection. + * Returns: (transfer none): the target of the selection. * * Since: 2.14 **/ GdkAtom -gtk_selection_data_get_target (GtkSelectionData *selection_data) +gtk_selection_data_get_target (const GtkSelectionData *selection_data) { g_return_val_if_fail (selection_data != NULL, 0); @@ -1153,12 +1179,12 @@ gtk_selection_data_get_target (GtkSelectionData *selection_data) * * Retrieves the data type of the selection. * - * Returns: the data type of the selection. + * Returns: (transfer none): the data type of the selection. * * Since: 2.14 **/ GdkAtom -gtk_selection_data_get_data_type (GtkSelectionData *selection_data) +gtk_selection_data_get_data_type (const GtkSelectionData *selection_data) { g_return_val_if_fail (selection_data != NULL, 0); @@ -1176,7 +1202,7 @@ gtk_selection_data_get_data_type (GtkSelectionData *selection_data) * Since: 2.14 **/ gint -gtk_selection_data_get_format (GtkSelectionData *selection_data) +gtk_selection_data_get_format (const GtkSelectionData *selection_data) { g_return_val_if_fail (selection_data != NULL, 0); @@ -1184,7 +1210,7 @@ gtk_selection_data_get_format (GtkSelectionData *selection_data) } /** - * gtk_selection_data_get_data: + * gtk_selection_data_get_data: (skip) * @selection_data: a pointer to a #GtkSelectionData structure. * * Retrieves the raw data of the selection. @@ -1194,7 +1220,7 @@ gtk_selection_data_get_format (GtkSelectionData *selection_data) * Since: 2.14 **/ const guchar* -gtk_selection_data_get_data (GtkSelectionData *selection_data) +gtk_selection_data_get_data (const GtkSelectionData *selection_data) { g_return_val_if_fail (selection_data != NULL, NULL); @@ -1212,13 +1238,36 @@ gtk_selection_data_get_data (GtkSelectionData *selection_data) * Since: 2.14 */ gint -gtk_selection_data_get_length (GtkSelectionData *selection_data) +gtk_selection_data_get_length (const GtkSelectionData *selection_data) { g_return_val_if_fail (selection_data != NULL, -1); return selection_data->length; } +/** + * gtk_selection_data_get_data_with_length: + * @selection_data: a pointer to a #GtkSelectionData structure + * @length: (out): return location for length of the data segment + * + * Retrieves the raw data of the selection along with its length. + * + * Returns: (array length=length): the raw data of the selection + * + * Rename to: gtk_selection_data_get_data + * Since: 3.0 + */ +const guchar* +gtk_selection_data_get_data_with_length (const GtkSelectionData *selection_data, + gint *length) +{ + g_return_val_if_fail (selection_data != NULL, NULL); + + *length = selection_data->length; + + return selection_data->data; +} + /** * gtk_selection_data_get_display: * @selection_data: a pointer to a #GtkSelectionData structure. @@ -1230,7 +1279,7 @@ gtk_selection_data_get_length (GtkSelectionData *selection_data) * Since: 2.14 **/ GdkDisplay * -gtk_selection_data_get_display (GtkSelectionData *selection_data) +gtk_selection_data_get_display (const GtkSelectionData *selection_data) { g_return_val_if_fail (selection_data != NULL, NULL); @@ -1242,7 +1291,7 @@ gtk_selection_data_get_display (GtkSelectionData *selection_data) * @selection_data: a pointer to a #GtkSelectionData structure. * @type: the type of selection data * @format: format (number of bits in a unit) - * @data: pointer to the data (will be copied) + * @data: (array length=length): pointer to the data (will be copied) * @length: length of the data * * Stores new data into a #GtkSelectionData object. Should @@ -1315,18 +1364,22 @@ selection_set_compound_text (GtkSelectionData *selection_data, gint format; gint new_length; gboolean result = FALSE; - - tmp = g_strndup (str, len); - if (gdk_utf8_to_compound_text_for_display (selection_data->display, tmp, - &encoding, &format, &text, &new_length)) + +#ifdef GDK_WINDOWING_X11 + if (GDK_IS_X11_DISPLAY (selection_data->display)) { - gtk_selection_data_set (selection_data, encoding, format, text, new_length); - gdk_free_compound_text (text); - - result = TRUE; - } + tmp = g_strndup (str, len); + if (gdk_x11_display_utf8_to_compound_text (selection_data->display, tmp, + &encoding, &format, &text, &new_length)) + { + gtk_selection_data_set (selection_data, encoding, format, text, new_length); + gdk_x11_free_compound_text (text); - g_free (tmp); + result = TRUE; + } + g_free (tmp); + } +#endif return result; } @@ -1433,7 +1486,7 @@ selection_set_text_plain (GtkSelectionData *selection_data, } static guchar * -selection_get_text_plain (GtkSelectionData *selection_data) +selection_get_text_plain (const GtkSelectionData *selection_data) { const gchar *charset = NULL; gchar *str, *result; @@ -1540,13 +1593,13 @@ gtk_selection_data_set_text (GtkSelectionData *selection_data, * * Gets the contents of the selection data as a UTF-8 string. * - * Return value: if the selection data contained a recognized - * text type and it could be converted to UTF-8, a newly allocated - * string containing the converted text, otherwise %NULL. + * Return value: (type utf8): if the selection data contained a + * recognized text type and it could be converted to UTF-8, a newly + * allocated string containing the converted text, otherwise %NULL. * If the result is non-%NULL it must be freed with g_free(). **/ guchar * -gtk_selection_data_get_text (GtkSelectionData *selection_data) +gtk_selection_data_get_text (const GtkSelectionData *selection_data) { guchar *result = NULL; @@ -1666,7 +1719,7 @@ gtk_selection_data_set_pixbuf (GtkSelectionData *selection_data, * Since: 2.6 **/ GdkPixbuf * -gtk_selection_data_get_pixbuf (GtkSelectionData *selection_data) +gtk_selection_data_get_pixbuf (const GtkSelectionData *selection_data) { GdkPixbufLoader *loader; GdkPixbuf *result = NULL; @@ -1696,7 +1749,8 @@ gtk_selection_data_get_pixbuf (GtkSelectionData *selection_data) /** * gtk_selection_data_set_uris: * @selection_data: a #GtkSelectionData - * @uris: a %NULL-terminated array of strings holding URIs + * @uris: (array zero-terminated=1): 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 @@ -1765,7 +1819,7 @@ gtk_selection_data_set_uris (GtkSelectionData *selection_data, * Since: 2.6 **/ gchar ** -gtk_selection_data_get_uris (GtkSelectionData *selection_data) +gtk_selection_data_get_uris (const GtkSelectionData *selection_data) { gchar **result = NULL; @@ -1796,8 +1850,9 @@ gtk_selection_data_get_uris (GtkSelectionData *selection_data) /** * gtk_selection_data_get_targets: * @selection_data: a #GtkSelectionData object - * @targets: location to store an array of targets. The result - * stored here must be freed with g_free(). + * @targets: (out) (array length=n_atoms) (transfer container): + * location to store an array of targets. The result stored + * here must be freed with g_free(). * @n_atoms: location to store number of items in @targets. * * Gets the contents of @selection_data as an array of targets. @@ -1809,9 +1864,9 @@ gtk_selection_data_get_uris (GtkSelectionData *selection_data) * array of targets, otherwise %FALSE. **/ gboolean -gtk_selection_data_get_targets (GtkSelectionData *selection_data, - GdkAtom **targets, - gint *n_atoms) +gtk_selection_data_get_targets (const GtkSelectionData *selection_data, + GdkAtom **targets, + gint *n_atoms) { g_return_val_if_fail (selection_data != NULL, FALSE); @@ -1839,7 +1894,7 @@ gtk_selection_data_get_targets (GtkSelectionData *selection_data, /** * gtk_targets_include_text: - * @targets: an array of #GdkAtoms + * @targets: (array length=n_targets): an array of #GdkAtoms * @n_targets: the length of @targets * * Determines if any of the targets in @targets can be used to @@ -1884,7 +1939,7 @@ gtk_targets_include_text (GdkAtom *targets, /** * gtk_targets_include_rich_text: - * @targets: an array of #GdkAtoms + * @targets: (array length=n_targets): an array of #GdkAtoms * @n_targets: the length of @targets * @buffer: a #GtkTextBuffer * @@ -1944,7 +1999,7 @@ gtk_targets_include_rich_text (GdkAtom *targets, * and a suitable target for text is included, otherwise %FALSE. **/ gboolean -gtk_selection_data_targets_include_text (GtkSelectionData *selection_data) +gtk_selection_data_targets_include_text (const GtkSelectionData *selection_data) { GdkAtom *targets; gint n_targets; @@ -1979,8 +2034,8 @@ gtk_selection_data_targets_include_text (GtkSelectionData *selection_data) * Since: 2.10 **/ gboolean -gtk_selection_data_targets_include_rich_text (GtkSelectionData *selection_data, - GtkTextBuffer *buffer) +gtk_selection_data_targets_include_rich_text (const GtkSelectionData *selection_data, + GtkTextBuffer *buffer) { GdkAtom *targets; gint n_targets; @@ -2002,7 +2057,7 @@ gtk_selection_data_targets_include_rich_text (GtkSelectionData *selection_data, /** * gtk_targets_include_image: - * @targets: an array of #GdkAtoms + * @targets: (array length=n_targets): an array of #GdkAtoms * @n_targets: the length of @targets * @writable: whether to accept only targets for which GTK+ knows * how to convert a pixbuf into the format @@ -2062,8 +2117,8 @@ gtk_targets_include_image (GdkAtom *targets, * Since: 2.6 **/ gboolean -gtk_selection_data_targets_include_image (GtkSelectionData *selection_data, - gboolean writable) +gtk_selection_data_targets_include_image (const GtkSelectionData *selection_data, + gboolean writable) { GdkAtom *targets; gint n_targets; @@ -2084,7 +2139,7 @@ gtk_selection_data_targets_include_image (GtkSelectionData *selection_data, /** * gtk_targets_include_uri: - * @targets: an array of #GdkAtoms + * @targets: (array length=n_targets): an array of #GdkAtoms * @n_targets: the length of @targets * * Determines if any of the targets in @targets can be used to @@ -2135,7 +2190,7 @@ gtk_targets_include_uri (GdkAtom *targets, * Since: 2.10 **/ gboolean -gtk_selection_data_targets_include_uri (GtkSelectionData *selection_data) +gtk_selection_data_targets_include_uri (const GtkSelectionData *selection_data) { GdkAtom *targets; gint n_targets; @@ -2263,20 +2318,12 @@ _gtk_selection_request (GtkWidget *widget, info = g_slice_new (GtkIncrInfo); g_object_ref (widget); - + info->selection = event->selection; info->num_incrs = 0; - - /* Create GdkWindow structure for the requestor */ - - info->requestor = gdk_window_lookup_for_display (display, - event->requestor); - if (!info->requestor) - info->requestor = gdk_window_foreign_new_for_display (display, - event->requestor); - + info->requestor = g_object_ref (event->requestor); + /* Determine conversions we need to perform */ - if (event->target == gtk_selection_atoms[MULTIPLE]) { GdkAtom type; @@ -2567,7 +2614,7 @@ _gtk_selection_incr_event (GdkWindow *window, #ifdef DEBUG_SELECTION g_message ("INCR: put %d bytes (offset = %d) into window 0x%lx , property %ld", num_bytes, info->conversions[i].offset, - GDK_WINDOW_XWINDOW(info->requestor), event->atom); + GDK_WINDOW_XID(info->requestor), event->atom); #endif bytes_per_item = gtk_selection_bytes_per_item (info->conversions[i].data.format); @@ -3081,7 +3128,7 @@ gtk_selection_default_handler (GtkWidget *widget, * Return value: a pointer to a copy of @data. **/ GtkSelectionData* -gtk_selection_data_copy (GtkSelectionData *data) +gtk_selection_data_copy (const GtkSelectionData *data) { GtkSelectionData *new_data; @@ -3132,7 +3179,7 @@ gtk_target_entry_new (const char *target, guint flags, guint info) { - GtkTargetEntry entry = { target, flags, info }; + GtkTargetEntry entry = { (char *) target, flags, info }; return gtk_target_entry_copy (&entry); }