summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArpit Gupta <guptarpit1997@gmail.com>2019-03-10 12:21:13 +0530
committerMartin Braun <martin.braun@ettus.com>2020-01-07 14:59:31 -0800
commit507e85722573cfdc3029b4fd7776a75987f332d7 (patch)
tree61105f74654a2fb76324a0c8e69b45d53d3ed4d6
parentdc0df099909d65a2ab15ce857ca667e40848e4db (diff)
GRC: Fix color for input boxes in parameter widget for dark themes
Co-Authored-By: Martin Braun <martin@gnuradio.org>
-rw-r--r--grc/gui/Constants.py11
-rw-r--r--grc/gui/ParamWidgets.py69
-rw-r--r--grc/gui/canvas/colors.py40
3 files changed, 92 insertions, 28 deletions
diff --git a/grc/gui/Constants.py b/grc/gui/Constants.py
index a3d08cbe38..573fabe82b 100644
--- a/grc/gui/Constants.py
+++ b/grc/gui/Constants.py
@@ -106,6 +106,17 @@ and kindly ask to update their GRC Block Descriptions or Block Tree to include a
# DPI_SCALING = _SCREEN_RESOLUTION / 96.0 if _SCREEN_RESOLUTION > 0 else 1.0
DPI_SCALING = 1.0 # todo: figure out the GTK3 way (maybe cairo does this for us
+# Gtk-themes classified as dark
+GTK_DARK_THEMES = [
+ 'Adwaita-dark',
+ 'HighContrastInverse',
+]
+
+GTK_SETTINGS_INI_PATH = '~/.config/gtk-3.0/settings.ini'
+
+GTK_INI_PREFER_DARK_KEY = 'gtk-application-prefer-dark-theme'
+GTK_INI_THEME_NAME_KEY = 'gtk-theme-name'
+
def update_font_size(font_size):
global PORT_SEPARATION, BLOCK_FONT, PORT_FONT, PARAM_FONT, FONT_SIZE
diff --git a/grc/gui/ParamWidgets.py b/grc/gui/ParamWidgets.py
index d168b62d74..1b44f3bbdb 100644
--- a/grc/gui/ParamWidgets.py
+++ b/grc/gui/ParamWidgets.py
@@ -17,40 +17,53 @@
from __future__ import absolute_import
import os
+import configparser
+import subprocess
from gi.repository import Gtk, Gdk
+from . import Constants
from . import Utils
+from .canvas.colors import LIGHT_THEME_STYLES, DARK_THEME_STYLES
-style_provider = Gtk.CssProvider()
-
-style_provider.load_from_data(b"""
- #dtype_complex { background-color: #3399FF; }
- #dtype_real { background-color: #FF8C69; }
- #dtype_float { background-color: #FF8C69; }
- #dtype_int { background-color: #00FF99; }
-
- #dtype_complex_vector { background-color: #3399AA; }
- #dtype_real_vector { background-color: #CC8C69; }
- #dtype_float_vector { background-color: #CC8C69; }
- #dtype_int_vector { background-color: #00CC99; }
-
- #dtype_bool { background-color: #00FF99; }
- #dtype_hex { background-color: #00FF99; }
- #dtype_string { background-color: #CC66CC; }
- #dtype_id { background-color: #DDDDDD; }
- #dtype_stream_id { background-color: #DDDDDD; }
- #dtype_raw { background-color: #FFFFFF; }
-
- #enum_custom { background-color: #EEEEEE; }
-""")
-
-Gtk.StyleContext.add_provider_for_screen(
- Gdk.Screen.get_default(),
- style_provider,
- Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
-)
+def have_dark_theme():
+ """
+ Returns true if the currently selected theme is a dark one.
+ """
+ def is_dark_theme(theme_name):
+ """
+ Check if a theme is dark based on its name.
+ """
+ return theme_name in Constants.GTK_DARK_THEMES or "dark" in theme_name.lower()
+ # GoGoGo
+ config = configparser.ConfigParser()
+ config.read(os.path.expanduser(Constants.GTK_SETTINGS_INI_PATH))
+ prefer_dark = config.get(
+ 'Settings', Constants.GTK_INI_PREFER_DARK_KEY, fallback=None)
+ if prefer_dark in ('1', 'yes', 'true', 'on'):
+ theme_name = config.get(
+ 'Settings', Constants.GTK_INI_THEME_NAME_KEY, fallback=None)
+ return is_dark_theme(theme_name)
+ theme = subprocess.check_output(
+ ["gsettings", "get", "org.gnome.desktop.interface", "gtk-theme"]
+ ).decode('utf-8').strip().replace("'", "")
+ return is_dark_theme(theme)
+
+def add_style_provider():
+ """
+ Load GTK styles
+ """
+ style_provider = Gtk.CssProvider()
+ dark_theme = have_dark_theme()
+ style_provider.load_from_data(
+ DARK_THEME_STYLES if dark_theme else LIGHT_THEME_STYLES)
+ Gtk.StyleContext.add_provider_for_screen(
+ Gdk.Screen.get_default(),
+ style_provider,
+ Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
+ )
+add_style_provider()
class InputParam(Gtk.HBox):
diff --git a/grc/gui/canvas/colors.py b/grc/gui/canvas/colors.py
index 77d3203e78..76fb5fd951 100644
--- a/grc/gui/canvas/colors.py
+++ b/grc/gui/canvas/colors.py
@@ -75,4 +75,44 @@ PORT_TYPE_TO_COLOR.update((key, get_color(color)) for key, (_, color) in Constan
#################################################################################
# param box colors
#################################################################################
+DARK_THEME_STYLES = b"""
+ #dtype_complex { background-color: #3399FF; }
+ #dtype_real { background-color: #FF8C69; }
+ #dtype_float { background-color: #FF8C69; }
+ #dtype_int { background-color: #00FF99; }
+
+ #dtype_complex_vector { background-color: #3399AA; }
+ #dtype_real_vector { background-color: #CC8C69; }
+ #dtype_float_vector { background-color: #CC8C69; }
+ #dtype_int_vector { background-color: #00CC99; }
+
+ #dtype_bool { background-color: #00FF99; }
+ #dtype_hex { background-color: #00FF99; }
+ #dtype_string { background-color: #CC66CC; }
+ #dtype_id { background-color: #DDDDDD; }
+ #dtype_stream_id { background-color: #DDDDDD; }
+ #dtype_raw { background-color: #23272A; }
+
+ #enum_custom { background-color: #EEEEEE; }
+ """
+LIGHT_THEME_STYLES = b"""
+ #dtype_complex { background-color: #3399FF; }
+ #dtype_real { background-color: #FF8C69; }
+ #dtype_float { background-color: #FF8C69; }
+ #dtype_int { background-color: #00FF99; }
+
+ #dtype_complex_vector { background-color: #3399AA; }
+ #dtype_real_vector { background-color: #CC8C69; }
+ #dtype_float_vector { background-color: #CC8C69; }
+ #dtype_int_vector { background-color: #00CC99; }
+
+ #dtype_bool { background-color: #00FF99; }
+ #dtype_hex { background-color: #00FF99; }
+ #dtype_string { background-color: #CC66CC; }
+ #dtype_id { background-color: #DDDDDD; }
+ #dtype_stream_id { background-color: #DDDDDD; }
+ #dtype_raw { background-color: #FFFFFF; }
+
+ #enum_custom { background-color: #EEEEEE; }
+ """