Включение бинарных компонентов в расширение оболочки GNOME

Разработка расширений для оболочки GNOME в основном включает использование API-интерфейсов C через GObject Introspection. Это означает, что большинство вещей, достижимых с C, может быть сделано и в JavaScript. Но в некоторых случаях функции API C не могут (пока) быть воспроизведены с помощью привязок самоанализа. Было бы полезно иметь возможность преодолеть эти пробелы с помощью собственного C-кода.

Может ли расширение GNOME Shell включать двоичные компоненты, созданные из кода C? Если да, то как они интегрированы?

1 ответ

У меня тот же вопрос. Еще не нашли хороший способ сделать это. В настоящее время я пытаюсь сделать 2 неидеальных подхода:

  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);
  }
});

Я пропускаю часть, если есть способ как-нибудь получить путь расширения с помощью вспомогательного метода. Но документы ужасно недоразвиты, и просмотр исходного кода еще не нашел мне решения.

Другие вопросы по тегам