summaryrefslogtreecommitdiff
path: root/gtk/gtkwindow.c
diff options
context:
space:
mode:
authorElijah Newren <newren@math.utah.edu>2004-05-06 02:57:01 +0000
committerElijah Newren <newren@src.gnome.org>2004-05-06 02:57:01 +0000
commit5502f77eafdc207046d3cd14a47135f94ded827a (patch)
tree4fdcf0728c641508de8dae6a0623a52a5137772f /gtk/gtkwindow.c
parent4ec2a42a4ee3c3a3b405eefa85f713f612369de9 (diff)
downloadgdk-pixbuf-5502f77eafdc207046d3cd14a47135f94ded827a.tar.gz
Changes to support do-not-focus-on-map hint in conjunction with
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.
Diffstat (limited to 'gtk/gtkwindow.c')
-rw-r--r--gtk/gtkwindow.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index f80833d44..c07b0a50f 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -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);
@@ -602,6 +604,21 @@ gtk_window_class_init (GtkWindowClass *klass)
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:
*
* Whether the window should be decorated by the window manager.
@@ -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;
@@ -2148,6 +2174,62 @@ gtk_window_get_accept_focus (GtkWindow *window)
}
/**
+ * 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
* @setting: whether to destroy @window with its transient parent
@@ -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);