From 5e5f7ef786fedc6d8e771217e5563c2896a7e589 Mon Sep 17 00:00:00 2001
From: galister <22305755+galister@users.noreply.github.com>
Date: Sun, 4 Jan 2026 18:00:23 +0900
Subject: [PATCH] wip: add bar to keyboard
---
wlx-overlay-s/src/assets/gui/keyboard.xml | 34 +++++++++++
.../src/overlays/keyboard/builder.rs | 57 ++++++++-----------
2 files changed, 58 insertions(+), 33 deletions(-)
diff --git a/wlx-overlay-s/src/assets/gui/keyboard.xml b/wlx-overlay-s/src/assets/gui/keyboard.xml
index d08252f..006269f 100644
--- a/wlx-overlay-s/src/assets/gui/keyboard.xml
+++ b/wlx-overlay-s/src/assets/gui/keyboard.xml
@@ -8,6 +8,8 @@
width="${width}" height="${height}" min_width="${width}" min_height="${height}" max_width="${width}" max_height="${height}"
/>
+
+
@@ -71,4 +73,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/wlx-overlay-s/src/overlays/keyboard/builder.rs b/wlx-overlay-s/src/overlays/keyboard/builder.rs
index 17ad37e..5f0f416 100644
--- a/wlx-overlay-s/src/overlays/keyboard/builder.rs
+++ b/wlx-overlay-s/src/overlays/keyboard/builder.rs
@@ -1,6 +1,12 @@
use std::{collections::HashMap, rc::Rc};
-use crate::{app_misc, gui::panel::GuiPanel, state::AppState, subsystem::hid::XkbKeymap};
+use crate::{
+ app_misc,
+ gui::panel::{GuiPanel, NewGuiPanelParams},
+ state::AppState,
+ subsystem::hid::XkbKeymap,
+};
+use anyhow::Context;
use glam::{FloatExt, Mat4, Vec2, vec2, vec3};
use wgui::{
animation::{Animation, AnimationEasing},
@@ -8,7 +14,7 @@ use wgui::{
drawing::{self, Color},
event::{self, CallbackMetadata, EventListenerKind},
layout::{LayoutParams, LayoutUpdateParams},
- parser::Fetchable,
+ parser::{Fetchable, ParseDocumentExtra, ParseDocumentParams},
renderer_vk::util,
taffy::{self, prelude::length},
widget::{
@@ -24,7 +30,6 @@ use super::{
layout::{self, KeyCapType},
};
-const BACKGROUND_PADDING: f32 = 16.0;
const PIXELS_PER_UNIT: f32 = 80.;
#[allow(clippy::too_many_lines, clippy::significant_drop_tightening)]
@@ -34,43 +39,30 @@ pub(super) fn create_keyboard_panel(
state: KeyboardState,
layout: &layout::Layout,
) -> anyhow::Result> {
- let mut panel = GuiPanel::new_blank(app, state, Default::default())?;
+ let mut panel =
+ GuiPanel::new_from_template(app, "gui/keyboard.xml", state, NewGuiPanelParams::default())?;
+
+ let doc_params = ParseDocumentParams {
+ globals: app.wgui_globals.clone(),
+ path: AssetPath::FileOrBuiltIn("gui/keyboard.xml"),
+ extra: ParseDocumentExtra::default(),
+ };
let globals = app.wgui_globals.clone();
let accent_color = globals.get().defaults.accent_color;
let anim_mult = globals.defaults().animation_mult;
- let (background, _) = panel.layout.add_child(
- panel.layout.content_root_widget,
- WidgetRectangle::create(WidgetRectangleParams {
- color: globals.defaults().bg_color,
- round: WLength::Units((16.0 * globals.defaults().rounding_mult).max(0.)),
- border: 2.0,
- border_color: accent_color,
- ..Default::default()
- }),
- taffy::Style {
- flex_direction: taffy::FlexDirection::Column,
- padding: length(BACKGROUND_PADDING),
- ..Default::default()
- },
- )?;
+ let root = panel
+ .parser_state
+ .get_widget_id("keyboard_root")
+ .context("Element with id 'keyboard_root' not found; keyboard.xml may be out of date.")?;
let has_altgr = keymap.as_ref().is_some_and(|m| XkbKeymap::has_altgr(m));
- let parse_doc_params = wgui::parser::ParseDocumentParams {
- globals,
- path: AssetPath::FileOrBuiltIn("gui/keyboard.xml"),
- extra: Default::default(),
- };
-
- let (_, mut gui_state_key) =
- wgui::parser::new_layout_from_assets(&parse_doc_params, &LayoutParams::default())?;
-
for row in 0..layout.key_sizes.len() {
let (div, _) = panel.layout.add_child(
- background.id,
+ root,
WidgetDiv::create(),
taffy::Style {
flex_direction: taffy::FlexDirection::Row,
@@ -144,15 +136,15 @@ pub(super) fn create_keyboard_panel(
}
let template_key = format!("Key{:?}", key.cap_type);
- gui_state_key.instantiate_template(
- &parse_doc_params,
+ panel.parser_state.instantiate_template(
+ &doc_params,
&template_key,
&mut panel.layout,
div.id,
params,
)?;
- if let Ok(widget_id) = gui_state_key.get_widget_id(&my_id) {
+ if let Ok(widget_id) = panel.parser_state.get_widget_id(&my_id) {
let key_state = {
let rect = panel
.layout
@@ -271,7 +263,6 @@ pub(super) fn create_keyboard_panel(
timestep_alpha: 0.0,
})?,
);
- panel.parser_state = gui_state_key;
Ok(panel)
}