diff options
author | Sean Davis <smd.seandavis@gmail.com> | 2014-01-15 07:04:30 -0500 |
---|---|---|
committer | Sean Davis <smd.seandavis@gmail.com> | 2014-01-15 07:04:30 -0500 |
commit | 9a0649c73a92f3a9fe3d710ca0d18bc9ed614c3e (patch) | |
tree | 615c831c2d8fc1cc75a43413de608e159ef13c61 | |
parent | 0fca42c37bb38601a51d298b28f4c01d8e893e04 (diff) | |
parent | 85a3fb797eba5fe756f88ae9f502c6e0a3ace9fd (diff) | |
download | lightdm-gtk-greeter-trunk.tar.gz |
Merge latest, fix gdk_display_get_n_screenstrunk
-rw-r--r-- | src/lightdm-gtk-greeter.c | 94 |
1 files changed, 71 insertions, 23 deletions
diff --git a/src/lightdm-gtk-greeter.c b/src/lightdm-gtk-greeter.c index b912e5f..1b3cfe6 100644 --- a/src/lightdm-gtk-greeter.c +++ b/src/lightdm-gtk-greeter.c @@ -52,7 +52,7 @@ static GdkPixbuf *background_pixbuf = NULL; /* Panel Widgets */ static GtkWindow *panel_window; static GtkWidget *clock_label; -static GtkWidget *menubar; +static GtkWidget *menubar, *session_menuitem, *language_menuitem; static GtkMenu *session_menu, *language_menu; static GtkCheckMenuItem *keyboard_menuitem; @@ -71,6 +71,8 @@ static GPid a11y_kbd_pid = 0; static GError *a11y_keyboard_error; static GtkWindow *onboard_window; +GSList *backgrounds = NULL; + /* Current choices */ static gchar *current_session; static gchar *current_language; @@ -444,8 +446,8 @@ set_login_button_label (LightDMGreeter *greeter, const gchar *username) else gtk_button_set_label (login_button, _("Log In")); /* and disable the session and language comboboxes */ - gtk_widget_set_sensitive (GTK_WIDGET (session_menu), !logged_in); - gtk_widget_set_sensitive (GTK_WIDGET (language_menu), !logged_in); + gtk_widget_set_sensitive (GTK_WIDGET (session_menuitem), !logged_in); + gtk_widget_set_sensitive (GTK_WIDGET (language_menuitem), !logged_in); } static void set_background (GdkPixbuf *new_bg); @@ -545,10 +547,10 @@ center_window (GtkWindow *window, GtkAllocation *unused, const WindowPosition *p static gboolean panel_expose (GtkWidget *widget, cairo_t *cr, gpointer user_data) { - if (default_background_color) - gdk_cairo_set_source_rgba (cr, default_background_color); - else + if (background_pixbuf) gdk_cairo_set_source_pixbuf (cr, background_pixbuf, 0, 0); + else + gdk_cairo_set_source_rgba (cr, default_background_color); cairo_paint (cr); return FALSE; } @@ -561,16 +563,17 @@ login_window_expose (GtkWidget *widget, cairo_t *cr, gpointer user_data) GdkRectangle monitor_geometry; gint x,y; - gdk_screen_get_monitor_geometry (screen, gdk_screen_get_primary_monitor (screen), &monitor_geometry); - gtk_widget_get_allocation (widget, allocation); - - x = get_absolute_position (&main_window_pos.x, monitor_geometry.width, allocation->width); - y = get_absolute_position (&main_window_pos.y, monitor_geometry.height, allocation->height); - - if (default_background_color) - gdk_cairo_set_source_rgba (cr, default_background_color); - else + if (background_pixbuf) + { + gdk_screen_get_monitor_geometry (screen, gdk_screen_get_primary_monitor (screen), &monitor_geometry); + gtk_widget_get_allocation (widget, allocation); + x = get_absolute_position (&main_window_pos.x, monitor_geometry.width, allocation->width); + y = get_absolute_position (&main_window_pos.y, monitor_geometry.height, allocation->height); gdk_cairo_set_source_pixbuf (cr, background_pixbuf, monitor_geometry.x - x, monitor_geometry.y - y); + } + else + gdk_cairo_set_source_rgba (cr, default_background_color); + cairo_paint (cr); g_free (allocation); @@ -1672,6 +1675,7 @@ set_background (GdkPixbuf *new_bg) { GdkRectangle monitor_geometry; GdkPixbuf *bg = NULL; + GSList *iter; gint i, p_height, p_width, height, width; gdouble scale; int numScreens = 1; @@ -1744,6 +1748,8 @@ set_background (GdkPixbuf *new_bg) gdk_cairo_set_source_color (c, default_background_color); #endif cairo_paint (c); + iter = g_slist_nth(backgrounds, monitor); + gtk_widget_queue_draw(GTK_WIDGET(iter->data)); } cairo_destroy (c); @@ -1879,7 +1885,13 @@ main (int argc, char **argv) gsize length = 0; guint indicators_loaded = 0, i; #endif - + + /* Background windows */ + gint monitor, scr; + GdkScreen *screen; + GtkWidget *window; + int numScreens = 1; + Display* display; /* Disable global menus */ @@ -1971,7 +1983,7 @@ main (int argc, char **argv) if (lightdm_greeter_get_lock_hint (greeter)) { XGetScreenSaver(display, &timeout, &interval, &prefer_blanking, &allow_exposures); XForceScreenSaver(display, ScreenSaverActive); - XSetScreenSaver(display, 30, 0, ScreenSaverActive, DefaultExposures); + XSetScreenSaver(display, 10, 0, ScreenSaverActive, DefaultExposures); } /* Set GTK+ settings */ value = g_key_file_get_value (config, "greeter", "theme-name", NULL); @@ -2161,7 +2173,7 @@ main (int argc, char **argv) clock_format = "%a, %H:%M"; /* Session menu */ - menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "session_menuitem")); + session_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "session_menuitem")); #if GTK_CHECK_VERSION (3, 0, 0) if (gtk_icon_theme_has_icon(icon_theme, "document-properties-symbolic")) image = gtk_image_new_from_icon_name ("document-properties-symbolic", GTK_ICON_SIZE_MENU); @@ -2171,8 +2183,8 @@ main (int argc, char **argv) image = gtk_image_new_from_icon_name ("document-properties", GTK_ICON_SIZE_MENU); #endif gtk_widget_show (image); - gtk_container_add (GTK_CONTAINER (menuitem), image); - gtk_widget_show (GTK_WIDGET (menuitem)); + gtk_container_add (GTK_CONTAINER (session_menuitem), image); + gtk_widget_show (GTK_WIDGET (session_menuitem)); items = lightdm_get_sessions (); GSList *sessions = NULL; @@ -2193,7 +2205,7 @@ main (int argc, char **argv) /* Language menu */ if (g_key_file_get_boolean (config, "greeter", "show-language-selector", NULL)) { - menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "language_menuitem")); + language_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "language_menuitem")); #if GTK_CHECK_VERSION (3, 0, 0) if (gtk_icon_theme_has_icon(icon_theme, "preferences-desktop-locale-symbolic")) image = gtk_image_new_from_icon_name ("preferences-desktop-locale-symbolic", GTK_ICON_SIZE_MENU); @@ -2203,7 +2215,7 @@ main (int argc, char **argv) image = gtk_image_new_from_icon_name ("preferences-desktop-locale", GTK_ICON_SIZE_MENU); #endif gtk_widget_show (image); - gtk_container_add (GTK_CONTAINER (menuitem), image); + gtk_container_add (GTK_CONTAINER (language_menuitem), image); items = lightdm_get_languages (); GSList *languages = NULL; @@ -2229,7 +2241,7 @@ main (int argc, char **argv) label = label_new; } - gtk_widget_show (GTK_WIDGET (menuitem)); + gtk_widget_show (GTK_WIDGET (language_menuitem)); radiomenuitem = gtk_radio_menu_item_new_with_label (languages, label); g_object_set_data (G_OBJECT (radiomenuitem), "language-code", (gpointer) code); languages = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (radiomenuitem)); @@ -2285,6 +2297,42 @@ main (int argc, char **argv) gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (user_combo), renderer, "text", 1); gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (user_combo), renderer, "weight", 2); + #if GDK_VERSION_CUR_STABLE < G_ENCODE_VERSION(3, 10) + numScreens = gdk_display_get_n_screens (gdk_display_get_default()); + #endif + + /* Set up the background images */ + for (scr = 0; scr < numScreens; scr++) + { + screen = gdk_display_get_screen (gdk_display_get_default (), scr); + for (monitor = 0; monitor < gdk_screen_get_n_monitors (screen); monitor++) + { + gdk_screen_get_monitor_geometry (screen, monitor, &monitor_geometry); + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DESKTOP); +#if GTK_CHECK_VERSION (3, 0, 0) + gtk_widget_override_background_color(GTK_WIDGET(window), GTK_STATE_FLAG_NORMAL, &background_color); +#else + gtk_widget_modify_bg(GTK_WIDGET(window), GTK_STATE_NORMAL, &background_color); +#endif + gtk_window_set_screen(GTK_WINDOW(window), screen); + gtk_window_set_keep_below(GTK_WINDOW(window), TRUE); + gtk_widget_set_size_request(window, monitor_geometry.width, monitor_geometry.height); + gtk_window_set_resizable (GTK_WINDOW(window), FALSE); + gtk_widget_set_app_paintable (GTK_WIDGET(window), TRUE); + gtk_window_move (GTK_WINDOW(window), monitor_geometry.x, monitor_geometry.y); + + backgrounds = g_slist_prepend(backgrounds, window); + gtk_widget_show (window); +#if GTK_CHECK_VERSION (3, 0, 0) + g_signal_connect (G_OBJECT (window), "draw", G_CALLBACK (panel_expose), NULL); +#endif + gtk_widget_queue_draw (GTK_WIDGET(window)); + } + } + backgrounds = g_slist_reverse(backgrounds); + if (lightdm_greeter_get_hide_users_hint (greeter)) { /* Set the background to default */ |