From 612e04165e2769134ef0958be8d42e6fb8c38f20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Thu, 25 May 2023 20:31:22 +0200 Subject: [PATCH] dbusServices: Port to ESM We want to replace gjs' custom (and now legacy) imports system with standard EcmaScript modules: JS developers are already familiar with them, they have better tooling support and using standard features over non-standard ones is generally the right thing to do. Our D-Bus services are separate from the main process, and thus can be ported separately (except for the few imports that are shared with the main process' code base). Part-of: --- .eslintrc.yml | 3 ++- js/dbusServices/dbus-service.in | 6 +++++- js/dbusServices/dbus-service.service.in | 2 +- js/dbusServices/dbusService.js | 19 +++++++++---------- .../extensions/extensionPrefsDialog.js | 10 +++++++--- .../extensions/extensionsService.js | 14 +++++++------- js/dbusServices/extensions/main.js | 18 +++++++----------- js/dbusServices/notifications/main.js | 11 +++++------ .../notifications/notificationDaemon.js | 10 +++++----- js/dbusServices/screencast/main.js | 11 +++++------ .../screencast/screencastService.js | 15 +++++++-------- js/dbusServices/screensaver/main.js | 11 +++++------ .../screensaver/screenSaverService.js | 10 +++++----- 13 files changed, 70 insertions(+), 70 deletions(-) diff --git a/.eslintrc.yml b/.eslintrc.yml index 018e857f79f..f1edc4dcfd0 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -4,5 +4,6 @@ extends: overrides: - files: - js/ui/init.js + - js/dbusServices/** parserOptions: - sourceType: module \ No newline at end of file + sourceType: module diff --git a/js/dbusServices/dbus-service.in b/js/dbusServices/dbus-service.in index 524166102d6..5c698f58a7a 100644 --- a/js/dbusServices/dbus-service.in +++ b/js/dbusServices/dbus-service.in @@ -1,5 +1,9 @@ -imports.package.start({ +import {programInvocationName, programArgs} from 'system'; + +imports.package.init({ name: '@PACKAGE_NAME@', prefix: '@prefix@', libdir: '@libdir@', }); +const {main} = await import(`${imports.package.moduledir}/main.js`); +await main([programInvocationName, ...programArgs]); diff --git a/js/dbusServices/dbus-service.service.in b/js/dbusServices/dbus-service.service.in index 3b0d09abec8..c55bd3ce003 100644 --- a/js/dbusServices/dbus-service.service.in +++ b/js/dbusServices/dbus-service.service.in @@ -1,3 +1,3 @@ [D-BUS Service] Name=@service@ -Exec=@gjs@ @pkgdatadir@/@service@ +Exec=@gjs@ -m @pkgdatadir@/@service@ diff --git a/js/dbusServices/dbusService.js b/js/dbusServices/dbusService.js index 8b6a0a119c1..392a4c4c49c 100644 --- a/js/dbusServices/dbusService.js +++ b/js/dbusServices/dbusService.js @@ -1,14 +1,13 @@ -/* exported DBusService, ServiceImplementation */ +import Gio from 'gi://Gio'; +import GLib from 'gi://GLib'; -const { Gio, GLib } = imports.gi; +import {programArgs} from 'system'; const Signals = imports.signals; const IDLE_SHUTDOWN_TIME = 2; // s -const { programArgs } = imports.system; - -var ServiceImplementation = class { +export class ServiceImplementation { constructor(info, objectPath) { this._objectPath = objectPath; this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(info, this); @@ -150,10 +149,10 @@ var ServiceImplementation = class { that._queueShutdownCheck(); }; } -}; +} Signals.addSignalMethods(ServiceImplementation.prototype); -var DBusService = class { +export class DBusService { constructor(name, service) { this._name = name; this._service = service; @@ -162,7 +161,7 @@ var DBusService = class { this._service.connect('shutdown', () => this._loop.quit()); } - run() { + async runAsync() { // Bail out when not running under gnome-shell Gio.DBus.watch_name(Gio.BusType.SESSION, 'org.gnome.Shell', @@ -183,6 +182,6 @@ var DBusService = class { null, () => this._loop.quit()); - this._loop.run(); + await this._loop.runAsync(); } -}; +} diff --git a/js/dbusServices/extensions/extensionPrefsDialog.js b/js/dbusServices/extensions/extensionPrefsDialog.js index 7155c1a9539..a16476e78b6 100644 --- a/js/dbusServices/extensions/extensionPrefsDialog.js +++ b/js/dbusServices/extensions/extensionPrefsDialog.js @@ -1,11 +1,15 @@ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- -/* exported ExtensionPrefsDialog */ -const { Adw, Gdk, Gio, GLib, GObject, Gtk } = imports.gi; +import Adw from 'gi://Adw?version=1'; +import Gdk from 'gi://Gdk?version=4.0'; +import Gio from 'gi://Gio'; +import GLib from 'gi://GLib'; +import GObject from 'gi://GObject'; +import Gtk from 'gi://Gtk?version=4.0'; const ExtensionUtils = imports.misc.extensionUtils; -var ExtensionPrefsDialog = GObject.registerClass({ +export const ExtensionPrefsDialog = GObject.registerClass({ GTypeName: 'ExtensionPrefsDialog', }, class ExtensionPrefsDialog extends Adw.PreferencesWindow { _init(extension) { diff --git a/js/dbusServices/extensions/extensionsService.js b/js/dbusServices/extensions/extensionsService.js index d8234d2acb6..ab31a6485b5 100644 --- a/js/dbusServices/extensions/extensionsService.js +++ b/js/dbusServices/extensions/extensionsService.js @@ -1,18 +1,18 @@ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- -/* exported ExtensionsService */ +import Gio from 'gi://Gio'; +import GLib from 'gi://GLib'; +import Shew from 'gi://Shew'; -const { Gio, GLib, Shew } = imports.gi; +import {ExtensionPrefsDialog} from './extensionPrefsDialog.js'; +import {ServiceImplementation} from './dbusService.js'; const ExtensionUtils = imports.misc.extensionUtils; - -const { loadInterfaceXML } = imports.misc.dbusUtils; -const { ExtensionPrefsDialog } = imports.extensionPrefsDialog; -const { ServiceImplementation } = imports.dbusService; +const {loadInterfaceXML} = imports.misc.dbusUtils; const ExtensionsIface = loadInterfaceXML('org.gnome.Shell.Extensions'); const ExtensionsProxy = Gio.DBusProxy.makeProxyWrapper(ExtensionsIface); -var ExtensionsService = class extends ServiceImplementation { +export const ExtensionsService = class extends ServiceImplementation { constructor() { super(ExtensionsIface, '/org/gnome/Shell/Extensions'); diff --git a/js/dbusServices/extensions/main.js b/js/dbusServices/extensions/main.js index 306fe36f5ec..c281a8a16cd 100644 --- a/js/dbusServices/extensions/main.js +++ b/js/dbusServices/extensions/main.js @@ -1,16 +1,12 @@ -/* exported main */ - -imports.gi.versions.Adw = '1'; -imports.gi.versions.Gdk = '4.0'; -imports.gi.versions.Gtk = '4.0'; - -const { Adw, GObject } = imports.gi; +import Adw from 'gi://Adw?version=1'; +import GObject from 'gi://GObject'; const pkg = imports.package; -const { DBusService } = imports.dbusService; -const { ExtensionsService } = imports.extensionsService; +import {DBusService} from './dbusService.js'; +import {ExtensionsService} from './extensionsService.js'; -function main() { +/** @returns {void} */ +export async function main() { Adw.init(); pkg.initFormat(); @@ -19,5 +15,5 @@ function main() { const service = new DBusService( 'org.gnome.Shell.Extensions', new ExtensionsService()); - service.run(); + await service.runAsync(); } diff --git a/js/dbusServices/notifications/main.js b/js/dbusServices/notifications/main.js index 7944cd122a0..14c3f4a871a 100644 --- a/js/dbusServices/notifications/main.js +++ b/js/dbusServices/notifications/main.js @@ -1,11 +1,10 @@ -/* exported main */ +import {DBusService} from './dbusService.js'; +import {NotificationDaemon} from './notificationDaemon.js'; -const { DBusService } = imports.dbusService; -const { NotificationDaemon } = imports.notificationDaemon; - -function main() { +/** @returns {void} */ +export async function main() { const service = new DBusService( 'org.gnome.Shell.Notifications', new NotificationDaemon()); - service.run(); + await service.runAsync(); } diff --git a/js/dbusServices/notifications/notificationDaemon.js b/js/dbusServices/notifications/notificationDaemon.js index b22f4ec1e44..7bb5b7bf023 100644 --- a/js/dbusServices/notifications/notificationDaemon.js +++ b/js/dbusServices/notifications/notificationDaemon.js @@ -1,17 +1,17 @@ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- -/* exported NotificationDaemon */ +import Gio from 'gi://Gio'; +import GLib from 'gi://GLib'; -const { Gio, GLib } = imports.gi; +import {ServiceImplementation} from './dbusService.js'; -const { loadInterfaceXML } = imports.misc.dbusUtils; -const { ServiceImplementation } = imports.dbusService; +const {loadInterfaceXML} = imports.misc.dbusUtils; const NotificationsIface = loadInterfaceXML('org.freedesktop.Notifications'); const NotificationsProxy = Gio.DBusProxy.makeProxyWrapper(NotificationsIface); Gio._promisify(Gio.DBusConnection.prototype, 'call'); -var NotificationDaemon = class extends ServiceImplementation { +export const NotificationDaemon = class extends ServiceImplementation { constructor() { super(NotificationsIface, '/org/freedesktop/Notifications'); diff --git a/js/dbusServices/screencast/main.js b/js/dbusServices/screencast/main.js index 7c71971fb85..26a6224d9ef 100644 --- a/js/dbusServices/screencast/main.js +++ b/js/dbusServices/screencast/main.js @@ -1,14 +1,13 @@ -/* exported main */ +import {DBusService} from './dbusService.js'; +import {ScreencastService} from './screencastService.js'; -const {DBusService} = imports.dbusService; - -function main() { - const {ScreencastService} = imports.screencastService; +/** @returns {void} */ +export async function main() { if (!ScreencastService.canScreencast()) return; const service = new DBusService( 'org.gnome.Shell.Screencast', new ScreencastService()); - service.run(); + await service.runAsync(); } diff --git a/js/dbusServices/screencast/screencastService.js b/js/dbusServices/screencast/screencastService.js index eda5c8293b3..74510237641 100644 --- a/js/dbusServices/screencast/screencastService.js +++ b/js/dbusServices/screencast/screencastService.js @@ -1,14 +1,13 @@ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- -/* exported ScreencastService */ +import Gio from 'gi://Gio'; +import GLib from 'gi://GLib'; +import Gst from 'gi://Gst?version=1.0'; +import Gtk from 'gi://Gtk?version=4.0'; -imports.gi.versions.Gst = '1.0'; -imports.gi.versions.Gtk = '4.0'; +import {ServiceImplementation} from './dbusService.js'; -const { Gio, GLib, Gst, Gtk } = imports.gi; - -const { loadInterfaceXML, loadSubInterfaceXML } = imports.misc.dbusUtils; +const {loadInterfaceXML, loadSubInterfaceXML} = imports.misc.dbusUtils; const Signals = imports.misc.signals; -const { ServiceImplementation } = imports.dbusService; const ScreencastIface = loadInterfaceXML('org.gnome.Shell.Screencast'); @@ -400,7 +399,7 @@ var Recorder = class extends Signals.EventEmitter { } }; -var ScreencastService = class extends ServiceImplementation { +export const ScreencastService = class extends ServiceImplementation { static canScreencast() { if (!Gst.init_check(null)) return false; diff --git a/js/dbusServices/screensaver/main.js b/js/dbusServices/screensaver/main.js index 2a08d14038d..7242c7982f4 100644 --- a/js/dbusServices/screensaver/main.js +++ b/js/dbusServices/screensaver/main.js @@ -1,11 +1,10 @@ -/* exported main */ +import {DBusService} from './dbusService.js'; +import {ScreenSaverService} from './screenSaverService.js'; -const { DBusService } = imports.dbusService; -const { ScreenSaverService } = imports.screenSaverService; - -function main() { +/** @returns {void} */ +export async function main() { const service = new DBusService( 'org.gnome.ScreenSaver', new ScreenSaverService()); - service.run(); + await service.runAsync(); } diff --git a/js/dbusServices/screensaver/screenSaverService.js b/js/dbusServices/screensaver/screenSaverService.js index 2c1546e4263..d0f0db6e38a 100644 --- a/js/dbusServices/screensaver/screenSaverService.js +++ b/js/dbusServices/screensaver/screenSaverService.js @@ -1,15 +1,15 @@ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- -/* exported ScreenSaverService */ +import Gio from 'gi://Gio'; +import GLib from 'gi://GLib'; -const { Gio, GLib } = imports.gi; +import {ServiceImplementation} from './dbusService.js'; -const { loadInterfaceXML } = imports.misc.dbusUtils; -const { ServiceImplementation } = imports.dbusService; +const {loadInterfaceXML} = imports.misc.dbusUtils; const ScreenSaverIface = loadInterfaceXML('org.gnome.ScreenSaver'); const ScreenSaverProxy = Gio.DBusProxy.makeProxyWrapper(ScreenSaverIface); -var ScreenSaverService = class extends ServiceImplementation { +export const ScreenSaverService = class extends ServiceImplementation { constructor() { super(ScreenSaverIface, '/org/gnome/ScreenSaver');