Skip to content

Commit

Permalink
feat: add Event::Ready (#2433)
Browse files Browse the repository at this point in the history
  • Loading branch information
lemarier committed Aug 15, 2021
1 parent 397710b commit 28c6b7a
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 7 deletions.
7 changes: 7 additions & 0 deletions .changes/tauri-ready-event.md
@@ -0,0 +1,7 @@
---
"tauri": minor
"tauri-runtime": minor
"tauri-runtime-wry": minor
---

Add `Event::Ready` on the `run()` callback. Triggered once when the event loop is ready.
6 changes: 5 additions & 1 deletion core/tauri-runtime-wry/src/lib.rs
Expand Up @@ -44,7 +44,7 @@ use wry::{
PhysicalPosition as WryPhysicalPosition, PhysicalSize as WryPhysicalSize,
Position as WryPosition, Size as WrySize,
},
event::{Event, WindowEvent as WryWindowEvent},
event::{Event, StartCause, WindowEvent as WryWindowEvent},
event_loop::{ControlFlow, EventLoop, EventLoopProxy, EventLoopWindowTarget},
global_shortcut::{GlobalShortcut, ShortcutManager as WryShortcutManager},
menu::{
Expand Down Expand Up @@ -1781,6 +1781,10 @@ fn handle_event_loop(
*control_flow = ControlFlow::Wait;

match event {
Event::NewEvents(StartCause::Init) => {
callback(RunEvent::Ready);
}

Event::GlobalShortcutEvent(accelerator_id) => {
for (id, handler) in &*global_shortcut_manager_handle.listeners.lock().unwrap() {
if accelerator_id == *id {
Expand Down
2 changes: 2 additions & 0 deletions core/tauri-runtime/src/lib.rs
Expand Up @@ -184,6 +184,8 @@ pub enum RunEvent {
},
/// Window closed.
WindowClose(String),
/// Application ready.
Ready,
}

/// Action to take when the event loop is about to exit
Expand Down
3 changes: 3 additions & 0 deletions core/tauri/src/app.rs
Expand Up @@ -95,6 +95,8 @@ pub enum Event {
},
/// Window closed.
WindowClosed(String),
/// Application ready.
Ready,
}

/// A menu event that was triggered on a window.
Expand Down Expand Up @@ -438,6 +440,7 @@ impl<R: Runtime> App<R> {
api: CloseRequestApi(signal_tx),
},
RunEvent::WindowClose(label) => Event::WindowClosed(label),
RunEvent::Ready => Event::Ready,
_ => unimplemented!(),
},
);
Expand Down
44 changes: 38 additions & 6 deletions examples/api/src-tauri/src/main.rs
Expand Up @@ -15,8 +15,8 @@ use std::path::PathBuf;

use serde::Serialize;
use tauri::{
api::dialog::ask, CustomMenuItem, Event, Manager, SystemTray, SystemTrayEvent, SystemTrayMenu,
WindowBuilder, WindowUrl,
api::dialog::ask, async_runtime, CustomMenuItem, Event, GlobalShortcutManager, Manager,
SystemTray, SystemTrayEvent, SystemTrayMenu, WindowBuilder, WindowUrl,
};

#[derive(Serialize)]
Expand Down Expand Up @@ -55,7 +55,8 @@ fn main() {
.add_item(CustomMenuItem::new("toggle", "Toggle"))
.add_item(CustomMenuItem::new("new", "New window"))
.add_item(CustomMenuItem::new("icon_1", "Tray Icon 1"))
.add_item(CustomMenuItem::new("icon_2", "Tray Icon 2")),
.add_item(CustomMenuItem::new("icon_2", "Tray Icon 2"))
.add_item(CustomMenuItem::new("exit_app", "Quit")),
),
)
.on_system_tray_event(|app, event| match event {
Expand All @@ -71,6 +72,10 @@ fn main() {
SystemTrayEvent::MenuItemClick { id, .. } => {
let item_handle = app.tray_handle().get_item(&id);
match id.as_str() {
"exit_app" => {
// exit the app
app.exit(0);
}
"toggle" => {
let window = app.get_window("main").unwrap();
let new_title = if window.is_visible().unwrap() {
Expand Down Expand Up @@ -157,15 +162,42 @@ fn main() {
#[cfg(target_os = "macos")]
app.set_activation_policy(tauri::ActivationPolicy::Regular);

app.run(|app_handle, e| {
if let Event::CloseRequested { label, api, .. } = e {
api.prevent_close();
app.run(|app_handle, e| match e {
// Application is ready (triggered only once)
Event::Ready => {
let app_handle = app_handle.clone();
// launch a new thread so it doesnt block any channel
async_runtime::spawn(async move {
let app_handle = app_handle.clone();
app_handle
.global_shortcut_manager()
.register("CmdOrCtrl+1", move || {
let app_handle = app_handle.clone();
let window = app_handle.get_window("main").unwrap();
window.set_title("New title!").unwrap();
})
.unwrap();
});
}

// Triggered when a window is trying to close
Event::CloseRequested { label, api, .. } => {
let app_handle = app_handle.clone();
// use the exposed close api, and prevent the event loop to close
api.prevent_close();
// ask the user if he wants to quit
ask("Tauri API", "Are you sure?", move |answer| {
if answer {
app_handle.get_window(&label).unwrap().close().unwrap();
}
});
}

// Keep the event loop running even if all windows are closed
// This allow us to catch system tray events when there is no window
Event::ExitRequested { api, .. } => {
api.prevent_exit();
}
_ => {}
})
}

0 comments on commit 28c6b7a

Please sign in to comment.