]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkxembed.c
filechooserbutton: Emit 'selection-changed' when changing the selection programmatically
[~andy/gtk] / gtk / gtkxembed.c
index f1cc3e9a8f6dc4c66e44b8e9697f05a53d733f9d..88a9304ea901138773fe9183ce1617cebb2f7e65 100644 (file)
  * 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 <http://www.gnu.org/licenses/>.
  */
 
-#include <config.h>
+#include "config.h"
+#include <string.h>
 #include "gtkmain.h"
 #include "gtkprivate.h"
 #include "gtkxembed.h"
+#include "gtkdebug.h"
+
 
 typedef struct _GtkXEmbedMessage GtkXEmbedMessage;
 
@@ -46,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];
@@ -67,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);
 }
 
 /**
@@ -122,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
@@ -139,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
@@ -212,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;
+    }
+}