G_DEFINE_TYPE_WITH_PRIVATE (GdkX11SelectionInputStream, gdk_x11_selection_input_stream, G_TYPE_INPUT_STREAM);
-static GdkFilterReturn
-gdk_x11_selection_input_stream_filter_event (GdkXEvent *xevent,
- GdkEvent *gdkevent,
- gpointer data);
+static GdkEvent *
+gdk_x11_selection_input_stream_translate_event (GdkDisplay *display,
+ const XEvent *xevent,
+ gpointer data);
static gboolean
gdk_x11_selection_input_stream_has_data (GdkX11SelectionInputStream *stream)
gdk_x11_selection_input_stream_flush (stream);
GDK_X11_DISPLAY (priv->display)->streams = g_slist_remove (GDK_X11_DISPLAY (priv->display)->streams, stream);
- gdk_window_remove_filter (NULL, gdk_x11_selection_input_stream_filter_event, stream);
+ g_signal_handlers_disconnect_by_func (priv->display,
+ gdk_x11_selection_input_stream_translate_event,
+ stream);
g_object_unref (stream);
}
}
-static GdkFilterReturn
-gdk_x11_selection_input_stream_filter_event (GdkXEvent *xev,
- GdkEvent *gdkevent,
- gpointer data)
+static GdkEvent *
+gdk_x11_selection_input_stream_translate_event (GdkDisplay *display,
+ const XEvent *xevent,
+ gpointer data)
{
GdkX11SelectionInputStream *stream = GDK_X11_SELECTION_INPUT_STREAM (data);
GdkX11SelectionInputStreamPrivate *priv = gdk_x11_selection_input_stream_get_instance_private (stream);
- XEvent *xevent = xev;
Display *xdisplay;
Window xwindow;
GBytes *bytes;
if (xevent->xany.display != xdisplay ||
xevent->xany.window != xwindow)
- return GDK_FILTER_CONTINUE;
+ return NULL;
switch (xevent->type)
{
if (!priv->incr ||
xevent->xproperty.atom != priv->xproperty ||
xevent->xproperty.state != PropertyNewValue)
- return GDK_FILTER_CONTINUE;
+ return NULL;
bytes = get_selection_property (xdisplay, xwindow, xevent->xproperty.atom, &type, &format);
if (bytes == NULL)
XDeleteProperty (xdisplay, xwindow, xevent->xproperty.atom);
- return GDK_FILTER_CONTINUE;
+ return NULL;
case SelectionNotify:
{
/* selection is not for us */
if (priv->xselection != xevent->xselection.selection ||
priv->xtarget != xevent->xselection.target)
- return GDK_FILTER_CONTINUE;
+ return NULL;
/* We already received a selectionNotify before */
if (priv->pending_task == NULL ||
g_task_get_source_tag (priv->pending_task) != gdk_x11_selection_input_stream_new_async)
- return GDK_FILTER_CONTINUE;
+ return NULL;
GDK_NOTE(SELECTION, g_printerr ("%s:%s: got SelectionNotify\n", priv->selection, priv->target));
g_object_unref (task);
}
- return GDK_FILTER_REMOVE;
+ return gdk_event_new (GDK_NOTHING);
default:
- return GDK_FILTER_CONTINUE;
+ return NULL;
}
}
priv->property = g_strdup_printf ("GDK_SELECTION_%p", stream);
priv->xproperty = gdk_x11_get_xatom_by_name_for_display (display, priv->property);
- gdk_window_add_filter (NULL, gdk_x11_selection_input_stream_filter_event, stream);
+ g_signal_connect (display, "translate-event", G_CALLBACK (gdk_x11_selection_input_stream_translate_event), stream);
XConvertSelection (GDK_DISPLAY_XDISPLAY (display),
priv->xselection,
}
}
-static GdkFilterReturn
-gdk_x11_selection_output_stream_filter_event (GdkXEvent *xevent,
- GdkEvent *gdkevent,
- gpointer data);
+static GdkEvent *
+gdk_x11_selection_output_stream_translate_event (GdkDisplay *display,
+ const XEvent *xevent,
+ gpointer data);
static gboolean
gdk_x11_selection_output_stream_can_flush (GdkX11SelectionOutputStream *stream)
GdkX11SelectionOutputStreamPrivate *priv = gdk_x11_selection_output_stream_get_instance_private (stream);
GDK_X11_DISPLAY (priv->display)->streams = g_slist_remove (GDK_X11_DISPLAY (priv->display)->streams, stream);
- gdk_window_remove_filter (NULL, gdk_x11_selection_output_stream_filter_event, stream);
+ g_signal_handlers_disconnect_by_func (priv->display,
+ gdk_x11_selection_output_stream_translate_event,
+ stream);
return G_SOURCE_REMOVE;
}
priv->data = g_byte_array_new ();
}
-static GdkFilterReturn
-gdk_x11_selection_output_stream_filter_event (GdkXEvent *xev,
- GdkEvent *gdkevent,
- gpointer data)
+static GdkEvent *
+gdk_x11_selection_output_stream_translate_event (GdkDisplay *display,
+ const XEvent *xevent,
+ gpointer data)
{
GdkX11SelectionOutputStream *stream = GDK_X11_SELECTION_OUTPUT_STREAM (data);
GdkX11SelectionOutputStreamPrivate *priv = gdk_x11_selection_output_stream_get_instance_private (stream);
- XEvent *xevent = xev;
Display *xdisplay;
xdisplay = gdk_x11_display_get_xdisplay (priv->display);
if (xevent->xany.display != xdisplay ||
xevent->xany.window != priv->xwindow)
- return GDK_FILTER_CONTINUE;
+ return NULL;
switch (xevent->type)
{
if (!priv->incr ||
xevent->xproperty.atom != priv->xproperty ||
xevent->xproperty.state != PropertyDelete)
- return GDK_FILTER_CONTINUE;
+ return NULL;
GDK_NOTE(SELECTION, g_printerr ("%s:%s: got PropertyNotify Delete during INCR\n",
priv->selection, priv->target));
- return GDK_FILTER_CONTINUE;
+ priv->delete_pending = FALSE;
+ if (gdk_x11_selection_output_stream_needs_flush (stream) &
+ gdk_x11_selection_output_stream_can_flush (stream))
+ gdk_x11_selection_output_stream_perform_flush (stream);
+ return NULL;
default:
- return GDK_FILTER_CONTINUE;
+ return NULL;
}
}
priv->format = format;
priv->timestamp = timestamp;
- gdk_window_add_filter (NULL, gdk_x11_selection_output_stream_filter_event, stream);
+ g_signal_connect (display,
+ "translate-event",
+ G_CALLBACK (gdk_x11_selection_output_stream_translate_event),
+ stream);
return G_OUTPUT_STREAM (stream);
}