eframe web: ctrl-P and cmd-P will not open the print dialog (#2598)

This commit is contained in:
Emil Ernerfeldt 2023-01-16 14:40:19 +01:00 committed by GitHub
parent 60b4f5e3fe
commit cd0f66b9ae
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 5 deletions

View file

@ -9,6 +9,9 @@ NOTE: [`egui-winit`](../egui-winit/CHANGELOG.md), [`egui_glium`](../egui_glium/C
#### Desktop/Native: #### Desktop/Native:
* `eframe::run_native` now returns a `Result` ([#2433](https://github.com/emilk/egui/pull/2433)). * `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 ## 0.20.1 - 2022-12-11
* Fix docs.rs build ([#2420](https://github.com/emilk/egui/pull/2420)). * Fix docs.rs build ([#2420](https://github.com/emilk/egui/pull/2420)).

View file

@ -1,6 +1,9 @@
use super::*;
use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::atomic::{AtomicBool, Ordering};
use egui::Key;
use super::*;
struct IsDestroyed(pub bool); struct IsDestroyed(pub bool);
pub fn paint_and_schedule( 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; runner_lock.input.raw.modifiers = modifiers;
let key = event.key(); 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 { runner_lock.input.raw.events.push(egui::Event::Key {
key, key,
pressed: true, 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 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. // Always prevent moving cursor to url bar.
// egui wants to use tab to move to the next text field. // egui wants to use tab to move to the next text field.
true 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 { } else if egui_wants_keyboard {
matches!( matches!(
event.key().as_str(), event.key().as_str(),
@ -112,6 +119,7 @@ pub fn install_document_events(runner_container: &mut AppRunnerContainer) -> Res
if prevent_default { if prevent_default {
event.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> { pub fn install_canvas_events(runner_container: &mut AppRunnerContainer) -> Result<(), JsValue> {
let canvas = canvas_element(runner_container.runner.lock().canvas_id()).unwrap(); let canvas = canvas_element(runner_container.runner.lock().canvas_id()).unwrap();
{ let prevent_default_events = [
// By default, right-clicks open a context menu. // By default, right-clicks open a context menu.
// We don't want to do that (right clicks is handled by egui): // 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 = let closure =
move |event: web_sys::MouseEvent, move |event: web_sys::MouseEvent,
mut _runner_lock: egui::mutex::MutexGuard<'_, AppRunner>| { mut _runner_lock: egui::mutex::MutexGuard<'_, AppRunner>| {
event.prevent_default(); event.prevent_default();
// event.stop_propagation();
// tracing::debug!("Preventing event {:?}", event_name);
}; };
runner_container.add_event_listener(&canvas, event_name, closure)?; runner_container.add_event_listener(&canvas, event_name, closure)?;