+
-
+
-
-
+
+
-
-
+
+
-
diff --git a/dash-frontend/assets/gui/view/popup_window.xml b/dash-frontend/assets/gui/view/popup_window.xml
index 180c88d..1a0b802 100644
--- a/dash-frontend/assets/gui/view/popup_window.xml
+++ b/dash-frontend/assets/gui/view/popup_window.xml
@@ -34,7 +34,7 @@
-
-
+
\ No newline at end of file
diff --git a/dash-frontend/assets/lang/de.json b/dash-frontend/assets/lang/de.json
index 4e6ea38..6a42bc3 100644
--- a/dash-frontend/assets/lang/de.json
+++ b/dash-frontend/assets/lang/de.json
@@ -62,6 +62,9 @@
"DISPLAY_OPTIONS": "Anzeigeeinstellungen",
"PROCESS_LIST": {
"NO_PROCESSES_FOUND": "Keine Prozesse gefunden",
- "LOCATED_ON": "auf"
- }
+ "LOCATED_ON": "auf",
+ "TERMINATE_PROCESS_NAMED_X": "Prozess \"{PROCESS_NAME}\" beenden"
+ },
+ "FAILED_TO_LAUNCH_APPLICATION": "Fehler beim Starten der Anwendung:",
+ "APPLICATION_LAUNCHED_ON": "Anwendung wurde auf {DISPLAY_NAME} gestartet."
}
\ No newline at end of file
diff --git a/dash-frontend/assets/lang/en.json b/dash-frontend/assets/lang/en.json
index f75917e..e678f77 100644
--- a/dash-frontend/assets/lang/en.json
+++ b/dash-frontend/assets/lang/en.json
@@ -22,6 +22,7 @@
},
"WLX_OVERLAY_S_SETTINGS": "WlxOverlay-S settings"
},
+ "APPLICATION_LAUNCHED_ON": "Application launched on {DISPLAY_NAME}.",
"APPLICATION_LAUNCHER": "Application launcher",
"APPLICATIONS": "Applications",
"AUDIO": {
@@ -41,6 +42,7 @@
},
"DISPLAY_OPTIONS": "Display options",
"DISPLAY_PORTRAIT_MODE": "Portrait mode",
+ "FAILED_TO_LAUNCH_APPLICATION": "Failed to launcha application:",
"GAMES": "Games",
"GENERAL_SETTINGS": "General settings",
"HEIGHT": "Height",
diff --git a/dash-frontend/assets/lang/es.json b/dash-frontend/assets/lang/es.json
index cd6837f..a625689 100644
--- a/dash-frontend/assets/lang/es.json
+++ b/dash-frontend/assets/lang/es.json
@@ -62,6 +62,9 @@
"DISPLAY_OPTIONS": "Opciones de pantalla",
"PROCESS_LIST": {
"NO_PROCESSES_FOUND": "No se encontraron procesos",
- "LOCATED_ON": "en"
- }
+ "LOCATED_ON": "en",
+ "TERMINATE_PROCESS_NAMED_X": "Terminar proceso \"{PROCESS_NAME}\""
+ },
+ "FAILED_TO_LAUNCH_APPLICATION": "No se pudo iniciar la aplicación:",
+ "APPLICATION_LAUNCHED_ON": "Aplicación iniciada en {DISPLAY_NAME}."
}
\ No newline at end of file
diff --git a/dash-frontend/assets/lang/ja.json b/dash-frontend/assets/lang/ja.json
index 03ad3d3..160ea57 100644
--- a/dash-frontend/assets/lang/ja.json
+++ b/dash-frontend/assets/lang/ja.json
@@ -62,6 +62,9 @@
"DISPLAY_OPTIONS": "表示オプション",
"PROCESS_LIST": {
"NO_PROCESSES_FOUND": "プロセスが見つかりませんでした",
- "LOCATED_ON": "に"
- }
-}
+ "LOCATED_ON": "に",
+ "TERMINATE_PROCESS_NAMED_X": "プロセス \"{PROCESS_NAME}\" を終了します"
+ },
+ "FAILED_TO_LAUNCH_APPLICATION": "アプリケーションの起動に失敗しました:",
+ "APPLICATION_LAUNCHED_ON": "{DISPLAY_NAME}でアプリケーションが起動しました。"
+}
\ No newline at end of file
diff --git a/dash-frontend/assets/lang/pl.json b/dash-frontend/assets/lang/pl.json
index 0f99b4a..653843a 100644
--- a/dash-frontend/assets/lang/pl.json
+++ b/dash-frontend/assets/lang/pl.json
@@ -62,6 +62,9 @@
"PROCESSES": "Procesy",
"PROCESS_LIST": {
"NO_PROCESSES_FOUND": "Nie znaleziono procesów",
- "LOCATED_ON": "na"
- }
+ "LOCATED_ON": "na",
+ "TERMINATE_PROCESS_NAMED_X": "Zakończ proces \"{PROCESS_NAME}\""
+ },
+ "FAILED_TO_LAUNCH_APPLICATION": "Nie udało się uruchomić aplikacji:",
+ "APPLICATION_LAUNCHED_ON": "Aplikacja uruchomiona na {DISPLAY_NAME}."
}
\ No newline at end of file
diff --git a/dash-frontend/src/frontend.rs b/dash-frontend/src/frontend.rs
index 4f65a1c..b335cd2 100644
--- a/dash-frontend/src/frontend.rs
+++ b/dash-frontend/src/frontend.rs
@@ -232,9 +232,13 @@ impl Frontend {
fn mount_popup(&mut self, params: MountPopupParams) -> anyhow::Result<()> {
let mut layout = self.layout.borrow_mut();
- self
- .popup_manager
- .mount_popup(self.globals.clone(), &mut layout, self.tasks.clone(), params)?;
+ self.popup_manager.mount_popup(
+ self.globals.clone(),
+ self.settings.as_ref(),
+ &mut layout,
+ self.tasks.clone(),
+ params,
+ )?;
Ok(())
}
diff --git a/dash-frontend/src/tab/apps.rs b/dash-frontend/src/tab/apps.rs
index ee9ecc3..25db960 100644
--- a/dash-frontend/src/tab/apps.rs
+++ b/dash-frontend/src/tab/apps.rs
@@ -10,8 +10,9 @@ use wgui::{
};
use crate::{
- frontend::{FrontendTask, RcFrontend},
+ frontend::{FrontendTask, FrontendTasks, RcFrontend},
tab::{Tab, TabParams, TabType},
+ task::Tasks,
util::{
self,
desktop_finder::DesktopEntry,
@@ -20,6 +21,10 @@ use crate::{
views::{self, app_launcher},
};
+enum Task {
+ CloseLauncher,
+}
+
struct State {
launcher: Option<(PopupHandle, views::app_launcher::View)>,
}
@@ -35,12 +40,29 @@ pub struct TabApps {
entries: Vec,
#[allow(dead_code)]
app_list: AppList,
+
+ tasks: Tasks,
}
impl Tab for TabApps {
fn get_type(&self) -> TabType {
TabType::Apps
}
+
+ fn update(&mut self, params: super::TabUpdateParams) -> anyhow::Result<()> {
+ let mut state = self.state.borrow_mut();
+
+ for task in self.tasks.drain() {
+ match task {
+ Task::CloseLauncher => state.launcher = None,
+ }
+ }
+
+ if let Some((_, launcher)) = &mut state.launcher {
+ launcher.update(params.layout, params.interface)?;
+ }
+ Ok(())
+ }
}
#[derive(Default)]
@@ -51,9 +73,11 @@ struct AppList {
// called after the user clicks any desktop entry
fn on_app_click(
frontend: RcFrontend,
+ frontend_tasks: FrontendTasks,
globals: WguiGlobals,
entry: DesktopEntry,
state: Rc>,
+ tasks: Tasks,
) -> ButtonClickCallback {
Box::new(move |_common, _evt| {
frontend
@@ -62,15 +86,27 @@ fn on_app_click(
.push(FrontendTask::MountPopup(MountPopupParams {
title: Translation::from_raw_text(&entry.app_name),
on_content: {
+ // this is awful
let state = state.clone();
let entry = entry.clone();
let globals = globals.clone();
+ let frontend_tasks = frontend_tasks.clone();
+ let tasks = tasks.clone();
+
Rc::new(move |data| {
+ let on_launched = {
+ let tasks = tasks.clone();
+ Box::new(move || tasks.push(Task::CloseLauncher))
+ };
+
let view = app_launcher::View::new(app_launcher::Params {
entry: entry.clone(),
- globals: globals.clone(),
+ globals: &globals,
layout: data.layout,
parent_id: data.id_content,
+ frontend_tasks: &frontend_tasks,
+ settings: data.settings,
+ on_launched,
})?;
state.borrow_mut().launcher = Some((data.handle, view));
@@ -93,9 +129,11 @@ impl TabApps {
gtk::init()?;
let entries = util::desktop_finder::find_entries()?;
+ let frontend_tasks = tab_params.frontend_tasks.clone();
let frontend = tab_params.frontend.clone();
let globals = tab_params.globals.clone();
+ let tasks = Tasks::new();
let state = Rc::new(RefCell::new(State { launcher: None }));
let mut parser_state = wgui::parser::parse_from_assets(doc_params, tab_params.layout, tab_params.parent_id)?;
@@ -111,9 +149,11 @@ impl TabApps {
// Set up the click handler for the app button
button.on_click(on_app_click(
frontend.clone(),
+ frontend_tasks.clone(),
globals.clone(),
entry.clone(),
state.clone(),
+ tasks.clone(),
));
},
)?;
@@ -123,6 +163,7 @@ impl TabApps {
parser_state,
entries,
state,
+ tasks,
})
}
}
diff --git a/dash-frontend/src/tab/processes.rs b/dash-frontend/src/tab/processes.rs
index c9656eb..668bb7f 100644
--- a/dash-frontend/src/tab/processes.rs
+++ b/dash-frontend/src/tab/processes.rs
@@ -44,8 +44,9 @@ impl TabProcesses {
view_display_list: display_list::View::new(display_list::Params {
layout: params.layout,
parent_id: state.get_widget_id("display_list_parent")?,
- globals: params.globals.clone(),
+ globals: params.globals,
frontend_tasks: params.frontend_tasks.clone(),
+ on_click: None,
})?,
view_process_list: process_list::View::new(process_list::Params {
layout: params.layout,
diff --git a/dash-frontend/src/util/desktop_finder.rs b/dash-frontend/src/util/desktop_finder.rs
index e6e117d..035577a 100644
--- a/dash-frontend/src/util/desktop_finder.rs
+++ b/dash-frontend/src/util/desktop_finder.rs
@@ -3,6 +3,7 @@ use gtk::traits::IconThemeExt;
use serde::{Deserialize, Serialize};
// compatibility with wayvr-ipc
+// TODO: remove this after we're done with the old wayvr-dashboard and use DesktopEntry instead
#[derive(Debug, Deserialize, Serialize)]
pub struct DesktopFile {
pub name: String,
@@ -13,7 +14,6 @@ pub struct DesktopFile {
}
#[derive(Debug, Clone)]
-#[allow(dead_code)] // TODO: remove this
pub struct DesktopEntry {
pub exec_path: String,
pub exec_args: Vec,
@@ -140,3 +140,15 @@ pub fn find_entries() -> anyhow::Result> {
Ok(res)
}
+
+impl DesktopEntry {
+ pub fn to_desktop_file(&self) -> DesktopFile {
+ DesktopFile {
+ categories: self.categories.clone(),
+ exec_args: self.exec_args.clone(),
+ exec_path: self.exec_path.clone(),
+ icon: self.icon_path.clone(),
+ name: self.app_name.clone(),
+ }
+ }
+}
diff --git a/dash-frontend/src/util/popup_manager.rs b/dash-frontend/src/util/popup_manager.rs
index 5c4e665..95b63ec 100644
--- a/dash-frontend/src/util/popup_manager.rs
+++ b/dash-frontend/src/util/popup_manager.rs
@@ -15,7 +15,10 @@ use wgui::{
widget::label::WidgetLabel,
};
-use crate::frontend::{FrontendTask, FrontendTasks};
+use crate::{
+ frontend::{FrontendTask, FrontendTasks},
+ settings::SettingsIO,
+};
pub struct PopupManagerParams {
pub parent_id: WidgetID,
@@ -55,6 +58,7 @@ pub struct PopupManager {
pub struct PopupContentFuncData<'a> {
pub layout: &'a mut Layout,
+ pub settings: &'a dyn SettingsIO,
pub handle: PopupHandle,
pub id_content: WidgetID,
}
@@ -119,6 +123,7 @@ impl PopupManager {
pub fn mount_popup(
&mut self,
globals: WguiGlobals,
+ settings: &dyn SettingsIO,
layout: &mut Layout,
frontend_tasks: FrontendTasks,
params: MountPopupParams,
@@ -175,6 +180,7 @@ impl PopupManager {
layout,
handle: popup_handle.clone(),
id_content,
+ settings,
})?;
Ok(())
diff --git a/dash-frontend/src/util/toast_manager.rs b/dash-frontend/src/util/toast_manager.rs
index bc9a48a..0c9c5c7 100644
--- a/dash-frontend/src/util/toast_manager.rs
+++ b/dash-frontend/src/util/toast_manager.rs
@@ -130,7 +130,7 @@ impl ToastManager {
// show-up animation
layout.animations.add(Animation::new(
rect.id,
- 160, // does not use anim_mult
+ (120.0 * globals.defaults.animation_mult) as u32,
AnimationEasing::Linear,
Box::new(move |common, data| {
let pos_showup = AnimationEasing::OutQuint.interpolate((data.pos * 4.0).min(1.0));
@@ -138,7 +138,7 @@ impl ToastManager {
let scale = AnimationEasing::OutBack.interpolate((data.pos * 4.0).min(1.0));
{
- let mtx = Mat4::from_translation(Vec3::new(0.0, (1.0 - pos_showup) * 100.0, 0.0))
+ let mtx = Mat4::from_translation(Vec3::new(0.0, (1.0 - pos_showup) * 20.0, 0.0))
* Mat4::from_scale(Vec3::new(scale, scale, 1.0));
data.data.transform = centered_matrix(data.widget_boundary.size, &mtx);
}
diff --git a/dash-frontend/src/views/app_launcher.rs b/dash-frontend/src/views/app_launcher.rs
index f8a2ed9..bf97f52 100644
--- a/dash-frontend/src/views/app_launcher.rs
+++ b/dash-frontend/src/views/app_launcher.rs
@@ -1,27 +1,71 @@
use std::{collections::HashMap, rc::Rc};
+use anyhow::Context;
+use wayvr_ipc::{packet_client::WvrProcessLaunchParams, packet_server::WvrDisplayHandle};
use wgui::{
assets::AssetPath,
+ components::checkbox::ComponentCheckbox,
globals::WguiGlobals,
i18n::Translation,
layout::{Layout, WidgetID},
parser::{Fetchable, ParseDocumentParams, ParserState},
widget::label::WidgetLabel,
};
+use wlx_common::dash_interface::BoxDashInterface;
-use crate::util::desktop_finder::DesktopEntry;
+use crate::{
+ frontend::{FrontendTask, FrontendTasks},
+ settings::SettingsIO,
+ task::Tasks,
+ util::desktop_finder::DesktopEntry,
+ views::display_list,
+};
+
+#[derive(Clone, Eq, PartialEq)]
+enum RunMode {
+ Cage,
+ Wayland,
+}
+
+enum Task {
+ SetRunMode(RunMode),
+ DisplayClick(WvrDisplayHandle),
+}
+
+struct LaunchParams<'a> {
+ display_handle: WvrDisplayHandle,
+ application: &'a DesktopEntry,
+ run_mode: RunMode,
+ globals: &'a WguiGlobals,
+ frontend_tasks: &'a FrontendTasks,
+ interface: &'a mut BoxDashInterface,
+ on_launched: &'a dyn Fn(),
+}
pub struct View {
#[allow(dead_code)]
- pub state: ParserState,
- //entry: DesktopEntry,
+ state: ParserState,
+ entry: DesktopEntry,
+ view_display_list: display_list::View,
+ tasks: Tasks,
+ frontend_tasks: FrontendTasks,
+ globals: WguiGlobals,
+
+ cb_cage_mode: Rc,
+ cb_wayland_mode: Rc,
+ run_mode: RunMode,
+
+ on_launched: Box,
}
pub struct Params<'a> {
- pub globals: WguiGlobals,
+ pub globals: &'a WguiGlobals,
pub entry: DesktopEntry,
pub layout: &'a mut Layout,
pub parent_id: WidgetID,
+ pub settings: &'a dyn SettingsIO,
+ pub frontend_tasks: &'a FrontendTasks,
+ pub on_launched: Box,
}
impl View {
@@ -33,6 +77,44 @@ impl View {
};
let mut state = wgui::parser::parse_from_assets(doc_params, params.layout, params.parent_id)?;
+
+ let cb_cage_mode = state.fetch_component_as::("cb_cage_mode")?;
+ let cb_wayland_mode = state.fetch_component_as::("cb_wayland_mode")?;
+
+ {
+ let mut label_exec = state.fetch_widget_as::(¶ms.layout.state, "label_exec")?;
+ let mut label_args = state.fetch_widget_as::(¶ms.layout.state, "label_args")?;
+
+ label_exec.set_text_simple(
+ &mut params.globals.get(),
+ Translation::from_raw_text_string(params.entry.app_name.clone()),
+ );
+
+ label_args.set_text_simple(
+ &mut params.globals.get(),
+ Translation::from_raw_text_string(params.entry.exec_args.join(" ")),
+ );
+ }
+
+ let display_list_parent = state.fetch_widget(¶ms.layout.state, "display_list_parent")?.id;
+
+ let tasks = Tasks::new();
+
+ let on_display_click = {
+ let tasks = tasks.clone();
+ Box::new(move |disp_handle: WvrDisplayHandle| {
+ tasks.push(Task::DisplayClick(disp_handle));
+ })
+ };
+
+ let view_display_list = display_list::View::new(display_list::Params {
+ frontend_tasks: params.frontend_tasks.clone(),
+ globals: params.globals,
+ layout: params.layout,
+ parent_id: display_list_parent,
+ on_click: Some(on_display_click),
+ })?;
+
let id_icon_parent = state.get_widget_id("icon_parent")?;
// app icon
@@ -48,6 +130,30 @@ impl View {
)?;
}
+ let run_mode = if params.settings.get().tweaks.xwayland_by_default {
+ RunMode::Cage
+ } else {
+ RunMode::Wayland
+ };
+
+ tasks.push(Task::SetRunMode(run_mode.clone()));
+
+ cb_cage_mode.on_toggle({
+ let tasks = tasks.clone();
+ Box::new(move |_, _| {
+ tasks.push(Task::SetRunMode(RunMode::Cage));
+ Ok(())
+ })
+ });
+
+ cb_wayland_mode.on_toggle({
+ let tasks = tasks.clone();
+ Box::new(move |_, _| {
+ tasks.push(Task::SetRunMode(RunMode::Wayland));
+ Ok(())
+ })
+ });
+
let mut label_title = state.fetch_widget_as::(¶ms.layout.state, "label_title")?;
label_title.set_text_simple(
@@ -56,8 +162,139 @@ impl View {
);
Ok(Self {
- //entry: params.entry,
state,
+ view_display_list,
+ tasks,
+ cb_cage_mode,
+ cb_wayland_mode,
+ run_mode,
+ entry: params.entry,
+ frontend_tasks: params.frontend_tasks.clone(),
+ globals: params.globals.clone(),
+ on_launched: params.on_launched,
})
}
+
+ pub fn update(&mut self, layout: &mut Layout, interface: &mut BoxDashInterface) -> anyhow::Result<()> {
+ loop {
+ let tasks = self.tasks.drain();
+ if tasks.is_empty() {
+ break;
+ }
+ for task in tasks {
+ match task {
+ Task::SetRunMode(run_mode) => self.action_set_run_mode(layout, run_mode)?,
+ Task::DisplayClick(disp_handle) => self.action_display_click(disp_handle, interface),
+ }
+ }
+ }
+
+ self.view_display_list.update(layout, interface)?;
+
+ Ok(())
+ }
+
+ fn action_set_run_mode(&mut self, layout: &mut Layout, run_mode: RunMode) -> anyhow::Result<()> {
+ let (n1, n2) = match run_mode {
+ RunMode::Cage => (true, false),
+ RunMode::Wayland => (false, true),
+ };
+
+ let mut c = layout.start_common();
+ self.cb_cage_mode.set_checked(&mut c.common(), n1);
+ self.cb_wayland_mode.set_checked(&mut c.common(), n2);
+
+ c.finish()?;
+ Ok(())
+ }
+
+ fn action_display_click(&mut self, handle: WvrDisplayHandle, interface: &mut BoxDashInterface) {
+ View::try_launch(LaunchParams {
+ application: &self.entry,
+ display_handle: handle,
+ frontend_tasks: &self.frontend_tasks,
+ globals: &self.globals,
+ run_mode: self.run_mode.clone(),
+ interface,
+ on_launched: &self.on_launched,
+ });
+ }
+
+ fn try_launch(params: LaunchParams) {
+ let globals = params.globals.clone();
+ let frontend_tasks = params.frontend_tasks.clone();
+
+ // launch app itself
+ let Err(e) = View::launch(params) else { return };
+
+ let str_failed = globals.i18n().translate("FAILED_TO_LAUNCH_APPLICATION");
+ frontend_tasks.push(FrontendTask::PushToast(Translation::from_raw_text_string(format!(
+ "{} {:?}",
+ str_failed, e
+ ))));
+ }
+
+ fn launch(params: LaunchParams) -> anyhow::Result<()> {
+ let mut env = Vec::::new();
+
+ if params.run_mode == RunMode::Wayland {
+ // This list could be larger, feel free to expand it
+ env.push("QT_QPA_PLATFORM=wayland".into());
+ env.push("GDK_BACKEND=wayland".into());
+ env.push("SDL_VIDEODRIVER=wayland".into());
+ env.push("XDG_SESSION_TYPE=wayland".into());
+ env.push("ELECTRON_OZONE_PLATFORM_HINT=wayland".into());
+ }
+
+ // TODO: refactor this after we ditch old wayvr-dashboard completely
+ let desktop_file = params.application.to_desktop_file();
+ let mut userdata = HashMap::::new();
+ userdata.insert("desktop_file".into(), serde_json::to_string(&desktop_file)?);
+
+ let exec_args_str = desktop_file.exec_args.join(" ");
+
+ params
+ .interface
+ .display_set_visible(params.display_handle.clone(), true)?;
+
+ let args = match params.run_mode {
+ RunMode::Cage => format!("-- {} {}", desktop_file.exec_path, exec_args_str),
+ RunMode::Wayland => exec_args_str,
+ };
+
+ let exec = match params.run_mode {
+ RunMode::Cage => "cage",
+ RunMode::Wayland => &desktop_file.name,
+ };
+
+ let display = params
+ .interface
+ .display_get(params.display_handle.clone())
+ .context("Display not found")?;
+
+ params.interface.process_launch(WvrProcessLaunchParams {
+ env,
+ exec: String::from(exec),
+ name: desktop_file.name,
+ target_display: params.display_handle,
+ args,
+ userdata,
+ })?;
+
+ let str_launched_on = params
+ .globals
+ .i18n()
+ .translate_and_replace("APPLICATION_LAUNCHED_ON", ("{DISPLAY_NAME}", &display.name));
+
+ params
+ .frontend_tasks
+ .push(FrontendTask::PushToast(Translation::from_raw_text_string(
+ str_launched_on,
+ )));
+
+ (*params.on_launched)();
+
+ // we're done!
+ Ok(())
+ }
}
diff --git a/dash-frontend/src/views/display_list.rs b/dash-frontend/src/views/display_list.rs
index 9f00aa3..17a502c 100644
--- a/dash-frontend/src/views/display_list.rs
+++ b/dash-frontend/src/views/display_list.rs
@@ -2,7 +2,7 @@ use std::{cell::RefCell, rc::Rc};
use wayvr_ipc::{
packet_client::{self},
- packet_server::{self},
+ packet_server::{self, WvrDisplayHandle},
};
use wgui::{
assets::AssetPath,
@@ -31,16 +31,17 @@ use crate::{
enum Task {
AddDisplay,
AddDisplayFinish(add_display::Result),
- DisplayOptions(packet_server::WvrDisplay),
+ DisplayClicked(packet_server::WvrDisplay),
DisplayOptionsFinish,
Refresh,
}
pub struct Params<'a> {
- pub globals: WguiGlobals,
+ pub globals: &'a WguiGlobals,
pub frontend_tasks: FrontendTasks,
pub layout: &'a mut Layout,
pub parent_id: WidgetID,
+ pub on_click: Option>,
}
struct State {
@@ -56,6 +57,7 @@ pub struct View {
globals: WguiGlobals,
state: Rc>,
id_list_parent: WidgetID,
+ on_click: Option>,
}
impl View {
@@ -84,9 +86,10 @@ impl View {
parser_state,
tasks,
frontend_tasks: params.frontend_tasks,
- globals: params.globals,
+ globals: params.globals.clone(),
state,
id_list_parent: list_parent.id,
+ on_click: params.on_click,
})
}
@@ -98,11 +101,11 @@ impl View {
}
for task in tasks {
match task {
- Task::AddDisplay => self.add_display(),
- Task::AddDisplayFinish(result) => self.add_display_finish(interface, result)?,
- Task::DisplayOptionsFinish => self.display_options_finish(),
+ Task::AddDisplay => self.action_add_display(),
+ Task::AddDisplayFinish(result) => self.action_add_display_finish(interface, result)?,
+ Task::DisplayOptionsFinish => self.action_display_options_finish(),
Task::Refresh => self.refresh(layout, interface)?,
- Task::DisplayOptions(display) => self.display_options(display)?,
+ Task::DisplayClicked(display) => self.action_display_clicked(display)?,
}
}
}
@@ -189,7 +192,7 @@ fn fill_display_list(
button.on_click({
let tasks = tasks.clone();
Box::new(move |_, _| {
- tasks.push(Task::DisplayOptions(entry.clone()));
+ tasks.push(Task::DisplayClicked(entry.clone()));
Ok(())
})
});
@@ -199,7 +202,7 @@ fn fill_display_list(
}
impl View {
- fn add_display(&mut self) {
+ fn action_add_display(&mut self) {
self.frontend_tasks.push(FrontendTask::MountPopup(MountPopupParams {
title: Translation::from_translation_key("ADD_DISPLAY"),
on_content: {
@@ -230,7 +233,7 @@ impl View {
}));
}
- fn add_display_finish(
+ fn action_add_display_finish(
&mut self,
interface: &mut BoxDashInterface,
result: add_display::Result,
@@ -246,7 +249,7 @@ impl View {
Ok(())
}
- fn display_options_finish(&mut self) {
+ fn action_display_options_finish(&mut self) {
self.state.borrow_mut().view_display_options = None;
self.tasks.push(Task::Refresh);
}
@@ -291,31 +294,35 @@ impl View {
Ok(())
}
- fn display_options(&mut self, display: packet_server::WvrDisplay) -> anyhow::Result<()> {
- self.frontend_tasks.push(FrontendTask::MountPopup(MountPopupParams {
- title: Translation::from_translation_key("DISPLAY_OPTIONS"),
- on_content: {
- let frontend_tasks = self.frontend_tasks.clone();
- let globals = self.globals.clone();
- let state = self.state.clone();
- let tasks = self.tasks.clone();
+ fn action_display_clicked(&mut self, display: packet_server::WvrDisplay) -> anyhow::Result<()> {
+ if let Some(on_click) = &mut self.on_click {
+ (*on_click)(display.handle);
+ } else {
+ self.frontend_tasks.push(FrontendTask::MountPopup(MountPopupParams {
+ title: Translation::from_translation_key("DISPLAY_OPTIONS"),
+ on_content: {
+ let frontend_tasks = self.frontend_tasks.clone();
+ let globals = self.globals.clone();
+ let state = self.state.clone();
+ let tasks = self.tasks.clone();
- Rc::new(move |data| {
- state.borrow_mut().view_display_options = Some((
- data.handle,
- display_options::View::new(display_options::Params {
- globals: globals.clone(),
- layout: data.layout,
- parent_id: data.id_content,
- on_submit: tasks.make_callback(Task::DisplayOptionsFinish),
- display: display.clone(),
- frontend_tasks: frontend_tasks.clone(),
- })?,
- ));
- Ok(())
- })
- },
- }));
+ Rc::new(move |data| {
+ state.borrow_mut().view_display_options = Some((
+ data.handle,
+ display_options::View::new(display_options::Params {
+ globals: globals.clone(),
+ layout: data.layout,
+ parent_id: data.id_content,
+ on_submit: tasks.make_callback(Task::DisplayOptionsFinish),
+ display: display.clone(),
+ frontend_tasks: frontend_tasks.clone(),
+ })?,
+ ));
+ Ok(())
+ })
+ },
+ }));
+ }
Ok(())
}
diff --git a/dash-frontend/src/views/process_list.rs b/dash-frontend/src/views/process_list.rs
index b0a4dce..fdc17c0 100644
--- a/dash-frontend/src/views/process_list.rs
+++ b/dash-frontend/src/views/process_list.rs
@@ -82,7 +82,7 @@ impl View {
for task in tasks {
match task {
Task::Refresh => self.refresh(layout, interface)?,
- Task::TerminateProcess(process) => self.terminate_process(interface, process)?,
+ Task::TerminateProcess(process) => self.action_terminate_process(interface, process)?,
}
}
}
@@ -100,7 +100,7 @@ fn get_desktop_file_from_process(
continue;
}
- // TODO: refactor this after we ditch wayvr-ipc completely
+ // TODO: refactor this after we ditch old wayvr-dashboard completely
let Some(dfile_str) = process.userdata.get("desktop_file") else {
continue;
};
@@ -294,7 +294,7 @@ impl View {
Ok(())
}
- fn terminate_process(
+ fn action_terminate_process(
&mut self,
interface: &mut BoxDashInterface,
process: packet_server::WvrProcess,
diff --git a/wgui/src/widget/mod.rs b/wgui/src/widget/mod.rs
index f0712a4..99e7399 100644
--- a/wgui/src/widget/mod.rs
+++ b/wgui/src/widget/mod.rs
@@ -205,11 +205,7 @@ impl EventResult {
#[must_use]
pub fn merge(self, other: Self) -> Self {
- if self > other {
- self
- } else {
- other
- }
+ if self > other { self } else { other }
}
}
@@ -349,7 +345,6 @@ impl WidgetState {
if (scrolling_cur.x - scrolling_target.x).abs() < epsilon
&& (scrolling_cur.y - scrolling_target.y).abs() < epsilon
{
- log::info!("stopped animating");
*scrolling_cur = *scrolling_target;
}
}