From cd0f66b9ae661be737ce57f26fb305cf124f6b73 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Mon, 16 Jan 2023 14:40:19 +0100 Subject: [PATCH] eframe web: ctrl-P and cmd-P will not open the print dialog (#2598) --- crates/eframe/CHANGELOG.md | 3 +++ crates/eframe/src/web/events.rs | 24 +++++++++++++++++++----- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/crates/eframe/CHANGELOG.md b/crates/eframe/CHANGELOG.md index bcabaeb7..0f67c3db 100644 --- a/crates/eframe/CHANGELOG.md +++ b/crates/eframe/CHANGELOG.md @@ -9,6 +9,9 @@ NOTE: [`egui-winit`](../egui-winit/CHANGELOG.md), [`egui_glium`](../egui_glium/C #### Desktop/Native: * `eframe::run_native` now returns a `Result` ([#2433](https://github.com/emilk/egui/pull/2433)). +#### Web: +* Prevent ctrl-P/cmd-P from opening the print dialog ([#2598](https://github.com/emilk/egui/pull/2598)). + ## 0.20.1 - 2022-12-11 * Fix docs.rs build ([#2420](https://github.com/emilk/egui/pull/2420)). diff --git a/crates/eframe/src/web/events.rs b/crates/eframe/src/web/events.rs index 6ac9e1e4..dcca886a 100644 --- a/crates/eframe/src/web/events.rs +++ b/crates/eframe/src/web/events.rs @@ -1,6 +1,9 @@ -use super::*; use std::sync::atomic::{AtomicBool, Ordering}; +use egui::Key; + +use super::*; + struct IsDestroyed(pub bool); pub fn paint_and_schedule( @@ -64,8 +67,9 @@ pub fn install_document_events(runner_container: &mut AppRunnerContainer) -> Res runner_lock.input.raw.modifiers = modifiers; let key = event.key(); + let egui_key = translate_key(&key); - if let Some(key) = translate_key(&key) { + if let Some(key) = egui_key { runner_lock.input.raw.events.push(egui::Event::Key { key, pressed: true, @@ -85,10 +89,13 @@ pub fn install_document_events(runner_container: &mut AppRunnerContainer) -> Res let egui_wants_keyboard = runner_lock.egui_ctx().wants_keyboard_input(); - let prevent_default = if matches!(event.key().as_str(), "Tab") { + #[allow(clippy::if_same_then_else)] + let prevent_default = if egui_key == Some(Key::Tab) { // Always prevent moving cursor to url bar. // egui wants to use tab to move to the next text field. true + } else if egui_key == Some(Key::P) { + true // Prevent ctrl-P opening the print dialog. Users may want to use it for a command palette. } else if egui_wants_keyboard { matches!( event.key().as_str(), @@ -112,6 +119,7 @@ pub fn install_document_events(runner_container: &mut AppRunnerContainer) -> Res if prevent_default { event.prevent_default(); + // event.stop_propagation(); } }, )?; @@ -198,15 +206,21 @@ pub fn install_document_events(runner_container: &mut AppRunnerContainer) -> Res pub fn install_canvas_events(runner_container: &mut AppRunnerContainer) -> Result<(), JsValue> { let canvas = canvas_element(runner_container.runner.lock().canvas_id()).unwrap(); - { + let prevent_default_events = [ // By default, right-clicks open a context menu. // We don't want to do that (right clicks is handled by egui): - let event_name = "contextmenu"; + "contextmenu", + // Allow users to use ctrl-p for e.g. a command palette + "afterprint", + ]; + for event_name in prevent_default_events { let closure = move |event: web_sys::MouseEvent, mut _runner_lock: egui::mutex::MutexGuard<'_, AppRunner>| { event.prevent_default(); + // event.stop_propagation(); + // tracing::debug!("Preventing event {:?}", event_name); }; runner_container.add_event_listener(&canvas, event_name, closure)?;