* 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;
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);
}
/**
/**
* _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
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
_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;
+ }
+}