Merge branch 'wayland-multiseat-enablement' into 'main'

Multiseat enablement for Wayland (gnome-shell side)

See merge request GNOME/gnome-shell!2230
This commit is contained in:
msizanoen1 2024-06-30 01:53:05 +00:00
commit f401b06370
5 changed files with 42 additions and 25 deletions

View file

@ -0,0 +1,5 @@
<node>
<interface name="org.freedesktop.login1.Seat">
<property name="CanTTY" type="b" access="read"/>
</interface>
</node>

View file

@ -8,6 +8,7 @@
<property name="Remote" type="b" access="read"/>
<property name="Type" type="s" access="read"/>
<property name="State" type="s" access="read"/>
<property name="Seat" type="(so)" access="read"/>
<method name="SetLockedHint">
<arg type="b" direction="in"/>
</method>

View file

@ -16,6 +16,7 @@
<file preprocess="xml-stripblanks">org.freedesktop.impl.portal.PermissionStore.xml</file>
<file preprocess="xml-stripblanks">org.freedesktop.impl.portal.Request.xml</file>
<file preprocess="xml-stripblanks">org.freedesktop.login1.Manager.xml</file>
<file preprocess="xml-stripblanks">org.freedesktop.login1.Seat.xml</file>
<file preprocess="xml-stripblanks">org.freedesktop.login1.Session.xml</file>
<file preprocess="xml-stripblanks">org.freedesktop.login1.User.xml</file>
<file preprocess="xml-stripblanks">org.freedesktop.ModemManager1.Modem.Modem3gpp.xml</file>

View file

@ -1125,11 +1125,13 @@ export const LoginDialog = GObject.registerClass({
conflictingSessionDialog.open();
}
_startSession(serviceName) {
async _startSession(serviceName) {
const seat = await LoginManager.getLoginManager().getCurrentSeatProxy();
this._bindOpacity();
this.ease({
opacity: 0,
duration: _FADE_ANIMATION_TIME,
duration: seat.CanTTY ? _FADE_ANIMATION_TIME : 0,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: () => {
this._greeter.call_start_session_when_ready_sync(serviceName, true, null);

View file

@ -8,10 +8,12 @@ import * as Signals from './signals.js';
import {loadInterfaceXML} from './fileUtils.js';
const SystemdLoginManagerIface = loadInterfaceXML('org.freedesktop.login1.Manager');
const SystemdLoginSeatIface = loadInterfaceXML('org.freedesktop.login1.Seat');
const SystemdLoginSessionIface = loadInterfaceXML('org.freedesktop.login1.Session');
const SystemdLoginUserIface = loadInterfaceXML('org.freedesktop.login1.User');
const SystemdLoginManager = Gio.DBusProxy.makeProxyWrapper(SystemdLoginManagerIface);
const SystemdLoginSeat = Gio.DBusProxy.makeProxyWrapper(SystemdLoginSeatIface);
const SystemdLoginSession = Gio.DBusProxy.makeProxyWrapper(SystemdLoginSessionIface);
const SystemdLoginUser = Gio.DBusProxy.makeProxyWrapper(SystemdLoginUserIface);
@ -106,6 +108,22 @@ class LoginManagerSystemd extends Signals.EventEmitter {
this._sessionRemoved.bind(this));
}
async getCurrentSeatProxy() {
if (this._currentSeat)
return this._currentSeat;
try {
let session = await this.getCurrentSessionProxy();
const [seatName_, objectPath] = session.Seat;
this._currentSeat = new SystemdLoginSeat(Gio.DBus.system,
'org.freedesktop.login1', objectPath);
return this._currentSeat;
} catch (error) {
logError(error, 'Could not get a proxy for the current session');
return null;
}
}
async getCurrentSessionProxy() {
if (this._currentSession)
return this._currentSession;
@ -113,29 +131,15 @@ class LoginManagerSystemd extends Signals.EventEmitter {
let sessionId = GLib.getenv('XDG_SESSION_ID');
if (!sessionId) {
log('Unset XDG_SESSION_ID, getCurrentSessionProxy() called outside a user session. Asking logind directly.');
let [session, objectPath] = this._userProxy.Display;
if (session) {
log(`Will monitor session ${session}`);
sessionId = session;
} else {
log('Failed to find "Display" session; are we the greeter?');
for ([session, objectPath] of this._userProxy.Sessions) {
let sessionProxy = new SystemdLoginSession(Gio.DBus.system,
'org.freedesktop.login1',
objectPath);
log(`Considering ${session}, class=${sessionProxy.Class}`);
if (sessionProxy.Class === 'greeter') {
log(`Yes, will monitor session ${session}`);
sessionId = session;
break;
}
}
if (!sessionId) {
log('No, failed to get session from logind.');
return null;
}
try {
let session = new SystemdLoginSession(Gio.DBus.system,
'org.freedesktop.login1',
'/org/freedesktop/login1/session/auto');
log(`Will monitor session ${session.Id}`);
sessionId = session.Id;
} catch (error) {
logError(error, 'Failed to get session from logind');
return null;
}
}
@ -227,6 +231,10 @@ class LoginManagerDummy extends Signals.EventEmitter {
return new Promise(() => {});
}
getCurrentSeatProxy() {
return new Promise(resolve => resolve(null));
}
canSuspend() {
return new Promise(resolve => resolve({
canSuspend: false,