]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtksocket-x11.c
Add comment explaining why we set the hard margins to 0 for n-up
[~andy/gtk] / gtk / gtksocket-x11.c
index 5dad07eeeb4d1c11df8230e401be5d49c3214b8d..5dbde457a812b8cdc5e7d7454e61d42924becbfe 100644 (file)
  * 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"
@@ -71,9 +70,17 @@ _gtk_socket_windowing_realize_window (GtkSocket *socket)
                        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);
 }
 
@@ -101,13 +108,13 @@ _gtk_socket_windowing_size_request (GtkSocket *socket)
     {
       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;
@@ -120,28 +127,29 @@ _gtk_socket_windowing_send_key_event (GtkSocket *socket,
                                      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 ();
 }
@@ -202,15 +210,16 @@ _gtk_socket_windowing_focus (GtkSocket       *socket,
 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
@@ -220,19 +229,19 @@ _gtk_socket_windowing_send_configure_event (GtkSocket *socket)
   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 ();
 }
@@ -268,9 +277,9 @@ void
 _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
@@ -505,7 +514,7 @@ _gtk_socket_windowing_filter_func (GdkXEvent *gdk_xevent,
            _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);
@@ -599,7 +608,7 @@ _gtk_socket_windowing_filter_func (GdkXEvent *gdk_xevent,
       {
        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);
@@ -611,7 +620,24 @@ _gtk_socket_windowing_filter_func (GdkXEvent *gdk_xevent,
            
            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: