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
59 changes: 32 additions & 27 deletions src/Indicator.vala
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public class Power.Indicator : Wingpanel.Indicator {

private Services.Device? display_device = null;
private Services.DeviceManager dm;
private Services.BrightnessManager brightness_manager;

private Settings settings;

Expand All @@ -46,6 +47,7 @@ public class Power.Indicator : Wingpanel.Indicator {
Gtk.IconTheme.get_for_display (Gdk.Display.get_default ()).add_resource_path ("/io/elementary/panel/power");

dm = Power.Services.DeviceManager.get_default ();
brightness_manager = Services.BrightnessManager.get_default ();

var mouse_settings = new GLib.Settings ("org.gnome.desktop.peripherals.mouse");
mouse_settings.bind ("natural-scroll", this, "natural-scroll-mouse", SettingsBindFlags.DEFAULT);
Expand All @@ -60,35 +62,14 @@ public class Power.Indicator : Wingpanel.Indicator {
display_widget = new Widgets.DisplayWidget ();

/* No need to display the indicator when the device is completely in AC mode */
if (dm.has_battery || dm.backlight.present) {
if (dm.has_battery || brightness_manager.present) {
update_visibility ();
}

dm.notify["has-battery"].connect (update_visibility);
dm.notify["display-device"].connect (update_display_device);
settings.changed["show-percentage"].connect (update_tooltip);

if (dm.backlight.present) {
var scroll_controller = new Gtk.EventControllerScroll (BOTH_AXES);
scroll_controller.scroll.connect ((controller, dx, dy) => {
if (Utils.handle_scroll_event (
(Gdk.ScrollEvent) controller.get_current_event (),
natural_scroll_mouse,
natural_scroll_touchpad)
) {
if (popover_widget == null || !popover_widget.is_visible ()) {
show_notification ();
}

return true;
}

return false;
});
display_widget.add_controller (scroll_controller);

dm.brightness_changed.connect (update_tooltip);
}
brightness_manager.connected.connect (update_scroll_controller);
}

return display_widget;
Expand All @@ -111,7 +92,7 @@ public class Power.Indicator : Wingpanel.Indicator {
private void update_visibility () {
var dm = Services.DeviceManager.get_default ();

bool should_be_visible = (dm.has_battery || dm.backlight.present);
bool should_be_visible = (dm.has_battery || brightness_manager.present);
if (visible != should_be_visible) {
/* NOTE: popover closes every time you set visibility, so change property only when needed */
visible = should_be_visible;
Expand Down Expand Up @@ -190,8 +171,8 @@ public class Power.Indicator : Wingpanel.Indicator {
}
}

if (primary_text == null && dm.backlight.present) {
primary_text = _("Screen brightness: %i").printf ((int)(dm.brightness));
if (primary_text == null && brightness_manager.present) {
primary_text = _("Screen brightness: %i").printf ((int) (brightness_manager.get_global_brightness () * 100));
secondary_text = _("Scroll to change screen brightness");
}

Expand All @@ -211,7 +192,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) (brightness_manager.get_global_brightness () * 100)));
try {
notification.show ();
return true;
Expand All @@ -223,6 +204,30 @@ public class Power.Indicator : Wingpanel.Indicator {

return false;
}

private void update_scroll_controller () {
if (brightness_manager.present) {
var scroll_controller = new Gtk.EventControllerScroll (BOTH_AXES);
scroll_controller.scroll.connect ((controller, dx, dy) => {
if (Utils.handle_global_scroll_event (
(Gdk.ScrollEvent) controller.get_current_event (),
natural_scroll_mouse,
natural_scroll_touchpad)
) {
if (popover_widget == null || !popover_widget.is_visible ()) {
show_notification ();
}

return true;
}

return false;
});
display_widget.add_controller (scroll_controller);

brightness_manager.monitor_brightness_changed.connect (update_tooltip);
}
}
}

public Wingpanel.Indicator get_indicator (Module module, Wingpanel.IndicatorManager.ServerType server_type) {
Expand Down
48 changes: 0 additions & 48 deletions src/Services/Backlight/Backlight.vala

This file was deleted.

128 changes: 128 additions & 0 deletions src/Services/BrightnessManager.vala
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
/*
* Copyright 2026 elementary, Inc. (https://elementary.io)
* SPDX-License-Identifier: GPL-3.0-or-later
*
* Authored by: Denis Garaev <garaevdi@outlook.com>
*/

public class Power.Services.BrightnessManager : Object {
private const string GALA_INTERFACE = "io.elementary.gala";
private const string GALA_PATH = "/io/elementary/gala/BrightnessManager";

public signal void connected ();
public signal void monitors_changed ();
public signal void monitor_brightness_changed (int index, double value);

private Power.Services.DBusInterfaces.GalaBrightnessManager? gala_brightness_manager;

private static BrightnessManager? instance = null;

public bool present {
get {
if (gala_brightness_manager == null) {
return false;
}

try {
if (gala_brightness_manager.get_n_monitors () == 0) {
return false;
}
} catch {}

return true;
}
}

construct {
init.begin ((obj, res) => {
try {
init.end (res);
connect_signals ();
} catch {}
});
}

public static Power.Services.BrightnessManager get_default () {
if (instance == null) {
instance = new BrightnessManager ();
}

return instance;
}

public int get_n_monitors () {
try {
return gala_brightness_manager.get_n_monitors ();
} catch (Error e) {
warning ("Couldn't get number of monitors: %s", e.message);
return -1;
}
}

public double get_global_brightness () {
try {
return gala_brightness_manager.get_global_brightness ().clamp (0.0001, 1.0);
} catch (Error e) {
warning ("Couldn't get global brightness: %s", e.message);
return -1.0f;
}
}

public void set_global_brightness (double value) {
try {
gala_brightness_manager.set_global_brightness (value.clamp (0.0001, 1.0));
} catch (Error e) {
warning ("Coulnd't set global brightness: %s", e.message);
}
}

public string get_monitor_name (int index) {
try {
return gala_brightness_manager.get_monitor_name (index);
} catch (Error e) {
warning ("Couldn't get %n monitor's name: %s", index, e.message);
return "";
}
}

public double get_monitor_brightness (int index) {
try {
return gala_brightness_manager.get_monitor_brightness (index).clamp (0.0001, 1);
} catch (Error e) {
warning ("Couldn't get %n monitor's brightness: %s", index, e.message);
return -1.0f;
}
}

public void set_monitor_brightness (int index, double value) {
try {
gala_brightness_manager.set_monitor_brightness (index, value.clamp (0.0001, 1));
} catch (Error e) {
warning ("Coulnd't set %n monitor's brightness: %s", index, e.message);
}
}


private async void init () throws Error {
try {
gala_brightness_manager = yield Bus.get_proxy (BusType.SESSION, GALA_INTERFACE, GALA_PATH);
connected ();
} catch (Error e) {
warning ("Couldn't connect to Gala's BrightnessManager: %s", e.message);
throw e;
}
}

private void connect_signals () {
gala_brightness_manager.monitors_changed.connect (on_monitors_changed);
gala_brightness_manager.monitor_brightness_changed.connect (on_monitor_brightness_changed);
}

private void on_monitors_changed () {
monitors_changed ();
}

private void on_monitor_brightness_changed (int index, double value) {
monitor_brightness_changed (index, value);
}
}
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 GalaBrightnessManager : 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;
}
}
Loading