#include "gtksocket.h"
#include "gtksocketprivate.h"
#include "gtkdnd.h"
+#include "gtkdebug.h"
#include "x11/gdkx.h"
#endif
#include "gtkxembed.h"
-#include "gtkalias.h"
static gboolean xembed_get_info (GdkWindow *gdk_window,
unsigned long *version,
GdkNativeWindow
_gtk_socket_windowing_get_id (GtkSocket *socket)
{
- return GDK_WINDOW_XWINDOW (GTK_WIDGET (socket)->window);
+ return GDK_WINDOW_XWINDOW (gtk_widget_get_window (GTK_WIDGET (socket)));
}
void
_gtk_socket_windowing_realize_window (GtkSocket *socket)
{
- GdkWindow *window = GTK_WIDGET (socket)->window;
+ GdkWindow *window;
XWindowAttributes xattrs;
+ window = gtk_widget_get_window (GTK_WIDGET (socket));
+
XGetWindowAttributes (GDK_WINDOW_XDISPLAY (window),
GDK_WINDOW_XWINDOW (window),
&xattrs);
+ /* Sooooo, it turns out that mozilla, as per the gtk2xt code selects
+ for input on the socket with a mask of 0x0fffff (for god knows why)
+ which includes ButtonPressMask causing a BadAccess if someone else
+ also selects for this. As per the client-side windows merge we always
+ normally selects for button press so we can emulate it on client
+ side children that selects for button press. However, we don't need
+ this for GtkSocket, so we unselect it here, fixing the crashes in
+ firefox. */
XSelectInput (GDK_WINDOW_XDISPLAY (window),
GDK_WINDOW_XWINDOW (window),
- xattrs.your_event_mask |
+ (xattrs.your_event_mask & ~ButtonPressMask) |
SubstructureNotifyMask | SubstructureRedirectMask);
}
}
socket->have_size = TRUE;
- gdk_error_trap_pop ();
+ gdk_error_trap_pop_ignored ();
}
void
gboolean mask_key_presses)
{
XKeyEvent xkey;
- GdkScreen *screen = gdk_drawable_get_screen (socket->plug_window);
+ GdkScreen *screen = gdk_window_get_screen (socket->plug_window);
memset (&xkey, 0, sizeof (xkey));
xkey.type = (gdk_event->type == GDK_KEY_PRESS) ? KeyPress : KeyRelease;
False,
(mask_key_presses ? KeyPressMask : NoEventMask),
(XEvent *)&xkey);
- gdk_display_sync (gdk_screen_get_display (screen));
- gdk_error_trap_pop ();
+ gdk_error_trap_pop_ignored ();
}
void
void
_gtk_socket_windowing_send_configure_event (GtkSocket *socket)
{
+ GtkAllocation allocation;
XConfigureEvent xconfigure;
gint x, y;
*/
gdk_error_trap_push ();
gdk_window_get_origin (socket->plug_window, &x, &y);
- gdk_error_trap_pop ();
-
+ gdk_error_trap_pop_ignored ();
+
+ gtk_widget_get_allocation (GTK_WIDGET(socket), &allocation);
xconfigure.x = x;
xconfigure.y = y;
- xconfigure.width = GTK_WIDGET(socket)->allocation.width;
- xconfigure.height = GTK_WIDGET(socket)->allocation.height;
+ xconfigure.width = allocation.width;
+ xconfigure.height = allocation.height;
xconfigure.border_width = 0;
xconfigure.above = None;
XSendEvent (GDK_WINDOW_XDISPLAY (socket->plug_window),
GDK_WINDOW_XWINDOW (socket->plug_window),
False, NoEventMask, (XEvent *)&xconfigure);
- gdk_display_sync (gtk_widget_get_display (GTK_WIDGET (socket)));
- gdk_error_trap_pop ();
+ gdk_error_trap_pop_ignored ();
}
void
#endif
_gtk_xembed_send_message (socket->plug_window,
XEMBED_EMBEDDED_NOTIFY, 0,
- GDK_WINDOW_XWINDOW (GTK_WIDGET (socket)->window),
+ GDK_WINDOW_XWINDOW (gtk_widget_get_window (GTK_WIDGET (socket))),
socket->xembed_version);
}
unsigned long *version,
unsigned long *flags)
{
- GdkDisplay *display = gdk_drawable_get_display (window);
+ GdkDisplay *display = gdk_window_get_display (window);
Atom xembed_info_atom = gdk_x11_get_xatom_by_name_for_display (display, "_XEMBED_INFO");
Atom type;
int format;
unsigned long *data_long;
int status;
- gdk_error_trap_push();
+ gdk_error_trap_push ();
status = XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display),
GDK_WINDOW_XWINDOW (window),
xembed_info_atom,
0, 2, False,
xembed_info_atom, &type, &format,
&nitems, &bytes_after, &data);
- gdk_error_trap_pop();
+ gdk_error_trap_pop_ignored ();
if (status != Success)
return FALSE; /* Window vanished? */
socket->plug_window,
protocol, TRUE);
- gdk_display_sync (display);
- gdk_error_trap_pop ();
+ gdk_error_trap_pop_ignored ();
return_val = GDK_FILTER_REMOVE;
}
else if (xevent->xproperty.atom == gdk_x11_get_xatom_by_name_for_display (display, "_XEMBED_INFO"))
{
gdk_error_trap_push ();
gdk_window_show (socket->plug_window);
- gdk_flush ();
- gdk_error_trap_pop ();
+ gdk_error_trap_pop_ignored ();
_gtk_socket_unmap_notify (socket);
}
break;
case ReparentNotify:
{
+ GdkWindow *window;
XReparentEvent *xre = &xevent->xreparent;
- GTK_NOTE (PLUGSOCKET, g_message ("GtkPlug: ReparentNotify received\n"));
- if (!socket->plug_window && xre->parent == GDK_WINDOW_XWINDOW (widget->window))
+ window = gtk_widget_get_window (widget);
+
+ GTK_NOTE (PLUGSOCKET, g_message ("GtkSocket - ReparentNotify received"));
+ if (!socket->plug_window &&
+ xre->parent == GDK_WINDOW_XWINDOW (window))
{
_gtk_socket_add_window (socket, xre->window, FALSE);
return_val = GDK_FILTER_REMOVE;
}
-
+ else
+ {
+ if (socket->plug_window &&
+ xre->window == GDK_WINDOW_XWINDOW (socket->plug_window) &&
+ xre->parent != GDK_WINDOW_XWINDOW (window))
+ {
+ gboolean result;
+
+ _gtk_socket_end_embedding (socket);
+
+ g_object_ref (widget);
+ g_signal_emit_by_name (widget, "plug-removed", &result);
+ if (!result)
+ gtk_widget_destroy (widget);
+ g_object_unref (widget);
+
+ return_val = GDK_FILTER_REMOVE;
+ }
+ }
+
break;
}
case UnmapNotify: