summaryrefslogtreecommitdiffstats
path: root/subprojects/libhandy/src/gtk-window.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--subprojects/libhandy/src/gtk-window.c169
1 files changed, 169 insertions, 0 deletions
diff --git a/subprojects/libhandy/src/gtk-window.c b/subprojects/libhandy/src/gtk-window.c
new file mode 100644
index 0000000..154acdb
--- /dev/null
+++ b/subprojects/libhandy/src/gtk-window.c
@@ -0,0 +1,169 @@
+/* GTK - The GIMP Toolkit
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: LGPL-2.1+
+ */
+
+/*
+ * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
+ * file for a list of people on the GTK+ Team. See the ChangeLog
+ * files for a list of changes. These files are distributed with
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
+/* Bits taken from GTK 3.24 and tweaked to be used by libhandy. */
+
+#include "gtk-window-private.h"
+
+typedef struct
+{
+ GList *icon_list;
+ gchar *icon_name;
+ guint realized : 1;
+ guint using_default_icon : 1;
+ guint using_parent_icon : 1;
+ guint using_themed_icon : 1;
+} GtkWindowIconInfo;
+
+static GQuark quark_gtk_window_icon_info = 0;
+
+static void
+ensure_quarks (void)
+{
+ if (!quark_gtk_window_icon_info)
+ quark_gtk_window_icon_info = g_quark_from_static_string ("gtk-window-icon-info");
+}
+
+void
+hdy_gtk_window_toggle_maximized (GtkWindow *window)
+{
+ if (gtk_window_is_maximized (window))
+ gtk_window_unmaximize (window);
+ else
+ gtk_window_maximize (window);
+}
+
+static GtkWindowIconInfo*
+get_icon_info (GtkWindow *window)
+{
+ ensure_quarks ();
+
+ return g_object_get_qdata (G_OBJECT (window), quark_gtk_window_icon_info);
+}
+
+static void
+free_icon_info (GtkWindowIconInfo *info)
+{
+ g_free (info->icon_name);
+ g_slice_free (GtkWindowIconInfo, info);
+}
+
+static GtkWindowIconInfo*
+ensure_icon_info (GtkWindow *window)
+{
+ GtkWindowIconInfo *info;
+
+ ensure_quarks ();
+
+ info = get_icon_info (window);
+
+ if (info == NULL)
+ {
+ info = g_slice_new0 (GtkWindowIconInfo);
+ g_object_set_qdata_full (G_OBJECT (window),
+ quark_gtk_window_icon_info,
+ info,
+ (GDestroyNotify)free_icon_info);
+ }
+
+ return info;
+}
+
+static GdkPixbuf *
+icon_from_list (GList *list,
+ gint size)
+{
+ GdkPixbuf *best;
+ GdkPixbuf *pixbuf;
+ GList *l;
+
+ best = NULL;
+ for (l = list; l; l = l->next)
+ {
+ pixbuf = list->data;
+ if (gdk_pixbuf_get_width (pixbuf) <= size &&
+ gdk_pixbuf_get_height (pixbuf) <= size)
+ {
+ best = g_object_ref (pixbuf);
+ break;
+ }
+ }
+
+ if (best == NULL)
+ best = gdk_pixbuf_scale_simple (GDK_PIXBUF (list->data), size, size, GDK_INTERP_BILINEAR);
+
+ return best;
+}
+
+static GdkPixbuf *
+icon_from_name (const gchar *name,
+ gint size)
+{
+ return gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
+ name, size,
+ GTK_ICON_LOOKUP_FORCE_SIZE, NULL);
+}
+
+GdkPixbuf *
+hdy_gtk_window_get_icon_for_size (GtkWindow *window,
+ gint size)
+{
+ GtkWindowIconInfo *info;
+ const gchar *name;
+ g_autoptr (GList) default_icon_list = gtk_window_get_default_icon_list ();
+
+ info = ensure_icon_info (window);
+
+ if (info->icon_list != NULL)
+ return icon_from_list (info->icon_list, size);
+
+ name = gtk_window_get_icon_name (window);
+ if (name != NULL)
+ return icon_from_name (name, size);
+
+ if (gtk_window_get_transient_for (window) != NULL)
+ {
+ info = ensure_icon_info (gtk_window_get_transient_for (window));
+ if (info->icon_list)
+ return icon_from_list (info->icon_list, size);
+ }
+
+ if (default_icon_list != NULL)
+ return icon_from_list (default_icon_list, size);
+
+ if (gtk_window_get_default_icon_name () != NULL)
+ return icon_from_name (gtk_window_get_default_icon_name (), size);
+
+ return NULL;
+}
+
+GdkWindowState
+hdy_gtk_window_get_state (GtkWindow *window)
+{
+ GdkWindow *gdk_window = gtk_widget_get_window (GTK_WIDGET (window));
+
+ return gdk_window ? gdk_window_get_state (gdk_window) : 0;
+}