Deduplicate output global handling

This commit is contained in:
Ian Douglas Scott 2024-10-28 18:32:50 -07:00
parent a559e59ad4
commit 90151799c5
2 changed files with 33 additions and 41 deletions

View file

@ -2,7 +2,7 @@ use keyframe::{ease, functions::EaseInOut};
use std::time::{Duration, Instant}; use std::time::{Duration, Instant};
use wayland_client::{ use wayland_client::{
delegate_noop, delegate_noop,
protocol::{wl_buffer, wl_callback, wl_pointer, wl_output, wl_surface}, protocol::{wl_buffer, wl_callback, wl_output, wl_pointer, wl_surface},
Connection, Dispatch, QueueHandle, Connection, Dispatch, QueueHandle,
}; };
use wayland_protocols::wp::{ use wayland_protocols::wp::{

View file

@ -5,9 +5,7 @@ use calloop_wayland_source::WaylandSource;
use cosmic_config::{calloop::ConfigWatchSource, CosmicConfigEntry}; use cosmic_config::{calloop::ConfigWatchSource, CosmicConfigEntry};
use cosmic_idle_config::CosmicIdleConfig; use cosmic_idle_config::CosmicIdleConfig;
use futures_lite::stream::StreamExt; use futures_lite::stream::StreamExt;
use std::{ use std::process::Command;
process::Command,
};
use upower_dbus::UPowerProxy; use upower_dbus::UPowerProxy;
use wayland_client::{ use wayland_client::{
delegate_noop, delegate_noop,
@ -80,6 +78,7 @@ struct Output {
// Immutate references to globals, needed for calls // Immutate references to globals, needed for calls
struct StateInner { struct StateInner {
registry: wl_registry::WlRegistry,
output_power_manager: zwlr_output_power_manager_v1::ZwlrOutputPowerManagerV1, output_power_manager: zwlr_output_power_manager_v1::ZwlrOutputPowerManagerV1,
compositor: wl_compositor::WlCompositor, compositor: wl_compositor::WlCompositor,
layer_shell: zwlr_layer_shell_v1::ZwlrLayerShellV1, layer_shell: zwlr_layer_shell_v1::ZwlrLayerShellV1,
@ -101,6 +100,23 @@ struct State {
} }
impl State { impl State {
fn add_output_global(&mut self, global_name: u32, version: u32) {
let output = self
.inner
.registry
.bind(global_name, version.min(3), &self.inner.qh, ());
let output_power =
self.inner
.output_power_manager
.get_output_power(&output, &self.inner.qh, ());
self.outputs.push(Output {
output,
output_power,
fade_surface: None,
global_name,
});
}
fn update_screen_off_idle(&mut self, is_idle: bool) { fn update_screen_off_idle(&mut self, is_idle: bool) {
if self.screensaver_inhibit { if self.screensaver_inhibit {
return; return;
@ -203,24 +219,6 @@ fn main() {
) )
.unwrap(); .unwrap();
let outputs = globals.contents().with_list(|list| {
list.iter()
.filter(|global| global.interface == wl_output::WlOutput::interface().name)
.map(|global| {
let output = globals
.registry()
.bind(global.name, global.version.min(3), &qh, ());
let output_power = output_power_manager.get_output_power(&output, &qh, ());
Output {
output,
output_power,
fade_surface: None,
global_name: global.name,
}
})
.collect()
});
let config = cosmic_config::Config::new("com.system76.CosmicIdle", 1).unwrap(); let config = cosmic_config::Config::new("com.system76.CosmicIdle", 1).unwrap();
let conf = CosmicIdleConfig::get_entry(&config).unwrap_or_else(|(errs, conf)| { let conf = CosmicIdleConfig::get_entry(&config).unwrap_or_else(|(errs, conf)| {
for err in errs { for err in errs {
@ -231,6 +229,7 @@ fn main() {
let mut state = State { let mut state = State {
inner: StateInner { inner: StateInner {
registry: globals.registry().clone(),
compositor, compositor,
output_power_manager, output_power_manager,
layer_shell, layer_shell,
@ -242,11 +241,18 @@ fn main() {
}, },
screen_off_idle_notification: None, screen_off_idle_notification: None,
suspend_idle_notification: None, suspend_idle_notification: None,
outputs, outputs: Vec::new(),
conf, conf,
on_battery: false, on_battery: false,
screensaver_inhibit: false, screensaver_inhibit: false,
}; };
globals.contents().with_list(|list| {
for global in list {
if global.interface == wl_output::WlOutput::interface().name {
state.add_output_global(global.name, global.version);
}
}
});
state.recreate_notification(); state.recreate_notification();
let mut event_loop: EventLoop<State> = EventLoop::try_new().unwrap(); let mut event_loop: EventLoop<State> = EventLoop::try_new().unwrap();
@ -278,10 +284,7 @@ fn main() {
scheduler scheduler
.schedule(async move { .schedule(async move {
if let Ok(connection) = zbus::Connection::session().await { if let Ok(connection) = zbus::Connection::session().await {
if let Err(err) = if let Err(err) = freedesktop_screensaver::serve(&connection, sender).await {
freedesktop_screensaver::serve(&connection, sender)
.await
{
log::error!("failed to serve FreeDesktop screensaver interface: {}", err); log::error!("failed to serve FreeDesktop screensaver interface: {}", err);
} }
} }
@ -306,11 +309,11 @@ fn main() {
impl Dispatch<wl_registry::WlRegistry, GlobalListContents> for State { impl Dispatch<wl_registry::WlRegistry, GlobalListContents> for State {
fn event( fn event(
state: &mut Self, state: &mut Self,
registry: &wl_registry::WlRegistry, _: &wl_registry::WlRegistry,
event: wl_registry::Event, event: wl_registry::Event,
_: &GlobalListContents, _: &GlobalListContents,
_: &Connection, _: &Connection,
qh: &QueueHandle<Self>, _: &QueueHandle<Self>,
) { ) {
match event { match event {
wl_registry::Event::Global { wl_registry::Event::Global {
@ -319,18 +322,7 @@ impl Dispatch<wl_registry::WlRegistry, GlobalListContents> for State {
version, version,
} => { } => {
if interface == "wl_output" { if interface == "wl_output" {
let output = registry.bind(name, version.min(3), qh, ()); state.add_output_global(name, version);
let output_power =
state
.inner
.output_power_manager
.get_output_power(&output, &qh, ());
state.outputs.push(Output {
output,
output_power,
fade_surface: None,
global_name: name,
});
} }
} }
wl_registry::Event::GlobalRemove { name } => { wl_registry::Event::GlobalRemove { name } => {