]> Pileus Git - ~andy/gtk/commitdiff
Handle reparenting out of a socket
authorMatthias Clasen <mclasen@redhat.com>
Sat, 28 Nov 2009 04:44:01 +0000 (23:44 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 28 Nov 2009 04:49:04 +0000 (23:49 -0500)
Although it isnt' allowed by the XEMBED protocol, its possible
that the plug window will be reparented out of the socket without
the socket having done so. See bug 123569. Patch by David Jander.

gtk/gtksocket-x11.c

index f6f3a3d489e2e19810f0e479f063858f185fc7dc..5dbde457a812b8cdc5e7d7454e61d42924becbfe 100644 (file)
@@ -620,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: