forked from AuroraMiddleware/gtk
parasite: Use a template for themes
This commit is contained in:
parent
ee7cc6d189
commit
33d2044406
@ -7,5 +7,6 @@
|
|||||||
<file>classes-list.ui</file>
|
<file>classes-list.ui</file>
|
||||||
<file>widget-tree.ui</file>
|
<file>widget-tree.ui</file>
|
||||||
<file>prop-list.ui</file>
|
<file>prop-list.ui</file>
|
||||||
|
<file>themes.ui</file>
|
||||||
</gresource>
|
</gresource>
|
||||||
</gresources>
|
</gresources>
|
||||||
|
@ -24,45 +24,24 @@
|
|||||||
|
|
||||||
struct _ParasiteThemesPrivate
|
struct _ParasiteThemesPrivate
|
||||||
{
|
{
|
||||||
int dummy;
|
GtkWidget *dark_switch;
|
||||||
|
GtkWidget *theme_combo;
|
||||||
|
GtkWidget *icon_combo;
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_PRIVATE (ParasiteThemes, parasite_themes, GTK_TYPE_LIST_BOX)
|
G_DEFINE_TYPE_WITH_PRIVATE (ParasiteThemes, parasite_themes, GTK_TYPE_LIST_BOX)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
parasite_themes_init (ParasiteThemes *pt)
|
init_dark (ParasiteThemes *pt)
|
||||||
{
|
{
|
||||||
pt->priv = parasite_themes_get_instance_private (pt);
|
g_object_bind_property (pt->priv->dark_switch, "active",
|
||||||
}
|
|
||||||
|
|
||||||
static GtkWidget *
|
|
||||||
create_dark (ParasiteThemes *pt)
|
|
||||||
{
|
|
||||||
GtkWidget *b, *l, *s;
|
|
||||||
|
|
||||||
b = g_object_new (GTK_TYPE_BOX,
|
|
||||||
"orientation", GTK_ORIENTATION_HORIZONTAL,
|
|
||||||
"margin", 10,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
l = g_object_new (GTK_TYPE_LABEL,
|
|
||||||
"label", "Use dark variant",
|
|
||||||
"hexpand", TRUE,
|
|
||||||
"xalign", 0.0,
|
|
||||||
NULL);
|
|
||||||
gtk_container_add (GTK_CONTAINER (b), l);
|
|
||||||
|
|
||||||
s = gtk_switch_new ();
|
|
||||||
g_object_bind_property (s, "active",
|
|
||||||
gtk_settings_get_default (), "gtk-application-prefer-dark-theme",
|
gtk_settings_get_default (), "gtk-application-prefer-dark-theme",
|
||||||
G_BINDING_BIDIRECTIONAL);
|
G_BINDING_BIDIRECTIONAL);
|
||||||
gtk_container_add (GTK_CONTAINER (b), s);
|
|
||||||
|
|
||||||
return b;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fill_gtk (const char *path, GHashTable *t)
|
fill_gtk (const gchar *path,
|
||||||
|
GHashTable *t)
|
||||||
{
|
{
|
||||||
const gchar *dir_entry;
|
const gchar *dir_entry;
|
||||||
GDir *dir = g_dir_open (path, 0, NULL);
|
GDir *dir = g_dir_open (path, 0, NULL);
|
||||||
@ -72,7 +51,7 @@ fill_gtk (const char *path, GHashTable *t)
|
|||||||
|
|
||||||
while ((dir_entry = g_dir_read_name (dir)))
|
while ((dir_entry = g_dir_read_name (dir)))
|
||||||
{
|
{
|
||||||
char *filename = g_build_filename (path, dir_entry, "gtk-3.0", "gtk.css", NULL);
|
gchar *filename = g_build_filename (path, dir_entry, "gtk-3.0", "gtk.css", NULL);
|
||||||
|
|
||||||
if (g_file_test (filename, G_FILE_TEST_IS_REGULAR) &&
|
if (g_file_test (filename, G_FILE_TEST_IS_REGULAR) &&
|
||||||
!g_hash_table_contains (t, dir_entry))
|
!g_hash_table_contains (t, dir_entry))
|
||||||
@ -83,38 +62,14 @@ fill_gtk (const char *path, GHashTable *t)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_changed (GtkComboBox *c, ParasiteThemes *pt)
|
init_theme (ParasiteThemes *pt)
|
||||||
{
|
{
|
||||||
char *theme = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (c));
|
|
||||||
|
|
||||||
g_object_set (gtk_settings_get_default (),
|
|
||||||
"gtk-theme-name", theme,
|
|
||||||
NULL);
|
|
||||||
g_free (theme);
|
|
||||||
}
|
|
||||||
|
|
||||||
static GtkWidget *
|
|
||||||
create_gtk (ParasiteThemes *pt)
|
|
||||||
{
|
|
||||||
GtkWidget *b, *l, *c;
|
|
||||||
GHashTable *t;
|
GHashTable *t;
|
||||||
char *theme, *default_theme, *path;
|
|
||||||
GHashTableIter iter;
|
GHashTableIter iter;
|
||||||
int i, pos;
|
gchar *theme, *current_theme, *path;
|
||||||
|
gint i, pos;
|
||||||
GSettings *settings;
|
GSettings *settings;
|
||||||
|
|
||||||
b = g_object_new (GTK_TYPE_BOX,
|
|
||||||
"orientation", GTK_ORIENTATION_HORIZONTAL,
|
|
||||||
"margin", 10,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
l = g_object_new (GTK_TYPE_LABEL,
|
|
||||||
"label", "GTK+ Theme",
|
|
||||||
"hexpand", TRUE,
|
|
||||||
"xalign", 0.0,
|
|
||||||
NULL);
|
|
||||||
gtk_container_add (GTK_CONTAINER (b), l);
|
|
||||||
|
|
||||||
t = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
|
t = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
|
||||||
g_hash_table_add (t, g_strdup ("Raleigh"));
|
g_hash_table_add (t, g_strdup ("Raleigh"));
|
||||||
|
|
||||||
@ -123,32 +78,27 @@ create_gtk (ParasiteThemes *pt)
|
|||||||
fill_gtk (path, t);
|
fill_gtk (path, t);
|
||||||
g_free (path);
|
g_free (path);
|
||||||
|
|
||||||
c = gtk_combo_box_text_new ();
|
|
||||||
gtk_container_add (GTK_CONTAINER (b), c);
|
|
||||||
|
|
||||||
settings = g_settings_new ("org.gnome.desktop.interface");
|
settings = g_settings_new ("org.gnome.desktop.interface");
|
||||||
default_theme = g_settings_get_string (settings, "gtk-theme");
|
current_theme = g_settings_get_string (settings, "gtk-theme");
|
||||||
g_object_unref (settings);
|
g_object_unref (settings);
|
||||||
|
|
||||||
g_hash_table_iter_init (&iter, t);
|
g_hash_table_iter_init (&iter, t);
|
||||||
pos = i = 0;
|
pos = i = 0;
|
||||||
while (g_hash_table_iter_next (&iter, (gpointer *)&theme, NULL))
|
while (g_hash_table_iter_next (&iter, (gpointer *)&theme, NULL))
|
||||||
{
|
{
|
||||||
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (c), theme);
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pt->priv->theme_combo), theme);
|
||||||
if (g_strcmp0 (theme, default_theme) == 0)
|
if (g_strcmp0 (theme, current_theme) == 0)
|
||||||
pos = i;
|
pos = i;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
g_hash_table_destroy (t);
|
g_hash_table_destroy (t);
|
||||||
|
|
||||||
gtk_combo_box_set_active (GTK_COMBO_BOX (c), pos);
|
gtk_combo_box_set_active (GTK_COMBO_BOX (pt->priv->theme_combo), pos);
|
||||||
g_signal_connect (c, "changed", G_CALLBACK (gtk_changed), pt);
|
|
||||||
|
|
||||||
return b;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fill_icons (const char *path, GHashTable *t)
|
fill_icons (const gchar *path,
|
||||||
|
GHashTable *t)
|
||||||
{
|
{
|
||||||
const gchar *dir_entry;
|
const gchar *dir_entry;
|
||||||
GDir *dir = g_dir_open (path, 0, NULL);
|
GDir *dir = g_dir_open (path, 0, NULL);
|
||||||
@ -158,7 +108,7 @@ fill_icons (const char *path, GHashTable *t)
|
|||||||
|
|
||||||
while ((dir_entry = g_dir_read_name (dir)))
|
while ((dir_entry = g_dir_read_name (dir)))
|
||||||
{
|
{
|
||||||
char *filename = g_build_filename (path, dir_entry, "index.theme", NULL);
|
gchar *filename = g_build_filename (path, dir_entry, "index.theme", NULL);
|
||||||
|
|
||||||
if (g_file_test (filename, G_FILE_TEST_IS_REGULAR) &&
|
if (g_file_test (filename, G_FILE_TEST_IS_REGULAR) &&
|
||||||
g_strcmp0 (dir_entry, "hicolor") != 0 &&
|
g_strcmp0 (dir_entry, "hicolor") != 0 &&
|
||||||
@ -170,38 +120,14 @@ fill_icons (const char *path, GHashTable *t)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
icons_changed (GtkComboBox *c, ParasiteThemes *pt)
|
init_icons (ParasiteThemes *pt)
|
||||||
{
|
{
|
||||||
char *theme = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (c));
|
|
||||||
|
|
||||||
g_object_set (gtk_settings_get_default (),
|
|
||||||
"gtk-icon-theme-name", theme,
|
|
||||||
NULL);
|
|
||||||
g_free (theme);
|
|
||||||
}
|
|
||||||
|
|
||||||
static GtkWidget *
|
|
||||||
create_icons (ParasiteThemes *pt)
|
|
||||||
{
|
|
||||||
GtkWidget *b, *l, *c;
|
|
||||||
GHashTable *t;
|
GHashTable *t;
|
||||||
char *theme, *default_theme, *path;
|
|
||||||
GHashTableIter iter;
|
GHashTableIter iter;
|
||||||
int i, pos;
|
gchar *theme, *current_theme, *path;
|
||||||
|
gint i, pos;
|
||||||
GSettings *settings;
|
GSettings *settings;
|
||||||
|
|
||||||
b = g_object_new (GTK_TYPE_BOX,
|
|
||||||
"orientation", GTK_ORIENTATION_HORIZONTAL,
|
|
||||||
"margin", 10,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
l = g_object_new (GTK_TYPE_LABEL,
|
|
||||||
"label", "Icon Theme",
|
|
||||||
"hexpand", TRUE,
|
|
||||||
"xalign", 0.0,
|
|
||||||
NULL);
|
|
||||||
gtk_container_add (GTK_CONTAINER (b), l);
|
|
||||||
|
|
||||||
t = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
|
t = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
|
||||||
|
|
||||||
fill_icons (GTK_DATADIR "/icons", t);
|
fill_icons (GTK_DATADIR "/icons", t);
|
||||||
@ -209,51 +135,65 @@ create_icons (ParasiteThemes *pt)
|
|||||||
fill_icons (path, t);
|
fill_icons (path, t);
|
||||||
g_free (path);
|
g_free (path);
|
||||||
|
|
||||||
c = gtk_combo_box_text_new ();
|
|
||||||
gtk_container_add (GTK_CONTAINER (b), c);
|
|
||||||
|
|
||||||
settings = g_settings_new ("org.gnome.desktop.interface");
|
settings = g_settings_new ("org.gnome.desktop.interface");
|
||||||
default_theme = g_settings_get_string (settings, "icon-theme");
|
current_theme = g_settings_get_string (settings, "icon-theme");
|
||||||
g_object_unref (settings);
|
g_object_unref (settings);
|
||||||
|
|
||||||
g_hash_table_iter_init (&iter, t);
|
g_hash_table_iter_init (&iter, t);
|
||||||
pos = i = 0;
|
pos = i = 0;
|
||||||
while (g_hash_table_iter_next (&iter, (gpointer *)&theme, NULL))
|
while (g_hash_table_iter_next (&iter, (gpointer *)&theme, NULL))
|
||||||
{
|
{
|
||||||
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (c), theme);
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pt->priv->icon_combo), theme);
|
||||||
if (g_strcmp0 (theme, default_theme) == 0)
|
if (g_strcmp0 (theme, current_theme) == 0)
|
||||||
pos = i;
|
pos = i;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
g_hash_table_destroy (t);
|
g_hash_table_destroy (t);
|
||||||
|
|
||||||
gtk_combo_box_set_active (GTK_COMBO_BOX (c), pos);
|
gtk_combo_box_set_active (GTK_COMBO_BOX (pt->priv->icon_combo), pos);
|
||||||
g_signal_connect (c, "changed", G_CALLBACK (icons_changed), pt);
|
|
||||||
|
|
||||||
return b;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
constructed (GObject *object)
|
theme_changed (GtkComboBox *c,
|
||||||
|
ParasiteThemes *pt)
|
||||||
{
|
{
|
||||||
ParasiteThemes *pt = PARASITE_THEMES (object);
|
gchar *theme = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (c));
|
||||||
GtkContainer *box = GTK_CONTAINER (object);
|
g_object_set (gtk_settings_get_default (), "gtk-theme-name", theme, NULL);
|
||||||
|
g_free (theme);
|
||||||
|
}
|
||||||
|
|
||||||
g_object_set (object,
|
static void
|
||||||
"selection-mode", GTK_SELECTION_NONE,
|
icons_changed (GtkComboBox *c,
|
||||||
NULL);
|
ParasiteThemes *pt)
|
||||||
|
{
|
||||||
|
gchar *theme = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (c));
|
||||||
|
g_object_set (gtk_settings_get_default (), "gtk-icon-theme-name", theme, NULL);
|
||||||
|
g_free (theme);
|
||||||
|
}
|
||||||
|
|
||||||
gtk_container_add (box, create_dark (pt));
|
static void
|
||||||
gtk_container_add (box, create_gtk (pt));
|
parasite_themes_init (ParasiteThemes *pt)
|
||||||
gtk_container_add (box, create_icons (pt));
|
{
|
||||||
|
pt->priv = parasite_themes_get_instance_private (pt);
|
||||||
|
gtk_widget_init_template (GTK_WIDGET (pt));
|
||||||
|
|
||||||
|
init_dark (pt);
|
||||||
|
init_theme (pt);
|
||||||
|
init_icons (pt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
parasite_themes_class_init (ParasiteThemesClass *klass)
|
parasite_themes_class_init (ParasiteThemesClass *klass)
|
||||||
{
|
{
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||||
|
|
||||||
object_class->constructed = constructed;
|
gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/parasite/themes.ui");
|
||||||
|
gtk_widget_class_bind_template_child_private (widget_class, ParasiteThemes, dark_switch);
|
||||||
|
gtk_widget_class_bind_template_child_private (widget_class, ParasiteThemes, theme_combo);
|
||||||
|
gtk_widget_class_bind_template_child_private (widget_class, ParasiteThemes, icon_combo);
|
||||||
|
|
||||||
|
gtk_widget_class_bind_template_callback (widget_class, theme_changed);
|
||||||
|
gtk_widget_class_bind_template_callback (widget_class, icons_changed);
|
||||||
}
|
}
|
||||||
|
|
||||||
GtkWidget *
|
GtkWidget *
|
||||||
@ -262,4 +202,4 @@ parasite_themes_new (void)
|
|||||||
return GTK_WIDGET (g_object_new (PARASITE_TYPE_THEMES, NULL));
|
return GTK_WIDGET (g_object_new (PARASITE_TYPE_THEMES, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
// vim: set et sw=4 ts=4:
|
// vim: set et sw=2 ts=2:
|
||||||
|
@ -35,13 +35,15 @@
|
|||||||
|
|
||||||
typedef struct _ParasiteThemesPrivate ParasiteThemesPrivate;
|
typedef struct _ParasiteThemesPrivate ParasiteThemesPrivate;
|
||||||
|
|
||||||
typedef struct _ParasiteThemes {
|
typedef struct _ParasiteThemes
|
||||||
GtkListBox parent;
|
{
|
||||||
ParasiteThemesPrivate *priv;
|
GtkListBox parent;
|
||||||
|
ParasiteThemesPrivate *priv;
|
||||||
} ParasiteThemes;
|
} ParasiteThemes;
|
||||||
|
|
||||||
typedef struct _ParasiteThemesClass {
|
typedef struct _ParasiteThemesClass
|
||||||
GtkListBoxClass parent;
|
{
|
||||||
|
GtkListBoxClass parent;
|
||||||
} ParasiteThemesClass;
|
} ParasiteThemesClass;
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
@ -53,4 +55,4 @@ G_END_DECLS
|
|||||||
|
|
||||||
#endif // _GTKPARASITE_THEMES_H_
|
#endif // _GTKPARASITE_THEMES_H_
|
||||||
|
|
||||||
// vim: set et sw=4 ts=4:
|
// vim: set et sw=2 ts=2:
|
||||||
|
68
modules/other/parasite/themes.ui
Normal file
68
modules/other/parasite/themes.ui
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<interface>
|
||||||
|
<template class="ParasiteThemes" parent="GtkListBox">
|
||||||
|
<property name="selection-mode">none</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="orientation">horizontal</property>
|
||||||
|
<property name="margin">10</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="label">Use dark variant</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="xalign">0.0</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkSwitch" id="dark_switch">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="orientation">horizontal</property>
|
||||||
|
<property name="margin">10</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="label">GTK+ Theme</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="xalign">0.0</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkComboBoxText" id="theme_combo">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<signal name="changed" handler="theme_changed"/>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="orientation">horizontal</property>
|
||||||
|
<property name="margin">10</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="label">Icon Theme</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="xalign">0.0</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkComboBoxText" id="icon_combo">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<signal name="changed" handler="icons_changed"/>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</template>
|
||||||
|
</interface>
|
Loading…
Reference in New Issue
Block a user