[Xfce4-commits] [xfce/xfce4-panel] 01/01: Add dark mode preference
noreply at xfce.org
noreply at xfce.org
Thu Oct 17 01:24:12 CEST 2019
This is an automated email from the git hooks/post-receive script.
o c h o s i p u s h e d a c o m m i t t o b r a n c h m a s t e r
in repository xfce/xfce4-panel.
commit 0640444de58adf55e93042e89b198b209f9b990f
Author: Simon Steinbeiss <simon.steinbeiss at elfenbeinturm.at>
Date: Tue Sep 17 16:53:02 2019 +0200
Add dark mode preference
This also results in the panel preferences dialog being drawn with the
Gtk dark theme variant, as well as all plugins and their various
widgets.
---
libxfce4panel/xfce-panel-plugin-provider.c | 11 +++++
libxfce4panel/xfce-panel-plugin-provider.h | 6 +++
libxfce4panel/xfce-panel-plugin.c | 60 ++++++++++++++++++++++++++
panel/panel-application.c | 1 +
panel/panel-plugin-external.c | 23 ++++++++++
panel/panel-preferences-dialog.c | 1 +
panel/panel-preferences-dialog.glade | 68 ++++++++++++++++++++++++++---
panel/panel-window.c | 69 +++++++++++++++++++++++++++++-
wrapper/main.c | 4 ++
9 files changed, 235 insertions(+), 8 deletions(-)
diff --git a/libxfce4panel/xfce-panel-plugin-provider.c b/libxfce4panel/xfce-panel-plugin-provider.c
index 9018e2d..4791b0d 100644
--- a/libxfce4panel/xfce-panel-plugin-provider.c
+++ b/libxfce4panel/xfce-panel-plugin-provider.c
@@ -126,6 +126,17 @@ xfce_panel_plugin_provider_set_icon_size (XfcePanelPluginProvider *provider,
void
+xfce_panel_plugin_provider_set_dark_mode (XfcePanelPluginProvider *provider,
+ gboolean dark_mode)
+{
+ panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
+
+ (*XFCE_PANEL_PLUGIN_PROVIDER_GET_INTERFACE (provider)->set_dark_mode) (provider, dark_mode);
+}
+
+
+
+void
xfce_panel_plugin_provider_set_mode (XfcePanelPluginProvider *provider,
XfcePanelPluginMode mode)
{
diff --git a/libxfce4panel/xfce-panel-plugin-provider.h b/libxfce4panel/xfce-panel-plugin-provider.h
index 3dfaac7..6214f94 100644
--- a/libxfce4panel/xfce-panel-plugin-provider.h
+++ b/libxfce4panel/xfce-panel-plugin-provider.h
@@ -54,6 +54,8 @@ struct _XfcePanelPluginProviderInterface
gint size);
void (*set_icon_size) (XfcePanelPluginProvider *provider,
gint icon_size);
+ void (*set_dark_mode) (XfcePanelPluginProvider *provider,
+ gboolean dark_mode);
void (*set_mode) (XfcePanelPluginProvider *provider,
XfcePanelPluginMode mode);
void (*set_nrows) (XfcePanelPluginProvider *provider,
@@ -104,6 +106,7 @@ typedef enum /*< skip >*/
{
PROVIDER_PROP_TYPE_SET_SIZE, /* gint */
PROVIDER_PROP_TYPE_SET_ICON_SIZE, /* gint */
+ PROVIDER_PROP_TYPE_SET_DARK_MODE, /* gboolean */
PROVIDER_PROP_TYPE_SET_MODE, /* XfcePanelPluginMode (as gint) */
PROVIDER_PROP_TYPE_SET_SCREEN_POSITION, /* XfceScreenPosition (as gint) */
PROVIDER_PROP_TYPE_SET_BACKGROUND_ALPHA, /* gdouble */
@@ -163,6 +166,9 @@ void xfce_panel_plugin_provider_set_size (XfcePanelP
void xfce_panel_plugin_provider_set_icon_size (XfcePanelPluginProvider *provider,
gint icon_size);
+void xfce_panel_plugin_provider_set_dark_mode (XfcePanelPluginProvider *provider,
+ gboolean dark_mode);
+
void xfce_panel_plugin_provider_set_mode (XfcePanelPluginProvider *provider,
XfcePanelPluginMode mode);
diff --git a/libxfce4panel/xfce-panel-plugin.c b/libxfce4panel/xfce-panel-plugin.c
index fc60fd2..f27a2ce 100644
--- a/libxfce4panel/xfce-panel-plugin.c
+++ b/libxfce4panel/xfce-panel-plugin.c
@@ -93,6 +93,8 @@ static void xfce_panel_plugin_set_size (XfcePanelPluginPr
gint size);
static void xfce_panel_plugin_set_icon_size (XfcePanelPluginProvider *provider,
gint icon_size);
+static void xfce_panel_plugin_set_dark_mode (XfcePanelPluginProvider *provider,
+ gboolean dark_mode);
static void xfce_panel_plugin_set_mode (XfcePanelPluginProvider *provider,
XfcePanelPluginMode mode);
static void xfce_panel_plugin_set_nrows (XfcePanelPluginProvider *provider,
@@ -130,6 +132,7 @@ enum
PROP_ORIENTATION,
PROP_SIZE,
PROP_ICON_SIZE,
+ PROP_DARK_MODE,
PROP_SMALL,
PROP_SCREEN_POSITION,
PROP_EXPAND,
@@ -177,6 +180,7 @@ struct _XfcePanelPluginPrivate
gchar **arguments;
gint size; /* single row size */
gint icon_size;
+ gboolean dark_mode;
guint expand : 1;
guint shrink : 1;
guint nrows;
@@ -591,6 +595,22 @@ xfce_panel_plugin_class_init (XfcePanelPluginClass *klass)
| G_PARAM_STATIC_STRINGS);
/**
+ * XfcePanelPlugin:dark-mode:
+ *
+ * Whether the #XfcePanelPlugin shall request the Gtk dark theme variant (based on the panel
+ * setting).
+ *
+ * Since: 4.14
+ **/
+ plugin_props[PROP_DARK_MODE] =
+ g_param_spec_boolean ("dark-mode",
+ "Dark Mode",
+ "Whether or not to request the Gtk dark theme variant",
+ FALSE,
+ G_PARAM_READWRITE
+ | G_PARAM_STATIC_STRINGS);
+
+ /**
* XfcePanelPlugin:screen-position:
*
* The #XfceScreenPosition of the #XfcePanelPlugin. Plugin writer can use it
@@ -708,6 +728,7 @@ xfce_panel_plugin_init (XfcePanelPlugin *plugin)
plugin->priv->arguments = NULL;
plugin->priv->size = 0;
plugin->priv->icon_size = 0;
+ plugin->priv->dark_mode = FALSE;
plugin->priv->small = FALSE;
plugin->priv->expand = FALSE;
plugin->priv->shrink = FALSE;
@@ -744,6 +765,7 @@ xfce_panel_plugin_provider_init (XfcePanelPluginProviderInterface *iface)
iface->get_unique_id = (ProviderToPluginInt) xfce_panel_plugin_get_unique_id;
iface->set_size = xfce_panel_plugin_set_size;
iface->set_icon_size = xfce_panel_plugin_set_icon_size;
+ iface->set_dark_mode = xfce_panel_plugin_set_dark_mode;
iface->set_mode = xfce_panel_plugin_set_mode;
iface->set_nrows = xfce_panel_plugin_set_nrows;
iface->set_screen_position = xfce_panel_plugin_set_screen_position;
@@ -819,6 +841,10 @@ xfce_panel_plugin_get_property (GObject *object,
g_value_set_uint (value, private->icon_size);
break;
+ case PROP_DARK_MODE:
+ g_value_set_boolean (value, private->dark_mode);
+ break;
+
case PROP_NROWS:
g_value_set_uint (value, private->nrows);
break;
@@ -890,6 +916,11 @@ xfce_panel_plugin_set_property (GObject *object,
private->arguments = g_value_dup_boxed (value);
break;
+ case PROP_DARK_MODE:
+ xfce_panel_plugin_set_dark_mode (XFCE_PANEL_PLUGIN_PROVIDER (object),
+ g_value_get_boolean (value));
+ break;
+
case PROP_SMALL:
xfce_panel_plugin_set_small (XFCE_PANEL_PLUGIN (object),
g_value_get_boolean (value));
@@ -1490,6 +1521,35 @@ xfce_panel_plugin_set_icon_size (XfcePanelPluginProvider *provider,
static void
+xfce_panel_plugin_set_dark_mode (XfcePanelPluginProvider *provider,
+ gboolean dark_mode)
+{
+#if GTK_CHECK_VERSION (3, 0, 0)
+ XfcePanelPlugin *plugin = XFCE_PANEL_PLUGIN (provider);
+ GtkSettings *gtk_settings;
+
+ if (G_LIKELY (plugin->priv->dark_mode != dark_mode))
+ {
+ plugin->priv->dark_mode = dark_mode;
+ g_object_notify_by_pspec (G_OBJECT (plugin), plugin_props[PROP_DARK_MODE]);
+
+ gtk_settings = gtk_widget_get_settings (GTK_WIDGET (plugin));
+
+ if (!dark_mode)
+ gtk_settings_reset_property (gtk_settings,
+ "gtk-application-prefer-dark-theme");
+
+ g_object_set (gtk_settings,
+ "gtk-application-prefer-dark-theme",
+ dark_mode,
+ NULL);
+ }
+#endif
+}
+
+
+
+static void
xfce_panel_plugin_set_mode (XfcePanelPluginProvider *provider,
XfcePanelPluginMode mode)
{
diff --git a/panel/panel-application.c b/panel/panel-application.c
index 93dcf27..2bcb05a 100644
--- a/panel/panel-application.c
+++ b/panel/panel-application.c
@@ -296,6 +296,7 @@ panel_application_xfconf_window_bindings (PanelApplication *application,
{ "length-adjust", G_TYPE_BOOLEAN },
{ "enter-opacity", G_TYPE_UINT },
{ "leave-opacity", G_TYPE_UINT },
+ { "dark-mode", G_TYPE_BOOLEAN },
{ "background-style", G_TYPE_UINT },
{ "background-rgba", GDK_TYPE_RGBA },
{ "background-image", G_TYPE_STRING },
diff --git a/panel/panel-plugin-external.c b/panel/panel-plugin-external.c
index 48ea492..0b62bb8 100644
--- a/panel/panel-plugin-external.c
+++ b/panel/panel-plugin-external.c
@@ -85,6 +85,8 @@ static void panel_plugin_external_set_size (XfcePanelPlug
gint size);
static void panel_plugin_external_set_icon_size (XfcePanelPluginProvider *provider,
gint icon_size);
+static void panel_plugin_external_set_dark_mode (XfcePanelPluginProvider *provider,
+ gboolean dark_mode);
static void panel_plugin_external_set_mode (XfcePanelPluginProvider *provider,
XfcePanelPluginMode mode);
static void panel_plugin_external_set_nrows (XfcePanelPluginProvider *provider,
@@ -224,6 +226,7 @@ panel_plugin_external_provider_init (XfcePanelPluginProviderInterface *iface)
iface->get_unique_id = panel_plugin_external_get_unique_id;
iface->set_size = panel_plugin_external_set_size;
iface->set_icon_size = panel_plugin_external_set_icon_size;
+ iface->set_dark_mode = panel_plugin_external_set_dark_mode;
iface->set_mode = panel_plugin_external_set_mode;
iface->set_nrows = panel_plugin_external_set_nrows;
iface->set_screen_position = panel_plugin_external_set_screen_position;
@@ -926,6 +929,26 @@ panel_plugin_external_set_icon_size (XfcePanelPluginProvider *provider,
static void
+panel_plugin_external_set_dark_mode (XfcePanelPluginProvider *provider,
+ gboolean dark_mode)
+{
+ GValue value = { 0, };
+
+ panel_return_if_fail (PANEL_IS_PLUGIN_EXTERNAL (provider));
+ panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
+
+ g_value_init (&value, G_TYPE_BOOLEAN);
+ g_value_set_boolean (&value, dark_mode);
+
+ panel_plugin_external_queue_add (PANEL_PLUGIN_EXTERNAL (provider),
+ PROVIDER_PROP_TYPE_SET_DARK_MODE, &value);
+
+ g_value_unset (&value);
+}
+
+
+
+static void
panel_plugin_external_set_mode (XfcePanelPluginProvider *provider,
XfcePanelPluginMode mode)
{
diff --git a/panel/panel-preferences-dialog.c b/panel/panel-preferences-dialog.c
index 8747da2..4c8dab1 100644
--- a/panel/panel-preferences-dialog.c
+++ b/panel/panel-preferences-dialog.c
@@ -487,6 +487,7 @@ panel_preferences_dialog_bindings_update (PanelPreferencesDialog *dialog)
panel_preferences_dialog_bindings_add (dialog, "background-style", "active", 0);
panel_preferences_dialog_bindings_add (dialog, "background-rgba", "rgba", 0);
panel_preferences_dialog_bindings_add (dialog, "icon-size", "value", 0);
+ panel_preferences_dialog_bindings_add (dialog, "dark-mode", "active", 0);
/* watch image changes from the panel */
dialog->bg_image_notify_handler_id = g_signal_connect_swapped (G_OBJECT (dialog->active),
diff --git a/panel/panel-preferences-dialog.glade b/panel/panel-preferences-dialog.glade
index 97a31f7..505aa2a 100644
--- a/panel/panel-preferences-dialog.glade
+++ b/panel/panel-preferences-dialog.glade
@@ -680,6 +680,62 @@
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
+ <object class="GtkGrid" id="general-grid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_bottom">18</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes"><b>General</b></property>
+ <property name="use_markup">True</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">12</property>
+ <property name="hexpand">True</property>
+ <property name="label" translatable="yes">Dark mode</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSwitch" id="dark-mode">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
<object class="GtkGrid" id="background-grid">
<property name="visible">True</property>
<property name="can_focus">False</property>
@@ -790,11 +846,11 @@
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
- <property name="position">0</property>
+ <property name="position">1</property>
</packing>
</child>
<child>
- <object class="GtkGrid">
+ <object class="GtkGrid" id="icons-grid">
<property name="name">icons-grid</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
@@ -895,7 +951,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
- <property name="position">1</property>
+ <property name="position">2</property>
</packing>
</child>
<child>
@@ -909,7 +965,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
- <property name="position">2</property>
+ <property name="position">3</property>
</packing>
</child>
<child>
@@ -991,7 +1047,7 @@ Enable compositing in the window manager for opacity settings in the panel.</pro
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
- <property name="position">3</property>
+ <property name="position">4</property>
</packing>
</child>
<child>
@@ -1060,7 +1116,7 @@ Enable compositing in the window manager for opacity settings in the panel.</pro
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
- <property name="position">4</property>
+ <property name="position">5</property>
</packing>
</child>
</object>
diff --git a/panel/panel-window.c b/panel/panel-window.c
index b32844a..91e9492 100644
--- a/panel/panel-window.c
+++ b/panel/panel-window.c
@@ -139,6 +139,7 @@ static void panel_window_size_allocate_set_xy (PanelWind
static void panel_window_screen_changed (GtkWidget *widget,
GdkScreen *previous_screen);
static void panel_window_style_updated (GtkWidget *widget);
+static void panel_window_update_dark_mode (gboolean dark_mode);
static void panel_window_realize (GtkWidget *widget);
static StrutsEgde panel_window_screen_struts_edge (PanelWindow *window);
static void panel_window_screen_struts_set (PanelWindow *window);
@@ -175,6 +176,8 @@ static void panel_window_plugin_set_size (GtkWidget
gpointer user_data);
static void panel_window_plugin_set_icon_size (GtkWidget *widget,
gpointer user_data);
+static void panel_window_plugin_set_dark_mode (GtkWidget *widget,
+ gpointer user_data);
static void panel_window_plugin_set_nrows (GtkWidget *widget,
gpointer user_data);
static void panel_window_plugin_set_screen_position (GtkWidget *widget,
@@ -197,7 +200,8 @@ enum
PROP_OUTPUT_NAME,
PROP_POSITION,
PROP_DISABLE_STRUTS,
- PROP_ICON_SIZE
+ PROP_ICON_SIZE,
+ PROP_DARK_MODE
};
enum _PluginProp
@@ -206,7 +210,8 @@ enum _PluginProp
PLUGIN_PROP_SCREEN_POSITION,
PLUGIN_PROP_NROWS,
PLUGIN_PROP_SIZE,
- PLUGIN_PROP_ICON_SIZE
+ PLUGIN_PROP_ICON_SIZE,
+ PLUGIN_PROP_DARK_MODE
};
enum _AutohideBehavior
@@ -311,6 +316,9 @@ struct _PanelWindow
gulong struts[N_STRUTS];
guint struts_disabled : 1;
+ /* dark mode */
+ gboolean dark_mode;
+
/* window positioning */
guint size;
guint icon_size;
@@ -430,6 +438,12 @@ panel_window_class_init (PanelWindowClass *klass)
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class,
+ PROP_DARK_MODE,
+ g_param_spec_boolean ("dark-mode", NULL, NULL,
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class,
PROP_NROWS,
g_param_spec_uint ("nrows", NULL, NULL,
1, 6, 1,
@@ -533,6 +547,7 @@ panel_window_init (PanelWindow *window)
window->mode = XFCE_PANEL_PLUGIN_MODE_HORIZONTAL;
window->size = 48;
window->icon_size = 0;
+ window->dark_mode = FALSE;
window->nrows = 1;
window->length = 0.10;
window->length_adjust = TRUE;
@@ -596,6 +611,10 @@ panel_window_get_property (GObject *object,
g_value_set_uint (value, window->icon_size);
break;
+ case PROP_DARK_MODE:
+ g_value_set_boolean (value, window->dark_mode);
+ break;
+
case PROP_NROWS:
g_value_set_uint (value, window->nrows);
break;
@@ -701,6 +720,18 @@ panel_window_set_property (GObject *object,
panel_window_plugins_update (window, PLUGIN_PROP_ICON_SIZE);
break;
+ case PROP_DARK_MODE:
+ val_bool = g_value_get_boolean (value);
+ if (window->dark_mode != val_bool)
+ {
+ window->dark_mode = val_bool;
+ }
+
+ /* set dark mode for the main application and plugins */
+ panel_window_update_dark_mode (window->dark_mode);
+ panel_window_plugins_update (window, PLUGIN_PROP_DARK_MODE);
+ break;
+
case PROP_NROWS:
val_uint = g_value_get_uint (value);
if (window->nrows != val_uint)
@@ -1634,6 +1665,22 @@ panel_window_screen_changed (GtkWidget *widget,
static void
+panel_window_update_dark_mode (gboolean dark_mode)
+{
+ GtkSettings *gtk_settings;
+
+ gtk_settings = gtk_settings_get_default ();
+
+ if (!dark_mode)
+ gtk_settings_reset_property (gtk_settings, "gtk-application-prefer-dark-theme");
+ g_object_set (gtk_settings,
+ "gtk-application-prefer-dark-theme",
+ dark_mode,
+ NULL);
+}
+
+
+static void
panel_window_style_updated (GtkWidget *widget)
{
PanelWindow *window = PANEL_WINDOW (widget);
@@ -2956,6 +3003,10 @@ panel_window_plugins_update (PanelWindow *window,
func = panel_window_plugin_set_icon_size;
break;
+ case PLUGIN_PROP_DARK_MODE:
+ func = panel_window_plugin_set_dark_mode;
+ break;
+
default:
panel_assert_not_reached ();
return;
@@ -3011,6 +3062,19 @@ panel_window_plugin_set_icon_size (GtkWidget *widget,
static void
+panel_window_plugin_set_dark_mode (GtkWidget *widget,
+ gpointer user_data)
+{
+ panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (widget));
+ panel_return_if_fail (PANEL_IS_WINDOW (user_data));
+
+ xfce_panel_plugin_provider_set_dark_mode (XFCE_PANEL_PLUGIN_PROVIDER (widget),
+ PANEL_WINDOW (user_data)->dark_mode);
+}
+
+
+
+static void
panel_window_plugin_set_nrows (GtkWidget *widget,
gpointer user_data)
{
@@ -3177,6 +3241,7 @@ panel_window_set_povider_info (PanelWindow *window,
panel_window_plugin_set_screen_position (provider, window);
panel_window_plugin_set_size (provider, window);
panel_window_plugin_set_icon_size (provider, window);
+ panel_window_plugin_set_dark_mode (provider, window);
panel_window_plugin_set_nrows (provider, window);
}
diff --git a/wrapper/main.c b/wrapper/main.c
index 6b145c1..192bfb6 100644
--- a/wrapper/main.c
+++ b/wrapper/main.c
@@ -79,6 +79,10 @@ wrapper_gproxy_set (XfcePanelPluginProvider *provider,
xfce_panel_plugin_provider_set_icon_size (provider, g_variant_get_int32 (variant));
break;
+ case PROVIDER_PROP_TYPE_SET_DARK_MODE:
+ xfce_panel_plugin_provider_set_dark_mode (provider, g_variant_get_boolean (variant));
+ break;
+
case PROVIDER_PROP_TYPE_SET_MODE:
xfce_panel_plugin_provider_set_mode (provider, g_variant_get_int32 (variant));
break;
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list