当我尝试从肉桂小程序打开GtkWindow时,整个桌面会冻结
~/.cinnamon/glass.log
文件中没有错误。
const Gtk = imports.gi.Gtk;
function MyApplet(orientation)
{
this._init(orientation);
}
MyApplet.prototype =
{
__proto__: Applet.IconApplet.prototype,
_init: function(orientation)
{
Applet.IconApplet.prototype._init.call(this, orientation);
try {
this.set_applet_icon_name("dialog-question");
this.set_applet_tooltip("test");
}
catch (e) {
global.logError(e);
};
},
on_applet_clicked: function(event)
{
Gtk.init(null, 0);
let mwindow = new Gtk.Window ({type : Gtk.WindowType.TOPLEVEL});
mwindow.title = "Hello World!";
mwindow.connect ("destroy", function(){Gtk.main_quit()});
mwindow.show();
Gtk.main();
}
};
function main(metadata, orientation)
{
let myApplet = new MyApplet(orientation);
return myApplet;
}
代码执行到Gtk.main()
,然后没有窗口显示,桌面被冻结
任何人都知道如何让它正常工作?
答案 0 :(得分:0)
Javascript无法进行多线程处理,这就是调用Gtk.main();
打破Cinnamon的原因
Cinnamon applet已经运行了一个主循环,Gtk.main();
的调用尝试创建另一个。{
因此,不可能直接在Javascript中从肉桂小程序打开GtkWindow
解决方案可能是通过Python脚本打开GtkWindow,并使用DBus在Cinnamon applet和Python / GTK窗口之间进行通信。
答案 1 :(得分:0)
这是你可以做到的:
const Gtk = imports.gi.Gtk;
const Util = imports.misc.util;
function MyApplet(orientation)
{
this._init(orientation);
}
MyApplet.prototype =
{
__proto__: Applet.IconApplet.prototype,
_init: function(orientation)
{
Applet.IconApplet.prototype._init.call(this, orientation);
try {
this.set_applet_icon_name("dialog-question");
this.set_applet_tooltip("test");
}
catch (e) {
global.logError(e);
};
},
on_applet_clicked: function(event)
{
//path to your applet directory; hardcoded for now!
let path="~/.local/share/cinnamon/applets/your_applet@you.org";
//create in your applet directory a file "yourgtkfile.js" and
//make it executable "chmod +x yourgtkfile.js"
Util.spawnCommandLine(path + "/yourgtkfile.js");
}
};
function main(metadata, orientation)
{
let myApplet = new MyApplet(orientation);
return myApplet;
}
您可以在yourgtkfile.js中复制/粘贴this。 (用#!/ usr / bin / cjs更改#!/ usr / bin / gjs)
或者,这个(取自here)(用#!/ usr / bin / cjs改变#!/ usr / bin / gjs):
#!/usr/bin/cjs
const Lang = imports.lang;
const Gtk = imports.gi.Gtk;
const Application = new Lang.Class({
//A Class requires an explicit Name parameter. This is the Class Name.
Name: 'Application',
//create the application
_init: function() {
this.application = new Gtk.Application();
//connect to 'activate' and 'startup' signals to handlers.
this.application.connect('activate', Lang.bind(this, this._onActivate));
this.application.connect('startup', Lang.bind(this, this._onStartup));
},
//create the UI
_buildUI: function() {
this._window = new Gtk.ApplicationWindow({ application: this.application,
title: "Hello World!" });
this._window.set_default_size(200, 200);
this.label = new Gtk.Label({ label: "Hello World" });
this._window.add(this.label);
},
//handler for 'activate' signal
_onActivate: function() {
//show the window and all child widgets
this._window.show_all();
},
//handler for 'startup' signal
_onStartup: function() {
this._buildUI();
}
});
//run the application
let app = new Application();
app.application.run(ARGV);
我认为您不需要与刚推出的应用进行通信:)