source: proiecte/PPPP/gdm/gui/simple-greeter/gdm-greeter-session.c @ 134

Last change on this file since 134 was 134, checked in by (none), 14 years ago

gdm sources with the modifications for webcam

File size: 22.4 KB
Line 
1/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
2 *
3 * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 *
19 */
20
21#include "config.h"
22
23#include <stdlib.h>
24#include <stdio.h>
25#include <unistd.h>
26#include <string.h>
27
28#include <dbus/dbus-glib.h>
29#include <dbus/dbus-glib-lowlevel.h>
30
31#include <glib.h>
32#include <glib/gi18n.h>
33#include <glib-object.h>
34#include <gconf/gconf-client.h>
35
36#include "gdm-greeter-session.h"
37#include "gdm-greeter-client.h"
38#include "gdm-greeter-panel.h"
39#include "gdm-greeter-login-window.h"
40#include "gdm-user-chooser-widget.h"
41
42#include "gdm-profile.h"
43
44#define GDM_GREETER_SESSION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_GREETER_SESSION, GdmGreeterSessionPrivate))
45
46struct GdmGreeterSessionPrivate
47{
48        GdmGreeterClient      *client;
49
50        GtkWidget             *login_window;
51        GtkWidget             *panel;
52};
53
54enum {
55        PROP_0,
56};
57
58static void     gdm_greeter_session_class_init  (GdmGreeterSessionClass *klass);
59static void     gdm_greeter_session_init        (GdmGreeterSession      *greeter_session);
60static void     gdm_greeter_session_finalize    (GObject                *object);
61
62G_DEFINE_TYPE (GdmGreeterSession, gdm_greeter_session, G_TYPE_OBJECT)
63
64static gpointer session_object = NULL;
65
66static void
67on_info (GdmGreeterClient  *client,
68         const char        *text,
69         GdmGreeterSession *session)
70{
71        g_debug ("GdmGreeterSession: Info: %s", text);
72
73        gdm_greeter_login_window_info (GDM_GREETER_LOGIN_WINDOW (session->priv->login_window), text);
74}
75
76static void
77on_problem (GdmGreeterClient  *client,
78            const char        *text,
79            GdmGreeterSession *session)
80{
81        g_debug ("GdmGreeterSession: Problem: %s", text);
82
83        gdm_greeter_login_window_problem (GDM_GREETER_LOGIN_WINDOW (session->priv->login_window), text);
84}
85
86static void
87on_ready (GdmGreeterClient  *client,
88          GdmGreeterSession *session)
89{
90        g_debug ("GdmGreeterSession: Ready");
91
92        gdm_greeter_login_window_ready (GDM_GREETER_LOGIN_WINDOW (session->priv->login_window));
93}
94
95static void
96on_reset (GdmGreeterClient  *client,
97          GdmGreeterSession *session)
98{
99        g_debug ("GdmGreeterSession: Reset");
100
101        gdm_greeter_panel_reset (GDM_GREETER_PANEL (session->priv->panel));
102        gdm_greeter_login_window_reset (GDM_GREETER_LOGIN_WINDOW (session->priv->login_window));
103}
104
105static void
106show_or_hide_user_options (GdmGreeterSession *session,
107                           const char        *username)
108{
109    if (username != NULL && strcmp (username, GDM_USER_CHOOSER_USER_OTHER) != 0) {
110            gdm_greeter_panel_show_user_options (GDM_GREETER_PANEL (session->priv->panel));
111    } else {
112            gdm_greeter_panel_hide_user_options (GDM_GREETER_PANEL (session->priv->panel));
113    }
114}
115
116static void
117on_selected_user_changed (GdmGreeterClient  *client,
118                          const char        *text,
119                          GdmGreeterSession *session)
120{
121        g_debug ("GdmGreeterSession: selected user changed: %s", text);
122        show_or_hide_user_options (session, text);
123}
124
125static void
126on_default_language_name_changed (GdmGreeterClient  *client,
127                                  const char        *text,
128                                  GdmGreeterSession *session)
129{
130        g_debug ("GdmGreeterSession: default language name changed: %s", text);
131        gdm_greeter_panel_set_default_language_name (GDM_GREETER_PANEL (session->priv->panel),
132                                                     text);
133}
134
135static void
136on_default_layout_name_changed (GdmGreeterClient  *client,
137                                const char        *text,
138                                GdmGreeterSession *session)
139{
140        g_debug ("GdmGreeterSession: default layout name changed: %s", text);
141        gdm_greeter_panel_set_default_layout_name (GDM_GREETER_PANEL (session->priv->panel),
142                                                   text);
143}
144
145static void
146on_default_session_name_changed (GdmGreeterClient  *client,
147                                 const char        *text,
148                                 GdmGreeterSession *session)
149{
150        g_debug ("GdmGreeterSession: default session name changed: %s", text);
151        gdm_greeter_panel_set_default_session_name (GDM_GREETER_PANEL (session->priv->panel),
152                                                    text);
153}
154
155static void
156on_timed_login_requested (GdmGreeterClient  *client,
157                          const char        *text,
158                          int                delay,
159                          GdmGreeterSession *session)
160{
161        g_debug ("GdmGreeterSession: timed login requested for user %s (in %d seconds)", text, delay);
162        gdm_greeter_login_window_request_timed_login (GDM_GREETER_LOGIN_WINDOW (session->priv->login_window), text, delay);
163}
164
165static void
166on_user_authorized (GdmGreeterClient  *client,
167                    GdmGreeterSession *session)
168{
169        g_debug ("GdmGreeterSession: user authorized");
170        gdm_greeter_login_window_user_authorized (GDM_GREETER_LOGIN_WINDOW (session->priv->login_window));
171}
172
173static void
174on_info_query (GdmGreeterClient  *client,
175               const char        *text,
176               GdmGreeterSession *session)
177{
178        g_debug ("GdmGreeterSession: Info query: %s", text);
179
180        gdm_greeter_login_window_info_query (GDM_GREETER_LOGIN_WINDOW (session->priv->login_window), text);
181}
182
183static void
184on_secret_info_query (GdmGreeterClient  *client,
185                      const char        *text,
186                      GdmGreeterSession *session)
187{
188        g_debug ("GdmGreeterSession: Secret info query: %s", text);
189
190        gdm_greeter_login_window_secret_info_query (GDM_GREETER_LOGIN_WINDOW (session->priv->login_window), text);
191}
192
193static void
194on_begin_auto_login (GdmGreeterLoginWindow *login_window,
195                     const char            *username,
196                     GdmGreeterSession     *session)
197{
198        gdm_greeter_client_call_begin_auto_login (session->priv->client,
199                                                  username);
200}
201
202static void
203on_begin_verification (GdmGreeterLoginWindow *login_window,
204                       GdmGreeterSession     *session)
205{
206        gdm_greeter_client_call_begin_verification (session->priv->client);
207}
208
209static void
210on_begin_verification_for_user (GdmGreeterLoginWindow *login_window,
211                                const char            *username,
212                                GdmGreeterSession     *session)
213{
214        gdm_greeter_client_call_begin_verification_for_user (session->priv->client,
215                                                             username);
216}
217
218static void
219on_query_answer (GdmGreeterLoginWindow *login_window,
220                 const char            *text,
221                 GdmGreeterSession     *session)
222{
223        gdm_greeter_client_call_answer_query (session->priv->client,
224                                              text);
225}
226
227static void
228on_select_session (GdmGreeterSession     *session,
229                   const char            *text)
230{
231        gdm_greeter_client_call_select_session (session->priv->client,
232                                                text);
233}
234
235static void
236on_select_language (GdmGreeterSession     *session,
237                    const char            *text)
238{
239        gdm_greeter_client_call_select_language (session->priv->client,
240                                                 text);
241}
242
243static void
244on_select_layout (GdmGreeterSession      *session,
245                  const char             *text)
246{
247        gdm_greeter_client_call_select_layout (session->priv->client,
248                                               text);
249}
250
251static void
252on_dialog_hidden (GdmGreeterSession     *session)
253{
254        gtk_window_present (GTK_WINDOW (session->priv->login_window));
255}
256
257static void
258on_select_user (GdmGreeterLoginWindow *login_window,
259                const char            *text,
260                GdmGreeterSession     *session)
261{
262        show_or_hide_user_options (session, text);
263        gdm_greeter_client_call_select_user (session->priv->client,
264                                             text);
265}
266
267static void
268on_cancelled (GdmGreeterLoginWindow *login_window,
269              GdmGreeterSession     *session)
270{
271        gdm_greeter_panel_hide_user_options (GDM_GREETER_PANEL (session->priv->panel));
272        gdm_greeter_client_call_cancel (session->priv->client);
273}
274
275static void
276on_disconnected (GdmGreeterLoginWindow *login_window,
277                 GdmGreeterSession     *session)
278{
279        gdm_greeter_client_call_disconnect (session->priv->client);
280}
281
282static void
283on_start_session (GdmGreeterLoginWindow *login_window,
284                  GdmGreeterSession     *session)
285{
286        gdm_greeter_client_call_start_session_when_ready (session->priv->client, TRUE);
287}
288
289static int
290get_tallest_monitor_at_point (GdkScreen *screen,
291                              int        x,
292                              int        y)
293{
294        GdkRectangle area;
295        GdkRegion *region;
296        int i;
297        int monitor;
298        int n_monitors;
299        int tallest_height;
300
301        tallest_height = 0;
302        n_monitors = gdk_screen_get_n_monitors (screen);
303        monitor = -1;
304        for (i = 0; i < n_monitors; i++) {
305                gdk_screen_get_monitor_geometry (screen, i, &area);
306                region = gdk_region_rectangle (&area);
307
308                if (gdk_region_point_in (region, x, y)) {
309                        if (area.height > tallest_height) {
310                                monitor = i;
311                                tallest_height = area.height;
312                        }
313                }
314                gdk_region_destroy (region);
315        }
316
317        if (monitor == -1) {
318                monitor = gdk_screen_get_monitor_at_point (screen, x, y);
319        }
320
321        return monitor;
322}
323
324static void
325toggle_panel (GdmGreeterSession *session,
326              gboolean           enabled)
327{
328        gdm_profile_start (NULL);
329
330        if (enabled) {
331                GdkDisplay *display;
332                GdkScreen  *screen;
333                int         monitor;
334                int         x, y;
335
336                display = gdk_display_get_default ();
337                gdk_display_get_pointer (display, &screen, &x, &y, NULL);
338
339                monitor = get_tallest_monitor_at_point (screen, x, y);
340
341                session->priv->panel = gdm_greeter_panel_new (screen, monitor);
342
343                g_signal_connect_swapped (session->priv->panel,
344                                          "language-selected",
345                                          G_CALLBACK (on_select_language),
346                                          session);
347
348                g_signal_connect_swapped (session->priv->panel,
349                                          "layout-selected",
350                                          G_CALLBACK (on_select_layout),
351                                          session);
352
353                g_signal_connect_swapped (session->priv->panel,
354                                          "session-selected",
355                                          G_CALLBACK (on_select_session),
356                                          session);
357
358                g_signal_connect_swapped (session->priv->panel,
359                                          "dialog-hidden",
360                                          G_CALLBACK (on_dialog_hidden),
361                                          session);
362
363                gtk_widget_show (session->priv->panel);
364        } else {
365                gtk_widget_destroy (session->priv->panel);
366                session->priv->panel = NULL;
367        }
368
369        gdm_profile_end (NULL);
370}
371
372static void
373toggle_login_window (GdmGreeterSession *session,
374                     gboolean           enabled)
375{
376        gdm_profile_start (NULL);
377
378        if (enabled) {
379                gboolean is_local;
380
381                is_local = gdm_greeter_client_get_display_is_local (session->priv->client);
382                g_debug ("GdmGreeterSession: Starting a login window local:%d", is_local);
383                session->priv->login_window = gdm_greeter_login_window_new (is_local);
384
385                g_signal_connect (session->priv->login_window,
386                                  "begin-auto-login",
387                                  G_CALLBACK (on_begin_auto_login),
388                                  session);
389                g_signal_connect (session->priv->login_window,
390                                  "begin-verification",
391                                  G_CALLBACK (on_begin_verification),
392                                  session);
393                g_signal_connect (session->priv->login_window,
394                                  "begin-verification-for-user",
395                                  G_CALLBACK (on_begin_verification_for_user),
396                                  session);
397                g_signal_connect (session->priv->login_window,
398                                  "query-answer",
399                                  G_CALLBACK (on_query_answer),
400                                  session);
401                g_signal_connect (session->priv->login_window,
402                                  "user-selected",
403                                  G_CALLBACK (on_select_user),
404                                  session);
405                g_signal_connect (session->priv->login_window,
406                                  "cancelled",
407                                  G_CALLBACK (on_cancelled),
408                                  session);
409                g_signal_connect (session->priv->login_window,
410                                  "disconnected",
411                                  G_CALLBACK (on_disconnected),
412                                  session);
413                g_signal_connect (session->priv->login_window,
414                                  "start-session",
415                                  G_CALLBACK (on_start_session),
416                                  session);
417                gtk_widget_show (session->priv->login_window);
418        } else {
419                gtk_widget_destroy (session->priv->login_window);
420                session->priv->login_window = NULL;
421        }
422        gdm_profile_end (NULL);
423}
424
425gboolean
426gdm_greeter_session_start (GdmGreeterSession *session,
427                           GError           **error)
428{
429        gboolean res;
430
431        g_return_val_if_fail (GDM_IS_GREETER_SESSION (session), FALSE);
432
433        gdm_profile_start (NULL);
434
435        res = gdm_greeter_client_start (session->priv->client, error);
436
437        toggle_panel (session, TRUE);
438        toggle_login_window (session, TRUE);
439
440        gdm_profile_end (NULL);
441
442        return res;
443}
444
445void
446gdm_greeter_session_stop (GdmGreeterSession *session)
447{
448        g_return_if_fail (GDM_IS_GREETER_SESSION (session));
449
450        toggle_panel (session, FALSE);
451        toggle_login_window (session, FALSE);
452}
453
454static void
455gdm_greeter_session_set_property (GObject        *object,
456                                  guint           prop_id,
457                                  const GValue   *value,
458                                  GParamSpec     *pspec)
459{
460        switch (prop_id) {
461        default:
462                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
463                break;
464        }
465}
466
467static void
468gdm_greeter_session_get_property (GObject        *object,
469                                  guint           prop_id,
470                                  GValue         *value,
471                                  GParamSpec     *pspec)
472{
473        switch (prop_id) {
474        default:
475                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
476                break;
477        }
478}
479
480static GObject *
481gdm_greeter_session_constructor (GType                  type,
482                                 guint                  n_construct_properties,
483                                 GObjectConstructParam *construct_properties)
484{
485        GdmGreeterSession      *greeter_session;
486
487        greeter_session = GDM_GREETER_SESSION (G_OBJECT_CLASS (gdm_greeter_session_parent_class)->constructor (type,
488                                                                                                               n_construct_properties,
489                                                                                                               construct_properties));
490
491        return G_OBJECT (greeter_session);
492}
493
494static void
495gdm_greeter_session_dispose (GObject *object)
496{
497        g_debug ("GdmGreeterSession: Disposing greeter_session");
498
499        G_OBJECT_CLASS (gdm_greeter_session_parent_class)->dispose (object);
500}
501
502static void
503gdm_greeter_session_class_init (GdmGreeterSessionClass *klass)
504{
505        GObjectClass   *object_class = G_OBJECT_CLASS (klass);
506
507        object_class->get_property = gdm_greeter_session_get_property;
508        object_class->set_property = gdm_greeter_session_set_property;
509        object_class->constructor = gdm_greeter_session_constructor;
510        object_class->dispose = gdm_greeter_session_dispose;
511        object_class->finalize = gdm_greeter_session_finalize;
512
513        g_type_class_add_private (klass, sizeof (GdmGreeterSessionPrivate));
514}
515
516static void
517gdm_greeter_session_event_handler (GdkEvent          *event,
518                                   GdmGreeterSession *session)
519{
520        g_assert (GDM_IS_GREETER_SESSION (session));
521
522        if (event->type == GDK_KEY_PRESS) {
523                GdkEventKey *key_event;
524
525                key_event = (GdkEventKey *) event;
526                if (session->priv->panel != NULL) {
527                        if (gtk_window_activate_key (GTK_WINDOW (session->priv->panel),
528                                                     key_event)) {
529                                gtk_window_present_with_time (GTK_WINDOW (session->priv->panel),
530                                                              key_event->time);
531                                return;
532                        }
533                }
534
535                if (session->priv->login_window != NULL) {
536                        if (gtk_window_activate_key (GTK_WINDOW (session->priv->login_window),
537                                                     ((GdkEventKey *) event))) {
538                                gtk_window_present_with_time (GTK_WINDOW (session->priv->login_window),
539                                                              key_event->time);
540                                return;
541                        }
542                }
543        }
544
545        gtk_main_do_event (event);
546}
547
548static void
549gdm_greeter_session_init (GdmGreeterSession *session)
550{
551        gdm_profile_start (NULL);
552
553        session->priv = GDM_GREETER_SESSION_GET_PRIVATE (session);
554
555        session->priv->client = gdm_greeter_client_new ();
556        g_signal_connect (session->priv->client,
557                          "info-query",
558                          G_CALLBACK (on_info_query),
559                          session);
560        g_signal_connect (session->priv->client,
561                          "secret-info-query",
562                          G_CALLBACK (on_secret_info_query),
563                          session);
564        g_signal_connect (session->priv->client,
565                          "info",
566                          G_CALLBACK (on_info),
567                          session);
568        g_signal_connect (session->priv->client,
569                          "problem",
570                          G_CALLBACK (on_problem),
571                          session);
572        g_signal_connect (session->priv->client,
573                          "ready",
574                          G_CALLBACK (on_ready),
575                          session);
576        g_signal_connect (session->priv->client,
577                          "reset",
578                          G_CALLBACK (on_reset),
579                          session);
580        g_signal_connect (session->priv->client,
581                          "selected-user-changed",
582                          G_CALLBACK (on_selected_user_changed),
583                          session);
584        g_signal_connect (session->priv->client,
585                          "default-language-name-changed",
586                          G_CALLBACK (on_default_language_name_changed),
587                          session);
588        g_signal_connect (session->priv->client,
589                          "default-layout-name-changed",
590                          G_CALLBACK (on_default_layout_name_changed),
591                          session);
592        g_signal_connect (session->priv->client,
593                          "default-session-name-changed",
594                          G_CALLBACK (on_default_session_name_changed),
595                          session);
596        g_signal_connect (session->priv->client,
597                          "timed-login-requested",
598                          G_CALLBACK (on_timed_login_requested),
599                          session);
600        g_signal_connect (session->priv->client,
601                          "user-authorized",
602                          G_CALLBACK (on_user_authorized),
603                          session);
604
605        /* We want to listen for panel mnemonics even if the
606         * login window is focused, so we intercept them here.
607         */
608        gdk_event_handler_set ((GdkEventFunc) gdm_greeter_session_event_handler,
609                               session, NULL);
610
611        gdm_profile_end (NULL);
612}
613
614static void
615gdm_greeter_session_finalize (GObject *object)
616{
617        GdmGreeterSession *greeter_session;
618
619        g_return_if_fail (object != NULL);
620        g_return_if_fail (GDM_IS_GREETER_SESSION (object));
621
622        greeter_session = GDM_GREETER_SESSION (object);
623
624        g_return_if_fail (greeter_session->priv != NULL);
625
626        G_OBJECT_CLASS (gdm_greeter_session_parent_class)->finalize (object);
627}
628
629GdmGreeterSession *
630gdm_greeter_session_new (void)
631{
632        if (session_object != NULL) {
633                g_object_ref (session_object);
634        } else {
635                session_object = g_object_new (GDM_TYPE_GREETER_SESSION, NULL);
636                g_object_add_weak_pointer (session_object,
637                                           (gpointer *) &session_object);
638        }
639
640        return GDM_GREETER_SESSION (session_object);
641}
Note: See TracBrowser for help on using the repository browser.