*/
#include <config.h>
+#include <string.h>
#include "gtkmain.h"
#include "gtkprivate.h"
#include "gtkxembed.h"
+#include "gtkalias.h"
typedef struct _GtkXEmbedMessage GtkXEmbedMessage;
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];
{
GtkXEmbedMessage *message = current_messages->data;
current_messages = g_slist_delete_link (current_messages, current_messages);
-
- g_free (message);
+ g_slice_free (GtkXEmbedMessage, message);
}
/**
glong data2)
{
GdkDisplay *display;
- XEvent xevent;
+ XClientMessageEvent xclient;
if (!recipient)
return;
display = gdk_drawable_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_XWINDOW (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);
+ False, NoEventMask, (XEvent *)&xclient);
gdk_display_sync (display);
gdk_error_trap_pop ();
}
_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;
+ }
+}