diff --git a/data/dbus-interfaces/org.gnome.Shell.Screencast.xml b/data/dbus-interfaces/org.gnome.Shell.Screencast.xml index b4cd592ab..6512396d9 100644 --- a/data/dbus-interfaces/org.gnome.Shell.Screencast.xml +++ b/data/dbus-interfaces/org.gnome.Shell.Screencast.xml @@ -92,5 +92,9 @@ + + + + diff --git a/js/dbusServices/org.gnome.Shell.Screencast.src.gresource.xml b/js/dbusServices/org.gnome.Shell.Screencast.src.gresource.xml index 292f0f160..a247050e3 100644 --- a/js/dbusServices/org.gnome.Shell.Screencast.src.gresource.xml +++ b/js/dbusServices/org.gnome.Shell.Screencast.src.gresource.xml @@ -7,5 +7,7 @@ misc/config.js misc/dbusUtils.js + misc/signals.js + misc/signalTracker.js diff --git a/js/dbusServices/screencast/screencastService.js b/js/dbusServices/screencast/screencastService.js index 3183a0093..37327e24c 100644 --- a/js/dbusServices/screencast/screencastService.js +++ b/js/dbusServices/screencast/screencastService.js @@ -7,6 +7,7 @@ imports.gi.versions.Gtk = '4.0'; const { Gio, GLib, Gst, Gtk } = imports.gi; const { loadInterfaceXML, loadSubInterfaceXML } = imports.misc.dbusUtils; +const Signals = imports.misc.signals; const { ServiceImplementation } = imports.dbusService; const ScreencastIface = loadInterfaceXML('org.gnome.Shell.Screencast'); @@ -54,13 +55,13 @@ const SessionState = { STOPPED: 'STOPPED', }; -var Recorder = class { +var Recorder = class extends Signals.EventEmitter { constructor(sessionPath, x, y, width, height, filePath, options, - invocation, - onErrorCallback) { + invocation) { + super(); + this._startInvocation = invocation; this._dbusConnection = invocation.get_connection(); - this._onErrorCallback = onErrorCallback; this._stopInvocation = null; this._x = x; @@ -147,11 +148,6 @@ var Recorder = class { log(`Recorder error: ${error.message}`); - if (this._onErrorCallback) { - this._onErrorCallback(); - delete this._onErrorCallback; - } - if (this._startRequest) { this._startRequest.reject(error); delete this._startRequest; @@ -161,6 +157,8 @@ var Recorder = class { this._stopRequest.reject(error); delete this._stopRequest; } + + this.emit('error', error); } _handleFatalPipelineError(message) { @@ -529,8 +527,7 @@ var ScreencastService = class extends ServiceImplementation { screenWidth, screenHeight, filePath, options, - invocation, - () => this._removeRecorder(sender)); + invocation); } catch (error) { log(`Failed to create recorder: ${error.message}`); invocation.return_value(GLib.Variant.new('(bs)', returnValue)); @@ -548,6 +545,12 @@ var ScreencastService = class extends ServiceImplementation { } finally { invocation.return_value(GLib.Variant.new('(bs)', returnValue)); } + + recorder.connect('error', (r, error) => { + this._removeRecorder(sender); + this._dbusImpl.emit_signal('Error', + new GLib.Variant('(s)', [error.message])); + }); } async ScreencastAreaAsync(params, invocation) { @@ -579,8 +582,7 @@ var ScreencastService = class extends ServiceImplementation { width, height, filePath, options, - invocation, - () => this._removeRecorder(sender)); + invocation); } catch (error) { log(`Failed to create recorder: ${error.message}`); invocation.return_value(GLib.Variant.new('(bs)', returnValue)); @@ -598,6 +600,12 @@ var ScreencastService = class extends ServiceImplementation { } finally { invocation.return_value(GLib.Variant.new('(bs)', returnValue)); } + + recorder.connect('error', (r, error) => { + this._removeRecorder(sender); + this._dbusImpl.emit_signal('Error', + new GLib.Variant('(s)', [error.message])); + }); } async StopScreencastAsync(params, invocation) {