From 472d7c466d33bd1fe4cd293b354e52bf16384520 Mon Sep 17 00:00:00 2001 From: Gordon Norman Squash Date: Tue, 10 Sep 2024 01:28:29 -0400 Subject: Initial commit This is where I have started tracking development with Git. I declare this as version 0.89. --- patches/smaller-widgets.c | 262 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 262 insertions(+) create mode 100644 patches/smaller-widgets.c (limited to 'patches/smaller-widgets.c') diff --git a/patches/smaller-widgets.c b/patches/smaller-widgets.c new file mode 100644 index 0000000..3b9888f --- /dev/null +++ b/patches/smaller-widgets.c @@ -0,0 +1,262 @@ +/* Smaller Widgets: + * (based on gtk3-classic CSS 'smaller-adwaita.css', and gtk3-classic patch + * 'appearance__smaller-statusbar.patch'): + * + * Reduces the size of certain widgets, especially when the built-in GTK themes + * (Adwaita and HighContrast) are in use, in the spirit of more traditional + * GTK themes for prior versions of GTK. + */ + + +#include +#include +#include + +#include + +#include + + +#undef G_LOG_DOMAIN +#define G_LOG_DOMAIN "Gtk3-Classic::Smaller-Widgets" + + +#define CSS \ + "button,\n" \ + "button.titlebutton,\n" \ + "button.image-button,\n" \ + "button.text-button,\n" \ + "button.image-button.text-button,\n" \ + ".stack-switcher > button.text-button {\n" \ + " padding: 3px 6px;\n" \ + " min-height: 20px;\n" \ + " min-width: 0;\n" \ + "}\n" \ + ".stack-switcher > button.text-button {\n" \ + " min-width: 80px;\n" \ + "}\n" \ + "button.text-button.image-button label {\n" \ + " padding: 0 2px;\n" \ + "}\n" \ + "notebook > header.top tab,\n" \ + "notebook > header.bottom tab {\n" \ + " padding: 0 5px;\n" \ + "}\n" \ + "notebook > header.left tab,\n" \ + "notebook > header.right tab {\n" \ + " padding: 0 8px;\n" \ + "}\n" \ + "notebook tab button {\n" \ + " padding: 0px;\n" \ + " min-height: 15px;\n" \ + "}\n" \ + "entry,\n" \ + "spinbutton:not(.vertical) {\n" \ + " min-height: 26px;\n" \ + "}\n" \ + "treeview button {\n" \ + " padding: 0 7px;\n" \ + " min-height: 23px;\n" \ + "}\n" \ + "progressbar.horizontal trough,\n" \ + "progressbar.horizontal progress,\n" \ + "progressbar.vertical trough,\n" \ + "progressbar.vertical progress,\n" \ + "levelbar trough {\n" \ + " min-height: 9px;\n" \ + " min-width: 9px;\n" \ + "}\n" \ + "scale {\n" \ + " padding: 10px 0;\n" \ + "}\n" \ + "headerbar, switch slider {\n" \ + " min-height: 0;\n" \ + "}\n" \ + "popover:not(.emoji-picker) > *:not(grid) {\n" \ + " margin: -3px;\n" \ + "}\n" \ + "tooltip * {\n" \ + " padding: 0px;\n" \ + "}\n" \ + "placessidebar row {\n" \ + " min-height: 29px;\n" \ + "}\n" \ + "placessidebar row button.sidebar-button {\n" \ + " min-height: 20px;\n" \ + " min-width: 20px;\n" \ + " padding: 0;\n" \ + "}\n" \ + "filechooser > box.search-bar, filechooser > box:last-child {\n" \ + " border-bottom: 1px solid alpha(#000, 0.15);\n" \ + "}\n" \ + "filechooser > actionbar > revealer > box {\n" \ + " border-top: 1px solid alpha(#000, 0.15);\n" \ + "}\n" \ + "* {\n" \ + " -GtkDialog-action-area-border: 5;\n" \ + "}\n" \ + "messagedialog > box {\n" \ + " padding: 7px;\n" \ + "}\n" \ + "messagedialog buttonbox {\n" \ + " margin-top: -17px;\n" \ + "}\n" \ + "menu, .menu, .context-menu, tooltip {\n" \ + " border-radius: 0;\n" \ + "}\n" \ + ".background:not(.csd):not(.solid-csd) .titlebar:not(.default-decoration),\n" \ + ".background:not(.csd):not(.solid-csd) .titlebar:not(.default-decoration) headerbar {\n" \ + " background: inherit;\n" \ + "}\n" \ + "entry undershoot.left,\n" \ + "entry undershoot.right,\n" \ + "spinbutton:not(.vertical) undershoot.left,\n" \ + "spinbutton:not(.vertical) undershoot.right,\n" \ + "scrolledwindow undershoot.left,\n" \ + "scrolledwindow undershoot.right,\n" \ + "scrolledwindow undershoot.top,\n" \ + "scrolledwindow undershoot.bottom {\n" \ + " background-image: none;\n" \ + "}\n" + + +INTERCEPTED_CLASS_METHOD (gtk_settings, notify, + (GObject * object, + GParamSpec * pspec), + void) + + +INTERCEPTED_CLASS_METHOD (gtk_window, constructed, + (GObject * object), + void) + + +INTERCEPTED_CLASS_METHOD (gtk_statusbar, constructed, + (GObject * object), + void) + + +void smaller_widgets_init () +{ + { + GtkSettingsClass * gtk_settings_class = + g_type_class_ref (GTK_TYPE_SETTINGS); + + INTERCEPT_CLASS_METHOD (gtk_settings, G_OBJECT_CLASS, + notify) + + g_type_class_unref (gtk_settings_class); + } + + + { + GtkWindowClass * gtk_window_class = + g_type_class_ref (GTK_TYPE_WINDOW); + + INTERCEPT_CLASS_METHOD (gtk_window, G_OBJECT_CLASS, + constructed) + + g_type_class_unref (gtk_window_class); + } + + + { + GtkStatusbarClass * gtk_statusbar_class = + g_type_class_ref (GTK_TYPE_STATUSBAR); + + INTERCEPT_CLASS_METHOD (gtk_statusbar, G_OBJECT_CLASS, + constructed) + + g_type_class_unref (gtk_statusbar_class); + } +} + + +static void +new_gtk_settings_notify +(GObject * object, + GParamSpec * pspec) +{ + const char * theme_name; + GdkScreen * screen; + GtkCssProvider * provider; + + + CALL_ORIGINAL_CLASS_METHOD (gtk_settings, notify, (object, pspec)); + + + if (strcmp (pspec->name, "gtk-theme-name") != 0) + return; + + g_object_get (object, "gtk-theme-name", &theme_name, NULL); + + screen = g_object_get_data (object, "screen"); + if (screen == NULL) + return; + + provider = g_object_get_data (G_OBJECT (screen), + "smaller-adwaita-css"); + if (provider == NULL) + return; + + if (strcmp (theme_name, "Adwaita") == 0 || + strcmp (theme_name, "Adwaita-Dark") == 0 || + strcmp (theme_name, "HighContrast") == 0 || + strcmp (theme_name, "HighContrastInverse") == 0) + gtk_style_context_add_provider_for_screen (screen, + GTK_STYLE_PROVIDER (provider), + GTK_STYLE_PROVIDER_PRIORITY_SETTINGS); + else + gtk_style_context_remove_provider_for_screen (screen, + GTK_STYLE_PROVIDER (provider)); +} + + +static void +new_gtk_window_constructed +(GObject * object) +{ + GdkScreen * screen; + GtkCssProvider * provider; + GtkSettings * settings; + + + CALL_ORIGINAL_CLASS_METHOD (gtk_window, constructed, (object)); + + + screen = gtk_widget_get_screen (GTK_WIDGET (object)); + provider = g_object_get_data (G_OBJECT (screen), + "smaller-adwaita-css"); + if (provider == NULL) + { + provider = gtk_css_provider_new (); + gtk_css_provider_load_from_data (provider, CSS, -1, NULL); + g_object_set_data (G_OBJECT (screen), + "smaller-adwaita-css", + provider); + + settings = gtk_settings_get_for_screen (screen); + g_object_set_data (G_OBJECT (settings), "screen", screen); + g_object_notify (G_OBJECT (settings), + "gtk-theme-name"); + } + +} + + +static void +new_gtk_statusbar_constructed +(GObject * object) +{ + GtkStyleContext * style_context; + + + CALL_ORIGINAL_CLASS_METHOD (gtk_statusbar, constructed, (object)); + + + style_context = gtk_widget_get_style_context (GTK_WIDGET (object)); + gtk_style_context_add_class (style_context, "classic"); + + gtk_widget_set_margin_top (GTK_WIDGET (object), 1); + gtk_widget_set_margin_bottom (GTK_WIDGET (object), 1); +} -- cgit