X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkxembed.c;h=88a9304ea901138773fe9183ce1617cebb2f7e65;hb=a41b73fbc71f613e4ca90ae8b9dd3bd317d026d6;hp=4d084f1401ed5a4e6df2021faf38d5dec5ddd421;hpb=cca8dd63475ab582d8592039f1f69d7f22a3b928;p=~andy%2Fgtk diff --git a/gtk/gtkxembed.c b/gtk/gtkxembed.c index 4d084f140..88a9304ea 100644 --- a/gtk/gtkxembed.c +++ b/gtk/gtkxembed.c @@ -13,16 +13,16 @@ * 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 . */ -#include +#include "config.h" +#include #include "gtkmain.h" #include "gtkprivate.h" #include "gtkxembed.h" -#include "gtkalias.h" +#include "gtkdebug.h" + typedef struct _GtkXEmbedMessage GtkXEmbedMessage; @@ -47,7 +47,7 @@ static GSList *current_messages; void _gtk_xembed_push_message (XEvent *xevent) { - GtkXEmbedMessage *message = g_new (GtkXEmbedMessage, 1); + GtkXEmbedMessage *message = g_slice_new (GtkXEmbedMessage); message->time = xevent->xclient.data.l[0]; message->message = xevent->xclient.data.l[1]; @@ -68,8 +68,7 @@ _gtk_xembed_pop_message (void) { GtkXEmbedMessage *message = current_messages->data; current_messages = g_slist_delete_link (current_messages, current_messages); - - g_free (message); + g_slice_free (GtkXEmbedMessage, message); } /** @@ -123,7 +122,7 @@ gtk_xembed_get_time (void) /** * _gtk_xembed_send_message: - * @recipient: window to which to send the window, or %NULL + * @recipient: (allow-none): window to which to send the window, or %NULL * in which case nothing will be sent * @message: type of message * @detail: detail field of message @@ -140,38 +139,38 @@ _gtk_xembed_send_message (GdkWindow *recipient, glong data2) { GdkDisplay *display; - XEvent xevent; + XClientMessageEvent xclient; if (!recipient) return; g_return_if_fail (GDK_IS_WINDOW (recipient)); - display = gdk_drawable_get_display (recipient); + display = gdk_window_get_display (recipient); GTK_NOTE (PLUGSOCKET, - g_message ("Sending XEMBED message of type %d", message)); - - xevent.xclient.window = GDK_WINDOW_XWINDOW (recipient); - xevent.xclient.type = ClientMessage; - xevent.xclient.message_type = gdk_x11_get_xatom_by_name_for_display (display, "_XEMBED"); - xevent.xclient.format = 32; - xevent.xclient.data.l[0] = gtk_xembed_get_time (); - xevent.xclient.data.l[1] = message; - xevent.xclient.data.l[2] = detail; - xevent.xclient.data.l[3] = data1; - xevent.xclient.data.l[4] = data2; + g_message ("Sending %s", _gtk_xembed_message_name (message))); + + memset (&xclient, 0, sizeof (xclient)); + xclient.window = GDK_WINDOW_XID (recipient); + xclient.type = ClientMessage; + xclient.message_type = gdk_x11_get_xatom_by_name_for_display (display, "_XEMBED"); + xclient.format = 32; + xclient.data.l[0] = gtk_xembed_get_time (); + xclient.data.l[1] = message; + xclient.data.l[2] = detail; + xclient.data.l[3] = data1; + xclient.data.l[4] = data2; gdk_error_trap_push (); XSendEvent (GDK_WINDOW_XDISPLAY(recipient), - GDK_WINDOW_XWINDOW (recipient), - False, NoEventMask, &xevent); - gdk_display_sync (display); - gdk_error_trap_pop (); + GDK_WINDOW_XID (recipient), + False, NoEventMask, (XEvent *)&xclient); + gdk_error_trap_pop_ignored (); } /** * _gtk_xembed_send_focus_message: - * @recipient: window to which to send the window, or %NULL + * @recipient: (allow-none): window to which to send the window, or %NULL * in which case nothing will be sent * @message: type of message * @detail: detail field of message @@ -213,3 +212,31 @@ _gtk_xembed_send_focus_message (GdkWindow *recipient, _gtk_xembed_send_message (recipient, message, detail, flags, 0); } +const char * +_gtk_xembed_message_name (XEmbedMessageType message) +{ + static char unk[24]; + + switch (message) + { +#define CASE(x) case XEMBED_##x: return "XEMBED_"#x + CASE (EMBEDDED_NOTIFY); + CASE (WINDOW_ACTIVATE); + CASE (WINDOW_DEACTIVATE); + CASE (REQUEST_FOCUS); + CASE (FOCUS_IN); + CASE (FOCUS_OUT); + CASE (FOCUS_NEXT); + CASE (FOCUS_PREV); + CASE (GRAB_KEY); + CASE (UNGRAB_KEY); + CASE (MODALITY_ON); + CASE (MODALITY_OFF); + CASE (GTK_GRAB_KEY); + CASE (GTK_UNGRAB_KEY); +#undef CASE + default: + snprintf (unk, 24, "UNKNOWN(%d)", message); + return unk; + } +}