~bluesabre/ubuntu/trusty/lightdm-gtk-greeter/bug-1331871

« back to all changes in this revision

Viewing changes to src/lightdm-gtk-greeter.c

  • Committer: Package Import Robot
  • Author(s): Lionel Le Folgoc
  • Date: 2013-01-24 16:10:33 UTC
  • mfrom: (1.1.5)
  • Revision ID: package-import@ubuntu.com-20130124161033-4jq2ulxa67j2wobg
Tags: 1.5.0-0ubuntu1
* New upstream release.
* debian/control: bump liblightdm-gobject-1-dev b-dep to >= 1.3.5.

Show diffs side-by-side

added added

removed removed

Lines of Context:
31
31
static GtkComboBox *session_combo;
32
32
static GtkComboBox *language_combo;
33
33
static gchar *default_font_name, *default_theme_name, *default_icon_theme_name;
 
34
static GdkPixbuf *default_background_pixbuf = NULL;
 
35
static GdkRGBA *default_background_color = NULL;
34
36
static gboolean cancelling = FALSE, prompted = FALSE;
35
37
 
36
38
static gchar *
162
164
        gtk_widget_set_sensitive (GTK_WIDGET (language_combo), !logged_in);
163
165
}
164
166
 
 
167
static void set_background (GdkPixbuf *new_bg);
 
168
 
 
169
static void
 
170
set_user_background (const gchar *username)
 
171
{
 
172
    LightDMUser *user;
 
173
    const gchar *path;
 
174
    GdkPixbuf *bg = NULL;
 
175
    GError *error = NULL;
 
176
 
 
177
    user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
 
178
    if (user)
 
179
    {
 
180
        path = lightdm_user_get_background (user);
 
181
        if (path)
 
182
        {
 
183
            bg = gdk_pixbuf_new_from_file (path, &error);
 
184
            if (!bg)
 
185
            {
 
186
                g_warning ("Failed to load user background: %s", error->message);
 
187
                g_clear_error (&error);
 
188
            }
 
189
        }
 
190
    }
 
191
 
 
192
    set_background (bg);
 
193
    if (bg)
 
194
        g_object_unref (bg);
 
195
}
 
196
 
165
197
static void
166
198
start_authentication (const gchar *username)
167
199
{
312
344
            gtk_widget_hide (GTK_WIDGET (cancel_button));
313
345
 
314
346
        set_login_button_label (user);
 
347
        set_user_background (user);
315
348
        start_authentication (user);
316
349
        g_free (user);
317
350
    }
393
426
}
394
427
 
395
428
static void
396
 
autologin_timer_expired_cb (LightDMGreeter *greeter)
397
 
{
398
 
    if (lightdm_greeter_get_autologin_guest_hint (greeter))
399
 
        start_authentication ("*guest");
400
 
    else if (lightdm_greeter_get_autologin_user_hint (greeter))
401
 
        start_authentication (lightdm_greeter_get_autologin_user_hint (greeter));
402
 
}
403
 
 
404
 
static void
405
429
center_window (GtkWindow *window)
406
430
{
407
431
    GdkScreen *screen;
675
699
            {
676
700
                gtk_combo_box_set_active_iter (user_combo, &iter);
677
701
                set_login_button_label (selected_user);
 
702
                set_user_background (selected_user);
678
703
                start_authentication (selected_user);
679
704
                break;
680
705
            }
720
745
                                cairo_xlib_surface_get_drawable (surface));
721
746
 
722
747
 
723
 
    return surface;  
 
748
    return surface;
 
749
}
 
750
 
 
751
static void
 
752
set_background (GdkPixbuf *new_bg)
 
753
{
 
754
    GdkRectangle monitor_geometry;
 
755
    GdkPixbuf *bg = NULL;
 
756
    gint i;
 
757
 
 
758
    if (new_bg)
 
759
        bg = new_bg;
 
760
    else
 
761
        bg = default_background_pixbuf;
 
762
 
 
763
    /* Set the background */
 
764
    for (i = 0; i < gdk_display_get_n_screens (gdk_display_get_default ()); i++)
 
765
    {
 
766
        GdkScreen *screen;
 
767
        cairo_surface_t *surface;
 
768
        cairo_t *c;
 
769
        int monitor;
 
770
 
 
771
        screen = gdk_display_get_screen (gdk_display_get_default (), i);
 
772
        surface = create_root_surface (screen);
 
773
        c = cairo_create (surface);
 
774
 
 
775
        for (monitor = 0; monitor < gdk_screen_get_n_monitors (screen); monitor++)
 
776
        {
 
777
            gdk_screen_get_monitor_geometry (screen, monitor, &monitor_geometry);
 
778
 
 
779
            if (bg)
 
780
            {
 
781
                GdkPixbuf *p = gdk_pixbuf_scale_simple (bg, monitor_geometry.width,
 
782
                                                        monitor_geometry.height, GDK_INTERP_BILINEAR);
 
783
                gdk_cairo_set_source_pixbuf (c, p, monitor_geometry.x, monitor_geometry.y);
 
784
                g_object_unref (p);
 
785
            }
 
786
            else
 
787
                gdk_cairo_set_source_rgba (c, default_background_color);
 
788
            cairo_paint (c);
 
789
        }
 
790
 
 
791
        cairo_destroy (c);
 
792
 
 
793
        /* Refresh background */
 
794
        gdk_flush ();
 
795
        XClearWindow (GDK_SCREEN_XDISPLAY (screen), RootWindow (GDK_SCREEN_XDISPLAY (screen), i));
 
796
    }
724
797
}
725
798
 
726
799
int
735
808
    GtkCellRenderer *renderer;
736
809
    GtkWidget *menuitem, *hbox, *image;
737
810
    gchar *value, *state_dir;
738
 
    GdkPixbuf *background_pixbuf = NULL;
739
811
    GdkRGBA background_color;
740
 
    gint i;
741
812
    GError *error = NULL;
742
813
 
743
814
    /* Disable global menus */
774
845
    g_signal_connect (greeter, "show-prompt", G_CALLBACK (show_prompt_cb), NULL);  
775
846
    g_signal_connect (greeter, "show-message", G_CALLBACK (show_message_cb), NULL);
776
847
    g_signal_connect (greeter, "authentication-complete", G_CALLBACK (authentication_complete_cb), NULL);
777
 
    g_signal_connect (greeter, "autologin-timer-expired", G_CALLBACK (autologin_timer_expired_cb), NULL);
 
848
    g_signal_connect (greeter, "autologin-timer-expired", G_CALLBACK (lightdm_greeter_authenticate_autologin), NULL);
778
849
    if (!lightdm_greeter_connect_sync (greeter, NULL))
779
850
        return EXIT_FAILURE;
780
851
 
796
867
            path = g_build_filename (GREETER_DATA_DIR, value, NULL);
797
868
 
798
869
        g_debug ("Loading background %s", path);
799
 
        background_pixbuf = gdk_pixbuf_new_from_file (path, &error);
800
 
        if (!background_pixbuf)
 
870
        default_background_pixbuf = gdk_pixbuf_new_from_file (path, &error);
 
871
        if (!default_background_pixbuf)
801
872
           g_warning ("Failed to load background: %s", error->message);
802
873
        g_clear_error (&error);
803
874
        g_free (path);
804
875
    }
805
876
    else
 
877
    {
806
878
        g_debug ("Using background color %s", value);
 
879
        default_background_color = gdk_rgba_copy (&background_color);
 
880
    }
807
881
    g_free (value);
808
882
 
809
883
    /* Set the background */
810
 
    for (i = 0; i < gdk_display_get_n_screens (gdk_display_get_default ()); i++)
811
 
    {
812
 
        GdkScreen *screen;
813
 
        cairo_surface_t *surface;
814
 
        cairo_t *c;
815
 
        int monitor;
816
 
 
817
 
        screen = gdk_display_get_screen (gdk_display_get_default (), i);
818
 
        surface = create_root_surface (screen);
819
 
        c = cairo_create (surface);
820
 
 
821
 
        for (monitor = 0; monitor < gdk_screen_get_n_monitors (screen); monitor++)
822
 
        {
823
 
            gdk_screen_get_monitor_geometry (screen, monitor, &monitor_geometry);
824
 
 
825
 
            if (background_pixbuf)
826
 
            {
827
 
                GdkPixbuf *pixbuf = gdk_pixbuf_scale_simple (background_pixbuf, monitor_geometry.width, monitor_geometry.height, GDK_INTERP_BILINEAR);
828
 
                gdk_cairo_set_source_pixbuf (c, pixbuf, monitor_geometry.x, monitor_geometry.y);
829
 
                g_object_unref (pixbuf);
830
 
            }
831
 
            else
832
 
                gdk_cairo_set_source_rgba (c, &background_color);
833
 
            cairo_paint (c);
834
 
        }
835
 
 
836
 
        cairo_destroy (c);
837
 
 
838
 
        /* Refresh background */
839
 
        gdk_flush ();
840
 
        XClearWindow (GDK_SCREEN_XDISPLAY (screen), RootWindow (GDK_SCREEN_XDISPLAY (screen), i));
841
 
    }
842
 
    if (background_pixbuf)
843
 
        g_object_unref (background_pixbuf);
 
884
    set_background (NULL);
844
885
 
845
886
    /* Set GTK+ settings */
846
887
    value = g_key_file_get_value (config, "greeter", "theme-name", NULL);
1051
1092
 
1052
1093
    gtk_main ();
1053
1094
 
 
1095
    if (default_background_pixbuf)
 
1096
        g_object_unref (default_background_pixbuf);
 
1097
    if (default_background_color)
 
1098
        gdk_rgba_free ( default_background_color);
 
1099
 
1054
1100
    return EXIT_SUCCESS;
1055
1101
}