mirror of
https://github.com/tauri-apps/tauri.git
synced 2024-12-20 17:22:08 +03:00
185 lines
4.9 KiB
Markdown
185 lines
4.9 KiB
Markdown
---
|
|
title: System Tray
|
|
---
|
|
|
|
Native application system tray.
|
|
|
|
### Setup
|
|
|
|
Configure the `systemTray` object on `tauri.conf.json`:
|
|
|
|
```json
|
|
{
|
|
"tauri": {
|
|
"systemTray": {
|
|
"iconPath": "icons/icon.png",
|
|
"iconAsTemplate": true,
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
The `iconPath` is pointed to a PNG file on macOS and Linux, and a `.ico` file must exist for Windows support.
|
|
|
|
The `iconAsTemplate` is a boolean value that determines whether the image represents a [template](https://developer.apple.com/documentation/appkit/nsimage/1520017-template?language=objc) image on macOS.
|
|
|
|
|
|
### Creating a system tray
|
|
|
|
To create a native system tray, import the `SystemTray` type:
|
|
|
|
```rust
|
|
use tauri::SystemTray;
|
|
```
|
|
|
|
Initialize a new tray instance:
|
|
|
|
```rust
|
|
let tray = SystemTray::new();
|
|
```
|
|
|
|
### Configuring a system tray context menu
|
|
|
|
Optionally you can add a context menu that is visible when the tray icon is right clicked. Import the `SystemTrayMenu`, `SystemTrayMenuItem` and `CustomMenuItem` types:
|
|
|
|
```rust
|
|
use tauri::{CustomMenuItem, SystemTrayMenu, SystemTrayMenuItem};
|
|
```
|
|
|
|
Create the `SystemTrayMenu`:
|
|
|
|
```rust
|
|
// here `"quit".to_string()` defines the menu item id, and the second parameter is the menu item label.
|
|
let quit = CustomMenuItem::new("quit".to_string(), "Quit");
|
|
let hide = CustomMenuItem::new("hide".to_string(), "Hide");
|
|
let tray_menu = SystemTrayMenu::new()
|
|
.add_item(quit)
|
|
.add_native_item(SystemTrayMenuItem::Separator)
|
|
.add_item(hide);
|
|
```
|
|
|
|
Add the tray menu to the `SystemTray` instance:
|
|
|
|
```rust
|
|
let tray = SystemTray::new().with_menu(tray_menu);
|
|
```
|
|
|
|
### Configure the app system tray
|
|
|
|
The created `SystemTray` instance can be set using the `system_tray` API on the `tauri::Builder` struct:
|
|
|
|
```rust
|
|
use tauri::{CustomMenuItem, SystemTray, SystemTrayMenu};
|
|
|
|
fn main() {
|
|
let tray_menu = SystemTrayMenu::new(); // insert the menu items here
|
|
let system_tray = SystemTray::new()
|
|
.with_menu(tray_menu);
|
|
tauri::Builder::default()
|
|
.system_tray(system_tray)
|
|
.run(tauri::generate_context!())
|
|
.expect("error while running tauri application");
|
|
}
|
|
```
|
|
|
|
### Listening to system tray events
|
|
|
|
Each `CustomMenuItem` triggers an event when clicked.
|
|
Also, Tauri emits tray icon click events.
|
|
Use the `on_system_tray_event` API to handle them:
|
|
|
|
```rust
|
|
use tauri::{CustomMenuItem, SystemTray, SystemTrayMenu};
|
|
use tauri::Manager;
|
|
|
|
fn main() {
|
|
let tray_menu = SystemTrayMenu::new(); // insert the menu items here
|
|
tauri::Builder::default()
|
|
.system_tray(SystemTray::new().with_menu(tray_menu))
|
|
.on_system_tray_event(|app, event| match event {
|
|
SystemTrayEvent::LeftClick {
|
|
position: _,
|
|
size: _,
|
|
..
|
|
} => {
|
|
println!("system tray received a left click");
|
|
}
|
|
SystemTrayEvent::RightClick {
|
|
position: _,
|
|
size: _,
|
|
..
|
|
} => {
|
|
println!("system tray received a right click");
|
|
}
|
|
SystemTrayEvent::DoubleClick {
|
|
position: _,
|
|
size: _,
|
|
..
|
|
} => {
|
|
println!("system tray received a double click");
|
|
}
|
|
SystemTrayEvent::MenuItemClick { id, .. } => {
|
|
match id.as_str() {
|
|
"quit" => {
|
|
std::process::exit(0);
|
|
}
|
|
"hide" => {
|
|
let window = app.get_window("main").unwrap();
|
|
window.hide().unwrap();
|
|
}
|
|
_ => {}
|
|
}
|
|
}
|
|
_ => {}
|
|
})
|
|
.run(tauri::generate_context!())
|
|
.expect("error while running tauri application");
|
|
}
|
|
```
|
|
|
|
### Updating system tray
|
|
|
|
The `AppHandle` struct has a `tray_handle` method, which returns a handle to the system tray allowing updating tray icon and context menu items:
|
|
|
|
#### Updating context menu items
|
|
|
|
```rust
|
|
use tauri::{CustomMenuItem, SystemTray, SystemTrayMenu};
|
|
use tauri::Manager;
|
|
|
|
fn main() {
|
|
let tray_menu = SystemTrayMenu::new(); // insert the menu items here
|
|
tauri::Builder::default()
|
|
.system_tray(SystemTray::new().with_menu(tray_menu))
|
|
.on_system_tray_event(|app, event| match event {
|
|
SystemTrayEvent::MenuItemClick { id, .. } => {
|
|
// get a handle to the clicked menu item
|
|
// note that `tray_handle` can be called anywhere,
|
|
// just get a `AppHandle` instance with `app.handle()` on the setup hook
|
|
// and move it to another function or thread
|
|
let item_handle = app.tray_handle().get_item(&id);
|
|
match id.as_str() {
|
|
"hide" => {
|
|
let window = app.get_window("main").unwrap();
|
|
window.hide().unwrap();
|
|
// you can also `set_selected`, `set_enabled` and `set_native_image` (macOS only).
|
|
item_handle.set_title("Show").unwrap();
|
|
}
|
|
_ => {}
|
|
}
|
|
}
|
|
_ => {}
|
|
})
|
|
.run(tauri::generate_context!())
|
|
.expect("error while running tauri application");
|
|
}
|
|
```
|
|
|
|
#### Updating tray icon
|
|
|
|
Note that `tauri::Icon` must be a `Path` variant on Linux, and `Raw` variant on Windows and macOS.
|
|
|
|
```rust
|
|
app.tray_handle().set_icon(tauri::Icon::Raw(include_bytes!("../path/to/myicon.ico"))).unwrap();
|
|
```
|