Skip to content

Commit 8aed482

Browse files
committed
BrightnessManager: add per-monitor brightness management
1 parent 619b0c8 commit 8aed482

5 files changed

Lines changed: 124 additions & 20 deletions

File tree

‎src/DBus.vala‎

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,20 @@ public class Gala.DBus {
2323
try {
2424
connection.register_object ("/io/elementary/gala", WindowDragProvider.get_instance ());
2525
#if HAS_MUTTER50
26-
connection.register_object ("/io/elementary/gala/BrightnessManager", new BrightnessManager (wm.get_display ()));
26+
connection.register_object ("/io/elementary/gala/BrightnessManager", brightness_manager);
27+
brightness_manager.monitor_added.connect ((monitor_brightness) => {
28+
try {
29+
var id = connection.register_object (@"/io/elementary/gala/BrightnessManager/$(monitor_brightness.get_monitor_serial ())", monitor_brightness);
30+
return id;
31+
} catch (Error e) {
32+
warning (e.message);
33+
return null;
34+
}
35+
});
36+
brightness_manager.monitor_removed.connect ((connection_id) => {
37+
connection.unregister_object (connection_id);
38+
});
39+
brightness_manager.update_available_backlights ();
2740
#endif
2841
} catch (Error e) {
2942
warning (e.message);

‎src/Misc/BrightnessManager.vala‎

Lines changed: 53 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,31 +8,37 @@
88
#if HAS_MUTTER50
99
[DBus (name = "io.elementary.gala.BrightnessManager")]
1010
public class Gala.BrightnessManager : GLib.Object {
11+
[DBus (visible = false)]
12+
public signal uint? monitor_added (MonitorBrightness monitor_brightness);
13+
[DBus (visible = false)]
14+
public signal void monitor_removed (uint connection_id);
15+
16+
private int _brightness;
1117
public int brightness {
1218
get {
13-
if (backlight == null) {
19+
if (exposed_monitors.size () == 0)
1420
return -1;
15-
}
16-
int min, max;
17-
int value;
18-
backlight.get_brightness_info (out min, out max);
19-
value = backlight.get_brightness ();
20-
return ((value - min) * 100) / (max - min);
21+
22+
23+
return _brightness;
2124
}
2225
set {
23-
if (brightness == value || backlight == null) {
26+
if (_brightness == value || exposed_monitors.size () == 0)
2427
return;
25-
}
26-
int min, max;
27-
backlight.get_brightness_info (out min, out max);
28-
backlight.set_brightness ((int) (value * (max - min) / 100) + min);
28+
29+
foreach (var monitor_brightness in exposed_monitors.get_values ())
30+
monitor_brightness.brightness = value;
31+
32+
_brightness = value;
2933
}
3034
}
3135

3236
[DBus (visible = false)]
3337
public unowned Meta.Display display { private get; construct; }
38+
39+
private GLib.HashTable<unowned Meta.Monitor, MonitorBrightness> exposed_monitors;
40+
private GLib.HashTable<unowned Meta.Monitor, uint> connection_ids;
3441
private unowned Meta.MonitorManager monitor_manager;
35-
private unowned Meta.Backlight? backlight;
3642

3743
public BrightnessManager (Meta.Display display) {
3844
Object (
@@ -43,6 +49,11 @@ public class Gala.BrightnessManager : GLib.Object {
4349
construct {
4450
monitor_manager = display.get_context ().get_backend ().get_monitor_manager ();
4551
monitor_manager.monitors_changed.connect (update_available_backlights);
52+
exposed_monitors = new GLib.HashTable<unowned Meta.Monitor, MonitorBrightness> (null, null);
53+
connection_ids = new GLib.HashTable<unowned Meta.Monitor, uint> (null, null);
54+
55+
// TODO: bind to value from gschema
56+
_brightness = 100;
4657

4758
var keybinding_settings = new GLib.Settings ("io.elementary.desktop.wm.keybindings");
4859
display.add_keybinding ("brightness-brighter", keybinding_settings, Meta.KeyBindingFlags.NONE, () => {
@@ -51,16 +62,39 @@ public class Gala.BrightnessManager : GLib.Object {
5162
display.add_keybinding ("brightness-dimmer", keybinding_settings, Meta.KeyBindingFlags.NONE, () => {
5263
brightness -= 5;
5364
});
54-
55-
update_available_backlights ();
5665
}
5766

58-
private void update_available_backlights () {
59-
backlight = null;
67+
[DBus (visible = false)]
68+
public void update_available_backlights () {
6069
unowned var monitors = monitor_manager.get_monitors ();
70+
var new_monitors = monitors.copy ();
71+
var old_monitors = exposed_monitors.get_keys ();
6172
foreach (unowned var monitor in monitors) {
62-
if (monitor.is_primary () && monitor.is_active ()) {
63-
backlight = monitor.get_backlight ();
73+
if (monitor.get_backlight () == null)
74+
continue;
75+
76+
if (old_monitors.find (monitor) != null) {
77+
old_monitors.remove (monitor);
78+
new_monitors.remove (monitor);
79+
}
80+
}
81+
82+
if (new_monitors.length () > 0) {
83+
foreach (var monitor in new_monitors) {
84+
var monitor_brightness = new MonitorBrightness (monitor);
85+
var connection_id = monitor_added (monitor_brightness);
86+
if (connection_id != null) {
87+
exposed_monitors.insert (monitor, monitor_brightness);
88+
connection_ids.insert (monitor, connection_id);
89+
}
90+
}
91+
}
92+
93+
if (old_monitors.length () > 0) {
94+
foreach (var monitor in old_monitors) {
95+
monitor_removed (connection_ids.get (monitor));
96+
exposed_monitors.remove (monitor);
97+
connection_ids.remove (monitor);
6498
}
6599
}
66100
}

‎src/Misc/MonitorBrightness.vala‎

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* Copyright 2026 elementary, Inc. (https://elementary.io)
3+
* SPDX-License-Identifier: GPL-3.0-or-later
4+
*
5+
* Authored by: Denis Garaev <garaevdi@outlook.com>
6+
*/
7+
8+
#if HAS_MUTTER50
9+
[DBus (name = "io.elementary.gala.BrightnessManager.Monitor")]
10+
public class Gala.MonitorBrightness : GLib.Object {
11+
[DBus (visible = false)]
12+
public unowned Meta.Monitor monitor { get; construct; }
13+
14+
public int brightness {
15+
get {
16+
if (backlight == null)
17+
return -1;
18+
19+
int min, max;
20+
int value;
21+
backlight.get_brightness_info (out min, out max);
22+
value = backlight.get_brightness ();
23+
return ((value - min) * 100) / (max - min);
24+
}
25+
set {
26+
if (brightness == value || backlight == null)
27+
return;
28+
29+
int min, max;
30+
backlight.get_brightness_info (out min, out max);
31+
backlight.set_brightness ((int) (value * (max - min) / 100) + min);
32+
}
33+
}
34+
35+
private unowned Meta.Backlight? backlight;
36+
37+
public MonitorBrightness (Meta.Monitor monitor) {
38+
Object (
39+
monitor: monitor
40+
);
41+
}
42+
43+
construct {
44+
backlight = monitor.get_backlight ();
45+
}
46+
47+
[DBus (visible = false)]
48+
public string get_monitor_serial () {
49+
return monitor.get_serial ();
50+
}
51+
}
52+
#endif

‎src/WindowManager.vala‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,10 @@ namespace Gala {
9393

9494
private LockScreenManager lock_screen_manager;
9595

96+
#if HAS_MUTTER50
97+
private BrightnessManager brightness_manager;
98+
#endif
99+
96100
private Gee.LinkedList<ModalProxy> modal_stack = new Gee.LinkedList<ModalProxy> ();
97101

98102
private Gee.HashSet<Meta.WindowActor> minimizing = new Gee.HashSet<Meta.WindowActor> ();

‎src/meson.build‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ gala_bin_sources = files(
3131
'Misc/DesktopIntegration.vala',
3232
'Misc/InputMethod.vala',
3333
'Misc/KeyboardManager.vala',
34+
'Misc/MonitorBrightness.vala',
3435
'Misc/LockScreenManager.vala',
3536
'Misc/NotificationsManager.vala',
3637
'Misc/NotificationStack.vala',

0 commit comments

Comments
 (0)