diff --git a/packages/client-api/src/providers/create-provider.ts b/packages/client-api/src/providers/create-provider.ts index 4dbfda82..69b71ff4 100644 --- a/packages/client-api/src/providers/create-provider.ts +++ b/packages/client-api/src/providers/create-provider.ts @@ -6,6 +6,7 @@ import { createDateProvider } from './date/create-date-provider'; import { createGlazewmProvider } from './glazewm/create-glazewm-provider'; import { createHostProvider } from './host/create-host-provider'; import { createIpProvider } from './ip/create-ip-provider'; +import { createKomorebiProvider } from './komorebi/create-komorebi-provider'; import { createMemoryProvider } from './memory/create-memory-provider'; import { createMonitorsProvider } from './monitors/create-monitors-provider'; import { createNetworkProvider } from './network/create-network-provider'; @@ -36,6 +37,8 @@ export async function createProvider( return createHostProvider(config, owner); case ProviderType.IP: return createIpProvider(config, owner); + case ProviderType.KOMOREBI: + return createKomorebiProvider(config, owner); case ProviderType.MEMORY: return createMemoryProvider(config, owner); case ProviderType.MONITORS: diff --git a/packages/client-api/src/providers/komorebi/create-komorebi-provider.ts b/packages/client-api/src/providers/komorebi/create-komorebi-provider.ts new file mode 100644 index 00000000..16fa5723 --- /dev/null +++ b/packages/client-api/src/providers/komorebi/create-komorebi-provider.ts @@ -0,0 +1,24 @@ +import type { Owner } from 'solid-js'; + +import type { KomorebiProviderConfig } from '~/user-config'; +import { createProviderListener } from '../create-provider-listener'; + +export interface KomorebiVariables { + frequency: number; +} + +export async function createKomorebiProvider( + config: KomorebiProviderConfig, + owner: Owner, +) { + const komorebiVariables = await createProviderListener< + KomorebiProviderConfig, + KomorebiVariables + >(config, owner); + + return { + get frequency() { + return komorebiVariables().frequency; + }, + }; +} diff --git a/packages/client-api/src/user-config/window/provider-config.model.ts b/packages/client-api/src/user-config/window/provider-config.model.ts index e365d546..3cb4dfff 100644 --- a/packages/client-api/src/user-config/window/provider-config.model.ts +++ b/packages/client-api/src/user-config/window/provider-config.model.ts @@ -8,6 +8,7 @@ import { GlazewmProviderConfigSchema, HostProviderConfigSchema, IpProviderConfigSchema, + KomorebiProviderConfigSchema, MemoryProviderConfigSchema, MonitorsProviderConfigSchema, NetworkProviderConfigSchema, @@ -22,6 +23,7 @@ export const ProviderConfigSchema = z.union([ GlazewmProviderConfigSchema, HostProviderConfigSchema, IpProviderConfigSchema, + KomorebiProviderConfigSchema, MemoryProviderConfigSchema, MonitorsProviderConfigSchema, NetworkProviderConfigSchema, diff --git a/packages/client-api/src/user-config/window/provider-type.model.ts b/packages/client-api/src/user-config/window/provider-type.model.ts index a34377ef..95a27b3f 100644 --- a/packages/client-api/src/user-config/window/provider-type.model.ts +++ b/packages/client-api/src/user-config/window/provider-type.model.ts @@ -7,6 +7,7 @@ export enum ProviderType { GLAZEWM = 'glazewm', HOST = 'host', IP = 'ip', + KOMOREBI = 'komorebi', MEMORY = 'memory', MONITORS = 'monitors', NETWORK = 'network', diff --git a/packages/client-api/src/user-config/window/providers/index.ts b/packages/client-api/src/user-config/window/providers/index.ts index 2005e50e..f78cdd11 100644 --- a/packages/client-api/src/user-config/window/providers/index.ts +++ b/packages/client-api/src/user-config/window/providers/index.ts @@ -4,6 +4,7 @@ export * from './date-provider-config.model'; export * from './glazewm-provider-config.model'; export * from './host-provider-config.model'; export * from './ip-provider-config.model'; +export * from './komorebi-provider-config.model'; export * from './memory-provider-config.model'; export * from './monitors-provider-config.model'; export * from './network-provider-config.model'; diff --git a/packages/client-api/src/user-config/window/providers/komorebi-provider-config.model.ts b/packages/client-api/src/user-config/window/providers/komorebi-provider-config.model.ts new file mode 100644 index 00000000..451562af --- /dev/null +++ b/packages/client-api/src/user-config/window/providers/komorebi-provider-config.model.ts @@ -0,0 +1,11 @@ +import { z } from 'zod'; + +import { ProviderType } from '../provider-type.model'; + +export const KomorebiProviderConfigSchema = z.object({ + type: z.literal(ProviderType.KOMOREBI), +}); + +export type KomorebiProviderConfig = z.infer< + typeof KomorebiProviderConfigSchema +>; diff --git a/packages/desktop/Cargo.toml b/packages/desktop/Cargo.toml index 56f1e769..39db830b 100644 --- a/packages/desktop/Cargo.toml +++ b/packages/desktop/Cargo.toml @@ -30,6 +30,9 @@ tokio = { version = "1.33.0", features = ["full"] } tracing = "0.1.40" tracing-subscriber = "0.3.17" +[target.'cfg(target_os = "windows")'.dependencies] +komorebi-client = { git = "https://github.com/LGUG2Z/komorebi", rev = "8febaac9ff96de1cb22816defcc4b9ffbd644fc8"} + [target.'cfg(target_os = "macos")'.dependencies] cocoa = "0.25.0" diff --git a/packages/desktop/src/providers/config.rs b/packages/desktop/src/providers/config.rs index 3ce71070..bddb97aa 100644 --- a/packages/desktop/src/providers/config.rs +++ b/packages/desktop/src/providers/config.rs @@ -3,8 +3,8 @@ use serde::Deserialize; use super::{ battery::BatteryProviderConfig, cpu::CpuProviderConfig, host::HostProviderConfig, ip::IpProviderConfig, - memory::MemoryProviderConfig, network::NetworkProviderConfig, - weather::WeatherProviderConfig, + komorebi::KomorebiProviderConfig, memory::MemoryProviderConfig, + network::NetworkProviderConfig, weather::WeatherProviderConfig, }; #[derive(Deserialize, Debug)] @@ -14,6 +14,7 @@ pub enum ProviderConfig { Cpu(CpuProviderConfig), Host(HostProviderConfig), Ip(IpProviderConfig), + Komorebi(KomorebiProviderConfig), Memory(MemoryProviderConfig), Network(NetworkProviderConfig), Weather(WeatherProviderConfig), diff --git a/packages/desktop/src/providers/komorebi/config.rs b/packages/desktop/src/providers/komorebi/config.rs new file mode 100644 index 00000000..acdf8e83 --- /dev/null +++ b/packages/desktop/src/providers/komorebi/config.rs @@ -0,0 +1,5 @@ +use serde::Deserialize; + +#[derive(Deserialize, Debug)] +#[serde(tag = "type", rename = "komorebi")] +pub struct KomorebiProviderConfig {} diff --git a/packages/desktop/src/providers/komorebi/mod.rs b/packages/desktop/src/providers/komorebi/mod.rs new file mode 100644 index 00000000..8434e838 --- /dev/null +++ b/packages/desktop/src/providers/komorebi/mod.rs @@ -0,0 +1,7 @@ +mod config; +mod provider; +mod variables; + +pub use config::*; +pub use provider::*; +pub use variables::*; diff --git a/packages/desktop/src/providers/komorebi/provider.rs b/packages/desktop/src/providers/komorebi/provider.rs new file mode 100644 index 00000000..16ead580 --- /dev/null +++ b/packages/desktop/src/providers/komorebi/provider.rs @@ -0,0 +1,55 @@ +use std::sync::Arc; + +use anyhow::Result; +use async_trait::async_trait; +use tokio::{sync::mpsc::Sender, sync::Mutex, task::AbortHandle}; + +use crate::providers::{ + manager::ProviderOutput, provider::Provider, + variables::ProviderVariables, +}; + +use super::{KomorebiProviderConfig, KomorebiVariables}; + +pub struct KomorebiProvider { + pub config: Arc, + abort_handle: Option, + // sysinfo: Arc>, +} + +impl KomorebiProvider { + pub fn new( + config: KomorebiProviderConfig, + // sysinfo: Arc>, + ) -> KomorebiProvider { + KomorebiProvider { + config: Arc::new(config), + abort_handle: None, + // sysinfo, + } + } +} + +#[async_trait] +impl Provider for KomorebiProvider { + async fn on_start( + &mut self, + config_hash: String, + emit_output_tx: Sender, + ) { + // Ok(ProviderVariables::Komorebi(KomorebiVariables { + // workspaces: 0, + // })) + } + async fn on_refresh( + &mut self, + config_hash: String, + emit_output_tx: Sender, + ) { + // + } + + async fn on_stop(&mut self) { + // + } +} diff --git a/packages/desktop/src/providers/komorebi/variables.rs b/packages/desktop/src/providers/komorebi/variables.rs new file mode 100644 index 00000000..95d9a444 --- /dev/null +++ b/packages/desktop/src/providers/komorebi/variables.rs @@ -0,0 +1,7 @@ +use serde::Serialize; + +#[derive(Serialize, Debug, Clone)] +#[serde(rename_all = "camelCase")] +pub struct KomorebiVariables { + pub workspaces: u64, +} diff --git a/packages/desktop/src/providers/manager.rs b/packages/desktop/src/providers/manager.rs index fbb61245..07ca7d2b 100644 --- a/packages/desktop/src/providers/manager.rs +++ b/packages/desktop/src/providers/manager.rs @@ -17,9 +17,9 @@ use crate::providers::provider::Provider; use super::{ battery::BatteryProvider, config::ProviderConfig, cpu::CpuProvider, - host::HostProvider, ip::IpProvider, memory::MemoryProvider, - network::NetworkProvider, variables::ProviderVariables, - weather::WeatherProvider, + host::HostProvider, ip::IpProvider, komorebi::KomorebiProvider, + memory::MemoryProvider, network::NetworkProvider, + variables::ProviderVariables, weather::WeatherProvider, }; pub struct ListenProviderArgs { @@ -167,6 +167,9 @@ fn create_provider( Box::new(HostProvider::new(config, sysinfo)) } ProviderConfig::Ip(config) => Box::new(IpProvider::new(config)), + ProviderConfig::Komorebi(config) => { + Box::new(KomorebiProvider::new(config)) + } ProviderConfig::Memory(config) => { Box::new(MemoryProvider::new(config, sysinfo)) } diff --git a/packages/desktop/src/providers/mod.rs b/packages/desktop/src/providers/mod.rs index 3eb41dac..5de40200 100644 --- a/packages/desktop/src/providers/mod.rs +++ b/packages/desktop/src/providers/mod.rs @@ -4,6 +4,7 @@ pub mod cpu; pub mod host; pub mod interval_provider; pub mod ip; +pub mod komorebi; pub mod manager; pub mod memory; pub mod network; diff --git a/packages/desktop/src/providers/variables.rs b/packages/desktop/src/providers/variables.rs index 379d016b..212d5df0 100644 --- a/packages/desktop/src/providers/variables.rs +++ b/packages/desktop/src/providers/variables.rs @@ -2,8 +2,8 @@ use serde::Serialize; use super::{ battery::BatteryVariables, cpu::CpuVariables, host::HostVariables, - ip::IpVariables, memory::MemoryVariables, network::NetworkVariables, - weather::WeatherVariables, + ip::IpVariables, komorebi::KomorebiVariables, memory::MemoryVariables, + network::NetworkVariables, weather::WeatherVariables, }; #[derive(Serialize, Debug, Clone)] @@ -13,6 +13,7 @@ pub enum ProviderVariables { Cpu(CpuVariables), Host(HostVariables), Ip(IpVariables), + Komorebi(KomorebiVariables), Memory(MemoryVariables), Network(NetworkVariables), Weather(WeatherVariables),