]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkwindow.c
File containing #defines for XEMBED protocol.
[~andy/gtk] / gtk / gtkwindow.c
index e03cc71fd38204a6ae40b2993f7d32af8c1dc051..52654dab0864ef63561e05afa6af17693fb754ee 100644 (file)
@@ -2248,13 +2248,9 @@ static gint
 gtk_window_focus_in_event (GtkWidget     *widget,
                           GdkEventFocus *event)
 {
-  GtkWindow *window;
+  GtkWindow *window = GTK_WINDOW (widget);
   GdkEventFocus fevent;
 
-  g_return_val_if_fail (widget != NULL, FALSE);
-  g_return_val_if_fail (GTK_IS_WINDOW (widget), FALSE);
-  g_return_val_if_fail (event != NULL, FALSE);
-
   /* It appears spurious focus in events can occur when
    *  the window is hidden. So we'll just check to see if
    *  the window is visible before actually handling the
@@ -2262,7 +2258,8 @@ gtk_window_focus_in_event (GtkWidget     *widget,
    */
   if (GTK_WIDGET_VISIBLE (widget))
     {
-      window = GTK_WINDOW (widget);
+      window->has_focus = TRUE;
+      
       if (window->focus_widget &&
          window->focus_widget != widget &&
          !GTK_WIDGET_HAS_FOCUS (window->focus_widget))
@@ -2282,14 +2279,11 @@ static gint
 gtk_window_focus_out_event (GtkWidget     *widget,
                            GdkEventFocus *event)
 {
-  GtkWindow *window;
+  GtkWindow *window = GTK_WINDOW (widget);
   GdkEventFocus fevent;
 
-  g_return_val_if_fail (widget != NULL, FALSE);
-  g_return_val_if_fail (GTK_IS_WINDOW (widget), FALSE);
-  g_return_val_if_fail (event != NULL, FALSE);
-
-  window = GTK_WINDOW (widget);
+  window->has_focus = FALSE;
+  
   if (window->focus_widget &&
       window->focus_widget != widget &&
       GTK_WIDGET_HAS_FOCUS (window->focus_widget))
@@ -2456,32 +2450,29 @@ gtk_window_real_set_focus (GtkWindow *window,
   
   if (window->focus_widget)
     {
-      event.type = GDK_FOCUS_CHANGE;
-      event.window = window->focus_widget->window;
-      event.in = FALSE;
-      
       if (GTK_WIDGET_RECEIVES_DEFAULT (window->focus_widget) &&
          (window->focus_widget != window->default_widget))
         {
          GTK_WIDGET_UNSET_FLAGS (window->focus_widget, GTK_HAS_DEFAULT);
-         /* if any widget had the default set there should be
-            a default_widget, but might not so this is a sanity
-            check */
+
          if (window->default_widget)
            GTK_WIDGET_SET_FLAGS (window->default_widget, GTK_HAS_DEFAULT);
         }
-       
-      gtk_widget_event (window->focus_widget, (GdkEvent*) &event);
+
+      if (window->has_focus)
+       {
+         event.type = GDK_FOCUS_CHANGE;
+         event.window = window->focus_widget->window;
+         event.in = FALSE;
+         
+         gtk_widget_event (window->focus_widget, (GdkEvent*) &event);
+       }
     }
   
   window->focus_widget = focus;
   
   if (window->focus_widget)
     {
-      event.type = GDK_FOCUS_CHANGE;
-      event.window = window->focus_widget->window;
-      event.in = TRUE;
-
       if (GTK_WIDGET_RECEIVES_DEFAULT (window->focus_widget) &&
          (window->focus_widget != window->default_widget))
        {
@@ -2491,8 +2482,15 @@ gtk_window_real_set_focus (GtkWindow *window,
          if (window->default_widget)
            GTK_WIDGET_UNSET_FLAGS (window->default_widget, GTK_HAS_DEFAULT);
        }
-      
-      gtk_widget_event (window->focus_widget, (GdkEvent*) &event);
+
+      if (window->has_focus)
+       {
+         event.type = GDK_FOCUS_CHANGE;
+         event.window = window->focus_widget->window;
+         event.in = TRUE;
+         
+         gtk_widget_event (window->focus_widget, (GdkEvent*) &event);
+       }
     }
   
   if (window->default_widget &&