Add support for gdm greeter session
This commit adds GDM session support. It provides a user list that talks to GDM, handles authentication via PAM, etc. It doesn't currently support fingerprint readers and smartcards. https://bugzilla.gnome.org/show_bug.cgi?id=657082
This commit is contained in:
parent
d4239d570d
commit
9f1da20161
@ -29,6 +29,7 @@ dist_theme_DATA = \
|
|||||||
theme/dash-placeholder.svg \
|
theme/dash-placeholder.svg \
|
||||||
theme/filter-selected-ltr.svg \
|
theme/filter-selected-ltr.svg \
|
||||||
theme/filter-selected-rtl.svg \
|
theme/filter-selected-rtl.svg \
|
||||||
|
theme/gdm.css \
|
||||||
theme/gnome-shell.css \
|
theme/gnome-shell.css \
|
||||||
theme/panel-border.svg \
|
theme/panel-border.svg \
|
||||||
theme/panel-button-border.svg \
|
theme/panel-button-border.svg \
|
||||||
|
161
data/theme/gdm.css
Normal file
161
data/theme/gdm.css
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
/* Copyright 2011, Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU Lesser General Public License,
|
||||||
|
* version 2.1, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT ANY
|
||||||
|
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Login Dialog */
|
||||||
|
|
||||||
|
.login-dialog-title {
|
||||||
|
font-size: 14pt;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #666666;
|
||||||
|
padding-bottom: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog {
|
||||||
|
border-radius: 16px;
|
||||||
|
min-height: 150px;
|
||||||
|
max-height: 700px;
|
||||||
|
min-width: 350px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-user-list-view {
|
||||||
|
-st-vfade-offset: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-user-list {
|
||||||
|
spacing: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-user-list-item {
|
||||||
|
color: #666666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-user-list-item:ltr {
|
||||||
|
padding-right: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-user-list-item:rtl {
|
||||||
|
padding-left: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-user-list-item .login-dialog-user-list-item-name {
|
||||||
|
font-size: 20pt;
|
||||||
|
padding-left: 1em;
|
||||||
|
color: #666666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-user-list-item:hover .login-dialog-user-list-item-name {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-user-list-item:focus .login-dialog-user-list-item-name {
|
||||||
|
color: white;
|
||||||
|
text-shadow: black 0px 2px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-user-list-item-vertical-layout {
|
||||||
|
spacing: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-user-list-item .login-dialog-user-list-item-focus-bin {
|
||||||
|
background-color: rgba(0,0,0,0.0);
|
||||||
|
height: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-user-list-item:focus .login-dialog-user-list-item-focus-bin {
|
||||||
|
background-color: #666666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-user-list-item-icon {
|
||||||
|
border: 2px solid #8b8b8b;
|
||||||
|
border-radius: 8px;
|
||||||
|
width: 64px;
|
||||||
|
height: 64px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-not-listed-button {
|
||||||
|
padding-top: 2em;
|
||||||
|
}
|
||||||
|
.login-dialog-not-listed-label {
|
||||||
|
font-size: 14pt;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #666666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-prompt-layout {
|
||||||
|
padding-bottom: 64px;
|
||||||
|
}
|
||||||
|
.login-dialog-prompt-label {
|
||||||
|
color: white;
|
||||||
|
font-size: 20pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-prompt-entry {
|
||||||
|
padding: 4px;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 2px solid #5656cc;
|
||||||
|
color: black;
|
||||||
|
background-color: white;
|
||||||
|
caret-color: black;
|
||||||
|
caret-size: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-session-list {
|
||||||
|
color: #ffffff;
|
||||||
|
font-size: 10.5pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-session-list-button {
|
||||||
|
padding: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-session-list-button:focus {
|
||||||
|
background-color: #4c4c4c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-session-list-button:active {
|
||||||
|
background-color: #4c4c4c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-session-list-button:hover {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-session-list-scroll-view {
|
||||||
|
background-gradient-start: rgba(80,80,80,0.3);
|
||||||
|
background-gradient-end: rgba(80,80,80,0.7);
|
||||||
|
background-gradient-direction: vertical;
|
||||||
|
box-shadow: inset 0px 2px 4px rgba(0,0,0,0.9);
|
||||||
|
border-radius: 8px;
|
||||||
|
border: 1px solid rgba(80,80,80,1.0);
|
||||||
|
padding: .5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-session-list-item:focus {
|
||||||
|
background-color: #666666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-session-list-triangle {
|
||||||
|
padding-right: .5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-session-list-item-box {
|
||||||
|
spacing: .25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-session-list-item-dot {
|
||||||
|
width: .75em;
|
||||||
|
height: .75em;
|
||||||
|
}
|
@ -3,6 +3,7 @@ jsdir = $(pkgdatadir)/js
|
|||||||
|
|
||||||
nobase_dist_js_DATA = \
|
nobase_dist_js_DATA = \
|
||||||
gdm/batch.js \
|
gdm/batch.js \
|
||||||
|
gdm/loginDialog.js \
|
||||||
misc/config.js \
|
misc/config.js \
|
||||||
misc/docInfo.js \
|
misc/docInfo.js \
|
||||||
misc/fileUtils.js \
|
misc/fileUtils.js \
|
||||||
|
1262
js/gdm/loginDialog.js
Normal file
1262
js/gdm/loginDialog.js
Normal file
File diff suppressed because it is too large
Load Diff
@ -71,6 +71,7 @@ let _errorLogStack = [];
|
|||||||
let _startDate;
|
let _startDate;
|
||||||
let _defaultCssStylesheet = null;
|
let _defaultCssStylesheet = null;
|
||||||
let _cssStylesheet = null;
|
let _cssStylesheet = null;
|
||||||
|
let _gdmCssStylesheet = null;
|
||||||
|
|
||||||
let background = null;
|
let background = null;
|
||||||
|
|
||||||
@ -86,6 +87,17 @@ function _createUserSession() {
|
|||||||
networkAgent = new NetworkAgent.NetworkAgent();
|
networkAgent = new NetworkAgent.NetworkAgent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function _createGDMSession() {
|
||||||
|
// We do this this here instead of at the top to prevent GDM
|
||||||
|
// related code from getting loaded in normal user sessions
|
||||||
|
const LoginDialog = imports.gdm.loginDialog;
|
||||||
|
|
||||||
|
let loginDialog = new LoginDialog.LoginDialog();
|
||||||
|
loginDialog.connect('loaded', function() {
|
||||||
|
loginDialog.open();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function _initRecorder() {
|
function _initRecorder() {
|
||||||
let recorderSettings = new Gio.Settings({ schema: 'org.gnome.shell.recorder' });
|
let recorderSettings = new Gio.Settings({ schema: 'org.gnome.shell.recorder' });
|
||||||
|
|
||||||
@ -175,6 +187,7 @@ function start() {
|
|||||||
global.stage.no_clear_hint = true;
|
global.stage.no_clear_hint = true;
|
||||||
|
|
||||||
_defaultCssStylesheet = global.datadir + '/theme/gnome-shell.css';
|
_defaultCssStylesheet = global.datadir + '/theme/gnome-shell.css';
|
||||||
|
_gdmCssStylesheet = global.datadir + '/theme/gdm.css';
|
||||||
loadTheme();
|
loadTheme();
|
||||||
|
|
||||||
// Set up stage hierarchy to group all UI actors under one container.
|
// Set up stage hierarchy to group all UI actors under one container.
|
||||||
@ -197,7 +210,11 @@ function start() {
|
|||||||
keyboard = new Keyboard.Keyboard();
|
keyboard = new Keyboard.Keyboard();
|
||||||
notificationDaemon = new NotificationDaemon.NotificationDaemon();
|
notificationDaemon = new NotificationDaemon.NotificationDaemon();
|
||||||
windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler();
|
windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler();
|
||||||
_createUserSession();
|
|
||||||
|
if (global.session_type == Shell.SessionType.USER)
|
||||||
|
_createUserSession();
|
||||||
|
else if (global.session_type == Shell.SessionType.GDM)
|
||||||
|
_createGDMSession();
|
||||||
|
|
||||||
panel.startStatusArea();
|
panel.startStatusArea();
|
||||||
|
|
||||||
@ -434,6 +451,9 @@ function loadTheme() {
|
|||||||
|
|
||||||
let theme = new St.Theme ({ application_stylesheet: cssStylesheet });
|
let theme = new St.Theme ({ application_stylesheet: cssStylesheet });
|
||||||
|
|
||||||
|
if (global.session_type == Shell.SessionType.GDM)
|
||||||
|
theme.load_stylesheet(_gdmCssStylesheet);
|
||||||
|
|
||||||
if (previousTheme) {
|
if (previousTheme) {
|
||||||
let customStylesheets = previousTheme.get_custom_stylesheets();
|
let customStylesheets = previousTheme.get_custom_stylesheets();
|
||||||
|
|
||||||
|
@ -45,6 +45,14 @@ try {
|
|||||||
log('NMApplet is not supported. It is possible that your NetworkManager version is too old');
|
log('NMApplet is not supported. It is possible that your NetworkManager version is too old');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const GDM_TRAY_ICON_ORDER = ['a11y', 'display', 'keyboard', 'volume', 'battery'];
|
||||||
|
const GDM_TRAY_ICON_SHELL_IMPLEMENTATION = {
|
||||||
|
'a11y': imports.ui.status.accessibility.ATIndicator,
|
||||||
|
'volume': imports.ui.status.volume.Indicator,
|
||||||
|
'battery': imports.ui.status.power.Indicator,
|
||||||
|
'keyboard': imports.ui.status.keyboard.XKBIndicator
|
||||||
|
};
|
||||||
|
|
||||||
// To make sure the panel corners blend nicely with the panel,
|
// To make sure the panel corners blend nicely with the panel,
|
||||||
// we draw background and borders the same way, e.g. drawing
|
// we draw background and borders the same way, e.g. drawing
|
||||||
// them as filled shapes from the outside inwards instead of
|
// them as filled shapes from the outside inwards instead of
|
||||||
@ -876,6 +884,14 @@ Panel.prototype = {
|
|||||||
this.actor.remove_style_class_name('in-overview');
|
this.actor.remove_style_class_name('in-overview');
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
if (global.session_type == Shell.SessionType.GDM) {
|
||||||
|
this._tray_icon_order = GDM_TRAY_ICON_ORDER;
|
||||||
|
this._tray_icon_shell_implementation = GDM_TRAY_ICON_SHELL_IMPLEMENTATION;
|
||||||
|
} else {
|
||||||
|
this._tray_icon_order = STANDARD_TRAY_ICON_ORDER;
|
||||||
|
this._tray_icon_shell_implementation = STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION;
|
||||||
|
}
|
||||||
|
|
||||||
this._menus = new PopupMenu.PopupMenuManager(this);
|
this._menus = new PopupMenu.PopupMenuManager(this);
|
||||||
|
|
||||||
this._leftBox = new St.BoxLayout({ name: 'panelLeft' });
|
this._leftBox = new St.BoxLayout({ name: 'panelLeft' });
|
||||||
@ -1026,9 +1042,9 @@ Panel.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
startStatusArea: function() {
|
startStatusArea: function() {
|
||||||
for (let i = 0; i < STANDARD_TRAY_ICON_ORDER.length; i++) {
|
for (let i = 0; i < this._tray_icon_order.length; i++) {
|
||||||
let role = STANDARD_TRAY_ICON_ORDER[i];
|
let role = this._tray_icon_order[i];
|
||||||
let constructor = STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION[role];
|
let constructor = this._tray_icon_shell_implementation[role];
|
||||||
if (!constructor) {
|
if (!constructor) {
|
||||||
// This icon is not implemented (this is a bug)
|
// This icon is not implemented (this is a bug)
|
||||||
continue;
|
continue;
|
||||||
@ -1069,13 +1085,13 @@ Panel.prototype = {
|
|||||||
_onTrayIconAdded: function(o, icon, role) {
|
_onTrayIconAdded: function(o, icon, role) {
|
||||||
icon.height = PANEL_ICON_SIZE;
|
icon.height = PANEL_ICON_SIZE;
|
||||||
|
|
||||||
if (STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION[role]) {
|
if (this._tray_icon_shell_implementation[role]) {
|
||||||
// This icon is legacy, and replaced by a Shell version
|
// This icon is legacy, and replaced by a Shell version
|
||||||
// Hide it
|
// Hide it
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Figure out the index in our well-known order for this icon
|
// Figure out the index in our well-known order for this icon
|
||||||
let position = STANDARD_TRAY_ICON_ORDER.indexOf(role);
|
let position = this._tray_icon_order.indexOf(role);
|
||||||
icon._rolePosition = position;
|
icon._rolePosition = position;
|
||||||
let children = this._trayBox.get_children();
|
let children = this._trayBox.get_children();
|
||||||
let i;
|
let i;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user