]> Pileus Git - ~andy/gtk/commitdiff
Changes to support do-not-focus-on-map hint in conjunction with
authorElijah Newren <newren@math.utah.edu>
Thu, 6 May 2004 02:57:01 +0000 (02:57 +0000)
committerElijah Newren <newren@src.gnome.org>
Thu, 6 May 2004 02:57:01 +0000 (02:57 +0000)
2004-05-05  Elijah Newren  <newren@math.utah.edu>

Changes to support do-not-focus-on-map hint in conjunction with
_NET_WM_USER_TIME (#115650):

* gdk/gdkwindow.h (struct _GdkWindowObject): Add a new boolean
field focus_on_map

* gdk/gdkwindow.h (gdk_window_set_accept_focus): New function to
set it.

* gtk/gtkwindow.[hc]: Add a boolean property "focus_on_map"
and gtk_window_get_focus_on_map() and gtk_window_set_focus_on_map().

* gdk/win32/gdkwindow-win32.c (gdk_window_new):
* gdk/linux-fb/gdkwindow-fb.c (gdk_window_new):
* gdk/x11/gdkwindow-x11.c (gdk_window_new):
Initialize the focus_on_map field to TRUE.

* gdk/win32/gdkwindow-win32.c (gdk_window_set_focus_on_map):
* gdk/linux-fb/gdkwindow-fb.c (gdk_window_set_focus_on_map):
* gdk/x11/gdkwindow-x11.c (gdk_window_set_focus_on_map):
* gdk/x11/gdkwindow-x11.c (setup_toplevel_window):
Implementations for the various backends. The Win32 and linux-fb
implementations set the focus_on_map field, but don't use it yet
to actually implement noinput windows. The X implementation sets
_NET_WM_USER_TIME to 0 if focus_on_map is FALSE (see the EWMH).

* gdk/x11/gdkwindow-x11.h:
* gdk/x11/gdkevents-x11.c (set_user_time):
* gdk/x11/gdkinput-x11.c (_gdk_input_common_other_event):
* gdk/x11/gdkwindow-x11.c (gdk_x11_window_set_user_time):
s/_gdk_x11_window_set_user_time/gdk_x11_window_set_user_time/,
since we want that function to be part of the public API.

17 files changed:
ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-6
ChangeLog.pre-2-8
docs/reference/gdk/gdk-sections.txt
docs/reference/gdk/tmpl/windows.sgml
docs/reference/gtk/gtk-sections.txt
docs/reference/gtk/tmpl/gtkwindow.sgml
gdk/gdkwindow.h
gdk/linux-fb/gdkwindow-fb.c
gdk/win32/gdkwindow-win32.c
gdk/x11/gdkevents-x11.c
gdk/x11/gdkinput-x11.c
gdk/x11/gdkwindow-x11.c
gdk/x11/gdkwindow-x11.h
gtk/gtkwindow.c
gtk/gtkwindow.h

index 3a0d83f8d46c92c6db7398fb865bb60155d2f1fc..359460a5ab2ee566f9d7c5affbea8c50a7f157d7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,38 @@
+2004-05-05  Elijah Newren  <newren@math.utah.edu>
+
+       Changes to support do-not-focus-on-map hint in conjunction with
+       _NET_WM_USER_TIME (#115650):
+
+       * gdk/gdkwindow.h (struct _GdkWindowObject): Add a new boolean
+       field focus_on_map
+       
+       * gdk/gdkwindow.h (gdk_window_set_accept_focus): New function to
+       set it.
+
+       * gtk/gtkwindow.[hc]: Add a boolean property "focus_on_map"
+       and gtk_window_get_focus_on_map() and gtk_window_set_focus_on_map().
+
+       * gdk/win32/gdkwindow-win32.c (gdk_window_new): 
+       * gdk/linux-fb/gdkwindow-fb.c (gdk_window_new): 
+       * gdk/x11/gdkwindow-x11.c (gdk_window_new):
+       Initialize the focus_on_map field to TRUE.
+
+       * gdk/win32/gdkwindow-win32.c (gdk_window_set_focus_on_map): 
+       * gdk/linux-fb/gdkwindow-fb.c (gdk_window_set_focus_on_map): 
+       * gdk/x11/gdkwindow-x11.c (gdk_window_set_focus_on_map): 
+       * gdk/x11/gdkwindow-x11.c (setup_toplevel_window):
+       Implementations for the various backends. The Win32 and linux-fb
+       implementations set the focus_on_map field, but don't use it yet
+       to actually implement noinput windows. The X implementation sets
+       _NET_WM_USER_TIME to 0 if focus_on_map is FALSE (see the EWMH).
+
+       * gdk/x11/gdkwindow-x11.h: 
+       * gdk/x11/gdkevents-x11.c (set_user_time): 
+       * gdk/x11/gdkinput-x11.c (_gdk_input_common_other_event): 
+       * gdk/x11/gdkwindow-x11.c (gdk_x11_window_set_user_time): 
+       s/_gdk_x11_window_set_user_time/gdk_x11_window_set_user_time/,
+       since we want that function to be part of the public API.
+
 Wed May  5 22:20:21 2004  Matthias Clasen  <maclas@gmx.de>
 
        Merge from 2.4:
index 3a0d83f8d46c92c6db7398fb865bb60155d2f1fc..359460a5ab2ee566f9d7c5affbea8c50a7f157d7 100644 (file)
@@ -1,3 +1,38 @@
+2004-05-05  Elijah Newren  <newren@math.utah.edu>
+
+       Changes to support do-not-focus-on-map hint in conjunction with
+       _NET_WM_USER_TIME (#115650):
+
+       * gdk/gdkwindow.h (struct _GdkWindowObject): Add a new boolean
+       field focus_on_map
+       
+       * gdk/gdkwindow.h (gdk_window_set_accept_focus): New function to
+       set it.
+
+       * gtk/gtkwindow.[hc]: Add a boolean property "focus_on_map"
+       and gtk_window_get_focus_on_map() and gtk_window_set_focus_on_map().
+
+       * gdk/win32/gdkwindow-win32.c (gdk_window_new): 
+       * gdk/linux-fb/gdkwindow-fb.c (gdk_window_new): 
+       * gdk/x11/gdkwindow-x11.c (gdk_window_new):
+       Initialize the focus_on_map field to TRUE.
+
+       * gdk/win32/gdkwindow-win32.c (gdk_window_set_focus_on_map): 
+       * gdk/linux-fb/gdkwindow-fb.c (gdk_window_set_focus_on_map): 
+       * gdk/x11/gdkwindow-x11.c (gdk_window_set_focus_on_map): 
+       * gdk/x11/gdkwindow-x11.c (setup_toplevel_window):
+       Implementations for the various backends. The Win32 and linux-fb
+       implementations set the focus_on_map field, but don't use it yet
+       to actually implement noinput windows. The X implementation sets
+       _NET_WM_USER_TIME to 0 if focus_on_map is FALSE (see the EWMH).
+
+       * gdk/x11/gdkwindow-x11.h: 
+       * gdk/x11/gdkevents-x11.c (set_user_time): 
+       * gdk/x11/gdkinput-x11.c (_gdk_input_common_other_event): 
+       * gdk/x11/gdkwindow-x11.c (gdk_x11_window_set_user_time): 
+       s/_gdk_x11_window_set_user_time/gdk_x11_window_set_user_time/,
+       since we want that function to be part of the public API.
+
 Wed May  5 22:20:21 2004  Matthias Clasen  <maclas@gmx.de>
 
        Merge from 2.4:
index 3a0d83f8d46c92c6db7398fb865bb60155d2f1fc..359460a5ab2ee566f9d7c5affbea8c50a7f157d7 100644 (file)
@@ -1,3 +1,38 @@
+2004-05-05  Elijah Newren  <newren@math.utah.edu>
+
+       Changes to support do-not-focus-on-map hint in conjunction with
+       _NET_WM_USER_TIME (#115650):
+
+       * gdk/gdkwindow.h (struct _GdkWindowObject): Add a new boolean
+       field focus_on_map
+       
+       * gdk/gdkwindow.h (gdk_window_set_accept_focus): New function to
+       set it.
+
+       * gtk/gtkwindow.[hc]: Add a boolean property "focus_on_map"
+       and gtk_window_get_focus_on_map() and gtk_window_set_focus_on_map().
+
+       * gdk/win32/gdkwindow-win32.c (gdk_window_new): 
+       * gdk/linux-fb/gdkwindow-fb.c (gdk_window_new): 
+       * gdk/x11/gdkwindow-x11.c (gdk_window_new):
+       Initialize the focus_on_map field to TRUE.
+
+       * gdk/win32/gdkwindow-win32.c (gdk_window_set_focus_on_map): 
+       * gdk/linux-fb/gdkwindow-fb.c (gdk_window_set_focus_on_map): 
+       * gdk/x11/gdkwindow-x11.c (gdk_window_set_focus_on_map): 
+       * gdk/x11/gdkwindow-x11.c (setup_toplevel_window):
+       Implementations for the various backends. The Win32 and linux-fb
+       implementations set the focus_on_map field, but don't use it yet
+       to actually implement noinput windows. The X implementation sets
+       _NET_WM_USER_TIME to 0 if focus_on_map is FALSE (see the EWMH).
+
+       * gdk/x11/gdkwindow-x11.h: 
+       * gdk/x11/gdkevents-x11.c (set_user_time): 
+       * gdk/x11/gdkinput-x11.c (_gdk_input_common_other_event): 
+       * gdk/x11/gdkwindow-x11.c (gdk_x11_window_set_user_time): 
+       s/_gdk_x11_window_set_user_time/gdk_x11_window_set_user_time/,
+       since we want that function to be part of the public API.
+
 Wed May  5 22:20:21 2004  Matthias Clasen  <maclas@gmx.de>
 
        Merge from 2.4:
index 3a0d83f8d46c92c6db7398fb865bb60155d2f1fc..359460a5ab2ee566f9d7c5affbea8c50a7f157d7 100644 (file)
@@ -1,3 +1,38 @@
+2004-05-05  Elijah Newren  <newren@math.utah.edu>
+
+       Changes to support do-not-focus-on-map hint in conjunction with
+       _NET_WM_USER_TIME (#115650):
+
+       * gdk/gdkwindow.h (struct _GdkWindowObject): Add a new boolean
+       field focus_on_map
+       
+       * gdk/gdkwindow.h (gdk_window_set_accept_focus): New function to
+       set it.
+
+       * gtk/gtkwindow.[hc]: Add a boolean property "focus_on_map"
+       and gtk_window_get_focus_on_map() and gtk_window_set_focus_on_map().
+
+       * gdk/win32/gdkwindow-win32.c (gdk_window_new): 
+       * gdk/linux-fb/gdkwindow-fb.c (gdk_window_new): 
+       * gdk/x11/gdkwindow-x11.c (gdk_window_new):
+       Initialize the focus_on_map field to TRUE.
+
+       * gdk/win32/gdkwindow-win32.c (gdk_window_set_focus_on_map): 
+       * gdk/linux-fb/gdkwindow-fb.c (gdk_window_set_focus_on_map): 
+       * gdk/x11/gdkwindow-x11.c (gdk_window_set_focus_on_map): 
+       * gdk/x11/gdkwindow-x11.c (setup_toplevel_window):
+       Implementations for the various backends. The Win32 and linux-fb
+       implementations set the focus_on_map field, but don't use it yet
+       to actually implement noinput windows. The X implementation sets
+       _NET_WM_USER_TIME to 0 if focus_on_map is FALSE (see the EWMH).
+
+       * gdk/x11/gdkwindow-x11.h: 
+       * gdk/x11/gdkevents-x11.c (set_user_time): 
+       * gdk/x11/gdkinput-x11.c (_gdk_input_common_other_event): 
+       * gdk/x11/gdkwindow-x11.c (gdk_x11_window_set_user_time): 
+       s/_gdk_x11_window_set_user_time/gdk_x11_window_set_user_time/,
+       since we want that function to be part of the public API.
+
 Wed May  5 22:20:21 2004  Matthias Clasen  <maclas@gmx.de>
 
        Merge from 2.4:
index dd665b8f26443f0f92a5b6bfff3051dff5cdc99a..b0db5e301e3b093251ec5a22d9eccbe1591d011b 100644 (file)
@@ -665,6 +665,7 @@ gdk_window_get_internal_paint_info
 gdk_window_set_user_data
 gdk_window_set_override_redirect
 gdk_window_set_accept_focus
+gdk_window_set_focus_on_map
 gdk_window_add_filter
 gdk_window_remove_filter
 GdkFilterFunc
index 8a264b23df3347e8fa0397c735d240863b5a792b..b12ca3554c860d5b4cb0cc0c94f7f1df780d7812 100644 (file)
@@ -750,6 +750,15 @@ Registers a window as a potential drop destination.
 @accept_focus: 
 
 
+<!-- ##### FUNCTION gdk_window_set_focus_on_map ##### -->
+<para>
+
+</para>
+
+@window: 
+@focus_on_map: 
+
+
 <!-- ##### FUNCTION gdk_window_add_filter ##### -->
 <para>
 
index 229334b94820a9e0d050a93a6d637990f2d9fe0a..51c453a8de9da1f6a06c82e75cab1fbc625c4759 100644 (file)
@@ -4419,6 +4419,7 @@ gtk_window_set_type_hint
 gtk_window_set_skip_taskbar_hint
 gtk_window_set_skip_pager_hint
 gtk_window_set_accept_focus
+gtk_window_set_focus_on_map
 gtk_window_get_decorated
 gtk_window_get_default_icon_list
 gtk_window_get_default_size
@@ -4438,6 +4439,7 @@ gtk_window_get_type_hint
 gtk_window_get_skip_taskbar_hint
 gtk_window_get_skip_pager_hint
 gtk_window_get_accept_focus
+gtk_window_get_focus_on_map
 gtk_window_move
 gtk_window_parse_geometry
 gtk_window_reshow_with_initial_size
index 38431d32bb9899f23fac75df9546ec8285776e89..9c7adfc0b6dadfc8091fe3418fc13dd0e25f3e97 100644 (file)
@@ -736,6 +736,15 @@ Deprecated alias for gtk_window_set_position().
 @setting: 
 
 
+<!-- ##### FUNCTION gtk_window_set_focus_on_map ##### -->
+<para>
+
+</para>
+
+@window: 
+@setting: 
+
+
 <!-- ##### FUNCTION gtk_window_get_decorated ##### -->
 <para>
 
index bbc54c881c56b20de4a3d646664cbc488b01d38b..83ce70391adc5c701e0c35abf0235cde066815f5 100644 (file)
@@ -262,6 +262,7 @@ struct _GdkWindowObject
   guint destroyed : 2;
 
   guint accept_focus : 1;
+  guint focus_on_map : 1;
   
   GdkEventMask event_mask;
 };
@@ -321,6 +322,8 @@ void          gdk_window_set_override_redirect (GdkWindow     *window,
                                                 gboolean       override_redirect);
 void          gdk_window_set_accept_focus      (GdkWindow     *window,
                                                gboolean       accept_focus);
+void          gdk_window_set_focus_on_map      (GdkWindow     *window,
+                                               gboolean       focus_on_map);
 void          gdk_window_add_filter            (GdkWindow     *window,
                                                 GdkFilterFunc  function,
                                                 gpointer       data);
index 88af19f0c3562f1e29ac047e8f102ca1e277d330..6f746df491fb8b821b475026d7ab2ccaf742d9da 100644 (file)
@@ -189,6 +189,7 @@ gdk_window_new (GdkWindow     *parent,
   private->parent = parent_private;
 
   private->accept_focus = TRUE;
+  private->focus_on_map = TRUE;
 
   if (attributes_mask & GDK_WA_X)
     x = attributes->x;
@@ -2008,6 +2009,22 @@ gdk_window_set_accept_focus (GdkWindow *window,
     private->accept_focus = accept_focus;
 }
 
+void
+gdk_window_set_focus_on_map (GdkWindow *window,
+                            gboolean focus_on_map)
+{
+  GdkWindowObject *private;
+  g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
+  private = (GdkWindowObject *)window;  
+  
+  focus_on_map = focus_on_map != FALSE;
+
+  if (private->focus_on_map != focus_on_map)
+    private->focus_on_map = focus_on_map;
+}
+
 void          
 gdk_window_set_icon (GdkWindow *window, 
                     GdkWindow *icon_window,
index ae67429e6c86bb96d503c2c556a3883f2e4cc6fd..79813cd67c1a31f54b6e8d46edf7e12ae8062c2d 100644 (file)
@@ -508,6 +508,7 @@ gdk_window_new (GdkWindow     *parent,
   private->parent = (GdkWindowObject *)parent;
 
   private->accept_focus = TRUE;
+  private->focus_on_map = TRUE;
 
   if (attributes_mask & GDK_WA_X)
     private->x = attributes->x;
@@ -2228,6 +2229,22 @@ gdk_window_set_accept_focus (GdkWindow *window,
     private->accept_focus = accept_focus;
 }
 
+void
+gdk_window_set_focus_on_map (GdkWindow *window,
+                            gboolean focus_on_map)
+{
+  GdkWindowObject *private;
+  g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
+  private = (GdkWindowObject *)window;  
+  
+  focus_on_map = focus_on_map != FALSE;
+
+  if (private->focus_on_map != focus_on_map)
+    private->focus_on_map = focus_on_map;
+}
+
 static HICON
 pixbuf_to_hicon_alpha_winxp (GdkWindow *window,
                             GdkPixbuf *pixbuf)
index 37112363b79f365f488e8ce9a595d4231237b010..6f31369af48e0114e53b1253d6d749bb932e4e36 100644 (file)
@@ -815,8 +815,8 @@ set_user_time (GdkWindow *window,
    * to update the latest user interaction time.
    */
   if (gdk_event_get_time (event) != GDK_CURRENT_TIME)
-    _gdk_x11_window_set_user_time (gdk_window_get_toplevel (window),
-                                  gdk_event_get_time (event));
+    gdk_x11_window_set_user_time (gdk_window_get_toplevel (window),
+                                  gdk_event_get_time (event));
 }
 
 static gboolean
index f25ca8fd24c230a6b8fa1bd452193efbe7372e4b..a920c27df5cb1b259a2abbc046cc50a6085c89e8 100644 (file)
@@ -588,8 +588,8 @@ _gdk_input_common_other_event (GdkEvent         *event,
        * a valid timestamp.
        */
       if (gdk_event_get_time (event) != GDK_CURRENT_TIME)
-        _gdk_x11_window_set_user_time (gdk_window_get_toplevel (input_window->window),
-                                      gdk_event_get_time (event));
+        gdk_x11_window_set_user_time (gdk_window_get_toplevel (input_window->window),
+                                      gdk_event_get_time (event));
       return TRUE;
   }
 
@@ -654,8 +654,8 @@ _gdk_input_common_other_event (GdkEvent         *event,
        * a valid timestamp.
        */
       if (gdk_event_get_time (event) != GDK_CURRENT_TIME)
-        _gdk_x11_window_set_user_time (gdk_window_get_toplevel (input_window->window),
-                                      gdk_event_get_time (event));
+        gdk_x11_window_set_user_time (gdk_window_get_toplevel (input_window->window),
+                                      gdk_event_get_time (event));
       return TRUE;
     }
 
@@ -690,8 +690,8 @@ _gdk_input_common_other_event (GdkEvent         *event,
        * a valid timestamp.
        */
       if (gdk_event_get_time (event) != GDK_CURRENT_TIME)
-        _gdk_x11_window_set_user_time (gdk_window_get_toplevel (input_window->window),
-                                      gdk_event_get_time (event));
+        gdk_x11_window_set_user_time (gdk_window_get_toplevel (input_window->window),
+                                      gdk_event_get_time (event));
       return TRUE;
     }
 
@@ -710,8 +710,8 @@ _gdk_input_common_other_event (GdkEvent         *event,
        * a valid timestamp.
        */
       if (gdk_event_get_time (event) != GDK_CURRENT_TIME)
-        _gdk_x11_window_set_user_time (gdk_window_get_toplevel (input_window->window),
-                                      gdk_event_get_time (event));
+        gdk_x11_window_set_user_time (gdk_window_get_toplevel (input_window->window),
+                                      gdk_event_get_time (event));
       return TRUE;
   }
 
index da96795477f07c0094b3a6360662493bfe4b1c0d..39e97d2b1e325cf2f0eb88e43bb2fa557b0b4796 100644 (file)
@@ -458,8 +458,10 @@ setup_toplevel_window (GdkWindow *window, GdkWindow *parent)
                   XA_WINDOW, 32, PropModeReplace,
                   (guchar *) &GDK_DISPLAY_X11 (screen_x11->display)->leader_window, 1);
 
-  if (GDK_DISPLAY_X11 (screen_x11->display)->user_time != 0)
-    _gdk_x11_window_set_user_time (window, GDK_DISPLAY_X11 (screen_x11->display)->user_time);
+  if (!obj->focus_on_map)
+    gdk_x11_window_set_user_time(window, 0);
+  else if (GDK_DISPLAY_X11 (screen_x11->display)->user_time != 0)
+    gdk_x11_window_set_user_time(window, GDK_DISPLAY_X11 (screen_x11->display)->user_time);
 }
 
 /**
@@ -543,6 +545,7 @@ gdk_window_new (GdkWindow     *parent,
   private->parent = (GdkWindowObject *)parent;
 
   private->accept_focus = TRUE;
+  private->focus_on_map = TRUE;
 
   xattributes_mask = 0;
   
@@ -3312,7 +3315,44 @@ gdk_window_set_accept_focus (GdkWindow *window,
 }
 
 /**
- * _gdk_x11_window_set_user_time:
+ * gdk_window_set_focus_on_map:
+ * @window: a toplevel #GdkWindow
+ * @focus_on_map: %TRUE if the window should receive input focus when mapped
+ *
+ * Setting @focus_on_map to %FALSE hints the desktop environment that the
+ * window doesn't want to receive input focus when it is mapped.  
+ * focus_on_map should be turned off for windows that aren't triggered
+ * interactively (such as popups from network activity).
+ *
+ * On X, it is the responsibility of the window manager to interpret
+ * this hint. Window managers following the freedesktop.org window
+ * manager extension specification should respect it.
+ *
+ * Since: 2.6 
+ **/
+void
+gdk_window_set_focus_on_map (GdkWindow *window,
+                            gboolean focus_on_map)
+{
+  GdkWindowObject *private;
+  g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
+  private = (GdkWindowObject *)window;  
+  
+  focus_on_map = focus_on_map != FALSE;
+
+  if (private->focus_on_map != focus_on_map)
+    {
+      private->focus_on_map = focus_on_map;
+
+      if ((!GDK_WINDOW_DESTROYED (window)) && (!private->focus_on_map))
+       gdk_x11_window_set_user_time (window, 0);
+    }
+}
+
+/**
+ * gdk_x11_window_set_user_time:
  * @window: A toplevel #GdkWindow
  * @timestamp: An XServer timestamp to which the property should be set
  *
@@ -3328,10 +3368,12 @@ gdk_window_set_accept_focus (GdkWindow *window,
  * Note that this property is automatically updated by GDK, so this
  * function should only be used by applications which handle input
  * events bypassing GDK.
+ *
+ * Since: 2.6
  **/
 void
-_gdk_x11_window_set_user_time (GdkWindow *window,
-                              guint32    timestamp)
+gdk_x11_window_set_user_time (GdkWindow *window,
+                              guint32    timestamp)
 {
   GdkDisplay *display;
   GdkDisplayX11 *display_x11;
index 8dd75ea709ed4f0f341b79de4e3004b8661879f5..f76e061d4c7f085c8dde8859534509513c47b915 100644 (file)
@@ -124,7 +124,7 @@ struct _GdkToplevelX11
 GType gdk_window_impl_x11_get_type (void);
 
 GdkToplevelX11 *_gdk_x11_window_get_toplevel  (GdkWindow *window);
-void            _gdk_x11_window_set_user_time (GdkWindow *window,
+void             gdk_x11_window_set_user_time (GdkWindow *window,
                                                guint32    timestamp);
 
 G_END_DECLS
index f80833d449394a031128911a4b760fff0501f9a7..c07b0a50feea291b720d648387c853f4d4ff0ffc 100644 (file)
@@ -75,6 +75,7 @@ enum {
   PROP_SKIP_TASKBAR_HINT,
   PROP_SKIP_PAGER_HINT,
   PROP_ACCEPT_FOCUS,
+  PROP_FOCUS_ON_MAP,
   PROP_DECORATED,
   PROP_GRAVITY,
   
@@ -162,6 +163,7 @@ struct _GtkWindowPrivate
   guint skips_taskbar : 1;
   guint skips_pager : 1;
   guint accept_focus : 1;
+  guint focus_on_map : 1;
 };
 
 static void gtk_window_class_init         (GtkWindowClass    *klass);
@@ -601,6 +603,21 @@ gtk_window_class_init (GtkWindowClass *klass)
                                                          TRUE,
                                                          G_PARAM_READWRITE));  
 
+  /**
+   * GtkWindow:focus-on-map-hint:
+   *
+   * Whether the window should receive the input focus when mapped.
+   *
+   * Since: 2.6
+   */
+  g_object_class_install_property (gobject_class,
+                                  PROP_FOCUS_ON_MAP,
+                                  g_param_spec_boolean ("focus_on_map",
+                                                         P_("Focus on map"),
+                                                         P_("TRUE if the window should receive the input focus when mapped."),
+                                                         TRUE,
+                                                         G_PARAM_READWRITE));  
+
   /**
    * GtkWindow:decorated:
    *
@@ -764,6 +781,7 @@ gtk_window_init (GtkWindow *window)
   window->screen = gdk_screen_get_default ();
 
   priv->accept_focus = TRUE;
+  priv->focus_on_map = TRUE;
 
   colormap = _gtk_widget_peek_colormap ();
   if (colormap)
@@ -859,6 +877,10 @@ gtk_window_set_property (GObject      *object,
       gtk_window_set_accept_focus (window,
                                   g_value_get_boolean (value));
       break;
+    case PROP_FOCUS_ON_MAP:
+      gtk_window_set_focus_on_map (window,
+                                  g_value_get_boolean (value));
+      break;
     case PROP_DECORATED:
       gtk_window_set_decorated (window, g_value_get_boolean (value));
       break;
@@ -952,6 +974,10 @@ gtk_window_get_property (GObject      *object,
       g_value_set_boolean (value,
                            gtk_window_get_accept_focus (window));
       break;
+    case PROP_FOCUS_ON_MAP:
+      g_value_set_boolean (value,
+                           gtk_window_get_focus_on_map (window));
+      break;
     case PROP_DECORATED:
       g_value_set_boolean (value, gtk_window_get_decorated (window));
       break;
@@ -2147,6 +2173,62 @@ gtk_window_get_accept_focus (GtkWindow *window)
   return priv->accept_focus;
 }
 
+/**
+ * gtk_window_set_focus_on_map:
+ * @window: a #GtkWindow 
+ * @setting: %TRUE to let this window receive input focus on map
+ * 
+ * Windows may set a hint asking the desktop environment not to receive
+ * the input focus when the window is mapped.  This function sets this
+ * hint.
+ * 
+ * Since: 2.6
+ **/
+void
+gtk_window_set_focus_on_map (GtkWindow *window,
+                            gboolean   setting)
+{
+  GtkWindowPrivate *priv;
+
+  g_return_if_fail (GTK_IS_WINDOW (window));
+  
+  priv = GTK_WINDOW_GET_PRIVATE (window);
+
+  setting = setting != FALSE;
+
+  if (priv->focus_on_map != setting)
+    {
+      priv->focus_on_map = setting;
+      if (GTK_WIDGET_REALIZED (window))
+        gdk_window_set_focus_on_map (GTK_WIDGET (window)->window,
+                                    priv->focus_on_map);
+      g_object_notify (G_OBJECT (window), "focus_on_map");
+    }
+}
+
+/**
+ * gtk_window_get_focus_on_map:
+ * @window: a #GtkWindow
+ * 
+ * Gets the value set by gtk_window_set_focus_on_map().
+ * 
+ * Return value: %TRUE if window should receive the input focus when
+ * mapped.
+ * 
+ * Since: 2.6
+ **/
+gboolean
+gtk_window_get_focus_on_map (GtkWindow *window)
+{
+  GtkWindowPrivate *priv;
+
+  g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE);
+  
+  priv = GTK_WINDOW_GET_PRIVATE (window);
+
+  return priv->focus_on_map;
+}
+
 /**
  * gtk_window_set_destroy_with_parent:
  * @window: a #GtkWindow
@@ -3915,6 +3997,11 @@ gtk_window_realize (GtkWidget *widget)
     gdk_window_set_accept_focus (widget->window, TRUE);
   else
     gdk_window_set_accept_focus (widget->window, FALSE);
+
+  if (gtk_window_get_focus_on_map (window))
+    gdk_window_set_focus_on_map (widget->window, TRUE);
+  else
+    gdk_window_set_focus_on_map (widget->window, FALSE);
   
   if (window->modal)
     gdk_window_set_modal_hint (widget->window, TRUE);
index da6b67a80b0f80efcc024708484b712f60ac7132..bcf6963e003b12d263a5920c4967cb3811ef7471 100644 (file)
@@ -204,6 +204,9 @@ gboolean   gtk_window_get_skip_pager_hint      (GtkWindow           *window);
 void       gtk_window_set_accept_focus         (GtkWindow           *window,
                                                 gboolean             setting);
 gboolean   gtk_window_get_accept_focus         (GtkWindow           *window);
+void       gtk_window_set_focus_on_map         (GtkWindow           *window,
+                                                gboolean             setting);
+gboolean   gtk_window_get_focus_on_map         (GtkWindow           *window);
 void       gtk_window_set_destroy_with_parent  (GtkWindow           *window,
                                                 gboolean             setting);
 gboolean   gtk_window_get_destroy_with_parent  (GtkWindow           *window);