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
每月下载量:58次
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 connectnmcli connection up "vpn-name"
JSON IPC
无论是实现前端还是插件,pop-launcher 所使用的 JSON 编码器是基于行的。每行将包含一个 JSON 消息,该消息将被序列化为或解码为 Request
、PluginResponse
或 Response
类型。这些类型可以在 docs.rs 中引用。IPC 基于 标准输入/输出流,因此请确保不要将日志写入 stdout。
前端 JSON IPC
前端将通过stdin管道向pop-launcher服务发送Request
请求。stdout管道将以Response
响应。设计前端以异步接收响应是理想的。发送Interrupt
或Search
将取消任何正在进行的搜索,如果插件支持取消操作。
插件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