config: expose runtime protocol
This commit is contained in:
parent
bcc85c8b1b
commit
e3f122e903
16 changed files with 179 additions and 157 deletions
|
|
@ -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<T> {
|
||||
Matcher(T),
|
||||
Not(T),
|
||||
List { list: Vec<T>, all: bool },
|
||||
Exactly { list: Vec<T>, num: usize },
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Clone, Debug, Hash, Eq, PartialEq)]
|
||||
pub enum ClientCriterionPayload {
|
||||
Generic(GenericCriterionPayload<ClientMatcher>),
|
||||
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<WindowMatcher>),
|
||||
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,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
},
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
//! Tools for IO operations.
|
||||
|
||||
use {
|
||||
crate::_private::PollableId,
|
||||
crate::protocol::PollableId,
|
||||
futures_util::{AsyncWrite, io::AsyncRead},
|
||||
std::{
|
||||
future::poll_fn,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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<T> {
|
||||
Matcher(T),
|
||||
Not(T),
|
||||
List { list: Vec<T>, all: bool },
|
||||
Exactly { list: Vec<T>, num: usize },
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Clone, Debug, Hash, Eq, PartialEq)]
|
||||
pub enum ClientCriterionPayload {
|
||||
Generic(GenericCriterionPayload<ClientMatcher>),
|
||||
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<WindowMatcher>),
|
||||
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);
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue