[26289] in Source-Commits

home help back first fref pref prev next nref lref last post

/svn/athena r25494 - trunk/debathena/config/lightdm-config/debian

daemon@ATHENA.MIT.EDU (Jonathan D Reed)
Thu May 10 21:11:04 2012

Date: Thu, 10 May 2012 21:11:03 -0400
From: Jonathan D Reed <jdreed@MIT.EDU>
Message-Id: <201205110111.q4B1B3Wx026736@drugstore.mit.edu>
To: source-commits@MIT.EDU
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

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
+


home help back first fref pref prev next nref lref last post