diff --git a/Cargo.lock b/Cargo.lock index 9e790e33..ec0be875 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -792,7 +792,6 @@ name = "jay-config" version = "1.10.0" dependencies = [ "backtrace", - "bincode", "bstr", "error_reporter", "futures-util", diff --git a/jay-config/Cargo.toml b/jay-config/Cargo.toml index ce616ea3..ace197e9 100644 --- a/jay-config/Cargo.toml +++ b/jay-config/Cargo.toml @@ -7,7 +7,6 @@ description = "Configuration crate for the Jay compositor" repository = "https://github.com/mahkoh/jay" [dependencies] -bincode = "1.3.3" serde = { version = "1.0.196", features = ["derive"] } log = "0.4.14" futures-util = { version = "0.3.30", features = ["io"] } diff --git a/jay-config/src/_private.rs b/jay-config/src/_private.rs index 2444e83c..20ddec34 100644 --- a/jay-config/src/_private.rs +++ b/jay-config/src/_private.rs @@ -1,124 +1,15 @@ pub mod client; -pub mod messages; mod logging; -use { - crate::{ - Workspace, - client::ClientMatcher, - input::Seat, - video::Mode, - window::{ContentType, WindowMatcher, WindowType}, - }, - bincode::Options, - serde::{Deserialize, Serialize}, +pub use crate::protocol::{ + ClientCriterionPayload, ClientCriterionStringField, ConfigEntry, ConfigHandler, + DEFAULT_SEAT_NAME, GenericCriterionPayload, PollableId, ServerHandler, Unref, VERSION, + WindowCriterionPayload, WindowCriterionStringField, WireMode, }; -pub const VERSION: u32 = 1; - -pub type ServerHandler = unsafe fn(data: *const u8, msg: &messages::ClientMessage<'_>); -pub type ConfigHandler = unsafe fn(data: *const u8, msg: &messages::ServerMessage); -pub type Unref = unsafe fn(data: *const u8); - -pub struct ConfigEntry { - pub version: u32, - pub init: unsafe fn( - srv_data: *const u8, - srv_unref: Unref, - srv_handler: ServerHandler, - msg: messages::InitMessage, - ) -> *const u8, - pub unref: Unref, - pub handle_msg: ConfigHandler, -} - -pub fn bincode_ops() -> impl Options { - bincode::DefaultOptions::new() - .with_fixint_encoding() - .with_little_endian() - .with_no_limit() -} - -#[derive(Serialize, Deserialize, Clone, Debug)] -pub struct WireMode { - pub width: i32, - pub height: i32, - pub refresh_millihz: u32, -} - -impl WireMode { - pub fn to_mode(self) -> Mode { - Mode { - width: self.width, - height: self.height, - refresh_millihz: self.refresh_millihz, - } - } -} - -#[derive(Serialize, Deserialize, Debug, Copy, Clone, Eq, PartialEq, Hash)] -pub struct PollableId(pub u64); - -pub const DEFAULT_SEAT_NAME: &str = "default"; - -#[derive(Serialize, Deserialize, Clone, Debug, Hash, Eq, PartialEq)] -pub enum GenericCriterionPayload { - Matcher(T), - Not(T), - List { list: Vec, all: bool }, - Exactly { list: Vec, num: usize }, -} - -#[derive(Serialize, Deserialize, Clone, Debug, Hash, Eq, PartialEq)] -pub enum ClientCriterionPayload { - Generic(GenericCriterionPayload), - String { - string: String, - field: ClientCriterionStringField, - regex: bool, - }, - Sandboxed, - Uid(i32), - Pid(i32), - IsXwayland, -} - -#[derive(Serialize, Deserialize, Clone, Debug, Hash, Eq, PartialEq)] -pub enum ClientCriterionStringField { - SandboxEngine, - SandboxAppId, - SandboxInstanceId, - Comm, - Exe, -} - -#[derive(Serialize, Deserialize, Clone, Debug, Hash, Eq, PartialEq)] -pub enum WindowCriterionPayload { - Generic(GenericCriterionPayload), - String { - string: String, - field: WindowCriterionStringField, - regex: bool, - }, - Types(WindowType), - Client(ClientMatcher), - Floating, - Visible, - Urgent, - SeatFocus(Seat), - Fullscreen, - JustMapped, - Workspace(Workspace), - ContentTypes(ContentType), -} - -#[derive(Serialize, Deserialize, Clone, Debug, Hash, Eq, PartialEq)] -pub enum WindowCriterionStringField { - Title, - AppId, - Tag, - XClass, - XInstance, - XRole, - Workspace, +pub mod messages { + pub use crate::protocol::{ + ClientMessage, InitMessage, Response, ServerFeature, ServerMessage, V1InitMessage, + WorkspaceSource, + }; } diff --git a/jay-config/src/_private/client.rs b/jay-config/src/_private/client.rs index 5449264a..c28f1597 100644 --- a/jay-config/src/_private/client.rs +++ b/jay-config/src/_private/client.rs @@ -3,11 +3,7 @@ use { crate::{ _private::{ - ClientCriterionPayload, ClientCriterionStringField, GenericCriterionPayload, PollableId, - ServerHandler, Unref, WindowCriterionPayload, WindowCriterionStringField, WireMode, - messages::{ - ClientMessage, InitMessage, Response, ServerFeature, ServerMessage, WorkspaceSource, - }, + ServerHandler, Unref, }, Axis, Direction, ModifiedKeySym, PciId, Workspace, client::{Client, ClientCriterion, ClientMatcher, MatchedClient}, @@ -23,6 +19,12 @@ use { syms::KeySym, }, logging::LogLevel, + protocol::{ + ClientCriterionPayload, ClientCriterionStringField, ClientMessage, + GenericCriterionPayload, InitMessage, PollableId, Response, ServerFeature, + ServerMessage, WindowCriterionPayload, WindowCriterionStringField, WireMode, + WorkspaceSource, + }, tasks::{JoinHandle, JoinSlot}, theme::{BarPosition, Color, colors::Colorable, sized::Resizable}, timer::Timer, diff --git a/jay-config/src/input.rs b/jay-config/src/input.rs index 384b769d..36f4bfa6 100644 --- a/jay-config/src/input.rs +++ b/jay-config/src/input.rs @@ -6,10 +6,10 @@ pub mod clickmethod; use { crate::{ - _private::{DEFAULT_SEAT_NAME, messages::WorkspaceSource}, Axis, Direction, ModifiedKeySym, Workspace, input::{acceleration::AccelProfile, capability::Capability, clickmethod::ClickMethod}, keyboard::{Keymap, mods::Modifiers, syms::KeySym}, + protocol::{DEFAULT_SEAT_NAME, WorkspaceSource}, video::Connector, window::Window, }, diff --git a/jay-config/src/io.rs b/jay-config/src/io.rs index 6eece9ad..936af495 100644 --- a/jay-config/src/io.rs +++ b/jay-config/src/io.rs @@ -1,7 +1,7 @@ //! Tools for IO operations. use { - crate::_private::PollableId, + crate::protocol::PollableId, futures_util::{AsyncWrite, io::AsyncRead}, std::{ future::poll_fn, diff --git a/jay-config/src/lib.rs b/jay-config/src/lib.rs index 608f128d..c7e585bf 100644 --- a/jay-config/src/lib.rs +++ b/jay-config/src/lib.rs @@ -17,7 +17,7 @@ use crate::input::Seat; use { crate::{ - _private::messages::WorkspaceSource, keyboard::ModifiedKeySym, video::Connector, window::Window, + keyboard::ModifiedKeySym, protocol::WorkspaceSource, video::Connector, window::Window, }, serde::{Deserialize, Serialize}, std::{ @@ -37,6 +37,7 @@ pub mod input; pub mod io; pub mod keyboard; pub mod logging; +pub mod protocol; pub mod status; pub mod tasks; pub mod theme; diff --git a/jay-config/src/_private/messages.rs b/jay-config/src/protocol.rs similarity index 88% rename from jay-config/src/_private/messages.rs rename to jay-config/src/protocol.rs index 6d68ba1e..89bb5556 100644 --- a/jay-config/src/_private/messages.rs +++ b/jay-config/src/protocol.rs @@ -1,6 +1,5 @@ use { crate::{ - _private::{ClientCriterionPayload, PollableId, WindowCriterionPayload, WireMode}, Axis, Direction, PciId, Workspace, client::{Client, ClientMatcher}, input::{ @@ -13,7 +12,7 @@ use { theme::{BarPosition, Color, colors::Colorable, sized::Resizable}, timer::Timer, video::{ - BlendSpace, ColorSpace, Connector, DrmDevice, Eotf, Format, GfxApi, TearingMode, + BlendSpace, ColorSpace, Connector, DrmDevice, Eotf, Format, GfxApi, Mode, TearingMode, Transform, VrrMode, connector_type::ConnectorType, }, window::{ContentType, TileState, Window, WindowMatcher, WindowType}, @@ -24,6 +23,132 @@ use { std::time::{Duration, SystemTime}, }; +pub const VERSION: u32 = 1; + +pub type ServerHandler = unsafe fn(data: *const u8, msg: &ClientMessage<'_>); +pub type ConfigHandler = unsafe fn(data: *const u8, msg: &ServerMessage); +pub type Unref = unsafe fn(data: *const u8); + +pub struct ConfigEntry { + pub version: u32, + pub init: unsafe fn( + srv_data: *const u8, + srv_unref: Unref, + srv_handler: ServerHandler, + msg: InitMessage, + ) -> *const u8, + pub unref: Unref, + pub handle_msg: ConfigHandler, +} + +pub unsafe fn init_client( + srv_data: *const u8, + srv_unref: Unref, + srv_handler: ServerHandler, + msg: InitMessage, + configure: fn(), +) -> *const u8 { + unsafe { + crate::_private::client::init(srv_data, srv_unref, srv_handler, msg, configure) + } +} + +pub unsafe fn unref_client(data: *const u8) { + unsafe { + crate::_private::client::unref(data); + } +} + +pub unsafe fn handle_client_message(data: *const u8, msg: &ServerMessage) { + unsafe { + crate::_private::client::handle_msg(data, msg); + } +} + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct WireMode { + pub width: i32, + pub height: i32, + pub refresh_millihz: u32, +} + +impl WireMode { + pub fn to_mode(self) -> Mode { + Mode { + width: self.width, + height: self.height, + refresh_millihz: self.refresh_millihz, + } + } +} + +#[derive(Serialize, Deserialize, Debug, Copy, Clone, Eq, PartialEq, Hash)] +pub struct PollableId(pub u64); + +pub const DEFAULT_SEAT_NAME: &str = "default"; + +#[derive(Serialize, Deserialize, Clone, Debug, Hash, Eq, PartialEq)] +pub enum GenericCriterionPayload { + Matcher(T), + Not(T), + List { list: Vec, all: bool }, + Exactly { list: Vec, num: usize }, +} + +#[derive(Serialize, Deserialize, Clone, Debug, Hash, Eq, PartialEq)] +pub enum ClientCriterionPayload { + Generic(GenericCriterionPayload), + String { + string: String, + field: ClientCriterionStringField, + regex: bool, + }, + Sandboxed, + Uid(i32), + Pid(i32), + IsXwayland, +} + +#[derive(Serialize, Deserialize, Clone, Debug, Hash, Eq, PartialEq)] +pub enum ClientCriterionStringField { + SandboxEngine, + SandboxAppId, + SandboxInstanceId, + Comm, + Exe, +} + +#[derive(Serialize, Deserialize, Clone, Debug, Hash, Eq, PartialEq)] +pub enum WindowCriterionPayload { + Generic(GenericCriterionPayload), + String { + string: String, + field: WindowCriterionStringField, + regex: bool, + }, + Types(WindowType), + Client(ClientMatcher), + Floating, + Visible, + Urgent, + SeatFocus(Seat), + Fullscreen, + JustMapped, + Workspace(Workspace), + ContentTypes(ContentType), +} + +#[derive(Serialize, Deserialize, Clone, Debug, Hash, Eq, PartialEq)] +pub enum WindowCriterionStringField { + Title, + AppId, + Tag, + XClass, + XInstance, + XRole, + Workspace, +} + #[derive(Serialize, Deserialize, Copy, Clone, Debug, Eq, PartialEq)] #[serde(transparent)] pub struct ServerFeature(u16); diff --git a/jay-config/src/video.rs b/jay-config/src/video.rs index ff0680eb..5ba15d98 100644 --- a/jay-config/src/video.rs +++ b/jay-config/src/video.rs @@ -2,8 +2,8 @@ use { crate::{ - _private::WireMode, Direction, PciId, Workspace, + protocol::WireMode, video::connector_type::{ CON_9PIN_DIN, CON_COMPONENT, CON_COMPOSITE, CON_DISPLAY_PORT, CON_DPI, CON_DSI, CON_DVIA, CON_DVID, CON_DVII, CON_EDP, CON_EMBEDDED_WINDOW, CON_HDMIA, CON_HDMIB, diff --git a/src/compositor.rs b/src/compositor.rs index ae030f6e..783ca284 100644 --- a/src/compositor.rs +++ b/src/compositor.rs @@ -84,7 +84,7 @@ use { }, ahash::AHashSet, forker::ForkerProxy, - jay_config::_private::DEFAULT_SEAT_NAME, + jay_config::protocol::DEFAULT_SEAT_NAME, std::{ cell::{Cell, RefCell}, env, diff --git a/src/config.rs b/src/config.rs index 0c20aa36..6994a92d 100644 --- a/src/config.rs +++ b/src/config.rs @@ -16,9 +16,9 @@ use { }, }, jay_config::{ - _private::{ - ConfigEntry, VERSION, - messages::{InitMessage, ServerFeature, ServerMessage, V1InitMessage}, + protocol::{ + ClientMessage, ConfigEntry, InitMessage, ServerFeature, ServerHandler, ServerMessage, + Unref, V1InitMessage, VERSION, handle_client_message, init_client, unref_client, }, input::{InputDevice, Seat, SwitchEvent}, keyboard::{mods::Modifiers, syms::KeySym}, @@ -168,15 +168,15 @@ impl Drop for ConfigProxy { unsafe fn default_client_init( srv_data: *const u8, - srv_unref: jay_config::_private::Unref, - srv_handler: jay_config::_private::ServerHandler, + srv_unref: Unref, + srv_handler: ServerHandler, msg: InitMessage, ) -> *const u8 { fn configure() { jay_toml_config::configure(); } unsafe { - jay_config::_private::client::init(srv_data, srv_unref, srv_handler, msg, configure) + init_client(srv_data, srv_unref, srv_handler, msg, configure) } } @@ -241,8 +241,8 @@ impl ConfigProxy { let entry = ConfigEntry { version: VERSION, init: default_client_init, - unref: jay_config::_private::client::unref, - handle_msg: jay_config::_private::client::handle_msg, + unref: unref_client, + handle_msg: handle_client_message, }; Self::new(&entry, state) } @@ -260,7 +260,7 @@ unsafe fn unref(data: *const u8) { } } -unsafe fn handle_msg(data: *const u8, msg: &jay_config::_private::messages::ClientMessage<'_>) { +unsafe fn handle_msg(data: *const u8, msg: &ClientMessage<'_>) { unsafe { let server = (data as *const ConfigProxyHandler).deref(); if server.dropped.get() { diff --git a/src/config/handler.rs b/src/config/handler.rs index bf4ad0d7..ce90989f 100644 --- a/src/config/handler.rs +++ b/src/config/handler.rs @@ -41,10 +41,10 @@ use { }, }, jay_config::{ - _private::{ - ClientCriterionPayload, ClientCriterionStringField, GenericCriterionPayload, PollableId, - ConfigHandler, Unref, WindowCriterionPayload, WindowCriterionStringField, WireMode, - messages::{ClientMessage, Response, ServerMessage, WorkspaceSource}, + protocol::{ + ClientCriterionPayload, ClientCriterionStringField, ClientMessage, ConfigHandler, + GenericCriterionPayload, PollableId, Response, ServerMessage, Unref, + WindowCriterionPayload, WindowCriterionStringField, WireMode, WorkspaceSource, }, Axis, Direction, Workspace, client::{Client as ConfigClient, ClientMatcher}, diff --git a/src/forker.rs b/src/forker.rs index 9938a1d1..93e50115 100644 --- a/src/forker.rs +++ b/src/forker.rs @@ -22,7 +22,6 @@ use { }, ahash::AHashMap, bincode::Options, - jay_config::_private::bincode_ops, log::Level, serde::{Deserialize, Serialize}, std::{ @@ -38,6 +37,13 @@ use { uapi::{Errno, Fd, IntoUstr, OwnedFd, UstrPtr, c}, }; +pub fn bincode_ops() -> impl Options { + bincode::DefaultOptions::new() + .with_fixint_encoding() + .with_little_endian() + .with_no_limit() +} + pub struct ForkerProxy { pidfd: Rc, socket: Rc, diff --git a/src/forker/io.rs b/src/forker/io.rs index 6018b19a..6f735070 100644 --- a/src/forker/io.rs +++ b/src/forker/io.rs @@ -6,7 +6,7 @@ use { use { crate::{ - forker::ForkerError, + forker::{ForkerError, bincode_ops}, io_uring::IoUring, utils::{ buf::DynamicBuf, @@ -14,7 +14,6 @@ use { vec_ext::VecExt, }, }, - jay_config::_private::bincode_ops, uapi::OwnedFd, }; diff --git a/src/it/test_config.rs b/src/it/test_config.rs index 1d7daf1d..267e7833 100644 --- a/src/it/test_config.rs +++ b/src/it/test_config.rs @@ -8,9 +8,9 @@ use { }, isnt::std_1::primitive::IsntConstPtrExt, jay_config::{ - _private::{ - ConfigEntry, VERSION, - messages::{ClientMessage, Response, ServerMessage}, + protocol::{ + ClientMessage, ConfigEntry, InitMessage, Response, ServerHandler, ServerMessage, Unref, + VERSION, }, Axis, Direction, input::{InputDevice, Seat}, @@ -54,9 +54,9 @@ where unsafe fn init( srv_data: *const u8, - srv_unref: jay_config::_private::Unref, - srv_handler: jay_config::_private::ServerHandler, - _msg: jay_config::_private::messages::InitMessage, + srv_unref: Unref, + srv_handler: ServerHandler, + _msg: InitMessage, ) -> *const u8 { let tc = CONFIG.get(); assert!(tc.is_not_null()); @@ -128,8 +128,8 @@ unsafe fn handle_msg(data: *const u8, msg: &ServerMessage) { #[derive(Copy, Clone)] struct ServerData { srv_data: *const u8, - srv_unref: jay_config::_private::Unref, - srv_handler: jay_config::_private::ServerHandler, + srv_unref: Unref, + srv_handler: ServerHandler, } pub struct TestConfig { diff --git a/src/tasks/input_device.rs b/src/tasks/input_device.rs index 55afc5f9..64d34003 100644 --- a/src/tasks/input_device.rs +++ b/src/tasks/input_device.rs @@ -6,7 +6,7 @@ use { tasks::udev_utils::{UdevProps, udev_props}, utils::{asyncevent::AsyncEvent, event_listener::EventListener}, }, - jay_config::_private::DEFAULT_SEAT_NAME, + jay_config::protocol::DEFAULT_SEAT_NAME, std::{ cell::Cell, rc::{Rc, Weak},