diff options
author | Robert Tari <robert@tari.in> | 2024-08-27 14:43:59 +0200 |
---|---|---|
committer | Robert Tari <robert@tari.in> | 2024-08-27 14:43:59 +0200 |
commit | 269aa4c7df03e1e581c01866c91bcfa5524d6334 (patch) | |
tree | 2fcd022cbfcb82537b15ae334b563cfaf16e5dde /src/gtk.h | |
parent | 4bfbd579171d9194956376c7153f378ff6eb9d4e (diff) | |
download | ayatana-settings-269aa4c7df03e1e581c01866c91bcfa5524d6334.tar.gz ayatana-settings-269aa4c7df03e1e581c01866c91bcfa5524d6334.tar.bz2 ayatana-settings-269aa4c7df03e1e581c01866c91bcfa5524d6334.zip |
Rewrite using C/CMake/Gtk4 and add some features/tweaks
Diffstat (limited to 'src/gtk.h')
-rw-r--r-- | src/gtk.h | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/src/gtk.h b/src/gtk.h new file mode 100644 index 0000000..fc01b3c --- /dev/null +++ b/src/gtk.h @@ -0,0 +1,210 @@ +#ifndef __GTK__ +#define __GTK__ + +#include <glib/gi18n.h> +#include <locale.h> +#include <gtk/gtk.h> + +G_BEGIN_DECLS + +typedef struct +{ + gchar *sId; + GCallback pCallback; +} ApplicationCallbackSymbol; + +typedef struct +{ + gchar *sUi; + GCallback pCallback; + ApplicationCallbackSymbol *lSymbols; +} ApplicationStartup; + +static GtkBuilder *m_pBuilder = NULL; +static GSettings *m_pDesktopSettings = NULL; +static GSettings *m_pA11ySettings = NULL; + +static inline void application_OnShutdown (GApplication *pApplication, gpointer pData) +{ + if (pData) + { + GCallback pCallback = (GCallback) pData; + pCallback (); + } + + g_object_unref (m_pBuilder); + g_clear_object (&m_pDesktopSettings); + g_clear_object (&m_pA11ySettings); +} + +static inline GObject* application_GetObject (gchar *sId) +{ + GObject *pObject = gtk_builder_get_object (m_pBuilder, sId); + + return pObject; +} + +static inline void application_OnActivate (GApplication *pApplication, gpointer pData) +{ + GList *lWindows = gtk_application_get_windows (GTK_APPLICATION (pApplication)); + + if (lWindows) + { + return; + } + + GObject *pWindow = gtk_builder_get_object (m_pBuilder, "window"); + gtk_window_present (GTK_WINDOW (pWindow)); + gtk_application_add_window (GTK_APPLICATION (pApplication), GTK_WINDOW (pWindow)); + GCallback pCallback = (GCallback) pData; + + if (pCallback) + { + pCallback (); + } +} + +static inline void application_onThemeChanged (GSettings *pSettings, const gchar *sKey, gpointer pData) +{ + gchar *sColorScheme = g_settings_get_string (m_pDesktopSettings, "color-scheme"); + gboolean bDark = string_Equal (sColorScheme, "prefer-dark"); + g_free (sColorScheme); + gboolean bHighContrast = g_settings_get_boolean (m_pA11ySettings, "high-contrast"); + GtkSettings *pGtkSettings = gtk_settings_get_default (); + + if (bHighContrast && bDark) + { + g_object_set (pGtkSettings, "gtk-theme-name", "Default-hc-dark", NULL); + } + else if (bHighContrast) + { + g_object_set (pGtkSettings, "gtk-theme-name", "Default-hc", NULL); + } + else if (bDark) + { + gtk_settings_reset_property (pGtkSettings, "gtk-theme-name"); + } + else + { + gtk_settings_reset_property (pGtkSettings, "gtk-theme-name"); + } + + g_object_set (pGtkSettings, "gtk-application-prefer-dark-theme", bDark, NULL); +} + +static inline void application_OnStartup (GApplication *pApplication, gpointer pData) +{ + ApplicationStartup *pStartup = (ApplicationStartup*) pData; + m_pBuilder = gtk_builder_new (); + GtkBuilderScope *pScope = gtk_builder_get_scope (m_pBuilder); + guint nId = 0; + + while (pStartup->lSymbols[nId].pCallback != NULL) + { + gtk_builder_cscope_add_callback_symbol (GTK_BUILDER_CSCOPE (pScope), pStartup->lSymbols[nId].sId, pStartup->lSymbols[nId].pCallback); + nId++; + } + + gtk_builder_add_from_resource (m_pBuilder, pStartup->sUi, NULL); + g_free (pStartup->sUi); + gtk_builder_set_translation_domain (m_pBuilder, GETTEXT_PACKAGE); + GSettingsSchemaSource *pSource = g_settings_schema_source_get_default (); + GSettingsSchema *pSchema = g_settings_schema_source_lookup (pSource, "org.gnome.desktop.interface", FALSE); + + if (pSchema) + { + gboolean bKey = g_settings_schema_has_key (pSchema, "color-scheme"); + g_settings_schema_unref (pSchema); + + if (bKey) + { + m_pDesktopSettings = g_settings_new ("org.gnome.desktop.interface"); + g_signal_connect (m_pDesktopSettings, "changed::color-scheme", G_CALLBACK (application_onThemeChanged), NULL); + } + } + + pSchema = g_settings_schema_source_lookup (pSource, "org.gnome.desktop.a11y.interface", FALSE); + + if (pSchema) + { + gboolean bKey = g_settings_schema_has_key (pSchema, "high-contrast"); + g_settings_schema_unref (pSchema); + + if (bKey) + { + m_pA11ySettings = g_settings_new ("org.gnome.desktop.a11y.interface"); + g_signal_connect (m_pA11ySettings, "changed::high-contrast", G_CALLBACK (application_onThemeChanged), NULL); + } + } + + if (m_pDesktopSettings && m_pA11ySettings) + { + application_onThemeChanged (NULL, NULL, NULL); + } + + if (pStartup->pCallback) + { + pStartup->pCallback (); + } +} + +static inline gint application_Init (ApplicationCallbackSymbol *lSymbols, gchar *sId, GCallback pOnStartup, GCallback pOnActivate, GCallback pOnShutdown, gint argc, gchar *argv[]) +{ + setlocale (LC_ALL, ""); + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + textdomain (GETTEXT_PACKAGE); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + GtkApplication *pApplication = gtk_application_new (sId, G_APPLICATION_DEFAULT_FLAGS); + gchar *sReplaced = string_Replace (sId, ".", "/"); + gchar *sConcatenated = g_strconcat ("/", sReplaced, "/", GETTEXT_PACKAGE, ".ui", NULL); + g_free (sReplaced); + ApplicationStartup cApplicationStartup = {sConcatenated, pOnStartup, lSymbols}; + g_signal_connect (pApplication, "startup", G_CALLBACK (application_OnStartup), &cApplicationStartup); + g_signal_connect (pApplication, "activate", G_CALLBACK (application_OnActivate), pOnActivate); + g_signal_connect (pApplication, "shutdown", G_CALLBACK (application_OnShutdown), pOnShutdown); + gint nStatus = g_application_run (G_APPLICATION (pApplication), argc, argv); + g_object_unref (pApplication); + + return nStatus; +} + +static inline void listview_SetStringListFactory (gchar *sListView) +{ + const char *sFactory = + "<?xml version='1.0' encoding='UTF-8'?>\n" + "<interface>\n" + " <template class='GtkListItem'>\n" + " <property name='child'>\n" + " <object class='GtkInscription'>\n" + " <property name='xalign'>0</property>\n" + " <binding name='text'>\n" + " <lookup name='string' type='GtkStringObject'>\n" + " <lookup name='item'>GtkListItem</lookup>\n" + " </lookup>\n" + " </binding>\n" + " </object>\n" + " </property>\n" + " </template>\n" + "</interface>\n"; + + gsize nSize = strlen (sFactory); + GBytes *pBytes = g_bytes_new_static (sFactory, nSize); + GtkListItemFactory *pFactory = gtk_builder_list_item_factory_new_from_bytes (NULL, pBytes); + GtkListView *pListView = GTK_LIST_VIEW (application_GetObject (sListView)); + gtk_list_view_set_factory (pListView, pFactory); +} + +static inline void notebook_DisablePage (gchar *sPage) +{ + GtkNotebookPage *pPage = GTK_NOTEBOOK_PAGE (application_GetObject (sPage)); + GtkWidget *pChild = gtk_notebook_page_get_child (pPage); + gtk_widget_set_sensitive (pChild, FALSE); + GtkWidget *pTab = NULL; + g_object_get (pPage, "tab", &pTab, NULL); + gtk_widget_set_sensitive (pTab, FALSE); + g_object_unref (pTab); +} + +G_END_DECLS + +#endif |