OverlayContainer to use HopSlotMap

This commit is contained in:
galister
2025-10-03 12:52:29 +09:00
parent a1edc2f0b8
commit 231850cf73
19 changed files with 121 additions and 123 deletions

View File

@@ -90,7 +90,7 @@ where
for row in 0..layout.key_sizes.len() {
let (div, _) = panel.layout.add_child(
background,
background.id,
WidgetDiv::create(),
taffy::Style {
flex_direction: taffy::FlexDirection::Row,
@@ -111,7 +111,7 @@ where
let Some(key) = layout.get_key_data(keymap.as_ref(), has_altgr, col, row) else {
let _ = panel.layout.add_child(
div,
div.id,
WidgetDiv::create(),
taffy::Style {
size: taffy_size,
@@ -169,7 +169,7 @@ where
&template_key,
&mut panel.layout,
&mut panel.listeners,
div,
div.id,
params,
)?;
@@ -327,7 +327,7 @@ fn on_enter_anim(
Box::new(move |common, data| {
let rect = data.obj.get_as_mut::<WidgetRectangle>().unwrap();
set_anim_color(&key_state, rect, data.pos);
data.data.transform = get_anim_transform(data.pos, data.widget_size);
data.data.transform = get_anim_transform(data.pos, data.widget_boundary.size);
common.alterables.mark_redraw();
}),
));
@@ -345,7 +345,7 @@ fn on_leave_anim(
Box::new(move |common, data| {
let rect = data.obj.get_as_mut::<WidgetRectangle>().unwrap();
set_anim_color(&key_state, rect, 1.0 - data.pos);
data.data.transform = get_anim_transform(1.0 - data.pos, data.widget_size);
data.data.transform = get_anim_transform(1.0 - data.pos, data.widget_boundary.size);
common.alterables.mark_redraw();
}),
));

View File

@@ -1,9 +1,9 @@
use glam::vec2;
use wlx_capture::{
WlxCapture,
wayland::{WlxClient, WlxOutput},
wlr_dmabuf::WlrDmabufCapture,
wlr_screencopy::WlrScreencopyCapture,
WlxCapture,
};
use crate::{
@@ -13,10 +13,10 @@ use crate::{
};
use super::{
ScreenCreateData,
backend::ScreenBackend,
capture::{MainThreadWlxCapture, new_wlx_capture},
capture::{new_wlx_capture, MainThreadWlxCapture},
pw::{load_pw_token_config, save_pw_token_config},
ScreenCreateData,
};
impl ScreenBackend {
@@ -134,7 +134,6 @@ pub fn create_screens_wayland(wl: &mut WlxClient, app: &mut AppState) -> ScreenC
let meta = ScreenMeta {
name: wl.outputs[id].name.clone(),
id: state.id,
native_handle: *id,
};

View File

@@ -2,9 +2,9 @@ use std::sync::Arc;
use glam::vec2;
use wlx_capture::{
WlxCapture,
frame::Transform,
xshm::{XshmCapture, XshmScreen},
WlxCapture,
};
use crate::{
@@ -13,9 +13,9 @@ use crate::{
};
use super::{
ScreenCreateData,
backend::ScreenBackend,
capture::{MainThreadWlxCapture, new_wlx_capture},
capture::{new_wlx_capture, MainThreadWlxCapture},
ScreenCreateData,
};
#[cfg(feature = "pipewire")]
@@ -112,7 +112,6 @@ pub fn create_screens_x11pw(app: &mut AppState) -> anyhow::Result<ScreenCreateDa
let meta = ScreenMeta {
name: m.name.clone(),
id: state.id,
native_handle: 0,
};
@@ -194,7 +193,6 @@ pub fn create_screens_xshm(app: &mut AppState) -> anyhow::Result<ScreenCreateDat
let meta = ScreenMeta {
name: s.name.clone(),
id: state.id,
native_handle: 0,
};

View File

@@ -5,7 +5,7 @@ use std::{
time::Instant,
};
use glam::{Quat, vec3a};
use glam::{vec3a, Quat};
use idmap_derive::IntegerId;
use serde::{Deserialize, Serialize};
use wgui::{
@@ -110,7 +110,7 @@ impl Toast {
// frame, only the first one gets created
app.tasks.enqueue_at(
TaskType::CreateOverlay(
selector,
selector.clone(),
Box::new(move |app| {
let mut maybe_toast = new_toast(self, app);
if let Some((state, _)) = maybe_toast.as_mut() {
@@ -118,7 +118,7 @@ impl Toast {
app.tasks.enqueue_at(
// at timeout, drop the overlay by ID instead
// in order to avoid dropping any newer toasts
TaskType::DropOverlay(OverlaySelector::Id(state.id)),
TaskType::DropOverlay(selector),
destroy_at,
);
}
@@ -193,7 +193,7 @@ fn new_toast(toast: Toast, app: &mut AppState) -> Option<(OverlayState, Box<dyn
.ok()?;
let _ = panel.layout.add_child(
rect,
rect.id,
WidgetLabel::create(
&mut globals.get(),
WidgetLabelParams {
@@ -215,7 +215,7 @@ fn new_toast(toast: Toast, app: &mut AppState) -> Option<(OverlayState, Box<dyn
);
let _ = panel.layout.add_child(
rect,
rect.id,
WidgetLabel::create(
&mut globals.get(),
WidgetLabelParams {

View File

@@ -58,7 +58,7 @@ fn new_tooltip(
.ok()?;
let _ = panel.layout.add_child(
rect,
rect.id,
TextLabel::create(
&mut i18n,
TextParams {

View File

@@ -1,10 +1,10 @@
use std::{collections::HashMap, rc::Rc, time::Duration};
use std::{collections::HashMap, rc::Rc, sync::Arc, time::Duration};
use glam::Vec3A;
use smallvec::SmallVec;
use crate::{
backend::overlay::{OverlayData, OverlayID, OverlayState, Positioning, Z_ORDER_WATCH},
backend::overlay::{OverlayData, OverlayState, Positioning, Z_ORDER_WATCH},
gui::{panel::GuiPanel, timer::GuiTimer},
state::AppState,
};
@@ -21,8 +21,8 @@ where
let screens = app
.screens
.iter()
.map(|s| s.id)
.collect::<SmallVec<[OverlayID; 8]>>();
.map(|s| s.name.clone())
.collect::<SmallVec<[Arc<str>; 8]>>();
let state = WatchState {};
let mut panel = GuiPanel::new_from_template(
@@ -38,7 +38,7 @@ where
for (idx, handle) in screens.iter().enumerate() {
let mut params: HashMap<Rc<str>, Rc<str>> = HashMap::new();
params.insert("display".into(), (idx + 1).to_string().into());
params.insert("handle".into(), handle.0.to_string().into());
params.insert("handle".into(), handle.as_ref().into());
parser_state.instantiate_template(
doc_params, "Set", layout, listeners, widget, params,
)?;

View File

@@ -101,6 +101,12 @@ impl WayVRData {
candidate
}
fn set_overlay_display_handle(&mut self, id: OverlayID, disp_handle: display::DisplayHandle) {
self.display_handle_map.insert(disp_handle, id);
let display = self.data.state.displays.get_mut(&disp_handle).unwrap(); // Never fails
display.overlay_id = Some(id);
}
}
struct ImageData {
@@ -241,7 +247,6 @@ where
let mut overlay = create_overlay::<O>(
app,
wayvr,
DASHBOARD_DISPLAY_NAME,
OverlayToCreate {
disp_handle,
@@ -264,7 +269,8 @@ where
overlay.state.z_order = Z_ORDER_DASHBOARD;
overlay.state.reset(app, true);
overlays.add(overlay);
let overlay_id = overlays.add(overlay);
wayvr.set_overlay_display_handle(overlay_id, disp_handle);
let args_vec = &conf_dash
.args
@@ -326,7 +332,6 @@ where
fn create_overlay<O>(
app: &mut AppState,
data: &mut WayVRData,
name: &str,
cell: OverlayToCreate,
) -> anyhow::Result<OverlayData<O>>
@@ -345,9 +350,6 @@ where
name,
)?;
data.display_handle_map
.insert(disp_handle, overlay.state.id);
if let Some(attach_to) = &conf_display.attach_to {
overlay.state.positioning = attach_to.get_positioning();
}
@@ -361,9 +363,6 @@ where
overlay.state.spawn_point = Vec3A::from_slice(pos);
}
let display = data.data.state.displays.get_mut(&disp_handle).unwrap(); // Never fails
display.overlay_id = Some(overlay.state.id);
Ok(overlay)
}
@@ -384,8 +383,10 @@ where
let name = disp.name.clone();
let overlay = create_overlay::<O>(app, data, name.as_str(), cell)?;
overlays.add(overlay); // Insert freshly created WayVR overlay into wlx stack
let disp_handle = cell.disp_handle;
let overlay = create_overlay::<O>(app, name.as_str(), cell)?;
let overlay_id = overlays.add(overlay); // Insert freshly created WayVR overlay into wlx stack
data.set_overlay_display_handle(overlay_id, disp_handle);
}
Ok(())