~lightdm-team/lightdm/1.4

« back to all changes in this revision

Viewing changes to greeters/python-gtk/lightdm-python-gtk-greeter

  • Committer: Robert Ancell
  • Date: 2011-04-15 00:06:33 UTC
  • Revision ID: robert.ancell@canonical.com-20110415000633-t512274wus5odmj6
Add a Python example greeter (not fully working)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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('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)
 
19
 
 
20
    def connect_to_server(self):
 
21
        self.greeter.connect_to_server()
 
22
 
 
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)))
 
28
 
 
29
        settings = Gtk.Settings.get_default()
 
30
        self.theme_name = settings.get_property('gtk-theme-name')
 
31
 
 
32
        display = Gdk.Display.get_default()
 
33
        screen = display.get_default_screen()
 
34
        screen_width = screen.get_width()
 
35
        screen_height = screen.get_height()
 
36
 
 
37
        # FIXME: Not introspectable
 
38
        #root = Gdk.Window.get_default_root()
 
39
        #root.set_cursor(Gdk.Cursor(GDK_LEFT_PTR))
 
40
 
 
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()
 
45
        self.window.realize()
 
46
 
 
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)
 
54
 
 
55
        vbox = Gtk.VBox()
 
56
        self.window.add(vbox)
 
57
 
 
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)
 
61
 
 
62
        notebook = Gtk.Notebook()
 
63
        notebook.set_show_tabs(False)
 
64
        login_align.add(notebook)
 
65
 
 
66
        login_vbox = Gtk.VBox()
 
67
        login_vbox.set_border_width(12)
 
68
        notebook.add(login_vbox)
 
69
 
 
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)
 
74
 
 
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)
 
78
 
 
79
        users = greeter.get_users()
 
80
        user_view = None
 
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)
 
85
        else:
 
86
            model = Gtk.ListStore(str, str, GdkPixbuf.Pixbuf, bool)
 
87
            for user in users:
 
88
                image = user.get_image()
 
89
                pixbuf = None
 
90
                if 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()
 
103
            if i is not None:
 
104
                user_view.get_selection().select_iter(i)
 
105
 
 
106
            login_vbox.pack_start(user_view, False, False, 0)
 
107
 
 
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)
 
114
 
 
115
        menu_bar = Gtk.MenuBar ()
 
116
        vbox.pack_start(menu_bar, False, True, 0)
 
117
 
 
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)
 
123
        menu = Gtk.Menu()
 
124
        menu_item.set_submenu(menu)
 
125
 
 
126
        menu_item = Gtk.CheckMenuItem.new_with_label("Large Font")
 
127
        menu_item.connect('toggled', self.a11y_font_cb)
 
128
        menu.append(menu_item)
 
129
 
 
130
        menu_item = Gtk.CheckMenuItem.new_with_label("High Constrast")
 
131
        menu_item.connect('toggled', self.a11y_contrast_cb)
 
132
        menu.append(menu_item)
 
133
 
 
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)
 
138
 
 
139
        menu_item = Gtk.MenuItem.new_with_label("Language")
 
140
        option_menu.append(menu_item)
 
141
        menu = Gtk.Menu()
 
142
        menu_item.set_submenu(menu)
 
143
 
 
144
        language_radio_list = []
 
145
        for l in greeter.get_languages():
 
146
            if l.get_name() == "":
 
147
                label = l.get_code()
 
148
            else:
 
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)
 
153
 
 
154
            if l.matches(greeter.get_default_language()):
 
155
                menu_item.set_active(True)
 
156
 
 
157
            menu_item.set_data('language', l.get_code())
 
158
 
 
159
        menu_item = Gtk.MenuItem.new_with_label("Keyboard Layout")
 
160
        option_menu.append(menu_item)
 
161
        menu = Gtk.Menu()
 
162
        menu_item.set_submenu(menu)
 
163
 
 
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)
 
169
 
 
170
            if l.get_name() == greeter.get_default_layout():
 
171
                menu_item.set_active(True)
 
172
 
 
173
            menu_item.set_data('layout', l.get_name())
 
174
            menu_item.connect('toggled', self.layout_changed_cb)
 
175
 
 
176
        menu_item = Gtk.MenuItem.new_with_label("Session")
 
177
        option_menu.append(menu_item)
 
178
        menu = Gtk.Menu()
 
179
        menu_item.set_submenu(menu)
 
180
 
 
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)
 
186
 
 
187
            if s.get_key() == greeter.get_default_session():
 
188
                menu_item.set_active(True)
 
189
 
 
190
            menu_item.set_data('key', s.get_key())
 
191
 
 
192
        power_menu = Gtk.Menu()
 
193
        n_power_items = 0
 
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)
 
198
            n_power_items += 1
 
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)
 
203
            n_power_items += 1
 
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)
 
208
            n_power_items += 1
 
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)
 
213
            n_power_items += 1
 
214
 
 
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)
 
223
 
 
224
        self.window.show_all()
 
225
        if user_view is not None:
 
226
            user_view.grab_focus()
 
227
 
 
228
    def draw_background_cb(self, widget, context):
 
229
        pass#self.background
 
230
    
 
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)
 
237
 
 
238
    def username_activate_cb(self, widget):
 
239
        self.start_authentication(self.username_entry.get_text())
 
240
 
 
241
    def password_activate_cb(self, widget):
 
242
        self.password_entry.set_sensitive(False)
 
243
        self.greeter.provide_secret(self.password_entry.get_text())
 
244
 
 
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()
 
249
 
 
250
    def show_message_cb(self, greeter, text):
 
251
        self.message_label.show()
 
252
        self.message_label.set_text(text)
 
253
 
 
254
    def authentication_complete_cb(self, greeter):
 
255
        self.password_entry.hide()
 
256
        self.password_entry.set_text('')
 
257
 
 
258
        # Clear row shading
 
259
        # FIXME
 
260
        if self.username_entry is not None:
 
261
            self.username_entry.set_text('')
 
262
            self.username_entry.set_sentitive(True)
 
263
 
 
264
        if user_view is not None:
 
265
            user_view.grab_focus()
 
266
        else:
 
267
            username_entry.grab_focus()
 
268
 
 
269
    def timed_login_cb(self, greeter, username):
 
270
        self.greeter.login(greeter.get_timed_login_user(), None, None)
 
271
 
 
272
    def quit_cb(self, greeter):
 
273
        Gtk.main_quit()
 
274
 
 
275
    def user_view_activate_cb(self, widget):
 
276
        pass
 
277
 
 
278
    def user_view_click_cb(self, widget):
 
279
        pass
 
280
 
 
281
    def layout_changed_cb(self, widget):
 
282
        pass
 
283
 
 
284
    def a11y_font_cb(self, widget):
 
285
        pass
 
286
 
 
287
    def a11y_contrast_cb(self, widget):
 
288
        pass
 
289
 
 
290
    def suspend_cb(self, widget):
 
291
        self.greeter.suspend()
 
292
 
 
293
    def hibernate_cb(self, widget):
 
294
        self.greeter.hibernate()
 
295
 
 
296
    def restart_cb(self, widget):
 
297
        pass
 
298
 
 
299
    def shutdown_cb(self, widget):
 
300
        pass
 
301
 
 
302
g = Greeter()
 
303
g.connect_to_server()
 
304
Gtk.main()