|
@@ -39,6 +39,7 @@ pub struct KioskApp {
|
|
|
last_interaction: std::time::Instant,
|
|
last_interaction: std::time::Instant,
|
|
|
startup_time: std::time::Instant,
|
|
startup_time: std::time::Instant,
|
|
|
delayed_fullscreen_done: bool,
|
|
delayed_fullscreen_done: bool,
|
|
|
|
|
+ last_enforce_check: std::time::Instant,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
impl KioskApp {
|
|
impl KioskApp {
|
|
@@ -74,6 +75,7 @@ impl KioskApp {
|
|
|
last_interaction: std::time::Instant::now(),
|
|
last_interaction: std::time::Instant::now(),
|
|
|
startup_time: std::time::Instant::now(),
|
|
startup_time: std::time::Instant::now(),
|
|
|
delayed_fullscreen_done: false,
|
|
delayed_fullscreen_done: false,
|
|
|
|
|
+ last_enforce_check: std::time::Instant::now(),
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -138,20 +140,47 @@ impl eframe::App for KioskApp {
|
|
|
|
|
|
|
|
// Ensure window state on first frame
|
|
// Ensure window state on first frame
|
|
|
if !self.window_setup_done {
|
|
if !self.window_setup_done {
|
|
|
- if self.config.ui.fullscreen {
|
|
|
|
|
|
|
+ let want_fullscreen = if self.config.ui.windowed_mode { false } else { self.config.ui.fullscreen };
|
|
|
|
|
+ if want_fullscreen {
|
|
|
ctx.send_viewport_cmd(egui::ViewportCommand::Fullscreen(true));
|
|
ctx.send_viewport_cmd(egui::ViewportCommand::Fullscreen(true));
|
|
|
|
|
+ ctx.send_viewport_cmd(egui::ViewportCommand::Decorations(false));
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // Ensure we are not in fullscreen and re-enable window decorations (borders, title bar)
|
|
|
|
|
+ ctx.send_viewport_cmd(egui::ViewportCommand::Fullscreen(false));
|
|
|
|
|
+ ctx.send_viewport_cmd(egui::ViewportCommand::Decorations(true));
|
|
|
|
|
+ // Ask the window manager to maximize the window
|
|
|
|
|
+ ctx.send_viewport_cmd(egui::ViewportCommand::Maximized(true));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // Enforce fullscreen again after a short delay (to handle some window managers)
|
|
|
|
|
- if !self.delayed_fullscreen_done && self.startup_time.elapsed().as_secs_f32() > 1.0 {
|
|
|
|
|
- if self.config.ui.fullscreen {
|
|
|
|
|
- ctx.send_viewport_cmd(egui::ViewportCommand::Fullscreen(true));
|
|
|
|
|
|
|
+ // Enforce desired mode again after a short delay (to handle some window managers)
|
|
|
|
|
+ if !self.delayed_fullscreen_done && self.startup_time.elapsed().as_secs_f32() > 1.0 {
|
|
|
|
|
+ if want_fullscreen {
|
|
|
|
|
+ ctx.send_viewport_cmd(egui::ViewportCommand::Fullscreen(true));
|
|
|
|
|
+ ctx.send_viewport_cmd(egui::ViewportCommand::Decorations(false));
|
|
|
|
|
+ } else {
|
|
|
|
|
+ ctx.send_viewport_cmd(egui::ViewportCommand::Fullscreen(false));
|
|
|
|
|
+ ctx.send_viewport_cmd(egui::ViewportCommand::Decorations(true));
|
|
|
|
|
+ ctx.send_viewport_cmd(egui::ViewportCommand::Maximized(true));
|
|
|
|
|
+ }
|
|
|
|
|
+ self.delayed_fullscreen_done = true;
|
|
|
}
|
|
}
|
|
|
- self.delayed_fullscreen_done = true;
|
|
|
|
|
- }
|
|
|
|
|
self.window_setup_done = true;
|
|
self.window_setup_done = true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // Periodically re-assert desired window mode in case the OS/window manager changed it.
|
|
|
|
|
+ if self.last_enforce_check.elapsed().as_secs_f32() > 3.0 {
|
|
|
|
|
+ let want_fullscreen = if self.config.ui.windowed_mode { false } else { self.config.ui.fullscreen };
|
|
|
|
|
+ if want_fullscreen {
|
|
|
|
|
+ ctx.send_viewport_cmd(egui::ViewportCommand::Fullscreen(true));
|
|
|
|
|
+ ctx.send_viewport_cmd(egui::ViewportCommand::Decorations(false));
|
|
|
|
|
+ } else {
|
|
|
|
|
+ ctx.send_viewport_cmd(egui::ViewportCommand::Fullscreen(false));
|
|
|
|
|
+ ctx.send_viewport_cmd(egui::ViewportCommand::Decorations(true));
|
|
|
|
|
+ ctx.send_viewport_cmd(egui::ViewportCommand::Maximized(true));
|
|
|
|
|
+ }
|
|
|
|
|
+ self.last_enforce_check = std::time::Instant::now();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// Check for interaction (clicks or key presses, ignore mouse moves to prevent drift issues)
|
|
// Check for interaction (clicks or key presses, ignore mouse moves to prevent drift issues)
|
|
|
let has_interaction = ctx.input(|i| {
|
|
let has_interaction = ctx.input(|i| {
|
|
|
i.pointer.any_pressed() ||
|
|
i.pointer.any_pressed() ||
|