diff options
30 files changed, 2 insertions, 2117 deletions
diff --git a/docs/reference/gdk/gdk4-sections.txt b/docs/reference/gdk/gdk4-sections.txt index f4a40d8991..7036a0717f 100644 --- a/docs/reference/gdk/gdk4-sections.txt +++ b/docs/reference/gdk/gdk4-sections.txt @@ -425,10 +425,6 @@ GDK_SELECTION_TYPE_INTEGER GDK_SELECTION_TYPE_PIXMAP GDK_SELECTION_TYPE_WINDOW GDK_SELECTION_TYPE_STRING -gdk_selection_convert -gdk_selection_property_get -gdk_selection_send_notify -gdk_selection_send_notify_for_display </SECTION> <SECTION> @@ -763,7 +759,6 @@ GdkEventCrossing GdkEventFocus GdkEventConfigure GdkEventProperty -GdkEventSelection GdkEventDND GdkEventProximity GdkEventWindowState diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt index de57bc1c30..81bcf7a8ad 100644 --- a/docs/reference/gtk/gtk4-sections.txt +++ b/docs/reference/gtk/gtk4-sections.txt @@ -5185,7 +5185,6 @@ gtk_css_section_get_type <FILE>gtkselection</FILE> <TITLE>Selections</TITLE> GtkSelectionData -gtk_selection_convert gtk_selection_data_set gtk_selection_data_set_text gtk_selection_data_get_text @@ -5212,12 +5211,10 @@ gtk_selection_data_get_target gtk_targets_include_image gtk_targets_include_text gtk_targets_include_uri -gtk_selection_remove_all gtk_selection_data_copy gtk_selection_data_free <SUBSECTION Standard> GTK_TYPE_SELECTION_DATA -GTK_TYPE_TARGET_LIST <SUBSECTION Private> gtk_selection_data_get_type </SECTION> diff --git a/gdk/broadway/gdkdisplay-broadway.c b/gdk/broadway/gdkdisplay-broadway.c index f3335beac9..43330d6128 100644 --- a/gdk/broadway/gdkdisplay-broadway.c +++ b/gdk/broadway/gdkdisplay-broadway.c @@ -573,9 +573,6 @@ gdk_broadway_display_class_init (GdkBroadwayDisplayClass * class) display_class->notify_startup_complete = gdk_broadway_display_notify_startup_complete; display_class->create_window_impl = _gdk_broadway_display_create_window_impl; display_class->get_keymap = _gdk_broadway_display_get_keymap; - display_class->send_selection_notify = _gdk_broadway_display_send_selection_notify; - display_class->get_selection_property = _gdk_broadway_display_get_selection_property; - display_class->convert_selection = _gdk_broadway_display_convert_selection; display_class->text_property_to_utf8_list = _gdk_broadway_display_text_property_to_utf8_list; display_class->utf8_to_string_target = _gdk_broadway_display_utf8_to_string_target; diff --git a/gdk/broadway/gdkprivate-broadway.h b/gdk/broadway/gdkprivate-broadway.h index 5639ad0520..3cdc55e928 100644 --- a/gdk/broadway/gdkprivate-broadway.h +++ b/gdk/broadway/gdkprivate-broadway.h @@ -123,22 +123,6 @@ void _gdk_broadway_display_create_window_impl (GdkDisplay *display, GdkWindow *real_parent, GdkEventMask event_mask, GdkWindowAttr *attributes); -gint _gdk_broadway_display_get_selection_property (GdkDisplay *display, - GdkWindow *requestor, - guchar **data, - GdkAtom *ret_type, - gint *ret_format); -void _gdk_broadway_display_send_selection_notify (GdkDisplay *display, - GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - GdkAtom property, - guint32 time); -void _gdk_broadway_display_convert_selection (GdkDisplay *display, - GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - guint32 time); gint _gdk_broadway_display_text_property_to_utf8_list (GdkDisplay *display, GdkAtom encoding, gint format, diff --git a/gdk/broadway/gdkselection-broadway.c b/gdk/broadway/gdkselection-broadway.c index 843c8a8778..9c5a4ab81f 100644 --- a/gdk/broadway/gdkselection-broadway.c +++ b/gdk/broadway/gdkselection-broadway.c @@ -33,49 +33,6 @@ #include <string.h> -void -_gdk_broadway_display_convert_selection (GdkDisplay *display, - GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - guint32 time) -{ - g_warning ("convert_selection not implemented"); -} - -gint -_gdk_broadway_display_get_selection_property (GdkDisplay *display, - GdkWindow *requestor, - guchar **data, - GdkAtom *ret_type, - gint *ret_format) -{ - if (ret_type) - *ret_type = NULL; - if (ret_format) - *ret_format = 0; - if (data) - *data = NULL; - - g_warning ("get_selection_property not implemented"); - - return 0; -} - -void -_gdk_broadway_display_send_selection_notify (GdkDisplay *display, - GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - GdkAtom property, - guint32 time) -{ - g_return_if_fail (GDK_IS_DISPLAY (display)); - - g_warning ("send_selection_notify not implemented"); -} - - static gint make_list (const gchar *text, gint length, diff --git a/gdk/gdkdisplayprivate.h b/gdk/gdkdisplayprivate.h index 3dd13a82d7..df181e0946 100644 --- a/gdk/gdkdisplayprivate.h +++ b/gdk/gdkdisplayprivate.h @@ -167,23 +167,6 @@ struct _GdkDisplayClass GdkKeymap * (*get_keymap) (GdkDisplay *display); - void (*send_selection_notify) (GdkDisplay *dispay, - GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - GdkAtom property, - guint32 time); - gint (*get_selection_property) (GdkDisplay *display, - GdkWindow *requestor, - guchar **data, - GdkAtom *type, - gint *format); - void (*convert_selection) (GdkDisplay *display, - GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - guint32 time); - gint (*text_property_to_utf8_list) (GdkDisplay *display, GdkAtom encoding, gint format, diff --git a/gdk/gdkdnd.c b/gdk/gdkdnd.c index 2344b7ee65..2b5d40cb12 100644 --- a/gdk/gdkdnd.c +++ b/gdk/gdkdnd.c @@ -1032,7 +1032,6 @@ gboolean gdk_drag_context_handle_dest_event (GdkEvent *event) { GdkDragContext *context = NULL; - GList *l; switch ((guint) event->type) { @@ -1040,19 +1039,6 @@ gdk_drag_context_handle_dest_event (GdkEvent *event) case GDK_DROP_START: context = event->dnd.context; break; - case GDK_SELECTION_NOTIFY: - for (l = contexts; l; l = l->next) - { - GdkDragContext *c = l->data; - - if (!c->is_source && - event->selection.selection == gdk_drag_get_selection (c)) - { - context = c; - break; - } - } - break; default: return FALSE; } diff --git a/gdk/gdkevents.c b/gdk/gdkevents.c index 624c1d2f37..6afaf6c4ce 100644 --- a/gdk/gdkevents.c +++ b/gdk/gdkevents.c @@ -587,12 +587,6 @@ gdk_event_copy (const GdkEvent *event) sizeof (gdouble) * gdk_device_get_n_axes (event->motion.device)); break; - case GDK_SELECTION_NOTIFY: - new_event->selection.requestor = event->selection.requestor; - if (new_event->selection.requestor) - g_object_ref (new_event->selection.requestor); - break; - default: break; } @@ -673,11 +667,6 @@ gdk_event_free (GdkEvent *event) g_free (event->motion.axes); break; - case GDK_SELECTION_NOTIFY: - if (event->selection.requestor) - g_object_unref (event->selection.requestor); - break; - default: break; } @@ -750,8 +739,6 @@ gdk_event_get_time (const GdkEvent *event) return event->crossing.time; case GDK_PROPERTY_NOTIFY: return event->property.time; - case GDK_SELECTION_NOTIFY: - return event->selection.time; case GDK_PROXIMITY_IN: case GDK_PROXIMITY_OUT: return event->proximity.time; @@ -846,7 +833,6 @@ gdk_event_get_state (const GdkEvent *event, case GDK_CLIENT_EVENT: case GDK_CONFIGURE: case GDK_FOCUS_CHANGE: - case GDK_SELECTION_NOTIFY: case GDK_PROXIMITY_IN: case GDK_PROXIMITY_OUT: case GDK_DAMAGE: @@ -2699,72 +2685,6 @@ gdk_event_get_property (const GdkEvent *event, } /** - * gdk_event_get_selection: - * @event: a #GdkEvent - * @selection: (out): - * - * Returns: %TRUE on success, otherwise %FALSE - **/ -gboolean -gdk_event_get_selection (const GdkEvent *event, - GdkAtom *selection) -{ - if (!event) - return FALSE; - - if (event->type == GDK_SELECTION_NOTIFY) - { - *selection = event->selection.selection; - return TRUE; - } - - return FALSE; -} - -/** - * gdk_event_get_selection_property: - * @event: a #GdkEvent - * @property: (out) (optional): - * @target: (out) (optional): - * @requestor: (out) (optional) (transfer none): - * - * Returns: %TRUE on success, otherwise %FALSE - **/ -gboolean -gdk_event_get_selection_property (const GdkEvent *event, - GdkAtom *property, - GdkAtom *target, - GdkWindow **requestor) -{ - if (!event) - return FALSE; - - if (event->type == GDK_SELECTION_NOTIFY) - { - if (property) - *property = event->selection.property; - if (target) - *target = event->selection.target; - if (requestor) - *requestor = event->selection.requestor; - return TRUE; - } - - return FALSE; -} - -void -gdk_event_set_selection (GdkEvent *event, - GdkWindow *window, - GdkAtom selection, - guint32 time) -{ - event->selection.window = g_object_ref (window); - event->selection.selection = selection; - event->selection.time = time; -} - -/** * gdk_event_get_axes: * @event: a #GdkEvent * @axes: (transfer none) (out) (array length=n_axes): the array of values for all axes diff --git a/gdk/gdkevents.h b/gdk/gdkevents.h index f2893cc5d3..88e19809da 100644 --- a/gdk/gdkevents.h +++ b/gdk/gdkevents.h @@ -132,7 +132,6 @@ typedef struct _GdkEventFocus GdkEventFocus; typedef struct _GdkEventCrossing GdkEventCrossing; typedef struct _GdkEventConfigure GdkEventConfigure; typedef struct _GdkEventProperty GdkEventProperty; -typedef struct _GdkEventSelection GdkEventSelection; typedef struct _GdkEventOwnerChange GdkEventOwnerChange; typedef struct _GdkEventProximity GdkEventProximity; typedef struct _GdkEventDND GdkEventDND; @@ -233,9 +232,6 @@ typedef GdkFilterReturn (*GdkFilterFunc) (GdkXEvent *xevent, * @GDK_MAP: the window has been mapped. * @GDK_UNMAP: the window has been unmapped. * @GDK_PROPERTY_NOTIFY: a property on the window has been changed or deleted. - * @GDK_SELECTION_CLEAR: the application has lost ownership of a selection. - * @GDK_SELECTION_REQUEST: another application has requested a selection. - * @GDK_SELECTION_NOTIFY: a selection has been received. * @GDK_PROXIMITY_IN: an input device has moved into contact with a sensing * surface (e.g. a touchscreen or graphics tablet). * @GDK_PROXIMITY_OUT: an input device has moved out of contact with a sensing @@ -304,7 +300,6 @@ typedef enum GDK_MAP = 14, GDK_UNMAP = 15, GDK_PROPERTY_NOTIFY = 16, - GDK_SELECTION_NOTIFY = 19, GDK_PROXIMITY_IN = 20, GDK_PROXIMITY_OUT = 21, GDK_DRAG_ENTER = 22, @@ -715,19 +710,6 @@ gboolean gdk_event_get_property (const GdkEvent *event, GdkAtom *property, GdkPropertyState *state); GDK_AVAILABLE_IN_3_92 -gboolean gdk_event_get_selection (const GdkEvent *event, - GdkAtom *selection); -GDK_AVAILABLE_IN_3_92 -gboolean gdk_event_get_selection_property (const GdkEvent *event, - GdkAtom *property, - GdkAtom *target, - GdkWindow **requestor); -GDK_AVAILABLE_IN_3_92 -void gdk_event_set_selection (GdkEvent *event, - GdkWindow *window, - GdkAtom selection, - guint32 time); -GDK_AVAILABLE_IN_3_92 gboolean gdk_event_get_axes (GdkEvent *event, gdouble **axes, guint *n_axes); diff --git a/gdk/gdkeventsprivate.h b/gdk/gdkeventsprivate.h index bf57607182..6681fe3743 100644 --- a/gdk/gdkeventsprivate.h +++ b/gdk/gdkeventsprivate.h @@ -405,32 +405,6 @@ struct _GdkEventProperty }; /** - * GdkEventSelection: - * @type: the type of the event (%GDK_SELECTION_NOTIFY). - * @window: the window which received the event. - * @send_event: %TRUE if the event was sent explicitly. - * @selection: the selection. - * @target: the target to which the selection should be converted. - * @property: the property in which to place the result of the conversion. - * @time: the time of the event in milliseconds. - * @requestor: the window on which to place @property or %NULL if none. - * - * Generated when a selection is requested or ownership of a selection - * is taken over by another client application. - */ -struct _GdkEventSelection -{ - GdkEventType type; - GdkWindow *window; - gint8 send_event; - GdkAtom selection; - GdkAtom target; - GdkAtom property; - guint32 time; - GdkWindow *requestor; -}; - -/** * GdkEventProximity: * @type: the type of the event (%GDK_PROXIMITY_IN or %GDK_PROXIMITY_OUT). * @window: the window which received the event. @@ -708,7 +682,6 @@ struct _GdkEventPadGroupMode { * @focus_change: a #GdkEventFocus * @configure: a #GdkEventConfigure * @property: a #GdkEventProperty - * @selection: a #GdkEventSelection * @proximity: a #GdkEventProximity * @dnd: a #GdkEventDND * @window_state: a #GdkEventWindowState @@ -764,7 +737,6 @@ union _GdkEvent GdkEventFocus focus_change; GdkEventConfigure configure; GdkEventProperty property; - GdkEventSelection selection; GdkEventProximity proximity; GdkEventDND dnd; GdkEventWindowState window_state; diff --git a/gdk/gdkselection.c b/gdk/gdkselection.c index 76c5f19fc4..09e495083f 100644 --- a/gdk/gdkselection.c +++ b/gdk/gdkselection.c @@ -61,110 +61,6 @@ */ /** - * gdk_selection_send_notify: - * @requestor: window to which to deliver response. - * @selection: selection that was requested. - * @target: target that was selected. - * @property: property in which the selection owner stored the - * data, or %NULL to indicate that the request - * was rejected. - * @time_: timestamp. - * - * Sends a response to SelectionRequest event. - */ -void -gdk_selection_send_notify (GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - GdkAtom property, - guint32 time) -{ - gdk_selection_send_notify_for_display (gdk_window_get_display (requestor), - requestor, selection, - target, property, time); -} - -/** - * gdk_selection_send_notify_for_display: - * @display: the #GdkDisplay where @requestor is realized - * @requestor: window to which to deliver response - * @selection: selection that was requested - * @target: target that was selected - * @property: property in which the selection owner stored the data, - * or %NULL to indicate that the request was rejected - * @time_: timestamp - * - * Send a response to SelectionRequest event. - * - * Since: 2.2 - */ -void -gdk_selection_send_notify_for_display (GdkDisplay *display, - GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - GdkAtom property, - guint32 time_) -{ - g_return_if_fail (GDK_IS_DISPLAY (display)); - - GDK_DISPLAY_GET_CLASS (display) - ->send_selection_notify (display, requestor, selection,target, property, time_); -} - -/** - * gdk_selection_property_get: (skip) - * @requestor: the window on which the data is stored - * @data: location to store a pointer to the retrieved data. - If the retrieval failed, %NULL we be stored here, otherwise, it - will be non-%NULL and the returned data should be freed with g_free() - when you are finished using it. The length of the - allocated memory is one more than the length - of the returned data, and the final byte will always - be zero, to ensure nul-termination of strings - * @prop_type: location to store the type of the property - * @prop_format: location to store the format of the property - * - * Retrieves selection data that was stored by the selection - * data in response to a call to gdk_selection_convert(). This function - * will not be used by applications, who should use the #GtkClipboard - * API instead. - * - * Returns: the length of the retrieved data. - */ -gint -gdk_selection_property_get (GdkWindow *requestor, - guchar **data, - GdkAtom *ret_type, - gint *ret_format) -{ - GdkDisplay *display; - - g_return_val_if_fail (GDK_IS_WINDOW (requestor), 0); - - display = gdk_window_get_display (requestor); - - return GDK_DISPLAY_GET_CLASS (display) - ->get_selection_property (display, requestor, data, ret_type, ret_format); -} - -void -gdk_selection_convert (GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - guint32 time) -{ - GdkDisplay *display; - - g_return_if_fail (selection != NULL); - - display = gdk_window_get_display (requestor); - - GDK_DISPLAY_GET_CLASS (display) - ->convert_selection (display, requestor, selection, target, time); -} - -/** * gdk_text_property_to_utf8_list_for_display: * @display: a #GdkDisplay * @encoding: an atom representing the encoding of the text diff --git a/gdk/gdkselection.h b/gdk/gdkselection.h index 7d6e7d9443..5728f92f13 100644 --- a/gdk/gdkselection.h +++ b/gdk/gdkselection.h @@ -152,46 +152,6 @@ G_BEGIN_DECLS /* Selections */ -/** - * gdk_selection_convert: - * @requestor: a #GdkWindow. - * @selection: an atom identifying the selection to get the - * contents of. - * @target: the form in which to retrieve the selection. - * @time_: the timestamp to use when retrieving the - * selection. The selection owner may refuse the - * request if it did not own the selection at - * the time indicated by the timestamp. - * - * Retrieves the contents of a selection in a given - * form. - */ -GDK_AVAILABLE_IN_ALL -void gdk_selection_convert (GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - guint32 time_); -GDK_AVAILABLE_IN_ALL -gint gdk_selection_property_get (GdkWindow *requestor, - guchar **data, - GdkAtom *prop_type, - gint *prop_format); - -GDK_AVAILABLE_IN_ALL -void gdk_selection_send_notify (GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - GdkAtom property, - guint32 time_); - -GDK_AVAILABLE_IN_ALL -void gdk_selection_send_notify_for_display (GdkDisplay *display, - GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - GdkAtom property, - guint32 time_); - G_END_DECLS #endif /* __GDK_SELECTION_H__ */ diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index 89202ad087..8acc87d3c7 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -5468,10 +5468,6 @@ _gdk_make_event (GdkWindow *window, event->property.state = the_state; break; - case GDK_SELECTION_NOTIFY: - event->selection.time = the_time; - break; - case GDK_PROXIMITY_IN: case GDK_PROXIMITY_OUT: event->proximity.time = the_time; diff --git a/gdk/mir/gdkmirdisplay.c b/gdk/mir/gdkmirdisplay.c index f98b1e062b..09b71bcc8c 100644 --- a/gdk/mir/gdkmirdisplay.c +++ b/gdk/mir/gdkmirdisplay.c @@ -496,327 +496,6 @@ gdk_mir_display_pop_error_trap (GdkDisplay *display, return 0; } -static void -gdk_mir_display_send_selection_notify (GdkDisplay *display, - GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - GdkAtom property, - guint32 time) -{ -} - -static gint -gdk_mir_display_get_selection_property (GdkDisplay *display, - GdkWindow *requestor, - guchar **data, - GdkAtom *ret_type, - gint *ret_format) -{ - gint length; - - gdk_property_get (requestor, - gdk_atom_intern_static_string ("GDK_SELECTION"), - NULL, - 0, - G_MAXULONG, - FALSE, - ret_type, - ret_format, - &length, - data); - - return length; -} - -static gint -get_format_score (const gchar *format, - GdkAtom target, - GdkAtom *out_type, - gint *out_size) -{ - const gchar *target_string; - GdkAtom dummy_type; - gint dummy_size; - - target_string = _gdk_atom_name_const (target); - - if (!out_type) - out_type = &dummy_type; - - if (!out_size) - out_size = &dummy_size; - - if (!g_ascii_strcasecmp (format, target_string)) - { - *out_type = GDK_SELECTION_TYPE_STRING; - *out_size = sizeof (guchar); - - return G_MAXINT; - } - - if (target == gdk_atom_intern_static_string ("UTF8_STRING")) - return get_format_score (format, gdk_atom_intern_static_string ("text/plain;charset=utf-8"), out_type, out_size); - - /* TODO: use best media type for COMPOUND_TEXT target */ - if (target == gdk_atom_intern_static_string ("COMPOUND_TEXT")) - return get_format_score (format, gdk_atom_intern_static_string ("text/plain;charset=utf-8"), out_type, out_size); - - if (target == GDK_TARGET_STRING) - return get_format_score (format, gdk_atom_intern_static_string ("text/plain;charset=iso-8859-1"), out_type, out_size); - - if (target == gdk_atom_intern_static_string ("GTK_TEXT_BUFFER_CONTENTS")) - return get_format_score (format, gdk_atom_intern_static_string ("text/plain;charset=utf-8"), out_type, out_size); - - if (g_content_type_is_a (format, target_string)) - { - *out_type = GDK_SELECTION_TYPE_STRING; - *out_size = sizeof (guchar); - - return 2; - } - - if (g_content_type_is_a (target_string, format)) - { - *out_type = GDK_SELECTION_TYPE_STRING; - *out_size = sizeof (guchar); - - return 1; - } - - return 0; -} - -static gint -get_best_format_index (const gchar * const *formats, - guint n_formats, - GdkAtom target, - GdkAtom *out_type, - gint *out_size) -{ - gint best_i = -1; - gint best_score = 0; - GdkAtom best_type; - gint best_size; - gint score; - GdkAtom type; - gint size; - gint i; - - if (!out_type) - out_type = &best_type; - - if (!out_size) - out_size = &best_size; - - *out_type = NULL; - *out_size = 0; - - for (i = 0; i < n_formats; i++) - { - score = get_format_score (formats[i], target, &type, &size); - - if (score > best_score) - { - best_i = i; - best_score = score; - *out_type = type; - *out_size = size; - } - } - - return best_i; -} - -static void -gdk_mir_display_real_convert_selection (GdkDisplay *display, - GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - guint32 time) -{ - GdkMirDisplay *mir_display = GDK_MIR_DISPLAY (display); - const gchar *paste_data; - gsize paste_size; - const gint *paste_header; - GPtrArray *paste_formats; - GArray *paste_targets; - GdkAtom paste_target; - GdkEvent *event; - gint best_i; - GdkAtom best_type; - gint best_size; - gint i; - - g_return_if_fail (mir_display->paste_data); - - paste_data = g_variant_get_fixed_array (mir_display->paste_data, &paste_size, sizeof (guchar)); - paste_header = (const gint *) paste_data; - - if (paste_data) - { - paste_formats = g_ptr_array_new_full (paste_header[0], g_free); - - for (i = 0; i < paste_header[0]; i++) - g_ptr_array_add (paste_formats, g_strndup (paste_data + paste_header[1 + 4 * i], paste_header[2 + 4 * i])); - } - else - paste_formats = g_ptr_array_new_with_free_func (g_free); - - if (target == gdk_atom_intern_static_string ("TARGETS")) - { - paste_targets = g_array_sized_new (TRUE, FALSE, sizeof (GdkAtom), paste_formats->len); - - for (i = 0; i < paste_formats->len; i++) - { - paste_target = gdk_atom_intern (g_ptr_array_index (paste_formats, i), FALSE); - g_array_append_val (paste_targets, paste_target); - } - - gdk_property_change (requestor, - gdk_atom_intern_static_string ("GDK_SELECTION"), - GDK_SELECTION_TYPE_ATOM, - 8 * sizeof (GdkAtom), - GDK_PROP_MODE_REPLACE, - (const guchar *) paste_targets->data, - paste_targets->len); - - g_array_unref (paste_targets); - - event = gdk_event_new (GDK_SELECTION_NOTIFY); - event->selection.window = g_object_ref (requestor); - event->selection.send_event = FALSE; - event->selection.selection = selection; - event->selection.target = target; - event->selection.property = gdk_atom_intern_static_string ("GDK_SELECTION"); - event->selection.time = time; - event->selection.requestor = g_object_ref (requestor); - - gdk_event_put (event); - gdk_event_free (event); - } - else - { - best_i = get_best_format_index ((const gchar * const *) paste_formats->pdata, - paste_formats->len, - target, - &best_type, - &best_size); - - if (best_i >= 0) - { - gdk_property_change (requestor, - gdk_atom_intern_static_string ("GDK_SELECTION"), - best_type, - 8 * best_size, - GDK_PROP_MODE_REPLACE, - (const guchar *) paste_data + paste_header[3 + 4 * best_i], - paste_header[4 + 4 * best_i] / best_size); - - event = gdk_event_new (GDK_SELECTION_NOTIFY); - event->selection.window = g_object_ref (requestor); - event->selection.send_event = FALSE; - event->selection.selection = selection; - event->selection.target = target; - event->selection.property = gdk_atom_intern_static_string ("GDK_SELECTION"); - event->selection.time = time; - event->selection.requestor = g_object_ref (requestor); - - gdk_event_put (event); - gdk_event_free (event); - } - } - - g_ptr_array_unref (paste_formats); -} - -typedef struct -{ - GdkDisplay *display; - GdkWindow *requestor; - GdkAtom selection; - GdkAtom target; - guint32 time; -} ConvertInfo; - -static void -paste_data_ready_cb (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - ContentHubService *content_service = CONTENT_HUB_SERVICE (source_object); - ConvertInfo *info = user_data; - GdkMirDisplay *mir_display = GDK_MIR_DISPLAY (info->display); - gboolean result; - - g_clear_pointer (&mir_display->paste_data, g_variant_unref); - - result = content_hub_service_call_get_latest_paste_data_finish (content_service, - &mir_display->paste_data, - res, - NULL); - - if (result) - gdk_mir_display_real_convert_selection (info->display, - info->requestor, - info->selection, - info->target, - info->time); - - g_object_unref (info->requestor); - g_object_unref (info->display); - g_free (info); -} - -static void -gdk_mir_display_convert_selection (GdkDisplay *display, - GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - guint32 time) -{ - GdkMirDisplay *mir_display = GDK_MIR_DISPLAY (display); - MirWindow *mir_window; - MirWindowId *mir_window_id; - ConvertInfo *info; - - if (selection != GDK_SELECTION_CLIPBOARD) - return; - else if (mir_display->paste_data) - gdk_mir_display_real_convert_selection (display, requestor, selection, target, time); - else if (mir_display->focused_window) - { - mir_window = _gdk_mir_window_get_mir_window (mir_display->focused_window); - - if (!mir_window) - return; - - mir_window_id = mir_window_request_window_id_sync (mir_window); - - if (!mir_window_id) - return; - - if (mir_window_id_is_valid (mir_window_id)) - { - info = g_new (ConvertInfo, 1); - info->display = g_object_ref (display); - info->requestor = g_object_ref (requestor); - info->selection = selection; - info->target = target; - info->time = time; - - content_hub_service_call_get_latest_paste_data ( - mir_display->content_service, - mir_window_id_as_string (mir_window_id), - NULL, - paste_data_ready_cb, - info); - } - - mir_window_id_release (mir_window_id); - } -} - static gint gdk_mir_display_text_property_to_utf8_list (GdkDisplay *display, GdkAtom encoding, @@ -1176,9 +855,6 @@ gdk_mir_display_class_init (GdkMirDisplayClass *klass) display_class->get_keymap = gdk_mir_display_get_keymap; display_class->push_error_trap = gdk_mir_display_push_error_trap; display_class->pop_error_trap = gdk_mir_display_pop_error_trap; - display_class->send_selection_notify = gdk_mir_display_send_selection_notify; - display_class->get_selection_property = gdk_mir_display_get_selection_property; - display_class->convert_selection = gdk_mir_display_convert_selection; display_class->text_property_to_utf8_list = gdk_mir_display_text_property_to_utf8_list; display_class->utf8_to_string_target = gdk_mir_display_utf8_to_string_target; display_class->make_gl_context_current = gdk_mir_display_make_gl_context_current; diff --git a/gdk/quartz/gdkdisplay-quartz.c b/gdk/quartz/gdkdisplay-quartz.c index f2342aec41..8c3dddac90 100644 --- a/gdk/quartz/gdkdisplay-quartz.c +++ b/gdk/quartz/gdkdisplay-quartz.c @@ -276,8 +276,6 @@ gdk_quartz_display_class_init (GdkQuartzDisplayClass *class) display_class->event_data_free = _gdk_quartz_display_event_data_free; display_class->create_window_impl = _gdk_quartz_display_create_window_impl; display_class->get_keymap = _gdk_quartz_display_get_keymap; - display_class->get_selection_property = _gdk_quartz_display_get_selection_property; - display_class->convert_selection = _gdk_quartz_display_convert_selection; display_class->text_property_to_utf8_list = _gdk_quartz_display_text_property_to_utf8_list; display_class->utf8_to_string_target = _gdk_quartz_display_utf8_to_string_target; display_class->get_n_monitors = gdk_quartz_display_get_n_monitors; diff --git a/gdk/quartz/gdkdisplay-quartz.h b/gdk/quartz/gdkdisplay-quartz.h index 77a222adc7..6f2ed37152 100644 --- a/gdk/quartz/gdkdisplay-quartz.h +++ b/gdk/quartz/gdkdisplay-quartz.h @@ -71,17 +71,6 @@ void _gdk_quartz_display_create_window_impl (GdkDisplay *display, /* Display methods - keymap */ GdkKeymap * _gdk_quartz_display_get_keymap (GdkDisplay *display); -/* Display methods - selection */ -gint _gdk_quartz_display_get_selection_property (GdkDisplay *display, - GdkWindow *requestor, - guchar **data, - GdkAtom *ret_type, - gint *ret_format); -void _gdk_quartz_display_convert_selection (GdkDisplay *display, - GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - guint32 time); gint _gdk_quartz_display_text_property_to_utf8_list (GdkDisplay *display, GdkAtom encoding, gint format, diff --git a/gdk/quartz/gdkselection-quartz.c b/gdk/quartz/gdkselection-quartz.c index 16f3569426..5cc5f68d58 100644 --- a/gdk/quartz/gdkselection-quartz.c +++ b/gdk/quartz/gdkselection-quartz.c @@ -24,27 +24,6 @@ #include "gdkproperty.h" #include "gdkquartz.h" -void -_gdk_quartz_display_convert_selection (GdkDisplay *display, - GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - guint32 time) -{ - /* FIXME: Implement */ -} - -gint -_gdk_quartz_display_get_selection_property (GdkDisplay *display, - GdkWindow *requestor, - guchar **data, - GdkAtom *ret_type, - gint *ret_format) -{ - /* FIXME: Implement */ - return 0; -} - gchar * _gdk_quartz_display_utf8_to_string_target (GdkDisplay *display, const gchar *str) diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c index d276cf1b59..ab6a913c54 100644 --- a/gdk/wayland/gdkdisplay-wayland.c +++ b/gdk/wayland/gdkdisplay-wayland.c @@ -1019,9 +1019,6 @@ gdk_wayland_display_class_init (GdkWaylandDisplayClass *class) display_class->notify_startup_complete = gdk_wayland_display_notify_startup_complete; display_class->create_window_impl = _gdk_wayland_display_create_window_impl; display_class->get_keymap = _gdk_wayland_display_get_keymap; - display_class->send_selection_notify = _gdk_wayland_display_send_selection_notify; - display_class->get_selection_property = _gdk_wayland_display_get_selection_property; - display_class->convert_selection = _gdk_wayland_display_convert_selection; display_class->text_property_to_utf8_list = _gdk_wayland_display_text_property_to_utf8_list; display_class->utf8_to_string_target = _gdk_wayland_display_utf8_to_string_target; diff --git a/gdk/wayland/gdkselection-wayland.c b/gdk/wayland/gdkselection-wayland.c index 7d1b30ae2f..233eebbcd6 100644 --- a/gdk/wayland/gdkselection-wayland.c +++ b/gdk/wayland/gdkselection-wayland.c @@ -78,7 +78,6 @@ struct _AsyncWriteData struct _SelectionData { DataOfferData *offer; - GHashTable *buffers; /* Hashtable of target_atom->SelectionBuffer */ }; enum { @@ -100,184 +99,14 @@ struct _GdkWaylandSelection struct wl_data_source *dnd_source; /* Owned by the GdkDragContext */ }; -static void selection_buffer_read (SelectionBuffer *buffer); static void async_write_data_write (AsyncWriteData *write_data); -static void -_gdk_display_put_event (GdkDisplay *display, - GdkEvent *event) -{ - gdk_event_set_display (event, display); - gdk_display_put_event (display, event); -} - -static void -selection_buffer_notify (SelectionBuffer *buffer) -{ - GdkEvent *event; - GList *l; - - for (l = buffer->requestors; l; l = l->next) - { - event = gdk_event_new (GDK_SELECTION_NOTIFY); - event->selection.window = g_object_ref (l->data); - event->selection.send_event = FALSE; - event->selection.selection = buffer->selection; - event->selection.target = buffer->target; - event->selection.property = gdk_atom_intern_static_string ("GDK_SELECTION"); - event->selection.time = GDK_CURRENT_TIME; - event->selection.requestor = g_object_ref (l->data); - - _gdk_display_put_event (gdk_window_get_display (l->data), event); - gdk_event_free (event); - } -} - -static SelectionBuffer * -selection_buffer_new (GInputStream *stream, - GdkAtom selection, - GdkAtom target) -{ - SelectionBuffer *buffer; - - buffer = g_new0 (SelectionBuffer, 1); - buffer->stream = (stream) ? g_object_ref (stream) : NULL; - buffer->cancellable = g_cancellable_new (); - buffer->data = g_byte_array_new (); - buffer->selection = selection; - buffer->target = target; - buffer->ref_count = 1; - - if (stream) - selection_buffer_read (buffer); - - return buffer; -} - -static SelectionBuffer * -selection_buffer_ref (SelectionBuffer *buffer) -{ - buffer->ref_count++; - return buffer; -} - -static void -selection_buffer_unref (SelectionBuffer *buffer_data) -{ - buffer_data->ref_count--; - - if (buffer_data->ref_count != 0) - return; - - if (buffer_data->cancellable) - g_object_unref (buffer_data->cancellable); - - if (buffer_data->stream) - g_object_unref (buffer_data->stream); - - if (buffer_data->data) - g_byte_array_unref (buffer_data->data); - - g_free (buffer_data); -} - -static void -selection_buffer_append_data (SelectionBuffer *buffer, - gconstpointer data, - gsize len) -{ - g_byte_array_append (buffer->data, data, len); -} - -static void -selection_buffer_cancel_and_unref (SelectionBuffer *buffer_data) -{ - if (buffer_data->cancellable) - g_cancellable_cancel (buffer_data->cancellable); - - selection_buffer_unref (buffer_data); -} - -static void -selection_buffer_add_requestor (SelectionBuffer *buffer, - GdkWindow *requestor) -{ - if (!g_list_find (buffer->requestors, requestor)) - buffer->requestors = g_list_prepend (buffer->requestors, - g_object_ref (requestor)); -} - -static gboolean -selection_buffer_remove_requestor (SelectionBuffer *buffer, - GdkWindow *requestor) -{ - GList *link = g_list_find (buffer->requestors, requestor); - - if (!link) - return FALSE; - - g_object_unref (link->data); - buffer->requestors = g_list_delete_link (buffer->requestors, link); - return TRUE; -} - static inline glong get_buffer_size (void) { return sysconf (_SC_PAGESIZE); } -static void -selection_buffer_read_cb (GObject *object, - GAsyncResult *result, - gpointer user_data) -{ - SelectionBuffer *buffer = user_data; - gboolean finished = TRUE; - GError *error = NULL; - GBytes *bytes; - - bytes = g_input_stream_read_bytes_finish (buffer->stream, result, &error); - - if (bytes) - { - finished = g_bytes_get_size (bytes) < get_buffer_size (); - selection_buffer_append_data (buffer, - g_bytes_get_data (bytes, NULL), - g_bytes_get_size (bytes)); - g_bytes_unref (bytes); - } - - if (!finished) - selection_buffer_read (buffer); - else - { - if (error) - { - g_warning (G_STRLOC ": error reading selection buffer: %s", error->message); - g_error_free (error); - } - else - selection_buffer_notify (buffer); - - g_input_stream_close (buffer->stream, NULL, NULL); - g_clear_object (&buffer->stream); - g_clear_object (&buffer->cancellable); - } - - selection_buffer_unref (buffer); -} - -static void -selection_buffer_read (SelectionBuffer *buffer) -{ - selection_buffer_ref (buffer); - g_input_stream_read_bytes_async (buffer->stream, get_buffer_size(), - G_PRIORITY_DEFAULT, - buffer->cancellable, selection_buffer_read_cb, - buffer); -} - static DataOfferData * data_offer_data_new (gpointer offer, GDestroyNotify destroy_notify) @@ -304,18 +133,11 @@ GdkWaylandSelection * gdk_wayland_selection_new (void) { GdkWaylandSelection *selection; - gint i; /* init atoms */ atoms[ATOM_DND] = gdk_atom_intern_static_string ("GdkWaylandSelection"); selection = g_new0 (GdkWaylandSelection, 1); - for (i = 0; i < G_N_ELEMENTS (selection->selections); i++) - { - selection->selections[i].buffers = - g_hash_table_new_full (NULL, NULL, NULL, - (GDestroyNotify) selection_buffer_cancel_and_unref); - } selection->offers = g_hash_table_new_full (NULL, NULL, NULL, @@ -327,11 +149,6 @@ gdk_wayland_selection_new (void) void gdk_wayland_selection_free (GdkWaylandSelection *selection) { - gint i; - - for (i = 0; i < G_N_ELEMENTS (selection->selections); i++) - g_hash_table_destroy (selection->selections[i].buffers); - g_hash_table_destroy (selection->offers); g_free (selection->stored_selection.data); @@ -513,8 +330,6 @@ gdk_wayland_selection_set_offer (GdkDisplay *display, if (selection_data) { selection_data->offer = info; - /* Clear all buffers */ - g_hash_table_remove_all (selection_data->buffers); } } @@ -703,29 +518,6 @@ gdk_wayland_selection_store (GdkWindow *window, gdk_wayland_selection_check_write (selection); } -static SelectionBuffer * -gdk_wayland_selection_lookup_requestor_buffer (GdkWindow *requestor) -{ - GdkDisplay *display = gdk_window_get_display (requestor); - GdkWaylandSelection *selection = gdk_wayland_display_get_selection (display); - SelectionBuffer *buffer_data; - GHashTableIter iter; - gint i; - - for (i = 0; i < G_N_ELEMENTS (selection->selections); i++) - { - g_hash_table_iter_init (&iter, selection->selections[i].buffers); - - while (g_hash_table_iter_next (&iter, NULL, (gpointer*) &buffer_data)) - { - if (g_list_find (buffer_data->requestors, requestor)) - return buffer_data; - } - } - - return NULL; -} - static void data_source_target (void *data, struct wl_data_source *source, @@ -909,171 +701,6 @@ gdk_wayland_selection_unset_data_source (GdkDisplay *display, } } -void -_gdk_wayland_display_send_selection_notify (GdkDisplay *dispay, - GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - GdkAtom property, - guint32 time) -{ -} - -gint -_gdk_wayland_display_get_selection_property (GdkDisplay *display, - GdkWindow *requestor, - guchar **data, - GdkAtom *ret_type, - gint *ret_format) -{ - SelectionBuffer *buffer_data; - gsize len; - - buffer_data = gdk_wayland_selection_lookup_requestor_buffer (requestor); - - if (!buffer_data) - return 0; - - selection_buffer_remove_requestor (buffer_data, requestor); - len = buffer_data->data->len; - - if (data) - { - guchar *buffer; - - buffer = g_new0 (guchar, len + 1); - memcpy (buffer, buffer_data->data->data, len); - *data = buffer; - } - - if (buffer_data->target == gdk_atom_intern_static_string ("TARGETS")) - { - if (ret_type) - *ret_type = GDK_SELECTION_TYPE_ATOM; - if (ret_format) - *ret_format = 32; - } - else - { - if (ret_type) - *ret_type = buffer_data->target; - if (ret_format) - *ret_format = 8; - } - - return len; -} - -static void -emit_empty_selection_notify (GdkWindow *requestor, - GdkAtom selection, - GdkAtom target) -{ - GdkEvent *event; - - event = gdk_event_new (GDK_SELECTION_NOTIFY); - event->selection.window = g_object_ref (requestor); - event->selection.send_event = FALSE; - event->selection.selection = selection; - event->selection.target = target; - event->selection.property = NULL; - event->selection.time = GDK_CURRENT_TIME; - event->selection.requestor = g_object_ref (requestor); - - _gdk_display_put_event (gdk_window_get_display (requestor), event); - gdk_event_free (event); -} - -void -_gdk_wayland_display_convert_selection (GdkDisplay *display, - GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - guint32 time) -{ - GdkWaylandSelection *wayland_selection = gdk_wayland_display_get_selection (display); - const SelectionData *selection_data; - SelectionBuffer *buffer_data; - gpointer offer; - gchar *mimetype; - GdkContentFormats *formats; - - selection_data = selection_lookup_offer_by_atom (wayland_selection, selection); - if (!selection_data) - return; - - offer = gdk_wayland_selection_get_offer (display, selection); - formats = gdk_wayland_selection_get_targets (display, selection); - - if (!offer || target == gdk_atom_intern_static_string ("DELETE")) - { - emit_empty_selection_notify (requestor, selection, target); - return; - } - - mimetype = gdk_atom_name (target); - - if (target != gdk_atom_intern_static_string ("TARGETS")) - { - if (!gdk_content_formats_contain_mime_type (formats, GDK_ATOM_TO_POINTER (target))) - { - emit_empty_selection_notify (requestor, selection, target); - return; - } - - wl_data_offer_accept (offer, - _gdk_wayland_display_get_serial (GDK_WAYLAND_DISPLAY (display)), - mimetype); - } - - buffer_data = g_hash_table_lookup (selection_data->buffers, target); - - if (buffer_data) - selection_buffer_add_requestor (buffer_data, requestor); - else - { - GInputStream *stream = NULL; - int pipe_fd[2]; - gsize n_targets = 0; - const char * const *targets = NULL; - - if (target == gdk_atom_intern_static_string ("TARGETS")) - { - targets = gdk_content_formats_get_mime_types (formats, &n_targets); - } - else - { - g_unix_open_pipe (pipe_fd, FD_CLOEXEC, NULL); - - wl_data_offer_receive (offer, mimetype, pipe_fd[1]); - - stream = g_unix_input_stream_new (pipe_fd[0], TRUE); - close (pipe_fd[1]); - } - - buffer_data = selection_buffer_new (stream, selection, target); - selection_buffer_add_requestor (buffer_data, requestor); - - if (stream) - g_object_unref (stream); - - if (targets) - { - /* Store directly the local atoms */ - selection_buffer_append_data (buffer_data, targets, n_targets * sizeof (const char * const *)); - } - - g_hash_table_insert (selection_data->buffers, - GDK_ATOM_TO_POINTER (target), - buffer_data); - } - - if (!buffer_data->stream) - selection_buffer_notify (buffer_data); - - g_free (mimetype); -} - gint _gdk_wayland_display_text_property_to_utf8_list (GdkDisplay *display, GdkAtom encoding, diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c index fa780476cd..7ec5f869ec 100644 --- a/gdk/x11/gdkdisplay-x11.c +++ b/gdk/x11/gdkdisplay-x11.c @@ -1051,23 +1051,6 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator, break; - case SelectionNotify: - GDK_NOTE (EVENTS, - g_message ("selection notify:\twindow: %ld", - xevent->xproperty.window)); - - event->selection.type = GDK_SELECTION_NOTIFY; - event->selection.window = window; - event->selection.selection = gdk_x11_xatom_to_atom_for_display (display, xevent->xselection.selection); - event->selection.target = gdk_x11_xatom_to_atom_for_display (display, xevent->xselection.target); - if (xevent->xselection.property == None) - event->selection.property = event->selection.target; - else - event->selection.property = gdk_x11_xatom_to_atom_for_display (display, xevent->xselection.property); - event->selection.time = xevent->xselection.time; - - break; - case ColormapNotify: GDK_NOTE (EVENTS, g_message ("colormap notify:\twindow: %ld", @@ -3179,9 +3162,6 @@ gdk_x11_display_class_init (GdkX11DisplayClass * class) display_class->notify_startup_complete = gdk_x11_display_notify_startup_complete; display_class->create_window_impl = _gdk_x11_display_create_window_impl; display_class->get_keymap = gdk_x11_display_get_keymap; - display_class->send_selection_notify = _gdk_x11_display_send_selection_notify; - display_class->get_selection_property = _gdk_x11_display_get_selection_property; - display_class->convert_selection = _gdk_x11_display_convert_selection; display_class->text_property_to_utf8_list = _gdk_x11_display_text_property_to_utf8_list; display_class->utf8_to_string_target = _gdk_x11_display_utf8_to_string_target; diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h index 81864e2f15..597e6b8fcd 100644 --- a/gdk/x11/gdkprivate-x11.h +++ b/gdk/x11/gdkprivate-x11.h @@ -145,23 +145,6 @@ void _gdk_x11_display_queue_events (GdkDisplay *display); GdkAppLaunchContext *_gdk_x11_display_get_app_launch_context (GdkDisplay *display); -void _gdk_x11_display_send_selection_notify (GdkDisplay *display, - GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - GdkAtom property, - guint32 time); -gint _gdk_x11_display_get_selection_property (GdkDisplay *display, - GdkWindow *requestor, - guchar **data, - GdkAtom *ret_type, - gint *ret_format); -void _gdk_x11_display_convert_selection (GdkDisplay *display, - GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - guint32 time); - gint _gdk_x11_display_text_property_to_utf8_list (GdkDisplay *display, GdkAtom encoding, gint format, diff --git a/gdk/x11/gdkselection-x11.c b/gdk/x11/gdkselection-x11.c index 2ad8c2023f..632684063e 100644 --- a/gdk/x11/gdkselection-x11.c +++ b/gdk/x11/gdkselection-x11.c @@ -34,160 +34,6 @@ #include <string.h> -void -_gdk_x11_display_convert_selection (GdkDisplay *display, - GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - guint32 time) -{ - g_return_if_fail (selection != NULL); - - if (GDK_WINDOW_DESTROYED (requestor) || !GDK_WINDOW_IS_X11 (requestor)) - return; - - if (!gdk_window_has_native (requestor)) - { - g_warning ("Can't use selections on non-native window"); - return; - } - - XConvertSelection (GDK_WINDOW_XDISPLAY (requestor), - gdk_x11_atom_to_xatom_for_display (display, selection), - gdk_x11_atom_to_xatom_for_display (display, target), - gdk_x11_get_xatom_by_name_for_display (display, "GDK_SELECTION"), - GDK_WINDOW_XID (requestor), time); -} - -gint -_gdk_x11_display_get_selection_property (GdkDisplay *display, - GdkWindow *requestor, - guchar **data, - GdkAtom *ret_type, - gint *ret_format) -{ - gulong nitems; - gulong nbytes; - gulong length = 0; - Atom prop_type; - gint prop_format; - guchar *t = NULL; - - if (GDK_WINDOW_DESTROYED (requestor) || !GDK_WINDOW_IS_X11 (requestor)) - goto err; - - t = NULL; - - /* We can't delete the selection here, because it might be the INCR - protocol, in which case the client has to make sure they'll be - notified of PropertyChange events _before_ the property is deleted. - Otherwise there's no guarantee we'll win the race ... */ - if (XGetWindowProperty (GDK_WINDOW_XDISPLAY (requestor), - GDK_WINDOW_XID (requestor), - gdk_x11_get_xatom_by_name_for_display (display, "GDK_SELECTION"), - 0, 0x1FFFFFFF /* MAXINT32 / 4 */, False, - AnyPropertyType, &prop_type, &prop_format, - &nitems, &nbytes, &t) != Success) - goto err; - - if (prop_type != None) - { - if (ret_type) - *ret_type = gdk_x11_xatom_to_atom_for_display (display, prop_type); - if (ret_format) - *ret_format = prop_format; - - if (prop_type == XA_ATOM || - prop_type == gdk_x11_get_xatom_by_name_for_display (display, "ATOM_PAIR")) - { - Atom* atoms = (Atom*) t; - GdkAtom* atoms_dest; - gint num_atom, i; - - if (prop_format != 32) - goto err; - - num_atom = nitems; - length = sizeof (GdkAtom) * num_atom + 1; - - if (data) - { - *data = g_malloc (length); - (*data)[length - 1] = '\0'; - atoms_dest = (GdkAtom *)(*data); - - for (i=0; i < num_atom; i++) - atoms_dest[i] = gdk_x11_xatom_to_atom_for_display (display, atoms[i]); - } - } - else - { - switch (prop_format) - { - case 8: - length = nitems; - break; - case 16: - length = sizeof(short) * nitems; - break; - case 32: - length = sizeof(long) * nitems; - break; - default: - g_assert_not_reached (); - break; - } - - /* Add on an extra byte to handle null termination. X guarantees - that t will be 1 longer than nitems and null terminated */ - length += 1; - - if (data) - *data = g_memdup (t, length); - } - - if (t) - XFree (t); - - return length - 1; - } - - err: - if (ret_type) - *ret_type = NULL; - if (ret_format) - *ret_format = 0; - if (data) - *data = NULL; - - return 0; -} - -void -_gdk_x11_display_send_selection_notify (GdkDisplay *display, - GdkWindow *requestor, - GdkAtom selection, - GdkAtom target, - GdkAtom property, - guint32 time) -{ - XSelectionEvent xevent; - - xevent.type = SelectionNotify; - xevent.serial = 0; - xevent.send_event = True; - xevent.requestor = GDK_WINDOW_XID (requestor); - xevent.selection = gdk_x11_atom_to_xatom_for_display (display, selection); - xevent.target = gdk_x11_atom_to_xatom_for_display (display, target); - if (property == NULL) - xevent.property = None; - else - xevent.property = gdk_x11_atom_to_xatom_for_display (display, property); - xevent.time = time; - - _gdk_x11_display_send_xevent (display, xevent.requestor, False, NoEventMask, (XEvent*) & xevent); -} - /** * gdk_x11_display_text_property_to_text_list: * @display: (type GdkX11Display): The #GdkDisplay where the encoding is defined diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c index 231156ff2f..c7b77656b0 100644 --- a/gtk/gtkdnd.c +++ b/gtk/gtkdnd.c @@ -1636,7 +1636,6 @@ gtk_drag_source_info_destroy (GtkDragSourceInfo *info) g_clear_object (&info->widget); - gtk_selection_remove_all (info->ipc_widget); g_object_set_data (G_OBJECT (info->ipc_widget), I_("gtk-info"), NULL); source_widgets = g_slist_remove (source_widgets, info->ipc_widget); gtk_drag_release_ipc_widget (info->ipc_widget); diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index 077db5e3b2..d3cc7e7a28 100644 --- a/gtk/gtkmain.c +++ b/gtk/gtkmain.c @@ -1692,19 +1692,7 @@ gtk_main_do_event (GdkEvent *event) */ event_widget = gtk_get_event_widget (event); if (!event_widget) - { - /* To handle selection INCR transactions, we select - * PropertyNotify events on the requestor window and create - * a corresponding (fake) GdkWindow so that events get here. - * There won't be a widget though, so we have to handle - * them specially - */ - if (event->type == GDK_PROPERTY_NOTIFY) - _gtk_selection_incr_event (event->any.window, - &event->property); - - return; - } + return; /* If pointer or keyboard grabs are in effect, munge the events * so that each window group looks like a separate app. @@ -1823,7 +1811,6 @@ gtk_main_do_event (GdkEvent *event) case GDK_CONFIGURE: case GDK_MAP: case GDK_UNMAP: - case GDK_SELECTION_NOTIFY: case GDK_CLIENT_EVENT: case GDK_WINDOW_STATE: case GDK_GRAB_BROKEN: diff --git a/gtk/gtkselection.c b/gtk/gtkselection.c index fad6aec4f9..0c7cd566a6 100644 --- a/gtk/gtkselection.c +++ b/gtk/gtkselection.c @@ -104,96 +104,6 @@ #include <gdk/wayland/gdkwayland.h> #endif -#undef DEBUG_SELECTION - -/* Maximum size of a sent chunk, in bytes. Also the default size of - our buffers */ -#ifdef GDK_WINDOWING_X11 -#define GTK_SELECTION_MAX_SIZE(display) \ - GDK_IS_X11_DISPLAY (display) ? \ - MIN(262144, \ - XExtendedMaxRequestSize (GDK_DISPLAY_XDISPLAY (display)) == 0 \ - ? XMaxRequestSize (GDK_DISPLAY_XDISPLAY (display)) - 100 \ - : XExtendedMaxRequestSize (GDK_DISPLAY_XDISPLAY (display)) - 100)\ - : G_MAXINT -#else -/* No chunks on Win32 */ -#define GTK_SELECTION_MAX_SIZE(display) G_MAXINT -#endif - -#define IDLE_ABORT_TIME 30 - -enum { - INCR, - MULTIPLE, - TARGETS, - TIMESTAMP, - SAVE_TARGETS, - LAST_ATOM -}; - -typedef struct _GtkIncrConversion GtkIncrConversion; -typedef struct _GtkIncrInfo GtkIncrInfo; -typedef struct _GtkRetrievalInfo GtkRetrievalInfo; - -struct _GtkIncrConversion -{ - GdkAtom target; /* Requested target */ - GdkAtom property; /* Property to store in */ - GtkSelectionData data; /* The data being supplied */ - gint offset; /* Current offset in sent selection. - * -1 => All done - * -2 => Only the final (empty) portion - * left to send */ -}; - -struct _GtkIncrInfo -{ - GdkWindow *requestor; /* Requestor window - we create a GdkWindow - so we can receive events */ - GdkAtom selection; /* Selection we're sending */ - - GtkIncrConversion *conversions; /* Information about requested conversions - - * With MULTIPLE requests (benighted 1980's - * hardware idea), there can be more than - * one */ - gint num_conversions; - gint num_incrs; /* number of remaining INCR style transactions */ - guint32 idle_time; -}; - - -struct _GtkRetrievalInfo -{ - GtkWidget *widget; - GdkAtom selection; /* Selection being retrieved. */ - GdkAtom target; /* Form of selection that we requested */ - guint32 idle_time; /* Number of seconds since we last heard - from selection owner */ - guchar *buffer; /* Buffer in which to accumulate results */ - gint offset; /* Current offset in buffer, -1 indicates - not yet started */ - guint32 notify_time; /* Timestamp from SelectionNotify */ -}; - -/* Local Functions */ -static void gtk_selection_init (void); -static gboolean gtk_selection_retrieval_timeout (GtkRetrievalInfo *info); -static void gtk_selection_retrieval_report (GtkRetrievalInfo *info, - GdkAtom type, - gint format, - guchar *buffer, - gint length, - guint32 time); -static int gtk_selection_bytes_per_item (gint format); - -/* Local Data */ -static gint initialize = TRUE; -static GList *current_retrievals = NULL; -static GList *current_incrs = NULL; - -static GdkAtom gtk_selection_atoms[LAST_ATOM]; - /**************** * Target Lists * ****************/ @@ -364,110 +274,6 @@ gtk_content_formats_add_uri_targets (GdkContentFormats *list) } /** - * gtk_selection_remove_all: - * @widget: a #GtkWidget - * - * Removes all handlers and unsets ownership of all - * selections for a widget. Called when widget is being - * destroyed. This function will not generally be - * called by applications. - **/ -void -gtk_selection_remove_all (GtkWidget *widget) -{ - GList *tmp_list; - GList *next; - - g_return_if_fail (GTK_IS_WIDGET (widget)); - - /* Remove pending requests/incrs for this widget */ - - tmp_list = current_retrievals; - while (tmp_list) - { - next = tmp_list->next; - if (((GtkRetrievalInfo *)tmp_list->data)->widget == widget) - { - current_retrievals = g_list_remove_link (current_retrievals, - tmp_list); - /* structure will be freed in timeout */ - g_list_free (tmp_list); - } - tmp_list = next; - } -} - - -/** - * gtk_selection_convert: - * @widget: The widget which acts as requestor - * @selection: Which selection to get - * @target: Form of information desired (e.g., STRING) - * @time_: Time of request (usually of triggering event) - In emergency, you could use #GDK_CURRENT_TIME - * - * Requests the contents of a selection. When received, - * a “selection-received” signal will be generated. - * - * Returns: %TRUE if requested succeeded. %FALSE if we could not process - * request. (e.g., there was already a request in process for - * this widget). - **/ -gboolean -gtk_selection_convert (GtkWidget *widget, - GdkAtom selection, - GdkAtom target, - guint32 time_) -{ - GtkRetrievalInfo *info; - GList *tmp_list; - guint id; - - g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); - g_return_val_if_fail (selection != NULL, FALSE); - - if (initialize) - gtk_selection_init (); - - if (!gtk_widget_get_realized (widget)) - gtk_widget_realize (widget); - - /* Check to see if there are already any retrievals in progress for - this widget. If we changed GDK to use the selection for the - window property in which to store the retrieved information, then - we could support multiple retrievals for different selections. - This might be useful for DND. */ - - tmp_list = current_retrievals; - while (tmp_list) - { - info = (GtkRetrievalInfo *)tmp_list->data; - if (info->widget == widget) - return FALSE; - tmp_list = tmp_list->next; - } - - info = g_slice_new (GtkRetrievalInfo); - - info->widget = widget; - info->selection = selection; - info->target = target; - info->idle_time = 0; - info->buffer = NULL; - info->offset = -1; - - /* Otherwise, we need to go through X */ - - current_retrievals = g_list_append (current_retrievals, info); - gdk_selection_convert (gtk_widget_get_window (widget), selection, target, time_); - id = gdk_threads_add_timeout (1000, - (GSourceFunc) gtk_selection_retrieval_timeout, info); - g_source_set_name_by_id (id, "[gtk+] gtk_selection_retrieval_timeout"); - - return TRUE; -} - -/** * gtk_selection_data_get_selection: * @selection_data: a pointer to a #GtkSelectionData-struct. * @@ -1570,453 +1376,6 @@ gtk_selection_data_targets_include_uri (const GtkSelectionData *selection_data) return result; } - -/************************************************************* - * gtk_selection_init: - * Initialize local variables - * arguments: - * - * results: - *************************************************************/ - -static void -gtk_selection_init (void) -{ - gtk_selection_atoms[INCR] = gdk_atom_intern_static_string ("INCR"); - 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; -} - -/************************************************************* - * _gtk_selection_incr_event: - * Called whenever an PropertyNotify event occurs for an - * GdkWindow with user_data == NULL. These will be notifications - * that a window we are sending the selection to via the - * INCR protocol has deleted a property and is ready for - * more data. - * - * arguments: - * window: the requestor window - * event: the property event structure - * - * results: - *************************************************************/ - -gboolean -_gtk_selection_incr_event (GdkWindow *window, - GdkEventProperty *event) -{ - GList *tmp_list; - GtkIncrInfo *info = NULL; - gint num_bytes; - guchar *buffer; - gulong selection_max_size; - GdkPropertyState state; - GdkAtom atom; - int i; - GdkDisplay *display; - - gdk_event_get_property ((GdkEvent *)event, &atom, &state); - if (state != GDK_PROPERTY_DELETE) - return FALSE; - -#ifdef DEBUG_SELECTION - g_message ("PropertyDelete, property %ld", atom); -#endif - - display = gdk_window_get_display (window); - selection_max_size = GTK_SELECTION_MAX_SIZE (display); - - /* Now find the appropriate ongoing INCR */ - tmp_list = current_incrs; - while (tmp_list) - { - info = (GtkIncrInfo *)tmp_list->data; - if (info->requestor == gdk_event_get_window ((GdkEvent *)event)) - break; - - tmp_list = tmp_list->next; - } - - if (tmp_list == NULL) - return FALSE; - - /* Find out which target this is for */ - for (i=0; i<info->num_conversions; i++) - { - if (info->conversions[i].property == atom && - info->conversions[i].offset != -1) - { - int bytes_per_item; - - info->idle_time = 0; - - if (info->conversions[i].offset == -2) /* only the last 0-length - piece*/ - { - num_bytes = 0; - buffer = NULL; - } - else - { - num_bytes = info->conversions[i].data.length - - info->conversions[i].offset; - buffer = info->conversions[i].data.data + - info->conversions[i].offset; - - if (num_bytes > selection_max_size) - { - num_bytes = selection_max_size; - info->conversions[i].offset += selection_max_size; - } - else - info->conversions[i].offset = -2; - } -#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_XID(info->requestor), atom); -#endif - - bytes_per_item = gtk_selection_bytes_per_item (info->conversions[i].data.format); - -#ifdef GDK_WINDOWING_X11 - if (GDK_IS_X11_DISPLAY (display)) - gdk_x11_display_error_trap_push (display); -#endif - - gdk_property_change (info->requestor, atom, - info->conversions[i].data.type, - info->conversions[i].data.format, - GDK_PROP_MODE_REPLACE, - buffer, - num_bytes / bytes_per_item); - -#ifdef GDK_WINDOWING_X11 - if (GDK_IS_X11_DISPLAY (display)) - gdk_x11_display_error_trap_pop_ignored (display); -#endif - - if (info->conversions[i].offset == -2) - { - g_free (info->conversions[i].data.data); - info->conversions[i].data.data = NULL; - } - - if (num_bytes == 0) - { - info->num_incrs--; - info->conversions[i].offset = -1; - } - } - } - - /* Check if we're finished with all the targets */ - - if (info->num_incrs == 0) - { - current_incrs = g_list_remove_link (current_incrs, tmp_list); - g_list_free (tmp_list); - /* Let the timeout free it */ - } - - return TRUE; -} - -/************************************************************* - * _gtk_selection_notify: - * 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: - * widget: Widget getting signal - * event: Selection event structure - * info: Information about this retrieval - * results: - * was event handled? - *************************************************************/ - -gboolean -_gtk_selection_notify (GtkWidget *widget, - GdkEventSelection *event) -{ - GList *tmp_list; - GtkRetrievalInfo *info = NULL; - GdkWindow *window; - guchar *buffer = NULL; - gint length; - GdkAtom type; - GdkAtom selection; - GdkAtom property; - gint format; - guint32 time; - - gdk_event_get_selection ((GdkEvent *)event, &selection); - gdk_event_get_selection_property ((GdkEvent *)event, &property, NULL, NULL); - time = gdk_event_get_time ((GdkEvent *)event); - -#ifdef DEBUG_SELECTION - g_message ("Initial receipt of selection %ld, target %ld (property = %ld)", - selection, target, property); -#endif - - window = gtk_widget_get_window (widget); - - tmp_list = current_retrievals; - while (tmp_list) - { - info = (GtkRetrievalInfo *)tmp_list->data; - if (info->widget == widget && info->selection == selection) - break; - tmp_list = tmp_list->next; - } - - if (!tmp_list) /* no retrieval in progress */ - return FALSE; - - if (property != NULL) - length = gdk_selection_property_get (window, &buffer, - &type, &format); - else - length = 0; /* silence gcc */ - - if (property == NULL || buffer == NULL) - { - current_retrievals = g_list_remove_link (current_retrievals, tmp_list); - g_list_free (tmp_list); - /* structure will be freed in timeout */ - gtk_selection_retrieval_report (info, NULL, 0, NULL, -1, time); - - return TRUE; - } - - if (type == gtk_selection_atoms[INCR]) - { - /* The remainder of the selection will come through PropertyNotify - events */ - - info->notify_time = time; - info->idle_time = 0; - info->offset = 0; /* Mark as OK to proceed */ - gdk_window_set_events (window, - gdk_window_get_events (window) - | GDK_PROPERTY_CHANGE_MASK); - } - else - { - /* We don't delete the info structure - that will happen in timeout */ - current_retrievals = g_list_remove_link (current_retrievals, tmp_list); - g_list_free (tmp_list); - - info->offset = length; - gtk_selection_retrieval_report (info, - type, format, - buffer, length, time); - } - - gdk_property_delete (window, property); - - g_free (buffer); - - return TRUE; -} - -/************************************************************* - * _gtk_selection_property_notify: - * Handler for “property-notify-event” signals on windows - * where a retrieval is currently in process. The selection - * owner has added more data. - * arguments: - * widget: Widget getting signal - * event: Property event structure - * info: Information about this retrieval - * results: - * was event handled? - *************************************************************/ - -gboolean -_gtk_selection_property_notify (GtkWidget *widget, - GdkEventProperty *event) -{ - GList *tmp_list; - GtkRetrievalInfo *info = NULL; - GdkWindow *window; - guchar *new_buffer; - int length; - GdkAtom type; - gint format; - GdkAtom property; - GdkPropertyState state; - - g_return_val_if_fail (widget != NULL, FALSE); - g_return_val_if_fail (event != NULL, FALSE); - - gdk_event_get_property ((GdkEvent *)event, &property, &state); - -#if defined(GDK_WINDOWING_WIN32) || defined(GDK_WINDOWING_X11) - if ((state != GDK_PROPERTY_NEW_VALUE) || /* property was deleted */ - (property != gdk_atom_intern_static_string ("GDK_SELECTION"))) /* not the right property */ -#endif - return FALSE; - -#ifdef DEBUG_SELECTION - g_message ("PropertyNewValue, property %ld", property); -#endif - - tmp_list = current_retrievals; - while (tmp_list) - { - info = (GtkRetrievalInfo *)tmp_list->data; - if (info->widget == widget) - break; - tmp_list = tmp_list->next; - } - - if (!tmp_list) /* No retrieval in progress */ - return FALSE; - - if (info->offset < 0) /* We haven't got the SelectionNotify - for this retrieval yet */ - return FALSE; - - info->idle_time = 0; - - window = gtk_widget_get_window (widget); - length = gdk_selection_property_get (window, &new_buffer, - &type, &format); - gdk_property_delete (window, property); - - /* We could do a lot better efficiency-wise by paying attention to - what length was sent in the initial INCR transaction, instead of - doing memory allocation at every step. But its only guaranteed to - be a _lower bound_ (pretty useless!) */ - - if (length == 0 || type == NULL) /* final zero length portion */ - { - /* Info structure will be freed in timeout */ - current_retrievals = g_list_remove_link (current_retrievals, tmp_list); - g_list_free (tmp_list); - gtk_selection_retrieval_report (info, - type, format, - (type == NULL) ? NULL : info->buffer, - (type == NULL) ? -1 : info->offset, - info->notify_time); - } - else /* append on newly arrived data */ - { - if (!info->buffer) - { -#ifdef DEBUG_SELECTION - g_message ("Start - Adding %d bytes at offset 0", - length); -#endif - info->buffer = new_buffer; - info->offset = length; - } - else - { - -#ifdef DEBUG_SELECTION - g_message ("Appending %d bytes at offset %d", - length,info->offset); -#endif - /* We copy length+1 bytes to preserve guaranteed null termination */ - info->buffer = g_realloc (info->buffer, info->offset+length+1); - memcpy (info->buffer + info->offset, new_buffer, length+1); - info->offset += length; - g_free (new_buffer); - } - } - - return TRUE; -} - -/************************************************************* - * gtk_selection_retrieval_timeout: - * Timeout callback while receiving a selection. - * arguments: - * info: Information about this retrieval - * results: - *************************************************************/ - -static gboolean -gtk_selection_retrieval_timeout (GtkRetrievalInfo *info) -{ - GList *tmp_list; - gboolean retval; - - /* Determine if retrieval has finished by checking if it still in - list of pending retrievals */ - - tmp_list = current_retrievals; - while (tmp_list) - { - if (info == (GtkRetrievalInfo *)tmp_list->data) - break; - tmp_list = tmp_list->next; - } - - /* If retrieval is finished */ - if (!tmp_list || info->idle_time >= IDLE_ABORT_TIME) - { - if (tmp_list && info->idle_time >= IDLE_ABORT_TIME) - { - current_retrievals = g_list_remove_link (current_retrievals, tmp_list); - g_list_free (tmp_list); - gtk_selection_retrieval_report (info, NULL, 0, NULL, -1, GDK_CURRENT_TIME); - } - - g_free (info->buffer); - g_slice_free (GtkRetrievalInfo, info); - - retval = FALSE; /* remove timeout */ - } - else - { - info->idle_time++; - - retval = TRUE; /* timeout will happen again */ - } - - return retval; -} - -/************************************************************* - * gtk_selection_retrieval_report: - * Emits a “selection-received” signal. - * arguments: - * info: information about the retrieval that completed - * buffer: buffer containing data (NULL => errror) - * time: timestamp for data in buffer - * results: - *************************************************************/ - -static void -gtk_selection_retrieval_report (GtkRetrievalInfo *info, - GdkAtom type, gint format, - guchar *buffer, gint length, - guint32 time) -{ - GtkSelectionData data; - - data.selection = info->selection; - data.target = info->target; - data.type = type; - data.format = format; - - data.length = length; - data.data = buffer; - data.display = gtk_widget_get_display (info->widget); - - g_signal_emit_by_name (info->widget, - "selection-received", - &data, time); -} - /** * gtk_selection_data_copy: * @data: a pointer to a #GtkSelectionData-struct. @@ -2065,22 +1424,3 @@ G_DEFINE_BOXED_TYPE (GtkSelectionData, gtk_selection_data, gtk_selection_data_copy, gtk_selection_data_free) -static int -gtk_selection_bytes_per_item (gint format) -{ - switch (format) - { - case 8: - return sizeof (char); - break; - case 16: - return sizeof (short); - break; - case 32: - return sizeof (long); - break; - default: - g_assert_not_reached(); - } - return 0; -} diff --git a/gtk/gtkselection.h b/gtk/gtkselection.h index 8f79cd7cb9..7e6b6a9f2c 100644 --- a/gtk/gtkselection.h +++ b/gtk/gtkselection.h @@ -45,14 +45,6 @@ GDK_AVAILABLE_IN_ALL GdkContentFormats * gtk_content_formats_add_uri_targets (GdkContentFormats *list) G_GNUC_WARN_UNUSED_RESULT; GDK_AVAILABLE_IN_ALL -gboolean gtk_selection_convert (GtkWidget *widget, - GdkAtom selection, - GdkAtom target, - guint32 time_); -GDK_AVAILABLE_IN_ALL -void gtk_selection_remove_all (GtkWidget *widget); - -GDK_AVAILABLE_IN_ALL GdkAtom gtk_selection_data_get_selection (const GtkSelectionData *selection_data); GDK_AVAILABLE_IN_ALL GdkAtom gtk_selection_data_get_target (const GtkSelectionData *selection_data); diff --git a/gtk/gtkselectionprivate.h b/gtk/gtkselectionprivate.h index cd3678c8d6..896fcd0c28 100644 --- a/gtk/gtkselectionprivate.h +++ b/gtk/gtkselectionprivate.h @@ -47,13 +47,6 @@ struct _GtkSelectionData GdkDisplay *display; }; -gboolean _gtk_selection_incr_event (GdkWindow *window, - GdkEventProperty *event); -gboolean _gtk_selection_notify (GtkWidget *widget, - GdkEventSelection *event); -gboolean _gtk_selection_property_notify (GtkWidget *widget, - GdkEventProperty *event); - G_END_DECLS #endif /* __GTK_SELECTION_PRIVATE_H__ */ diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index b1e859b608..df21504e75 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -521,7 +521,6 @@ enum { MAP_EVENT, UNMAP_EVENT, PROPERTY_NOTIFY_EVENT, - SELECTION_NOTIFY_EVENT, SELECTION_GET, SELECTION_RECEIVED, PROXIMITY_IN_EVENT, @@ -1045,8 +1044,7 @@ gtk_widget_class_init (GtkWidgetClass *klass) klass->map_event = NULL; klass->unmap_event = NULL; klass->window_state_event = NULL; - klass->property_notify_event = _gtk_selection_property_notify; - klass->selection_notify_event = _gtk_selection_notify; + klass->property_notify_event = NULL; klass->selection_received = NULL; klass->proximity_in_event = NULL; klass->proximity_out_event = NULL; @@ -2430,25 +2428,6 @@ gtk_widget_class_init (GtkWidgetClass *klass) _gtk_marshal_BOOLEAN__BOXEDv); /** - * GtkWidget::selection-notify-event: - * @widget: the object which received the signal. - * @event: (type Gdk.EventSelection): - * - * Returns: %TRUE to stop other handlers from being invoked for the event. %FALSE to propagate the event further. - */ - widget_signals[SELECTION_NOTIFY_EVENT] = - g_signal_new (I_("selection-notify-event"), - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST | G_SIGNAL_DEPRECATED, - G_STRUCT_OFFSET (GtkWidgetClass, selection_notify_event), - _gtk_boolean_handled_accumulator, NULL, - _gtk_marshal_BOOLEAN__BOXED, - G_TYPE_BOOLEAN, 1, - GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE); - g_signal_set_va_marshaller (widget_signals[SELECTION_NOTIFY_EVENT], G_TYPE_FROM_CLASS (klass), - _gtk_marshal_BOOLEAN__BOXEDv); - - /** * GtkWidget::selection-received: * @widget: the object which received the signal. * @data: @@ -6623,7 +6602,6 @@ gtk_widget_event_internal (GtkWidget *widget, case GDK_UNMAP: case GDK_WINDOW_STATE: case GDK_PROPERTY_NOTIFY: - case GDK_SELECTION_NOTIFY: return gtk_widget_emit_event_signals (widget, event); default: break; @@ -6743,9 +6721,6 @@ gtk_widget_emit_event_signals (GtkWidget *widget, case GDK_PROPERTY_NOTIFY: signal_num = PROPERTY_NOTIFY_EVENT; break; - case GDK_SELECTION_NOTIFY: - signal_num = SELECTION_NOTIFY_EVENT; - break; case GDK_PROXIMITY_IN: signal_num = PROXIMITY_IN_EVENT; break; @@ -10147,8 +10122,6 @@ gtk_widget_real_unrealize (GtkWidget *widget) priv->window = NULL; } - gtk_selection_remove_all (widget); - gtk_widget_set_realized (widget, FALSE); } diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h index 5e7de3a505..9ad1a8e62a 100644 --- a/gtk/gtkwidget.h +++ b/gtk/gtkwidget.h @@ -369,12 +369,6 @@ struct _GtkWidgetClass GdkEventAny *event); gboolean (* property_notify_event) (GtkWidget *widget, GdkEventProperty *event); - gboolean (* selection_clear_event) (GtkWidget *widget, - GdkEventSelection *event); - gboolean (* selection_request_event) (GtkWidget *widget, - GdkEventSelection *event); - gboolean (* selection_notify_event) (GtkWidget *widget, - GdkEventSelection *event); gboolean (* proximity_in_event) (GtkWidget *widget, GdkEventProximity *event); gboolean (* proximity_out_event) (GtkWidget *widget, diff --git a/tests/testgtk.c b/tests/testgtk.c index bf3ddc5e8c..9a16003c56 100644 --- a/tests/testgtk.c +++ b/tests/testgtk.c @@ -7084,98 +7084,6 @@ selection_test_received (GtkWidget *tree_view, return; } -void -selection_test_get_targets (GtkWidget *dialog, gint response, GtkWidget *tree_view) -{ - static GdkAtom targets_atom = NULL; - - if (response != GTK_RESPONSE_APPLY) - { - gtk_widget_destroy (dialog); - return; - } - - if (targets_atom == NULL) - targets_atom = gdk_atom_intern ("TARGETS", FALSE); - - gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom, - GDK_CURRENT_TIME); -} - -void -create_selection_test (GtkWidget *widget) -{ - static GtkWidget *window = NULL; - GtkWidget *content_area; - GtkWidget *vbox; - GtkWidget *scrolled_win; - GtkListStore* store; - GtkWidget *tree_view; - GtkTreeViewColumn *column; - GtkCellRenderer *renderer; - GtkWidget *label; - - if (!window) - { - window = gtk_dialog_new (); - - gtk_window_set_display (GTK_WINDOW (window), - gtk_widget_get_display (widget)); - - g_signal_connect (window, "destroy", - G_CALLBACK (gtk_widget_destroyed), - &window); - - content_area = gtk_dialog_get_content_area (GTK_DIALOG (window)); - - gtk_window_set_title (GTK_WINDOW (window), "Selection Test"); - - /* Create the list */ - - vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_box_pack_start (GTK_BOX (content_area), vbox); - - label = gtk_label_new ("Gets available targets for current selection"); - gtk_box_pack_start (GTK_BOX (vbox), label); - - scrolled_win = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_box_pack_start (GTK_BOX (vbox), scrolled_win); - gtk_widget_set_size_request (scrolled_win, 100, 200); - - store = gtk_list_store_new (1, G_TYPE_STRING); - tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); - gtk_container_add (GTK_CONTAINER (scrolled_win), tree_view); - - renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("Target", renderer, - "text", 0, NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column); - - g_signal_connect (tree_view, "selection_received", - G_CALLBACK (selection_test_received), NULL); - - /* .. And create some buttons */ - gtk_dialog_add_button (GTK_DIALOG (window), - "Get Targets", - GTK_RESPONSE_APPLY); - - g_signal_connect (window, "response", - G_CALLBACK (selection_test_get_targets), tree_view); - - gtk_dialog_add_button (GTK_DIALOG (window), - "Quit", - GTK_RESPONSE_CLOSE); - } - - if (!gtk_widget_get_visible (window)) - gtk_widget_show (window); - else - gtk_widget_destroy (window); -} - /* * Test scrolling */ @@ -8043,7 +7951,6 @@ struct { { "statusbar", create_statusbar }, { "test mainloop", create_mainloop, TRUE }, { "test scrolling", create_scroll_test }, - { "test selection", create_selection_test }, { "test timeout", create_timeout_test }, { "toggle buttons", create_toggle_buttons }, { "tooltips", create_tooltips }, |