]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkxembed.c
fix local prototype of _gtk_file_chooser_label_for_file() (takes a GFile,
[~andy/gtk] / gtk / gtkxembed.c
index f1cc3e9a8f6dc4c66e44b8e9697f05a53d733f9d..c1feb5725203c31512994b1609ba233b6a108b77 100644 (file)
  */
 
 #include <config.h>
+#include <string.h>
 #include "gtkmain.h"
 #include "gtkprivate.h"
 #include "gtkxembed.h"
+#include "gtkalias.h"
 
 typedef struct _GtkXEmbedMessage GtkXEmbedMessage;
 
@@ -46,7 +48,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];
@@ -67,8 +69,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);
 }
 
 /**
@@ -139,7 +140,7 @@ _gtk_xembed_send_message (GdkWindow        *recipient,
                          glong             data2)
 {
   GdkDisplay *display;
-  XEvent xevent;
+  XClientMessageEvent xclient;
 
   if (!recipient)
     return;
@@ -148,22 +149,23 @@ _gtk_xembed_send_message (GdkWindow        *recipient,
 
   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 ();
 }
@@ -212,3 +214,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;
+    }
+}