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('show-error', self.show_message_cb)
16
self.greeter.connect('authentication-complete', self.authentication_complete_cb)
17
self.greeter.connect('timed-login', self.timed_login_cb)
18
self.greeter.connect('quit', self.quit_cb)
20
def connect_to_server(self):
21
self.greeter.connect_to_server()
23
def connect_cb(self, greeter):
24
theme_dir = GLib.path_get_dirname(greeter.get_theme())
25
rc_file = greeter.get_string_property('gtkrc')
26
if rc_file is not None:
27
Gtk.rc_add_default_file(GLib.build_filenamev((theme_dir, rc_file)))
29
settings = Gtk.Settings.get_default()
30
self.theme_name = settings.get_property('gtk-theme-name')
32
display = Gdk.Display.get_default()
33
screen = display.get_default_screen()
34
screen_width = screen.get_width()
35
screen_height = screen.get_height()
37
# FIXME: Not introspectable
38
#root = Gdk.Window.get_default_root()
39
#root.set_cursor(Gdk.Cursor(GDK_LEFT_PTR))
41
self.window = Gtk.Window()
42
self.window.app_paintable = True
43
self.window.set_default_size(screen_width, screen_height)
44
self.window.fullscreen()
47
background_image = greeter.get_string_property('background-image')
48
if background_image is not None:
49
path = GLib.build_filenamev((theme_dir, background_image))
50
pixbuf = GdkPixbuf.Pixbuf.new_from_file(path)
51
self.background = pixbuf.scale_simple(screen_width, screen_height, GdkPixbuf.InterpType.BILINEAR)
52
# FIXME: Convert to cairo surface
53
self.window.connect('draw', self.draw_background_cb)
58
login_align = Gtk.Alignment()
59
login_align.set(0.5, 0.5, 0.0, 0.0)
60
vbox.pack_start(login_align, True, True, 0)
62
notebook = Gtk.Notebook()
63
notebook.set_show_tabs(False)
64
login_align.add(notebook)
66
login_vbox = Gtk.VBox()
67
login_vbox.set_border_width(12)
68
notebook.add(login_vbox)
70
logo_image = Gtk.Image.new_from_icon_name('computer', Gtk.IconSize.DIALOG)
71
logo_image.set_pixel_size(64)
72
login_vbox.pack_start(logo_image, False, False, 0)
73
login_vbox.pack_start(Gtk.Label(greeter.get_hostname()), False, False, 0)
75
self.message_label = Gtk.Label()
76
login_vbox.pack_start(self.message_label, False, False, 0)
77
self.message_label.set_no_show_all(True)
79
users = greeter.get_users()
81
if True:#users is None:
82
self.username_entry = Gtk.Entry()
83
login_vbox.pack_start(self.username_entry, False, False, 0)
84
self.username_entry.connect('activate', self.username_activate_cb)
86
model = Gtk.ListStore(str, str, GdkPixbuf.Pixbuf, bool)
88
image = user.get_image()
91
path = GLib.filename_from_uri(image)
92
pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(path, 64, 64, True)
93
model.append((user.get_name(), user.get_display_name(), pixbuf, True))
94
user_view = Gtk.TreeView()
95
user_view.set_model(model)
96
user_view.set_headers_visible(False)
97
user_view.set_grid_lines(Gtk.TreeViewGridLines.NONE)
98
user_view.append_column(Gtk.TreeViewColumn('Face', Gtk.CellRendererPixbuf(), pixbuf = 2, sensitive = 3))
99
user_view.append_column(Gtk.TreeViewColumn('Name', Gtk.CellRendererText(), text = 1))
100
user_view.connect('row-activated', self.user_view_activate_cb)
101
user_view.connect('button-press-event', self.user_view_click_cb)
102
i = model.get_iter_first()
104
user_view.get_selection().select_iter(i)
106
login_vbox.pack_start(user_view, False, False, 0)
108
self.password_entry = Gtk.Entry()
109
self.password_entry.visibility = False
110
self.password_entry.sensitive = False
111
login_vbox.pack_start(self.password_entry, False, False, 0)
112
self.password_entry.connect('activate', self.password_activate_cb)
113
self.password_entry.set_no_show_all(True)
115
menu_bar = Gtk.MenuBar ()
116
vbox.pack_start(menu_bar, False, True, 0)
118
menu_item = Gtk.ImageMenuItem()
119
menu_item.set_image(Gtk.Image.new_from_icon_name('preferences-desktop-accessibility', Gtk.IconSize.LARGE_TOOLBAR))
120
menu_item.set_label('') # NOTE: Needed to make the icon show as selected
121
menu_item.set_always_show_image(True)
122
menu_bar.append(menu_item)
124
menu_item.set_submenu(menu)
126
menu_item = Gtk.CheckMenuItem.new_with_label("Large Font")
127
menu_item.connect('toggled', self.a11y_font_cb)
128
menu.append(menu_item)
130
menu_item = Gtk.CheckMenuItem.new_with_label("High Constrast")
131
menu_item.connect('toggled', self.a11y_contrast_cb)
132
menu.append(menu_item)
134
menu_item = Gtk.MenuItem.new_with_label("Options")
135
menu_bar.append(menu_item)
136
option_menu = Gtk.Menu()
137
menu_item.set_submenu(option_menu)
139
menu_item = Gtk.MenuItem.new_with_label("Language")
140
option_menu.append(menu_item)
142
menu_item.set_submenu(menu)
144
language_radio_list = []
145
for l in greeter.get_languages():
146
if l.get_name() == "":
149
label = '%s - %s' % (l.get_name(), l.get_territory())
150
menu_item = Gtk.RadioMenuItem.new_with_label(language_radio_list, label)
151
language_radio_list = menu_item.get_group()
152
menu.append(menu_item)
154
if l.matches(greeter.get_default_language()):
155
menu_item.set_active(True)
157
menu_item.set_data('language', l.get_code())
159
menu_item = Gtk.MenuItem.new_with_label("Keyboard Layout")
160
option_menu.append(menu_item)
162
menu_item.set_submenu(menu)
164
layout_radio_list = []
165
for l in greeter.get_layouts():
166
menu_item = Gtk.RadioMenuItem.new_with_label(layout_radio_list, l.get_description())
167
layout_radio_list = menu_item.get_group()
168
menu.append(menu_item)
170
if l.get_name() == greeter.get_default_layout():
171
menu_item.set_active(True)
173
menu_item.set_data('layout', l.get_name())
174
menu_item.connect('toggled', self.layout_changed_cb)
176
menu_item = Gtk.MenuItem.new_with_label("Session")
177
option_menu.append(menu_item)
179
menu_item.set_submenu(menu)
181
session_radio_list = []
182
for s in greeter.get_sessions():
183
menu_item = Gtk.RadioMenuItem.new_with_label(session_radio_list, s.get_name())
184
session_radio_list = menu_item.get_group()
185
menu.append(menu_item)
187
if s.get_key() == greeter.get_default_session():
188
menu_item.set_active(True)
190
menu_item.set_data('key', s.get_key())
192
power_menu = Gtk.Menu()
194
if greeter.get_can_suspend():
195
menu_item = Gtk.MenuItem('Suspend')
196
power_menu.append(menu_item)
197
menu_item.connect('activate', self.suspend_cb)
199
if greeter.get_can_hibernate():
200
menu_item = Gtk.MenuItem('Hibernate')
201
power_menu.append(menu_item)
202
menu_item.connect('activate', self.hibernate_cb)
204
if greeter.get_can_restart():
205
menu_item = Gtk.MenuItem('Restart...')
206
power_menu.append(menu_item)
207
menu_item.connect('activate', self.restart_cb)
209
if greeter.get_can_shutdown():
210
menu_item = Gtk.MenuItem('Shutdown...')
211
power_menu.append(menu_item)
212
menu_item.connect('activate', self.shutdown_cb)
215
if n_power_items > 0:
216
menu_item = Gtk.ImageMenuItem()
217
menu_item.set_always_show_image(True)
218
menu_item.set_right_justified(True)
219
menu_item.set_image(Gtk.Image.new_from_icon_name('system-shutdown', Gtk.IconSize.LARGE_TOOLBAR))
220
menu_item.set_label('') # NOTE: Needed to make the icon show as selected
221
menu_item.set_submenu(power_menu)
222
menu_bar.append(menu_item)
224
self.window.show_all()
225
if user_view is not None:
226
user_view.grab_focus()
228
def draw_background_cb(self, widget, context):
231
def start_authentication(self, username):
232
# FIXME if self.greeter.get_user_defaults
233
# FIXME if user_model
234
if self.username_entry is not None:
235
self.username_entry.set_sensitive(False)
236
self.greeter.start_authentication(username)
238
def username_activate_cb(self, widget):
239
self.start_authentication(self.username_entry.get_text())
241
def password_activate_cb(self, widget):
242
self.password_entry.set_sensitive(False)
243
self.greeter.provide_secret(self.password_entry.get_text())
245
def show_prompt_cb(self, greeter, text):
246
self.password_entry.show()
247
self.password_entry.set_sensitive(True)
248
self.password_entry.frab_focus()
250
def show_message_cb(self, greeter, text):
251
self.message_label.show()
252
self.message_label.set_text(text)
254
def authentication_complete_cb(self, greeter):
255
self.password_entry.hide()
256
self.password_entry.set_text('')
260
if self.username_entry is not None:
261
self.username_entry.set_text('')
262
self.username_entry.set_sentitive(True)
264
if user_view is not None:
265
user_view.grab_focus()
267
username_entry.grab_focus()
269
def timed_login_cb(self, greeter, username):
270
self.greeter.login(greeter.get_timed_login_user(), None, None)
272
def quit_cb(self, greeter):
275
def user_view_activate_cb(self, widget):
278
def user_view_click_cb(self, widget):
281
def layout_changed_cb(self, widget):
284
def a11y_font_cb(self, widget):
287
def a11y_contrast_cb(self, widget):
290
def suspend_cb(self, widget):
291
self.greeter.suspend()
293
def hibernate_cb(self, widget):
294
self.greeter.hibernate()
296
def restart_cb(self, widget):
299
def shutdown_cb(self, widget):
303
g.connect_to_server()