From f3be2f6a74e76515dae6c6ae490ad5ff698672f7 Mon Sep 17 00:00:00 2001 From: Marius Meisenzahl Date: Sat, 1 May 2021 08:01:56 +0200 Subject: [PATCH 1/3] Set accent color based on primary color --- src/AccentColor/AccentColorManager.vala | 60 ++++++++++++++++++------- src/AccentColor/ColorExtractor.vala | 12 ++++- src/AccentColor/NamedColor.vala | 1 + 3 files changed, 56 insertions(+), 17 deletions(-) diff --git a/src/AccentColor/AccentColorManager.vala b/src/AccentColor/AccentColorManager.vala index b6f6cbaf6..b0fead517 100644 --- a/src/AccentColor/AccentColorManager.vala +++ b/src/AccentColor/AccentColorManager.vala @@ -19,7 +19,7 @@ * Authored by: Marius Meisenzahl */ - public class Gala.AccentColorManager : Object { +public class Gala.AccentColorManager : Object { private const string INTERFACE_SCHEMA = "org.gnome.desktop.interface"; private const string STYLESHEET_KEY = "gtk-theme"; private const string TAG_ACCENT_COLOR = "Xmp.xmp.io.elementary.AccentColor"; @@ -86,23 +86,36 @@ } } + background_settings.changed["picture-options"].connect (update_accent_color); background_settings.changed["picture-uri"].connect (update_accent_color); + background_settings.changed["primary-color"].connect (update_accent_color); update_accent_color (); } private void update_accent_color () { - bool set_accent_color_based_on_wallpaper = gala_accounts_service.prefers_accent_color == 0; + bool set_accent_color_auto = gala_accounts_service.prefers_accent_color == 0; - if (set_accent_color_based_on_wallpaper) { - var picture_uri = background_settings.get_string ("picture-uri"); + if (!set_accent_color_auto) { + return; + } + + bool set_accent_color_based_on_primary_color = background_settings.get_enum ("picture-options") == 0; + + var current_stylesheet = interface_settings.get_string (STYLESHEET_KEY); + + debug ("Current stylesheet: %s", current_stylesheet); - var current_stylesheet = interface_settings.get_string (STYLESHEET_KEY); + NamedColor? new_color = null; + if (set_accent_color_based_on_primary_color) { + var primary_color = background_settings.get_string ("primary-color"); + debug ("Current primary color: %s", primary_color); + new_color = get_accent_color_based_on_primary_color (primary_color); + } else { + var picture_uri = background_settings.get_string ("picture-uri"); debug ("Current wallpaper: %s", picture_uri); - debug ("Current stylesheet: %s", current_stylesheet); - NamedColor? new_color = null; var accent_color_name = read_accent_color_name_from_exif (picture_uri); if (accent_color_name != null) { for (int i = 0; i < theme_colors.length; i++) { @@ -114,15 +127,15 @@ } else { new_color = get_accent_color_of_picture_simple (picture_uri); } + } - if (new_color != null && new_color.theme != current_stylesheet) { - debug ("New stylesheet: %s", new_color.theme); + if (new_color != null && new_color.theme != current_stylesheet) { + debug ("New stylesheet: %s", new_color.theme); - interface_settings.set_string ( - STYLESHEET_KEY, - new_color.theme - ); - } + interface_settings.set_string ( + STYLESHEET_KEY, + new_color.theme + ); } } @@ -148,7 +161,7 @@ try { var pixbuf = new Gdk.Pixbuf.from_file (file.get_path ()); - var color_extractor = new ColorExtractor (pixbuf); + var color_extractor = new ColorExtractor.from_pixbuf (pixbuf); var palette = new Gee.ArrayList (); for (int i = 0; i < theme_colors.length; i++) { @@ -163,4 +176,21 @@ return new_color; } + + public NamedColor? get_accent_color_based_on_primary_color (string primary_color) { + NamedColor new_color = null; + + var granite_primary_color = new Granite.Drawing.Color.from_string (primary_color); + var color_extractor = new ColorExtractor.from_primary_color (granite_primary_color); + + var palette = new Gee.ArrayList (); + for (int i = 0; i < theme_colors.length; i++) { + palette.add (theme_colors[i].color); + } + + var index = color_extractor.get_dominant_color_index (palette); + new_color = theme_colors[index]; + + return new_color; + } } diff --git a/src/AccentColor/ColorExtractor.vala b/src/AccentColor/ColorExtractor.vala index 5633eeb88..e689f873d 100644 --- a/src/AccentColor/ColorExtractor.vala +++ b/src/AccentColor/ColorExtractor.vala @@ -22,16 +22,24 @@ public class Gala.ColorExtractor : Object { private const double PERCENTAGE_SAMPLE_PIXELS = 0.01; - public Gdk.Pixbuf pixbuf { get; construct set; } + public Gdk.Pixbuf? pixbuf { get; construct set; } + public Granite.Drawing.Color? primary_color { get; construct set; } private Gee.List pixels; - public ColorExtractor (Gdk.Pixbuf pixbuf) { + public ColorExtractor.from_pixbuf (Gdk.Pixbuf pixbuf) { Object (pixbuf: pixbuf); pixels = convert_pixels_to_rgb (pixbuf.get_pixels_with_length (), pixbuf.has_alpha); } + public ColorExtractor.from_primary_color (Granite.Drawing.Color primary_color) { + Object (primary_color: primary_color); + + pixels = new Gee.ArrayList (); + pixels.add (primary_color); + } + public int get_dominant_color_index (Gee.List palette) { int index = 0; var matches = new double[palette.size]; diff --git a/src/AccentColor/NamedColor.vala b/src/AccentColor/NamedColor.vala index bdec60946..ca84ba179 100644 --- a/src/AccentColor/NamedColor.vala +++ b/src/AccentColor/NamedColor.vala @@ -29,6 +29,7 @@ public class Gala.NamedColor : Object { name: name, theme: theme, color: InternalUtils.get_accent_color_by_theme_name (theme) + // color: new Granite.Drawing.Color.from_string ("#000000") ); } } From 4b482e6b92f85d0ac89ce0a67841059a6c97ddb8 Mon Sep 17 00:00:00 2001 From: Marius Meisenzahl Date: Sat, 1 May 2021 08:02:09 +0200 Subject: [PATCH 2/3] Clean up --- src/AccentColor/NamedColor.vala | 1 - 1 file changed, 1 deletion(-) diff --git a/src/AccentColor/NamedColor.vala b/src/AccentColor/NamedColor.vala index ca84ba179..bdec60946 100644 --- a/src/AccentColor/NamedColor.vala +++ b/src/AccentColor/NamedColor.vala @@ -29,7 +29,6 @@ public class Gala.NamedColor : Object { name: name, theme: theme, color: InternalUtils.get_accent_color_by_theme_name (theme) - // color: new Granite.Drawing.Color.from_string ("#000000") ); } } From e8b9fcc9edaf6d8e4fa8977f126f64044852f19c Mon Sep 17 00:00:00 2001 From: Marius Meisenzahl Date: Sat, 1 May 2021 09:08:42 +0200 Subject: [PATCH 3/3] DRY --- src/AccentColor/AccentColorManager.vala | 36 ++++++++++--------------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/src/AccentColor/AccentColorManager.vala b/src/AccentColor/AccentColorManager.vala index b0fead517..58d5f23ce 100644 --- a/src/AccentColor/AccentColorManager.vala +++ b/src/AccentColor/AccentColorManager.vala @@ -154,43 +154,35 @@ public class Gala.AccentColorManager : Object { return metadata.get_tag_string (TAG_ACCENT_COLOR); } - public NamedColor? get_accent_color_of_picture_simple (string picture_uri) { - NamedColor new_color = null; + private NamedColor? get_accent_color (ColorExtractor color_extractor) { + var palette = new Gee.ArrayList (); + for (int i = 0; i < theme_colors.length; i++) { + palette.add (theme_colors[i].color); + } + var index = color_extractor.get_dominant_color_index (palette); + return theme_colors[index]; + } + + private NamedColor? get_accent_color_of_picture_simple (string picture_uri) { var file = File.new_for_uri (picture_uri); try { var pixbuf = new Gdk.Pixbuf.from_file (file.get_path ()); var color_extractor = new ColorExtractor.from_pixbuf (pixbuf); - var palette = new Gee.ArrayList (); - for (int i = 0; i < theme_colors.length; i++) { - palette.add (theme_colors[i].color); - } - - var index = color_extractor.get_dominant_color_index (palette); - new_color = theme_colors[index]; + return get_accent_color (color_extractor); } catch (Error e) { warning (e.message); } - return new_color; + return null; } - public NamedColor? get_accent_color_based_on_primary_color (string primary_color) { - NamedColor new_color = null; - + private NamedColor? get_accent_color_based_on_primary_color (string primary_color) { var granite_primary_color = new Granite.Drawing.Color.from_string (primary_color); var color_extractor = new ColorExtractor.from_primary_color (granite_primary_color); - var palette = new Gee.ArrayList (); - for (int i = 0; i < theme_colors.length; i++) { - palette.add (theme_colors[i].color); - } - - var index = color_extractor.get_dominant_color_index (palette); - new_color = theme_colors[index]; - - return new_color; + return get_accent_color (color_extractor); } }