cosmic-comp/src/backend/mod.rs

160 lines
5.1 KiB
Rust
Raw Normal View History

2021-12-15 23:23:49 +01:00
// SPDX-License-Identifier: GPL-3.0-only
2025-08-08 13:28:37 -04:00
use crate::wayland::protocols::a11y::A11yHandler;
use crate::{config::ScreenFilter, state::State};
use anyhow::{anyhow, Context, Result};
use cosmic_comp_config::NumlockState;
2025-08-08 13:28:37 -04:00
use cosmic_config::CosmicConfigEntry;
use cosmic_settings_daemon_config::greeter;
2022-07-04 16:00:29 +02:00
use smithay::reexports::{calloop::EventLoop, wayland_server::DisplayHandle};
use tracing::{info, warn};
2021-12-15 23:23:49 +01:00
2022-02-04 21:04:17 +01:00
pub mod render;
2022-01-20 19:51:46 +01:00
pub mod kms;
pub mod winit;
2022-01-18 19:42:56 +01:00
pub mod x11;
2021-12-15 23:23:49 +01:00
// TODO
// pub mod wayland; // tbd in smithay
2022-05-03 13:37:51 +02:00
pub fn init_backend_auto(
dh: &DisplayHandle,
2023-09-29 21:33:16 +02:00
event_loop: &mut EventLoop<'static, State>,
2022-05-03 13:37:51 +02:00
state: &mut State,
) -> Result<()> {
let res = match std::env::var("COSMIC_BACKEND") {
Ok(x) if x == "x11" => x11::init_backend(dh, event_loop, state),
Ok(x) if x == "winit" => winit::init_backend(dh, event_loop, state),
Ok(x) if x == "kms" => kms::init_backend(dh, event_loop, state),
Ok(_) => unimplemented!("There is no backend with this identifier"),
2022-01-18 19:42:56 +01:00
Err(_) => {
if std::env::var_os("DISPLAY").is_some()
|| std::env::var_os("WAYLAND_DISPLAY").is_some()
{
match x11::init_backend(dh, event_loop, state) {
2022-01-18 19:42:56 +01:00
Ok(_) => Ok(()),
Err(err) => {
warn!(?err, "Initializing X11 Backend failed.");
info!("Falling back to winit backend.");
winit::init_backend(dh, event_loop, state)
2022-01-18 19:42:56 +01:00
}
}
2022-01-18 19:42:56 +01:00
} else {
kms::init_backend(dh, event_loop, state)
}
}
};
2022-09-28 12:01:29 +02:00
if res.is_ok() {
2022-09-28 12:01:29 +02:00
let output = state
.common
.shell
2024-04-10 15:49:08 +02:00
.read()
2022-09-28 12:01:29 +02:00
.outputs()
.next()
2024-04-10 15:49:08 +02:00
.with_context(|| "Backend initialized without output")
.cloned()?;
2024-04-05 13:53:35 +02:00
let initial_seat = crate::shell::create_seat(
2022-09-28 12:01:29 +02:00
dh,
&mut state.common.seat_state,
2024-04-10 15:49:08 +02:00
&output,
2022-09-28 12:01:29 +02:00
&state.common.config,
"seat-0".into(),
);
let keyboard = initial_seat
.get_keyboard()
.ok_or_else(|| anyhow!("`shell::create_seat` did not setup keyboard"))?;
2024-04-10 15:49:08 +02:00
state
.common
.shell
.write()
.seats
2025-02-14 19:14:43 +01:00
.add_seat(initial_seat.clone());
2025-08-08 13:28:37 -04:00
let helper = greeter::GreeterAccessibilityState::config()?;
let greeter_state = match greeter::GreeterAccessibilityState::get_entry(&helper) {
Ok(s) => s,
Err((errs, s)) => {
for err in errs {
tracing::error!("Error loading greeter state: {err:?}");
}
s
}
};
if let Some(magnifier) = greeter_state.magnifier {
let mut zoom = state.common.config.cosmic_conf.accessibility_zoom;
zoom.start_on_login = magnifier;
if let Err(err) = state
.common
.config
.cosmic_conf
.set_accessibility_zoom(&state.common.config.cosmic_helper, zoom)
{
tracing::error!("Failed to set screen filter: {err:?}");
}
}
if let Some(inverted) = greeter_state.invert_colors {
if inverted != state.a11y_state().screen_inverted() {
state.request_screen_invert(inverted);
}
}
2025-02-14 19:14:43 +01:00
if state
.common
.config
.cosmic_conf
.accessibility_zoom
.start_on_login
{
state.common.shell.write().trigger_zoom(
2025-03-25 17:31:48 +01:00
&initial_seat,
None,
1.0 + (state.common.config.cosmic_conf.accessibility_zoom.increment as f64 / 100.),
&state.common.config.cosmic_conf.accessibility_zoom,
true,
&state.common.event_loop_handle,
);
2025-02-14 19:14:43 +01:00
}
let desired_numlock = state
.common
.config
.cosmic_conf
.keyboard_config
.numlock_state;
// Restore numlock state based on config.
let toggle_numlock = match desired_numlock {
NumlockState::BootOff => keyboard.modifier_state().num_lock,
NumlockState::BootOn => !keyboard.modifier_state().num_lock,
NumlockState::LastBoot => {
keyboard.modifier_state().num_lock
!= state.common.config.dynamic_conf.numlock().last_state
}
};
// If we're enabling numlock...
if toggle_numlock {
/// Linux scancode for numlock key.
const NUMLOCK_SCANCODE: u32 = 69;
crate::config::change_modifier_state(&keyboard, NUMLOCK_SCANCODE, state);
}
{
{
state
.common
.startup_done
.store(true, std::sync::atomic::Ordering::SeqCst);
for output in state.common.shell.read().outputs() {
state.backend.schedule_render(&output);
}
}
}
2021-12-15 23:23:49 +01:00
}
res
2021-12-15 23:23:49 +01:00
}