]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtksocket-x11.c
Remove GtkObject completely
[~andy/gtk] / gtk / gtksocket-x11.c
index 12489088ea9b3ec841932e1f5daf8258cae88577..a1a32e229a3aa519a64f1bebc8359abbf05de16b 100644 (file)
@@ -37,6 +37,7 @@
 #include "gtksocket.h"
 #include "gtksocketprivate.h"
 #include "gtkdnd.h"
+#include "gtkdebug.h"
 
 #include "x11/gdkx.h"
 
@@ -45,7 +46,6 @@
 #endif
 
 #include "gtkxembed.h"
-#include "gtkalias.h"
 
 static gboolean xembed_get_info     (GdkWindow     *gdk_window,
                                     unsigned long *version,
@@ -57,22 +57,32 @@ static gboolean xembed_get_info     (GdkWindow     *gdk_window,
 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);
 }
 
@@ -111,7 +121,7 @@ _gtk_socket_windowing_size_request (GtkSocket *socket)
     }
   socket->have_size = TRUE;
   
-  gdk_error_trap_pop ();
+  gdk_error_trap_pop_ignored ();
 }
 
 void
@@ -120,7 +130,7 @@ _gtk_socket_windowing_send_key_event (GtkSocket *socket,
                                      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;
@@ -142,8 +152,7 @@ _gtk_socket_windowing_send_key_event (GtkSocket *socket,
              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
@@ -202,6 +211,7 @@ _gtk_socket_windowing_focus (GtkSocket       *socket,
 void
 _gtk_socket_windowing_send_configure_event (GtkSocket *socket)
 {
+  GtkAllocation allocation;
   XConfigureEvent xconfigure;
   gint x, y;
 
@@ -219,12 +229,13 @@ _gtk_socket_windowing_send_configure_event (GtkSocket *socket)
    */
   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;
@@ -234,8 +245,7 @@ _gtk_socket_windowing_send_configure_event (GtkSocket *socket)
   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
@@ -277,7 +287,7 @@ _gtk_socket_windowing_embed_notify (GtkSocket *socket)
 #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);
 }
 
@@ -286,7 +296,7 @@ xembed_get_info (GdkWindow     *window,
                 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;
@@ -295,14 +305,14 @@ xembed_get_info (GdkWindow     *window,
   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? */
@@ -564,8 +574,7 @@ _gtk_socket_windowing_filter_func (GdkXEvent *gdk_xevent,
                                         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"))
@@ -585,8 +594,7 @@ _gtk_socket_windowing_filter_func (GdkXEvent *gdk_xevent,
                        {
                          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);
                        }
@@ -598,10 +606,14 @@ _gtk_socket_windowing_filter_func (GdkXEvent *gdk_xevent,
       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);
            
@@ -612,7 +624,26 @@ _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 (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: