diff --git a/crates/eww/src/app.rs b/crates/eww/src/app.rs index 81211c42..372f5f69 100644 --- a/crates/eww/src/app.rs +++ b/crates/eww/src/app.rs @@ -18,7 +18,7 @@ use gdk::Monitor; use glib::ObjectExt; use itertools::Itertools; use once_cell::sync::Lazy; -use simplexpr::dynval::DynVal; +use simplexpr::{dynval::DynVal, SimplExpr}; use std::{ cell::RefCell, collections::{HashMap, HashSet}, @@ -380,11 +380,13 @@ impl App { let root_index = self.scope_graph.borrow().root_index; + let scoped_vars_literal = initiator.get_scoped_vars().into_iter().map(|(k, v)| (k, SimplExpr::Literal(v))).collect(); + let window_scope = self.scope_graph.borrow_mut().register_new_scope( window_name.to_string(), Some(root_index), root_index, - initiator.get_scoped_vars(), + scoped_vars_literal, )?; let root_widget = crate::widgets::build_widget::build_gtk_widget( diff --git a/crates/eww/src/window_initiator.rs b/crates/eww/src/window_initiator.rs index b9331793..cb2cda00 100644 --- a/crates/eww/src/window_initiator.rs +++ b/crates/eww/src/window_initiator.rs @@ -1,6 +1,6 @@ use anyhow::Result; use eww_shared_util::{AttrName, VarName}; -use simplexpr::{dynval::DynVal, SimplExpr}; +use simplexpr::dynval::DynVal; use std::collections::HashMap; use yuck::config::{ backend_window_options::BackendWindowOptions, @@ -29,28 +29,24 @@ impl WindowInitiator { pub fn new(window_def: &WindowDefinition, args: &WindowArguments) -> Result { let vars = args.get_local_window_variables(window_def)?; - let backend_options = window_def.backend_options.eval(&vars)?; let geometry = match &window_def.geometry { Some(geo) => Some(geo.eval(&vars)?.override_if_given(args.anchor, args.pos, args.size)), None => None, }; let monitor = if args.monitor.is_none() { window_def.eval_monitor(&vars)? } else { args.monitor.clone() }; - let resizable = window_def.eval_resizable(&vars)?; - let stacking = window_def.eval_stacking(&vars)?; - Ok(WindowInitiator { - backend_options, + backend_options: window_def.backend_options.eval(&vars)?, geometry, id: args.instance_id.clone(), - local_variables: vars, monitor, name: window_def.name.clone(), - resizable, - stacking, + resizable: window_def.eval_resizable(&vars)?, + stacking: window_def.eval_stacking(&vars)?, + local_variables: vars, }) } - pub fn get_scoped_vars(&self) -> HashMap { - self.local_variables.iter().map(|(k, v)| (AttrName::from(k.clone()), SimplExpr::Literal(v.clone()))).collect() + pub fn get_scoped_vars(&self) -> HashMap { + self.local_variables.iter().map(|(k, v)| (AttrName::from(k.clone()), v.clone())).collect() } } diff --git a/crates/yuck/src/config/attributes.rs b/crates/yuck/src/config/attributes.rs index b91a562a..0b469d92 100644 --- a/crates/yuck/src/config/attributes.rs +++ b/crates/yuck/src/config/attributes.rs @@ -110,6 +110,8 @@ impl Attributes { } } + +/// Specification of an argument to a widget or window #[derive(Debug, PartialEq, Eq, Clone, serde::Serialize)] pub struct AttrSpec { pub name: AttrName, diff --git a/crates/yuck/src/config/backend_window_options.rs b/crates/yuck/src/config/backend_window_options.rs index 0cf22ff4..a78168c8 100644 --- a/crates/yuck/src/config/backend_window_options.rs +++ b/crates/yuck/src/config/backend_window_options.rs @@ -75,6 +75,7 @@ pub struct X11BackendWindowOptions { pub struts: X11StrutDefinition, } +/// Unevaluated form of [`X11BackendWindowOptions`] #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize)] pub struct X11BackendWindowOptionsDef { pub sticky: Option, @@ -111,6 +112,7 @@ pub struct WlBackendWindowOptions { pub namespace: Option, } +/// Unevaluated form of [`WlBackendWindowOptions`] #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize)] pub struct WlBackendWindowOptionsDef { pub exclusive: Option, diff --git a/crates/yuck/src/config/widget_definition.rs b/crates/yuck/src/config/widget_definition.rs index 8a17233a..d06ea8a2 100644 --- a/crates/yuck/src/config/widget_definition.rs +++ b/crates/yuck/src/config/widget_definition.rs @@ -8,25 +8,9 @@ use crate::{ from_ast::{FromAst, FromAstElementContent}, }, }; -use eww_shared_util::{AttrName, Span, Spanned}; +use eww_shared_util::{Span, Spanned}; -use super::widget_use::WidgetUse; - -#[derive(Debug, PartialEq, Eq, Clone, serde::Serialize)] -pub struct AttrSpec { - pub name: AttrName, - pub optional: bool, - pub span: Span, -} - -impl FromAst for AttrSpec { - fn from_ast(e: Ast) -> DiagResult { - let span = e.span(); - let symbol = e.as_symbol()?; - let (name, optional) = if let Some(name) = symbol.strip_prefix('?') { (name.to_string(), true) } else { (symbol, false) }; - Ok(Self { name: AttrName(name), optional, span }) - } -} +use super::{widget_use::WidgetUse, attributes::AttrSpec}; #[derive(Debug, PartialEq, Eq, Clone, serde::Serialize)] pub struct WidgetDefinition { diff --git a/crates/yuck/src/config/window_definition.rs b/crates/yuck/src/config/window_definition.rs index 61900dc7..18bd581b 100644 --- a/crates/yuck/src/config/window_definition.rs +++ b/crates/yuck/src/config/window_definition.rs @@ -43,6 +43,7 @@ pub struct WindowDefinition { } impl WindowDefinition { + /// Evaluate the `monitor` field of the window definition pub fn eval_monitor(&self, local_variables: &HashMap) -> Result, EvalError> { Ok(match &self.monitor { Some(monitor_expr) => Some(MonitorIdentifier::from_dynval(&monitor_expr.eval(local_variables)?)?), @@ -50,6 +51,7 @@ impl WindowDefinition { }) } + /// Evaluate the `resizable` field of the window definition pub fn eval_resizable(&self, local_variables: &HashMap) -> Result { Ok(match &self.resizable { Some(expr) => expr.eval(local_variables)?.as_bool()?, @@ -57,6 +59,7 @@ impl WindowDefinition { }) } + /// Evaluate the `stacking` field of the window definition pub fn eval_stacking( &self, local_variables: &HashMap,