aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2023-09-03 13:25:43 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2023-09-03 13:25:43 +0400
commitdcc6a557774c8af0dc62839308130ee6a71fc629 (patch)
treea0b4ff5d064171da4cba46536876af844d018cc4
parent73d7a1d73dac14bcff43a1d595847b7c0bf14ec7 (diff)
downloadniri-dcc6a557774c8af0dc62839308130ee6a71fc629.tar.gz
niri-dcc6a557774c8af0dc62839308130ee6a71fc629.tar.bz2
niri-dcc6a557774c8af0dc62839308130ee6a71fc629.zip
Move LoopData into niri file
-rw-r--r--src/backend/tty.rs61
-rw-r--r--src/backend/winit.rs6
-rw-r--r--src/main.rs39
-rw-r--r--src/niri.rs38
4 files changed, 68 insertions, 76 deletions
diff --git a/src/backend/tty.rs b/src/backend/tty.rs
index 63256821..e5ee4551 100644
--- a/src/backend/tty.rs
+++ b/src/backend/tty.rs
@@ -31,15 +31,15 @@ use smithay_drm_extras::drm_scanner::{DrmScanEvent, DrmScanner};
use smithay_drm_extras::edid::EdidInfo;
use crate::input::{BackendAction, CompositorMod};
-use crate::niri::OutputRenderElements;
-use crate::{LoopData, Niri};
+use crate::niri::{Data, OutputRenderElements};
+use crate::Niri;
const BACKGROUND_COLOR: [f32; 4] = [0.1, 0.1, 0.1, 1.];
const SUPPORTED_COLOR_FORMATS: &[Fourcc] = &[Fourcc::Argb8888, Fourcc::Abgr8888];
pub struct Tty {
session: LibSeatSession,
- udev_dispatcher: Dispatcher<'static, UdevBackend, LoopData>,
+ udev_dispatcher: Dispatcher<'static, UdevBackend, Data>,
primary_gpu_path: PathBuf,
output_device: Option<OutputDevice>,
}
@@ -69,45 +69,44 @@ struct TtyOutputState {
}
impl Tty {
- pub fn new(event_loop: LoopHandle<'static, LoopData>) -> Self {
+ pub fn new(event_loop: LoopHandle<'static, Data>) -> Self {
let (session, notifier) = LibSeatSession::new().unwrap();
let seat_name = session.seat();
let udev_backend = UdevBackend::new(session.seat()).unwrap();
- let udev_dispatcher =
- Dispatcher::new(udev_backend, move |event, _, data: &mut LoopData| {
- let tty = data.backend.tty().unwrap();
- let niri = &mut data.niri;
-
- match event {
- UdevEvent::Added { device_id, path } => {
- if !tty.session.is_active() {
- debug!("skipping UdevEvent::Added as session is inactive");
- return;
- }
+ let udev_dispatcher = Dispatcher::new(udev_backend, move |event, _, data: &mut Data| {
+ let tty = data.backend.tty().unwrap();
+ let niri = &mut data.niri;
- if let Err(err) = tty.device_added(device_id, &path, niri) {
- warn!("error adding device: {err:?}");
- }
+ match event {
+ UdevEvent::Added { device_id, path } => {
+ if !tty.session.is_active() {
+ debug!("skipping UdevEvent::Added as session is inactive");
+ return;
}
- UdevEvent::Changed { device_id } => {
- if !tty.session.is_active() {
- debug!("skipping UdevEvent::Changed as session is inactive");
- return;
- }
- tty.device_changed(device_id, niri)
+ if let Err(err) = tty.device_added(device_id, &path, niri) {
+ warn!("error adding device: {err:?}");
+ }
+ }
+ UdevEvent::Changed { device_id } => {
+ if !tty.session.is_active() {
+ debug!("skipping UdevEvent::Changed as session is inactive");
+ return;
}
- UdevEvent::Removed { device_id } => {
- if !tty.session.is_active() {
- debug!("skipping UdevEvent::Removed as session is inactive");
- return;
- }
- tty.device_removed(device_id, niri)
+ tty.device_changed(device_id, niri)
+ }
+ UdevEvent::Removed { device_id } => {
+ if !tty.session.is_active() {
+ debug!("skipping UdevEvent::Removed as session is inactive");
+ return;
}
+
+ tty.device_removed(device_id, niri)
}
- });
+ }
+ });
event_loop
.register_dispatcher(udev_dispatcher.clone())
.unwrap();
diff --git a/src/backend/winit.rs b/src/backend/winit.rs
index 35bf3407..74485469 100644
--- a/src/backend/winit.rs
+++ b/src/backend/winit.rs
@@ -13,9 +13,9 @@ use smithay::reexports::winit::window::WindowBuilder;
use smithay::utils::Transform;
use crate::input::{BackendAction, CompositorMod};
-use crate::niri::OutputRenderElements;
+use crate::niri::{Data, OutputRenderElements};
use crate::utils::get_monotonic_time;
-use crate::{LoopData, Niri};
+use crate::Niri;
pub struct Winit {
output: Output,
@@ -25,7 +25,7 @@ pub struct Winit {
}
impl Winit {
- pub fn new(event_loop: LoopHandle<LoopData>) -> Self {
+ pub fn new(event_loop: LoopHandle<Data>) -> Self {
let builder = WindowBuilder::new()
.with_inner_size(LogicalSize::new(1280.0, 800.0))
// .with_resizable(false)
diff --git a/src/main.rs b/src/main.rs
index 2e77fd42..c5912c6f 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -15,11 +15,9 @@ mod utils;
use std::env;
use std::ffi::OsString;
-use backend::{Backend, Tty, Winit};
use clap::Parser;
-use niri::Niri;
+use niri::{Data, Niri};
use smithay::reexports::calloop::EventLoop;
-use smithay::reexports::wayland_server::Display;
use tracing_subscriber::EnvFilter;
#[derive(Parser)]
@@ -30,15 +28,6 @@ struct Cli {
command: Vec<OsString>,
}
-pub struct LoopData {
- niri: Niri,
- backend: Backend,
-
- // Last so that it's dropped after the Smithay state in Niri and related state in Tty.
- // Otherwise it will segfault on quit.
- display: Display<Niri>,
-}
-
fn main() {
env::set_var("RUST_BACKTRACE", "1");
@@ -54,31 +43,7 @@ fn main() {
let _client = tracy_client::Client::start();
let mut event_loop = EventLoop::try_new().unwrap();
-
- let has_display = env::var_os("WAYLAND_DISPLAY").is_some() || env::var_os("DISPLAY").is_some();
-
- let backend = if has_display {
- Backend::Winit(Winit::new(event_loop.handle()))
- } else {
- Backend::Tty(Tty::new(event_loop.handle()))
- };
-
- let mut display = Display::new().unwrap();
- let niri = Niri::new(
- event_loop.handle(),
- event_loop.get_signal(),
- &mut display,
- backend.seat_name(),
- );
-
- let mut data = LoopData {
- niri,
- display,
-
- backend,
- };
-
- data.backend.init(&mut data.niri);
+ let mut data = Data::new(event_loop.handle(), event_loop.get_signal());
if let Some((command, args)) = cli.command.split_first() {
if let Err(err) = std::process::Command::new(command).args(args).spawn() {
diff --git a/src/niri.rs b/src/niri.rs
index 25fd3bc9..adc97b1e 100644
--- a/src/niri.rs
+++ b/src/niri.rs
@@ -2,8 +2,8 @@ use std::collections::HashMap;
use std::os::unix::io::AsRawFd;
use std::process::Command;
use std::sync::{Arc, Mutex};
-use std::thread;
use std::time::Duration;
+use std::{env, thread};
use anyhow::Context;
use directories::UserDirs;
@@ -53,16 +53,15 @@ use smithay::wayland::socket::ListeningSocketSource;
use smithay::wayland::tablet_manager::TabletManagerState;
use time::OffsetDateTime;
-use crate::backend::Backend;
+use crate::backend::{Backend, Tty, Winit};
use crate::dbus::mutter_service_channel::ServiceChannel;
use crate::frame_clock::FrameClock;
use crate::layout::{MonitorRenderElement, MonitorSet};
use crate::utils::{center, get_monotonic_time, load_default_cursor};
-use crate::LoopData;
pub struct Niri {
pub start_time: std::time::Instant,
- pub event_loop: LoopHandle<'static, LoopData>,
+ pub event_loop: LoopHandle<'static, Data>,
pub stop_signal: LoopSignal,
pub display_handle: DisplayHandle,
@@ -113,9 +112,38 @@ pub struct OutputState {
pub frame_clock: FrameClock,
}
+pub struct Data {
+ pub display: Display<Niri>,
+ pub backend: Backend,
+ pub niri: Niri,
+}
+
+impl Data {
+ pub fn new(event_loop: LoopHandle<'static, Self>, stop_signal: LoopSignal) -> Self {
+ let has_display =
+ env::var_os("WAYLAND_DISPLAY").is_some() || env::var_os("DISPLAY").is_some();
+
+ let mut backend = if has_display {
+ Backend::Winit(Winit::new(event_loop.clone()))
+ } else {
+ Backend::Tty(Tty::new(event_loop.clone()))
+ };
+
+ let mut display = Display::new().unwrap();
+ let mut niri = Niri::new(event_loop, stop_signal, &mut display, backend.seat_name());
+ backend.init(&mut niri);
+
+ Self {
+ display,
+ backend,
+ niri,
+ }
+ }
+}
+
impl Niri {
pub fn new(
- event_loop: LoopHandle<'static, LoopData>,
+ event_loop: LoopHandle<'static, Data>,
stop_signal: LoopSignal,
display: &mut Display<Self>,
seat_name: String,