diff --git a/src/Indicator.vala b/src/Indicator.vala index 954d43a3..46fa5e88 100644 --- a/src/Indicator.vala +++ b/src/Indicator.vala @@ -87,7 +87,7 @@ public class Power.Indicator : Wingpanel.Indicator { }); display_widget.add_controller (scroll_controller); - dm.brightness_changed.connect (update_tooltip); + dm.monitor_brightness_changed.connect (update_tooltip); } } @@ -191,7 +191,7 @@ public class Power.Indicator : Wingpanel.Indicator { } if (primary_text == null && dm.backlight.present) { - primary_text = _("Screen brightness: %i").printf ((int)(dm.brightness)); + primary_text = _("Screen brightness: %i").printf ((int)(dm.get_monitor_brightness (0))); secondary_text = _("Scroll to change screen brightness"); } @@ -211,7 +211,7 @@ public class Power.Indicator : Wingpanel.Indicator { if (is_in_session) { var notification = new Notify.Notification ("indicator-power", "", "display-brightness-symbolic"); notification.set_hint ("x-canonical-private-synchronous", new Variant.string ("indicator-power")); - notification.set_hint ("value", new Variant.int32 (dm.brightness)); + notification.set_hint ("value", new Variant.int32 ((int) (dm.get_monitor_brightness (0) * 100))); try { notification.show (); return true; diff --git a/src/Services/DBusInterfaces/Screen.vala b/src/Services/DBusInterfaces/BrightnessManager.vala similarity index 51% rename from src/Services/DBusInterfaces/Screen.vala rename to src/Services/DBusInterfaces/BrightnessManager.vala index 102faee0..5bd2799e 100644 --- a/src/Services/DBusInterfaces/Screen.vala +++ b/src/Services/DBusInterfaces/BrightnessManager.vala @@ -18,8 +18,16 @@ */ namespace Power.Services.DBusInterfaces { - [DBus (name = "org.gnome.SettingsDaemon.Power.Screen")] - interface PowerSettings : GLib.Object { - public abstract int brightness { get; set; } + [DBus (name = "io.elementary.gala.BrightnessManager")] + interface BrightnessManager : GLib.Object { + public signal void monitors_changed (); + public signal void monitor_brightness_changed (int index, double value); + + public abstract double get_global_brightness () throws GLib.IOError, GLib.DBusError; + public abstract double get_monitor_brightness (int index) throws GLib.IOError, GLib.DBusError; + public abstract string get_monitor_name (int index) throws GLib.IOError, GLib.DBusError; + public abstract int get_n_monitors () throws GLib.IOError, GLib.DBusError; + public abstract void set_global_brightness (double scale) throws GLib.IOError, GLib.DBusError; + public abstract void set_monitor_brightness (int index, double brightness) throws GLib.IOError, GLib.DBusError; } } diff --git a/src/Services/DeviceManager.vala b/src/Services/DeviceManager.vala index 7ce3eb8e..f705172b 100644 --- a/src/Services/DeviceManager.vala +++ b/src/Services/DeviceManager.vala @@ -21,13 +21,13 @@ public class Power.Services.DeviceManager : Object { private const string UPOWER_INTERFACE = "org.freedesktop.UPower"; private const string UPOWER_PATH = "/org/freedesktop/UPower"; - private const string POWER_SETTINGS_INTERFACE = "org.gnome.SettingsDaemon.Power"; - private const string POWER_SETTINGS_PATH = "/org/gnome/SettingsDaemon/Power"; + private const string GALA_INTERFACE = "io.elementary.gala"; + private const string GALA_PATH = "/io/elementary/gala/BrightnessManager"; private static DeviceManager? instance = null; private DBusInterfaces.UPower? upower = null; - private DBusInterfaces.PowerSettings? iscreen = null; + private DBusInterfaces.BrightnessManager? brightness_manager = null; public Services.Backlight backlight { get; construct; } public Gee.HashMap devices { get; private set; } @@ -36,25 +36,12 @@ public class Power.Services.DeviceManager : Object { public bool has_battery { get; private set; } public bool on_battery { get; private set; } public bool on_low_battery { get; private set; } - public int brightness { - get { - if (backlight.present && iscreen != null) { - return iscreen.brightness; - } else { - return -1; - } - } - - set { - if (backlight.present && iscreen != null) { - iscreen.brightness = value.clamp (0, 100); - } - } - } public signal void battery_registered (string device_path, Device battery); public signal void battery_deregistered (string device_path); - public signal void brightness_changed (int brightness); + + public signal void monitors_changed (); + public signal void monitor_brightness_changed (int index, double value); construct { backlight = new Services.Backlight (); @@ -90,10 +77,10 @@ public class Power.Services.DeviceManager : Object { ); debug ("Connection to UPower bus established"); - iscreen = yield Bus.get_proxy ( + brightness_manager = yield Bus.get_proxy ( BusType.SESSION, - POWER_SETTINGS_INTERFACE, - POWER_SETTINGS_PATH, + GALA_INTERFACE, + GALA_PATH, DBusProxyFlags.GET_INVALIDATED_PROPERTIES ); debug ("Connection to Power Settings bus established"); @@ -139,7 +126,7 @@ public class Power.Services.DeviceManager : Object { } } - private void connect_signals () requires (upower != null && iscreen != null) { + private void connect_signals () requires (upower != null && brightness_manager != null) { upower.g_properties_changed.connect (() => { update_properties (); update_batteries (); @@ -148,12 +135,8 @@ public class Power.Services.DeviceManager : Object { upower.DeviceAdded.connect (register_device); upower.DeviceRemoved.connect (deregister_device); - ((DBusProxy)iscreen).g_properties_changed.connect ((changed_properties, invalidated_properties) => { - var changed_brightness = changed_properties.lookup_value ("Brightness", new VariantType ("i")); - if (changed_brightness != null) { - brightness_changed (changed_brightness.get_int32 ()); - } - }); + brightness_manager.monitors_changed.connect (monitors_changed_cb); + brightness_manager.monitor_brightness_changed.connect (monitor_brightness_changed_cb); } private void update_properties () requires (upower != null) { @@ -200,9 +183,62 @@ public class Power.Services.DeviceManager : Object { } } - public void change_brightness (int change) { - if (iscreen != null) { - brightness = iscreen.brightness + change; + private void monitors_changed_cb () { + monitors_changed (); + } + + private void monitor_brightness_changed_cb (int index, double value) { + monitor_brightness_changed (index, value); + } + + public double get_monitor_brightness (int index) { + if (brightness_manager != null) { + try { + return brightness_manager.get_monitor_brightness (index); + } catch (Error e) { + warning ("Couldn't get monitor's brightness: %s", e.message); + } + } + return -1; + } + + public void set_monitor_brightness (int index, double value) { + if (brightness_manager != null) { + try { + brightness_manager.set_monitor_brightness (index, value); + } catch (Error e) { + warning ("Couldn't set monitor's brightness: %s", e.message); + } + } + } + + public string get_monitor_data (int index) { + if (brightness_manager != null) { + try { + return brightness_manager.get_monitor_name (index); + } catch (Error e) { + warning ("Couldn't get monitor's data: %s", e.message); + } + } + return ""; + } + + public int get_monitor_count () { + if (brightness_manager != null) { + try { + return brightness_manager.get_n_monitors (); + } catch (Error e) { + warning ("Couldn't get monitor's count: %s", e.message); + } + } + return 0; + } + + public void change_global_brightness (double change) { + try { + brightness_manager.set_global_brightness ((brightness_manager.get_global_brightness () + change).clamp (0.0, 1.0)); + } catch (Error e) { + warning ("Couldn't set global brightness: %s", e.message); } } } diff --git a/src/Utils.vala b/src/Utils.vala index 3733a088..4fb9fb0f 100644 --- a/src/Utils.vala +++ b/src/Utils.vala @@ -1,6 +1,6 @@ public class Power.Utils { - private const double BRIGHTNESS_STEP = 5.0; + private const double BRIGHTNESS_STEP = 0.005; private static double total_y_delta = 0; private static double total_x_delta = 0; @@ -54,9 +54,9 @@ public class Power.Utils { break; } - if (total_y_delta.abs () * BRIGHTNESS_STEP > 1.0) { + if (total_y_delta.abs () * BRIGHTNESS_STEP > 0.001) { dir = natural_scroll ? total_y_delta : -total_y_delta; - } else if (total_x_delta.abs () * BRIGHTNESS_STEP > 1.0) { + } else if (total_x_delta.abs () * BRIGHTNESS_STEP > 0.001) { dir = natural_scroll ? -total_x_delta : total_x_delta; } @@ -64,7 +64,7 @@ public class Power.Utils { total_y_delta = 0.0; total_x_delta = 0.0; Power.Services.DeviceManager.get_default () - .change_brightness ((int) Math.round (dir * BRIGHTNESS_STEP)); + .change_global_brightness (dir * BRIGHTNESS_STEP); } return Gdk.EVENT_STOP; diff --git a/src/Widgets/PopoverWidget.vala b/src/Widgets/PopoverWidget.vala index 587c11be..8be9f9f7 100644 --- a/src/Widgets/PopoverWidget.vala +++ b/src/Widgets/PopoverWidget.vala @@ -58,7 +58,7 @@ public class Power.Widgets.PopoverWidget : Gtk.Box { }; var last_separator_revealer = new Gtk.Revealer () { - reveal_child = dm.brightness != -1, + reveal_child = dm.get_monitor_count () > 0, child = last_separator, }; @@ -137,8 +137,8 @@ public class Power.Widgets.PopoverWidget : Gtk.Box { } }); - dm.brightness_changed.connect ((brightness) => { - if (brightness != -1) { + dm.monitors_changed.connect (() => { + if (dm.get_monitor_count () > 0) { last_separator_revealer.reveal_child = true; } else { last_separator_revealer.reveal_child = false; diff --git a/src/Widgets/ScreenBrightness.vala b/src/Widgets/ScreenBrightness.vala index 8ea91f1a..19b4f528 100644 --- a/src/Widgets/ScreenBrightness.vala +++ b/src/Widgets/ScreenBrightness.vala @@ -18,8 +18,8 @@ */ public class Power.Widgets.ScreenBrightness : Granite.Bin { - private Gtk.Scale brightness_slider; private Power.Services.DeviceManager dm; + private Gtk.ListBox list_box; public bool natural_scroll_touchpad { get; set; } public bool natural_scroll_mouse { get; set; } @@ -32,54 +32,80 @@ public class Power.Widgets.ScreenBrightness : Granite.Bin { var touchpad_settings = new GLib.Settings ("org.gnome.desktop.peripherals.touchpad"); touchpad_settings.bind ("natural-scroll", this, "natural-scroll-touchpad", SettingsBindFlags.DEFAULT); + var scroll_controller = new Gtk.EventControllerScroll (BOTH_AXES); + scroll_controller.scroll.connect (on_scroll); + add_controller (scroll_controller); + + list_box = new Gtk.ListBox (); + child = list_box; + + populate_list (); + + dm.monitors_changed.connect (() => { + list_box.remove_all (); + populate_list (); + }); + } + + private void populate_list () { + for (int i = 0; i < dm.get_monitor_count (); i++) { + list_box.append (construct_row (i)); + } + } + + private Gtk.Widget construct_row (int index) { var image = new Gtk.Image.from_icon_name ("brightness-display-symbolic") { pixel_size = 48 }; - brightness_slider = new Gtk.Scale.with_range (Gtk.Orientation.HORIZONTAL, 0, 100, 10) { - margin_end = 6, + var monitor_label = new Gtk.Label (dm.get_monitor_data (index)) { + halign = Gtk.Align.START + }; + + var brightness_slider = new Gtk.Scale.with_range (Gtk.Orientation.HORIZONTAL, 0, 1, 0.1) { + margin_start = 2, + margin_end = 2, hexpand = true, draw_value = false, width_request = 175 }; - var box = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 6) { + var slider_box = new Gtk.Box (Gtk.Orientation.VERTICAL, 2) { hexpand = true, - margin_start = 6, - margin_end = 12 + vexpand = true, + homogeneous = true }; - box.append (image); - box.append (brightness_slider); + slider_box.append (monitor_label); + slider_box.append (brightness_slider); - var show_brightness_slider = new Gtk.Revealer () { - child = box + var box = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 4) { + hexpand = true, + margin_start = 6, + margin_end = 12 }; - child = show_brightness_slider; - - if (dm.brightness != -1) { - brightness_slider.set_value (dm.brightness); - show_brightness_slider.reveal_child = true; - } - - var scroll_controller = new Gtk.EventControllerScroll (BOTH_AXES); - scroll_controller.scroll.connect (on_scroll); - add_controller (scroll_controller); + box.append (image); + box.append (slider_box); - brightness_slider.value_changed.connect ((value) => { - brightness_slider.set_value (value.get_value ()); - dm.brightness = (int) value.get_value (); + ulong slider_signal = 0, dm_signal = 0; + slider_signal = brightness_slider.value_changed.connect ((value) => { + SignalHandler.block (dm, dm_signal); + dm.set_monitor_brightness (index, value.get_value ()); + SignalHandler.unblock (dm, dm_signal); }); - - dm.brightness_changed.connect ((brightness) => { - if (brightness != -1) { - brightness_slider.set_value ((double) brightness); - show_brightness_slider.reveal_child = true; - } else { - show_brightness_slider.reveal_child = false; + dm_signal = dm.monitor_brightness_changed.connect ((ch_index, value) => { + if (index != ch_index) { + return; } + + SignalHandler.block (brightness_slider, slider_signal); + brightness_slider.set_value (value); + SignalHandler.unblock (brightness_slider, slider_signal); }); + + brightness_slider.set_value (dm.get_monitor_brightness (index)); + return box; } private bool on_scroll (Gtk.EventControllerScroll controller, double dx, double dy) { diff --git a/src/meson.build b/src/meson.build index 40051eb4..7b074f87 100644 --- a/src/meson.build +++ b/src/meson.build @@ -15,9 +15,9 @@ files = files( 'Indicator.vala', 'Utils.vala', 'Services/Backlight/Backlight.vala', + 'Services/DBusInterfaces/BrightnessManager.vala', 'Services/DBusInterfaces/Device.vala', 'Services/DBusInterfaces/Properties.vala', - 'Services/DBusInterfaces/Screen.vala', 'Services/DBusInterfaces/UPower.vala', 'Services/DBusInterfaces/PowerProfile.vala', 'Services/Device.vala',