mirror of
https://github.com/edu4rdshl/gnome-shell.git
synced 2026-07-18 07:34:54 +00:00
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:
commit
f401b06370
5 changed files with 42 additions and 25 deletions
5
data/dbus-interfaces/org.freedesktop.login1.Seat.xml
Normal file
5
data/dbus-interfaces/org.freedesktop.login1.Seat.xml
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<node>
|
||||
<interface name="org.freedesktop.login1.Seat">
|
||||
<property name="CanTTY" type="b" access="read"/>
|
||||
</interface>
|
||||
</node>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue