1 个不稳定版本
0.1.0 | 2021年8月30日 |
---|
#912 在 GUI
25KB
494 代码行
Taskbar_interface
一个用于与桌面任务栏通信的 Rust 库,具有以下功能
- 在应用任务栏按钮中显示进度指示器。
- 如果应用需要紧急注意,则突出显示应用在任务栏中的位置。
目前,我们仅支持 Windows 和 Linux,尽管我们欢迎帮助支持其他平台(例如 macOS)。
使用方法
非常简单,将以下内容添加到您的 Cargo.toml
[dependencies]
taskbar_interface = "0.1"
然后您只需要使用某些库提供的 RawWindowHandle
连接到此库,以下是一个使用 winit 的示例
use std::time::Instant;
use raw_window_handle::HasRawWindowHandle;
use taskbar_interface::TaskbarInterface;
use winit::{
event::{Event, WindowEvent},
event_loop::{ControlFlow, EventLoop},
window::WindowBuilder,
};
fn main() {
let event_loop = EventLoop::new();
let window = WindowBuilder::new().build(&event_loop).unwrap();
let mut indicator = TaskbarInterface::new(window.raw_window_handle()).unwrap();
#[cfg(all(unix, not(target_os = "macos")))]
let _ = indicator.set_unity_app_uri("application://myapp.desktop");
let start = Instant::now();
event_loop.run(move |event, _, control_flow| {
*control_flow = ControlFlow::Poll;
match event {
Event::WindowEvent {
event: WindowEvent::CloseRequested,
window_id,
} if window_id == window.id() => *control_flow = ControlFlow::Exit,
Event::MainEventsCleared => {
let progress = start.elapsed().as_secs_f64().fract();
indicator.set_progress(progress).unwrap();
}
_ => (),
}
});
}
以下是使用 glutin 的示例
use std::time::Instant;
use glutin::{
event::{Event, WindowEvent},
event_loop::ControlFlow,
};
use raw_window_handle::HasRawWindowHandle;
use taskbar_interface::TaskbarInterface;
fn main() {
let el = glutin::event_loop::EventLoop::new();
let wb = glutin::window::WindowBuilder::new()
.with_title("Hello world!")
.with_inner_size(glutin::dpi::LogicalSize::new(1024.0, 768.0));
let windowed_context = glutin::ContextBuilder::new()
.build_windowed(wb, &el)
.unwrap();
let mut indicator =
TaskbarInterface::new(windowed_context.window().raw_window_handle()).unwrap();
#[cfg(all(unix, not(target_os = "macos")))]
let _ = indicator.set_unity_app_uri("application://myapp.desktop");
let start = Instant::now();
el.run(move |event, _, control_flow| {
*control_flow = ControlFlow::Poll;
match event {
Event::WindowEvent {
event: WindowEvent::CloseRequested,
window_id: _,
} => *control_flow = ControlFlow::Exit,
Event::MainEventsCleared => {
indicator.needs_attention(start.elapsed().as_secs() % 10 <= 5).unwrap();
}
_ => (),
}
});
}
目前,如果您的框架/库不提供您一个 RawWindowHandle
,则无法使用此库。
Linux 支持
目前,此库旨在完成的系统部分非常不成熟。我们尽力而为,除了 Cinnamon 桌面和可能的一些也使用 libxapps
的桌面外。对于包括 KDE Plasma、Plain dock(Elementary OS)和 DockbarX(XFCE、MATE 和传统 gnome2)在内的多数桌面,需要使用“Unity 协议”,这存在一个主要缺陷,即您需要指定应用 .desktop
文件。因此,您的应用必须在系统中安装,而不是便携式或下载后运行。
如果您发现某个桌面支持上述某些功能但此库不适用,请不要犹豫,打开一个问题!。
依赖关系
~0–32MB
~557K SLoC