]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkwindow.c
Merge branch 'gdk-backend-wayland'
[~andy/gtk] / gtk / gtkwindow.c
index 23565f3c2ea7ffc5a6130c53bbec2e7d8393412b..d7cbe796487f611d6afa3edb2d929fa7e7c433f6 100644 (file)
@@ -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);