3 from gi.repository import GLib
4 from gi.repository import Gdk
5 from gi.repository import GdkPixbuf
6 from gi.repository import Gtk
7 from gi.repository import LightDM
11 self.greeter = LightDM.Greeter()
12 self.greeter.connect('connected', self.connect_cb)
13 self.greeter.connect('show-prompt', self.show_prompt_cb)
14 self.greeter.connect('show-message', self.show_message_cb)
15 self.greeter.connect('authentication-complete', self.authentication_complete_cb)
16 self.greeter.connect('timed-login', self.timed_login_cb)
17 self.greeter.connect('quit', self.quit_cb)
19 def connect_to_server(self):
20 self.greeter.connect_to_server()
22 def connect_cb(self, greeter):
23 theme_dir = GLib.path_get_dirname(greeter.get_theme())
24 rc_file = greeter.get_string_property('gtkrc')
25 if rc_file is not None:
26 Gtk.rc_add_default_file(GLib.build_filenamev((theme_dir, rc_file)))
28 settings = Gtk.Settings.get_default()
29 self.theme_name = settings.get_property('gtk-theme-name')
31 display = Gdk.Display.get_default()
32 screen = display.get_default_screen()
33 screen_width = screen.get_width()
34 screen_height = screen.get_height()
36 # FIXME: Not introspectable
37 #root = Gdk.Window.get_default_root()
38 #root.set_cursor(Gdk.Cursor(GDK_LEFT_PTR))
40 self.window = Gtk.Window()
41 self.window.app_paintable = True
42 self.window.set_default_size(screen_width, screen_height)
43 self.window.fullscreen()
46 background_image = greeter.get_string_property('background-image')
47 if background_image is not None:
48 path = GLib.build_filenamev((theme_dir, background_image))
49 pixbuf = GdkPixbuf.Pixbuf.new_from_file(path)
50 self.background = pixbuf.scale_simple(screen_width, screen_height, GdkPixbuf.InterpType.BILINEAR)
51 # FIXME: Convert to cairo surface
52 self.window.connect('draw', self.draw_background_cb)
57 menu_bar = Gtk.MenuBar ()
58 vbox.pack_start(menu_bar, False, True, 0)
60 menu_item = Gtk.ImageMenuItem()
61 menu_item.set_image(Gtk.Image.new_from_icon_name('preferences-desktop-accessibility', Gtk.IconSize.LARGE_TOOLBAR))
62 menu_item.set_label('') # NOTE: Needed to make the icon show as selected
63 menu_item.set_always_show_image(True)
64 menu_bar.append(menu_item)
66 menu_item.set_submenu(menu)
68 menu_item = Gtk.CheckMenuItem.new_with_label("Large Font")
69 menu_item.connect('toggled', self.a11y_font_cb)
70 menu.append(menu_item)
72 menu_item = Gtk.CheckMenuItem.new_with_label("High Constrast")
73 menu_item.connect('toggled', self.a11y_contrast_cb)
74 menu.append(menu_item)
76 menu_item = Gtk.MenuItem.new_with_label("Options")
77 menu_bar.append(menu_item)
78 option_menu = Gtk.Menu()
79 menu_item.set_submenu(option_menu)
81 menu_item = Gtk.MenuItem.new_with_label("Language")
82 option_menu.append(menu_item)
84 menu_item.set_submenu(menu)
86 language_radio_list = []
87 for l in greeter.get_languages():
88 if l.get_name() == "":
91 label = '%s - %s' % (l.get_name(), l.get_territory())
92 menu_item = Gtk.RadioMenuItem.new_with_label(language_radio_list, label)
93 language_radio_list = menu_item.get_group()
94 menu.append(menu_item)
96 if l.matches(greeter.get_default_language()):
97 menu_item.set_active(True)
99 menu_item.set_data('language', l.get_code())
101 menu_item = Gtk.MenuItem.new_with_label("Keyboard Layout")
102 option_menu.append(menu_item)
104 menu_item.set_submenu(menu)
106 layout_radio_list = []
107 for l in greeter.get_layouts():
108 menu_item = Gtk.RadioMenuItem.new_with_label(layout_radio_list, l.get_description())
109 layout_radio_list = menu_item.get_group()
110 menu.append(menu_item)
112 if l.get_name() == greeter.get_default_layout():
113 menu_item.set_active(True)
115 menu_item.set_data('layout', l.get_name())
116 menu_item.connect('toggled', self.layout_changed_cb)
118 menu_item = Gtk.MenuItem.new_with_label("Session")
119 option_menu.append(menu_item)
121 menu_item.set_submenu(menu)
123 session_radio_list = []
124 for s in greeter.get_sessions():
125 menu_item = Gtk.RadioMenuItem.new_with_label(session_radio_list, s.get_name())
126 session_radio_list = menu_item.get_group()
127 menu.append(menu_item)
129 if s.get_key() == greeter.get_default_session():
130 menu_item.set_active(True)
132 menu_item.set_data('key', s.get_key())
134 power_menu = Gtk.Menu()
136 if greeter.get_can_suspend():
137 menu_item = Gtk.MenuItem('Suspend')
138 power_menu.append(menu_item)
139 menu_item.connect('activate', self.suspend_cb)
141 if greeter.get_can_hibernate():
142 menu_item = Gtk.MenuItem('Hibernate')
143 power_menu.append(menu_item)
144 menu_item.connect('activate', self.hibernate_cb)
146 if greeter.get_can_restart():
147 menu_item = Gtk.MenuItem('Restart...')
148 power_menu.append(menu_item)
149 menu_item.connect('activate', self.restart_cb)
151 if greeter.get_can_shutdown():
152 menu_item = Gtk.MenuItem('Shutdown...')
153 power_menu.append(menu_item)
154 menu_item.connect('activate', self.shutdown_cb)
157 if n_power_items > 0:
158 menu_item = Gtk.ImageMenuItem()
159 menu_item.set_always_show_image(True)
160 menu_item.set_right_justified(True)
161 menu_item.set_image(Gtk.Image.new_from_icon_name('system-shutdown', Gtk.IconSize.LARGE_TOOLBAR))
162 menu_item.set_label('') # NOTE: Needed to make the icon show as selected
163 menu_item.set_submenu(power_menu)
164 menu_bar.append(menu_item)
166 login_align = Gtk.Alignment()
167 login_align.set(0.5, 0.5, 0.0, 0.0)
168 vbox.pack_start(login_align, True, True, 0)
170 notebook = Gtk.Notebook()
171 notebook.set_show_tabs(False)
172 login_align.add(notebook)
174 login_vbox = Gtk.VBox()
175 login_vbox.set_border_width(12)
176 notebook.add(login_vbox)
178 logo_image = Gtk.Image.new_from_icon_name('computer', Gtk.IconSize.DIALOG)
179 logo_image.set_pixel_size(64)
180 login_vbox.pack_start(logo_image, False, False, 0)
181 login_vbox.pack_start(Gtk.Label(greeter.get_hostname()), False, False, 0)
183 self.message_label = Gtk.Label()
184 login_vbox.pack_start(self.message_label, False, False, 0)
185 self.message_label.set_no_show_all(True)
187 users = greeter.get_users()
189 if True:#users is None:
190 self.username_entry = Gtk.Entry()
191 login_vbox.pack_start(self.username_entry, False, False, 0)
192 self.username_entry.connect('activate', self.username_activate_cb)
194 model = Gtk.ListStore(str, str, GdkPixbuf.Pixbuf, bool)
196 image = user.get_image()
199 path = GLib.filename_from_uri(image)
200 pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(path, 64, 64, True)
201 model.append((user.get_name(), user.get_display_name(), pixbuf, True))
202 user_view = Gtk.TreeView()
203 user_view.set_model(model)
204 user_view.set_headers_visible(False)
205 user_view.set_grid_lines(Gtk.TreeViewGridLines.NONE)
206 user_view.append_column(Gtk.TreeViewColumn('Face', Gtk.CellRendererPixbuf(), pixbuf = 2, sensitive = 3))
207 user_view.append_column(Gtk.TreeViewColumn('Name', Gtk.CellRendererText(), text = 1))
208 user_view.connect('row-activated', self.user_view_activate_cb)
209 user_view.connect('button-press-event', self.user_view_click_cb)
210 i = model.get_iter_first()
212 user_view.get_selection().select_iter(i)
214 login_vbox.pack_start(user_view, False, False, 0)
216 self.prompt_entry = Gtk.Entry()
217 self.prompt_entry.set_sensitive(False)
218 login_vbox.pack_start(self.prompt_entry, False, False, 0)
219 self.prompt_entry.connect('activate', self.password_activate_cb)
220 self.prompt_entry.set_no_show_all(True)
222 self.window.show_all()
223 if user_view is not None:
224 user_view.grab_focus()
226 def draw_background_cb(self, widget, context):
229 def username_activate_cb(self, widget):
230 # FIXME if self.greeter.get_user_defaults
231 # FIXME if user_model
232 if self.username_entry is not None:
233 self.username_entry.set_sensitive(False)
234 self.greeter.login(self.username_entry.get_text())
236 def password_activate_cb(self, widget):
237 self.prompt_entry.set_sensitive(False)
238 self.greeter.respond(self.prompt_entry.get_text())
240 def show_prompt_cb(self, greeter, text, type):
241 self.prompt_entry.show()
242 self.prompt_entry.set_sensitive(True)
243 self.prompt_entry.set_visibility(type != LightDM.PROMPT_TYPE_SECRET)
244 self.prompt_entry.grab_focus()
246 def show_message_cb(self, greeter, text, type):
247 self.message_label.show()
248 self.message_label.set_text(text)
250 def authentication_complete_cb(self, greeter):
251 self.prompt_entry.hide()
252 self.prompt_entry.set_text('')
256 if self.username_entry is not None:
257 self.username_entry.set_text('')
258 self.username_entry.set_sentitive(True)
260 if user_view is not None:
261 user_view.grab_focus()
263 username_entry.grab_focus()
265 if self.greeter.is_authenticated:
266 self.greeter.start_session_with_defaults()
268 def timed_login_cb(self, greeter, username):
269 self.greeter.login(greeter.get_timed_login_user())
271 def quit_cb(self, greeter):
274 def user_view_activate_cb(self, widget):
277 def user_view_click_cb(self, widget):
280 def layout_changed_cb(self, widget):
283 def a11y_font_cb(self, widget):
286 def a11y_contrast_cb(self, widget):
289 def suspend_cb(self, widget):
290 self.greeter.suspend()
292 def hibernate_cb(self, widget):
293 self.greeter.hibernate()
295 def restart_cb(self, widget):
298 def shutdown_cb(self, widget):
302 g.connect_to_server()