[26290] in Source-Commits
Re: /svn/athena r25494 - trunk/debathena/config/lightdm-config/debian
daemon@ATHENA.MIT.EDU (Jonathan Reed)
Thu May 10 21:18:23 2012
Content-Type: text/plain; charset=us-ascii
Mime-Version: 1.0 (Apple Message framework v1084)
From: Jonathan Reed <jdreed@MIT.EDU>
In-Reply-To: <201205110111.q4B1B3Wx026736@drugstore.mit.edu>
Date: Thu, 10 May 2012 21:18:20 -0400
Message-Id: <20E2ACD3-1710-438E-8318-678F0A1C38EA@mit.edu>
To: "source-commits@mit.edu" <source-commits@MIT.EDU>
Content-Transfer-Encoding: 8bit
Some notes:
- The power and accessibility menus don't work yet.
- This is just the greeter, and doesn't actually configure lightdm to use said greeter. (We may want to separate it out into another package). The question is, how best to deal with configuring it. Other greeters use lightdm-set-defaults -k, which only modifies the greeter if there isn't one already set. But there will always be one already set. So as I see it, we have a couple of options:
1) Use lightdm-set-defaults and force the greeter to be ours, and on uninstall, force it back to, in order of preference, unity-greeter, lightdm-gtk-greeter, or the first thing we find in /usr/share/xgreeters
2) Like step 1, but use Debconf to ask the user, and preseed the debconf value on -cluster installs. I think we have to care about priority, here, right? Because Ubuntu ignores things less than 'high'?
3) Use c-p-d and divert lightdm.conf. However, the user may have had other settings in lightdm.conf at the time that they cared about. And frankly, the only setting we'd really touch is "greeter-session", which decides what greeter to run. Everything else is advisory (e.g. whether to allow shutdowns) and we can choose to override those advisory settings on -cluster (e.g. never allow suspend/hibernate on cluster, regardless of what the conf file says.
4) Do something else.
That's roughly my order of preference. If nobody express an opinion, I'm going to go with #1.
-Jon
On May 10, 2012, at 9:11 PM, Jonathan D Reed wrote:
> Author: jdreed
> Date: 2012-05-10 21:11:03 -0400 (Thu, 10 May 2012)
> New Revision: 25494
>
> Added:
> trunk/debathena/config/lightdm-config/debian/background.jpg
> trunk/debathena/config/lightdm-config/debian/debathena-lightdm-config.install
> trunk/debathena/config/lightdm-config/debian/debathena-lightdm-greeter
> trunk/debathena/config/lightdm-config/debian/debathena-lightdm-greeter.desktop
> trunk/debathena/config/lightdm-config/debian/debathena-lightdm-greeter.ui
> trunk/debathena/config/lightdm-config/debian/debathena.png
> trunk/debathena/config/lightdm-config/debian/debathena1.png
> trunk/debathena/config/lightdm-config/debian/debathena2.png
> trunk/debathena/config/lightdm-config/debian/debathena3.png
> trunk/debathena/config/lightdm-config/debian/debathena4.png
> trunk/debathena/config/lightdm-config/debian/debathena5.png
> trunk/debathena/config/lightdm-config/debian/debathena6.png
> trunk/debathena/config/lightdm-config/debian/debathena7.png
> trunk/debathena/config/lightdm-config/debian/debathena8.png
> Removed:
> trunk/debathena/config/lightdm-config/debian/transform_lightdm.conf.debathena
> Modified:
> trunk/debathena/config/lightdm-config/debian/control.in
> trunk/debathena/config/lightdm-config/debian/copyright
> trunk/debathena/config/lightdm-config/debian/rules
> Log:
> Initial checkin of functional greeter
>
> Copied: trunk/debathena/config/lightdm-config/debian/background.jpg (from rev 25474, trunk/debathena/config/gdm-config/debian/background.jpg)
> ===================================================================
> (Binary files differ)
>
> Modified: trunk/debathena/config/lightdm-config/debian/control.in
> ===================================================================
> --- trunk/debathena/config/lightdm-config/debian/control.in 2012-05-10 14:17:27 UTC (rev 25493)
> +++ trunk/debathena/config/lightdm-config/debian/control.in 2012-05-11 01:11:03 UTC (rev 25494)
> @@ -2,13 +2,14 @@
> Section: debathena-config/gnome
> Priority: extra
> Maintainer: Debathena Project <debathena@mit.edu>
> -Build-Depends: @cdbs@, lightdm
> +Build-Depends: @cdbs@
> Standards-Version: 3.9.1
>
> Package: debathena-lightdm-config
> Architecture: all
> -Depends: lightdm
> -Provides: ${diverted-files}
> -Conflicts: ${diverted-files}
> +Depends: lightdm,
> + python, python-gobject,
> + gir1.2-lightdm-1, gir1.2-glib-2.0, gir1.2-gtk-3.0,
> + ${misc:Depends}
> Description: Lightdm configuration for Debathena
> This package configures the lightdm display manager.
>
> Modified: trunk/debathena/config/lightdm-config/debian/copyright
> ===================================================================
> --- trunk/debathena/config/lightdm-config/debian/copyright 2012-05-10 14:17:27 UTC (rev 25493)
> +++ trunk/debathena/config/lightdm-config/debian/copyright 2012-05-11 01:11:03 UTC (rev 25494)
> @@ -1,5 +1,37 @@
> -This software and its Debian packaging are licensed as follows:
> +The "debathena-lightdm-greeter" Python script is copyright (c) 2012,
> +Massachusetts Institute of Technology and is licensed under version 3
> +of the GNU General Public License. The script incorporates some code
> +from and the basic design of example_greeter.py by Matt Fischer. The
> +original copyright notice from example_greeter.py appears below:
>
> + # Author: Matt Fischer <matthew.fischer@canonical.com>
> + # Copyright (C) 2012 Canonical, Ltd
> + #
> + # This program is free software: you can redistribute it and/or
> + # modify it under the terms of the GNU General Public License as
> + # published by the Free Software Foundation, either version 3 of
> + # the License, or (at your option) any later version. See
> + # http://www.gnu.org/copyleft/gpl.html the full text of the
> + # license.
> + #
> + # This code is based on the LightDM GTK Greeter which was written by:
> + # Robert Ancell <robert.ancell@canonical.com>
> +
> +Debian policy requires us to inform you that instead of viewing the
> +GNU General Public License on the GNU website, you should instead look
> +at /usr/share/common-licenses/GPL-3.
> +
> +The owl's blinking functionality was added by Benjamin Barenblat
> +<bbaren@mit.edu>.
> +
> +The image of MIT Building 10 (debian/background.jpg)
> +is adapted from
> + http://www.flickr.com/photos/22240293@N05/3930252680/
> +taken by Flickr user "Diez Photography" and licensed under CC-BY 2.0:
> + http://creativecommons.org/licenses/by/2.0/deed.en
> +
> +The rest of the software and its Debian packaging are licensed as follows:
> +
> Copyright (c) 2012, Massachusetts Institute of Technology
> All rights reserved.
>
>
> Added: trunk/debathena/config/lightdm-config/debian/debathena-lightdm-config.install
> ===================================================================
> --- trunk/debathena/config/lightdm-config/debian/debathena-lightdm-config.install (rev 0)
> +++ trunk/debathena/config/lightdm-config/debian/debathena-lightdm-config.install 2012-05-11 01:11:03 UTC (rev 25494)
> @@ -0,0 +1,14 @@
> +debian/background.jpg usr/share/debathena-lightdm-config
> +debian/debathena-lightdm-greeter usr/sbin
> +debian/debathena-lightdm-greeter.ui usr/share/debathena-lightdm-config
> +debian/debathena.png usr/share/pixmaps
> +debian/debathena1.png usr/share/pixmaps
> +debian/debathena2.png usr/share/pixmaps
> +debian/debathena3.png usr/share/pixmaps
> +debian/debathena4.png usr/share/pixmaps
> +debian/debathena5.png usr/share/pixmaps
> +debian/debathena6.png usr/share/pixmaps
> +debian/debathena7.png usr/share/pixmaps
> +debian/debathena8.png usr/share/pixmaps
> +debian/debathena-lightdm-greeter.desktop usr/share/xgreeters
> +
>
> Added: trunk/debathena/config/lightdm-config/debian/debathena-lightdm-greeter
> ===================================================================
> --- trunk/debathena/config/lightdm-config/debian/debathena-lightdm-greeter (rev 0)
> +++ trunk/debathena/config/lightdm-config/debian/debathena-lightdm-greeter 2012-05-11 01:11:03 UTC (rev 25494)
> @@ -0,0 +1,412 @@
> +#!/usr/bin/env python
> +#
> +
> +from gi.repository import GObject
> +from gi.repository import GLib
> +from gi.repository import Gtk
> +from gi.repository import Gdk
> +from gi.repository import GdkPixbuf
> +from gi.repository import LightDM
> +
> +import sys
> +import platform
> +import subprocess
> +import pwd
> +import time
> +
> +# TODO: ConfigParser
> +MIN_UID=1
> +UI_FILE="/usr/share/debathena-lightdm-config/debathena-lightdm-greeter.ui"
> +BG_IMG_FILE="/usr/share/debathena-lightdm-config/background.jpg"
> +DEBATHENA_LOGO_FILES=["/usr/share/pixmaps/debathena.png",
> + "/usr/share/pixmaps/debathena1.png",
> + "/usr/share/pixmaps/debathena2.png",
> + "/usr/share/pixmaps/debathena3.png",
> + "/usr/share/pixmaps/debathena4.png",
> + "/usr/share/pixmaps/debathena5.png",
> + "/usr/share/pixmaps/debathena6.png",
> + "/usr/share/pixmaps/debathena7.png",
> + "/usr/share/pixmaps/debathena8.png"]
> +
> +class DebathenaGreeter:
> + animation_loop_frames = 300
> +
> +
> + def _debug(self, *args):
> + if self.debugMode:
> + if type(args[0]) is str and len(args) > 1:
> + print >> sys.stderr, "D: " + args[0], args[1:]
> + else:
> + print >> sys.stderr, "D:", args[0]
> +
> + def __init__(self):
> + self.debugMode = True
> + self.timePedantry = True
> +
> + # Set up and connect to the greeter
> + self.greeter = LightDM.Greeter()
> + self.greeter.connect("authentication-complete",
> + self.cbAuthenticationComplete)
> + self.greeter.connect("show-message", self.cbShowMessage)
> + self.greeter.connect("show-prompt", self.cbShowPrompt)
> + self.greeter.connect_sync()
> +
> + # Gtk signal handlers
> + handlers = {
> + "login_cb": self.cbLogin,
> + "cancel_cb": self.cancelLogin,
> + "kpEvent": self.cbKeyPress,
> + "power_cb": self.showPowerDialog,
> + "access_cb": self.showAccessDialog,
> + }
> +
> + # Save the screen size for various window operations
> + defaultScreen = Gdk.Screen.get_default()
> + self.screenSize = (defaultScreen.width(), defaultScreen.height())
> +
> + # Load the UI and get objects we care about
> + self.builder = Gtk.Builder()
> + self.builder.add_from_file(UI_FILE)
> +
> + # The login window
> + self.winLogin = self.builder.get_object("winLogin")
> + # A box containing the prompt label, entry, and a spinner
> + self.prompt_box = self.builder.get_object("boxPrompt")
> + self.prompt_label = self.builder.get_object("lblPrompt")
> + self.prompt_entry = self.builder.get_object("entryPrompt")
> + self.loginSpinner = self.builder.get_object("loginSpinner")
> + # A label where we display messages received from the greeter
> + self.message_label = self.builder.get_object("lblMessage")
> + # The owl
> + self.imgDebathena = self.builder.get_object("imgDebathena")
> + # The workstation's hostname
> + lblHostname = self.builder.get_object("lblHostname")
> + lblHostname.set_text(LightDM.get_hostname())
> + # The buttons
> + self.btnCancel = self.builder.get_object("btnCancel")
> + self.btnLogin = self.builder.get_object("btnLogin")
> + # The session combo box
> + self.cmbSession = self.builder.get_object("cmbSession")
> + self.sessionBox = self.builder.get_object("sessionBox")
> + for s in LightDM.get_sessions():
> + self.cmbSession.append(s.get_key(), s.get_name())
> + # Select the first session
> + # TODO: Select the configured default session or the user's session
> + self.cmbSession.set_active(0)
> +
> + # Scaling factor for smaller displays
> + logoScale = 0.40 if self.screenSize[1] <= 768 else 0.60
> + self.animate = self.setup_owl(logoScale)
> +
> + self.winLogin.set_position(Gtk.WindowPosition.CENTER)
> + self.winLogin.show()
> + self.initBackgroundWindow()
> + self.initPanelWindow()
> + self.initBrandingWindow()
> + # Connect Gtk+ signal handlers
> + self.builder.connect_signals(handlers)
> + # GNOME 3 turns off button images by default. Turn it on
> + # for the "Panel" window
> + s = Gtk.Settings.get_default()
> + s.set_property('gtk-button-images', True)
> + # Set a cursor for the root window, otherwise there isn't one
> + rw = Gdk.get_default_root_window()
> + rw.set_cursor(Gdk.Cursor(Gdk.CursorType.LEFT_PTR))
> + # Setup the login window for first login
> + self.resetLoginWindow()
> +
> + def initBackgroundWindow(self):
> + # The background image
> + self.winBg = self.builder.get_object("winBg")
> + self.imgBg = self.builder.get_object("imgBg")
> + self.imgBg.set_from_file(BG_IMG_FILE)
> + self.winBg.show_all()
> +
> + def initPanelWindow(self):
> + # A window that looks like the GNOME "panel" at the top of the screen
> + self.winPanel = self.builder.get_object("winPanel")
> + self.lblTime = self.builder.get_object("lblTime")
> + self.winPanel.set_gravity(Gdk.Gravity.NORTH_WEST)
> + self.winPanel.move(0,0)
> + self.winPanel.set_size_request(self.screenSize[0], 2)
> + self.winPanel.show_all()
> +
> + def initBrandingWindow(self):
> + # The "branding window", in the bottom right
> + winBranding = self.builder.get_object("winBranding")
> + lblBranding = self.builder.get_object("lblBranding")
> + (metapackage, baseos) = self.get_workstation_information()
> + arch = platform.machine()
> + if arch != "x86_64":
> + arch = "<b>" + arch + "</b>"
> + # Possibly no longer needed, workaround for a Glade bug in Gtk+ 2
> + lblBranding.set_property('can_focus', False)
> + winBranding.set_property('can_focus', False)
> + lblBranding.set_markup(metapackage + "\n" + baseos + "\n" + arch)
> + winBranding.set_gravity(Gdk.Gravity.SOUTH_EAST)
> + width, height = winBranding.get_size()
> + winBranding.move(self.screenSize[0] - width, self.screenSize[1] - height)
> + winBranding.show_all()
> +
> + def showPowerDialog(self, widget):
> + pass
> +
> + def showAccessDialog(self, widget):
> + pass
> +
> + # Update the time in the "panel"
> + def updateTime(self):
> + timeFmt="%a, %b %e %Y %l:%M" + ":%S" if self.timePedantry else ""
> + # every second counts
> + timeFmt=timeFmt + " %p"
> + self.lblTime.set_text(time.strftime(timeFmt, time.localtime(time.time())))
> + return True
> +
> + # Reset the UI and prepare for a new login
> + def resetLoginWindow(self):
> + self.spin(False)
> + self.clearMessage()
> + self.btnCancel.hide()
> + self.sessionBox.hide()
> + self.prompted=False
> + self.prompt_label.set_text("")
> + self.prompt_entry.set_text("")
> + self.prompt_box.hide()
> + self.btnLogin.grab_focus()
> + # Because there's no WM, we need to focus the actual X window
> + Gdk.Window.focus(self.winLogin.get_window(), Gdk.CURRENT_TIME)
> +
> + def getSelectedSession(self):
> + i = self.cmbSession.get_active_iter()
> + session_name = self.cmbSession.get_model().get_value(i, 1)
> + self._debug("selected session is " + session_name)
> + return session_name
> +
> + def startOver(self):
> + self.greeter.cancel_authentication()
> + self.greeter.authenticate(None)
> +
> + # LightDM Callbacks
> + # The workflow is this:
> + # - call .authenticate() with a username
> + # - lightdm responds with a prompt for password
> + # - call .respond with whatever the user provides
> + # - lightdm responds with authentication-complete
> + # N.B. complete != successful
> + # - .cancel_authentication will cancel the authentication in progress
> + # call .authenticate with a new username to restart it
> + #
> + # Calling .authenticate with None (or NULL in C) will cause lightdm
> + # to first prompt for a username, then a password. This means two
> + # show-prompt callbacks and thus two .respond calls
> +
> + # This callback is called when the authentication process is
> + # complete. "complete" means a username and password have been
> + # received, and PAM has done its thing. "complete" does not
> + # mean "successful".
> + def cbAuthenticationComplete(self, greeter):
> + self.spin(False)
> + self._debug("cbAuthenticationComplete: received authentication-complete message")
> + if greeter.get_is_authenticated():
> + self.spin(True)
> + self._debug("Authentication was successful.")
> + session_name = self.getSelectedSession()
> + #FIXME: Make sure it's a valid session
> + self._debug("User has selected '%s' session" % (session_name))
> + if not greeter.start_session_sync(session_name):
> + self._debug("Failed to start session")
> + print >> sys.stderr, "Failed to start session"
> + else:
> + self._debug("Authentication failed.")
> + self.displayMessage("Authentication failed, please try again")
> + self.greeter.authenticate(None)
> +
> + # The show-prompt message is emitted when LightDM wants you to
> + # show a prompt to the user, and respond with the user's response.
> + # Currently, the prompts we care about are "login:" and
> + # "Password: " (yes, with the trailing space), which ask for the
> + # username and password respectively. promptType is one of
> + # LightDM.PromptType.SECRET or LightDM.PromptType.QUESTION, which
> + # mean that the text of the user's response should or should not be
> + # masked/invisible, respectively.
> +
> + def cbShowPrompt(self, greeter, text, promptType):
> + self._debug("cbShowPrompt: Received show-prompt message: ",
> + text, promptType)
> + self.prompted=True
> + # Make things pretty
> + if text == "login:":
> + text = "Username: "
> + # Sanity check the username
> + currUser = self.greeter.get_authentication_user()
> + if currUser:
> + self._debug("Current user being authenticated is " + currUser)
> + # See if the user exists
> + try:
> + passwd=pwd.getpwnam(currUser)
> + except KeyError:
> + # Why are we not using the message label here?
> + # Because what will happen is that someone will quickly
> + # typo their username, and then type their password without
> + # looking at the screen, which would otherwise result in the
> + # window resetting after the first error, and then they end
> + # up typing their password into the username box.
> + self.errDialog("Invalid username '%s'" % (currUser))
> + self.startOver()
> + return True
> + # There's probably a better way
> + if passwd.pw_uid < MIN_UID:
> + self.errDialog("Logging in as '%s' disallowed by configuation" % (currUser))
> + self.startOver()
> + return True
> +
> + # Set the label to the value of the prompt
> + self.prompt_label.set_text(text)
> + # clear the entry and get focus
> + self.prompt_entry.set_text("")
> + self.prompt_entry.set_sensitive(True)
> + self.prompt_box.show()
> + self.prompt_entry.grab_focus()
> + # Mask the input if requested
> + if promptType == LightDM.PromptType.SECRET:
> + self.prompt_entry.set_visibility(False)
> + else:
> + self.prompt_entry.set_visibility(True)
> + self.spin(False)
> +
> + # show-message is emitted when LightDM has something to say to the user
> + # In testing, I have never encountered this. Note that this is _not_
> + # "authentication failed", as far as I can tell. Some docs imply
> + # that is is for those types of messages or PAM messages, but that
> + # contradicts the docs which say to check .is_authenticated() in
> + # the authentication-complete callback to determine login success or
> + # failure. "Whatever".
> + #
> + # In theory, messageType is one of LightDM.MessageType.{ERROR,INFO}
> + def cbShowMessage(self, text, messageType):
> + self._debug("cbShowMessage: Received show-messsage message",
> + text, messageType)
> + self.displayMessage(text)
> + self.spin(False)
> +
> + def cbKeyPress(self, widget, event):
> + if event.keyval == Gdk.KEY_Escape:
> + self.cancelLogin(widget)
> +
> + def cancelLogin(self, widget=None):
> + self._debug("Cancelling authentication. User=",
> + self.greeter.get_authentication_user())
> + self.greeter.cancel_authentication()
> + self.resetLoginWindow()
> +
> + def displayMessage(self, msg):
> + self.message_label.set_text(msg)
> + self.message_label.show()
> +
> + def clearMessage(self):
> + self.message_label.set_text("")
> + self.message_label.hide()
> +
> + def errDialog(self, errText):
> + dlg = Gtk.MessageDialog(self.winLogin,
> + Gtk.DialogFlags.DESTROY_WITH_PARENT,
> + Gtk.MessageType.ERROR,
> + Gtk.ButtonsType.CLOSE,
> + errText)
> + dlg.run()
> + dlg.destroy()
> +
> +
> + def spin(self, start):
> + if start:
> + self.loginSpinner.show()
> + self.loginSpinner.start()
> + else:
> + self.loginSpinner.stop()
> + self.loginSpinner.hide()
> +
> + # Some greeter implementations check .get_is_authenticated() here
> + # and then start the session. I think that's only relevant
> + # dealing with a user-picker and passwordless users (that is, you
> + # would call .authenticate(joeuser), and then click the button,
> + # and you'd just be logged in. But we disable the user picker, so
> + # that's not relevant.
> + def cbLogin(self, widget):
> + self.clearMessage()
> + self._debug("In cbLogin")
> + if self.prompted:
> + response = self.prompt_entry.get_text()
> + self._debug("Sending response to prompt", response if self.prompt_entry.get_visibility() else "[redacted]")
> + self.spin(True)
> + self.greeter.respond(response)
> + self.prompted=False
> + else:
> + self._debug("No prompt. Beginning new authentication process.")
> + # Show the "Cancel" button"
> + self.sessionBox.show()
> + self.btnCancel.show()
> + self.greeter.authenticate(None)
> +
> + # Load the Debathena owl image and generate self.logo_pixbufs, the list of
> + # animation frames. Returns True if successful, False otherwise.
> + def setup_owl(self,logoScale):
> + self.logo_pixbufs = []
> + num_pixbufs = 0
> + # Eyes go closed.
> + for img in DEBATHENA_LOGO_FILES:
> + try:
> + pixbuf = GdkPixbuf.Pixbuf.new_from_file(img)
> + self.logo_pixbufs.append(pixbuf.scale_simple(int(pixbuf.get_width() * logoScale), int(pixbuf.get_height() * logoScale), GdkPixbuf.InterpType.BILINEAR))
> + num_pixbufs += 1
> + except Glib.Gerror, e:
> + print >> sys.stderr, "Glib Error:", e
> + return False
> + # Eyes come open.
> + for pixbuf in self.logo_pixbufs[::-1]:
> + self.logo_pixbufs.append(pixbuf)
> + num_pixbufs += 1
> + # Eyes stay open.
> + self.logo_pixbufs.extend([None] * (self.animation_loop_frames - num_pixbufs))
> + self.img_idx = -1
> + # Set it to the first image so that the window can size itself
> + # accordingly
> + self.imgDebathena.set_from_pixbuf(self.logo_pixbufs[0])
> + self._debug("Owl setup done")
> + return True
> +
> + def update_owl(self):
> + if not self.animate:
> + self._debug("Owl loading failed, ending update_owl timer")
> + return False
> +
> + self.img_idx = (self.img_idx + 1) % self.animation_loop_frames
> + pixbuf = self.logo_pixbufs[self.img_idx]
> + if pixbuf is not None:
> + self.imgDebathena.set_from_pixbuf(pixbuf)
> + return True
> +
> +
> + def get_workstation_information(self):
> + try:
> + metapackage = subprocess.Popen(["machtype", "-L"], stdout=subprocess.PIPE).communicate()[0].rstrip()
> + except OSError:
> + metapackage = '(error)'
> + try:
> + baseos = subprocess.Popen(["machtype", "-E"], stdout=subprocess.PIPE).communicate()[0].rstrip()
> + except OSError:
> + baseos = '(error)'
> +
> + return (metapackage, baseos)
> +
> +
> +
> +if __name__ == '__main__':
> + Gtk.init(None);
> + main_loop = GObject.MainLoop ()
> + dagreeter = DebathenaGreeter()
> + # Add a timeout for the owl animation
> + GObject.timeout_add(50, dagreeter.update_owl)
> + # Add a timeout for the clock in the panel
> + GObject.timeout_add(30, dagreeter.updateTime)
> +
> + main_loop.run ()
>
>
> Property changes on: trunk/debathena/config/lightdm-config/debian/debathena-lightdm-greeter
> ___________________________________________________________________
> Added: svn:executable
> + *
>
> Added: trunk/debathena/config/lightdm-config/debian/debathena-lightdm-greeter.desktop
> ===================================================================
> --- trunk/debathena/config/lightdm-config/debian/debathena-lightdm-greeter.desktop (rev 0)
> +++ trunk/debathena/config/lightdm-config/debian/debathena-lightdm-greeter.desktop 2012-05-11 01:11:03 UTC (rev 25494)
> @@ -0,0 +1,5 @@
> +[Desktop Entry]
> +Name=Debathena Greeter
> +Comment=Debathena greeter for LightDM
> +Exec=debathena-lightdm-greeter
> +Type=Application
>
> Added: trunk/debathena/config/lightdm-config/debian/debathena-lightdm-greeter.ui
> ===================================================================
> --- trunk/debathena/config/lightdm-config/debian/debathena-lightdm-greeter.ui (rev 0)
> +++ trunk/debathena/config/lightdm-config/debian/debathena-lightdm-greeter.ui 2012-05-11 01:11:03 UTC (rev 25494)
> @@ -0,0 +1,341 @@
> +<?xml version="1.0" encoding="UTF-8"?>
> +<interface>
> + <!-- interface-requires gtk+ 3.0 -->
> + <object class="GtkImage" id="imgPower">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="stock">gtk-quit</property>
> + </object>
> + <object class="GtkImage" id="imgAccess">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="icon_name">preferences-desktop-accessibility</property>
> + </object>
> + <object class="GtkWindow" id="winBg">
> + <property name="can_focus">False</property>
> + <property name="skip_taskbar_hint">True</property>
> + <property name="skip_pager_hint">True</property>
> + <property name="accept_focus">False</property>
> + <property name="focus_on_map">False</property>
> + <property name="decorated">False</property>
> + <property name="has_resize_grip">False</property>
> + <child>
> + <object class="GtkImage" id="imgBg">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="stock">gtk-missing-image</property>
> + </object>
> + </child>
> + </object>
> + <object class="GtkWindow" id="winBranding">
> + <property name="can_focus">False</property>
> + <property name="resizable">False</property>
> + <property name="skip_taskbar_hint">True</property>
> + <property name="skip_pager_hint">True</property>
> + <property name="accept_focus">False</property>
> + <property name="focus_on_map">False</property>
> + <property name="decorated">False</property>
> + <property name="has_resize_grip">False</property>
> + <child>
> + <object class="GtkLabel" id="lblBranding">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="xpad">5</property>
> + <property name="ypad">5</property>
> + <property name="label" translatable="yes">[workstation info]</property>
> + <property name="justify">center</property>
> + </object>
> + </child>
> + </object>
> + <object class="GtkWindow" id="winLogin">
> + <property name="can_focus">False</property>
> + <property name="resizable">False</property>
> + <property name="decorated">False</property>
> + <property name="has_resize_grip">False</property>
> + <signal name="key-press-event" handler="kpEvent" swapped="no"/>
> + <child>
> + <object class="GtkNotebook" id="notebook1">
> + <property name="width_request">400</property>
> + <property name="visible">True</property>
> + <property name="can_focus">True</property>
> + <property name="show_tabs">False</property>
> + <child>
> + <object class="GtkBox" id="box1">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="border_width">12</property>
> + <property name="orientation">vertical</property>
> + <property name="spacing">6</property>
> + <child>
> + <object class="GtkImage" id="imgDebathena">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + </object>
> + <packing>
> + <property name="expand">True</property>
> + <property name="fill">True</property>
> + <property name="position">0</property>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkLabel" id="label1">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="label" translatable="yes">Welcome to Athena</property>
> + <attributes>
> + <attribute name="font-desc" value="Ubuntu Bold 18"/>
> + </attributes>
> + </object>
> + <packing>
> + <property name="expand">False</property>
> + <property name="fill">True</property>
> + <property name="position">1</property>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkLabel" id="lblHostname">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="margin_bottom">10</property>
> + <property name="label" translatable="yes">[hostname]</property>
> + </object>
> + <packing>
> + <property name="expand">False</property>
> + <property name="fill">True</property>
> + <property name="position">2</property>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkBox" id="boxLogin">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="orientation">vertical</property>
> + <property name="spacing">6</property>
> + <child>
> + <object class="GtkBox" id="boxPrompt">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="spacing">6</property>
> + <child>
> + <object class="GtkLabel" id="lblPrompt">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="label">[prompt]</property>
> + </object>
> + <packing>
> + <property name="expand">False</property>
> + <property name="fill">True</property>
> + <property name="position">0</property>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkEntry" id="entryPrompt">
> + <property name="visible">True</property>
> + <property name="can_focus">True</property>
> + <property name="primary_icon_activatable">False</property>
> + <property name="secondary_icon_activatable">False</property>
> + <signal name="activate" handler="login_cb" swapped="no"/>
> + </object>
> + <packing>
> + <property name="expand">True</property>
> + <property name="fill">True</property>
> + <property name="position">1</property>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkSpinner" id="loginSpinner">
> + <property name="width_request">20</property>
> + <property name="sensitive">False</property>
> + <property name="can_focus">False</property>
> + </object>
> + <packing>
> + <property name="expand">False</property>
> + <property name="fill">True</property>
> + <property name="position">2</property>
> + </packing>
> + </child>
> + </object>
> + <packing>
> + <property name="expand">False</property>
> + <property name="fill">True</property>
> + <property name="position">0</property>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkHBox" id="sessionBox">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="halign">center</property>
> + <property name="spacing">6</property>
> + <child>
> + <object class="GtkLabel" id="prompt_label1">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="label">Session:</property>
> + </object>
> + <packing>
> + <property name="expand">True</property>
> + <property name="fill">True</property>
> + <property name="position">0</property>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkComboBoxText" id="cmbSession">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + </object>
> + <packing>
> + <property name="expand">True</property>
> + <property name="fill">True</property>
> + <property name="position">1</property>
> + </packing>
> + </child>
> + </object>
> + <packing>
> + <property name="expand">False</property>
> + <property name="fill">False</property>
> + <property name="position">1</property>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkLabel" id="lblMessage">
> + <property name="can_focus">False</property>
> + <property name="label">[message]</property>
> + </object>
> + <packing>
> + <property name="expand">False</property>
> + <property name="fill">True</property>
> + <property name="position">6</property>
> + </packing>
> + </child>
> + </object>
> + <packing>
> + <property name="expand">False</property>
> + <property name="fill">True</property>
> + <property name="position">3</property>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkButtonBox" id="buttonbox1">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="margin_top">10</property>
> + <property name="layout_style">spread</property>
> + <child>
> + <object class="GtkButton" id="btnLogin">
> + <property name="label" translatable="yes">Login</property>
> + <property name="use_action_appearance">False</property>
> + <property name="visible">True</property>
> + <property name="can_focus">True</property>
> + <property name="receives_default">True</property>
> + <property name="use_action_appearance">False</property>
> + <signal name="clicked" handler="login_cb" swapped="no"/>
> + </object>
> + <packing>
> + <property name="expand">False</property>
> + <property name="fill">True</property>
> + <property name="position">0</property>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkButton" id="btnCancel">
> + <property name="label" translatable="yes">Cancel</property>
> + <property name="use_action_appearance">False</property>
> + <property name="visible">True</property>
> + <property name="can_focus">True</property>
> + <property name="receives_default">True</property>
> + <property name="use_action_appearance">False</property>
> + <signal name="clicked" handler="cancel_cb" swapped="no"/>
> + </object>
> + <packing>
> + <property name="expand">False</property>
> + <property name="fill">True</property>
> + <property name="position">2</property>
> + </packing>
> + </child>
> + </object>
> + <packing>
> + <property name="expand">False</property>
> + <property name="fill">True</property>
> + <property name="position">4</property>
> + </packing>
> + </child>
> + </object>
> + </child>
> + <child type="tab">
> + <placeholder/>
> + </child>
> + </object>
> + </child>
> + </object>
> + <object class="GtkWindow" id="winPanel">
> + <property name="can_focus">False</property>
> + <property name="title" translatable="yes">window1</property>
> + <property name="resizable">False</property>
> + <property name="skip_taskbar_hint">True</property>
> + <property name="skip_pager_hint">True</property>
> + <property name="accept_focus">False</property>
> + <property name="focus_on_map">False</property>
> + <property name="decorated">False</property>
> + <property name="has_resize_grip">False</property>
> + <child>
> + <object class="GtkBox" id="box2">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="margin_left">5</property>
> + <property name="margin_right">5</property>
> + <property name="spacing">10</property>
> + <child>
> + <object class="GtkLabel" id="lblTime">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="halign">start</property>
> + <property name="valign">center</property>
> + <property name="label" translatable="yes">[time]</property>
> + </object>
> + <packing>
> + <property name="expand">True</property>
> + <property name="fill">True</property>
> + <property name="position">0</property>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkButton" id="btnAccess">
> + <property name="use_action_appearance">False</property>
> + <property name="visible">True</property>
> + <property name="can_focus">True</property>
> + <property name="receives_default">True</property>
> + <property name="use_action_appearance">False</property>
> + <property name="image">imgAccess</property>
> + <property name="relief">none</property>
> + <property name="image_position">top</property>
> + <signal name="clicked" handler="access_cb" swapped="no"/>
> + </object>
> + <packing>
> + <property name="expand">False</property>
> + <property name="fill">True</property>
> + <property name="position">1</property>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkButton" id="btnPower">
> + <property name="use_action_appearance">False</property>
> + <property name="visible">True</property>
> + <property name="can_focus">True</property>
> + <property name="receives_default">True</property>
> + <property name="use_action_appearance">False</property>
> + <property name="image">imgPower</property>
> + <property name="relief">none</property>
> + <property name="image_position">top</property>
> + <signal name="clicked" handler="power_cb" swapped="no"/>
> + </object>
> + <packing>
> + <property name="expand">False</property>
> + <property name="fill">True</property>
> + <property name="position">2</property>
> + </packing>
> + </child>
> + </object>
> + </child>
> + </object>
> +</interface>
>
>
> Property changes on: trunk/debathena/config/lightdm-config/debian/debathena-lightdm-greeter.ui
> ___________________________________________________________________
> Added: svn:executable
> + *
>
> Copied: trunk/debathena/config/lightdm-config/debian/debathena.png (from rev 25474, trunk/debathena/config/gdm-config/debian/debathena.png)
> ===================================================================
> (Binary files differ)
>
> Copied: trunk/debathena/config/lightdm-config/debian/debathena1.png (from rev 25474, trunk/debathena/config/gdm-config/debian/debathena1.png)
> ===================================================================
> (Binary files differ)
>
> Copied: trunk/debathena/config/lightdm-config/debian/debathena2.png (from rev 25474, trunk/debathena/config/gdm-config/debian/debathena2.png)
> ===================================================================
> (Binary files differ)
>
> Copied: trunk/debathena/config/lightdm-config/debian/debathena3.png (from rev 25474, trunk/debathena/config/gdm-config/debian/debathena3.png)
> ===================================================================
> (Binary files differ)
>
> Copied: trunk/debathena/config/lightdm-config/debian/debathena4.png (from rev 25474, trunk/debathena/config/gdm-config/debian/debathena4.png)
> ===================================================================
> (Binary files differ)
>
> Copied: trunk/debathena/config/lightdm-config/debian/debathena5.png (from rev 25474, trunk/debathena/config/gdm-config/debian/debathena5.png)
> ===================================================================
> (Binary files differ)
>
> Copied: trunk/debathena/config/lightdm-config/debian/debathena6.png (from rev 25474, trunk/debathena/config/gdm-config/debian/debathena6.png)
> ===================================================================
> (Binary files differ)
>
> Copied: trunk/debathena/config/lightdm-config/debian/debathena7.png (from rev 25474, trunk/debathena/config/gdm-config/debian/debathena7.png)
> ===================================================================
> (Binary files differ)
>
> Copied: trunk/debathena/config/lightdm-config/debian/debathena8.png (from rev 25474, trunk/debathena/config/gdm-config/debian/debathena8.png)
> ===================================================================
> (Binary files differ)
>
> Modified: trunk/debathena/config/lightdm-config/debian/rules
> ===================================================================
> --- trunk/debathena/config/lightdm-config/debian/rules 2012-05-10 14:17:27 UTC (rev 25493)
> +++ trunk/debathena/config/lightdm-config/debian/rules 2012-05-11 01:11:03 UTC (rev 25494)
> @@ -1,8 +1,4 @@
> #!/usr/bin/make -f
>
> -DEB_DIVERT_EXTENSION = .debathena
> -DEB_TRANSFORM_FILES_debathena-lightdm-config += \
> - /etc/lightdm/lightdm.conf.debathena
> -
> include /usr/share/cdbs/1/rules/debhelper.mk
> -include /usr/share/cdbs/1/rules/config-package.mk
> +
>