2

为 GNOME Shell 开发扩展主要涉及通过 GObject Introspection 使用 C API。这意味着使用 C 语言可以完成的大多数事情也可以在 JavaScript 中完成。但是在某些情况下,C API 的功能(还)不能通过自省绑定来重现。能够使用本机 C 代码弥合这些差距会很有用。

GNOME Shell 扩展可以包含从 C 代码创建的二进制组件吗?如果是这样,它们是如何集成的?

4

1 回答 1

0

我有同样的问题。还没有找到这样做的好方法。目前我正在尝试两种不理想的方法来做到这一点:

  1. 硬编码路径,例如:~/.local/share/gnome-shell/extensions/myextension@myname.example.com/mybinary
  2. 全局安装二进制文件并且独立于扩展。

一旦你有了路径,你可以例如使用Util.spawnCommandLine

const Util = imports.misc.util;
Util.spawnCommandLine('/path/to/your/bin');

或者GLib.spawn_async,如果您需要回调:

const GLib = imports.gi.GLib;
let [success, pid] = GLib.spawn_async(null,
  ['/path/to/your/bin', '--param1','--param2'],
  null,
  GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD,
  null);

if (!success) {
  global.log('ERROR NO SUCCESS');
  return;
}

GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, function (pid, status) {
  GLib.spawn_close_pid(pid);

  if (status !== 0 && status !== '0') {
    global.log('ERROR');
  }
  else {
    global.log('SUCCESS', status);
  }
});

我缺少的部分是是否有办法通过辅助方法以某种方式获取扩展路径。但是文档非常落后,浏览源代码还没有找到我的解决方案。

于 2017-04-28T00:22:04.523 回答