5

我正在编写一个简单的扩展来通过单击扩展按钮打开浏览器。我想知道是否有一个函数可以执行传递的 shell 命令作为参数。此外,如果有人可以为扩展开发提出一个好的简单参考,那将非常有帮助。

4

2 回答 2

9

来自https://github.com/GNOME/gnome-shell/blob/master/js/misc/util.js

// Runs @command_line in the background, handling any errors that
// occur when trying to parse or start the program.
function spawnCommandLine(command_line) {
    try {
        let [success, argv] = GLib.shell_parse_argv(command_line);
        trySpawn(argv);
    } catch (err) {
        _handleSpawnError(command_line, err);
    }
}

该方法有一些变化。为自己省去很多麻烦,只需为 GitHub 存储库添加书签即可。

一些快速链接:

  • popupMenu.js:使用弹出菜单
  • panel.js:实现“托盘”图标的好读物
  • modalDialog.js:一些 UI 元素被重用,例如 runDialog.js 使用它
  • mpris.js:也有在 gjs 中使用 DBus 等框架的好例子

我无法强调阅读 gnome-shell 源代码你会得到多少。不幸的是,它现在被编译成一个资源文件,所以我们没有本地副本可以偶然发现。

更新(2021)

如果您正在阅读本文,请参阅gjs.guide上提供的文档。特别是有关Spawning Subprocesses的文档,其中涵盖了为什么这是扩展中的一个坏主意以及如何做到这一点稍微不那么糟糕。

于 2017-06-14T04:03:54.743 回答
0

如果您对结果不感兴趣 - 即当您想要打开浏览器窗口时 - 您可以像这样使用 GLib.spawn_command_line_async :

const GLib = imports.gi.GLib;
...
(this._menuEntries[i]).connect('activate', () => {
       GLib.spawn_command_line_async('firefox http://example.com?p='+ my_params[i]);
});

如果您需要同步结果,请阅读https://gjs.guide/guides/gio/subprocesses.html

于 2021-07-10T14:44:17.480 回答