LightDM: Cross Desktop Display Manager Robert Ancell What is a - - PowerPoint PPT Presentation

lightdm cross desktop display manager robert ancell
SMART_READER_LITE
LIVE PREVIEW

LightDM: Cross Desktop Display Manager Robert Ancell What is a - - PowerPoint PPT Presentation

LightDM: Cross Desktop Display Manager Robert Ancell What is a Display Manager? High level: Run display servers (X) Authenticate users (greeter) Start sessions (GNOME, KDE, XFCE, ...) Remote login (XDMCP) What is a Display


slide-1
SLIDE 1

Robert Ancell LightDM: Cross Desktop Display Manager

slide-2
SLIDE 2

What is a Display Manager?

  • High level:
  • Run display servers (X)
  • Authenticate users (greeter)
  • Start sessions (GNOME, KDE, XFCE, ...)
  • Remote login (XDMCP)
slide-3
SLIDE 3

What is a Display Manager?

  • Low level:
  • Persistent daemon
  • Manage display server and session processes
  • Support multiple logins
  • Switch users
slide-4
SLIDE 4

In the past... ...there was XDM

XDM

slide-5
SLIDE 5

Today... ..we have many

GDM KDM LXDM XDM SLiM uxlaunch

slide-6
SLIDE 6

What's the difference?

GDM KDM LXDM XDM SLiM uxlaunch

slide-7
SLIDE 7

What's the difference?

GTK+ Qt GTK+ X X GDM KDM LXDM XDM SLiM

Mostly different GUIs

uxlaunch

slide-8
SLIDE 8

Why not this?

GTK+ Qt GTK+ X X One Display Manager to rule them all

slide-9
SLIDE 9

Introducing LightDM

  • Freedesktop project
  • Specification (TODO)
  • Sponsored by Canonical for Ubuntu
  • lp:lightdm
  • GPL3
  • C/GObject
slide-10
SLIDE 10

Core features

  • GObject / Qt greeter support
  • Automatic login
  • Guest accounts
  • User switching
  • XDMCP
  • Multi-seat
  • T

est mode

  • Regression tests
slide-11
SLIDE 11

Planned features

  • Wayland support
  • VNC / RDP login
  • Improved two-factor authentication
  • Fallback session support
slide-12
SLIDE 12

Example greeter (GObject)

#include <lightdm.h> static void show_prompt (LightDMGreeter *greeter, const gchar *text, LightDMPromptType type) { lightdm_greeter_respond (greeter, “password”); } static void authentication_complete_cb (LightDMGreeter *greeter) { if (lightdm_greeter_get_is_authenticated (greeter)) lightdm_greeter_start_session_sync (greeter, NULL, NULL); } int main (int argc, char **argv) { GMainLoop *main_loop = g_main_loop_new (NULL, FALSE); LightDMGreeter *greeter = lightdm_greeter_new (); g_signal_connect (greeter, “show-prompt”, G_CALLBACK (show_prompt_cb), NULL); g_signal_connect (greeter, “authentication-complete”, G_CALLBACK (auth_complete_cb), NULL); lightdm_greeter_connect_sync (greeter, NULL); lightdm_greeter_authenticate (greeter, “username”); g_main_loop_run (main_loop); }

slide-13
SLIDE 13

Example greeter (Qt)

#include <TestGreeter> #include <QtCore/QCoreApplication> void TestGreeter::onShowPrompt (QString text, QlightDM::PromptType type) { respond (“password”); } void TestGreeter::onAuthenticationComplete () { if (isAuthenticated ()) startSessionSync (); } int main (int argc, char **argv) { QcoreApplication app (argc, argv); TestGreeter *greeter = new TestGreeter (); connect (greeter, SIGNAL (showPrompt (QString, QlightDM::PromptType)), SLOT(onShowPrompt (QString, QlightDM::PromptType)); connect (greeter, SIGNAL (authenticationComplete ()), SLOT (onAuthenticationComplete ())); greeter.connectSync (); greeter.authenticate (“username”); app.exec (); }

slide-14
SLIDE 14

Example greeter (Python)

from gi.repository import GObject from gi.repository import LightDM def show_prompt (greeter, text, type): greeter.respond (“password”); def authentication_complete_cb (greeter): if (greeter.is_authenticated) Greeter.start_session_sync (); main_loop = Gobject.MainLoop (); greeter = LightDM.Greeter (); greeter.connect (“show-prompt”, show_prompt_cb) greeter.connect (“authentication-complete”, auth_complete_cb) greeter.connect_sync () greeter.authenticate (“username”) main_loop.run ()

slide-15
SLIDE 15

Example greeter (Vala)

class TestGreeter { public static void show_prompt (LightDM.Greeter greeter, string text, LightDM.PromptType type) { greeter.respond (“password”); } public static void authentication_complete_cb (LightDM.Greeter greeter) { if (greeter.is_authenticated) try { greeter.start_session_sync (); } catch (Error e) {} } public static int main (string[] args) { var main_loop = new MainLoop (); var greeter = new LightDM.Greeter (); greeter.show_prompt.connect (show_prompt_cb); greeter,authentication_complete.connect (auth_complete_cb); try { greeter.connect_sync (); } catch (Error e) {} greeter.authenticate (“username”); main_loop.run (); } }

slide-16
SLIDE 16

Demonstration

slide-17
SLIDE 17

How can you help?

  • Distributors – package LightDM
  • Upstream projects – consider if LightDM is right

for you.

  • Developers – Write new greeters
  • Users – test and feedback
slide-18
SLIDE 18

Thanks

  • Brian Cameron (Oracle)
  • David Edmundson (KDE)
  • Guido Berhoerster (OpenSUSE)
  • Yves-Alexis Perez (Debian)

Still have a low bus factor...

slide-19
SLIDE 19

Questions?