我正在尝试为 gnome 开发一个扩展,它允许我在直接从状态栏关闭盖子时禁止系统睡眠,而无需打开调整。
到目前为止,我有一个基本的 js 脚本,它成功连接到 gdbus 并能够执行命令,但我无法让抑制剂工作。我相信问题是我没有处理禁止函数以正确方式返回的文件描述符,因为文档说只有在文件描述符被引用和打开时,抑制剂才保留在原位。但也有可能我没有正确调用该函数。
如果有人能给我一些建议,我将非常感激。我正在运行 Ubuntu 18.04.4 和 gnome 3.28.2
/* -*- mode: js2 - indent-tabs-mode: nil - js2-basic-offset: 4 -*- */
/*jshint multistr:true */
/*jshint esnext:true */
/*global imports: true */
/*global global: true */
/*global log: true */
'use strict';
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const Mainloop = imports.mainloop;
const Atk = imports.gi.Atk;
const DBusInterface = '<node>\
<interface name="org.freedesktop.login1.Manager">\
<method name="Inhibit">\
<arg type="s" direction="in" />\
<arg type="s" direction="in" />\
<arg type="s" direction="in" />\
<arg type="s" direction="in" />\
<arg type="h" direction="out" />\
</method>\
<method name="ListInhibitors">\
<arg type="a(ssssuu)" direction="out" />\
</method>\
</interface>\
</node>';
const DBusProxy = Gio.DBusProxy.makeProxyWrapper(DBusInterface);
let proxy = new DBusProxy(
Gio.DBus.system,
"org.freedesktop.login1",
"/org/freedesktop/login1"
);
let inhibitors = proxy.ListInhibitorsSync();
print(inhibitors);
let fd = proxy.InhibitSync('handle-lid-switch',
'gnome-extension-lid-inhibitor',
'user preference',
'block');
inhibitors = proxy.ListInhibitorsSync();
print(inhibitors);
let loop = new GLib.MainLoop(null, false);
loop.run();
好的,我是对的,FD 在功能结束时被关闭,释放了抑制。我找不到保持 FD 打开的方法,但我能够使用它异步保持函数运行。
下一步是将其集成到我的扩展中。
这是新代码: