From e5f0131730ab22c7f4f2bf853580c3cfe8754588 Mon Sep 17 00:00:00 2001 From: Helooprototo Date: Fri, 9 Jan 2026 20:05:50 +0100 Subject: [PATCH] Merge pull request #349 from Helooprototo/main Allow controlling of the Watch and Kbd via wayvrctl --- dash-frontend/src/frontend.rs | 4 +- wayvr/src/gui/panel/mod.rs | 120 ++++++++++++++++++++++- wayvr/src/overlays/custom.rs | 114 +--------------------- wayvr/src/overlays/keyboard/builder.rs | 67 +++++++------ wayvr/src/overlays/watch.rs | 128 +++++++++++++------------ wayvr/src/windowing/manager.rs | 7 +- wgui/src/gfx/mod.rs | 8 +- 7 files changed, 237 insertions(+), 211 deletions(-) diff --git a/dash-frontend/src/frontend.rs b/dash-frontend/src/frontend.rs index 23f445d..ca09d2d 100644 --- a/dash-frontend/src/frontend.rs +++ b/dash-frontend/src/frontend.rs @@ -19,8 +19,8 @@ use wlx_common::{audio, dash_interface::BoxDashInterface, timestep::Timestep}; use crate::{ assets, tab::{ - apps::TabApps, games::TabGames, home::TabHome, monado::TabMonado, processes::TabProcesses, settings::TabSettings, - Tab, TabType, + Tab, TabType, apps::TabApps, games::TabGames, home::TabHome, monado::TabMonado, processes::TabProcesses, + settings::TabSettings, }, util::{ popup_manager::{MountPopupParams, PopupManager, PopupManagerParams}, diff --git a/wayvr/src/gui/panel/mod.rs b/wayvr/src/gui/panel/mod.rs index 073269e..519294b 100644 --- a/wayvr/src/gui/panel/mod.rs +++ b/wayvr/src/gui/panel/mod.rs @@ -1,5 +1,6 @@ use std::{cell::RefCell, rc::Rc}; +use anyhow::Context; use button::setup_custom_button; use glam::{Affine2, Vec2, vec2}; use label::setup_custom_label; @@ -8,15 +9,23 @@ use wgui::{ components::button::ComponentButton, drawing, event::{ - Event as WguiEvent, EventCallback, EventListenerID, EventListenerKind, - InternalStateChangeEvent, MouseButtonIndex, MouseDownEvent, MouseLeaveEvent, - MouseMotionEvent, MouseUpEvent, MouseWheelEvent, + CallbackDataCommon, Event as WguiEvent, EventAlterables, EventCallback, EventListenerID, + EventListenerKind, InternalStateChangeEvent, MouseButtonIndex, MouseDownEvent, + MouseLeaveEvent, MouseMotionEvent, MouseUpEvent, MouseWheelEvent, }, gfx::cmd::WGfxClearMode, + i18n::Translation, layout::{Layout, LayoutParams, LayoutUpdateParams, WidgetID}, - parser::{self, CustomAttribsInfoOwned, Fetchable, ParseDocumentExtra, ParserState}, + parser::{ + self, CustomAttribsInfoOwned, Fetchable, ParseDocumentExtra, ParserState, parse_color_hex, + }, renderer_vk::context::Context as WguiContext, - widget::{EventResult, label::WidgetLabel}, + renderer_vk::text::custom_glyph::CustomGlyphData, + taffy, + widget::{ + EventResult, image::WidgetImage, label::WidgetLabel, rectangle::WidgetRectangle, + sprite::WidgetSprite, + }, windowing::context_menu::{self, ContextMenu}, }; use wlx_common::overlays::{BackendAttrib, BackendAttribValue}; @@ -25,6 +34,7 @@ use wlx_common::timestep::Timestep; use crate::{ app_misc, backend::input::{Haptics, HoverResult, PointerHit, PointerMode}, + backend::task::ModifyPanelCommand, state::AppState, subsystem::hid::WheelDelta, windowing::backend::{ @@ -474,3 +484,103 @@ fn log_cmd_invalid_arg( parser_state.path.get_path_buf() ) } + +pub fn apply_custom_command( + panel: &mut GuiPanel, + app: &mut AppState, + element: &str, + command: &ModifyPanelCommand, +) -> anyhow::Result<()> { + let mut alterables = EventAlterables::default(); + let mut com = CallbackDataCommon { + alterables: &mut alterables, + state: &panel.layout.state, + }; + + match command { + ModifyPanelCommand::SetText(text) => { + if let Ok(mut label) = panel + .parser_state + .fetch_widget_as::(&panel.layout.state, element) + { + label.set_text(&mut com, Translation::from_raw_text(text)); + } else if let Ok(button) = panel + .parser_state + .fetch_component_as::(element) + { + button.set_text(&mut com, Translation::from_raw_text(text)); + } else { + anyhow::bail!("No