получить весь рабочий стол/экран с помощью расширения gnome?

Я работаю над расширениями gnome (javascript), и я хотел бы знать, возможно ли получить/захватить объект рабочего стола/экрана, чтобы применить к нему модификации.

Например, для получения окна я использую этот код:

let app= app_system.get_running();
for(i = 0; i < app.length; i++) {
    let window = app[i].get_windows();

Есть что-то подобное для захвата рабочего стола?

Например, system.get_desktop().


person Erwan Douaille    schedule 11.03.2015    source источник
comment
Проверьте это: roojs.org/ seed/gir-1.2-gtk-3.0/seed/Gdk.Screen.html#expand Похоже на аппаратное обеспечение!? я посмотрю на это   -  person Erwan Douaille    schedule 11.03.2015
comment
Не пользуйтесь этим сайтом: он полностью устарел. Это также относится к Seed, привязке самоанализа на основе JavaScriptCore для JS. Оболочка GNOME написана с использованием GJS, а не привязки на основе MozJs, что означает наличие некоторых отличий. Кроме того, как я уже сказал, бот Seed и этот веб-сайт больше не поддерживаются и безнадежно устарели.   -  person ebassi    schedule 13.03.2015
comment
Это устарело. Но некоторые опции по-прежнему полезны. В любом случае, Gdk.Screen все еще находится в стабильной версии? И соответствует ли это тому, что мне нужно?   -  person Erwan Douaille    schedule 14.03.2015


Ответы (1)


Вы не можете использовать Clutter API для этого; скриншот должен быть сделан с помощью компоновщика в нужное время, а сохранение данных в файл должно быть выполнено полностью асинхронно, чтобы избежать блокировки цикла компоновщика.

GNOME Shell предоставляет API DBus для создания скриншотов и скринкастов, что полезно для внешних служб (например, gnome-screenshot использует этот API, если он есть, вместо использования API X11). Поскольку вы пишете расширение, вы можете использовать тот же внутренний API для создания снимка экрана, импортировав модуль Shell и используя его класс Shell.Screenshot:

const Shell = imports.gi.Shell;
const Lang = imports.lang;

let shooter = new Shell.Screenshot();
shooter.screenshot (filename, includePointer, onScreenshotComplete);

Где filename — путь к файлу, который вы хотите сохранить; includePointer — это логическое значение, которое определяет, должен ли указатель помещаться на скриншот; а onScreenshotComplete — это функция, вызываемая при сохранении снимка экрана.

person ebassi    schedule 12.03.2015
comment
Хорошо, так что нет никакого способа заставить его жить? Я имею в виду, что я не могу использовать скриншот для применения шейдера на своем рабочем столе. - person Erwan Douaille; 14.03.2015
comment
Теперь вы буквально спрашиваете о другом; вы должны быть более точны в том, чего вы хотите достичь, когда задаете вопрос. Если вы хотите применить шейдер к окну, вам нужно пройтись по графу сцены, найти нужного актера окна и использовать ShaderEffect. Если вы хотите применить ShaderEffect к области на экране, вам нужно применить шейдер к рабочей области и загрузить координаты области в шейдер как юниформу. - person ebassi; 16.03.2015
comment
Спасибо, что вы ответили на вопрос поста, а также на мой вопрос в комментарии выше. - person Erwan Douaille; 12.08.2015