#接口 #任务栏 #UI

taskbar_interface

桌面任务栏的接口

1 个不稳定版本

0.1.0 2021年8月30日

#912GUI

MIT 许可证

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