Update Monado IPC, display brightness slider

This commit is contained in:
Aleksander
2026-01-08 20:54:43 +01:00
parent e421c39539
commit b260c6c625
12 changed files with 225 additions and 154 deletions

3
Cargo.lock generated
View File

@@ -2884,8 +2884,7 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de"
[[package]] [[package]]
name = "libmonado" name = "libmonado"
version = "1.3.2" version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "git+https://github.com/technobaboo/libmonado-rs.git?rev=26292e5b14663ee2f089f66f0851438a0c00ee67#26292e5b14663ee2f089f66f0851438a0c00ee67"
checksum = "f56d8582a273a05076c57d5478faa51c39958744760938f2da770e890b43c62d"
dependencies = [ dependencies = [
"bindgen", "bindgen",
"cmake", "cmake",

View File

@@ -28,8 +28,13 @@
<elements> <elements>
<TabTitle translation="MONADO_RUNTIME" icon="dashboard/monado.svg" /> <TabTitle translation="MONADO_RUNTIME" icon="dashboard/monado.svg" />
<label translation="DISPLAY_BRIGHTNESS" />
<Slider id="slider_brightness" width="300" height="24" min_value="0" max_value="140" />
<label translation="LIST_OF_PROCESSES" />
<div id="list_parent" flex_direction="column" gap="8"> <div id="list_parent" flex_direction="column" gap="8">
<!-- filled at runtime --> <!-- filled at runtime -->
</div> </div>
</elements> </elements>
</layout> </layout>

View File

@@ -144,5 +144,6 @@
}, },
"AUTOSTART": "Automatisch beim Start ausführen", "AUTOSTART": "Automatisch beim Start ausführen",
"LAUNCH": "Starten" "LAUNCH": "Starten"
} },
"DISPLAY_BRIGHTNESS": "Bildschirmhelligkeit"
} }

View File

@@ -113,6 +113,7 @@
"VOLUME": "Volume" "VOLUME": "Volume"
}, },
"CLOSE_WINDOW": "Close window", "CLOSE_WINDOW": "Close window",
"DISPLAY_BRIGHTNESS": "Display brightness",
"FAILED_TO_LAUNCH_APPLICATION": "Failed to launch a application:", "FAILED_TO_LAUNCH_APPLICATION": "Failed to launch a application:",
"GAME_LAUNCHED": "Game launched", "GAME_LAUNCHED": "Game launched",
"GAME_LIST": { "GAME_LIST": {

View File

@@ -144,5 +144,6 @@
}, },
"AUTOSTART": "Ejecutar automáticamente al inicio", "AUTOSTART": "Ejecutar automáticamente al inicio",
"LAUNCH": "Iniciar" "LAUNCH": "Iniciar"
} },
"DISPLAY_BRIGHTNESS": "Brillo de la pantalla"
} }

View File

@@ -144,5 +144,6 @@
}, },
"AUTOSTART": "起動時に自動実行", "AUTOSTART": "起動時に自動実行",
"LAUNCH": "起動" "LAUNCH": "起動"
} },
"DISPLAY_BRIGHTNESS": "ディスプレイの明るさ"
} }

View File

@@ -1,148 +1,149 @@
{ {
"ACTIONS": { "ACTIONS": {
"RECENTER_PLAYSPACE": "Wycentruj przestrzeń" "RECENTER_PLAYSPACE": "Wycentruj przestrzeń"
}, },
"APP_SETTINGS": { "APP_SETTINGS": {
"HIDE_USERNAME": "Ukryj nazwę użytkownika", "HIDE_USERNAME": "Ukryj nazwę użytkownika",
"OPAQUE_BACKGROUND": "Nieprzezroczyste tło", "OPAQUE_BACKGROUND": "Nieprzezroczyste tło",
"WLX": {}, "WLX": {},
"LOOK_AND_FEEL": "Wygląd i działanie", "LOOK_AND_FEEL": "Wygląd i działanie",
"HIDE_GRAB_HELP": "Ukryj pomoc dotyczącą chwytania", "HIDE_GRAB_HELP": "Ukryj pomoc dotyczącą chwytania",
"ANIMATION_SPEED": "Prędkość animacji UI", "ANIMATION_SPEED": "Prędkość animacji UI",
"ROUND_MULTIPLIER": "Zaokrąglenie krawędzi UI", "ROUND_MULTIPLIER": "Zaokrąglenie krawędzi UI",
"USE_SKYBOX": "Włącz niebo", "USE_SKYBOX": "Włącz niebo",
"USE_PASSTHROUGH": "Włącz passthrough", "USE_PASSTHROUGH": "Włącz passthrough",
"CLOCK_12H": "Zegar 12-godzinny", "CLOCK_12H": "Zegar 12-godzinny",
"FEATURES": "Funkcje", "FEATURES": "Funkcje",
"NOTIFICATIONS_ENABLED": "Włącz powiadomienia", "NOTIFICATIONS_ENABLED": "Włącz powiadomienia",
"NOTIFICATIONS_SOUND_ENABLED": "Dźwięki powiadomień", "NOTIFICATIONS_SOUND_ENABLED": "Dźwięki powiadomień",
"KEYBOARD_SOUND_ENABLED": "Dźwięki klawiatury", "KEYBOARD_SOUND_ENABLED": "Dźwięki klawiatury",
"SPACE_DRAG_MULTIPLIER": "Mnożnik przesuwania przestrzeni", "SPACE_DRAG_MULTIPLIER": "Mnożnik przesuwania przestrzeni",
"SPACE_DRAG_UNLOCKED": "Pozwól na przesuwanie przestrzeni na wszystkich osiach", "SPACE_DRAG_UNLOCKED": "Pozwól na przesuwanie przestrzeni na wszystkich osiach",
"SPACE_ROTATE_UNLOCKED": "Pozwól na rotację przestrzeni na wszystkich osiach", "SPACE_ROTATE_UNLOCKED": "Pozwól na rotację przestrzeni na wszystkich osiach",
"BLOCK_GAME_INPUT": "Blokuj input z gry", "BLOCK_GAME_INPUT": "Blokuj input z gry",
"BLOCK_GAME_INPUT_IGNORE_WATCH": "Nie blokuj inputu gry, gdy zegarek jest używany", "BLOCK_GAME_INPUT_IGNORE_WATCH": "Nie blokuj inputu gry, gdy zegarek jest używany",
"CONTROLS": "Sterowanie", "CONTROLS": "Sterowanie",
"FOCUS_FOLLOWS_MOUSE_MODE": "Ruch myszą po dotknięciu spustu", "FOCUS_FOLLOWS_MOUSE_MODE": "Ruch myszą po dotknięciu spustu",
"LEFT_HANDED_MOUSE": "Myszka dla leworęcznych", "LEFT_HANDED_MOUSE": "Myszka dla leworęcznych",
"ALLOW_SLIDING": "Interakcja z drążkami podczas chwytania", "ALLOW_SLIDING": "Interakcja z drążkami podczas chwytania",
"INVERT_SCROLL_DIRECTION_X": "Odwróć kierunek przewijania w poziomie", "INVERT_SCROLL_DIRECTION_X": "Odwróć kierunek przewijania w poziomie",
"INVERT_SCROLL_DIRECTION_Y": "Odwróć kierunek przewijania w pionie", "INVERT_SCROLL_DIRECTION_Y": "Odwróć kierunek przewijania w pionie",
"SCROLL_SPEED": "Prędkość przewijania", "SCROLL_SPEED": "Prędkość przewijania",
"LONG_PRESS_DURATION": "Czas długiego przytrzymania", "LONG_PRESS_DURATION": "Czas długiego przytrzymania",
"POINTER_LERP_FACTOR": "Wygładzanie wskaźnika", "POINTER_LERP_FACTOR": "Wygładzanie wskaźnika",
"XR_CLICK_SENSITIVITY": "Czułość kliknięć XR", "XR_CLICK_SENSITIVITY": "Czułość kliknięć XR",
"XR_CLICK_SENSITIVITY_RELEASE": "Czułość zwalniania XR", "XR_CLICK_SENSITIVITY_RELEASE": "Czułość zwalniania XR",
"CLICK_FREEZE_TIME_MS": "Czas zamrożenia po kliknięciu (ms)", "CLICK_FREEZE_TIME_MS": "Czas zamrożenia po kliknięciu (ms)",
"MISC": "Różne", "MISC": "Różne",
"XWAYLAND_BY_DEFAULT": "Uruchamiaj aplikacje domyślnie w trybie kompatybilności", "XWAYLAND_BY_DEFAULT": "Uruchamiaj aplikacje domyślnie w trybie kompatybilności",
"UPRIGHT_SCREEN_FIX": "Naprawa pozycji ekranu", "UPRIGHT_SCREEN_FIX": "Naprawa pozycji ekranu",
"DOUBLE_CURSOR_FIX": "Naprawa podwójnego kursora", "DOUBLE_CURSOR_FIX": "Naprawa podwójnego kursora",
"SCREEN_RENDER_DOWN": "Renderuj ekran w niższej rozdzielczości", "SCREEN_RENDER_DOWN": "Renderuj ekran w niższej rozdzielczości",
"UPRIGHT_SCREEN_FIX_HELP": "Naprawia pionowe ekrany na niektórych komputerach", "UPRIGHT_SCREEN_FIX_HELP": "Naprawia pionowe ekrany na niektórych komputerach",
"DOUBLE_CURSOR_FIX_HELP": "Włącz to, jeśli widzisz 2 kursory", "DOUBLE_CURSOR_FIX_HELP": "Włącz to, jeśli widzisz 2 kursory",
"XR_CLICK_SENSITIVITY_HELP": "Czułość analogowego spustu", "XR_CLICK_SENSITIVITY_HELP": "Czułość analogowego spustu",
"XR_CLICK_SENSITIVITY_RELEASE_HELP": "Musi być niższa niż kliknięcie", "XR_CLICK_SENSITIVITY_RELEASE_HELP": "Musi być niższa niż kliknięcie",
"CLICK_FREEZE_TIME_MS_HELP": "Pomaga w precyzji podwójnego kliknięcia", "CLICK_FREEZE_TIME_MS_HELP": "Pomaga w precyzji podwójnego kliknięcia",
"LEFT_HANDED_MOUSE_HELP": "Użyj tego, jeśli przyciski myszy są zamienione", "LEFT_HANDED_MOUSE_HELP": "Użyj tego, jeśli przyciski myszy są zamienione",
"BLOCK_GAME_INPUT_HELP": "Blokuje wszystkie dane wejściowe, gdy kursor najedzie na nakładkę", "BLOCK_GAME_INPUT_HELP": "Blokuje wszystkie dane wejściowe, gdy kursor najedzie na nakładkę",
"BLOCK_GAME_INPUT_IGNORE_WATCH_HELP": "Nie blokuj inputu, gdy wskaźnik jest najedzony", "BLOCK_GAME_INPUT_IGNORE_WATCH_HELP": "Nie blokuj inputu, gdy wskaźnik jest najedzony",
"USE_SKYBOX_HELP": "Wyświetlaj niebo, jeśli nie ma aplikacji sceny lub passthrough", "USE_SKYBOX_HELP": "Wyświetlaj niebo, jeśli nie ma aplikacji sceny lub passthrough",
"USE_PASSTHROUGH_HELP": "Pozwól na passthrough, jeśli runtime XR to obsługuje", "USE_PASSTHROUGH_HELP": "Pozwól na passthrough, jeśli runtime XR to obsługuje",
"SCREEN_RENDER_DOWN_HELP": "Pomaga redukować aliasing na ekranach o wysokiej rozdzielczości", "SCREEN_RENDER_DOWN_HELP": "Pomaga redukować aliasing na ekranach o wysokiej rozdzielczości",
"SETS_ON_WATCH": "Lista zestawów na zegarku", "SETS_ON_WATCH": "Lista zestawów na zegarku",
"TROUBLESHOOTING": "Rozwiązywanie problemów", "TROUBLESHOOTING": "Rozwiązywanie problemów",
"CLEAR_SAVED_STATE": "Wyczyść zapisany stan", "CLEAR_SAVED_STATE": "Wyczyść zapisany stan",
"CLEAR_PIPEWIRE_TOKENS": "Wyczyść tokeny PipeWire", "CLEAR_PIPEWIRE_TOKENS": "Wyczyść tokeny PipeWire",
"DELETE_ALL_CONFIGS": "Wyczyść konfigurację", "DELETE_ALL_CONFIGS": "Wyczyść konfigurację",
"RESTART_SOFTWARE": "Uruchom ponownie oprogramowanie", "RESTART_SOFTWARE": "Uruchom ponownie oprogramowanie",
"CLEAR_SAVED_STATE_HELP": "Zresetuj zestawy i pozycje nakładek", "CLEAR_SAVED_STATE_HELP": "Zresetuj zestawy i pozycje nakładek",
"CLEAR_PIPEWIRE_TOKENS_HELP": "Zapytaj o wybór ekranu przy następnym uruchomieniu", "CLEAR_PIPEWIRE_TOKENS_HELP": "Zapytaj o wybór ekranu przy następnym uruchomieniu",
"DELETE_ALL_CONFIGS_HELP": "Usuń wszystkie pliki konfiguracyjne z katalogu conf.d", "DELETE_ALL_CONFIGS_HELP": "Usuń wszystkie pliki konfiguracyjne z katalogu conf.d",
"RESTART_SOFTWARE_HELP": "Zastosuj ustawienia wymagające ponownego uruchomienia", "RESTART_SOFTWARE_HELP": "Zastosuj ustawienia wymagające ponownego uruchomienia",
"CAPTURE_METHOD": "Przechwytywanie ekranu Wayland", "CAPTURE_METHOD": "Przechwytywanie ekranu Wayland",
"CAPTURE_METHOD_HELP": "Spróbuj zmienić tę opcję, jeśli masz\nproblemy z czarnym lub migoczącym ekranem", "CAPTURE_METHOD_HELP": "Spróbuj zmienić tę opcję, jeśli masz\nproblemy z czarnym lub migoczącym ekranem",
"KEYBOARD_MIDDLE_CLICK": "Środkowy przycisk myszy na klawiaturze", "KEYBOARD_MIDDLE_CLICK": "Środkowy przycisk myszy na klawiaturze",
"KEYBOARD_MIDDLE_CLICK_HELP": "Modyfikator, który ma zostać użyty podczas pisania\nfioletową wiązką lasera", "KEYBOARD_MIDDLE_CLICK_HELP": "Modyfikator, który ma zostać użyty podczas pisania\nfioletową wiązką lasera",
"OPTION": { "OPTION": {
"PIPEWIRE_HELP": "Szybkie przechwytywanie GPU. Zalecane", "PIPEWIRE_HELP": "Szybkie przechwytywanie GPU. Zalecane",
"PW_FALLBACK_HELP": "Wolno. Wypróbuj w przypadku, gdy PipeWire GPU nie działa.", "PW_FALLBACK_HELP": "Wolno. Wypróbuj w przypadku, gdy PipeWire GPU nie działa.",
"SCREENCOPY_HELP": "Wolne. Działa na: Hyprland, Niri, River, Sway" "SCREENCOPY_HELP": "Wolne. Działa na: Hyprland, Niri, River, Sway"
} }
}, },
"APPLICATION_LAUNCHER": "Uruchamiacz aplikacji", "APPLICATION_LAUNCHER": "Uruchamiacz aplikacji",
"APPLICATIONS": "Aplikacje", "APPLICATIONS": "Aplikacje",
"AUDIO": { "AUDIO": {
"AUTO_SWITCH_TO_VR_AUDIO": "Automatyczne przełączanie na dźwięk VR", "AUTO_SWITCH_TO_VR_AUDIO": "Automatyczne przełączanie na dźwięk VR",
"CARDS": "Karty", "CARDS": "Karty",
"FAILED_TO_SWITCH_MICROPHONE": "Nie udało się przełączyć mikrofon", "FAILED_TO_SWITCH_MICROPHONE": "Nie udało się przełączyć mikrofon",
"MICROPHONE_SET_SUCCESSFULLY": "Mikrofon ustawiono pomyślnie", "MICROPHONE_SET_SUCCESSFULLY": "Mikrofon ustawiono pomyślnie",
"MICROPHONES": "Mikrofony", "MICROPHONES": "Mikrofony",
"NO_VR_MICROPHONE_SWITCH_MANUALLY": "Brak mikrofonu VR. Włącz go ręcznie.", "NO_VR_MICROPHONE_SWITCH_MANUALLY": "Brak mikrofonu VR. Włącz go ręcznie.",
"NO_VR_SPEAKERS_FOUND_SWITCH_MANUALLY": "Brak głośników VR. Włącz je ręcznie.", "NO_VR_SPEAKERS_FOUND_SWITCH_MANUALLY": "Brak głośników VR. Włącz je ręcznie.",
"SELECT_AUDIO_CARD_PROFILE": "Wybierz profil karty dźwiękowej", "SELECT_AUDIO_CARD_PROFILE": "Wybierz profil karty dźwiękowej",
"SETTINGS": "Ustawienia dźwięku", "SETTINGS": "Ustawienia dźwięku",
"SPEAKERS": "Głośniki", "SPEAKERS": "Głośniki",
"SPEAKERS_SET_SUCCESSFULLY": "Głośniki ustawiono pomyślnie", "SPEAKERS_SET_SUCCESSFULLY": "Głośniki ustawiono pomyślnie",
"VOLUME": "Głośność" "VOLUME": "Głośność"
}, },
"GAMES": "Gry", "GAMES": "Gry",
"GENERAL_SETTINGS": "Ustawienia ogólne", "GENERAL_SETTINGS": "Ustawienia ogólne",
"HEIGHT": "Wysokość", "HEIGHT": "Wysokość",
"HELLO": "Witaj!", "HELLO": "Witaj!",
"HELLO_USER": "Witaj, {USER}!", "HELLO_USER": "Witaj, {USER}!",
"HIDE": "Ukryj", "HIDE": "Ukryj",
"HOME_SCREEN": "Ekran główny", "HOME_SCREEN": "Ekran główny",
"LIST_OF_PROCESSES": "Lista procesów", "LIST_OF_PROCESSES": "Lista procesów",
"MONADO_RUNTIME": "Środowisko Monado", "MONADO_RUNTIME": "Środowisko Monado",
"POPUP_ADD_DISPLAY": { "POPUP_ADD_DISPLAY": {
"RESOLUTION": "Rozdzielczość" "RESOLUTION": "Rozdzielczość"
}, },
"REMOVE": "Usuń", "REMOVE": "Usuń",
"SETTINGS": "Ustawienia", "SETTINGS": "Ustawienia",
"SHOW": "Pokaż", "SHOW": "Pokaż",
"WIDTH": "Szerokość", "WIDTH": "Szerokość",
"PROCESSES": "Procesy", "PROCESSES": "Procesy",
"PROCESS_LIST": { "PROCESS_LIST": {
"NO_PROCESSES_FOUND": "Nie znaleziono procesów", "NO_PROCESSES_FOUND": "Nie znaleziono procesów",
"LOCATED_ON": "na", "LOCATED_ON": "na",
"TERMINATE_PROCESS_NAMED_X": "Zakończ proces \"{PROCESS_NAME}\"" "TERMINATE_PROCESS_NAMED_X": "Zakończ proces \"{PROCESS_NAME}\""
}, },
"FAILED_TO_LAUNCH_APPLICATION": "Nie udało się uruchomić aplikacji:", "FAILED_TO_LAUNCH_APPLICATION": "Nie udało się uruchomić aplikacji:",
"NO_WINDOWS_FOUND": "Nie znaleziono okien", "NO_WINDOWS_FOUND": "Nie znaleziono okien",
"WINDOW_OPTIONS": "Opcje okna", "WINDOW_OPTIONS": "Opcje okna",
"APPLICATION_STARTED": "Aplikacja uruchomiona", "APPLICATION_STARTED": "Aplikacja uruchomiona",
"LIST_OF_WINDOWS": "Lista okien", "LIST_OF_WINDOWS": "Lista okien",
"CLOSE_WINDOW": "Zamknij okno", "CLOSE_WINDOW": "Zamknij okno",
"GAME_LIST": { "GAME_LIST": {
"NO_GAMES_FOUND": "Nie znaleziono gier" "NO_GAMES_FOUND": "Nie znaleziono gier"
}, },
"TERMINATE_PROCESS": "Zakończ proces", "TERMINATE_PROCESS": "Zakończ proces",
"GAME_LAUNCHED": "Gra uruchomiona", "GAME_LAUNCHED": "Gra uruchomiona",
"APP_LAUNCHER": { "APP_LAUNCHER": {
"MODE": { "MODE": {
"NATIVE": "Tryb natywny", "NATIVE": "Tryb natywny",
"CAGE": "Tryb kompatybilności (Cage)" "CAGE": "Tryb kompatybilności (Cage)"
}, },
"RES_TITLE": "Rozdzielczość", "RES_TITLE": "Rozdzielczość",
"ASPECT_TITLE": "Proporcje", "ASPECT_TITLE": "Proporcje",
"ASPECT": { "ASPECT": {
"WIDE": "Szeroki", "WIDE": "Szeroki",
"SEMI_WIDE": "Półszeroki", "SEMI_WIDE": "Półszeroki",
"SQUARE": "Kwadrat", "SQUARE": "Kwadrat",
"SEMI_TALL": "Pół-wysoki", "SEMI_TALL": "Pół-wysoki",
"TALL": "Wysoki" "TALL": "Wysoki"
}, },
"POS_TITLE": "Pozycjonowanie", "POS_TITLE": "Pozycjonowanie",
"POS": { "POS": {
"FLOATING": "Pływający", "FLOATING": "Pływający",
"ANCHORED": "Przymocowane", "ANCHORED": "Przymocowane",
"STATIC": "Statyczny", "STATIC": "Statyczny",
"FLOATING_HELP": "Porusza się niezależnie, wycentrowuje się po otwarciu.", "FLOATING_HELP": "Porusza się niezależnie, wycentrowuje się po otwarciu.",
"ANCHORED_HELP": "Pozostaje nieruchoma względem centralnego znacznika.", "ANCHORED_HELP": "Pozostaje nieruchoma względem centralnego znacznika.",
"STATIC_HELP": "Nie należy do żadnego zestawu. Nie wyśrodkowuje." "STATIC_HELP": "Nie należy do żadnego zestawu. Nie wyśrodkowuje."
}, },
"AUTOSTART": "Uruchom automatycznie przy starcie", "AUTOSTART": "Uruchom automatycznie przy starcie",
"LAUNCH": "Uruchom" "LAUNCH": "Uruchom"
} },
} "DISPLAY_BRIGHTNESS": "Jasność wyświetlacza"
}

View File

@@ -2,7 +2,7 @@ use std::{collections::HashMap, marker::PhantomData, rc::Rc};
use wgui::{ use wgui::{
assets::AssetPath, assets::AssetPath,
components::checkbox::ComponentCheckbox, components::{checkbox::ComponentCheckbox, slider::ComponentSlider},
globals::WguiGlobals, globals::WguiGlobals,
layout::WidgetID, layout::WidgetID,
parser::{self, Fetchable, ParseDocumentParams, ParserState}, parser::{self, Fetchable, ParseDocumentParams, ParserState},
@@ -19,6 +19,7 @@ use crate::{
enum Task { enum Task {
Refresh, Refresh,
FocusClient(String), FocusClient(String),
SetBrightness(f32),
} }
pub struct TabMonado<T> { pub struct TabMonado<T> {
@@ -46,6 +47,7 @@ impl<T> Tab<T> for TabMonado<T> {
match task { match task {
Task::Refresh => self.refresh(frontend, data)?, Task::Refresh => self.refresh(frontend, data)?,
Task::FocusClient(name) => self.focus_client(frontend, data, name)?, Task::FocusClient(name) => self.focus_client(frontend, data, name)?,
Task::SetBrightness(brightness) => self.set_brightness(frontend, data, brightness),
} }
} }
@@ -152,6 +154,22 @@ impl<T> TabMonado<T> {
self.mount_client(frontend, &client)?; self.mount_client(frontend, &client)?;
} }
// get brightness
let slider_brightness = self.state.fetch_component_as::<ComponentSlider>("slider_brightness")?;
if let Some(brightness) = frontend.interface.monado_brightness_get(data) {
let mut c = frontend.layout.start_common();
slider_brightness.set_value(&mut c.common(), brightness * 100.0);
c.finish()?;
slider_brightness.on_value_changed({
let tasks = self.tasks.clone();
Box::new(move |_common, e| {
tasks.push(Task::SetBrightness(e.value / 100.0));
Ok(())
})
});
}
Ok(()) Ok(())
} }
@@ -160,4 +178,8 @@ impl<T> TabMonado<T> {
self.tasks.push(Task::Refresh); self.tasks.push(Task::Refresh);
Ok(()) Ok(())
} }
fn set_brightness(&mut self, frontend: &mut Frontend<T>, data: &mut T, brightness: f32) {
frontend.interface.monado_brightness_set(data, brightness);
}
} }

View File

@@ -31,6 +31,8 @@ pub trait DashInterface<T> {
fn process_terminate(&mut self, data: &mut T, handle: WvrProcessHandle) -> anyhow::Result<()>; fn process_terminate(&mut self, data: &mut T, handle: WvrProcessHandle) -> anyhow::Result<()>;
fn monado_client_list(&mut self, data: &mut T) -> anyhow::Result<Vec<MonadoClient>>; fn monado_client_list(&mut self, data: &mut T) -> anyhow::Result<Vec<MonadoClient>>;
fn monado_client_focus(&mut self, data: &mut T, name: &str) -> anyhow::Result<()>; fn monado_client_focus(&mut self, data: &mut T, name: &str) -> anyhow::Result<()>;
fn monado_brightness_get(&mut self, data: &mut T) -> Option<f32>;
fn monado_brightness_set(&mut self, data: &mut T, brightness: f32) -> Option<()>;
fn recenter_playspace(&mut self, data: &mut T) -> anyhow::Result<()>; fn recenter_playspace(&mut self, data: &mut T) -> anyhow::Result<()>;
fn desktop_finder<'a>(&'a mut self, data: &'a mut T) -> &'a mut DesktopFinder; fn desktop_finder<'a>(&'a mut self, data: &'a mut T) -> &'a mut DesktopFinder;
fn general_config<'a>(&'a mut self, data: &'a mut T) -> &'a mut GeneralConfig; fn general_config<'a>(&'a mut self, data: &'a mut T) -> &'a mut GeneralConfig;

View File

@@ -62,6 +62,7 @@ pub struct DashInterfaceEmulated {
desktop_finder: DesktopFinder, desktop_finder: DesktopFinder,
general_config: GeneralConfig, general_config: GeneralConfig,
monado_clients: Vec<dash_interface::MonadoClient>, monado_clients: Vec<dash_interface::MonadoClient>,
brightness: f32,
} }
impl DashInterfaceEmulated { impl DashInterfaceEmulated {
@@ -119,6 +120,7 @@ impl DashInterfaceEmulated {
desktop_finder, desktop_finder,
general_config, general_config,
monado_clients, monado_clients,
brightness: 1.0,
} }
} }
} }
@@ -243,4 +245,13 @@ impl DashInterface<()> for DashInterfaceEmulated {
} }
Ok(()) Ok(())
} }
fn monado_brightness_get(&mut self, _: &mut ()) -> Option<f32> {
Some(self.brightness)
}
fn monado_brightness_set(&mut self, _: &mut (), brightness: f32) -> Option<()> {
self.brightness = brightness;
Some(())
}
} }

View File

@@ -57,7 +57,7 @@ interprocess = { version = "2.2.3" }
json = { version = "0.12.4", optional = true } json = { version = "0.12.4", optional = true }
json5 = "1.3.0" json5 = "1.3.0"
libc = "0.2.178" libc = "0.2.178"
libmonado = { version = "1.3.2", optional = true } libmonado = { git = "https://github.com/technobaboo/libmonado-rs.git", rev = "26292e5b14663ee2f089f66f0851438a0c00ee67", optional = true }
log-panics = { version = "2.1.0", features = ["with-backtrace"] } log-panics = { version = "2.1.0", features = ["with-backtrace"] }
mint = "0.5.9" mint = "0.5.9"
openxr = { git = "https://github.com/Ralith/openxrs", rev = "d0afdd3365bc1e14de28f6a3a21f457e788a702e", features = [ openxr = { git = "https://github.com/Ralith/openxrs", rev = "d0afdd3365bc1e14de28f6a3a21f457e788a702e", features = [

View File

@@ -487,10 +487,37 @@ impl DashInterface<AppState> for DashInterfaceLive {
app.monado_init(); app.monado_init();
Ok(()) Ok(())
} }
fn monado_brightness_get(&mut self, app: &mut AppState) -> Option<f32> {
let Some(monado) = &mut app.monado else {
return None;
};
monado_get_brightness(monado)
}
fn monado_brightness_set(&mut self, app: &mut AppState, brightness: f32) -> Option<()> {
let Some(monado) = &mut app.monado else {
return None;
};
monado_set_brightness(monado, brightness).ok()
}
} }
const CLIENT_NAME_BLACKLIST: [&str; 2] = ["wlx-overlay-s", "libmonado"]; const CLIENT_NAME_BLACKLIST: [&str; 2] = ["wlx-overlay-s", "libmonado"];
fn monado_get_brightness(monado: &mut libmonado::Monado) -> Option<f32> {
let device = monado.device_from_role(libmonado::DeviceRole::Head).ok()?;
device.brightness().ok()
}
fn monado_set_brightness(monado: &mut libmonado::Monado, brightness: f32) -> anyhow::Result<()> {
let device = monado.device_from_role(libmonado::DeviceRole::Head)?;
device.set_brightness(brightness, false)?;
Ok(())
}
fn monado_list_clients_filtered( fn monado_list_clients_filtered(
monado: &mut libmonado::Monado, monado: &mut libmonado::Monado,
) -> anyhow::Result<Vec<libmonado::Client<'_>>> { ) -> anyhow::Result<Vec<libmonado::Client<'_>>> {