@@ -44,6 +44,7 @@ let window_connections = null;
44
44
let dbus_interface = null ;
45
45
46
46
let desktop_entry = null ;
47
+ let systemd_service = null ;
47
48
let dbus_service = null ;
48
49
49
50
const APP_ID = 'com.github.amezin.ddterm' ;
@@ -127,8 +128,28 @@ class ExtensionDBusInterface {
127
128
activate ( ) ;
128
129
}
129
130
130
- Service ( ) {
131
- spawn_app ( ) ;
131
+ ServiceAsync ( params , invocation ) {
132
+ const return_error = err => {
133
+ logError ( err ) ;
134
+
135
+ if ( err instanceof GLib . Error ) {
136
+ invocation . return_gerror ( err ) ;
137
+ } else {
138
+ let name = err . name ;
139
+ if ( ! name . includes ( '.' ) )
140
+ name = `org.gnome.gjs.JSError.${ name } ` ;
141
+
142
+ invocation . return_dbus_error ( name , err . message ) ;
143
+ }
144
+ } ;
145
+
146
+ try {
147
+ const [ args ] = params ;
148
+
149
+ spawn_app ( args ) . then ( ( ) => invocation . return_value ( null ) ) . catch ( return_error ) ;
150
+ } catch ( err ) {
151
+ return_error ( err ) ;
152
+ }
132
153
}
133
154
134
155
MissingDependenciesNotification ( packages , files ) {
@@ -292,6 +313,31 @@ function enable() {
292
313
) ;
293
314
desktop_entry . install ( ) ;
294
315
316
+ systemd_service = new InstallableResource (
317
+ Me . dir . get_child ( 'ddterm' ) . get_child ( 'dbus-com.github.amezin.ddterm.service.in' ) ,
318
+ Gio . File . new_for_path ( GLib . build_filenamev (
319
+ [
320
+ GLib . get_user_runtime_dir ( ) ,
321
+ 'systemd' ,
322
+ 'user' ,
323
+ `dbus-${ APP_ID } .service` ,
324
+ ] ) )
325
+ ) ;
326
+ systemd_service . install ( ) ;
327
+
328
+ Gio . DBus . session . call (
329
+ 'org.freedesktop.systemd1' ,
330
+ '/org/freedesktop/systemd1' ,
331
+ 'org.freedesktop.systemd1.Manager' ,
332
+ 'Reload' ,
333
+ null ,
334
+ null ,
335
+ Gio . DBusCallFlags . NO_AUTO_START ,
336
+ - 1 ,
337
+ null ,
338
+ null
339
+ ) ;
340
+
295
341
dbus_service = new InstallableResource (
296
342
Me . dir . get_child ( 'ddterm' ) . get_child ( 'com.github.amezin.ddterm.service.in' ) ,
297
343
Gio . File . new_for_path ( GLib . build_filenamev (
@@ -372,6 +418,11 @@ function disable() {
372
418
desktop_entry = null ;
373
419
}
374
420
421
+ if ( systemd_service ) {
422
+ systemd_service . uninstall ( ) ;
423
+ systemd_service = null ;
424
+ }
425
+
375
426
if ( dbus_service ) {
376
427
dbus_service . uninstall ( ) ;
377
428
dbus_service = null ;
@@ -380,7 +431,7 @@ function disable() {
380
431
settings = null ;
381
432
}
382
433
383
- function spawn_app ( ) {
434
+ async function spawn_app ( args ) {
384
435
if ( subprocess )
385
436
return ;
386
437
@@ -393,6 +444,7 @@ function spawn_app() {
393
444
Me . dir . get_child ( APP_ID ) . get_path ( ) ,
394
445
'--undecorated' ,
395
446
'--gapplication-service' ,
447
+ ...args ,
396
448
] ;
397
449
398
450
if ( Meta . is_wayland_compositor ( ) ) {
@@ -412,7 +464,30 @@ function spawn_app() {
412
464
else
413
465
subprocess = subprocess_launcher . spawnv ( argv ) ;
414
466
415
- subprocess . wait_async ( null , subprocess_terminated ) ;
467
+ const terminated = new Promise ( resolve => {
468
+ subprocess . wait_async ( null , source => {
469
+ subprocess_terminated ( source ) ;
470
+ resolve ( ) ;
471
+ } ) ;
472
+ } ) ;
473
+
474
+ let available_handler = null ;
475
+
476
+ const registered = new Promise ( resolve => {
477
+ available_handler = app_dbus . connect ( 'notify::available' , source => {
478
+ if ( source . available )
479
+ resolve ( ) ;
480
+ } ) ;
481
+ } ) ;
482
+
483
+ try {
484
+ await Promise . race ( [ terminated , registered ] ) ;
485
+ } finally {
486
+ app_dbus . disconnect ( available_handler ) ;
487
+ }
488
+
489
+ if ( ! subprocess )
490
+ throw new Error ( 'ddterm app exited without acquiring bus name' ) ;
416
491
}
417
492
418
493
function subprocess_terminated ( source ) {
0 commit comments