From 2698c06f50febd49c58fffb67da0ebf9684bb90a Mon Sep 17 00:00:00 2001 From: Victoria Brekenfeld Date: Wed, 15 Dec 2021 18:00:28 +0100 Subject: [PATCH] main: launch main loop and wayland sock --- Cargo.lock | 201 +++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 6 ++ build.rs | 12 +++ src/main.rs | 82 ++++++++++++++++++++- src/state.rs | 19 +++++ 5 files changed, 318 insertions(+), 2 deletions(-) create mode 100644 build.rs create mode 100644 src/state.rs diff --git a/Cargo.lock b/Cargo.lock index 789965c9..51c2dbc7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "anyhow" +version = "1.0.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b26702f315f53b6071259e15dd9d64528213b44d61de1ec926eca7715d62203" + [[package]] name = "appendlist" version = "1.4.0" @@ -17,6 +23,23 @@ dependencies = [ "num-traits", ] +[[package]] +name = "arc-swap" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d78ce20460b82d3fa150275ed9d55e21064fc7951177baacf86a145c4a4b1f" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + [[package]] name = "autocfg" version = "1.0.1" @@ -61,13 +84,73 @@ dependencies = [ "num-traits", ] +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits", + "time", + "winapi", +] + [[package]] name = "cosmic-comp" version = "0.1.0" dependencies = [ + "anyhow", + "slog", + "slog-async", + "slog-scope", + "slog-stdlog", + "slog-term", "smithay", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" +dependencies = [ + "cfg-if", + "lazy_static", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + [[package]] name = "downcast-rs" version = "1.2.0" @@ -170,6 +253,15 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + [[package]] name = "indexmap" version = "1.7.0" @@ -239,6 +331,16 @@ dependencies = [ "memoffset", ] +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +dependencies = [ + "autocfg", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.14" @@ -333,6 +435,16 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_users" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +dependencies = [ + "getrandom", + "redox_syscall", +] + [[package]] name = "remove_dir_all" version = "0.5.3" @@ -342,6 +454,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "rustversion" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" + [[package]] name = "scan_fmt" version = "0.2.6" @@ -354,6 +472,53 @@ version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8347046d4ebd943127157b94d63abb990fcf729dc4e9978927fdf4ac3c998d06" +[[package]] +name = "slog-async" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "766c59b252e62a34651412870ff55d8c4e6d04df19b43eecb2703e417b097ffe" +dependencies = [ + "crossbeam-channel", + "slog", + "take_mut", + "thread_local", +] + +[[package]] +name = "slog-scope" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f95a4b4c3274cd2869549da82b57ccc930859bdbf5bcea0424bc5f140b3c786" +dependencies = [ + "arc-swap", + "lazy_static", + "slog", +] + +[[package]] +name = "slog-stdlog" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8228ab7302adbf4fcb37e66f3cda78003feb521e7fd9e3847ec117a7784d0f5a" +dependencies = [ + "log", + "slog", + "slog-scope", +] + +[[package]] +name = "slog-term" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95c1e7e5aab61ced6006149ea772770b84a0d16ce0f7885def313e4829946d76" +dependencies = [ + "atty", + "chrono", + "slog", + "term", + "thread_local", +] + [[package]] name = "smallvec" version = "1.7.0" @@ -404,6 +569,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "take_mut" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" + [[package]] name = "tempfile" version = "3.2.0" @@ -418,6 +589,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + [[package]] name = "thiserror" version = "1.0.30" @@ -438,6 +620,25 @@ dependencies = [ "syn", ] +[[package]] +name = "thread_local" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" +dependencies = [ + "once_cell", +] + +[[package]] +name = "time" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "unicode-xid" version = "0.2.2" diff --git a/Cargo.toml b/Cargo.toml index e6519d52..93924e5f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,12 @@ license = "GPL-3.0-only" authors = ["Victoria Brekenfeld"] [dependencies] +anyhow = "1.0.51" +slog = "2.7" +slog-term = "2.8" +slog-async = "2.7" +slog-scope = "4.4" +slog-stdlog = "4.1" [dependencies.smithay] version = "0.3" diff --git a/build.rs b/build.rs new file mode 100644 index 00000000..be94c38c --- /dev/null +++ b/build.rs @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: GPL-3.0-only + +use std::process::Command; + +fn main() { + let output = Command::new("git") + .args(&["rev-parse", "HEAD"]) + .output() + .unwrap(); + let git_hash = String::from_utf8(output.stdout).unwrap(); + println!("cargo:rustc-env=GIT_HASH={}", git_hash); +} diff --git a/src/main.rs b/src/main.rs index 004efea4..b6efba84 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,83 @@ // SPDX-License-Identifier: GPL-3.0-only -fn main() { - println!("Hello, world!"); +use smithay::reexports::{ + calloop::{generic::Generic, EventLoop, Interest, Mode, PostAction}, + wayland_server::Display, +}; + +use anyhow::{Context, Result}; +use slog::Drain; + +pub mod state; + +fn main() -> Result<()> { + // setup logger + let decorator = slog_term::TermDecorator::new().stderr().build(); + // usually we would not want to use a Mutex here, but this is usefull for a prototype, + // to make sure we do not miss any in-flight messages, when we crash. + let logger = slog::Logger::root( + std::sync::Mutex::new( + slog_term::CompactFormat::new(decorator) + .build() + .ignore_res(), + ) + .fuse(), + slog::o!(), + ); + let _guard = slog_scope::set_global_logger(logger); + slog_stdlog::init().unwrap(); + + slog_scope::info!("Version: {}", std::env!("CARGO_PKG_VERSION")); + if cfg!(debug_assertions) { + slog_scope::debug!( + "Debug build ({})", + std::option_env!("GIT_HASH").unwrap_or("Unknown") + ); + } + slog_scope::info!("Cosmic starting up!"); + + // init event loop + let mut event_loop = EventLoop::try_new().with_context(|| "Failed to initialize event loop")?; + + // add wayland socket + let mut display = Display::new(); + let socket_name = display.add_socket_auto()?; + event_loop + .handle() + .insert_source( + Generic::from_fd(display.get_poll_fd(), Interest::READ, Mode::Level), + move |_, _, state: &mut state::State| { + let display = state.display.clone(); + let mut display = display.borrow_mut(); + match display.dispatch(std::time::Duration::from_millis(0), state) { + Ok(_) => Ok(PostAction::Continue), + Err(e) => { + slog_scope::error!("I/O error on the Wayland display: {}", e); + state.should_stop = true; + Err(e) + } + } + }, + ) + .expect("Failed to init the wayland event source."); + slog_scope::info!("Listening on {:?}", socket_name); + + // init state + let mut state = state::State::new(display); + + // run the event loop + let signal = event_loop.get_signal(); + event_loop.run(None, &mut state, |state| { + // shall we shut down? + if state.should_stop { + signal.stop(); + return; + } + + // send out events + let display = state.display.clone(); + display.borrow_mut().flush_clients(state); + })?; + + Ok(()) } diff --git a/src/state.rs b/src/state.rs new file mode 100644 index 00000000..6292cbdd --- /dev/null +++ b/src/state.rs @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: GPL-3.0-only + +use std::{cell::RefCell, rc::Rc}; + +use smithay::reexports::wayland_server::Display; + +pub struct State { + pub display: Rc>, + pub should_stop: bool, +} + +impl State { + pub fn new(display: Display) -> State { + State { + display: Rc::new(RefCell::new(display)), + should_stop: false, + } + } +}