Я пытаюсь нарисовать простой каирский рисунок в окне беспорядка, используя привязки javascript. Моя проблема в том, что, несмотря на то, что половина функций названа по-разному, независимо от того, что я пытаюсь, рисунок Каира не отображается. Я использовал пример из Python, который работает, и портировал его на javascript. Я также использую самоанализ для получения экземпляра модуля Clutter. Я также использую GJS версии 0.7.14. Может кто-нибудь сказать мне, что происходит не так.
Ниже приведен пример кода, который я использую.
const cairo = imports.cairo;
const clutter = imports.gi.Clutter;
function on_button_press_event (stage, event) {
clutter.main_quit();
}
function draw(cairo_tex) {
var context = cairo_tex.create();
context.scale(200, 200);
context.setLineWidth(0.1);
var colour2 = new clutter.Color();
colour2.from_string('#dd000088');
clutter.cairo_set_source_color(context, colour2);
context.translate(0.5, 0.5);
context.arc(0, 0, 0.4, 0, Math.PI * 2);
context.stroke();
}
function main () {
clutter.init(0, null);
var stage = new clutter.Stage();
var colour = new clutter.Color();
colour.from_string("#ffccccff");
stage.set_color(colour);
stage.set_size(400, 300);
stage.connect('button-press-event', on_button_press_event);
stage.connect('destroy', clutter.main_quit);
var cairo_tex = new clutter.CairoTexture.new(200, 200);
cairo_tex.set_position((stage.get_width() - 200) / 2,
(stage.get_height() - 200) / 2);
draw(cairo_tex);
var center_x = cairo_tex.get_width() / 2;
var center_z = cairo_tex.get_height() / 2;
cairo_tex.set_rotation(clutter.AlignAxis.Y_AXIS, 45.0, center_x, 0, center_z);
stage.add_actor(cairo_tex);
cairo_tex.show();
stage.show();
clutter.main();
}
main();
Я думаю, что причина, по которой это не работает, связана с удалением контекста cairo в javascript. context.destroy не существует и с помощью delete тоже не существует. Infact, если я использую delete, то я получаю предупреждение
WARNING: 'applying the 'delete' operator to an unqualified name is deprecated'
что совсем не помогает. Согласно тому, что некоторые разработчики, участвующие в gjs, написали об этом, присвоение нулю должно иметь тот же эффект, потому что это сборщик мусора. У меня есть сомнения относительно того, есть ли что-то, что можно собрать за кулисами.
Если бы кто-то мог сказать, правда это или нет, я бы принял это как ответ.
UPDATE:
Я сузил проблемную область до import.gi.Clutter. Я попробовал другой пример, но на этот раз, используя Gtk вместо Clutter, и следующий код на самом деле работает
cairo = imports.cairo;
Gtk = imports.gi.Gtk;
Gdk = imports.gi.Gdk;
function draw_arc(drawing_area){
var cr = Gdk.cairo_create(drawing_area.get_window());
cr.scale(2, 2);
cr.operator = cairo.Operator.CLEAR;
cr.paint();
cr.operator = cairo.Operator.OVER;
cr.setSourceRGB(0,255,0);
cr.arc(128, 128, 76.8, 0, 2*Math.PI);
cr.fill();
return false;
}
Gtk.init(0, null);
var w = new Gtk.Window();
w.connect('delete-event', Gtk.main_quit);
var d = new Gtk.DrawingArea();
w.add(d);
w.resize(500,600);
w.decorated = false;
d.connect('draw', draw_arc);
w.show_all();
Gtk.main();
Это наводит меня на мысль, что проблема не в реализации gjs в cairo, а в методах самоанализа gjs для реализации Clutter Cairo. Я думаю, что clutter.CairoTexture.new или clutter.CairoTexture.create не реализован должным образом. Я подозреваю, что именно clutter.CairoTexture.create вызывает проблему.