From ff4b39069c3caf621dd9299c42d83a8c41987393 Mon Sep 17 00:00:00 2001
From: galister <22305755+galister@users.noreply.github.com>
Date: Sat, 13 Dec 2025 21:44:15 +0900
Subject: [PATCH] per-window option to disable grabbing
---
wlx-overlay-s/src/assets/edit/disable-grab.svg | 1 +
wlx-overlay-s/src/assets/gui/edit.xml | 1 +
wlx-overlay-s/src/assets/lang/de.json | 1 +
wlx-overlay-s/src/assets/lang/en.json | 1 +
wlx-overlay-s/src/assets/lang/es.json | 1 +
wlx-overlay-s/src/assets/lang/ja.json | 1 +
wlx-overlay-s/src/assets/lang/pl.json | 1 +
wlx-overlay-s/src/overlays/edit/mod.rs | 11 +++++++++++
wlx-overlay-s/src/overlays/keyboard/builder.rs | 10 +++++-----
wlx-overlay-s/src/overlays/screen/mod.rs | 2 +-
wlx-overlay-s/src/windowing/manager.rs | 4 ++--
11 files changed, 26 insertions(+), 8 deletions(-)
create mode 100644 wlx-overlay-s/src/assets/edit/disable-grab.svg
diff --git a/wlx-overlay-s/src/assets/edit/disable-grab.svg b/wlx-overlay-s/src/assets/edit/disable-grab.svg
new file mode 100644
index 0000000..81ee4cd
--- /dev/null
+++ b/wlx-overlay-s/src/assets/edit/disable-grab.svg
@@ -0,0 +1 @@
+
diff --git a/wlx-overlay-s/src/assets/gui/edit.xml b/wlx-overlay-s/src/assets/gui/edit.xml
index 9db83e1..8f97b13 100644
--- a/wlx-overlay-s/src/assets/gui/edit.xml
+++ b/wlx-overlay-s/src/assets/gui/edit.xml
@@ -42,6 +42,7 @@
+
diff --git a/wlx-overlay-s/src/assets/lang/de.json b/wlx-overlay-s/src/assets/lang/de.json
index 5db99d3..eb947e6 100644
--- a/wlx-overlay-s/src/assets/lang/de.json
+++ b/wlx-overlay-s/src/assets/lang/de.json
@@ -24,6 +24,7 @@
"HINT_POINT_WINDOW": "Zeigen Sie auf ein Fenster, um seine Parameter zu ändern.\nWenn Sie fertig sind, verlassen Sie den Bearbeitungsmodus mit der Schaltfläche auf der rechten Seite.",
"LEAVE": "Bearbeitungsmodus verlassen",
"LOCK_INTERACTION": "Interaktion sperren",
+ "DISABLE_GRAB": "Greifen deaktivieren",
"MOVE_PRESS_AND_DRAG": "Verschieben (drücken & ziehen)",
"OPACITY": "Undurchsichtigkeit",
"POSITIONING": "Positionierung",
diff --git a/wlx-overlay-s/src/assets/lang/en.json b/wlx-overlay-s/src/assets/lang/en.json
index d3fbdb2..cf2e77a 100644
--- a/wlx-overlay-s/src/assets/lang/en.json
+++ b/wlx-overlay-s/src/assets/lang/en.json
@@ -24,6 +24,7 @@
"HINT_POINT_WINDOW": "Point at a window to change its parameters.\nOnce done, leave edit mode using the button on the right.",
"LEAVE": "Leave edit mode",
"LOCK_INTERACTION": "Lock interaction",
+ "DISABLE_GRAB": "Disable grab",
"MOVE_PRESS_AND_DRAG": "Move (press & drag)",
"OPACITY": "Opacity",
"POSITIONING": "Positioning",
diff --git a/wlx-overlay-s/src/assets/lang/es.json b/wlx-overlay-s/src/assets/lang/es.json
index e88f488..3efe90e 100644
--- a/wlx-overlay-s/src/assets/lang/es.json
+++ b/wlx-overlay-s/src/assets/lang/es.json
@@ -24,6 +24,7 @@
"HINT_POINT_WINDOW": "Pulsa sobre una ventana para cambiar sus parámetros.\nUna vez terminado, sal del modo de edición usando el botón de la derecha.",
"LEAVE": "Salir del modo edición",
"LOCK_INTERACTION": "Bloquear interacción",
+ "DISABLE_GRAB": "Desactivar agarre",
"MOVE_PRESS_AND_DRAG": "Mover (presionar y arrastrar)",
"OPACITY": "Opacidad",
"POSITIONING": "Posicionamiento",
diff --git a/wlx-overlay-s/src/assets/lang/ja.json b/wlx-overlay-s/src/assets/lang/ja.json
index d69742a..eab02d9 100644
--- a/wlx-overlay-s/src/assets/lang/ja.json
+++ b/wlx-overlay-s/src/assets/lang/ja.json
@@ -24,6 +24,7 @@
"HINT_POINT_WINDOW": "ウィンドウをタップしてそのパラメータを変更します。\n完了したら、右側のボタンで編集モードを終了してください。",
"LEAVE": "編集モードを終了",
"LOCK_INTERACTION": "インタラクションをロック",
+ "DISABLE_GRAB": "グラブを無効化",
"MOVE_PRESS_AND_DRAG": "移動(押してドラッグ)",
"OPACITY": "不透明度",
"POSITIONING": "位置調整",
diff --git a/wlx-overlay-s/src/assets/lang/pl.json b/wlx-overlay-s/src/assets/lang/pl.json
index 6248420..7221a11 100644
--- a/wlx-overlay-s/src/assets/lang/pl.json
+++ b/wlx-overlay-s/src/assets/lang/pl.json
@@ -24,6 +24,7 @@
"HINT_POINT_WINDOW": "Wskaż na okno, aby zmienić jego parametry.\nPo zakończeniu wyjdź z trybu edycji za pomocą przycisku po prawej stronie.",
"LEAVE": "Wyjdź z trybu edycji",
"LOCK_INTERACTION": "Zablokuj interakcję",
+ "DISABLE_GRAB": "Wyłącz chwytanie",
"MOVE_PRESS_AND_DRAG": "Przesuń (naciśnij i przeciągnij)",
"OPACITY": "Przezroczystość",
"POSITIONING": "Pozycjonowanie",
diff --git a/wlx-overlay-s/src/overlays/edit/mod.rs b/wlx-overlay-s/src/overlays/edit/mod.rs
index 343b5f7..0186702 100644
--- a/wlx-overlay-s/src/overlays/edit/mod.rs
+++ b/wlx-overlay-s/src/overlays/edit/mod.rs
@@ -251,6 +251,17 @@ fn make_edit_panel(app: &mut AppState) -> anyhow::Result {
.enqueue(TaskType::Overlay(OverlayTask::Modify(sel, task)));
Ok(EventResult::Consumed)
}),
+ "::EditModeToggleGrab" => Box::new(move |_common, _data, app, state| {
+ let sel = OverlaySelector::Id(*state.id.borrow());
+ app.tasks.enqueue(TaskType::Overlay(OverlayTask::Modify(
+ sel,
+ Box::new(|_app, owc| {
+ let state = owc.active_state.as_mut().unwrap(); //want panic
+ state.grabbable = !state.grabbable;
+ }),
+ )));
+ Ok(EventResult::Consumed)
+ }),
"::EditModeTab" => {
let tab_name = args.next().unwrap().to_owned();
Box::new(move |common, _data, _app, state| {
diff --git a/wlx-overlay-s/src/overlays/keyboard/builder.rs b/wlx-overlay-s/src/overlays/keyboard/builder.rs
index 49d9e65..49d2e02 100644
--- a/wlx-overlay-s/src/overlays/keyboard/builder.rs
+++ b/wlx-overlay-s/src/overlays/keyboard/builder.rs
@@ -1,6 +1,6 @@
use std::{collections::HashMap, rc::Rc};
-use glam::{vec2, vec3, Affine3A, FloatExt, Mat4, Quat, Vec2, Vec3};
+use glam::{Affine3A, FloatExt, Mat4, Quat, Vec2, Vec3, vec2, vec3};
use wgui::{
animation::{Animation, AnimationEasing},
assets::AssetPath,
@@ -11,10 +11,10 @@ use wgui::{
renderer_vk::util,
taffy::{self, prelude::length},
widget::{
+ EventResult,
div::WidgetDiv,
rectangle::{WidgetRectangle, WidgetRectangleParams},
util::WLength,
- EventResult,
},
};
use wlx_common::windowing::{OverlayWindowState, Positioning};
@@ -22,14 +22,14 @@ use wlx_common::windowing::{OverlayWindowState, Positioning};
use crate::{
gui::panel::GuiPanel,
state::AppState,
- subsystem::hid::{XkbKeymap, ALT, CTRL, META, SHIFT, SUPER},
+ subsystem::hid::{ALT, CTRL, META, SHIFT, SUPER, XkbKeymap},
windowing::window::OverlayWindowConfig,
};
use super::{
- handle_press, handle_release,
+ KEYBOARD_NAME, KeyButtonData, KeyState, KeyboardBackend, KeyboardState, handle_press,
+ handle_release,
layout::{self, AltModifier, KeyCapType},
- KeyButtonData, KeyState, KeyboardBackend, KeyboardState, KEYBOARD_NAME,
};
const BACKGROUND_PADDING: f32 = 16.0;
diff --git a/wlx-overlay-s/src/overlays/screen/mod.rs b/wlx-overlay-s/src/overlays/screen/mod.rs
index 3360d4b..8295761 100644
--- a/wlx-overlay-s/src/overlays/screen/mod.rs
+++ b/wlx-overlay-s/src/overlays/screen/mod.rs
@@ -1,6 +1,6 @@
use std::{f32::consts::PI, sync::Arc};
-use glam::{vec3, Affine3A, Quat, Vec3};
+use glam::{Affine3A, Quat, Vec3, vec3};
use wlx_capture::frame::Transform;
use wlx_common::windowing::{OverlayWindowState, Positioning};
diff --git a/wlx-overlay-s/src/windowing/manager.rs b/wlx-overlay-s/src/windowing/manager.rs
index f8b69ff..0eca306 100644
--- a/wlx-overlay-s/src/windowing/manager.rs
+++ b/wlx-overlay-s/src/windowing/manager.rs
@@ -291,7 +291,7 @@ impl OverlayWindowManager {
let Some(o) = self.get_by_id(*oid) else {
break;
};
- let Some(mut state) = o.config.active_state.clone() else {
+ let Some(state) = o.config.active_state.clone() else {
break;
};
app.session
@@ -489,7 +489,7 @@ impl OverlayWindowManager {
if !global {
for (i, set) in self.sets.iter_mut().enumerate() {
- let Some(mut state) = set.inactive_overlays.arc_rm(&name) else {
+ let Some(state) = set.inactive_overlays.arc_rm(&name) else {
continue;
};
if self.current_set == Some(i) {