]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Fix background image
authorRobert Ancell <robert.ancell@canonical.com>
Fri, 22 Jul 2011 01:49:25 +0000 (11:49 +1000)
committerRobert Ancell <robert.ancell@canonical.com>
Fri, 22 Jul 2011 01:49:25 +0000 (11:49 +1000)
configure.ac
greeters/gtk/greeter.ui
greeters/gtk/lightdm-gtk-greeter.c

index a9bb9a8bda0c9ab120b027adff71fc33c8ab17b1..3e8129c18da774f7576008b2ad15abc4a5e7060a 100644 (file)
@@ -184,7 +184,7 @@ src/Makefile
 tests/Makefile
 tests/src/Makefile
 ],
-[chmod +x tests/src/test-setup-guest tests/src/test-cleanup-guest])
+[chmod +x tests/src/test-guest-account])
 AC_OUTPUT
 
 dnl ###########################################################################
index bc878c7a1baa35a37222a5aa11ce80cd1b3b9319..9db295dc5b4a75f0de7003688f36bf34d47750ea 100644 (file)
     <property name="pixel_size">24</property>
     <property name="icon_name">preferences-desktop-accessibility</property>
   </object>
-  <object class="GtkWindow" id="greeter_window">
-    <property name="app_paintable">True</property>
+  <object class="GtkImage" id="language_menuitem_image">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="pixel_size">24</property>
+    <property name="icon_name">preferences-desktop-locale</property>
+  </object>
+  <object class="GtkWindow" id="login_window">
     <property name="can_focus">False</property>
-    <signal name="draw" handler="draw_background_cb" swapped="no"/>
+    <property name="resizable">False</property>
+    <property name="decorated">False</property>
+    <property name="has_resize_grip">False</property>
     <child>
-      <object class="GtkVBox" id="vbox1">
+      <object class="GtkNotebook" id="login_notebook">
+        <property name="width_request">400</property>
         <property name="visible">True</property>
-        <property name="can_focus">False</property>
+        <property name="can_focus">True</property>
+        <property name="show_tabs">False</property>
         <child>
-          <object class="GtkMenuBar" id="menubar">
+          <object class="GtkVBox" id="vbox2">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="pack_direction">rtl</property>
+            <property name="border_width">12</property>
+            <property name="spacing">6</property>
             <child>
-              <object class="GtkImageMenuItem" id="power_menuitem">
+              <object class="GtkImage" id="image1">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="use_action_appearance">False</property>
-                <property name="image">power_menuitem_image</property>
-                <property name="use_stock">False</property>
-                <property name="always_show_image">True</property>
-                <child type="submenu">
-                  <object class="GtkMenu" id="power_menu">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <child>
-                      <object class="GtkMenuItem" id="suspend_menuitem">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="use_action_appearance">False</property>
-                        <property name="label" translatable="yes">Suspend</property>
-                        <property name="use_underline">True</property>
-                        <signal name="activate" handler="suspend_cb" swapped="no"/>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkMenuItem" id="hibernate_menuitem">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="use_action_appearance">False</property>
-                        <property name="label" translatable="yes">Hibernate</property>
-                        <property name="use_underline">True</property>
-                        <signal name="activate" handler="hibernate_cb" swapped="no"/>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkMenuItem" id="restart_menuitem">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="use_action_appearance">False</property>
-                        <property name="label" translatable="yes">Restart...</property>
-                        <property name="use_underline">True</property>
-                        <signal name="activate" handler="restart_cb" swapped="no"/>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkMenuItem" id="shutdown_menuitem">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="use_action_appearance">False</property>
-                        <property name="label" translatable="yes">Shutdown...</property>
-                        <property name="use_underline">True</property>
-                        <signal name="activate" handler="shutdown_cb" swapped="no"/>
-                      </object>
-                    </child>
-                  </object>
-                </child>
+                <property name="pixel_size">64</property>
+                <property name="icon_name">computer</property>
               </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
             </child>
             <child>
-              <object class="GtkImageMenuItem" id="a11y_menuitem">
+              <object class="GtkLabel" id="hostname_label">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="use_action_appearance">False</property>
-                <property name="image">a11y_menuitem_image</property>
-                <property name="use_stock">False</property>
-                <property name="always_show_image">True</property>
-                <child type="submenu">
-                  <object class="GtkMenu" id="a11y_menu">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <child>
-                      <object class="GtkCheckMenuItem" id="large_font_menuitem">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="use_action_appearance">False</property>
-                        <property name="label" translatable="yes">Large Font</property>
-                        <property name="use_underline">True</property>
-                        <signal name="toggled" handler="a11y_font_cb" swapped="no"/>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkCheckMenuItem" id="high_contrast_menuitem">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="use_action_appearance">False</property>
-                        <property name="label" translatable="yes">High Contrast</property>
-                        <property name="use_underline">True</property>
-                        <signal name="toggled" handler="a11y_contrast_cb" swapped="no"/>
-                      </object>
-                    </child>
-                  </object>
-                </child>
+                <property name="label">hostname</property>
               </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
             </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkAlignment" id="login_window_alignment">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="xscale">0</property>
-            <property name="yscale">0</property>
             <child>
-              <object class="GtkNotebook" id="login_window">
-                <property name="width_request">400</property>
-                <property name="visible">True</property>
+              <object class="GtkTreeView" id="user_treeview">
                 <property name="can_focus">True</property>
-                <property name="show_tabs">False</property>
+                <property name="model">user_liststore</property>
+                <property name="headers_visible">False</property>
+                <property name="fixed_height_mode">True</property>
+                <property name="enable_grid_lines">horizontal</property>
+                <signal name="button-press-event" handler="user_treeview_button_press_event_cb" swapped="no"/>
+                <signal name="row-activated" handler="user_treeview_row_activated_cb" swapped="no"/>
+                <child internal-child="selection">
+                  <object class="GtkTreeSelection" id="treeview-selection1"/>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkVBox" id="prompt_box">
+                <property name="can_focus">False</property>
+                <property name="spacing">6</property>
                 <child>
-                  <object class="GtkVBox" id="vbox2">
+                  <object class="GtkHBox" id="hbox1">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="border_width">12</property>
                     <property name="spacing">6</property>
                     <child>
-                      <object class="GtkImage" id="image1">
+                      <object class="GtkLabel" id="prompt_label">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="pixel_size">64</property>
-                        <property name="icon_name">computer</property>
+                        <property name="label">Password:</property>
                       </object>
                       <packing>
                         <property name="expand">False</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkLabel" id="hostname_label">
+                      <object class="GtkEntry" id="prompt_entry">
                         <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="label">hostname</property>
+                        <property name="can_focus">True</property>
+                        <property name="invisible_char">•</property>
+                        <property name="primary_icon_activatable">False</property>
+                        <property name="secondary_icon_activatable">False</property>
+                        <signal name="activate" handler="login_cb" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">True</property>
                         <property name="position">1</property>
                       </packing>
                     </child>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="message_label">
+                    <property name="can_focus">False</property>
+                    <property name="label">Message</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkHBox" id="hbox2">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="spacing">6</property>
                     <child>
-                      <object class="GtkTreeView" id="user_treeview">
-                        <property name="can_focus">True</property>
-                        <property name="model">user_liststore</property>
-                        <property name="headers_visible">False</property>
-                        <property name="fixed_height_mode">True</property>
-                        <property name="enable_grid_lines">horizontal</property>
-                        <signal name="button-press-event" handler="user_treeview_button_press_event_cb" swapped="no"/>
-                        <signal name="row-activated" handler="user_treeview_row_activated_cb" swapped="no"/>
-                        <child internal-child="selection">
-                          <object class="GtkTreeSelection" id="treeview-selection1"/>
-                        </child>
+                      <object class="GtkComboBox" id="session_combobox">
+                        <property name="can_focus">False</property>
+                        <property name="model">session_liststore</property>
                       </object>
                       <packing>
                         <property name="expand">True</property>
                         <property name="fill">True</property>
-                        <property name="position">2</property>
+                        <property name="position">0</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkVBox" id="prompt_box">
-                        <property name="can_focus">False</property>
-                        <property name="spacing">6</property>
-                        <child>
-                          <object class="GtkHBox" id="hbox1">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="spacing">6</property>
-                            <child>
-                              <object class="GtkLabel" id="prompt_label">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label">Password:</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">True</property>
-                                <property name="position">0</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkEntry" id="prompt_entry">
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="invisible_char">•</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
-                                <signal name="activate" handler="login_cb" swapped="no"/>
-                              </object>
-                              <packing>
-                                <property name="expand">True</property>
-                                <property name="fill">True</property>
-                                <property name="position">1</property>
-                              </packing>
-                            </child>
-                          </object>
-                          <packing>
-                            <property name="expand">True</property>
-                            <property name="fill">True</property>
-                            <property name="position">0</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkLabel" id="message_label">
-                            <property name="can_focus">False</property>
-                            <property name="label">Message</property>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">True</property>
-                            <property name="position">1</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkHBox" id="hbox2">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="spacing">6</property>
-                            <child>
-                              <object class="GtkComboBox" id="session_combobox">
-                                <property name="can_focus">False</property>
-                                <property name="model">session_liststore</property>
-                              </object>
-                              <packing>
-                                <property name="expand">True</property>
-                                <property name="fill">True</property>
-                                <property name="position">0</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkButton" id="login_button">
-                                <property name="label" translatable="yes">Login</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">True</property>
-                                <property name="use_action_appearance">False</property>
-                                <signal name="clicked" handler="login_cb" swapped="no"/>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">True</property>
-                                <property name="pack_type">end</property>
-                                <property name="position">1</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkButton" id="cancel_button">
-                                <property name="label" translatable="yes">Cancel</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">True</property>
-                                <property name="use_action_appearance">False</property>
-                                <signal name="clicked" handler="cancel_cb" swapped="no"/>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">True</property>
-                                <property name="pack_type">end</property>
-                                <property name="position">2</property>
-                              </packing>
-                            </child>
-                          </object>
-                          <packing>
-                            <property name="expand">True</property>
-                            <property name="fill">True</property>
-                            <property name="position">2</property>
-                          </packing>
-                        </child>
+                      <object class="GtkButton" id="login_button">
+                        <property name="label" translatable="yes">Login</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="use_action_appearance">False</property>
+                        <signal name="clicked" handler="login_cb" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">False</property>
                         <property name="fill">True</property>
-                        <property name="position">3</property>
+                        <property name="pack_type">end</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="cancel_button">
+                        <property name="label" translatable="yes">Cancel</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="use_action_appearance">False</property>
+                        <signal name="clicked" handler="cancel_cb" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="pack_type">end</property>
+                        <property name="position">2</property>
                       </packing>
                     </child>
                   </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">2</property>
+                  </packing>
                 </child>
               </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">3</property>
+              </packing>
             </child>
           </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">1</property>
-          </packing>
+        </child>
+        <child type="tab">
+          <placeholder/>
         </child>
       </object>
     </child>
   </object>
-  <object class="GtkImage" id="language_menuitem_image">
-    <property name="visible">True</property>
+  <object class="GtkWindow" id="panel_window">
     <property name="can_focus">False</property>
-    <property name="pixel_size">24</property>
-    <property name="icon_name">preferences-desktop-locale</property>
+    <property name="decorated">False</property>
+    <property name="has_resize_grip">False</property>
+    <child>
+      <object class="GtkMenuBar" id="menubar">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="pack_direction">rtl</property>
+        <child>
+          <object class="GtkImageMenuItem" id="power_menuitem">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="use_action_appearance">False</property>
+            <property name="image">power_menuitem_image</property>
+            <property name="use_stock">False</property>
+            <property name="always_show_image">True</property>
+            <child type="submenu">
+              <object class="GtkMenu" id="power_menu">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <object class="GtkMenuItem" id="suspend_menuitem">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="use_action_appearance">False</property>
+                    <signal name="activate" handler="suspend_cb" swapped="no"/>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkMenuItem" id="hibernate_menuitem">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="use_action_appearance">False</property>
+                    <signal name="activate" handler="hibernate_cb" swapped="no"/>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkMenuItem" id="restart_menuitem">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="use_action_appearance">False</property>
+                    <signal name="activate" handler="restart_cb" swapped="no"/>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkMenuItem" id="shutdown_menuitem">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="use_action_appearance">False</property>
+                    <signal name="activate" handler="shutdown_cb" swapped="no"/>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkImageMenuItem" id="a11y_menuitem">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="use_action_appearance">False</property>
+            <property name="image">a11y_menuitem_image</property>
+            <property name="use_stock">False</property>
+            <property name="always_show_image">True</property>
+            <child type="submenu">
+              <object class="GtkMenu" id="a11y_menu">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <object class="GtkCheckMenuItem" id="large_font_menuitem">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="use_action_appearance">False</property>
+                    <signal name="toggled" handler="a11y_font_cb" swapped="no"/>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkCheckMenuItem" id="high_contrast_menuitem">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="use_action_appearance">False</property>
+                    <signal name="toggled" handler="a11y_contrast_cb" swapped="no"/>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
   </object>
   <object class="GtkImage" id="power_menuitem_image">
     <property name="visible">True</property>
index 8bf6543b574d4a95293a5a34e0d04e9c5e38e099..1bff4c818f954e572cf952f2b993c13e49ab5278 100644 (file)
@@ -9,20 +9,22 @@
  * license.
  */
 
+// FIXME: gdk_screen_get_monitor_geometry (screen, monitor, &rect);
+
 #include <stdlib.h>
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
-#include <cairo.h>
+#include <cairo-xlib.h>
 #include <gdk-pixbuf/gdk-pixbuf.h>
-#include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h>
+#include <gdk/gdkx.h>
 
 #include "lightdm.h"
 
 static LightDMGreeter *greeter;
-static GtkWidget *window, *message_label, *user_view;
-static GdkPixbuf *background_pixbuf = NULL;
+static GtkWindow *login_window, *panel_window;
+static GtkWidget *message_label, *user_view;
 static GtkWidget *prompt_box, *prompt_label, *prompt_entry, *session_combo;
-static gchar *theme_name;
+static gchar *default_theme_name;
 
 static gchar *
 get_session ()
@@ -226,19 +228,14 @@ hibernate_cb (GtkWidget *widget, LightDMGreeter *greeter)
 static void
 center_window (GtkWindow *window)
 {
-    GtkAllocation allocation;
-    GdkDisplay *display;
     GdkScreen *screen;
-    gint screen_width, screen_height;
+    GtkAllocation allocation;
 
+    screen = gtk_window_get_screen (window);
     gtk_widget_get_allocation (GTK_WIDGET (window), &allocation);
-    display = gdk_display_get_default ();
-    screen = gdk_display_get_default_screen (display);
-    screen_width = gdk_screen_get_width (screen);
-    screen_height = gdk_screen_get_height (screen);
-    gtk_window_move (GTK_WINDOW (window),
-                     (screen_width - allocation.width) / 2,
-                     (screen_height - allocation.height) / 2);
+    gtk_window_move (window,
+                     (gdk_screen_get_width (screen) - allocation.width) / 2,
+                     (gdk_screen_get_height (screen) - allocation.height) / 2);
 }
 
 void restart_cb (GtkWidget *widget, LightDMGreeter *greeter);
@@ -374,7 +371,7 @@ a11y_contrast_cb (GtkWidget *widget)
     if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget)))
         g_object_set (gtk_settings_get_default (), "gtk-theme-name", "HighContrastInverse", NULL);
     else
-        g_object_set (gtk_settings_get_default (), "gtk-theme-name", theme_name, NULL);
+        g_object_set (gtk_settings_get_default (), "gtk-theme-name", default_theme_name, NULL);
 }
 
 static void
@@ -383,20 +380,6 @@ sigterm_cb (int signum)
     exit (0);
 }
 
-gboolean draw_background_cb (GtkWidget *widget, cairo_t *context);
-G_MODULE_EXPORT
-gboolean
-draw_background_cb (GtkWidget *widget, cairo_t *context)
-{
-    if (background_pixbuf)
-        gdk_cairo_set_source_pixbuf (context, background_pixbuf, 0.0, 0.0);
-    else
-        cairo_set_source_rgb (context, 0, 0, 0);
-    cairo_fill (context);
-
-    return FALSE;
-}
-
 static void
 load_user_list ()
 {
@@ -457,10 +440,48 @@ load_user_list ()
                         -1);
 }
 
+static cairo_surface_t *
+create_root_surface (GdkScreen *screen)
+{
+    gint number, width, height;
+    Display *display;
+    Pixmap pixmap;
+    cairo_surface_t *surface;
+
+    number = gdk_screen_get_number (screen);
+    width = gdk_screen_get_width (screen);
+    height = gdk_screen_get_height (screen);
+
+    /* Open a new connection so with Retain Permanent so the pixmap remains when the greeter quits */
+    gdk_flush ();
+    display = XOpenDisplay (gdk_display_get_name (gdk_screen_get_display (screen)));
+    if (!display)
+    {
+        g_warning ("Failed to create root pixmap");
+        return NULL;
+    }
+    XSetCloseDownMode (display, RetainPermanent);
+    pixmap = XCreatePixmap (display, RootWindow (display, number), width, height, DefaultDepth (display, number));
+    XCloseDisplay (display);
+
+    /* Convert into a Cairo surface */
+    surface = cairo_xlib_surface_create (GDK_SCREEN_XDISPLAY (screen),
+                                         pixmap,
+                                         GDK_VISUAL_XVISUAL (gdk_screen_get_system_visual (screen)),
+                                         width, height);
+
+    /* Use this pixmap for the background */
+    XSetWindowBackgroundPixmap (GDK_SCREEN_XDISPLAY (screen),
+                                RootWindow (GDK_SCREEN_XDISPLAY (screen), number),
+                                cairo_xlib_surface_get_drawable (surface));
+
+
+    return surface;  
+}
+
 int
 main(int argc, char **argv)
 {
-    GdkWindow *root;
     GdkDisplay *display;
     GdkScreen *screen;
     gint screen_width, screen_height;
@@ -469,7 +490,11 @@ main(int argc, char **argv)
     const GList *items, *item;
     GtkTreeIter iter;
     GtkCellRenderer *renderer;
-    gchar *rc_file, *background_image;
+    gchar *theme_name, *background;
+    GdkPixbuf *background_pixbuf = NULL;
+    GdkColor background_color;
+    cairo_surface_t **background_surfaces;
+    gint i;
     GError *error = NULL;
 
     /* Disable global menus */
@@ -492,41 +517,24 @@ main(int argc, char **argv)
     screen_width = gdk_screen_get_width (screen);
     screen_height = gdk_screen_get_height (screen);
 
-    g_object_get (gtk_settings_get_default (), "gtk-theme-name", &theme_name, NULL);
-    rc_file = NULL; // FIXME
-    if (rc_file)
-    {
-        gchar *path = g_build_filename (GREETER_DATA_DIR, rc_file, NULL);
-        g_free (rc_file);
-        gtk_rc_add_default_file (path);
-        g_free (path);
-    }
+    /* Set default cursor */
+    gdk_window_set_cursor (gdk_get_default_root_window (), gdk_cursor_new (GDK_LEFT_PTR));
 
-    builder = gtk_builder_new ();
-    if (!gtk_builder_add_from_file (builder, GREETER_DATA_DIR "/greeter.ui", &error))
-    {
-        g_warning ("Error loading UI: %s", error->message);
-        return EXIT_FAILURE;
-    }
-    g_clear_error (&error);
-    window = GTK_WIDGET (gtk_builder_get_object (builder, "greeter_window"));
-    prompt_box = GTK_WIDGET (gtk_builder_get_object (builder, "prompt_box"));
-    prompt_label = GTK_WIDGET (gtk_builder_get_object (builder, "prompt_label"));
-    prompt_entry = GTK_WIDGET (gtk_builder_get_object (builder, "prompt_entry"));
-    message_label = GTK_WIDGET (gtk_builder_get_object (builder, "message_label"));
-    session_combo = GTK_WIDGET (gtk_builder_get_object (builder, "session_combobox"));
-  
-    gtk_label_set_text (GTK_LABEL (gtk_builder_get_object (builder, "hostname_label")), lightdm_get_hostname ());
-
-    background_image = NULL; // FIXME
-    if (background_image)
+    /* Load background */
+    background = g_strdup ("/usr/share/backgrounds/White_flowers_by_Garuna_bor-bor.jpg"); // FIXME
+    gdk_color_parse ("#000000", &background_color);
+    if (background && !gdk_color_parse (background, &background_color))
     {
         gchar *path;
         GdkPixbuf *pixbuf;
         GError *error = NULL;
 
-        path = g_build_filename (GREETER_DATA_DIR, background_image, NULL);
-        g_free (background_image);
+        if (g_path_is_absolute (background))
+            path = g_strdup (background);
+        else
+            path = g_build_filename (GREETER_DATA_DIR, background, NULL);
+
+        g_debug ("Loading background %s", path);
         pixbuf = gdk_pixbuf_new_from_file (path, &error);
         if (!pixbuf)
            g_warning ("Failed to load background: %s", error->message);
@@ -541,15 +549,54 @@ main(int argc, char **argv)
     }
 
     /* Set the background */
-    root = gdk_get_default_root_window ();
-    gdk_window_set_cursor (root, gdk_cursor_new (GDK_LEFT_PTR));
-    if (background_pixbuf)
+    background_surfaces = calloc (gdk_display_get_n_screens (display) + 1, sizeof (cairo_surface_t *));
+    for (i = 0; i < gdk_display_get_n_screens (display); i++)
     {
-        //GdkPixmap *pixmap;
+        cairo_t *c;
+
+        background_surfaces[i] = create_root_surface (gdk_display_get_screen (display, i));
+        c = cairo_create (background_surfaces[i]);
+
+        if (background_pixbuf)
+            gdk_cairo_set_source_pixbuf (c, background_pixbuf, 0.0, 0.0);
+        else
+            gdk_cairo_set_source_color (c, &background_color);
+        cairo_paint (c);
+
+        cairo_destroy (c);
+
+        gdk_flush ();
+
+
+        XClearWindow (GDK_SCREEN_XDISPLAY (screen), RootWindow (GDK_SCREEN_XDISPLAY (screen), i));
+    }
+    background_surfaces[i] = NULL;
+    if (background_pixbuf)
+        g_object_unref (background_pixbuf);
+
+    /* Set GTK+ theme to use */
+    theme_name = NULL; // FIXME
+    if (theme_name)
+        g_object_set (gtk_settings_get_default (), "gtk-theme-name", theme_name, NULL);  
+    g_object_get (gtk_settings_get_default (), "gtk-theme-name", &default_theme_name, NULL);
 
-        //gdk_pixbuf_render_pixmap_and_mask_for_colormap (background_pixbuf, gdk_window_get_colormap (root), &pixmap, NULL, 0);
-        //gdk_window_set_back_pixmap (root, pixmap, FALSE);
+    builder = gtk_builder_new ();
+    if (!gtk_builder_add_from_file (builder, GREETER_DATA_DIR "/greeter.ui", &error))
+    {
+        g_warning ("Error loading UI: %s", error->message);
+        return EXIT_FAILURE;
     }
+    g_clear_error (&error);
+
+    login_window = GTK_WINDOW (gtk_builder_get_object (builder, "login_window"));
+    prompt_box = GTK_WIDGET (gtk_builder_get_object (builder, "prompt_box"));
+    prompt_label = GTK_WIDGET (gtk_builder_get_object (builder, "prompt_label"));
+    prompt_entry = GTK_WIDGET (gtk_builder_get_object (builder, "prompt_entry"));
+    message_label = GTK_WIDGET (gtk_builder_get_object (builder, "message_label"));
+    session_combo = GTK_WIDGET (gtk_builder_get_object (builder, "session_combobox"));
+    panel_window = GTK_WINDOW (gtk_builder_get_object (builder, "panel_window"));
+
+    gtk_label_set_text (GTK_LABEL (gtk_builder_get_object (builder, "hostname_label")), lightdm_get_hostname ());
 
     if (!lightdm_get_can_suspend ())
         gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "suspend_menuitem")));
@@ -571,8 +618,9 @@ main(int argc, char **argv)
         load_user_list ();
         gtk_widget_show (user_view);
     }
-  
+
     // FIXME: Select the requested user if lightdm_greeter_get_select_user_hint () set
+    // FIXME: But don't start session if no user response
 
     renderer = gtk_cell_renderer_text_new();
     gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (session_combo), renderer, TRUE);
@@ -592,9 +640,15 @@ main(int argc, char **argv)
     }
     set_session (lightdm_greeter_get_default_session_hint (greeter));
 
-    gtk_window_set_default_size (GTK_WINDOW (window), screen_width, screen_height);
     gtk_builder_connect_signals(builder, greeter);
-    gtk_widget_show (window);
+
+    gtk_widget_show (GTK_WIDGET (login_window));
+    center_window (login_window);
+
+    gtk_widget_show (GTK_WIDGET (panel_window));
+    GtkAllocation allocation;
+    gtk_widget_get_allocation (GTK_WIDGET (panel_window), &allocation);
+    gtk_window_resize (panel_window, gdk_screen_get_width (screen), allocation.height);
 
     gtk_widget_grab_focus (user_view);