#plugin #pop-launcher #toolkit #front-end #user #service #pop-launcher-plugins

onagre-launcher-toolkit

pop-launcher、pop-launcher-service 和 pop-launcher-plugins 类型包装器,用于编写 pop-launcher 的插件和前端

2 个版本

0.1.2 2024年2月14日
0.1.1 2024年1月22日

#46 in #前端

Download history 16/week @ 2024-04-08 44/week @ 2024-04-15 18/week @ 2024-04-22 24/week @ 2024-04-29 9/week @ 2024-05-06 35/week @ 2024-05-13 46/week @ 2024-05-20 22/week @ 2024-05-27 31/week @ 2024-06-03 17/week @ 2024-06-10 14/week @ 2024-06-17 23/week @ 2024-06-24 25/week @ 2024-07-01 8/week @ 2024-07-08 10/week @ 2024-07-15 16/week @ 2024-07-22

每月 60 次下载

MPL-2.0GPL-3.0-only

22KB
88 代码行

onagre-launcher-toolkit

编写 pop-launcher 客户端和插件的工具包。

Crates

  • launcher: 重导出 pop-launcher crate,包含所有 IPC 消息结构体和一些用于定位插件的实用函数。
  • service: 重导出 pop-launcher-service crate,包含可反序列化的插件配置结构体。如果你的客户端需要读取用户定义的插件配置,这将非常有用。
  • plugins: 重导出 pop-launcher-plugins,它定义了所有默认的 pop-launcher 插件。如果你的客户端需要读取默认插件配置,这将非常有用。

编写插件

在您的 Cargo.toml 中添加以下内容

[dependencies]
tokio = { version = "1.18.2", features = ["rt"] }
onagre-launcher-toolkit = { git = "https://github.com/pop-os/launcher" }

并实现 PluginExt 特质

use pop_launcher_toolkit::launcher::{Indice, PluginResponse, PluginSearchResult};
use pop_launcher_toolkit::plugin_trait::{async_trait, PluginExt};
use pop_launcher_toolkit::plugins;

// The plugin struct, here it holds the search result
pub struct MyPlugin {
  data: Vec<String>
}

#[async_trait]
impl PluginExt for MyPlugin {

  // Define the name of you plugin, this will be used
  // to generate a logfile in $XDG_STATE_HOME at runtime.
  fn name(&self) -> &str {
      "my_awesome_plugin"
  }

  // Respond to `pop-launcher` 'search' query
  async fn search(&mut self, query: &str) {
     // `pop-launcher` dispatches request to plugins according to the regex defined in
     // the `plugin.ron` config file, here we get rid of the prefix
     // before processing the request.
     let query = query.strip_prefix("plug ").unwrap();

     // Iterate through our internal search results with their indices.
     let search_results = self.data.iter()
        .enumerate()
        .filter(|(idx, data)| data.contains(query));

     // Send our search results to `pop-launcher` using their indices as id.
     for (idx, search_result) in search_results {
        self.respond_with(PluginResponse::Append(PluginSearchResult {
            id: idx as u32,
            name: search_result.clone(),
            description: "".to_string(),
            keywords: None,
            icon: None,
            exec: None,
            window: None,
        })).await;
     }

    // tell `pop-launcher` we are done with this request
    self.respond_with(PluginResponse::Finished).await;
  }

  // Respond to `pop-launcher` 'activate' query
  async fn activate(&mut self, id: Indice) {
      // Get the selected entry
      let entry = self.data.get(id as usize).unwrap();
      // Here we use xdg_open to run the entry but this could be anything
      plugins::xdg_open(entry);
      // Tell pop launcher we are done
      self.respond_with(PluginResponse::Finished).await;
  }

  // Respond to `pop-launcher` 'close' request.
  async fn quit(&mut self, id: Indice) {
      self.respond_with(PluginResponse::Close).await;
  }
}

#[tokio::main(flavor = "current_thread")]
pub async fn main() {

    // Here we declare our plugin with dummy values, and never mutate them.
    // In a real plugin we would probably use some kind of mutable shared reference to
    // update our search results.
    let mut plugin = MyPlugin {
        data: vec!["https://crates.io".to_string(), "https://en.wikipedia.org".to_string()],
    };

    /// If you need to debug your plugin or display error messages use `tcracing` macros.
    tracing::info!("Starting my_awsome_plugin");

    // Call the plugin entry point function to start
    // talking with pop_launcherc
    plugin.run().await;
}

依赖项

~29–44MB
~632K SLoC