Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/Indicator.vala
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

Expand Down Expand Up @@ -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");
}

Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
100 changes: 68 additions & 32 deletions src/Services/DeviceManager.vala
Original file line number Diff line number Diff line change
Expand Up @@ -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<string, Device> devices { get; private set; }
Expand All @@ -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 ();
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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 ();
Expand All @@ -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) {
Expand Down Expand Up @@ -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);
}
}
}
8 changes: 4 additions & 4 deletions src/Utils.vala
Original file line number Diff line number Diff line change
@@ -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;

Expand Down Expand Up @@ -54,17 +54,17 @@ 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;
}

if (dir.abs () > 0.0) {
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;
Expand Down
6 changes: 3 additions & 3 deletions src/Widgets/PopoverWidget.vala
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};

Expand Down Expand Up @@ -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;
Expand Down
86 changes: 56 additions & 30 deletions src/Widgets/ScreenBrightness.vala
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand All @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion src/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down