From 8500d9458ee3f21fef41f199dabe5cdfca0010ed Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Tue, 8 Jul 2003 22:27:47 +0000 Subject: [PATCH] Change _gdk_x11_send_xevent_async() to Tue Jul 8 17:36:21 2003 Owen Taylor * gdk/x11/gdkasync.[ch] gdk/gdkdnd-x11.c: Change _gdk_x11_send_xevent_async() to _gdk_x11_send_client_message_async() avoid using Xlib internals that are different on Solaris. (#116917, Morten Welinder) --- ChangeLog | 11 ++++++- ChangeLog.pre-2-10 | 11 ++++++- ChangeLog.pre-2-4 | 11 ++++++- ChangeLog.pre-2-6 | 11 ++++++- ChangeLog.pre-2-8 | 11 ++++++- gdk/x11/gdkasync.c | 75 +++++++++++++++++++++++++++++--------------- gdk/x11/gdkasync.h | 22 ++++++------- gdk/x11/gdkdnd-x11.c | 30 +++++++++--------- 8 files changed, 127 insertions(+), 55 deletions(-) diff --git a/ChangeLog b/ChangeLog index 37f97b968c..cef1753c2d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,15 @@ +Tue Jul 8 17:36:21 2003 Owen Taylor + + * gdk/x11/gdkasync.[ch] gdk/gdkdnd-x11.c: + Change _gdk_x11_send_xevent_async() to + _gdk_x11_send_client_message_async() avoid using Xlib + internals that are different on Solaris. + (#116917, Morten Welinder) + 2003-07-08 Matthias Clasen - * gtk/gtkcontainer.c (gtk_container_remove): Doc addition. (#116501, Doug Quale) + * gtk/gtkcontainer.c (gtk_container_remove): Doc addition. + (#116501, Doug Quale) Tue Jul 8 21:35:22 2003 Soeren Sandmann diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 37f97b968c..cef1753c2d 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,6 +1,15 @@ +Tue Jul 8 17:36:21 2003 Owen Taylor + + * gdk/x11/gdkasync.[ch] gdk/gdkdnd-x11.c: + Change _gdk_x11_send_xevent_async() to + _gdk_x11_send_client_message_async() avoid using Xlib + internals that are different on Solaris. + (#116917, Morten Welinder) + 2003-07-08 Matthias Clasen - * gtk/gtkcontainer.c (gtk_container_remove): Doc addition. (#116501, Doug Quale) + * gtk/gtkcontainer.c (gtk_container_remove): Doc addition. + (#116501, Doug Quale) Tue Jul 8 21:35:22 2003 Soeren Sandmann diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 37f97b968c..cef1753c2d 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,6 +1,15 @@ +Tue Jul 8 17:36:21 2003 Owen Taylor + + * gdk/x11/gdkasync.[ch] gdk/gdkdnd-x11.c: + Change _gdk_x11_send_xevent_async() to + _gdk_x11_send_client_message_async() avoid using Xlib + internals that are different on Solaris. + (#116917, Morten Welinder) + 2003-07-08 Matthias Clasen - * gtk/gtkcontainer.c (gtk_container_remove): Doc addition. (#116501, Doug Quale) + * gtk/gtkcontainer.c (gtk_container_remove): Doc addition. + (#116501, Doug Quale) Tue Jul 8 21:35:22 2003 Soeren Sandmann diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 37f97b968c..cef1753c2d 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,6 +1,15 @@ +Tue Jul 8 17:36:21 2003 Owen Taylor + + * gdk/x11/gdkasync.[ch] gdk/gdkdnd-x11.c: + Change _gdk_x11_send_xevent_async() to + _gdk_x11_send_client_message_async() avoid using Xlib + internals that are different on Solaris. + (#116917, Morten Welinder) + 2003-07-08 Matthias Clasen - * gtk/gtkcontainer.c (gtk_container_remove): Doc addition. (#116501, Doug Quale) + * gtk/gtkcontainer.c (gtk_container_remove): Doc addition. + (#116501, Doug Quale) Tue Jul 8 21:35:22 2003 Soeren Sandmann diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 37f97b968c..cef1753c2d 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,6 +1,15 @@ +Tue Jul 8 17:36:21 2003 Owen Taylor + + * gdk/x11/gdkasync.[ch] gdk/gdkdnd-x11.c: + Change _gdk_x11_send_xevent_async() to + _gdk_x11_send_client_message_async() avoid using Xlib + internals that are different on Solaris. + (#116917, Morten Welinder) + 2003-07-08 Matthias Clasen - * gtk/gtkcontainer.c (gtk_container_remove): Doc addition. (#116501, Doug Quale) + * gtk/gtkcontainer.c (gtk_container_remove): Doc addition. + (#116501, Doug Quale) Tue Jul 8 21:35:22 2003 Soeren Sandmann diff --git a/gdk/x11/gdkasync.c b/gdk/x11/gdkasync.c index 06784cd6d3..0d3799810d 100644 --- a/gdk/x11/gdkasync.c +++ b/gdk/x11/gdkasync.c @@ -152,18 +152,59 @@ send_event_handler (Display *dpy, return False; } +static void +client_message_to_wire (XClientMessageEvent *ev, + xEvent *event) +{ + int i; + event->u.clientMessage.window = ev->window; + event->u.u.type = ev->type; + event->u.u.detail = ev->format; + switch (ev->format) + { + case 8: + event->u.clientMessage.u.b.type = ev->message_type; + for (i = 0; i < 20; i++) + event->u.clientMessage.u.b.bytes[i] = ev->data.b[i]; + break; + case 16: + event->u.clientMessage.u.s.type = ev->message_type; + event->u.clientMessage.u.s.shorts0 = ev->data.s[0]; + event->u.clientMessage.u.s.shorts1 = ev->data.s[1]; + event->u.clientMessage.u.s.shorts2 = ev->data.s[2]; + event->u.clientMessage.u.s.shorts3 = ev->data.s[3]; + event->u.clientMessage.u.s.shorts4 = ev->data.s[4]; + event->u.clientMessage.u.s.shorts5 = ev->data.s[5]; + event->u.clientMessage.u.s.shorts6 = ev->data.s[6]; + event->u.clientMessage.u.s.shorts7 = ev->data.s[7]; + event->u.clientMessage.u.s.shorts8 = ev->data.s[8]; + event->u.clientMessage.u.s.shorts9 = ev->data.s[9]; + break; + case 32: + event->u.clientMessage.u.l.type = ev->message_type; + event->u.clientMessage.u.l.longs0 = ev->data.l[0]; + event->u.clientMessage.u.l.longs1 = ev->data.l[1]; + event->u.clientMessage.u.l.longs2 = ev->data.l[2]; + event->u.clientMessage.u.l.longs3 = ev->data.l[3]; + event->u.clientMessage.u.l.longs4 = ev->data.l[4]; + break; + default: + /* client passing bogus data, let server complain */ + break; + } +} + void -_gdk_x11_send_xevent_async (GdkDisplay *display, - Window window, - gboolean propagate, - glong event_mask, - XEvent *event_send, - GdkSendXEventCallback callback, - gpointer data) +_gdk_x11_send_client_message_async (GdkDisplay *display, + Window window, + gboolean propagate, + glong event_mask, + XClientMessageEvent *event_send, + GdkSendXEventCallback callback, + gpointer data) { Display *dpy; SendEventState *state; - Status status; dpy = GDK_DISPLAY_XDISPLAY (display); @@ -185,24 +226,8 @@ _gdk_x11_send_xevent_async (GdkDisplay *display, { register xSendEventReq *req; xEvent ev; - register Status (**fp)(); - /* call through display to find proper conversion routine */ - - fp = &dpy->wire_vec[event_send->type & 0177]; - if (*fp == NULL) *fp = _XEventToWire; - status = (**fp)(dpy, event_send, &ev); - - if (!status) - { - g_warning ("Error converting event to wire"); - DeqAsyncHandler(dpy, &state->async); - UnlockDisplay(dpy); - SyncHandle(); - g_free (state); - - return; - } + client_message_to_wire (event_send, &ev); GetReq(SendEvent, req); req->destination = window; diff --git a/gdk/x11/gdkasync.h b/gdk/x11/gdkasync.h index 146ea538f5..91897f380f 100644 --- a/gdk/x11/gdkasync.h +++ b/gdk/x11/gdkasync.h @@ -44,17 +44,17 @@ struct _GdkChildInfoX11 guint window_class : 2; }; -void _gdk_x11_send_xevent_async (GdkDisplay *display, - Window window, - gboolean propagate, - glong event_mask, - XEvent *event_send, - GdkSendXEventCallback callback, - gpointer data); -void _gdk_x11_set_input_focus_safe (GdkDisplay *display, - Window window, - int revert_to, - Time time); +void _gdk_x11_send_client_message_async (GdkDisplay *display, + Window window, + gboolean propagate, + glong event_mask, + XClientMessageEvent *event_send, + GdkSendXEventCallback callback, + gpointer data); +void _gdk_x11_set_input_focus_safe (GdkDisplay *display, + Window window, + int revert_to, + Time time); gboolean _gdk_x11_get_window_child_info (GdkDisplay *display, Window window, diff --git a/gdk/x11/gdkdnd-x11.c b/gdk/x11/gdkdnd-x11.c index e6d75c6018..feb3119f9d 100644 --- a/gdk/x11/gdkdnd-x11.c +++ b/gdk/x11/gdkdnd-x11.c @@ -2100,9 +2100,9 @@ xdnd_set_actions (GdkDragContext *context) } static void -send_xevent_async_cb (Window window, - gboolean success, - gpointer data) +send_client_message_async_cb (Window window, + gboolean success, + gpointer data) { GdkDragContext *context = data; GDK_NOTE (DND, @@ -2151,19 +2151,19 @@ gdk_drag_context_get_display (GdkDragContext *context) } static void -send_xevent_async (GdkDragContext *context, - Window window, - gboolean propagate, - glong event_mask, - XEvent *event_send) +send_client_message_async (GdkDragContext *context, + Window window, + gboolean propagate, + glong event_mask, + XClientMessageEvent *event_send) { GdkDisplay *display = gdk_drag_context_get_display (context); g_object_ref (context); - _gdk_x11_send_xevent_async (display, window, - propagate, event_mask, event_send, - send_xevent_async_cb, context); + _gdk_x11_send_client_message_async (display, window, + propagate, event_mask, event_send, + send_client_message_async_cb, context); } static gboolean @@ -2176,9 +2176,10 @@ xdnd_send_xevent (GdkDragContext *context, Window xwindow; glong event_mask; + g_assert (event_send->xany.type == ClientMessage); + /* We short-circuit messages to ourselves */ - if (gdk_window_get_window_type (window) != GDK_WINDOW_FOREIGN && - event_send->xany.type == ClientMessage) + if (gdk_window_get_window_type (window) != GDK_WINDOW_FOREIGN) { gint i; @@ -2205,7 +2206,8 @@ xdnd_send_xevent (GdkDragContext *context, else event_mask = 0; - send_xevent_async (context, xwindow, propagate, event_mask, event_send); + send_client_message_async (context, xwindow, propagate, event_mask, + &event_send->xclient); return TRUE; }