Initial version that creates an empty window
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| /target | ||||
							
								
								
									
										320
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										320
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,320 @@ | ||||
| # This file is automatically @generated by Cargo. | ||||
| # It is not intended for manual editing. | ||||
| version = 3 | ||||
|  | ||||
| [[package]] | ||||
| name = "autocfg" | ||||
| version = "1.1.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" | ||||
|  | ||||
| [[package]] | ||||
| name = "bitflags" | ||||
| version = "1.3.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" | ||||
|  | ||||
| [[package]] | ||||
| name = "calloop" | ||||
| version = "0.9.3" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "bf2eec61efe56aa1e813f5126959296933cf0700030e4314786c48779a66ab82" | ||||
| dependencies = [ | ||||
|  "log", | ||||
|  "nix", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "cc" | ||||
| version = "1.0.73" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" | ||||
|  | ||||
| [[package]] | ||||
| name = "cfg-if" | ||||
| version = "1.0.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" | ||||
|  | ||||
| [[package]] | ||||
| name = "dlib" | ||||
| version = "0.5.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "ac1b7517328c04c2aa68422fc60a41b92208182142ed04a25879c26c8f878794" | ||||
| dependencies = [ | ||||
|  "libloading", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "downcast-rs" | ||||
| version = "1.2.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" | ||||
|  | ||||
| [[package]] | ||||
| name = "lazy_static" | ||||
| version = "1.4.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" | ||||
|  | ||||
| [[package]] | ||||
| name = "libc" | ||||
| version = "0.2.121" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f" | ||||
|  | ||||
| [[package]] | ||||
| name = "libloading" | ||||
| version = "0.7.3" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
|  "winapi", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "log" | ||||
| version = "0.4.17" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "memchr" | ||||
| version = "2.5.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" | ||||
|  | ||||
| [[package]] | ||||
| name = "memmap2" | ||||
| version = "0.3.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "00b6c2ebff6180198788f5db08d7ce3bc1d0b617176678831a7510825973e357" | ||||
| dependencies = [ | ||||
|  "libc", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "memoffset" | ||||
| version = "0.6.5" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" | ||||
| dependencies = [ | ||||
|  "autocfg", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "minimal-lexical" | ||||
| version = "0.2.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" | ||||
|  | ||||
| [[package]] | ||||
| name = "nix" | ||||
| version = "0.22.3" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" | ||||
| dependencies = [ | ||||
|  "bitflags", | ||||
|  "cc", | ||||
|  "cfg-if", | ||||
|  "libc", | ||||
|  "memoffset", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "nom" | ||||
| version = "7.1.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" | ||||
| dependencies = [ | ||||
|  "memchr", | ||||
|  "minimal-lexical", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "once_cell" | ||||
| version = "1.10.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" | ||||
|  | ||||
| [[package]] | ||||
| name = "pkg-config" | ||||
| version = "0.3.24" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe" | ||||
|  | ||||
| [[package]] | ||||
| name = "proc-macro2" | ||||
| version = "1.0.36" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" | ||||
| dependencies = [ | ||||
|  "unicode-xid", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "quote" | ||||
| version = "1.0.17" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "632d02bff7f874a36f33ea8bb416cd484b90cc66c1194b1a1110d067a7013f58" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "scoped-tls" | ||||
| version = "1.0.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" | ||||
|  | ||||
| [[package]] | ||||
| name = "smallvec" | ||||
| version = "1.8.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" | ||||
|  | ||||
| [[package]] | ||||
| name = "smithay-client-toolkit" | ||||
| version = "0.15.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "8a28f16a97fa0e8ce563b2774d1e732dd5d4025d2772c5dba0a41a0f90a29da3" | ||||
| dependencies = [ | ||||
|  "bitflags", | ||||
|  "calloop", | ||||
|  "dlib", | ||||
|  "lazy_static", | ||||
|  "log", | ||||
|  "memmap2", | ||||
|  "nix", | ||||
|  "pkg-config", | ||||
|  "wayland-client", | ||||
|  "wayland-cursor", | ||||
|  "wayland-protocols", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "unicode-xid" | ||||
| version = "0.2.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" | ||||
|  | ||||
| [[package]] | ||||
| name = "wayland-client" | ||||
| version = "0.29.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "91223460e73257f697d9e23d401279123d36039a3f7a449e983f123292d4458f" | ||||
| dependencies = [ | ||||
|  "bitflags", | ||||
|  "downcast-rs", | ||||
|  "libc", | ||||
|  "nix", | ||||
|  "scoped-tls", | ||||
|  "wayland-commons", | ||||
|  "wayland-scanner", | ||||
|  "wayland-sys", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "wayland-commons" | ||||
| version = "0.29.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "94f6e5e340d7c13490eca867898c4cec5af56c27a5ffe5c80c6fc4708e22d33e" | ||||
| dependencies = [ | ||||
|  "nix", | ||||
|  "once_cell", | ||||
|  "smallvec", | ||||
|  "wayland-sys", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "wayland-cursor" | ||||
| version = "0.29.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "c52758f13d5e7861fc83d942d3d99bf270c83269575e52ac29e5b73cb956a6bd" | ||||
| dependencies = [ | ||||
|  "nix", | ||||
|  "wayland-client", | ||||
|  "xcursor", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "wayland-protocols" | ||||
| version = "0.29.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "60147ae23303402e41fe034f74fb2c35ad0780ee88a1c40ac09a3be1e7465741" | ||||
| dependencies = [ | ||||
|  "bitflags", | ||||
|  "wayland-client", | ||||
|  "wayland-commons", | ||||
|  "wayland-scanner", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "wayland-scanner" | ||||
| version = "0.29.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "39a1ed3143f7a143187156a2ab52742e89dac33245ba505c17224df48939f9e0" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "xml-rs", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "wayland-sys" | ||||
| version = "0.29.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "d9341df79a8975679188e37dab3889bfa57c44ac2cb6da166f519a81cbe452d4" | ||||
| dependencies = [ | ||||
|  "dlib", | ||||
|  "lazy_static", | ||||
|  "pkg-config", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "winapi" | ||||
| version = "0.3.9" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" | ||||
| dependencies = [ | ||||
|  "winapi-i686-pc-windows-gnu", | ||||
|  "winapi-x86_64-pc-windows-gnu", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "winapi-i686-pc-windows-gnu" | ||||
| version = "0.4.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" | ||||
|  | ||||
| [[package]] | ||||
| name = "winapi-x86_64-pc-windows-gnu" | ||||
| version = "0.4.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" | ||||
|  | ||||
| [[package]] | ||||
| name = "wl-seasonal-hours-clock" | ||||
| version = "0.1.0" | ||||
| dependencies = [ | ||||
|  "smithay-client-toolkit", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "xcursor" | ||||
| version = "0.3.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7" | ||||
| dependencies = [ | ||||
|  "nom", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "xml-rs" | ||||
| version = "0.8.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" | ||||
							
								
								
									
										7
									
								
								Cargo.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Cargo.toml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| [package] | ||||
| name = "wl-seasonal-hours-clock" | ||||
| version = "0.1.0" | ||||
| edition = "2021" | ||||
|  | ||||
| [dependencies] | ||||
| smithay-client-toolkit = "0.15" | ||||
							
								
								
									
										3
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| # Seasonal Hours Clock on Wayland | ||||
|  | ||||
| This is a Rust implementation of cinnamon’s [Seasonal Hours Clock](https://github.com/cinnamon-bun/seasonal-hours-clock), running as a native Wayland application. | ||||
							
								
								
									
										121
									
								
								src/main.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								src/main.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,121 @@ | ||||
| extern crate smithay_client_toolkit as sctk; | ||||
|  | ||||
| use sctk::reexports::client::protocol::{wl_shm, wl_surface}; | ||||
| use sctk::shm::AutoMemPool; | ||||
| use sctk::window::{Event as WEvent, FallbackFrame}; | ||||
|  | ||||
| sctk::default_environment!(SeasonalClock, desktop); | ||||
|  | ||||
| fn main() { | ||||
|     let (env, _display, mut queue) = sctk::new_default_environment!(SeasonalClock, desktop) | ||||
|         .expect("Unable to connect to a Wayland compositor"); | ||||
|  | ||||
|     let surface = env | ||||
|         .create_surface_with_scale_callback(|dpi, _surface, _dispatch_data| { | ||||
|             println!("dpi changed to {}", dpi); | ||||
|         }) | ||||
|         .detach(); | ||||
|  | ||||
|     let mut next_action = None::<WEvent>; | ||||
|  | ||||
|     let mut window = env | ||||
|         .create_window::<FallbackFrame, _>( | ||||
|             surface, | ||||
|             None, | ||||
|             (100, 100), | ||||
|             move |evt, mut dispatch_data| { | ||||
|                 let next_action = dispatch_data.get::<Option<WEvent>>().unwrap(); | ||||
|                 let replace = matches!( | ||||
|                     (&evt, &*next_action), | ||||
|                     (_, &None) | ||||
|                         | (_, &Some(WEvent::Refresh)) | ||||
|                         | (&WEvent::Configure { .. }, &Some(WEvent::Configure { .. })) | ||||
|                         | (&WEvent::Close, _) | ||||
|                 ); | ||||
|  | ||||
|                 if replace { | ||||
|                     *next_action = Some(evt); | ||||
|                 } | ||||
|             }, | ||||
|         ) | ||||
|         .expect("Failed to create a window !"); | ||||
|  | ||||
|     window.set_title("Seasonal Hours Clock".to_string()); | ||||
|  | ||||
|     let mut pool = env.create_auto_pool().expect("Failed to create the memory pool."); | ||||
|     let mut need_redraw = false; | ||||
|     let mut dimensions = (100, 100); | ||||
|  | ||||
|     if !env.get_shell().unwrap().needs_configure() { | ||||
|         redraw(&mut pool, window.surface(), dimensions) | ||||
|             .expect("Failed to draw"); | ||||
|         window.refresh() | ||||
|     } | ||||
|  | ||||
|     loop { | ||||
|         match next_action.take() { | ||||
|             Some(WEvent::Close) => break, | ||||
|             Some(WEvent::Refresh) => { | ||||
|                 window.refresh(); | ||||
|                 window.surface().commit(); | ||||
|             } | ||||
|             Some(WEvent::Configure { new_size, states: _ }) => { | ||||
|                 if let Some((w, h)) = new_size { | ||||
|                     if dimensions != (w, h) { | ||||
|                         dimensions = (w, h); | ||||
|                     } | ||||
|                 } | ||||
|                 window.resize(dimensions.0, dimensions.1); | ||||
|                 window.refresh(); | ||||
|                 need_redraw = true; | ||||
|             } | ||||
|             None => {} | ||||
|         } | ||||
|  | ||||
|         if need_redraw { | ||||
|             need_redraw = false; | ||||
|  | ||||
|             redraw( | ||||
|                 &mut pool, | ||||
|                 window.surface(), | ||||
|                 dimensions, | ||||
|             ) | ||||
|                 .expect("Failed to draw") | ||||
|         } | ||||
|  | ||||
|         queue.dispatch(&mut next_action, |_, _, _| {}).unwrap(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| fn redraw( | ||||
|     pool: &mut AutoMemPool, | ||||
|     surface: &wl_surface::WlSurface, | ||||
|     (buf_x, buf_y): (u32, u32), | ||||
| ) -> Result<(), ::std::io::Error> { | ||||
|     let (canvas, new_buffer) = pool.buffer( | ||||
|         buf_x as i32, | ||||
|         buf_y as i32, | ||||
|         4 * buf_x as i32, | ||||
|         wl_shm::Format::Argb8888, | ||||
|     )?; | ||||
|  | ||||
|     // We do not have anything to draw yet, so draw an empty surface | ||||
|     for dst_pixel in canvas.chunks_exact_mut(4) { | ||||
|         dst_pixel[0] = 0x00; | ||||
|         dst_pixel[1] = 0x00; | ||||
|         dst_pixel[2] = 0x00; | ||||
|         dst_pixel[3] = 0xFF; | ||||
|     } | ||||
|  | ||||
|     surface.attach(Some(&new_buffer), 0, 0); | ||||
|  | ||||
|     if surface.as_ref().version() >= 4 { | ||||
|         surface.damage_buffer(0, 0, buf_x as i32, buf_y as i32); | ||||
|     } else { | ||||
|         surface.damage(0, 0, buf_x as i32, buf_y as i32); | ||||
|     } | ||||
|  | ||||
|     surface.commit(); | ||||
|  | ||||
|     Ok(()) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user