]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - greeters/python-gtk/lightdm-example-python-gtk-greeter
Drop script code that was never implemented
[sojka/lightdm.git] / greeters / python-gtk / lightdm-example-python-gtk-greeter
1 #!/usr/bin/python
2
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
8
9 class Greeter:
10     def __init__(self):
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)
18
19     def connect_to_server(self):
20         self.greeter.connect_to_server()
21
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)))
27
28         settings = Gtk.Settings.get_default()
29         self.theme_name = settings.get_property('gtk-theme-name')
30
31         display = Gdk.Display.get_default()
32         screen = display.get_default_screen()
33         screen_width = screen.get_width()
34         screen_height = screen.get_height()
35
36         # FIXME: Not introspectable
37         #root = Gdk.Window.get_default_root()
38         #root.set_cursor(Gdk.Cursor(GDK_LEFT_PTR))
39
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()
44         self.window.realize()
45
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)
53
54         vbox = Gtk.VBox()
55         self.window.add(vbox)
56
57         menu_bar = Gtk.MenuBar ()
58         vbox.pack_start(menu_bar, False, True, 0)
59
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)
65         menu = Gtk.Menu()
66         menu_item.set_submenu(menu)
67
68         menu_item = Gtk.CheckMenuItem.new_with_label("Large Font")
69         menu_item.connect('toggled', self.a11y_font_cb)
70         menu.append(menu_item)
71
72         menu_item = Gtk.CheckMenuItem.new_with_label("High Constrast")
73         menu_item.connect('toggled', self.a11y_contrast_cb)
74         menu.append(menu_item)
75
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)
80
81         menu_item = Gtk.MenuItem.new_with_label("Language")
82         option_menu.append(menu_item)
83         menu = Gtk.Menu()
84         menu_item.set_submenu(menu)
85
86         language_radio_list = []
87         for l in greeter.get_languages():
88             if l.get_name() == "":
89                 label = l.get_code()
90             else:
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)
95
96             if l.matches(greeter.get_default_language()):
97                 menu_item.set_active(True)
98
99             menu_item.set_data('language', l.get_code())
100
101         menu_item = Gtk.MenuItem.new_with_label("Keyboard Layout")
102         option_menu.append(menu_item)
103         menu = Gtk.Menu()
104         menu_item.set_submenu(menu)
105
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)
111
112             if l.get_name() == greeter.get_default_layout():
113                 menu_item.set_active(True)
114
115             menu_item.set_data('layout', l.get_name())
116             menu_item.connect('toggled', self.layout_changed_cb)
117
118         menu_item = Gtk.MenuItem.new_with_label("Session")
119         option_menu.append(menu_item)
120         menu = Gtk.Menu()
121         menu_item.set_submenu(menu)
122
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)
128
129             if s.get_key() == greeter.get_default_session():
130                 menu_item.set_active(True)
131
132             menu_item.set_data('key', s.get_key())
133
134         power_menu = Gtk.Menu()
135         n_power_items = 0
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)
140             n_power_items += 1
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)
145             n_power_items += 1
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)
150             n_power_items += 1
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)
155             n_power_items += 1
156
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)
165
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)
169
170         notebook = Gtk.Notebook()
171         notebook.set_show_tabs(False)
172         login_align.add(notebook)
173
174         login_vbox = Gtk.VBox()
175         login_vbox.set_border_width(12)
176         notebook.add(login_vbox)
177
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)
182
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)
186
187         users = greeter.get_users()
188         user_view = None
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)
193         else:
194             model = Gtk.ListStore(str, str, GdkPixbuf.Pixbuf, bool)
195             for user in users:
196                 image = user.get_image()
197                 pixbuf = None
198                 if image != None:
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()
211             if i is not None:
212                 user_view.get_selection().select_iter(i)
213
214             login_vbox.pack_start(user_view, False, False, 0)
215
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)
221
222         self.window.show_all()
223         if user_view is not None:
224             user_view.grab_focus()
225
226     def draw_background_cb(self, widget, context):
227         pass#self.background
228     
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())
235
236     def password_activate_cb(self, widget):
237         self.prompt_entry.set_sensitive(False)
238         self.greeter.respond(self.prompt_entry.get_text())
239
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()
245
246     def show_message_cb(self, greeter, text, type):
247         self.message_label.show()
248         self.message_label.set_text(text)
249
250     def authentication_complete_cb(self, greeter):
251         self.prompt_entry.hide()
252         self.prompt_entry.set_text('')
253
254         # Clear row shading
255         # FIXME
256         if self.username_entry is not None:
257             self.username_entry.set_text('')
258             self.username_entry.set_sentitive(True)
259
260         if user_view is not None:
261             user_view.grab_focus()
262         else:
263             username_entry.grab_focus()
264
265         if self.greeter.is_authenticated:
266             self.greeter.start_session_with_defaults()
267
268     def timed_login_cb(self, greeter, username):
269         self.greeter.login(greeter.get_timed_login_user())
270
271     def quit_cb(self, greeter):
272         Gtk.main_quit()
273
274     def user_view_activate_cb(self, widget):
275         pass
276
277     def user_view_click_cb(self, widget):
278         pass
279
280     def layout_changed_cb(self, widget):
281         pass
282
283     def a11y_font_cb(self, widget):
284         pass
285
286     def a11y_contrast_cb(self, widget):
287         pass
288
289     def suspend_cb(self, widget):
290         self.greeter.suspend()
291
292     def hibernate_cb(self, widget):
293         self.greeter.hibernate()
294
295     def restart_cb(self, widget):
296         pass
297
298     def shutdown_cb(self, widget):
299         pass
300
301 g = Greeter()
302 g.connect_to_server()
303 Gtk.main()