summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <maclas@gmx.de>2003-12-10 23:58:23 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2003-12-10 23:58:23 +0000
commit5fb61f307553d9455240315f79923fbbf71bfeba (patch)
tree2cb5c7df896d7dc4de690c2d8a69a12526daeee3
parentc9c99b3f1b96cef1863503612e6c2689ae2ebbe6 (diff)
downloadgtk+-5fb61f307553d9455240315f79923fbbf71bfeba.tar.gz
Changes to allow "no input" windows (#64613):
Thu Dec 11 00:35:12 2003 Matthias Clasen <maclas@gmx.de> Changes to allow "no input" windows (#64613): * gdk/gdkwindow.h (struct _GdkWindowObject): Add a new boolean field accept_focus. * gdk/gdkwindow.h (gdk_window_set_accept_focus): New function to set it. * gtk/gtkwindow.[hc]: Add a boolean property "accept_focus" and gtk_window_get_focus() and gtk_window_set_focus(). * gdk/win32/gdkwindow-win32.c (gdk_window_new): * gdk/linux-fb/gdkwindow-fb.c (gdk_window_new): * gdk/x11/gdkwindow-x11.c (gdk_window_set_new): Initialize the accept_focus field to TRUE. * gdk/win32/gdkwindow-win32.c (gdk_window_set_accept_focus): * gdk/linux-fb/gdkwindow-fb.c (gdk_window_set_accept_focus): * gdk/x11/gdkwindow-x11.c (gdk_window_set_accept_focus): Implementations for the various backends. The Win32 and linux-fb implementations set the accept_focus field, but don't use it yet to actually implement noinput windows. The X implementation updates the WM_HINTS to select the globally active input model (see the ICCCM) if accept_focus is FALSE. * gdk/x11/gdkevents-x11.c (gdk_wm_protocols_filter): Ignore the WM_TAKE_FOCUS message if accept_focus is FALSE.
-rw-r--r--ChangeLog30
-rw-r--r--ChangeLog.pre-2-1030
-rw-r--r--ChangeLog.pre-2-430
-rw-r--r--ChangeLog.pre-2-630
-rw-r--r--ChangeLog.pre-2-830
-rw-r--r--docs/reference/ChangeLog5
-rw-r--r--docs/reference/gdk/gdk-sections.txt1
-rw-r--r--docs/reference/gtk/gtk-sections.txt2
-rw-r--r--gdk/gdkwindow.h4
-rw-r--r--gdk/linux-fb/gdkwindow-fb.c18
-rw-r--r--gdk/win32/gdkwindow-win32.c18
-rw-r--r--gdk/x11/gdkevents-x11.c3
-rw-r--r--gdk/x11/gdkwindow-x11.c41
-rw-r--r--gtk/gtkwindow.c96
-rw-r--r--gtk/gtkwindow.h3
15 files changed, 332 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 2d584e0d1c..a7aa59bc9d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,33 @@
+Thu Dec 11 00:35:12 2003 Matthias Clasen <maclas@gmx.de>
+
+ Changes to allow "no input" windows (#64613):
+
+ * gdk/gdkwindow.h (struct _GdkWindowObject): Add a new boolean
+ field accept_focus.
+
+ * gdk/gdkwindow.h (gdk_window_set_accept_focus): New function to
+ set it.
+
+ * gtk/gtkwindow.[hc]: Add a boolean property "accept_focus"
+ and gtk_window_get_focus() and gtk_window_set_focus().
+
+ * gdk/win32/gdkwindow-win32.c (gdk_window_new):
+ * gdk/linux-fb/gdkwindow-fb.c (gdk_window_new):
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_new):
+ Initialize the accept_focus field to TRUE.
+
+ * gdk/win32/gdkwindow-win32.c (gdk_window_set_accept_focus):
+ * gdk/linux-fb/gdkwindow-fb.c (gdk_window_set_accept_focus):
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_accept_focus):
+ Implementations for the various backends. The Win32 and linux-fb
+ implementations set the accept_focus field, but don't use it yet
+ to actually implement noinput windows. The X implementation updates
+ the WM_HINTS to select the globally active input model (see the
+ ICCCM) if accept_focus is FALSE.
+
+ * gdk/x11/gdkevents-x11.c (gdk_wm_protocols_filter): Ignore the
+ WM_TAKE_FOCUS message if accept_focus is FALSE.
+
2003-12-10 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkfilechooserdefault.c (struct _GtkFileChooserDefault):
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index 2d584e0d1c..a7aa59bc9d 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,33 @@
+Thu Dec 11 00:35:12 2003 Matthias Clasen <maclas@gmx.de>
+
+ Changes to allow "no input" windows (#64613):
+
+ * gdk/gdkwindow.h (struct _GdkWindowObject): Add a new boolean
+ field accept_focus.
+
+ * gdk/gdkwindow.h (gdk_window_set_accept_focus): New function to
+ set it.
+
+ * gtk/gtkwindow.[hc]: Add a boolean property "accept_focus"
+ and gtk_window_get_focus() and gtk_window_set_focus().
+
+ * gdk/win32/gdkwindow-win32.c (gdk_window_new):
+ * gdk/linux-fb/gdkwindow-fb.c (gdk_window_new):
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_new):
+ Initialize the accept_focus field to TRUE.
+
+ * gdk/win32/gdkwindow-win32.c (gdk_window_set_accept_focus):
+ * gdk/linux-fb/gdkwindow-fb.c (gdk_window_set_accept_focus):
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_accept_focus):
+ Implementations for the various backends. The Win32 and linux-fb
+ implementations set the accept_focus field, but don't use it yet
+ to actually implement noinput windows. The X implementation updates
+ the WM_HINTS to select the globally active input model (see the
+ ICCCM) if accept_focus is FALSE.
+
+ * gdk/x11/gdkevents-x11.c (gdk_wm_protocols_filter): Ignore the
+ WM_TAKE_FOCUS message if accept_focus is FALSE.
+
2003-12-10 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkfilechooserdefault.c (struct _GtkFileChooserDefault):
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index 2d584e0d1c..a7aa59bc9d 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -1,3 +1,33 @@
+Thu Dec 11 00:35:12 2003 Matthias Clasen <maclas@gmx.de>
+
+ Changes to allow "no input" windows (#64613):
+
+ * gdk/gdkwindow.h (struct _GdkWindowObject): Add a new boolean
+ field accept_focus.
+
+ * gdk/gdkwindow.h (gdk_window_set_accept_focus): New function to
+ set it.
+
+ * gtk/gtkwindow.[hc]: Add a boolean property "accept_focus"
+ and gtk_window_get_focus() and gtk_window_set_focus().
+
+ * gdk/win32/gdkwindow-win32.c (gdk_window_new):
+ * gdk/linux-fb/gdkwindow-fb.c (gdk_window_new):
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_new):
+ Initialize the accept_focus field to TRUE.
+
+ * gdk/win32/gdkwindow-win32.c (gdk_window_set_accept_focus):
+ * gdk/linux-fb/gdkwindow-fb.c (gdk_window_set_accept_focus):
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_accept_focus):
+ Implementations for the various backends. The Win32 and linux-fb
+ implementations set the accept_focus field, but don't use it yet
+ to actually implement noinput windows. The X implementation updates
+ the WM_HINTS to select the globally active input model (see the
+ ICCCM) if accept_focus is FALSE.
+
+ * gdk/x11/gdkevents-x11.c (gdk_wm_protocols_filter): Ignore the
+ WM_TAKE_FOCUS message if accept_focus is FALSE.
+
2003-12-10 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkfilechooserdefault.c (struct _GtkFileChooserDefault):
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index 2d584e0d1c..a7aa59bc9d 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,3 +1,33 @@
+Thu Dec 11 00:35:12 2003 Matthias Clasen <maclas@gmx.de>
+
+ Changes to allow "no input" windows (#64613):
+
+ * gdk/gdkwindow.h (struct _GdkWindowObject): Add a new boolean
+ field accept_focus.
+
+ * gdk/gdkwindow.h (gdk_window_set_accept_focus): New function to
+ set it.
+
+ * gtk/gtkwindow.[hc]: Add a boolean property "accept_focus"
+ and gtk_window_get_focus() and gtk_window_set_focus().
+
+ * gdk/win32/gdkwindow-win32.c (gdk_window_new):
+ * gdk/linux-fb/gdkwindow-fb.c (gdk_window_new):
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_new):
+ Initialize the accept_focus field to TRUE.
+
+ * gdk/win32/gdkwindow-win32.c (gdk_window_set_accept_focus):
+ * gdk/linux-fb/gdkwindow-fb.c (gdk_window_set_accept_focus):
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_accept_focus):
+ Implementations for the various backends. The Win32 and linux-fb
+ implementations set the accept_focus field, but don't use it yet
+ to actually implement noinput windows. The X implementation updates
+ the WM_HINTS to select the globally active input model (see the
+ ICCCM) if accept_focus is FALSE.
+
+ * gdk/x11/gdkevents-x11.c (gdk_wm_protocols_filter): Ignore the
+ WM_TAKE_FOCUS message if accept_focus is FALSE.
+
2003-12-10 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkfilechooserdefault.c (struct _GtkFileChooserDefault):
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index 2d584e0d1c..a7aa59bc9d 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,3 +1,33 @@
+Thu Dec 11 00:35:12 2003 Matthias Clasen <maclas@gmx.de>
+
+ Changes to allow "no input" windows (#64613):
+
+ * gdk/gdkwindow.h (struct _GdkWindowObject): Add a new boolean
+ field accept_focus.
+
+ * gdk/gdkwindow.h (gdk_window_set_accept_focus): New function to
+ set it.
+
+ * gtk/gtkwindow.[hc]: Add a boolean property "accept_focus"
+ and gtk_window_get_focus() and gtk_window_set_focus().
+
+ * gdk/win32/gdkwindow-win32.c (gdk_window_new):
+ * gdk/linux-fb/gdkwindow-fb.c (gdk_window_new):
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_new):
+ Initialize the accept_focus field to TRUE.
+
+ * gdk/win32/gdkwindow-win32.c (gdk_window_set_accept_focus):
+ * gdk/linux-fb/gdkwindow-fb.c (gdk_window_set_accept_focus):
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_accept_focus):
+ Implementations for the various backends. The Win32 and linux-fb
+ implementations set the accept_focus field, but don't use it yet
+ to actually implement noinput windows. The X implementation updates
+ the WM_HINTS to select the globally active input model (see the
+ ICCCM) if accept_focus is FALSE.
+
+ * gdk/x11/gdkevents-x11.c (gdk_wm_protocols_filter): Ignore the
+ WM_TAKE_FOCUS message if accept_focus is FALSE.
+
2003-12-10 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkfilechooserdefault.c (struct _GtkFileChooserDefault):
diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog
index 89480292f0..fcc260c1f7 100644
--- a/docs/reference/ChangeLog
+++ b/docs/reference/ChangeLog
@@ -1,3 +1,8 @@
+Thu Dec 11 00:04:10 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gtk/gtk-sections.txt: Add gtk_window_[sg]et_accept_focus().
+ * gdk/gdk-sections.txt: Add gdk_window_set_accept_focus().
+
Wed Dec 10 00:09:51 2003 Matthias Clasen <maclas@gmx.de>
* gdk/gdk-sections.txt: Add gdk_window_get_group(),
diff --git a/docs/reference/gdk/gdk-sections.txt b/docs/reference/gdk/gdk-sections.txt
index e0547fe2ef..6d1058d3e1 100644
--- a/docs/reference/gdk/gdk-sections.txt
+++ b/docs/reference/gdk/gdk-sections.txt
@@ -658,6 +658,7 @@ gdk_window_get_internal_paint_info
<SUBSECTION>
gdk_window_set_user_data
gdk_window_set_override_redirect
+gdk_window_set_accept_focus
gdk_window_add_filter
gdk_window_remove_filter
GdkFilterFunc
diff --git a/docs/reference/gtk/gtk-sections.txt b/docs/reference/gtk/gtk-sections.txt
index cb98bfeee5..65db5f19db 100644
--- a/docs/reference/gtk/gtk-sections.txt
+++ b/docs/reference/gtk/gtk-sections.txt
@@ -4376,6 +4376,7 @@ gtk_window_set_role
gtk_window_set_type_hint
gtk_window_set_skip_taskbar_hint
gtk_window_set_skip_pager_hint
+gtk_window_set_accept_focus
gtk_window_get_decorated
gtk_window_get_default_icon_list
gtk_window_get_default_size
@@ -4394,6 +4395,7 @@ gtk_window_get_transient_for
gtk_window_get_type_hint
gtk_window_get_skip_taskbar_hint
gtk_window_get_skip_pager_hint
+gtk_window_get_accept_focus
gtk_window_move
gtk_window_parse_geometry
gtk_window_reshow_with_initial_size
diff --git a/gdk/gdkwindow.h b/gdk/gdkwindow.h
index 1eadf0044d..7568a330b9 100644
--- a/gdk/gdkwindow.h
+++ b/gdk/gdkwindow.h
@@ -260,6 +260,8 @@ struct _GdkWindowObject
guint modal_hint : 1;
guint destroyed : 2;
+
+ guint accept_focus : 1;
GdkEventMask event_mask;
};
@@ -317,6 +319,8 @@ void gdk_window_set_user_data (GdkWindow *window,
gpointer user_data);
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_add_filter (GdkWindow *window,
GdkFilterFunc function,
gpointer data);
diff --git a/gdk/linux-fb/gdkwindow-fb.c b/gdk/linux-fb/gdkwindow-fb.c
index 06d987ad3e..140aba2d23 100644
--- a/gdk/linux-fb/gdkwindow-fb.c
+++ b/gdk/linux-fb/gdkwindow-fb.c
@@ -188,6 +188,8 @@ gdk_window_new (GdkWindow *parent,
private->parent = parent_private;
+ private->accept_focus = TRUE;
+
if (attributes_mask & GDK_WA_X)
x = attributes->x;
else
@@ -1990,6 +1992,22 @@ gdk_window_set_override_redirect (GdkWindow *window,
/* N/A */
}
+void
+gdk_window_set_accept_focus (GdkWindow *window,
+ gboolean accept_focus)
+{
+ GdkWindowObject *private;
+ g_return_if_fail (window != NULL);
+ g_return_if_fail (GDK_IS_WINDOW (window));
+
+ private = (GdkWindowObject *)window;
+
+ accept_focus = accept_focus != FALSE;
+
+ if (private->accept_focus != accept_focus)
+ private->accept_focus = accept_focus;
+}
+
void
gdk_window_set_icon (GdkWindow *window,
GdkWindow *icon_window,
diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c
index 640eaccf3e..7f28f8ae0c 100644
--- a/gdk/win32/gdkwindow-win32.c
+++ b/gdk/win32/gdkwindow-win32.c
@@ -468,6 +468,8 @@ gdk_window_new (GdkWindow *parent,
private->parent = (GdkWindowObject *)parent;
+ private->accept_focus = TRUE;
+
if (attributes_mask & GDK_WA_X)
private->x = attributes->x;
else
@@ -2151,6 +2153,22 @@ gdk_window_set_override_redirect (GdkWindow *window,
g_warning ("gdk_window_set_override_redirect not implemented");
}
+void
+gdk_window_set_accept_focus (GdkWindow *window,
+ gboolean accept_focus)
+{
+ GdkWindowObject *private;
+ g_return_if_fail (window != NULL);
+ g_return_if_fail (GDK_IS_WINDOW (window));
+
+ private = (GdkWindowObject *)window;
+
+ accept_focus = accept_focus != FALSE;
+
+ if (private->accept_focus != accept_focus)
+ private->accept_focus = accept_focus;
+}
+
void
gdk_window_set_icon_list (GdkWindow *window,
GList *pixbufs)
diff --git a/gdk/x11/gdkevents-x11.c b/gdk/x11/gdkevents-x11.c
index ad1ade8121..bc2a38de7b 100644
--- a/gdk/x11/gdkevents-x11.c
+++ b/gdk/x11/gdkevents-x11.c
@@ -1969,11 +1969,12 @@ gdk_wm_protocols_filter (GdkXEvent *xev,
else if ((Atom) xevent->xclient.data.l[0] == gdk_x11_get_xatom_by_name_for_display (display, "WM_TAKE_FOCUS"))
{
GdkToplevelX11 *toplevel = _gdk_x11_window_get_toplevel (event->any.window);
+ GdkWindowObject *private = (GdkWindowObject *)win;
/* There is no way of knowing reliably whether we are viewable;
* _gdk_x11_set_input_focus_safe() traps errors asynchronously.
*/
- if (toplevel)
+ if (toplevel && private->accept_focus)
_gdk_x11_set_input_focus_safe (display, toplevel->focus_window,
RevertToParent,
xevent->xclient.data.l[1]);
diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c
index 3683e42075..4773885823 100644
--- a/gdk/x11/gdkwindow-x11.c
+++ b/gdk/x11/gdkwindow-x11.c
@@ -343,6 +343,7 @@ _gdk_windowing_window_init (GdkScreen * screen)
static void
set_wm_protocols (GdkWindow *window)
{
+ GdkWindowObject *private = (GdkWindowObject *)window;
GdkDisplay *display = gdk_drawable_get_display (window);
Atom protocols[3];
@@ -463,6 +464,8 @@ gdk_window_new (GdkWindow *parent,
private->parent = (GdkWindowObject *)parent;
+ private->accept_focus = TRUE;
+
xattributes_mask = 0;
if (attributes_mask & GDK_WA_X)
@@ -989,8 +992,8 @@ update_wm_hints (GdkWindow *window,
private->state & GDK_WINDOW_STATE_WITHDRAWN)
return;
- wm_hints.flags = StateHint;
- wm_hints.input = True;
+ wm_hints.flags = StateHint | InputHint;
+ wm_hints.input = private->accept_focus ? True : False;
wm_hints.initial_state = NormalState;
if (private->state & GDK_WINDOW_STATE_ICONIFIED)
@@ -3223,6 +3226,40 @@ gdk_window_set_override_redirect (GdkWindow *window,
}
}
+/**
+ * gdk_window_set_accept_focus:
+ * @window: a toplevel #GdkWindow
+ * @accept_focus: %TRUE if the window should receive input focus
+ *
+ * Setting @accept_focus to %FALSE hints the desktop environment that the
+ * window doesn't want to receive input focus.
+ *
+ * On X, it is the responsibility of the window manager to interpret this
+ * hint. ICCCM-compliant window manager usually respect it.
+ *
+ * Since: 2.4
+ **/
+void
+gdk_window_set_accept_focus (GdkWindow *window,
+ gboolean accept_focus)
+{
+ GdkWindowObject *private;
+ g_return_if_fail (window != NULL);
+ g_return_if_fail (GDK_IS_WINDOW (window));
+
+ private = (GdkWindowObject *)window;
+
+ accept_focus = accept_focus != FALSE;
+
+ if (private->accept_focus != accept_focus)
+ {
+ private->accept_focus = accept_focus;
+
+ if (!GDK_WINDOW_DESTROYED (window))
+ update_wm_hints (window, FALSE);
+ }
+}
+
/**
* gdk_window_set_icon_list:
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 1f90be99b3..0843554ba7 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -73,6 +73,7 @@ enum {
PROP_TYPE_HINT,
PROP_SKIP_TASKBAR_HINT,
PROP_SKIP_PAGER_HINT,
+ PROP_ACCEPT_FOCUS,
PROP_DECORATED,
PROP_GRAVITY,
@@ -159,6 +160,7 @@ struct _GtkWindowPrivate
guint fullscreen_initially : 1;
guint skips_taskbar : 1;
guint skips_pager : 1;
+ guint accept_focus : 1;
};
static void gtk_window_class_init (GtkWindowClass *klass);
@@ -584,6 +586,21 @@ gtk_window_class_init (GtkWindowClass *klass)
G_PARAM_READWRITE));
/**
+ * GtkWindow:accept-focus-hint:
+ *
+ * Whether the window should receive the input focus.
+ *
+ * Since: 2.4
+ */
+ g_object_class_install_property (gobject_class,
+ PROP_ACCEPT_FOCUS,
+ g_param_spec_boolean ("accept_focus",
+ _("Accept focus"),
+ _("TRUE if the window should receive the input focus."),
+ TRUE,
+ G_PARAM_READWRITE));
+
+ /**
* GtkWindow:decorated:
*
* Whether the window should be decorated by the window manager.
@@ -708,6 +725,7 @@ static void
gtk_window_init (GtkWindow *window)
{
GdkColormap *colormap;
+ GtkWindowPrivate *priv = GTK_WINDOW_GET_PRIVATE (window);
GTK_WIDGET_UNSET_FLAGS (window, GTK_NO_WINDOW);
GTK_WIDGET_SET_FLAGS (window, GTK_TOPLEVEL);
@@ -743,7 +761,9 @@ gtk_window_init (GtkWindow *window)
window->decorated = TRUE;
window->mnemonic_modifier = GDK_MOD1_MASK;
window->screen = gdk_screen_get_default ();
-
+
+ priv->accept_focus = TRUE;
+
colormap = _gtk_widget_peek_colormap ();
if (colormap)
gtk_widget_set_colormap (GTK_WIDGET (window), colormap);
@@ -834,6 +854,10 @@ gtk_window_set_property (GObject *object,
gtk_window_set_skip_pager_hint (window,
g_value_get_boolean (value));
break;
+ case PROP_ACCEPT_FOCUS:
+ gtk_window_set_accept_focus (window,
+ g_value_get_boolean (value));
+ break;
case PROP_DECORATED:
gtk_window_set_decorated (window, g_value_get_boolean (value));
break;
@@ -923,6 +947,10 @@ gtk_window_get_property (GObject *object,
g_value_set_boolean (value,
gtk_window_get_skip_pager_hint (window));
break;
+ case PROP_ACCEPT_FOCUS:
+ g_value_set_boolean (value,
+ gtk_window_get_accept_focus (window));
+ break;
case PROP_DECORATED:
g_value_set_boolean (value, gtk_window_get_decorated (window));
break;
@@ -1969,7 +1997,7 @@ gtk_window_get_type_hint (GtkWindow *window)
* @setting: %TRUE to keep this window from appearing in the task bar
*
* Windows may set a hint asking the desktop environment not to display
- * the window in the task bar. This function toggles this hint.
+ * the window in the task bar. This function sets this hint.
*
* Since: 2.2
**/
@@ -2023,7 +2051,7 @@ gtk_window_get_skip_taskbar_hint (GtkWindow *window)
* @setting: %TRUE to keep this window from appearing in the pager
*
* Windows may set a hint asking the desktop environment not to display
- * the window in the pager. This function toggles this hint.
+ * the window in the pager. This function sets this hint.
* (A "pager" is any desktop navigation tool such as a workspace
* switcher that displays a thumbnail representation of the windows
* on the screen.)
@@ -2075,6 +2103,60 @@ gtk_window_get_skip_pager_hint (GtkWindow *window)
}
/**
+ * gtk_window_set_accept_focus:
+ * @window: a #GtkWindow
+ * @setting: %TRUE to let this window receive input focus
+ *
+ * Windows may set a hint asking the desktop environment not to receive
+ * the input focus. This function sets this hint.
+ *
+ * Since: 2.4
+ **/
+void
+gtk_window_set_accept_focus (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->accept_focus != setting)
+ {
+ priv->accept_focus = setting;
+ if (GTK_WIDGET_REALIZED (window))
+ gdk_window_set_accept_focus (GTK_WIDGET (window)->window,
+ priv->accept_focus);
+ g_object_notify (G_OBJECT (window), "accept_focus");
+ }
+}
+
+/**
+ * gtk_window_get_accept_focus:
+ * @window: a #GtkWindow
+ *
+ * Gets the value set by gtk_window_set_accept_focus().
+ *
+ * Return value: %TRUE if window should receive the input focus
+ *
+ * Since: 2.4
+ **/
+gboolean
+gtk_window_get_accept_focus (GtkWindow *window)
+{
+ GtkWindowPrivate *priv;
+
+ g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE);
+
+ priv = GTK_WINDOW_GET_PRIVATE (window);
+
+ return priv->accept_focus;
+}
+
+/**
* gtk_window_set_destroy_with_parent:
* @window: a #GtkWindow
* @setting: whether to destroy @window with its transient parent
@@ -3833,13 +3915,15 @@ gtk_window_realize (GtkWidget *widget)
gdk_window_set_type_hint (widget->window, window->type_hint);
if (gtk_window_get_skip_pager_hint (window))
- {
- g_print ("setting skip pager when realizing\n");
gdk_window_set_skip_pager_hint (widget->window, TRUE);
- }
if (gtk_window_get_skip_taskbar_hint (window))
gdk_window_set_skip_taskbar_hint (widget->window, TRUE);
+
+ if (gtk_window_get_accept_focus (window))
+ gdk_window_set_accept_focus (widget->window, TRUE);
+ else
+ gdk_window_set_accept_focus (widget->window, FALSE);
if (window->modal)
gdk_window_set_modal_hint (widget->window, TRUE);
diff --git a/gtk/gtkwindow.h b/gtk/gtkwindow.h
index 8926e575d6..439a5cefe5 100644
--- a/gtk/gtkwindow.h
+++ b/gtk/gtkwindow.h
@@ -201,6 +201,9 @@ gboolean gtk_window_get_skip_taskbar_hint (GtkWindow *window);
void gtk_window_set_skip_pager_hint (GtkWindow *window,
gboolean setting);
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_destroy_with_parent (GtkWindow *window,
gboolean setting);
gboolean gtk_window_get_destroy_with_parent (GtkWindow *window);