X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkwindow.c;fp=gtk%2Fgtkwindow.c;h=d7cbe796487f611d6afa3edb2d929fa7e7c433f6;hb=c7514e8f0d19a833257497caff413bb4dfae6eb4;hp=23565f3c2ea7ffc5a6130c53bbec2e7d8393412b;hpb=fcd58b0ffd0935567437b89bb077f60195336764;p=~andy%2Fgtk diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 23565f3c2..d7cbe7964 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -107,13 +107,12 @@ struct _GtkWindowPrivate GtkWindow *transient_parent; GtkWindowGeometryInfo *geometry_info; GtkWindowGroup *group; + GdkScreen *screen; + GtkApplication *application; GdkModifierType mnemonic_modifier; - GdkScreen *screen; GdkWindowTypeHint gdk_type_hint; - GtkApplication *application; - gdouble opacity; GdkWindow *grip_window; @@ -147,7 +146,6 @@ struct _GtkWindowPrivate guint destroy_with_parent : 1; guint focus_on_map : 1; guint fullscreen_initially : 1; - guint gravity : 5; /* GdkGravity */ guint has_focus : 1; guint has_user_ref_count : 1; guint has_toplevel_focus : 1; @@ -176,6 +174,7 @@ struct _GtkWindowPrivate guint resize_grip_visible : 1; /* don't use, just for "resize- * grip-visible" notification */ + guint gravity : 5; /* GdkGravity */ }; @@ -413,6 +412,10 @@ static GtkKeyHash *gtk_window_get_key_hash (GtkWindow *window); static void gtk_window_free_key_hash (GtkWindow *window); static void gtk_window_on_composited_changed (GdkScreen *screen, GtkWindow *window); +static void gtk_window_on_theme_variant_changed (GtkSettings *settings, + GParamSpec *pspec, + GtkWindow *window); +static void gtk_window_set_theme_variant (GtkWindow *window); static GSList *toplevel_list = NULL; static guint window_signals[LAST_SIGNAL] = { 0 }; @@ -1111,6 +1114,12 @@ gtk_window_init (GtkWindow *window) if (priv->screen) g_signal_connect (priv->screen, "composited-changed", G_CALLBACK (gtk_window_on_composited_changed), window); + +#ifdef GDK_WINDOWING_X11 + g_signal_connect (gtk_settings_get_for_screen (priv->screen), + "notify::gtk-application-prefer-dark-theme", + G_CALLBACK (gtk_window_on_theme_variant_changed), window); +#endif } static void @@ -2648,12 +2657,12 @@ gtk_window_set_type_hint (GtkWindow *window, priv = window->priv; if (hint < GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU) - priv->gdk_type_hint = hint; + priv->type_hint = hint; else - priv->gdk_type_hint = GDK_WINDOW_TYPE_HINT_NORMAL; + priv->type_hint = GDK_WINDOW_TYPE_HINT_NORMAL; priv->reset_type_hint = TRUE; - priv->type_hint = hint; + priv->gdk_type_hint = hint; } /** @@ -2669,7 +2678,7 @@ gtk_window_get_type_hint (GtkWindow *window) { g_return_val_if_fail (GTK_IS_WINDOW (window), GDK_WINDOW_TYPE_HINT_NORMAL); - return window->priv->type_hint; + return window->priv->gdk_type_hint; } /** @@ -4277,14 +4286,16 @@ gtk_window_move (GtkWindow *window, /** * gtk_window_get_position: * @window: a #GtkWindow - * @root_x: (out): return location for X coordinate of gravity-determined reference point - * @root_y: (out): return location for Y coordinate of gravity-determined reference point + * @root_x: (out) (allow-none): eturn location for X coordinate of + * gravity-determined reference point, or %NULL + * @root_y: (out) (allow-none): return location for Y coordinate of + * gravity-determined reference point, or %NULL * * This function returns the position you need to pass to - * gtk_window_move() to keep @window in its current position. This - * means that the meaning of the returned value varies with window - * gravity. See gtk_window_move() for more details. - * + * gtk_window_move() to keep @window in its current position. + * This means that the meaning of the returned value varies with + * window gravity. See gtk_window_move() for more details. + * * If you haven't changed the window gravity, its gravity will be * #GDK_GRAVITY_NORTH_WEST. This means that gtk_window_get_position() * gets the position of the top-left corner of the window manager @@ -4529,6 +4540,12 @@ gtk_window_finalize (GObject *object) g_free (priv->startup_id); +#ifdef GDK_WINDOWING_X11 + g_signal_handlers_disconnect_by_func (gtk_settings_get_default (), + gtk_window_on_theme_variant_changed, + window); +#endif + G_OBJECT_CLASS (gtk_window_parent_class)->finalize (object); } @@ -4695,6 +4712,9 @@ gtk_window_map (GtkWidget *widget) gdk_window_set_keep_below (toplevel, priv->below_initially); + if (priv->type == GTK_WINDOW_TOPLEVEL) + gtk_window_set_theme_variant (window); + /* No longer use the default settings */ priv->need_default_size = FALSE; priv->need_default_position = FALSE; @@ -4706,7 +4726,7 @@ gtk_window_map (GtkWidget *widget) * Some applications use X directly to change the properties; * in that case, we shouldn't overwrite what they did. */ - gdk_window_set_type_hint (gdk_window, priv->type_hint); + gdk_window_set_type_hint (gdk_window, priv->gdk_type_hint); priv->reset_type_hint = FALSE; } @@ -4980,17 +5000,14 @@ gtk_window_realize (GtkWidget *widget) { #ifdef GDK_WINDOWING_X11 if (GDK_IS_X11_WINDOW (gdk_window)) - { - guint32 timestamp = extract_time_from_startup_id (priv->startup_id); - if (timestamp != GDK_CURRENT_TIME) - gdk_x11_window_set_user_time (gdk_window, timestamp); - } - else + { + guint32 timestamp = extract_time_from_startup_id (priv->startup_id); + if (timestamp != GDK_CURRENT_TIME) + gdk_x11_window_set_user_time (gdk_window, timestamp); + } #endif - { - if (!startup_id_is_fake (priv->startup_id)) - gdk_window_set_startup_id (gdk_window, priv->startup_id); - } + if (!startup_id_is_fake (priv->startup_id)) + gdk_window_set_startup_id (gdk_window, priv->startup_id); } /* Icons */ @@ -7151,7 +7168,7 @@ gtk_window_compute_hints (GtkWindow *window, extra_width = requisition.width - TEMPORARY_SIZE; extra_height = requisition.height - TEMPORARY_SIZE; - if (extra_width < 0 || extra_width < 0) + if (extra_width < 0 || extra_height < 0) { g_warning("Toplevel size doesn't seem to directly depend on the " "size of the geometry widget from gtk_window_set_geometry_hints(). " @@ -7999,10 +8016,21 @@ gtk_window_set_screen (GtkWindow *window, if (screen != previous_screen) { if (previous_screen) - g_signal_handlers_disconnect_by_func (previous_screen, - gtk_window_on_composited_changed, window); + { + g_signal_handlers_disconnect_by_func (previous_screen, + gtk_window_on_composited_changed, window); +#ifdef GDK_WINDOWING_X11 + g_signal_handlers_disconnect_by_func (gtk_settings_get_for_screen (previous_screen), + gtk_window_on_theme_variant_changed, window); +#endif + } g_signal_connect (screen, "composited-changed", G_CALLBACK (gtk_window_on_composited_changed), window); +#ifdef GDK_WINDOWING_X11 + g_signal_connect (gtk_settings_get_for_screen (screen), + "notify::gtk-application-prefer-dark-theme", + G_CALLBACK (gtk_window_on_theme_variant_changed), window); +#endif _gtk_widget_propagate_screen_changed (widget, previous_screen); _gtk_widget_propagate_composited_changed (widget); @@ -8013,6 +8041,34 @@ gtk_window_set_screen (GtkWindow *window, gtk_widget_map (widget); } +static void +gtk_window_set_theme_variant (GtkWindow *window) +{ +#ifdef GDK_WINDOWING_X11 + GdkWindow *gdk_window; + gboolean dark_theme_requested; + + g_object_get (gtk_settings_get_for_screen (window->priv->screen), + "gtk-application-prefer-dark-theme", &dark_theme_requested, + NULL); + + gdk_window = gtk_widget_get_window (GTK_WIDGET (window)); + + if (GDK_IS_X11_WINDOW (gdk_window)) + gdk_x11_window_set_theme_variant (gdk_window, + dark_theme_requested ? "dark" : NULL); +#endif +} + +static void +gtk_window_on_theme_variant_changed (GtkSettings *settings, + GParamSpec *pspec, + GtkWindow *window) +{ + if (window->priv->type == GTK_WINDOW_TOPLEVEL) + gtk_window_set_theme_variant (window); +} + static void gtk_window_on_composited_changed (GdkScreen *screen, GtkWindow *window) @@ -9167,7 +9223,7 @@ _gtk_window_set_is_toplevel (GtkWindow *window, _gtk_widget_set_is_toplevel (widget, TRUE); /* When a window becomes toplevel after being embedded and anchored - * into another window we need to unset it's anchored flag so that + * into another window we need to unset its anchored flag so that * the hierarchy changed signal kicks in properly. */ _gtk_widget_set_anchored (widget, FALSE);