* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
*/
-#include <config.h>
+#include "config.h"
#include <string.h>
#include "gdk/gdkkeysyms.h"
-#include "gtkalias.h"
#include "gtkmain.h"
#include "gtkmarshalers.h"
#include "gtkwindow.h"
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);
}
{
if (hints.flags & PMinSize)
{
- socket->request_width = hints.min_width;
- socket->request_height = hints.min_height;
+ socket->request_width = MAX (hints.min_width, 1);
+ socket->request_height = MAX (hints.min_height, 1);
}
else if (hints.flags & PBaseSize)
{
- socket->request_width = hints.base_width;
- socket->request_height = hints.base_height;
+ socket->request_width = MAX (hints.base_width, 1);
+ socket->request_height = MAX (hints.base_height, 1);
}
}
socket->have_size = TRUE;
GdkEvent *gdk_event,
gboolean mask_key_presses)
{
- XEvent xevent;
+ XKeyEvent xkey;
GdkScreen *screen = gdk_drawable_get_screen (socket->plug_window);
- xevent.xkey.type = (gdk_event->type == GDK_KEY_PRESS) ? KeyPress : KeyRelease;
- xevent.xkey.window = GDK_WINDOW_XWINDOW (socket->plug_window);
- xevent.xkey.root = GDK_WINDOW_XWINDOW (gdk_screen_get_root_window (screen));
- xevent.xkey.subwindow = None;
- xevent.xkey.time = gdk_event->key.time;
- xevent.xkey.x = 0;
- xevent.xkey.y = 0;
- xevent.xkey.x_root = 0;
- xevent.xkey.y_root = 0;
- xevent.xkey.state = gdk_event->key.state;
- xevent.xkey.keycode = gdk_event->key.hardware_keycode;
- xevent.xkey.same_screen = True;/* FIXME ? */
+ memset (&xkey, 0, sizeof (xkey));
+ xkey.type = (gdk_event->type == GDK_KEY_PRESS) ? KeyPress : KeyRelease;
+ xkey.window = GDK_WINDOW_XWINDOW (socket->plug_window);
+ xkey.root = GDK_WINDOW_XWINDOW (gdk_screen_get_root_window (screen));
+ xkey.subwindow = None;
+ xkey.time = gdk_event->key.time;
+ xkey.x = 0;
+ xkey.y = 0;
+ xkey.x_root = 0;
+ xkey.y_root = 0;
+ xkey.state = gdk_event->key.state;
+ xkey.keycode = gdk_event->key.hardware_keycode;
+ xkey.same_screen = True;/* FIXME ? */
gdk_error_trap_push ();
XSendEvent (GDK_WINDOW_XDISPLAY (socket->plug_window),
GDK_WINDOW_XWINDOW (socket->plug_window),
False,
(mask_key_presses ? KeyPressMask : NoEventMask),
- &xevent);
+ (XEvent *)&xkey);
gdk_display_sync (gdk_screen_get_display (screen));
gdk_error_trap_pop ();
}
void
_gtk_socket_windowing_send_configure_event (GtkSocket *socket)
{
- XEvent event;
+ XConfigureEvent xconfigure;
gint x, y;
g_return_if_fail (socket->plug_window != NULL);
- event.xconfigure.type = ConfigureNotify;
+ memset (&xconfigure, 0, sizeof (xconfigure));
+ xconfigure.type = ConfigureNotify;
- event.xconfigure.event = GDK_WINDOW_XWINDOW (socket->plug_window);
- event.xconfigure.window = GDK_WINDOW_XWINDOW (socket->plug_window);
+ xconfigure.event = GDK_WINDOW_XWINDOW (socket->plug_window);
+ xconfigure.window = GDK_WINDOW_XWINDOW (socket->plug_window);
/* The ICCCM says that synthetic events should have root relative
* coordinates. We still aren't really ICCCM compliant, since
gdk_window_get_origin (socket->plug_window, &x, &y);
gdk_error_trap_pop ();
- event.xconfigure.x = x;
- event.xconfigure.y = y;
- event.xconfigure.width = GTK_WIDGET(socket)->allocation.width;
- event.xconfigure.height = GTK_WIDGET(socket)->allocation.height;
+ xconfigure.x = x;
+ xconfigure.y = y;
+ xconfigure.width = GTK_WIDGET(socket)->allocation.width;
+ xconfigure.height = GTK_WIDGET(socket)->allocation.height;
- event.xconfigure.border_width = 0;
- event.xconfigure.above = None;
- event.xconfigure.override_redirect = False;
+ xconfigure.border_width = 0;
+ xconfigure.above = None;
+ xconfigure.override_redirect = False;
gdk_error_trap_push ();
XSendEvent (GDK_WINDOW_XDISPLAY (socket->plug_window),
GDK_WINDOW_XWINDOW (socket->plug_window),
- False, NoEventMask, &event);
+ False, NoEventMask, (XEvent *)&xconfigure);
gdk_display_sync (gtk_widget_get_display (GTK_WIDGET (socket)));
gdk_error_trap_pop ();
}
_gtk_socket_windowing_embed_notify (GtkSocket *socket)
{
#ifdef HAVE_XFIXES
- GdkDisplay *display = gtk_widget_get_display (GTK_WIDGET (socket);
+ GdkDisplay *display = gtk_widget_get_display (GTK_WIDGET (socket));
- XFixesChangeSaveSet (GDK_DISPLAY_XDISPLAY (display)),
+ XFixesChangeSaveSet (GDK_DISPLAY_XDISPLAY (display),
GDK_WINDOW_XWINDOW (socket->plug_window),
SetModeInsert, SaveSetRoot, SaveSetUnmap);
#endif
_gtk_socket_end_embedding (socket);
g_object_ref (widget);
- g_signal_emit_by_name (widget, "plug_removed", &result);
+ g_signal_emit_by_name (widget, "plug-removed", &result);
if (!result)
gtk_widget_destroy (widget);
g_object_unref (widget);
{
XReparentEvent *xre = &xevent->xreparent;
- GTK_NOTE (PLUGSOCKET, g_message ("GtkPlug: ReparentNotify received\n"));
+ GTK_NOTE (PLUGSOCKET, g_message ("GtkSocket - ReparentNotify received"));
if (!socket->plug_window && xre->parent == GDK_WINDOW_XWINDOW (widget->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 (widget->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: