]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkplug.c
gtkfilechooserbutton: In tests, allow the possibility of doing unselect_all
[~andy/gtk] / gtk / gtkplug.c
index e0c38366912e3f8539b2d1110ec5dee97d11b459..01fc9799e5225122b89be82f71bcc7932ae11edb 100644 (file)
@@ -12,8 +12,7 @@
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free
- * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.Free
  */
 
 /* By Owen Taylor <otaylor@gtk.org>              98/4/4 */
@@ -248,7 +247,6 @@ gtk_plug_init (GtkPlug *plug)
 
 /**
  * gtk_plug_handle_modality_on:
- *
  * @plug: a #GtkPlug
  *
  * Called from the GtkPlug backend when the corresponding socket has
@@ -272,7 +270,6 @@ gtk_plug_handle_modality_on (GtkPlug *plug)
 
 /**
  * gtk_plug_handle_modality_off:
- *
  * @plug: a #GtkPlug
  *
  * Called from the GtkPlug backend when the corresponding socket has
@@ -444,16 +441,16 @@ _gtk_plug_add_to_socket (GtkPlug   *plug,
   g_signal_emit_by_name (socket_, "plug-added");
 }
 
-/**
- * _gtk_plug_send_delete_event:
+/*
+ * gtk_plug_send_delete_event:
  * @widget: a #GtkWidget
  *
  * Send a GDK_DELETE event to the @widget and destroy it if
  * necessary. Internal GTK function, called from this file or the
  * backend-specific GtkPlug implementation.
  */
-void
-_gtk_plug_send_delete_event (GtkWidget *widget)
+static void
+gtk_plug_send_delete_event (GtkWidget *widget)
 {
   GdkEvent *event = gdk_event_new (GDK_DELETE);
 
@@ -533,7 +530,7 @@ _gtk_plug_remove_from_socket (GtkPlug   *plug,
     gtk_widget_destroy (GTK_WIDGET (socket_));
 
   if (window)
-    _gtk_plug_send_delete_event (widget);
+    gtk_plug_send_delete_event (widget);
 
   g_object_unref (plug);
 
@@ -680,7 +677,7 @@ gtk_plug_unrealize (GtkWidget *widget)
 
   if (priv->socket_window != NULL)
     {
-      gdk_window_set_user_data (priv->socket_window, NULL);
+      gtk_widget_unregister_window (widget, priv->socket_window);
       g_object_unref (priv->socket_window);
       priv->socket_window = NULL;
 
@@ -720,7 +717,6 @@ xembed_set_info (GdkWindow     *window,
 
 /**
  * gtk_plug_focus_first_last:
- *
  * @plug: a #GtkPlug
  * @direction: a direction
  *
@@ -883,7 +879,7 @@ gtk_plug_filter_func (GdkXEvent *gdk_xevent,
              {
                GtkWidget *widget = GTK_WIDGET (plug);
 
-                gdk_window_set_user_data (priv->socket_window, NULL);
+                gtk_widget_unregister_window (widget, priv->socket_window);
                g_object_unref (priv->socket_window);
                priv->socket_window = NULL;
 
@@ -899,7 +895,7 @@ gtk_plug_filter_func (GdkXEvent *gdk_xevent,
                if (xre->parent == GDK_WINDOW_XID (gdk_screen_get_root_window (screen)))
                  {
                    GTK_NOTE (PLUGSOCKET, g_message ("GtkPlug: calling gtk_plug_send_delete_event()"));
-                   _gtk_plug_send_delete_event (widget);
+                   gtk_plug_send_delete_event (widget);
 
                    g_object_notify (G_OBJECT (plug), "embedded");
                  }
@@ -986,6 +982,10 @@ gtk_plug_filter_func (GdkXEvent *gdk_xevent,
         gdk_event_set_device (event, keyboard);
 
         keymap = gdk_keymap_get_for_display (display);
+
+        event->key.group = gdk_x11_keymap_get_group_for_state (keymap, xevent->xkey.state);
+        event->key.is_modifier = gdk_x11_keymap_key_is_modifier (keymap, event->key.hardware_keycode);
+
         gdk_keymap_translate_keyboard_state (keymap,
                                              event->key.hardware_keycode,
                                              event->key.state,
@@ -1000,10 +1000,6 @@ gtk_plug_filter_func (GdkXEvent *gdk_xevent,
         event->key.length = 0;
         event->key.string = g_strdup ("");
 
-        /* FIXME: These should be filled in properly */
-        event->key.group = 0;
-        event->key.is_modifier = FALSE;
-
         return_val = GDK_FILTER_TRANSLATE;
       }
     }
@@ -1092,12 +1088,10 @@ gtk_plug_realize (GtkWidget *widget)
       gtk_widget_set_window (widget, gdk_window);
     }
 
-  gdk_window_set_user_data (gdk_window, window);
+  gtk_widget_register_window (widget, gdk_window);
 
   gtk_style_context_set_background (gtk_widget_get_style_context (widget),
                                     gdk_window);
-
-  gdk_window_enable_synchronized_configure (gdk_window);
 }
 
 static void
@@ -1131,14 +1125,14 @@ gtk_plug_map (GtkWidget *widget)
       GtkBin *bin = GTK_BIN (widget);
       GtkPlug *plug = GTK_PLUG (widget);
       GtkWidget *child;
-      
+
       gtk_widget_set_mapped (widget, TRUE);
 
       child = gtk_bin_get_child (bin);
       if (child != NULL &&
           gtk_widget_get_visible (child) &&
-         !gtk_widget_get_mapped (child))
-       gtk_widget_map (child);
+          !gtk_widget_get_mapped (child))
+        gtk_widget_map (child);
 
       xembed_set_info (gtk_widget_get_window (GTK_WIDGET (plug)), XEMBED_MAPPED);
 
@@ -1157,6 +1151,7 @@ gtk_plug_unmap (GtkWidget *widget)
     {
       GtkPlug *plug = GTK_PLUG (widget);
       GdkWindow *window;
+      GtkWidget *child;
 
       window = gtk_widget_get_window (widget);
 
@@ -1164,6 +1159,10 @@ gtk_plug_unmap (GtkWidget *widget)
 
       gdk_window_hide (window);
 
+      child = gtk_bin_get_child (GTK_BIN (widget));
+      if (child != NULL)
+        gtk_widget_unmap (child);
+
       xembed_set_info (gtk_widget_get_window (GTK_WIDGET (plug)), 0);
 
       gdk_synthesize_window_state (window,