mirror of
https://github.com/LGUG2Z/komorebi.git
synced 2026-04-25 10:08:33 +02:00
feat(subscriptions): add cmd to gen json schema
This commit introduces the 'notification-schema' command to generate a JSON schema of the Notification struct which gets sent when notifying subscribers of updates.
This commit is contained in:
43
Cargo.lock
generated
43
Cargo.lock
generated
@@ -229,6 +229,12 @@ dependencies = [
|
|||||||
"winapi 0.3.9",
|
"winapi 0.3.9",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "dyn-clone"
|
||||||
|
version = "1.0.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ee2626afccd7561a06cf1367e2950c4718ea04565e20fb5029b6c7d8ad09abcf"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "either"
|
name = "either"
|
||||||
version = "1.6.1"
|
version = "1.6.1"
|
||||||
@@ -462,6 +468,7 @@ dependencies = [
|
|||||||
"nanoid",
|
"nanoid",
|
||||||
"parking_lot",
|
"parking_lot",
|
||||||
"paste",
|
"paste",
|
||||||
|
"schemars",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"strum",
|
"strum",
|
||||||
@@ -482,6 +489,7 @@ version = "0.1.8"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
"color-eyre",
|
"color-eyre",
|
||||||
|
"schemars",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"serde_yaml",
|
"serde_yaml",
|
||||||
@@ -1029,6 +1037,30 @@ dependencies = [
|
|||||||
"winapi-util",
|
"winapi-util",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "schemars"
|
||||||
|
version = "0.8.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c6b5a3c80cea1ab61f4260238409510e814e38b4b563c06044edf91e7dc070e3"
|
||||||
|
dependencies = [
|
||||||
|
"dyn-clone",
|
||||||
|
"schemars_derive",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "schemars_derive"
|
||||||
|
version = "0.8.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "41ae4dce13e8614c46ac3c38ef1c0d668b101df6ac39817aebdaa26642ddae9b"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"serde_derive_internals",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "scopeguard"
|
name = "scopeguard"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
@@ -1055,6 +1087,17 @@ dependencies = [
|
|||||||
"syn",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_derive_internals"
|
||||||
|
version = "0.25.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_json"
|
name = "serde_json"
|
||||||
version = "1.0.78"
|
version = "1.0.78"
|
||||||
|
|||||||
@@ -544,3 +544,10 @@ in `komorebi-core`.
|
|||||||
An example of how to create a named pipe and a subscription to `komorebi`'s handled events in Python
|
An example of how to create a named pipe and a subscription to `komorebi`'s handled events in Python
|
||||||
by [@denBot](https://github.com/denBot) can be
|
by [@denBot](https://github.com/denBot) can be
|
||||||
found [here](https://gist.github.com/denBot/4136279812f87819f86d99eba77c1ee0).
|
found [here](https://gist.github.com/denBot/4136279812f87819f86d99eba77c1ee0).
|
||||||
|
|
||||||
|
### Subscription Event Notification Schema
|
||||||
|
|
||||||
|
A [JSON Schema](https://json-schema.org/) of the event notifications emitted to subscribers can be generated with
|
||||||
|
the `komorebic notification-schema` command. The output of this command can be redirected to the clipboard or a file,
|
||||||
|
which can be used with services such as [Quicktype](https://app.quicktype.io/) to generate type definitions in different
|
||||||
|
programming languages.
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ serde = { version = "1", features = ["derive"] }
|
|||||||
serde_json = "1"
|
serde_json = "1"
|
||||||
serde_yaml = "0.8"
|
serde_yaml = "0.8"
|
||||||
strum = { version = "0.23", features = ["derive"] }
|
strum = { version = "0.23", features = ["derive"] }
|
||||||
|
schemars = "0.8"
|
||||||
|
|
||||||
[dependencies.windows]
|
[dependencies.windows]
|
||||||
version = "0.30"
|
version = "0.30"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
use std::num::NonZeroUsize;
|
use std::num::NonZeroUsize;
|
||||||
|
|
||||||
use clap::ArgEnum;
|
use clap::ArgEnum;
|
||||||
|
use schemars::JsonSchema;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use strum::Display;
|
use strum::Display;
|
||||||
@@ -341,7 +342,7 @@ impl Arrangement for CustomLayout {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Display, EnumString, ArgEnum)]
|
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Display, EnumString, ArgEnum, JsonSchema)]
|
||||||
#[strum(serialize_all = "snake_case")]
|
#[strum(serialize_all = "snake_case")]
|
||||||
pub enum Axis {
|
pub enum Axis {
|
||||||
Horizontal,
|
Horizontal,
|
||||||
|
|||||||
@@ -7,12 +7,13 @@ use std::path::PathBuf;
|
|||||||
|
|
||||||
use color_eyre::eyre::anyhow;
|
use color_eyre::eyre::anyhow;
|
||||||
use color_eyre::Result;
|
use color_eyre::Result;
|
||||||
|
use schemars::JsonSchema;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
|
||||||
use crate::Rect;
|
use crate::Rect;
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
|
||||||
pub struct CustomLayout(Vec<Column>);
|
pub struct CustomLayout(Vec<Column>);
|
||||||
|
|
||||||
impl Deref for CustomLayout {
|
impl Deref for CustomLayout {
|
||||||
@@ -251,7 +252,7 @@ impl CustomLayout {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Copy, Debug, Serialize, Deserialize, JsonSchema)]
|
||||||
#[serde(tag = "column", content = "configuration")]
|
#[serde(tag = "column", content = "configuration")]
|
||||||
pub enum Column {
|
pub enum Column {
|
||||||
Primary(Option<ColumnWidth>),
|
Primary(Option<ColumnWidth>),
|
||||||
@@ -259,18 +260,18 @@ pub enum Column {
|
|||||||
Tertiary(ColumnSplit),
|
Tertiary(ColumnSplit),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Copy, Debug, Serialize, Deserialize, JsonSchema)]
|
||||||
pub enum ColumnWidth {
|
pub enum ColumnWidth {
|
||||||
WidthPercentage(usize),
|
WidthPercentage(usize),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Copy, Debug, Serialize, Deserialize, JsonSchema)]
|
||||||
pub enum ColumnSplit {
|
pub enum ColumnSplit {
|
||||||
Horizontal,
|
Horizontal,
|
||||||
Vertical,
|
Vertical,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Copy, Debug, Serialize, Deserialize, JsonSchema)]
|
||||||
pub enum ColumnSplitWithCapacity {
|
pub enum ColumnSplitWithCapacity {
|
||||||
Horizontal(usize),
|
Horizontal(usize),
|
||||||
Vertical(usize),
|
Vertical(usize),
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
use std::num::NonZeroUsize;
|
use std::num::NonZeroUsize;
|
||||||
|
|
||||||
use clap::ArgEnum;
|
use clap::ArgEnum;
|
||||||
|
use schemars::JsonSchema;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use strum::Display;
|
use strum::Display;
|
||||||
use strum::EnumString;
|
use strum::EnumString;
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Display, EnumString, ArgEnum)]
|
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Display, EnumString, ArgEnum, JsonSchema)]
|
||||||
#[strum(serialize_all = "snake_case")]
|
#[strum(serialize_all = "snake_case")]
|
||||||
pub enum CycleDirection {
|
pub enum CycleDirection {
|
||||||
Previous,
|
Previous,
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
use clap::ArgEnum;
|
use clap::ArgEnum;
|
||||||
|
use schemars::JsonSchema;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use strum::Display;
|
use strum::Display;
|
||||||
@@ -8,7 +9,7 @@ use crate::OperationDirection;
|
|||||||
use crate::Rect;
|
use crate::Rect;
|
||||||
use crate::Sizing;
|
use crate::Sizing;
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Display, EnumString, ArgEnum)]
|
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Display, EnumString, ArgEnum, JsonSchema)]
|
||||||
#[strum(serialize_all = "snake_case")]
|
#[strum(serialize_all = "snake_case")]
|
||||||
pub enum DefaultLayout {
|
pub enum DefaultLayout {
|
||||||
BSP,
|
BSP,
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
use schemars::JsonSchema;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
|
||||||
@@ -6,7 +7,7 @@ use crate::CustomLayout;
|
|||||||
use crate::DefaultLayout;
|
use crate::DefaultLayout;
|
||||||
use crate::Direction;
|
use crate::Direction;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
||||||
pub enum Layout {
|
pub enum Layout {
|
||||||
Default(DefaultLayout),
|
Default(DefaultLayout),
|
||||||
Custom(CustomLayout),
|
Custom(CustomLayout),
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ use std::str::FromStr;
|
|||||||
|
|
||||||
use clap::ArgEnum;
|
use clap::ArgEnum;
|
||||||
use color_eyre::Result;
|
use color_eyre::Result;
|
||||||
|
use schemars::JsonSchema;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use strum::Display;
|
use strum::Display;
|
||||||
@@ -30,7 +31,7 @@ pub mod layout;
|
|||||||
pub mod operation_direction;
|
pub mod operation_direction;
|
||||||
pub mod rect;
|
pub mod rect;
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, Display)]
|
#[derive(Clone, Debug, Serialize, Deserialize, Display, JsonSchema)]
|
||||||
#[serde(tag = "type", content = "content")]
|
#[serde(tag = "type", content = "content")]
|
||||||
pub enum SocketMessage {
|
pub enum SocketMessage {
|
||||||
// Window / Container Commands
|
// Window / Container Commands
|
||||||
@@ -103,6 +104,7 @@ pub enum SocketMessage {
|
|||||||
ToggleMouseFollowsFocus,
|
ToggleMouseFollowsFocus,
|
||||||
AddSubscriber(String),
|
AddSubscriber(String),
|
||||||
RemoveSubscriber(String),
|
RemoveSubscriber(String),
|
||||||
|
NotificationSchema,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SocketMessage {
|
impl SocketMessage {
|
||||||
@@ -119,7 +121,7 @@ impl FromStr for SocketMessage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, Display, EnumString, ArgEnum)]
|
#[derive(Clone, Debug, Serialize, Deserialize, Display, EnumString, ArgEnum, JsonSchema)]
|
||||||
#[strum(serialize_all = "snake_case")]
|
#[strum(serialize_all = "snake_case")]
|
||||||
pub enum StateQuery {
|
pub enum StateQuery {
|
||||||
FocusedMonitorIndex,
|
FocusedMonitorIndex,
|
||||||
@@ -128,7 +130,7 @@ pub enum StateQuery {
|
|||||||
FocusedWindowIndex,
|
FocusedWindowIndex,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, Display, EnumString, ArgEnum)]
|
#[derive(Clone, Debug, Serialize, Deserialize, Display, EnumString, ArgEnum, JsonSchema)]
|
||||||
#[strum(serialize_all = "snake_case")]
|
#[strum(serialize_all = "snake_case")]
|
||||||
pub enum ApplicationIdentifier {
|
pub enum ApplicationIdentifier {
|
||||||
Exe,
|
Exe,
|
||||||
@@ -136,28 +138,28 @@ pub enum ApplicationIdentifier {
|
|||||||
Title,
|
Title,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, Display, EnumString, ArgEnum)]
|
#[derive(Clone, Debug, Serialize, Deserialize, Display, EnumString, ArgEnum, JsonSchema)]
|
||||||
#[strum(serialize_all = "snake_case")]
|
#[strum(serialize_all = "snake_case")]
|
||||||
pub enum FocusFollowsMouseImplementation {
|
pub enum FocusFollowsMouseImplementation {
|
||||||
Komorebi,
|
Komorebi,
|
||||||
Windows,
|
Windows,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Display, EnumString, ArgEnum)]
|
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Display, EnumString, ArgEnum, JsonSchema)]
|
||||||
#[strum(serialize_all = "snake_case")]
|
#[strum(serialize_all = "snake_case")]
|
||||||
pub enum WindowContainerBehaviour {
|
pub enum WindowContainerBehaviour {
|
||||||
Create,
|
Create,
|
||||||
Append,
|
Append,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, Display, EnumString, ArgEnum)]
|
#[derive(Clone, Debug, Serialize, Deserialize, Display, EnumString, ArgEnum, JsonSchema)]
|
||||||
#[strum(serialize_all = "snake_case")]
|
#[strum(serialize_all = "snake_case")]
|
||||||
pub enum HidingBehaviour {
|
pub enum HidingBehaviour {
|
||||||
Hide,
|
Hide,
|
||||||
Minimize,
|
Minimize,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Display, EnumString, ArgEnum)]
|
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Display, EnumString, ArgEnum, JsonSchema)]
|
||||||
#[strum(serialize_all = "snake_case")]
|
#[strum(serialize_all = "snake_case")]
|
||||||
pub enum Sizing {
|
pub enum Sizing {
|
||||||
Increase,
|
Increase,
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
use std::num::NonZeroUsize;
|
use std::num::NonZeroUsize;
|
||||||
|
|
||||||
use clap::ArgEnum;
|
use clap::ArgEnum;
|
||||||
|
use schemars::JsonSchema;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use strum::Display;
|
use strum::Display;
|
||||||
@@ -9,7 +10,7 @@ use strum::EnumString;
|
|||||||
use crate::direction::Direction;
|
use crate::direction::Direction;
|
||||||
use crate::Axis;
|
use crate::Axis;
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Display, EnumString, ArgEnum)]
|
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Display, EnumString, ArgEnum, JsonSchema)]
|
||||||
#[strum(serialize_all = "snake_case")]
|
#[strum(serialize_all = "snake_case")]
|
||||||
pub enum OperationDirection {
|
pub enum OperationDirection {
|
||||||
Left,
|
Left,
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
|
use schemars::JsonSchema;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use windows::Win32::Foundation::RECT;
|
use windows::Win32::Foundation::RECT;
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Copy, Serialize, Deserialize, Eq, PartialEq)]
|
#[derive(Debug, Default, Clone, Copy, Serialize, Deserialize, Eq, PartialEq, JsonSchema)]
|
||||||
pub struct Rect {
|
pub struct Rect {
|
||||||
pub left: i32,
|
pub left: i32,
|
||||||
pub top: i32,
|
pub top: i32,
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ which = "4"
|
|||||||
winput = "0.2"
|
winput = "0.2"
|
||||||
miow = "0.4"
|
miow = "0.4"
|
||||||
winreg = "0.10"
|
winreg = "0.10"
|
||||||
|
schemars = "0.8"
|
||||||
|
|
||||||
[dependencies.windows]
|
[dependencies.windows]
|
||||||
version = "0.30"
|
version = "0.30"
|
||||||
|
|||||||
@@ -2,12 +2,13 @@ use std::collections::VecDeque;
|
|||||||
|
|
||||||
use getset::Getters;
|
use getset::Getters;
|
||||||
use nanoid::nanoid;
|
use nanoid::nanoid;
|
||||||
|
use schemars::JsonSchema;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
|
||||||
use crate::ring::Ring;
|
use crate::ring::Ring;
|
||||||
use crate::window::Window;
|
use crate::window::Window;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Getters)]
|
#[derive(Debug, Clone, Serialize, Getters, JsonSchema)]
|
||||||
pub struct Container {
|
pub struct Container {
|
||||||
#[serde(skip_serializing)]
|
#[serde(skip_serializing)]
|
||||||
#[getset(get = "pub")]
|
#[getset(get = "pub")]
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ use lazy_static::lazy_static;
|
|||||||
#[cfg(feature = "deadlock_detection")]
|
#[cfg(feature = "deadlock_detection")]
|
||||||
use parking_lot::deadlock;
|
use parking_lot::deadlock;
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
|
use schemars::JsonSchema;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use sysinfo::Process;
|
use sysinfo::Process;
|
||||||
use sysinfo::ProcessExt;
|
use sysinfo::ProcessExt;
|
||||||
@@ -267,14 +268,14 @@ pub fn current_virtual_desktop() -> Option<Vec<u8>> {
|
|||||||
current
|
current
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize, JsonSchema)]
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
pub enum NotificationEvent {
|
pub enum NotificationEvent {
|
||||||
WindowManager(WindowManagerEvent),
|
WindowManager(WindowManagerEvent),
|
||||||
Socket(SocketMessage),
|
Socket(SocketMessage),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize, JsonSchema)]
|
||||||
pub struct Notification {
|
pub struct Notification {
|
||||||
pub event: NotificationEvent,
|
pub event: NotificationEvent,
|
||||||
pub state: State,
|
pub state: State,
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ use getset::CopyGetters;
|
|||||||
use getset::Getters;
|
use getset::Getters;
|
||||||
use getset::MutGetters;
|
use getset::MutGetters;
|
||||||
use getset::Setters;
|
use getset::Setters;
|
||||||
|
use schemars::JsonSchema;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
|
||||||
use komorebi_core::Rect;
|
use komorebi_core::Rect;
|
||||||
@@ -15,7 +16,7 @@ use crate::container::Container;
|
|||||||
use crate::ring::Ring;
|
use crate::ring::Ring;
|
||||||
use crate::workspace::Workspace;
|
use crate::workspace::Workspace;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Getters, CopyGetters, MutGetters, Setters)]
|
#[derive(Debug, Clone, Serialize, Getters, CopyGetters, MutGetters, Setters, JsonSchema)]
|
||||||
pub struct Monitor {
|
pub struct Monitor {
|
||||||
#[getset(get_copy = "pub", set = "pub")]
|
#[getset(get_copy = "pub", set = "pub")]
|
||||||
id: isize,
|
id: isize,
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ use color_eyre::eyre::anyhow;
|
|||||||
use color_eyre::Result;
|
use color_eyre::Result;
|
||||||
use miow::pipe::connect;
|
use miow::pipe::connect;
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
|
use schemars::schema_for;
|
||||||
use uds_windows::UnixStream;
|
use uds_windows::UnixStream;
|
||||||
|
|
||||||
use komorebi_core::ApplicationIdentifier;
|
use komorebi_core::ApplicationIdentifier;
|
||||||
@@ -634,6 +635,16 @@ impl WindowManager {
|
|||||||
let mut hiding_behaviour = HIDING_BEHAVIOUR.lock();
|
let mut hiding_behaviour = HIDING_BEHAVIOUR.lock();
|
||||||
*hiding_behaviour = behaviour;
|
*hiding_behaviour = behaviour;
|
||||||
}
|
}
|
||||||
|
SocketMessage::NotificationSchema => {
|
||||||
|
let notification = schema_for!(Notification);
|
||||||
|
let schema = serde_json::to_string_pretty(¬ification)?;
|
||||||
|
let mut socket = HOME_DIR.clone();
|
||||||
|
socket.push("komorebic.sock");
|
||||||
|
let socket = socket.as_path();
|
||||||
|
|
||||||
|
let mut stream = UnixStream::connect(&socket)?;
|
||||||
|
stream.write_all(schema.as_bytes())?;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
tracing::info!("processed");
|
tracing::info!("processed");
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
|
|
||||||
|
use schemars::JsonSchema;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize)]
|
#[derive(Debug, Clone, Serialize, JsonSchema)]
|
||||||
pub struct Ring<T> {
|
pub struct Ring<T> {
|
||||||
elements: VecDeque<T>,
|
elements: VecDeque<T>,
|
||||||
focused: usize,
|
focused: usize,
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ use std::fmt::Formatter;
|
|||||||
|
|
||||||
use color_eyre::eyre::anyhow;
|
use color_eyre::eyre::anyhow;
|
||||||
use color_eyre::Result;
|
use color_eyre::Result;
|
||||||
|
use schemars::JsonSchema;
|
||||||
use serde::ser::Error;
|
use serde::ser::Error;
|
||||||
use serde::ser::SerializeStruct;
|
use serde::ser::SerializeStruct;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
@@ -25,7 +26,7 @@ use crate::LAYERED_EXE_WHITELIST;
|
|||||||
use crate::MANAGE_IDENTIFIERS;
|
use crate::MANAGE_IDENTIFIERS;
|
||||||
use crate::WSL2_UI_PROCESSES;
|
use crate::WSL2_UI_PROCESSES;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy, JsonSchema)]
|
||||||
pub struct Window {
|
pub struct Window {
|
||||||
pub(crate) hwnd: isize,
|
pub(crate) hwnd: isize,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ use crossbeam_channel::Receiver;
|
|||||||
use hotwatch::notify::DebouncedEvent;
|
use hotwatch::notify::DebouncedEvent;
|
||||||
use hotwatch::Hotwatch;
|
use hotwatch::Hotwatch;
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
|
use schemars::JsonSchema;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use uds_windows::UnixListener;
|
use uds_windows::UnixListener;
|
||||||
|
|
||||||
@@ -62,7 +63,7 @@ pub struct WindowManager {
|
|||||||
pub pending_move_op: Option<(usize, usize, usize)>,
|
pub pending_move_op: Option<(usize, usize, usize)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize, JsonSchema)]
|
||||||
pub struct State {
|
pub struct State {
|
||||||
pub monitors: Ring<Monitor>,
|
pub monitors: Ring<Monitor>,
|
||||||
pub is_paused: bool,
|
pub is_paused: bool,
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
use std::fmt::Display;
|
use std::fmt::Display;
|
||||||
use std::fmt::Formatter;
|
use std::fmt::Formatter;
|
||||||
|
|
||||||
|
use schemars::JsonSchema;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
|
||||||
use crate::window::Window;
|
use crate::window::Window;
|
||||||
use crate::winevent::WinEvent;
|
use crate::winevent::WinEvent;
|
||||||
use crate::OBJECT_NAME_CHANGE_ON_LAUNCH;
|
use crate::OBJECT_NAME_CHANGE_ON_LAUNCH;
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone, Serialize)]
|
#[derive(Debug, Copy, Clone, Serialize, JsonSchema)]
|
||||||
#[serde(tag = "type", content = "content")]
|
#[serde(tag = "type", content = "content")]
|
||||||
pub enum WindowManagerEvent {
|
pub enum WindowManagerEvent {
|
||||||
Destroy(WinEvent, Window),
|
Destroy(WinEvent, Window),
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
use schemars::JsonSchema;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use strum::Display;
|
use strum::Display;
|
||||||
use windows::Win32::UI::WindowsAndMessaging::EVENT_AIA_END;
|
use windows::Win32::UI::WindowsAndMessaging::EVENT_AIA_END;
|
||||||
@@ -85,7 +86,7 @@ use windows::Win32::UI::WindowsAndMessaging::EVENT_UIA_EVENTID_START;
|
|||||||
use windows::Win32::UI::WindowsAndMessaging::EVENT_UIA_PROPID_END;
|
use windows::Win32::UI::WindowsAndMessaging::EVENT_UIA_PROPID_END;
|
||||||
use windows::Win32::UI::WindowsAndMessaging::EVENT_UIA_PROPID_START;
|
use windows::Win32::UI::WindowsAndMessaging::EVENT_UIA_PROPID_START;
|
||||||
|
|
||||||
#[derive(Clone, Copy, PartialEq, Debug, Serialize, Display)]
|
#[derive(Clone, Copy, PartialEq, Debug, Serialize, Display, JsonSchema)]
|
||||||
#[repr(u32)]
|
#[repr(u32)]
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
pub enum WinEvent {
|
pub enum WinEvent {
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ use getset::CopyGetters;
|
|||||||
use getset::Getters;
|
use getset::Getters;
|
||||||
use getset::MutGetters;
|
use getset::MutGetters;
|
||||||
use getset::Setters;
|
use getset::Setters;
|
||||||
|
use schemars::JsonSchema;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
|
||||||
use komorebi_core::Axis;
|
use komorebi_core::Axis;
|
||||||
@@ -21,7 +22,7 @@ use crate::ring::Ring;
|
|||||||
use crate::window::Window;
|
use crate::window::Window;
|
||||||
use crate::windows_api::WindowsApi;
|
use crate::windows_api::WindowsApi;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Getters, CopyGetters, MutGetters, Setters)]
|
#[derive(Debug, Clone, Serialize, Getters, CopyGetters, MutGetters, Setters, JsonSchema)]
|
||||||
pub struct Workspace {
|
pub struct Workspace {
|
||||||
#[getset(set = "pub")]
|
#[getset(set = "pub")]
|
||||||
name: Option<String>,
|
name: Option<String>,
|
||||||
|
|||||||
@@ -278,4 +278,8 @@ ToggleMouseFollowsFocus() {
|
|||||||
|
|
||||||
AhkLibrary() {
|
AhkLibrary() {
|
||||||
Run, komorebic.exe ahk-library, , Hide
|
Run, komorebic.exe ahk-library, , Hide
|
||||||
|
}
|
||||||
|
|
||||||
|
NotificationSchema() {
|
||||||
|
Run, komorebic.exe notification-schema, , Hide
|
||||||
}
|
}
|
||||||
@@ -574,6 +574,8 @@ enum SubCommand {
|
|||||||
ToggleMouseFollowsFocus,
|
ToggleMouseFollowsFocus,
|
||||||
/// Generate a library of AutoHotKey helper functions
|
/// Generate a library of AutoHotKey helper functions
|
||||||
AhkLibrary,
|
AhkLibrary,
|
||||||
|
/// Generate a JSON Schema of subscription notifications
|
||||||
|
NotificationSchema,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn send_message(bytes: &[u8]) -> Result<()> {
|
pub fn send_message(bytes: &[u8]) -> Result<()> {
|
||||||
@@ -1016,6 +1018,40 @@ fn main() -> Result<()> {
|
|||||||
SubCommand::WindowHidingBehaviour(arg) => {
|
SubCommand::WindowHidingBehaviour(arg) => {
|
||||||
send_message(&*SocketMessage::WindowHidingBehaviour(arg.hiding_behaviour).as_bytes()?)?;
|
send_message(&*SocketMessage::WindowHidingBehaviour(arg.hiding_behaviour).as_bytes()?)?;
|
||||||
}
|
}
|
||||||
|
SubCommand::NotificationSchema => {
|
||||||
|
let home = HOME_DIR.clone();
|
||||||
|
let mut socket = home;
|
||||||
|
socket.push("komorebic.sock");
|
||||||
|
let socket = socket.as_path();
|
||||||
|
|
||||||
|
match std::fs::remove_file(&socket) {
|
||||||
|
Ok(_) => {}
|
||||||
|
Err(error) => match error.kind() {
|
||||||
|
// Doing this because ::exists() doesn't work reliably on Windows via IntelliJ
|
||||||
|
ErrorKind::NotFound => {}
|
||||||
|
_ => {
|
||||||
|
return Err(error.into());
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
send_message(&*SocketMessage::NotificationSchema.as_bytes()?)?;
|
||||||
|
|
||||||
|
let listener = UnixListener::bind(&socket)?;
|
||||||
|
match listener.accept() {
|
||||||
|
Ok(incoming) => {
|
||||||
|
let stream = BufReader::new(incoming.0);
|
||||||
|
for line in stream.lines() {
|
||||||
|
println!("{}", line?);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
Err(error) => {
|
||||||
|
panic!("{}", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
Reference in New Issue
Block a user