#plugin #launcher #ipc #desktop #service #front-end #modular

pop-launcher

用于编写 pop-launcher 插件和前端库

4 个稳定版本

1.1.0 2021年11月22日
1.0.3 2021年10月31日
1.0.1 2021年9月8日
1.0.0 2021年9月4日

网页编程 中排名 #1416

Download history 2/week @ 2024-05-20

每月下载量:58次

GPL-3.0-only

21KB
200

Pop Launcher

基于 Rust 编写的模块化 IPC 桌面启动器服务。桌面启动器可以通过启动 pop-launcher 进程并通过 stdin 和 stdout 管道使用 JSON IPC 与之通信来与之接口。根据发送到服务的查询,启动器服务还会按需启动插件目录中找到的插件。

使用 IPC 可以使每个插件将其数据与其他与之交互的插件进程和前端隔离开。如果插件崩溃,启动器将继续正常运行,优雅地清理崩溃进程。前端和插件也可以用任何语言编写。pop-launcher 将负责并行执行这些插件,按需调度。

插件目录

  • 用户本地插件: ~/.local/share/pop-launcher/plugins/{plugin}/
  • 系统管理员的全局安装: /etc/pop-launcher/plugins/{plugin}/
  • 发行版打包: /usr/lib/pop-launcher/plugins/{plugin}/

插件配置

插件元数据定义在 pop-launcher/plugins/{plugin}/plugin.ron

(
    name: "PluginName",
    description: "Plugin Description: Example",
    bin: (
        path: "name-of-executable-in-plugin-folder",
    )
    icon: Name("icon-name-or-path"),
    // Optional
    query: (
        // Optional -- if we should isolate this plugin when the regex matches
        isolate: true,
        // Optional -- Plugin which searches on empty queries
        persistent: true,
        // Optional -- avoid sorting results from this plugin
        no_sort: true,
        // Optional -- pattern that a query must have to be sent to plugin
        regex: "pattern"
    )
)

脚本目录

  • 用户本地脚本: ~/.local/share/pop-launcher/scripts
  • 系统管理员的全局安装: /etc/pop-launcher/scripts
  • 发行版打包: /usr/lib/pop-launcher/scripts

示例脚本

#!/bin/sh
#
# name: Connect to VPN
# icon: network-vpn
# description: Start VPN
# keywords: vpn start connect

nmcli connection up "vpn-name"

JSON IPC

无论是实现前端还是插件,pop-launcher 所使用的 JSON 编码器是基于行的。每行将包含一个 JSON 消息,该消息将被序列化为或解码为 RequestPluginResponseResponse 类型。这些类型可以在 docs.rs 中引用。IPC 基于 标准输入/输出流,因此请确保不要将日志写入 stdout。

前端 JSON IPC

前端将通过stdin管道向pop-launcher服务发送Request请求。stdout管道将以Response响应。设计前端以异步接收响应是理想的。发送InterruptSearch将取消任何正在进行的搜索,如果插件支持取消操作。

插件JSON IPC

插件将通过它们的stdin管道从pop-launcher接收Request请求。它们应使用PluginResponse消息进行响应。

请求

如果您正在编写前端,您将通过pop-launcher的stdin管道发送这些事件。如果您正在编写插件,插件将从其stdin接收这些事件。

pub enum Request {
    /// Activate on the selected item
    Activate(Indice),
    /// Activate a context item on an item.
    ActivateContext { id: Indice, context: Indice },
    /// Perform a tab completion from the selected item
    Complete(Indice),
    /// Request for any context options this result may have.
    Context(Indice),
    /// Request to end the service
    Exit,
    /// Requests to cancel any active searches
    Interrupt,
    /// Request to close the selected item
    Quit(Indice),
    /// Perform a search in our database
    Search(String),
}

JSON等效

  • { "激活":数字}
  • { "激活上下文": { "id":数字, "上下文":id}}
  • { "完成":数字}
  • { "上下文":数字}
  • "退出"
  • "中断"
  • { "退出":数字}
  • { "搜索":字符串}

插件响应

如果您正在编写插件,您应将这些事件发送到您的stdout。

pub enum PluginResponse {
    /// Append a new search item to the launcher
    Append(PluginSearchResult),
    /// Clear all results in the launcher list
    Clear,
    /// Close the launcher
    Close,
    // Additional options for launching a certain item
    Context {
        id: Indice,
        options: Vec<ContextOption>,
    },
    // Notifies that a .desktop entry should be launched by the frontend.
    DesktopEntry {
        path: PathBuf,
        gpu_preference: GpuPreference,
    },
    /// Update the text in the launcher
    Fill(String),
    /// Indicoates that a plugin is finished with its queries
    Finished,
}

JSON等效

  • { "追加":插件搜索结果},
  • "清除",
  • "关闭",
  • { "上下文": { "id":数字, "选项": 数组<上下文选项> }}
  • { "桌面入口": { "路径":字符串, "gpu偏好":Gpu偏好}}
  • { "填充":字符串}
  • "完成"

其中PluginSearchResult

{
    id: number,
    name: string,
    description: string,
    keywords?: Array<string>,
    icon?: IconSource,
    exec?: string,
    window?: [number, number],
}

ContextOption

{
    id: number,
    name: string
}

GpuPreference

"Default" | "NonDefault"

并且IconSource是以下两种之一

  • { "Name": string },其中名称是系统图标,或通过路径引用的图标
  • { "Mime": string },其中mime是一个mime essence字符串,用于显示基于文件的图标

响应

实现前端的人员应监听这些事件

pub enum Response {
    // An operation was performed and the frontend may choose to exit its process.
    Close,
    // Additional options for launching a certain item
    Context {
        id: Indice,
        options: Vec<ContextOption>,
    },
    // Notifies that a .desktop entry should be launched by the frontend.
    DesktopEntry {
        path: PathBuf,
        gpu_preference: GpuPreference,
    },
    // The frontend should clear its search results and display a new list
    Update(Vec<SearchResult>),
    // An item was selected that resulted in a need to autofill the launcher
    Fill(String),
}

JSON等效

  • "关闭"
  • { "桌面入口":字符串}
  • { "更新": 数组<搜索结果>}
  • { "填充":字符串}

其中SearchResult

{
    id: number,
    name: string,
    description: string,
    icon?: IconSource,
    category_icon?: IconSource,
    window?: [number, number]
}

依赖项

~2.5–3.5MB
~67K SLoC