diff options
| -rw-r--r-- | Cargo.lock | 168 | ||||
| -rw-r--r-- | Cargo.toml | 7 | ||||
| -rw-r--r-- | src/bar.rs | 13 | ||||
| -rw-r--r-- | src/cursor.rs | 129 | ||||
| -rw-r--r-- | src/main.rs | 1 | ||||
| -rw-r--r-- | src/state.rs | 18 |
6 files changed, 118 insertions, 218 deletions
@@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.68" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61" +checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800" [[package]] name = "autocfg" @@ -37,9 +37,9 @@ checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" [[package]] name = "cairo-rs" -version = "0.16.7" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3125b15ec28b84c238f6f476c6034016a5f6cc0221cb514ca46c532139fc97d" +checksum = "a8af54f5d48af1226928adc1f57edd22f5df1349e7da1fc96ae15cf43db0e871" dependencies = [ "bitflags", "cairo-sys-rs", @@ -51,9 +51,9 @@ dependencies = [ [[package]] name = "cairo-sys-rs" -version = "0.16.3" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c48f4af05fabdcfa9658178e1326efa061853f040ce7d72e33af6885196f421" +checksum = "f55382a01d30e5e53f185eee269124f5e21ab526595b872751278dfbb463594e" dependencies = [ "glib-sys", "libc", @@ -221,9 +221,9 @@ dependencies = [ [[package]] name = "gio" -version = "0.16.7" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a1c84b4534a290a29160ef5c6eff2a9c95833111472e824fc5cb78b513dd092" +checksum = "1981edf8679d2f2c8ec3120015867f45aa0a1c2d5e3e129ca2f7dda174d3d2a9" dependencies = [ "bitflags", "futures-channel", @@ -241,9 +241,9 @@ dependencies = [ [[package]] name = "gio-sys" -version = "0.16.3" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9b693b8e39d042a95547fc258a7b07349b1f0b48f4b2fa3108ba3c51c0b5229" +checksum = "b5d3076ecb86c8c3a672c9843d6232b3a344fb81d304d0ba1ac64b23343efa46" dependencies = [ "glib-sys", "gobject-sys", @@ -254,9 +254,9 @@ dependencies = [ [[package]] name = "glib" -version = "0.16.7" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd4df61a866ed7259d6189b8bcb1464989a77f1d85d25d002279bbe9dd38b2f" +checksum = "91b429154ec5943185aeeaf79e646297567b6a056965f1e89da2657a0e23255b" dependencies = [ "bitflags", "futures-channel", @@ -269,6 +269,7 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", + "memchr", "once_cell", "smallvec", "thiserror", @@ -276,9 +277,9 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.16.3" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e084807350b01348b6d9dbabb724d1a0bb987f47a2c85de200e98e12e30733bf" +checksum = "9bc80ac951300ca288dd9ab3863743c37a608fb0e5ca12863495640ec6b781ab" dependencies = [ "anyhow", "heck", @@ -291,9 +292,9 @@ dependencies = [ [[package]] name = "glib-sys" -version = "0.16.3" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61a4f46316d06bfa33a7ac22df6f0524c8be58e3db2d9ca99ccb1f357b62a65" +checksum = "9ddcb73fa8236277bedadaaadb76aef49c85d66340f83bece244f46c2d4f0e01" dependencies = [ "libc", "system-deps", @@ -301,9 +302,9 @@ dependencies = [ [[package]] name = "gobject-sys" -version = "0.16.3" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3520bb9c07ae2a12c7f2fbb24d4efc11231c8146a86956413fb1a79bb760a0f1" +checksum = "9a0155d388840c77d61b033b66ef4f9bc7f4133d83df83572d6b4fb234a3be7d" dependencies = [ "glib-sys", "libc", @@ -318,18 +319,15 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "heck" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.2.6" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" [[package]] name = "humantime" @@ -351,11 +349,11 @@ dependencies = [ "serde_json", "thiserror", "tokio", - "toml 0.7.1", + "toml 0.7.2", "wayrs-client", + "wayrs-cursor", "wayrs-protocols", "wayrs-shm-alloc", - "xcursor", ] [[package]] @@ -370,24 +368,24 @@ dependencies = [ [[package]] name = "io-lifetimes" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7d6c6f8c91b4b9ed43484ad1a938e393caf35960fce7f82a040497207bd8e9e" +checksum = "1abeb7a0dd0f8181267ff8adc397075586500b81b28a73e8a0208b00fc170fb3" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.45.0", ] [[package]] name = "is-terminal" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dfb6c8100ccc63462345b67d1bbc3679177c75ee4bf59bf29c8b1d110b8189" +checksum = "22e18b0a45d56fe973d6db23972bf5bc46f988a4a2385deac9cc29572f09daef" dependencies = [ "hermit-abi", "io-lifetimes", "rustix", - "windows-sys", + "windows-sys 0.45.0", ] [[package]] @@ -425,9 +423,9 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memmap2" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b182332558b18d807c4ce1ca8ca983b34c3ee32765e47b3f0f69b90355cc1dc" +checksum = "2af2c65375e552a67fe3829ca63e8a7c27a378a62824594f43b2851d682b5ec2" dependencies = [ "libc", ] @@ -449,14 +447,14 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "mio" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" +checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" dependencies = [ "libc", "log", "wasi", - "windows-sys", + "windows-sys 0.45.0", ] [[package]] @@ -493,15 +491,15 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "pango" -version = "0.16.5" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdff66b271861037b89d028656184059e03b0b6ccb36003820be19f7200b1e94" +checksum = "243c048be90312220fb3bd578176eed8290568274a93c95040289d39349384bc" dependencies = [ "bitflags", "gio", @@ -513,9 +511,9 @@ dependencies = [ [[package]] name = "pango-sys" -version = "0.16.3" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e134909a9a293e04d2cc31928aa95679c5e4df954d0b85483159bd20d8f047f" +checksum = "4293d0f0b5525eb5c24734d30b0ed02cd02aa734f216883f376b54de49625de8" dependencies = [ "glib-sys", "gobject-sys", @@ -525,9 +523,9 @@ dependencies = [ [[package]] name = "pangocairo" -version = "0.16.3" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16ad2ec87789371b551fd2367c10aa37060412ffd3e60abd99491b21b93a3f9b" +checksum = "2feeb7ea7874507f83f5e7ba869c54e321959431c8fbd70d4b735c8b15d90506" dependencies = [ "bitflags", "cairo-rs", @@ -539,9 +537,9 @@ dependencies = [ [[package]] name = "pangocairo-sys" -version = "0.16.3" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848d2df9b7f1a8c7a19d994de443bcbe5d4382610ccb8e64247f932be74fcf76" +checksum = "71abd374a8322e2e382039ff2e020c4cc9ef2e12ea488e38d9cec4a55e296470" dependencies = [ "cairo-sys-rs", "glib-sys", @@ -604,9 +602,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.50" +version = "1.0.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2" +checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" dependencies = [ "unicode-ident", ] @@ -668,16 +666,16 @@ checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" [[package]] name = "rustix" -version = "0.36.7" +version = "0.36.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fdebc4b395b7fbb9ab11e462e20ed9051e7b16e42d24042c776eca0ac81b03" +checksum = "f43abb88211988493c1abb44a70efa56ff0ce98f233b7b276146f1f3f7ba9644" dependencies = [ "bitflags", "errno", "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.45.0", ] [[package]] @@ -708,9 +706,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.91" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883" +checksum = "cad406b69c91885b5107daf2c29572f6c8cdb3c66826821e286c533490c0bc76" dependencies = [ "itoa", "ryu", @@ -737,18 +735,18 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" dependencies = [ "libc", ] [[package]] name = "slab" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" dependencies = [ "autocfg", ] @@ -843,7 +841,7 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -868,14 +866,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "772c1426ab886e7362aedf4abc9c0d1348a979517efedfc25862944d10137af0" +checksum = "f7afcae9e3f0fe2c370fd4657108972cbb2fa9db1b9f84849cefd80741b01cb6" dependencies = [ "serde", "serde_spanned", "toml_datetime 0.6.1", - "toml_edit 0.19.1", + "toml_edit 0.19.3", ] [[package]] @@ -906,9 +904,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.19.1" +version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90a238ee2e6ede22fb95350acc78e21dc40da00bb66c0334bde83de4ed89424e" +checksum = "5e6a7712b49e1775fb9a7b998de6635b299237f48b404dde71704f2e0e7f37e5" dependencies = [ "indexmap", "nom8", @@ -960,6 +958,18 @@ dependencies = [ ] [[package]] +name = "wayrs-cursor" +version = "0.4.0-beta.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1879f7969f4c6ff185ba9f39fa699c803800b893468969c4c0fbf4e90170cbe" +dependencies = [ + "thiserror", + "wayrs-client", + "wayrs-shm-alloc", + "xcursor", +] + +[[package]] name = "wayrs-protocols" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -983,9 +993,9 @@ dependencies = [ [[package]] name = "wayrs-shm-alloc" -version = "0.3.0" +version = "0.4.0-beta.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9c74736663be1fc43219fab7cf694315667f4c7fb6958e1302d41dd684df64" +checksum = "9aca921a02f92231c33b39e3dab65f727453ec00b468bc6599476fecb7468856" dependencies = [ "memmap2", "shmemfdrs", @@ -1039,6 +1049,30 @@ dependencies = [ ] [[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] name = "windows_aarch64_gnullvm" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -9,16 +9,15 @@ env_logger = "0.10" anyhow = "1" dirs-next = "2" toml = "0.7" -pangocairo = "0.16" +pangocairo = "0.17" serde = { version = "1", features = ["derive"] } serde_json = "1" memchr = "2" thiserror = "1.0.38" wayrs-client = { version = "0.3", features = ["tokio"] } -wayrs-shm-alloc = "0.3" - -xcursor = "0.3.4" +wayrs-shm-alloc = "0.4.0-beta.0" +wayrs-cursor = "0.4.0-beta.0" [dependencies.wayrs-protocols] version = "0.3" @@ -3,6 +3,7 @@ use std::collections::BinaryHeap; use pangocairo::cairo; use wayrs_client::connection::Connection; +use wayrs_shm_alloc::BufferSpec; use crate::button_manager::ButtonManager; use crate::color::Color; @@ -106,10 +107,12 @@ impl Bar { let (buffer, canvas) = ss.shm.alloc_buffer( conn, - pix_width as i32, - pix_height as i32, - pix_width as i32 * 4, - wl_shm::Format::Argb8888, + BufferSpec { + width: pix_width, + height: pix_height, + stride: pix_width * 4, + format: wl_shm::Format::Argb8888, + }, ); let cairo_surf = unsafe { @@ -233,7 +236,7 @@ impl Bar { self.viewport .set_destination(conn, self.width as i32, self.height as i32); - self.surface.attach(conn, buffer.wl, 0, 0); + self.surface.attach(conn, buffer.into_wl_buffer(), 0, 0); self.surface.damage(conn, 0, 0, i32::MAX, i32::MAX); self.surface.commit(conn); } diff --git a/src/cursor.rs b/src/cursor.rs deleted file mode 100644 index ee7509b..0000000 --- a/src/cursor.rs +++ /dev/null @@ -1,129 +0,0 @@ -use std::collections::HashMap; -use std::io; - -use wayrs_client::connection::Connection; -use wayrs_client::protocol::*; -use wayrs_shm_alloc::ShmAlloc; - -use xcursor::parser::Image; - -use crate::state::State; - -#[derive(Debug, thiserror::Error)] -pub enum CursorError { - #[error("cursor '{0}' not found")] - CursorNotFound(String), - #[error("theme could not be parsed")] - ThemeParseError, - #[error(transparent)] - ReadError(#[from] io::Error), -} - -pub struct CursorTheme { - xcursor_size: u32, - theme: xcursor::CursorTheme, - cursors: HashMap<String, Vec<Image>>, -} - -impl CursorTheme { - pub fn new() -> Self { - let theme_name = std::env::var("XCURSOR_THEME").ok(); - let theme_name = theme_name.as_deref().unwrap_or("default"); - - let xcursor_size = std::env::var("XCURSOR_SIZE") - .ok() - .and_then(|x| x.parse().ok()) - .unwrap_or(24); - - let theme = xcursor::CursorTheme::load(theme_name); - - CursorTheme { - xcursor_size, - theme, - cursors: HashMap::new(), - } - } - - /// Use this to handle errors ahead of time. - pub fn ensure_cursor_is_loaded(&mut self, cursor: &str) -> Result<(), CursorError> { - let _ = self.get_images(cursor)?; - Ok(()) - } - - #[allow(clippy::too_many_arguments)] - pub fn set_cursor( - &mut self, - conn: &mut Connection<State>, - cursor: &str, - scale: u32, - serial: u32, - shm: &mut ShmAlloc, - surface: WlSurface, - pointer: WlPointer, - ) -> Result<(), CursorError> { - let target_size = self.xcursor_size * scale; - - let images = self.get_images(cursor)?; - - let image = match images.binary_search_by_key(&target_size, |img| img.size) { - Ok(indx) => &images[indx], - Err(indx) if indx == 0 => images.first().unwrap(), - Err(indx) if indx >= images.len() => images.last().unwrap(), - Err(indx) => { - let a = &images[indx - 1]; - let b = &images[indx]; - if target_size - a.size < b.size - target_size { - a - } else { - b - } - } - }; - - let (buffer, canvas) = shm.alloc_buffer( - conn, - image.width as i32, - image.height as i32, - (image.width * 4) as i32, - wl_shm::Format::Argb8888, - ); - - assert_eq!(image.pixels_rgba.len(), canvas.len()); - canvas.copy_from_slice(&image.pixels_rgba); - - surface.attach(conn, buffer.wl, 0, 0); - surface.damage(conn, 0, 0, i32::MAX, i32::MAX); - surface.set_buffer_scale(conn, scale as i32); - surface.commit(conn); - - pointer.set_cursor( - conn, - serial, - surface, - (image.xhot / scale) as i32, - (image.yhot / scale) as i32, - ); - - Ok(()) - } - - fn get_images(&mut self, cursor: &'_ str) -> Result<&[Image], CursorError> { - // Borrow checker does't allow `if let Some(...) = ...` here for some reason :( - if self.cursors.get(cursor).is_some() { - return Ok(self.cursors.get(cursor).unwrap()); - } - - let theme_path = self - .theme - .load_icon(cursor) - .ok_or_else(|| CursorError::CursorNotFound(cursor.to_owned()))?; - - let raw_theme = std::fs::read(theme_path)?; - - let mut images = - xcursor::parser::parse_xcursor(&raw_theme).ok_or(CursorError::ThemeParseError)?; - images.sort_unstable_by_key(|img| img.size); - - Ok(self.cursors.entry(cursor.to_owned()).or_insert(images)) - } -} diff --git a/src/main.rs b/src/main.rs index 2a4c4c2..241cd19 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,7 +9,6 @@ mod bar; mod button_manager; mod color; mod config; -mod cursor; mod i3bar_protocol; mod ord_adaptor; mod pointer_btn; diff --git a/src/state.rs b/src/state.rs index 5a18a80..b9f11df 100644 --- a/src/state.rs +++ b/src/state.rs @@ -1,5 +1,4 @@ use crate::config::Position; -use crate::cursor::CursorTheme; use crate::protocol::*; use crate::wm_info_provider::*; @@ -8,7 +7,8 @@ use std::future::pending; use wayrs_client::connection::Connection; use wayrs_client::global::{Global, GlobalExt, Globals, GlobalsExt}; use wayrs_client::proxy::Proxy; -use wayrs_shm_alloc::{ShmAlloc, ShmAllocState}; +use wayrs_cursor::CursorTheme; +use wayrs_shm_alloc::ShmAlloc; use crate::{ bar::Bar, config::Config, i3bar_protocol::Block, pointer_btn::PointerBtn, @@ -57,9 +57,9 @@ impl State { conn.set_callback_for(conn.registry(), wl_registry_cb); - let shm = globals.bind(conn, 1..=1).expect("could not bind wl_shm"); + let wl_shm = globals.bind(conn, 1..=1).expect("could not bind wl_shm"); - let mut cursor_theme = CursorTheme::new(); + let mut cursor_theme = CursorTheme::new(None, None); let cursor_theme_ok = cursor_theme .ensure_cursor_is_loaded("default") .map_err(|e| error = Err(e.into())) @@ -75,7 +75,7 @@ impl State { bars: Vec::new(), shared_state: SharedState { - shm: ShmAlloc::new(conn, shm, 1024), + shm: ShmAlloc::new(wl_shm), config, status_cmd, blocks: Vec::new(), @@ -258,12 +258,6 @@ impl State { } } -impl ShmAllocState for State { - fn shm_alloc(&mut self) -> &mut ShmAlloc { - &mut self.shared_state.shm - } -} - fn wl_registry_cb( conn: &mut Connection<State>, state: &mut State, @@ -455,10 +449,10 @@ fn wl_pointer_cb( cursor_theme .set_cursor( conn, + &mut state.shared_state.shm, "default", bar.scale, args.serial, - &mut state.shared_state.shm, seat.cursor_surface, pointer, ) |
