diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 4 | ||||
-rw-r--r-- | src/greeterbackground.c | 292 | ||||
-rw-r--r-- | src/greeterconfiguration.c | 68 | ||||
-rw-r--r-- | src/greeterdeprecated.c | 117 | ||||
-rw-r--r-- | src/greeterdeprecated.h | 41 | ||||
-rw-r--r-- | src/greetermenubar.c | 51 | ||||
-rw-r--r-- | src/lightdm-gtk-greeter.c | 414 |
7 files changed, 686 insertions, 301 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 1b79984..6e460be 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -13,7 +13,9 @@ lightdm_gtk_greeter_SOURCES = \ greeterconfiguration.c \ greeterconfiguration.h \ greetermenubar.c \ - greetermenubar.h + greetermenubar.h \ + greeterdeprecated.c \ + greeterdeprecated.h AM_CPPFLAGS = \ -I$(top_srcdir) \ diff --git a/src/greeterbackground.c b/src/greeterbackground.c index d88a7bf..854edd3 100644 --- a/src/greeterbackground.c +++ b/src/greeterbackground.c @@ -8,6 +8,7 @@ #include <X11/Xatom.h> #include "greeterbackground.h" +#include "greeterdeprecated.h" typedef enum { @@ -162,6 +163,8 @@ struct _GreeterBackgroundPrivate GList* active_monitors_config; const Monitor* active_monitor; + gboolean active_monitor_change_in_progress; + gint64 active_monitor_change_last_timestamp; /* List of monitors <Monitor*> with user-background=true*/ GSList* customized_monitors; @@ -199,20 +202,6 @@ static const gchar* ACTIVE_MONITOR_CURSOR_TAG = "#cursor"; G_DEFINE_TYPE_WITH_PRIVATE(GreeterBackground, greeter_background, G_TYPE_OBJECT); -void greeter_background_set_active_monitor_config (GreeterBackground* background, - const gchar* value); -void greeter_background_set_monitor_config (GreeterBackground* background, - const gchar* name, - const gchar* bg, /* NULL to use fallback value */ - gint user_bg, /* -1 to use fallback value */ - gint laptop, /* -1 to use fallback value */ - gint transition_duration, /* -1 to use fallback value */ - TransitionType transition_type); /* NULL to use fallback value */ -void greeter_background_remove_monitor_config (GreeterBackground* background, - const gchar* name); -gchar** greeter_background_get_configured_monitors (GreeterBackground* background); -void greeter_background_connect (GreeterBackground* background, - GdkScreen* screen); void greeter_background_disconnect (GreeterBackground* background); static gboolean greeter_background_find_monitor_data(GreeterBackground* background, GHashTable* table, @@ -368,9 +357,11 @@ greeter_background_init(GreeterBackground* self) GreeterBackground* greeter_background_new(GtkWidget* child) { + GreeterBackground *background; + g_return_val_if_fail(child != NULL, NULL); - GreeterBackground* background = GREETER_BACKGROUND(g_object_new(greeter_background_get_type(), NULL)); + background = GREETER_BACKGROUND(g_object_new(greeter_background_get_type(), NULL)); background->priv->child = child; g_signal_connect(background->priv->child, "destroy", G_CALLBACK(greeter_background_child_destroyed_cb), background); return background; @@ -380,31 +371,37 @@ void greeter_background_set_active_monitor_config(GreeterBackground* background, const gchar* value) { + GreeterBackgroundPrivate *priv; + gchar **iter; + gchar **values; + g_return_if_fail(GREETER_IS_BACKGROUND(background)); - GreeterBackgroundPrivate* priv = background->priv; + + priv = background->priv; g_list_free_full(priv->active_monitors_config, g_free); priv->active_monitors_config = NULL; + priv->active_monitor_change_in_progress = FALSE; + priv->active_monitor_change_last_timestamp = 0; priv->follow_cursor = FALSE; priv->follow_cursor_to_init = FALSE; - if(!value || !*value) + if (!value || !*value) return; - gchar** iter; - gchar** values = g_strsplit(value, ";", -1); + values = g_strsplit(value, ";", -1); for(iter = values; *iter; ++iter) { - const gchar* value = *iter; - if(g_strcmp0(value, ACTIVE_MONITOR_CURSOR_TAG) == 0) + const gchar* tag = *iter; + if (g_strcmp0(tag, ACTIVE_MONITOR_CURSOR_TAG) == 0) { priv->follow_cursor = TRUE; priv->follow_cursor_to_init = (priv->active_monitors_config == NULL); } else - priv->active_monitors_config = g_list_prepend(priv->active_monitors_config, g_strdup(value)); + priv->active_monitors_config = g_list_prepend(priv->active_monitors_config, g_strdup(tag)); } g_strfreev(values); @@ -420,12 +417,17 @@ greeter_background_set_monitor_config(GreeterBackground* background, gint transition_duration, TransitionType transition_type) { + GreeterBackgroundPrivate *priv; + MonitorConfig *config; + const MonitorConfig *FALLBACK; + g_return_if_fail(GREETER_IS_BACKGROUND(background)); - GreeterBackgroundPrivate* priv = background->priv; - MonitorConfig* config = g_new0(MonitorConfig, 1); + priv = background->priv; - const MonitorConfig* FALLBACK = (g_strcmp0(name, GREETER_BACKGROUND_DEFAULT) == 0) ? &DEFAULT_MONITOR_CONFIG : priv->default_config; + config = g_new0(MonitorConfig, 1); + + FALLBACK = (g_strcmp0(name, GREETER_BACKGROUND_DEFAULT) == 0) ? &DEFAULT_MONITOR_CONFIG : priv->default_config; if(!background_config_initialize(&config->bg, bg)) background_config_copy(&FALLBACK->bg, &config->bg); @@ -442,6 +444,7 @@ greeter_background_set_monitor_config(GreeterBackground* background, config->transition.func = transition_func_linear; break; case TRANSITION_TYPE_EASE_IN_OUT: config->transition.func = transition_func_ease_in_out; break; + case TRANSITION_TYPE_FALLBACK: default: config->transition.func = FALLBACK->transition.func; } @@ -467,15 +470,20 @@ greeter_background_remove_monitor_config(GreeterBackground* background, gchar** greeter_background_get_configured_monitors(GreeterBackground* background) { + GreeterBackgroundPrivate *priv; + GHashTableIter iter; + gpointer key; + gchar **names; + gint n; + g_return_val_if_fail(GREETER_IS_BACKGROUND(background), NULL); - GreeterBackgroundPrivate* priv = background->priv; - gint n = g_hash_table_size(priv->configs); - gchar** names = g_new(gchar*, n + 1); + priv = background->priv; + + n = g_hash_table_size(priv->configs); + names = g_new(gchar*, n + 1); names[n--] = NULL; - gpointer key; - GHashTableIter iter; g_hash_table_iter_init(&iter, priv->configs); while(g_hash_table_iter_next(&iter, &key, NULL)) names[n--] = g_strdup(key); @@ -487,15 +495,22 @@ void greeter_background_connect(GreeterBackground* background, GdkScreen* screen) { + GreeterBackgroundPrivate *priv; + GHashTable *images_cache; + Monitor *first_not_skipped_monitor = NULL; + cairo_region_t *screen_region; + gpointer saved_focus = NULL; + guint i; + g_return_if_fail(GREETER_IS_BACKGROUND(background)); g_return_if_fail(GDK_IS_SCREEN(screen)); g_debug("[Background] Connecting to screen: %p (%dx%dpx, %dx%dmm)", screen, - gdk_screen_get_width(screen), gdk_screen_get_height(screen), - gdk_screen_get_width_mm(screen), gdk_screen_get_height_mm(screen)); + greeter_screen_get_width(screen), greeter_screen_get_height(screen), + greeter_screen_get_width_mm(screen), greeter_screen_get_height_mm(screen)); - GreeterBackgroundPrivate* priv = background->priv; - gpointer saved_focus = NULL; + priv = background->priv; + saved_focus = NULL; if(priv->screen) { if (priv->active_monitor) @@ -504,36 +519,39 @@ greeter_background_connect(GreeterBackground* background, } priv->screen = screen; - priv->monitors_size = gdk_screen_get_n_monitors(screen); + priv->monitors_size = greeter_screen_get_n_monitors(screen); priv->monitors = g_new0(Monitor, priv->monitors_size); priv->monitors_map = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); g_debug("[Background] Monitors found: %" G_GSIZE_FORMAT, priv->monitors_size); /* Used to track situation when all monitors marked as "#skip" */ - Monitor* first_not_skipped_monitor = NULL; + first_not_skipped_monitor = NULL; - GHashTable* images_cache = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); - cairo_region_t *screen_region = cairo_region_create(); - gint i; + images_cache = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); + screen_region = cairo_region_create(); for(i = 0; i < priv->monitors_size; ++i) { const MonitorConfig* config; Monitor* monitor = &priv->monitors[i]; + const gchar* printable_name; + gchar* window_name; + GSList* item; + Background* bg = NULL; monitor->object = background; - monitor->name = g_strdup(gdk_screen_get_monitor_plug_name(screen, i)); + monitor->name = g_strdup(greeter_screen_get_monitor_plug_name(screen, i)); monitor->number = i; - const gchar* printable_name = monitor->name ? monitor->name : "<unknown>"; + printable_name = monitor->name ? monitor->name : "<unknown>"; - gdk_screen_get_monitor_geometry(screen, i, &monitor->geometry); + greeter_screen_get_monitor_geometry(screen, i, &monitor->geometry); g_debug("[Background] Monitor: %s #%d (%dx%d at %dx%d)%s", printable_name, i, monitor->geometry.width, monitor->geometry.height, monitor->geometry.x, monitor->geometry.y, - (i == gdk_screen_get_primary_monitor(screen)) ? " primary" : ""); + ((gint)i == greeter_screen_get_primary_monitor(screen)) ? " primary" : ""); if(!greeter_background_find_monitor_data(background, priv->configs, monitor, (gpointer*)&config)) { @@ -581,12 +599,11 @@ greeter_background_connect(GreeterBackground* background, G_CALLBACK(monitor_window_draw_cb), monitor); - gchar* window_name = monitor->name ? g_strdup_printf("monitor-%s", monitor->name) : g_strdup_printf("monitor-%d", i); + window_name = monitor->name ? g_strdup_printf("monitor-%s", monitor->name) : g_strdup_printf("monitor-%d", i); gtk_widget_set_name(GTK_WIDGET(monitor->window), window_name); gtk_style_context_add_class(gtk_widget_get_style_context(GTK_WIDGET(monitor->window)), "lightdm-gtk-greeter"); g_free(window_name); - GSList* item; for(item = priv->accel_groups; item != NULL; item = g_slist_next(item)) gtk_window_add_accel_group(monitor->window, item->data); @@ -606,14 +623,13 @@ greeter_background_connect(GreeterBackground* background, if(!monitor->background_configured) monitor->background_configured = background_new(&DEFAULT_MONITOR_CONFIG.bg, monitor, images_cache); - Background* background = NULL; if(config->user_bg && priv->customized_background.type != BACKGROUND_TYPE_INVALID) - background = background_new(&priv->customized_background, monitor, images_cache); + bg = background_new(&priv->customized_background, monitor, images_cache); - if(background) + if(bg) { - monitor_set_background(monitor, background); - background_unref(&background); + monitor_set_background(monitor, bg); + background_unref(&bg); } else monitor_set_background(monitor, monitor->background_configured); @@ -664,8 +680,12 @@ greeter_background_connect(GreeterBackground* background, void greeter_background_disconnect(GreeterBackground* background) { + GreeterBackgroundPrivate *priv; + guint i; + g_return_if_fail(GREETER_IS_BACKGROUND(background)); - GreeterBackgroundPrivate* priv = background->priv; + + priv = background->priv; if(priv->screen_monitors_changed_handler_id) g_signal_handler_disconnect(priv->screen, priv->screen_monitors_changed_handler_id); @@ -673,7 +693,6 @@ greeter_background_disconnect(GreeterBackground* background) priv->screen = NULL; priv->active_monitor = NULL; - gint i; for(i = 0; i < priv->monitors_size; ++i) monitor_finalize(&priv->monitors[i]); g_free(priv->monitors); @@ -710,11 +729,32 @@ greeter_background_set_active_monitor(GreeterBackground* background, const Monitor* active) { GreeterBackgroundPrivate* priv = background->priv; + gint x, y; + gint64 timestamp; + + if (priv->active_monitor_change_in_progress) + return; + + /* Prevents infinite signal emmission between two monitors (LP: #1410406, #1509780) + * There are some rare scenarios when using multiple monitors that cause the greeter + * to switch back and forth between the monitors indefinitely. By comparing the + * timestamp at this precision (1/10th of a second), this should no longer be + * possible. + */ + if (!active) + { + timestamp = floor(g_get_monotonic_time () * 0.00001); + if (timestamp == priv->active_monitor_change_last_timestamp) + return; + } + + priv->active_monitor_change_in_progress = TRUE; + priv->active_monitor_change_last_timestamp = floor(g_get_monotonic_time () * 0.00001); if(active && !active->background) { if(priv->active_monitor) - return; + goto active_monitor_change_complete; active = NULL; } @@ -737,8 +777,10 @@ greeter_background_set_active_monitor(GreeterBackground* background, /* Using primary monitor */ if(!active) { - gint num = gdk_screen_get_primary_monitor(priv->screen); - g_return_if_fail(num < priv->monitors_size); + gint num = greeter_screen_get_primary_monitor(priv->screen); + if ((guint)num >= priv->monitors_size) + goto active_monitor_change_complete; + active = &priv->monitors[num]; if(!active->background || !greeter_background_monitor_enabled(background, active)) active = NULL; @@ -749,7 +791,7 @@ greeter_background_set_active_monitor(GreeterBackground* background, /* Fallback: first enabled and/or not skipped monitor (screen always have one) */ if(!active) { - gint i; + guint i; const Monitor* first_not_skipped = NULL; for(i = 0; i < priv->monitors_size && !active; ++i) { @@ -781,15 +823,16 @@ greeter_background_set_active_monitor(GreeterBackground* background, priv->active_monitor->name, priv->active_monitor->number); else g_warning("[Background] Active monitor is not specified, failed to identify. Active monitor stays the same: <not defined>"); - return; + goto active_monitor_change_complete; } if(active == priv->active_monitor) - return; + goto active_monitor_change_complete; priv->active_monitor = active; - g_return_if_fail(priv->active_monitor != NULL); + if (priv->active_monitor == NULL) + goto active_monitor_change_complete; if(priv->child) { @@ -797,7 +840,7 @@ greeter_background_set_active_monitor(GreeterBackground* background, gpointer focus = greeter_save_focus(priv->child); if(old_parent) - gtk_widget_reparent(priv->child, GTK_WIDGET(active->window)); + greeter_widget_reparent(priv->child, GTK_WIDGET(active->window)); else gtk_container_add(GTK_CONTAINER(active->window), priv->child); @@ -811,7 +854,6 @@ greeter_background_set_active_monitor(GreeterBackground* background, g_debug("[Background] Active monitor changed to: %s #%d", active->name, active->number); g_signal_emit(background, background_signals[BACKGROUND_SIGNAL_ACTIVE_MONITOR_CHANGED], 0); - gint x, y; greeter_background_get_cursor_position(background, &x, &y); /* Do not center cursor if it is already inside active monitor */ if(x < active->geometry.x || x >= active->geometry.x + active->geometry.width || @@ -819,6 +861,10 @@ greeter_background_set_active_monitor(GreeterBackground* background, greeter_background_set_cursor_position(background, active->geometry.x + active->geometry.width/2, active->geometry.y + active->geometry.height/2); + +active_monitor_change_complete: + priv->active_monitor_change_in_progress = FALSE; + return; } static void @@ -828,8 +874,8 @@ greeter_background_get_cursor_position(GreeterBackground* background, GreeterBackgroundPrivate* priv = background->priv; GdkDisplay* display = gdk_screen_get_display(priv->screen); - GdkDeviceManager* device_manager = gdk_display_get_device_manager(display); - GdkDevice* device = gdk_device_manager_get_client_pointer(device_manager); + GdkDeviceManager* device_manager = greeter_display_get_device_manager(display); + GdkDevice* device = greeter_device_manager_get_client_pointer(device_manager); gdk_device_get_position(device, NULL, x, y); } @@ -840,16 +886,21 @@ greeter_background_set_cursor_position(GreeterBackground* background, GreeterBackgroundPrivate* priv = background->priv; GdkDisplay* display = gdk_screen_get_display(priv->screen); - GdkDeviceManager* device_manager = gdk_display_get_device_manager(display); - gdk_device_warp(gdk_device_manager_get_client_pointer(device_manager), priv->screen, x, y); + GdkDeviceManager* device_manager = greeter_display_get_device_manager(display); + gdk_device_warp(greeter_device_manager_get_client_pointer(device_manager), priv->screen, x, y); } static void greeter_background_try_init_dbus(GreeterBackground* background) { + GreeterBackgroundPrivate *priv; + GError *error = NULL; + GVariant *variant; + gboolean lid_present; + g_debug("[Background] Creating DBus proxy"); - GError* error = NULL; - GreeterBackgroundPrivate* priv = background->priv; + + priv = background->priv; if(priv->laptop_upower_proxy) greeter_background_stop_dbus(background); @@ -871,8 +922,8 @@ greeter_background_try_init_dbus(GreeterBackground* background) return; } - GVariant* variant = g_dbus_proxy_get_cached_property(priv->laptop_upower_proxy, DBUS_UPOWER_PROP_LID_IS_PRESENT); - gboolean lid_present = g_variant_get_boolean(variant); + variant = g_dbus_proxy_get_cached_property(priv->laptop_upower_proxy, DBUS_UPOWER_PROP_LID_IS_PRESENT); + lid_present = g_variant_get_boolean(variant); g_variant_unref(variant); g_debug("[Background] UPower.%s property value: %d", DBUS_UPOWER_PROP_LID_IS_PRESENT, lid_present); @@ -915,11 +966,16 @@ greeter_background_dbus_changed_cb(GDBusProxy* proxy, const gchar* const* invalidated_properties, GreeterBackground* background) { + GreeterBackgroundPrivate *priv; + GVariant *variant; + gboolean new_state; + g_return_if_fail(GREETER_IS_BACKGROUND(background)); - GreeterBackgroundPrivate* priv = background->priv; - GVariant* variant = g_dbus_proxy_get_cached_property(priv->laptop_upower_proxy, DBUS_UPOWER_PROP_LID_IS_CLOSED); - gboolean new_state = g_variant_get_boolean(variant); + priv = background->priv; + + variant = g_dbus_proxy_get_cached_property(priv->laptop_upower_proxy, DBUS_UPOWER_PROP_LID_IS_CLOSED); + new_state = g_variant_get_boolean(variant); g_variant_unref(variant); if(new_state == priv->laptop_lid_closed) @@ -962,9 +1018,13 @@ void greeter_background_set_custom_background(GreeterBackground* background, const gchar* value) { + GreeterBackgroundPrivate *priv; + GHashTable *images_cache = NULL; + GSList *iter; + g_return_if_fail(GREETER_IS_BACKGROUND(background)); - GreeterBackgroundPrivate* priv = background->priv; + priv = background->priv; if(priv->customized_background.type != BACKGROUND_TYPE_INVALID) background_config_finalize(&priv->customized_background); @@ -973,11 +1033,9 @@ greeter_background_set_custom_background(GreeterBackground* background, if(!priv->customized_monitors) return; - GHashTable *images_cache = NULL; if(priv->customized_background.type == BACKGROUND_TYPE_IMAGE) images_cache = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_object_unref); - GSList* iter; for(iter = priv->customized_monitors; iter; iter = g_slist_next(iter)) { Monitor *monitor = iter->data; @@ -1002,14 +1060,19 @@ greeter_background_set_custom_background(GreeterBackground* background, void greeter_background_save_xroot(GreeterBackground* background) { + GreeterBackgroundPrivate *priv; + cairo_surface_t *surface; + cairo_t *cr; + gsize i; + + const GdkRGBA ROOT_COLOR = {1.0, 1.0, 1.0, 1.0}; + g_return_if_fail(GREETER_IS_BACKGROUND(background)); - GreeterBackgroundPrivate* priv = background->priv; - cairo_surface_t* surface = create_root_surface(priv->screen); - cairo_t* cr = cairo_create(surface); - gsize i; + priv = background->priv; + surface = create_root_surface(priv->screen); + cr = cairo_create(surface); - const GdkRGBA ROOT_COLOR = {1.0, 1.0, 1.0, 1.0}; gdk_cairo_set_source_rgba(cr, &ROOT_COLOR); cairo_paint(cr); @@ -1032,8 +1095,11 @@ greeter_background_save_xroot(GreeterBackground* background) const GdkRectangle* greeter_background_get_active_monitor_geometry(GreeterBackground* background) { + GreeterBackgroundPrivate *priv; + g_return_val_if_fail(GREETER_IS_BACKGROUND(background), NULL); - GreeterBackgroundPrivate* priv = background->priv; + + priv = background->priv; return priv->active_monitor ? &priv->active_monitor->geometry : NULL; } @@ -1042,13 +1108,16 @@ void greeter_background_add_accel_group(GreeterBackground* background, GtkAccelGroup* group) { + GreeterBackgroundPrivate *priv; + g_return_if_fail(GREETER_IS_BACKGROUND(background)); g_return_if_fail(group != NULL); - GreeterBackgroundPrivate* priv = background->priv; + + priv = background->priv; if(priv->monitors) { - gint i; + guint i; for(i = 0; i < priv->monitors_size; ++i) if(priv->monitors[i].window) gtk_window_add_accel_group(priv->monitors[i].window, group); @@ -1103,6 +1172,7 @@ background_config_finalize(BackgroundConfig* config) case BACKGROUND_TYPE_SKIP: break; case BACKGROUND_TYPE_INVALID: + default: g_return_if_reached(); } @@ -1125,6 +1195,7 @@ background_config_copy(const BackgroundConfig* source, case BACKGROUND_TYPE_SKIP: break; case BACKGROUND_TYPE_INVALID: + default: g_return_if_reached(); } } @@ -1153,7 +1224,8 @@ background_new(const BackgroundConfig* config, const Monitor* monitor, GHashTable* images_cache) { - Background bg = {0}; + Background *result; + Background bg = {0}; switch(config->type) { @@ -1174,13 +1246,14 @@ background_new(const BackgroundConfig* config, break; case BACKGROUND_TYPE_SKIP: case BACKGROUND_TYPE_INVALID: + default: g_return_val_if_reached(NULL); } bg.type = config->type; bg.ref_count = 1; - Background* result = g_new(Background, 1); + result = g_new(Background, 1); *result = bg; return result; } @@ -1218,6 +1291,7 @@ background_finalize(Background* bg) break; case BACKGROUND_TYPE_SKIP: case BACKGROUND_TYPE_INVALID: + default: g_return_if_reached(); } @@ -1246,6 +1320,7 @@ monitor_set_background(Monitor* monitor, break; case BACKGROUND_TYPE_SKIP: case BACKGROUND_TYPE_INVALID: + default: g_return_if_reached(); } @@ -1290,11 +1365,14 @@ monitor_transition_cb(GtkWidget *widget, GdkFrameClock* frame_clock, Monitor* monitor) { + gint64 span; + gdouble x; + if(!monitor->transition.timer_id) return G_SOURCE_REMOVE; - gint64 span = g_get_monotonic_time() - monitor->transition.started; - gdouble x = CLAMP(span/monitor->transition.config.duration/1000.0, 0.0, 1.0); + span = g_get_monotonic_time() - monitor->transition.started; + x = CLAMP(span/monitor->transition.config.duration/1000.0, 0.0, 1.0); monitor->transition.stage = monitor->transition.config.func(x); if(x >= 1.0) @@ -1308,13 +1386,15 @@ static void monitor_transition_draw_alpha(const Monitor* monitor, cairo_t* cr) { + cairo_pattern_t* alpha_pattern; + monitor_draw_background(monitor, monitor->transition.from, cr); cairo_push_group(cr); monitor_draw_background(monitor, monitor->transition.to, cr); cairo_pop_group_to_source(cr); - cairo_pattern_t* alpha_pattern = cairo_pattern_create_rgba(0.0, 0.0, 0.0, monitor->transition.stage); + alpha_pattern = cairo_pattern_create_rgba(0.0, 0.0, 0.0, monitor->transition.stage); cairo_mask(cr, alpha_pattern); cairo_pattern_destroy(alpha_pattern); } @@ -1375,6 +1455,7 @@ monitor_draw_background(const Monitor* monitor, break; case BACKGROUND_TYPE_SKIP: case BACKGROUND_TYPE_INVALID: + default: g_return_if_reached(); } } @@ -1405,6 +1486,7 @@ monitor_window_enter_notify_cb(GtkWidget* widget, GdkWindow *gdkwindow = gtk_widget_get_window (widget); Window window = GDK_WINDOW_XID (gdkwindow); Display *display = GDK_WINDOW_XDISPLAY (gdkwindow); + XEvent ev = {0}; static Atom wm_protocols = None; static Atom wm_take_focus = None; @@ -1414,7 +1496,6 @@ monitor_window_enter_notify_cb(GtkWidget* widget, if (!wm_take_focus) wm_take_focus = XInternAtom(display, "WM_TAKE_FOCUS", False); - XEvent ev = {0}; ev.xclient.type = ClientMessage; ev.xclient.window = window; ev.xclient.message_type = wm_protocols; @@ -1489,6 +1570,7 @@ scale_image(GdkPixbuf* source, gint p_height = gdk_pixbuf_get_height(source); gdouble scale_x = (gdouble)width / p_width; gdouble scale_y = (gdouble)height / p_height; + GdkPixbuf *pixbuf; if(scale_x < scale_y) { @@ -1501,7 +1583,7 @@ scale_image(GdkPixbuf* source, offset_y = (height - (p_height * scale_y)) / 2; } - GdkPixbuf *pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, + pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, gdk_pixbuf_get_bits_per_sample (source), width, height); gdk_pixbuf_composite(source, pixbuf, 0, 0, width, height, @@ -1526,12 +1608,12 @@ create_root_surface(GdkScreen* screen) Pixmap pixmap; cairo_surface_t *surface; - number = gdk_screen_get_number (screen); - width = gdk_screen_get_width (screen); - height = gdk_screen_get_height (screen); + number = greeter_screen_get_number (screen); + width = greeter_screen_get_width (screen); + height = greeter_screen_get_height (screen); /* Open a new connection so with Retain Permanent so the pixmap remains when the greeter quits */ - gdk_flush (); + greeter_gdk_flush (); display = XOpenDisplay (gdk_display_get_name (gdk_screen_get_display (screen))); if (!display) { @@ -1559,8 +1641,8 @@ set_root_pixmap_id(GdkScreen* screen, Pixmap xpixmap) { - Window xroot = RootWindow (display, gdk_screen_get_number (screen)); - char *atom_names[] = {"_XROOTPMAP_ID", "ESETROOT_PMAP_ID"}; + Window xroot = RootWindow (display, greeter_screen_get_number (screen)); + const char *atom_names[] = {"_XROOTPMAP_ID", "ESETROOT_PMAP_ID"}; Atom atoms[G_N_ELEMENTS(atom_names)] = {0}; Atom type; @@ -1571,7 +1653,7 @@ set_root_pixmap_id(GdkScreen* screen, /* Get atoms for both properties in an array, only if they exist. * This method is to avoid multiple round-trips to Xserver */ - if (XInternAtoms (display, atom_names, G_N_ELEMENTS(atom_names), True, atoms) && + if (XInternAtoms (display, (char **)atom_names, G_N_ELEMENTS(atom_names), True, atoms) && atoms[0] != None && atoms[1] != None) { @@ -1588,7 +1670,7 @@ set_root_pixmap_id(GdkScreen* screen, XFree (data_root); XFree (data_esetroot); - gdk_error_trap_push (); + greeter_error_trap_push (); if (xrootpmap && xrootpmap == esetrootpmap) { XKillClient (display, xrootpmap); } @@ -1597,7 +1679,7 @@ set_root_pixmap_id(GdkScreen* screen, } XSync (display, False); - gdk_error_trap_pop_ignored (); + greeter_error_trap_pop_ignored (); } } } @@ -1605,7 +1687,7 @@ set_root_pixmap_id(GdkScreen* screen, /* Get atoms for both properties in an array, create them if needed. * This method is to avoid multiple round-trips to Xserver */ - if (!XInternAtoms (display, atom_names, G_N_ELEMENTS(atom_names), False, atoms) || + if (!XInternAtoms (display, (char **)atom_names, G_N_ELEMENTS(atom_names), False, atoms) || atoms[0] == None || atoms[1] == None) { g_warning("[Background] Could not create atoms needed to set root pixmap id/properties.\n"); return; @@ -1636,14 +1718,18 @@ static void set_surface_as_root(GdkScreen* screen, cairo_surface_t* surface) { + Display *display; + Pixmap pixmap_id; + Window xroot; + g_return_if_fail(cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_XLIB); /* Desktop background pixmap should be created from dummy X client since most * applications will try to kill it with XKillClient later when changing pixmap */ - Display *display = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (screen)); - Pixmap pixmap_id = cairo_xlib_surface_get_drawable (surface); - Window xroot = RootWindow (display, gdk_screen_get_number(screen)); + display = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (screen)); + pixmap_id = cairo_xlib_surface_get_drawable (surface); + xroot = RootWindow (display, greeter_screen_get_number(screen)); XGrabServer (display); diff --git a/src/greeterconfiguration.c b/src/greeterconfiguration.c index a248cc7..482c93f 100644 --- a/src/greeterconfiguration.c +++ b/src/greeterconfiguration.c @@ -18,14 +18,16 @@ static gboolean get_bool (GKeyFile* config, const gchar* group, const static GList* append_directory_content(GList* files, const gchar* path) { - GError* error = NULL; - gchar* full_path = g_build_filename(path, "lightdm", "lightdm-gtk-greeter.conf.d", NULL); - GDir* dir = g_dir_open(full_path, 0, &error); + GError *error = NULL; + GList *content = NULL; + GList *list_iter = NULL; + gchar *full_path = g_build_filename(path, "lightdm", "lightdm-gtk-greeter.conf.d", NULL); + GDir *dir = g_dir_open(full_path, 0, &error); + if(error && !g_error_matches(error, G_FILE_ERROR, G_FILE_ERROR_NOENT)) g_warning("[Configuration] Failed to read configuration directory '%s': %s", full_path, error->message); g_clear_error(&error); - GList* content = NULL; if(dir) { const gchar *name; @@ -43,7 +45,6 @@ append_directory_content(GList* files, const gchar* path) content = g_list_append(content, g_build_filename(path, "lightdm", "lightdm-gtk-greeter.conf", NULL)); - GList* list_iter; for(list_iter = content; list_iter; list_iter = g_list_next(list_iter)) { if(g_file_test(list_iter->data, G_FILE_TEST_IS_REGULAR)) @@ -60,9 +61,17 @@ append_directory_content(GList* files, const gchar* path) void config_init(void) { - GError* error = NULL; - - gchar* state_config_dir = g_build_filename(g_get_user_cache_dir(), "lightdm-gtk-greeter", NULL); + GKeyFile *tmp_config = NULL; + GError *error = NULL; + GList *files = NULL; + GList *file_iter = NULL; + const gchar* const *dirs; + gchar *state_config_dir; + gchar *config_path_tmp; + gchar *config_path; + gint i; + + state_config_dir = g_build_filename(g_get_user_cache_dir(), "lightdm-gtk-greeter", NULL); state_filename = g_build_filename(state_config_dir, "state", NULL); g_mkdir_with_parents(state_config_dir, 0775); g_free(state_config_dir); @@ -73,11 +82,7 @@ config_init(void) g_warning("[Configuration] Failed to load state from %s: %s", state_filename, error->message); g_clear_error(&error); - - gint i; - GList* files = NULL; - - const gchar* const* dirs = g_get_system_data_dirs(); + dirs = g_get_system_data_dirs(); for(i = 0; dirs[i]; ++i) files = append_directory_content(files, dirs[i]); @@ -85,19 +90,19 @@ config_init(void) for(i = 0; dirs[i]; ++i) files = append_directory_content(files, dirs[i]); - gchar* config_path_tmp = g_path_get_dirname(CONFIG_FILE); - gchar* config_path = g_path_get_dirname(config_path_tmp); + config_path_tmp = g_path_get_dirname(CONFIG_FILE); + config_path = g_path_get_dirname(config_path_tmp); files = append_directory_content(files, config_path); g_free(config_path_tmp); g_free(config_path); files = g_list_reverse(files); - GKeyFile* tmp_config = NULL; - GList* file_iter = NULL; for(file_iter = files; file_iter; file_iter = g_list_next(file_iter)) { - const gchar* path = file_iter->data; + const gchar *path = file_iter->data; + gchar **group_iter = NULL; + gchar **groups; if(!tmp_config) tmp_config = g_key_file_new(); @@ -122,27 +127,29 @@ config_init(void) continue; } - gchar** group_iter = NULL; - gchar** groups = g_key_file_get_groups(tmp_config, NULL); + groups = g_key_file_get_groups(tmp_config, NULL); for(group_iter = groups; *group_iter; ++group_iter) { + gchar **key_iter = NULL; + gchar **keys = NULL; if(**group_iter == '-') { g_key_file_remove_group(greeter_config, *group_iter + 1, NULL); continue; } - gchar** key_iter = NULL; - gchar** keys = g_key_file_get_keys(tmp_config, *group_iter, NULL, NULL); + keys = g_key_file_get_keys(tmp_config, *group_iter, NULL, NULL); for(key_iter = keys; *key_iter; ++key_iter) { + gchar *value = NULL; + if(**key_iter == '-') { g_key_file_remove_key(greeter_config, *group_iter, *key_iter + 1, NULL); continue; } - gchar* value = g_key_file_get_value(tmp_config, *group_iter, *key_iter, NULL); + value = g_key_file_get_value(tmp_config, *group_iter, *key_iter, NULL); if(value) { g_key_file_set_value(greeter_config, *group_iter, *key_iter, value); @@ -336,20 +343,24 @@ config_set_bool(const gchar* group, const gchar* key, gboolean value) gint config_get_enum(const gchar* group, const gchar* key, gint fallback, const gchar* first_item, ...) { + const gchar *item_name; + GKeyFile *file; + gchar *value; + gboolean found = FALSE; + va_list var_args; + if(!first_item) return fallback; - GKeyFile* file = get_file_for_group(&group); - gchar* value = g_key_file_get_value(file, group, key, NULL); + file = get_file_for_group(&group); + value = g_key_file_get_value(file, group, key, NULL); if(!value) return fallback; - va_list var_args; va_start(var_args, first_item); - gboolean found = FALSE; - const gchar* item_name = first_item; + item_name = first_item; while(item_name) { gint item_value = va_arg(var_args, gint); @@ -368,4 +379,3 @@ config_get_enum(const gchar* group, const gchar* key, gint fallback, const gchar return fallback; } - diff --git a/src/greeterdeprecated.c b/src/greeterdeprecated.c new file mode 100644 index 0000000..1e24d7a --- /dev/null +++ b/src/greeterdeprecated.c @@ -0,0 +1,117 @@ + +#include <glib.h> + +#include "greeterdeprecated.h" + +G_GNUC_BEGIN_IGNORE_DEPRECATIONS + +void +greeter_gdk_flush (void) +{ + /* Deprecated GTK ???? */ + gdk_flush (); +} + +void +greeter_error_trap_push (void) +{ + /* Deprecated GTK ???? */ + gdk_error_trap_push (); +} + +void +greeter_error_trap_pop_ignored (void) +{ + /* Deprecated GTK ???? */ + gdk_error_trap_pop_ignored (); +} + +gint +greeter_screen_get_number (GdkScreen *screen) +{ + /* Deprecated GTK 3.22 */ + return gdk_screen_get_number (screen); +} + +gint +greeter_screen_get_width (GdkScreen *screen) +{ + /* Deprecated GTK 3.22 */ + return gdk_screen_get_width (screen); +} + +gint +greeter_screen_get_width_mm (GdkScreen *screen) +{ + /* Deprecated GTK 3.22 */ + return gdk_screen_get_width_mm (screen); +} + +gint +greeter_screen_get_height (GdkScreen *screen) +{ + /* Deprecated GTK 3.22 */ + return gdk_screen_get_height (screen); +} + +gint +greeter_screen_get_height_mm (GdkScreen *screen) +{ + /* Deprecated GTK 3.22 */ + return gdk_screen_get_height_mm (screen); +} + +gint +greeter_screen_get_n_monitors (GdkScreen *screen) +{ + /* Deprecated GTK 3.22 */ + return gdk_screen_get_n_monitors (screen); +} + +gchar * +greeter_screen_get_monitor_plug_name (GdkScreen *screen, + gint monitor_num) +{ + /* Deprecated GTK 3.22 */ + return gdk_screen_get_monitor_plug_name (screen, monitor_num); +} + +void +greeter_screen_get_monitor_geometry (GdkScreen *screen, + gint monitor_num, + GdkRectangle *dest) +{ + /* Deprecated GTK 3.22 */ + return gdk_screen_get_monitor_geometry (screen, monitor_num, dest); +} + +gint +greeter_screen_get_primary_monitor (GdkScreen *screen) +{ + /* Deprecated GTK 3.22 */ + return gdk_screen_get_primary_monitor (screen); +} + +void +greeter_widget_reparent (GtkWidget *widget, + GtkWidget *new_parent) +{ + /* Deprecated GTK 3.14 */ + return gtk_widget_reparent (widget, new_parent); +} + +GdkDeviceManager * +greeter_display_get_device_manager (GdkDisplay *display) +{ + /* Deprecated GTK 3.20 */ + return gdk_display_get_device_manager (display); +} + +GdkDevice * +greeter_device_manager_get_client_pointer (GdkDeviceManager *device_manager) +{ + /* Deprecated GTK 3.20 */ + return gdk_device_manager_get_client_pointer (device_manager); +} + +G_GNUC_END_IGNORE_DEPRECATIONS diff --git a/src/greeterdeprecated.h b/src/greeterdeprecated.h new file mode 100644 index 0000000..0dc2dc4 --- /dev/null +++ b/src/greeterdeprecated.h @@ -0,0 +1,41 @@ + +#ifndef GREETER_DEPRECATED_H +#define GREETER_DEPRECATED_H + +#include <gtk/gtk.h> + +void greeter_gdk_flush (void); + +void greeter_error_trap_push (void); + +void greeter_error_trap_pop_ignored (void); + +gint greeter_screen_get_number (GdkScreen *screen); + +gint greeter_screen_get_width (GdkScreen *screen); + +gint greeter_screen_get_width_mm (GdkScreen *screen); + +gint greeter_screen_get_height (GdkScreen *screen); + +gint greeter_screen_get_height_mm (GdkScreen *screen); + +gint greeter_screen_get_n_monitors (GdkScreen *screen); + +gchar * greeter_screen_get_monitor_plug_name (GdkScreen *screen, + gint monitor_num); + +void greeter_screen_get_monitor_geometry (GdkScreen *screen, + gint monitor_num, + GdkRectangle *dest); + +gint greeter_screen_get_primary_monitor (GdkScreen *screen); + +void greeter_widget_reparent (GtkWidget *widget, + GtkWidget *new_parent); + +GdkDeviceManager * greeter_display_get_device_manager (GdkDisplay *display); + +GdkDevice * greeter_device_manager_get_client_pointer (GdkDeviceManager *device_manager); + +#endif //GREETER_DEPRECATED_H diff --git a/src/greetermenubar.c b/src/greetermenubar.c index 61fc7c9..8cf1b0b 100644 --- a/src/greetermenubar.c +++ b/src/greetermenubar.c @@ -18,8 +18,8 @@ greeter_menu_bar_init(GreeterMenuBar* square) } -GtkWidget* -greeter_menu_bar_new() +GtkWidget* +greeter_menu_bar_new(void) { return GTK_WIDGET(g_object_new(greeter_menu_bar_get_type(), NULL)); } @@ -29,23 +29,25 @@ sort_minimal_size(gconstpointer a, gconstpointer b, GtkRequestedSize* sizes) { gint a_size = sizes[GPOINTER_TO_INT(a)].natural_size; gint b_size = sizes[GPOINTER_TO_INT(b)].natural_size; - return a_size == b_size ? 0 : a_size > b_size ? -1 : +1; + return a_size == b_size ? 0 : a_size > b_size ? -1 : +1; } static void greeter_menu_bar_size_allocate(GtkWidget* widget, GtkAllocation* allocation) { - GList* item; - GList* shell_children; - GList* expand_nums = NULL; - guint visible_count = 0, expand_count = 0; + GtkPackDirection pack_direction; + GList *item; + GList *shell_children; + GList *expand_nums = NULL; + guint visible_count = 0; + guint expand_count = 0; g_return_if_fail(allocation != NULL); g_return_if_fail(GREETER_IS_MENU_BAR(widget)); gtk_widget_set_allocation(widget, allocation); - GtkPackDirection pack_direction = gtk_menu_bar_get_pack_direction(GTK_MENU_BAR(widget)); + pack_direction = gtk_menu_bar_get_pack_direction(GTK_MENU_BAR(widget)); g_return_if_fail(pack_direction == GTK_PACK_DIRECTION_LTR || pack_direction == GTK_PACK_DIRECTION_RTL); shell_children = gtk_container_get_children(GTK_CONTAINER(widget)); @@ -76,6 +78,9 @@ greeter_menu_bar_size_allocate(GtkWidget* widget, GtkAllocation* allocation) GtkShadowType shadow_type = GTK_SHADOW_OUT; GtkBorder border; gint toggle_size; + GtkRequestedSize* request; + gboolean ltr; + int size; gtk_style_context_get_padding(context, flags, &border); gtk_widget_style_get(widget, "shadow-type", &shadow_type, NULL); @@ -97,9 +102,9 @@ greeter_menu_bar_size_allocate(GtkWidget* widget, GtkAllocation* allocation) remaining_space.height -= border.top + border.bottom; } - GtkRequestedSize* request = requested_sizes; - int size = remaining_space.width; - gboolean ltr = (gtk_widget_get_direction(widget) == GTK_TEXT_DIR_LTR) == (pack_direction == GTK_PACK_DIRECTION_LTR); + request = requested_sizes; + size = remaining_space.width; + ltr = (gtk_widget_get_direction(widget) == GTK_TEXT_DIR_LTR) == (pack_direction == GTK_PACK_DIRECTION_LTR); for(item = shell_children; item; item = g_list_next(item)) { @@ -126,13 +131,15 @@ greeter_menu_bar_size_allocate(GtkWidget* widget, GtkAllocation* allocation) /* Distribution extra space for widgets with expand=True */ if(size > 0 && expand_nums) { + GList *first_item = NULL; + gint needed_size = -1; + gint max_size = 0; + gint total_needed_size = 0; + expand_nums = g_list_sort_with_data(expand_nums, (GCompareDataFunc)sort_minimal_size, requested_sizes); - GList* first_item = expand_nums; - gint needed_size = -1; - gint max_size = requested_sizes[GPOINTER_TO_INT(first_item->data)].natural_size; - gint total_needed_size = 0; - + first_item = expand_nums; + max_size = requested_sizes[GPOINTER_TO_INT(first_item->data)].natural_size; /* Free space that all widgets need to have the same (max_size) width * [___max_width___][widget ][widget____ ] @@ -151,7 +158,7 @@ greeter_menu_bar_size_allocate(GtkWidget* widget, GtkAllocation* allocation) break; } /* Removing current maximal widget from list */ - total_needed_size -= max_size - requested_sizes[GPOINTER_TO_INT(item->data)].natural_size; + total_needed_size -= max_size - requested_sizes[GPOINTER_TO_INT(first_item->data)].natural_size; first_item = g_list_next(first_item); if(first_item) max_size = requested_sizes[GPOINTER_TO_INT(first_item->data)].natural_size; @@ -159,17 +166,19 @@ greeter_menu_bar_size_allocate(GtkWidget* widget, GtkAllocation* allocation) for(item = first_item; item; item = g_list_next(item)) { + gint dsize = 0; + request = &requested_sizes[GPOINTER_TO_INT(item->data)]; - gint dsize = needed_size - request->natural_size; + dsize = needed_size - request->natural_size; if(size < dsize) dsize = size; size -= dsize; request->natural_size += dsize; } } - - gint i; - for(i = 0; i < visible_count; i++) + + + for(guint i = 0; i < visible_count; i++) { GtkAllocation child_allocation = remaining_space; request = &requested_sizes[i]; diff --git a/src/lightdm-gtk-greeter.c b/src/lightdm-gtk-greeter.c index bcce1c8..944f5ca 100644 --- a/src/lightdm-gtk-greeter.c +++ b/src/lightdm-gtk-greeter.c @@ -94,6 +94,9 @@ static GtkButton *power_ok_button, *power_cancel_button; static GtkLabel *power_title, *power_text; static GtkImage *power_icon; +static const gchar *DEFAULT_LAYOUT[] = {"~spacer", "~spacer", "~host", "~spacer", + "~session", "~a11y", "~clock", NULL}; + static const gchar *POWER_WINDOW_DATA_LOOP = "power-window-loop"; /* <GMainLoop*> */ static const gchar *POWER_WINDOW_DATA_RESPONSE = "power-window-response"; /* <GtkResponseType> */ @@ -143,7 +146,7 @@ static void set_message_label (LightDMMessageType type, const gchar *text); /* User image */ static GdkPixbuf *default_user_pixbuf = NULL; -static gchar *default_user_icon = "avatar-default"; +static gchar *default_user_icon = NULL; static void set_user_image (const gchar *username); /* External command (keyboard, reader) */ @@ -304,9 +307,11 @@ void greeter_restore_focus(const gpointer saved_data); static void read_monitor_configuration (const gchar *group, const gchar *name) { + gchar *background; + g_debug ("[Configuration] Monitor configuration found: '%s'", name); - gchar *background = config_get_string (group, CONFIG_KEY_BACKGROUND, NULL); + background = config_get_string (group, CONFIG_KEY_BACKGROUND, NULL); greeter_background_set_monitor_config (greeter_background, name, background, config_get_bool (group, CONFIG_KEY_USER_BACKGROUND, -1), config_get_bool (group, CONFIG_KEY_LAPTOP, -1), @@ -322,11 +327,14 @@ read_monitor_configuration (const gchar *group, const gchar *name) gpointer greeter_save_focus(GtkWidget* widget) { - GtkWidget *window = gtk_widget_get_toplevel(widget); + GtkWidget *window; + struct SavedFocusData *data; + + window = gtk_widget_get_toplevel(widget); if (!GTK_IS_WINDOW (window)) return NULL; - struct SavedFocusData *data = g_new0 (struct SavedFocusData, 1); + data = g_new0 (struct SavedFocusData, 1); data->widget = gtk_window_get_focus (GTK_WINDOW (window)); data->editable_pos = GTK_IS_EDITABLE(data->widget) ? gtk_editable_get_position (GTK_EDITABLE (data->widget)) : -1; @@ -424,7 +432,7 @@ close_pid (GPid pid, gboolean remove) else g_warning ("[PIDs] Failed to terminate process #%d: %s", pid, g_strerror (errno)); - waitpid (pid, NULL, 0); + g_spawn_close_pid (pid); } static void @@ -458,12 +466,48 @@ sigterm_cb (gpointer user_data) static gboolean show_power_prompt (const gchar *action, const gchar* icon, const gchar* title, const gchar* message) { - gchar *new_message = NULL; + GMainLoop *loop; + GtkWidget *focused; + + gboolean session_enabled; + gboolean language_enabled; + gboolean power_present = FALSE; + + gsize length; + guint i; + gint logged_in_users = 0; + + gchar **names; + GList *items; + GList *item; + + gchar *new_message = NULL; + gchar *dialog_name = NULL; + gchar *button_name = NULL; + GtkResponseType response; + + /* Do anything only when power indicator is present */ + names = config_get_string_list (NULL, CONFIG_KEY_INDICATORS, NULL); + if (!names) + names = (gchar**)DEFAULT_LAYOUT; + length = g_strv_length (names); + for (i = 0; i < length; ++i) + { + if (g_strcmp0 (names[i], "~power") == 0) + { /* Power menu is present */ + power_present = TRUE; + break; + } + } + if (names && names != (gchar**)DEFAULT_LAYOUT) + g_strfreev (names); + + if (power_present != TRUE) { + return FALSE; + } /* Check if there are still users logged in, count them and if so, display a warning */ - gint logged_in_users = 0; - GList *items = lightdm_user_list_get_users (lightdm_user_list_get_instance ()); - GList *item; + items = lightdm_user_list_get_users (lightdm_user_list_get_instance ()); for (item = items; item; item = item->next) { LightDMUser *user = item->data; @@ -481,8 +525,8 @@ show_power_prompt (const gchar *action, const gchar* icon, const gchar* title, c g_free (warning); } - gchar *dialog_name = g_strconcat (action, "_dialog", NULL); - gchar *button_name = g_strconcat (action, "_button", NULL); + dialog_name = g_strconcat (action, "_dialog", NULL); + button_name = g_strconcat (action, "_button", NULL); gtk_widget_set_name (power_window, dialog_name); gtk_widget_set_name (GTK_WIDGET (power_ok_button), button_name); @@ -495,13 +539,13 @@ show_power_prompt (const gchar *action, const gchar* icon, const gchar* title, c g_free (dialog_name); g_free (new_message); - GMainLoop *loop = g_main_loop_new (NULL, FALSE); + loop = g_main_loop_new (NULL, FALSE); g_object_set_data (G_OBJECT (power_window), POWER_WINDOW_DATA_LOOP, loop); g_object_set_data (G_OBJECT (power_window), POWER_WINDOW_DATA_RESPONSE, GINT_TO_POINTER (GTK_RESPONSE_CANCEL)); - GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (screen_overlay)))); - gboolean session_enabled = gtk_widget_get_sensitive (session_menuitem); - gboolean language_enabled = gtk_widget_get_sensitive (language_menuitem); + focused = gtk_window_get_focus (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (screen_overlay)))); + session_enabled = gtk_widget_get_sensitive (session_menuitem); + language_enabled = gtk_widget_get_sensitive (language_menuitem); gtk_widget_set_sensitive (power_menuitem, FALSE); gtk_widget_set_sensitive (session_menuitem, FALSE); @@ -511,7 +555,7 @@ show_power_prompt (const gchar *action, const gchar* icon, const gchar* title, c gtk_widget_grab_focus (GTK_WIDGET (power_ok_button)); g_main_loop_run (loop); - GtkResponseType response = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (power_window), POWER_WINDOW_DATA_RESPONSE)); + response = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (power_window), POWER_WINDOW_DATA_RESPONSE)); g_main_loop_unref (loop); gtk_widget_hide (power_window); @@ -582,14 +626,19 @@ read_position_from_str (const gchar *s, DimensionPosition *x) static WindowPosition* str_to_position (const gchar *str, const WindowPosition *default_value) { - WindowPosition* pos = g_new0 (WindowPosition, 1); + WindowPosition *pos = g_new0 (WindowPosition, 1); + gchar *size_delim; + gchar *value; + gchar *x; + gchar *y; + *pos = *default_value; if (str) { - gchar *value = g_strdup (str); - gchar *x = value; - gchar *y = strchr (value, ' '); + value = g_strdup (str); + x = value; + y = strchr (value, ' '); if (y) (y++)[0] = '\0'; @@ -598,10 +647,10 @@ str_to_position (const gchar *str, const WindowPosition *default_value) if (!y || !read_position_from_str (y, &pos->y)) pos->y = pos->x; - gchar *size_delim = strchr (y ? y : x, ';'); + size_delim = strchr (y ? y : x, ';'); if (size_delim) { - gchar *x = size_delim + 1; + x = size_delim + 1; if (read_position_from_str (x, &pos->width)) { y = strchr (x, ' '); @@ -642,11 +691,15 @@ gboolean screen_overlay_get_child_position_cb (GtkWidget *overlay, GtkWidget *widget, GdkRectangle *allocation, gpointer user_data) { const WindowPosition *pos = g_object_get_data (G_OBJECT (widget), WINDOW_DATA_POSITION); + gint screen_width; + gint screen_height; + gint panel_height; + if (!pos) return FALSE; - gint screen_width = gtk_widget_get_allocated_width (overlay); - gint screen_height = gtk_widget_get_allocated_height (overlay); + screen_width = gtk_widget_get_allocated_width (overlay); + screen_height = gtk_widget_get_allocated_height (overlay); if (pos->use_size) { @@ -663,7 +716,7 @@ screen_overlay_get_child_position_cb (GtkWidget *overlay, GtkWidget *widget, Gdk allocation->y = get_absolute_position (&pos->y, screen_height, allocation->height); /* Do not overlap panel window */ - gint panel_height = gtk_widget_get_allocated_height (panel_window); + panel_height = gtk_widget_get_allocated_height (panel_window); if (panel_height && gtk_widget_get_visible (panel_window)) { GtkAlign valign = gtk_widget_get_valign (panel_window); @@ -775,17 +828,18 @@ menu_command_parse (const gchar *name, const gchar *value, GtkWidget *menu_item) static MenuCommand* menu_command_parse_extended (const gchar *name, const gchar *value, /* String to parse */ - GtkWidget *menu_item, /* Menu item to connect */ + GtkWidget *menu_item, /* Menu item to connect */ const gchar *xid_app, /* Program that have "xembed" mode support */ const gchar *xid_arg) /* Argument that must be added to command line */ { + MenuCommand *command; + GError *error = NULL; + gchar **argv; + gint argc = 0; + if (!value) return NULL; - GError *error = NULL; - gchar **argv; - gint argc = 0; - if (!g_shell_parse_argv (value, &argc, &argv, &error)) { if (error) @@ -794,7 +848,7 @@ menu_command_parse_extended (const gchar *name, return NULL; } - MenuCommand *command = g_new0 (MenuCommand, 1); + command = g_new0 (MenuCommand, 1); command->menu_item = menu_item; command->argc = argc; command->argv = argv; @@ -842,9 +896,10 @@ menu_command_parse_extended (const gchar *name, static gboolean menu_command_run (MenuCommand *command) { + GError *error = NULL; + g_return_val_if_fail (command && g_strv_length (command->argv), FALSE); - GError *error = NULL; command->pid = 0; g_debug ("[Command/%s] Running command", command->name); @@ -862,9 +917,10 @@ menu_command_run (MenuCommand *command) if (g_io_channel_read_line (out_channel, &text, NULL, NULL, &error) == G_IO_STATUS_NORMAL) { gchar* end_ptr = NULL; + gint id; text = g_strstrip (text); - gint id = g_ascii_strtoll (text, &end_ptr, 0); + id = g_ascii_strtoll (text, &end_ptr, 0); if (id != 0 && end_ptr > text) { @@ -1123,7 +1179,7 @@ pam_message_finalize (PAMConversationMessage *message) } static void -process_prompts (LightDMGreeter *greeter) +process_prompts (LightDMGreeter *ldm) { if (!pending_questions) return; @@ -1138,7 +1194,7 @@ process_prompts (LightDMGreeter *greeter) ((PAMConversationMessage *) pending_questions->data)->is_prompt && ((PAMConversationMessage *) pending_questions->data)->type.prompt != LIGHTDM_PROMPT_TYPE_SECRET && gtk_widget_get_visible ((GTK_WIDGET (username_entry))) && - lightdm_greeter_get_authentication_user (greeter) == NULL) + lightdm_greeter_get_authentication_user (ldm) == NULL) { prompted = TRUE; prompt_active = TRUE; @@ -1270,7 +1326,7 @@ indicator_entry_activated_cb (GtkWidget *widget, gpointer user_data) } static GtkWidget* -indicator_entry_create_menuitem (IndicatorObject *io, IndicatorObjectEntry *entry, GtkWidget *menubar) +indicator_entry_create_menuitem (IndicatorObject *io, IndicatorObjectEntry *entry, GtkWidget *mbar) { GtkWidget *box, *menuitem; gint index = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (io), PANEL_ITEM_DATA_INDEX)); @@ -1381,17 +1437,20 @@ indicator_menu_show_cb (IndicatorObject *io, IndicatorObjectEntry *entry, guint3 static void greeter_set_env (const gchar* key, const gchar* value) { + GDBusProxy *proxy; + GVariantBuilder *builder; + GVariant *result; + g_setenv (key, value, TRUE); - GDBusProxy* proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, - G_DBUS_PROXY_FLAGS_NONE, - NULL, - "org.freedesktop.DBus", - "/org/freedesktop/DBus", - "org.freedesktop.DBus", - NULL, NULL); - GVariant *result; - GVariantBuilder *builder = g_variant_builder_new (G_VARIANT_TYPE_ARRAY); + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "org.freedesktop.DBus", + "/org/freedesktop/DBus", + "org.freedesktop.DBus", + NULL, NULL); + builder = g_variant_builder_new (G_VARIANT_TYPE_ARRAY); g_variant_builder_add (builder, "{ss}", key, value); result = g_dbus_proxy_call_sync (proxy, "UpdateActivationEnvironment", g_variant_new ("(a{ss})", builder), G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL); @@ -1414,7 +1473,8 @@ menu_item_accel_closure_cb (GtkAccelGroup *accel_group, static void reassign_menu_item_accel (GtkWidget *item) { - GtkAccelKey key; + GtkWidget *submenu; + GtkAccelKey key; const gchar *accel_path = gtk_menu_item_get_accel_path (GTK_MENU_ITEM (item)); if (accel_path && gtk_accel_map_lookup_entry (accel_path, &key)) @@ -1425,7 +1485,7 @@ reassign_menu_item_accel (GtkWidget *item) g_closure_unref (closure); } - GtkWidget* submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (item)); + submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (item)); if (submenu) gtk_container_foreach (GTK_CONTAINER (submenu), (GtkCallback)reassign_menu_item_accel, NULL); } @@ -1433,32 +1493,33 @@ reassign_menu_item_accel (GtkWidget *item) static void init_indicators (void) { - gsize length = 0; - guint i; - GHashTable *builtin_items = NULL; - GHashTableIter iter; - gpointer iter_value; + GHashTable *builtin_items = NULL; + GHashTableIter iter; + gpointer iter_value; + gsize length = 0; + guint i; + #ifdef HAVE_LIBINDICATOR - gboolean inited = FALSE; + IndicatorObject *io = NULL; + gboolean inited = FALSE; + gchar *path = NULL; #endif - const gchar *DEFAULT_LAYOUT[] = {"~host", "~spacer", "~clock", "~spacer", - "~session", "~language", "~a11y", "~power", NULL}; + gchar **names = config_get_string_list (NULL, CONFIG_KEY_INDICATORS, NULL); - gchar **names = config_get_string_list (NULL, CONFIG_KEY_INDICATORS, NULL); if (!names) names = (gchar**)DEFAULT_LAYOUT; length = g_strv_length (names); - builtin_items = g_hash_table_new (g_str_hash, g_str_equal); + builtin_items = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify)g_free, NULL); - g_hash_table_insert (builtin_items, "~power", power_menuitem); - g_hash_table_insert (builtin_items, "~session", session_menuitem); - g_hash_table_insert (builtin_items, "~language", language_menuitem); - g_hash_table_insert (builtin_items, "~a11y", a11y_menuitem); - g_hash_table_insert (builtin_items, "~layout", layout_menuitem); - g_hash_table_insert (builtin_items, "~host", host_menuitem); - g_hash_table_insert (builtin_items, "~clock", clock_menuitem); + g_hash_table_insert (builtin_items, g_strdup("~power"), power_menuitem); + g_hash_table_insert (builtin_items, g_strdup("~session"), session_menuitem); + g_hash_table_insert (builtin_items, g_strdup("~language"), language_menuitem); + g_hash_table_insert (builtin_items, g_strdup("~a11y"), a11y_menuitem); + g_hash_table_insert (builtin_items, g_strdup("~layout"), layout_menuitem); + g_hash_table_insert (builtin_items, g_strdup("~host"), host_menuitem); + g_hash_table_insert (builtin_items, g_strdup("~clock"), clock_menuitem); g_hash_table_iter_init (&iter, builtin_items); while (g_hash_table_iter_next (&iter, NULL, &iter_value)) @@ -1501,9 +1562,6 @@ init_indicators (void) } #ifdef HAVE_LIBINDICATOR - gchar* path = NULL; - IndicatorObject* io = NULL; - if (!inited) { /* Set indicators to run with reduced functionality */ @@ -1693,10 +1751,21 @@ update_layouts_menu (void) static void update_layouts_menu_state (void) { - #ifdef HAVE_LIBXKLAVIER - XklState *state = xkl_engine_get_current_state (xkl_engine); - GList *menu_items = gtk_container_get_children (GTK_CONTAINER (layout_menu)); - GtkCheckMenuItem *menu_item = g_list_nth_data (menu_items, state->group); +#ifdef HAVE_LIBXKLAVIER + XklState *state; + GList *menu_items; + GtkCheckMenuItem *menu_item; +#else + const gchar *name; + GList *menu_items; + GList *menu_iter; + LightDMLayout *layout; +#endif + +#ifdef HAVE_LIBXKLAVIER + state = xkl_engine_get_current_state (xkl_engine); + menu_items = gtk_container_get_children (GTK_CONTAINER (layout_menu)); + menu_item = g_list_nth_data (menu_items, state->group); if (menu_item) { @@ -1707,13 +1776,12 @@ update_layouts_menu_state (void) else gtk_menu_item_set_label (GTK_MENU_ITEM (layout_menuitem), "??"); g_list_free (menu_items); - #else - LightDMLayout *layout = lightdm_get_layout (); +#else + layout = lightdm_get_layout (); g_return_if_fail (layout != NULL); - const gchar *name = lightdm_layout_get_name (layout); - GList *menu_items = gtk_container_get_children (GTK_CONTAINER (layout_menu)); - GList *menu_iter; + name = lightdm_layout_get_name (layout); + menu_items = gtk_container_get_children (GTK_CONTAINER (layout_menu)); for (menu_iter = menu_items; menu_iter; menu_iter = g_list_next (menu_iter)) { if (g_strcmp0 (name, g_object_get_data (G_OBJECT (menu_iter->data), LAYOUT_DATA_NAME)) == 0) @@ -1725,7 +1793,7 @@ update_layouts_menu_state (void) } } g_list_free (menu_items); - #endif +#endif } #ifdef HAVE_LIBXKLAVIER @@ -1833,19 +1901,19 @@ power_menu_cb (GtkWidget *menuitem, gpointer userdata) } void -suspend_cb (GtkWidget *widget, LightDMGreeter *greeter) +suspend_cb (GtkWidget *widget, LightDMGreeter *ldm) { lightdm_suspend (NULL); } void -hibernate_cb (GtkWidget *widget, LightDMGreeter *greeter) +hibernate_cb (GtkWidget *widget, LightDMGreeter *ldm) { lightdm_hibernate (NULL); } void -restart_cb (GtkWidget *widget, LightDMGreeter *greeter) +restart_cb (GtkWidget *widget, LightDMGreeter *ldm) { if (show_power_prompt ("restart", "view-refresh-symbolic", _("Restart"), @@ -1854,7 +1922,7 @@ restart_cb (GtkWidget *widget, LightDMGreeter *greeter) } void -shutdown_cb (GtkWidget *widget, LightDMGreeter *greeter) +shutdown_cb (GtkWidget *widget, LightDMGreeter *ldm) { if (show_power_prompt ("shutdown", "system-shutdown-symbolic", _("Shut Down"), @@ -1863,7 +1931,7 @@ shutdown_cb (GtkWidget *widget, LightDMGreeter *greeter) } static void -set_login_button_label (LightDMGreeter *greeter, const gchar *username) +set_login_button_label (LightDMGreeter *ldm, const gchar *username) { LightDMUser *user; gboolean logged_in = FALSE; @@ -1943,6 +2011,20 @@ start_authentication (const gchar *username) #else lightdm_greeter_authenticate (greeter, NULL); #endif + + if (lightdm_greeter_get_lock_hint (greeter)) + { + GList * items = lightdm_user_list_get_users (lightdm_user_list_get_instance ()); + for (GList * item = items; item; item = item->next) + { + LightDMUser *user = item->data; + if( lightdm_user_get_logged_in (user)) + { + gtk_entry_set_text (username_entry,lightdm_user_get_name(user)); + break; + } + } + } } else if (g_strcmp0 (username, "*guest") == 0) { @@ -2170,7 +2252,7 @@ login_window_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_ } static void -set_displayed_user (LightDMGreeter *greeter, const gchar *username) +set_displayed_user (LightDMGreeter *ldm, const gchar *username) { gchar *user_tooltip; LightDMUser *user; @@ -2201,7 +2283,7 @@ set_displayed_user (LightDMGreeter *greeter, const gchar *username) gtk_widget_grab_focus (GTK_WIDGET (user_combo)); } - set_login_button_label (greeter, username); + set_login_button_label (ldm, username); set_user_background (username); set_user_image (username); user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username); @@ -2211,7 +2293,10 @@ set_displayed_user (LightDMGreeter *greeter, const gchar *username) set_session (lightdm_user_get_session (user)); } else + { set_language (lightdm_language_get_code (lightdm_get_language ())); + set_session (lightdm_greeter_get_default_session_hint (ldm)); + } gtk_widget_set_tooltip_text (GTK_WIDGET (user_combo), user_tooltip); start_authentication (username); g_free (user_tooltip); @@ -2220,7 +2305,7 @@ set_displayed_user (LightDMGreeter *greeter, const gchar *username) void user_combobox_active_changed_cb (GtkComboBox *widget, LightDMGreeter *greeter); G_MODULE_EXPORT void -user_combobox_active_changed_cb (GtkComboBox *widget, LightDMGreeter *greeter) +user_combobox_active_changed_cb (GtkComboBox *widget, LightDMGreeter *ldm) { GtkTreeModel *model; GtkTreeIter iter; @@ -2233,7 +2318,7 @@ user_combobox_active_changed_cb (GtkComboBox *widget, LightDMGreeter *greeter) gtk_tree_model_get (GTK_TREE_MODEL (model), &iter, 0, &user, -1); - set_displayed_user (greeter, user); + set_displayed_user (ldm, user); g_free (user); } @@ -2301,7 +2386,7 @@ user_combo_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_da } static void -show_prompt_cb (LightDMGreeter *greeter, const gchar *text, LightDMPromptType type) +show_prompt_cb (LightDMGreeter *ldm, const gchar *text, LightDMPromptType type) { PAMConversationMessage *message_obj = g_new (PAMConversationMessage, 1); if (message_obj) @@ -2313,11 +2398,11 @@ show_prompt_cb (LightDMGreeter *greeter, const gchar *text, LightDMPromptType ty } if (!prompt_active) - process_prompts (greeter); + process_prompts (ldm); } static void -show_message_cb (LightDMGreeter *greeter, const gchar *text, LightDMMessageType type) +show_message_cb (LightDMGreeter *ldm, const gchar *text, LightDMMessageType type) { PAMConversationMessage *message_obj = g_new (PAMConversationMessage, 1); if (message_obj) @@ -2329,42 +2414,48 @@ show_message_cb (LightDMGreeter *greeter, const gchar *text, LightDMMessageType } if (!prompt_active) - process_prompts (greeter); + process_prompts (ldm); } static void -timed_autologin_cb (LightDMGreeter *greeter) +timed_autologin_cb (LightDMGreeter *ldm) { /* Don't trigger autologin if user locks screen with light-locker (thanks to Andrew P.). */ - if (!lightdm_greeter_get_lock_hint (greeter)) + if (!lightdm_greeter_get_lock_hint (ldm)) { - if (lightdm_greeter_get_is_authenticated (greeter)) + /* Select autologin-session if configured */ + if (lightdm_greeter_get_hint (greeter, "autologin-session")) + { + set_session (lightdm_greeter_get_hint (greeter, "autologin-session")); + } + + if (lightdm_greeter_get_is_authenticated (ldm)) { /* Configured autologin user may be already selected in user list. */ - if (lightdm_greeter_get_authentication_user (greeter)) + if (lightdm_greeter_get_authentication_user (ldm)) /* Selected user matches configured autologin-user option. */ start_session (); - else if (lightdm_greeter_get_autologin_guest_hint (greeter)) + else if (lightdm_greeter_get_autologin_guest_hint (ldm)) /* "Guest session" is selected and autologin-guest is enabled. */ start_session (); - else if (lightdm_greeter_get_autologin_user_hint (greeter)) + else if (lightdm_greeter_get_autologin_user_hint (ldm)) { /* "Guest session" is selected, but autologin-user is configured. */ - start_authentication (lightdm_greeter_get_autologin_user_hint (greeter)); + start_authentication (lightdm_greeter_get_autologin_user_hint (ldm)); prompted = TRUE; } } else #ifdef HAVE_LIBLIGHTDMGOBJECT_1_19_2 - lightdm_greeter_authenticate_autologin (greeter, NULL); + lightdm_greeter_authenticate_autologin (ldm, NULL); #else - lightdm_greeter_authenticate_autologin (greeter); + lightdm_greeter_authenticate_autologin (ldm); #endif } } static void -authentication_complete_cb (LightDMGreeter *greeter) +authentication_complete_cb (LightDMGreeter *ldm) { prompt_active = FALSE; gtk_entry_set_text (password_entry, ""); @@ -2381,7 +2472,7 @@ authentication_complete_cb (LightDMGreeter *greeter) pending_questions = NULL; } - if (lightdm_greeter_get_is_authenticated (greeter)) + if (lightdm_greeter_get_is_authenticated (ldm)) { if (prompted) start_session (); @@ -2402,7 +2493,7 @@ authentication_complete_cb (LightDMGreeter *greeter) { if (!have_pam_error) set_message_label (LIGHTDM_MESSAGE_TYPE_ERROR, _("Incorrect password, please try again")); - start_authentication (lightdm_greeter_get_authentication_user (greeter)); + start_authentication (lightdm_greeter_get_authentication_user (ldm)); } else { @@ -2414,7 +2505,7 @@ authentication_complete_cb (LightDMGreeter *greeter) } static void -user_added_cb (LightDMUserList *user_list, LightDMUser *user, LightDMGreeter *greeter) +user_added_cb (LightDMUserList *user_list, LightDMUser *user, LightDMGreeter *ldm) { GtkTreeModel *model; GtkTreeIter iter; @@ -2457,7 +2548,7 @@ get_user_iter (const gchar *username, GtkTreeIter *iter) } static void -user_changed_cb (LightDMUserList *user_list, LightDMUser *user, LightDMGreeter *greeter) +user_changed_cb (LightDMUserList *user_list, LightDMUser *user, LightDMGreeter *ldm) { GtkTreeModel *model; GtkTreeIter iter; @@ -2492,11 +2583,15 @@ user_removed_cb (LightDMUserList *user_list, LightDMUser *user) static void load_user_list (void) { - const GList *items, *item; GtkTreeModel *model; - GtkTreeIter iter; - const gchar *selected_user; - gboolean logged_in = FALSE; + GtkTreeIter iter; + + const GList *items; + const GList *item; + + const gchar *selected_user; + gchar *last_user; + gboolean logged_in = FALSE; g_signal_connect (lightdm_user_list_get_instance (), "user-added", G_CALLBACK (user_added_cb), greeter); g_signal_connect (lightdm_user_list_get_instance (), "user-changed", G_CALLBACK (user_changed_cb), greeter); @@ -2532,7 +2627,7 @@ load_user_list (void) 2, PANGO_WEIGHT_NORMAL, -1); - gchar *last_user = config_get_string (STATE_SECTION_GREETER, STATE_KEY_LAST_USER, NULL); + last_user = config_get_string (STATE_SECTION_GREETER, STATE_KEY_LAST_USER, NULL); if (lightdm_greeter_get_select_user_hint (greeter)) selected_user = lightdm_greeter_get_select_user_hint (greeter); @@ -2627,13 +2722,26 @@ debug_log_handler (const gchar *log_domain, GLogLevelFlags log_level, const gcha int main (int argc, char **argv) { - GtkBuilder *builder; - const GList *items, *item; - GtkWidget *image; - gchar *value; - GtkIconTheme *icon_theme; - GtkCssProvider *css_provider; - GError *error = NULL; + GtkBuilder *builder; + GdkWindow *root_window; + GtkWidget *image; + + GError *error = NULL; + + const GList *items; + const GList *item; + GList *menubar_items; + + gchar **config_groups; + gchar **config_group; + gchar **a11y_states; + + gchar *value; + + GtkCssProvider *css_provider; + GdkRGBA lightdm_gtk_greeter_override_defaults; + guint fallback_css_priority = GTK_STYLE_PROVIDER_PRIORITY_APPLICATION; + GtkIconTheme *icon_theme; /* Prevent memory from being swapped out, as we are dealing with passwords */ mlockall (MCL_CURRENT | MCL_FUTURE); @@ -2646,9 +2754,6 @@ main (int argc, char **argv) /* LP: #1024482 */ g_setenv ("GDK_CORE_DEVICE_EVENTS", "1", TRUE); - /* LP: #1366534 */ - g_setenv ("NO_AT_BRIDGE", "1", TRUE); - /* Initialize i18n */ setlocale (LC_ALL, ""); bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); @@ -2657,6 +2762,8 @@ main (int argc, char **argv) g_unix_signal_add (SIGTERM, (GSourceFunc)sigterm_cb, /* is_callback */ GINT_TO_POINTER (TRUE)); + default_user_icon = g_strdup("avatar-default"); + config_init (); if (config_get_bool (NULL, CONFIG_KEY_DEBUGGING, FALSE)) @@ -2873,7 +2980,7 @@ main (int argc, char **argv) } /* Hide empty panel */ - GList *menubar_items = gtk_container_get_children (GTK_CONTAINER (menubar)); + menubar_items = gtk_container_get_children (GTK_CONTAINER (menubar)); if (!menubar_items) gtk_widget_hide (GTK_WIDGET (panel_window)); else @@ -2891,10 +2998,13 @@ main (int argc, char **argv) if (value) { if (value[0] == '#') + { + g_free (default_user_icon); default_user_icon = g_strdup (value + 1); + } else { - default_user_pixbuf = gdk_pixbuf_new_from_file (value, &error); + default_user_pixbuf = gdk_pixbuf_new_from_file_at_scale (value, 80, 80, FALSE, &error); if (!default_user_pixbuf) { g_warning ("Failed to load default user image: %s", error->message); @@ -2910,6 +3020,8 @@ main (int argc, char **argv) /* Session menu */ if (gtk_widget_get_visible (session_menuitem)) { + GSList *sessions = NULL; + if (gtk_icon_theme_has_icon (icon_theme, "document-properties-symbolic")) session_badge = gtk_image_new_from_icon_name ("document-properties-symbolic", GTK_ICON_SIZE_MENU); else @@ -2918,7 +3030,6 @@ main (int argc, char **argv) gtk_container_add (GTK_CONTAINER (session_menuitem), session_badge); items = lightdm_get_sessions (); - GSList *sessions = NULL; for (item = items; item; item = item->next) { LightDMSession *session = item->data; @@ -2937,8 +3048,9 @@ main (int argc, char **argv) /* Language menu */ if (gtk_widget_get_visible (language_menuitem)) { - items = lightdm_get_languages (); GSList *languages = NULL; + gchar *modifier; + items = lightdm_get_languages (); for (item = items; item; item = item->next) { LightDMLanguage *language = item->data; @@ -2953,7 +3065,7 @@ main (int argc, char **argv) label = g_strdup (lightdm_language_get_name (language)); code = lightdm_language_get_code (language); - gchar *modifier = strchr (code, '@'); + modifier = strchr (code, '@'); if (modifier != NULL) { gchar *label_new = g_strdup_printf ("%s [%s]", label, modifier+1); @@ -3063,13 +3175,11 @@ main (int argc, char **argv) } /* A bit of CSS */ - GdkRGBA lightdm_gtk_greeter_override_defaults; css_provider = gtk_css_provider_new (); gtk_css_provider_load_from_data (css_provider, lightdm_gtk_greeter_css_application, lightdm_gtk_greeter_css_application_length, NULL); gtk_style_context_add_provider_for_screen (gdk_screen_get_default (), GTK_STYLE_PROVIDER (css_provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); css_provider = gtk_css_provider_new (); - guint fallback_css_priority = GTK_STYLE_PROVIDER_PRIORITY_APPLICATION; if (gtk_style_context_lookup_color (gtk_widget_get_style_context (GTK_WIDGET (login_window)), "lightdm-gtk-greeter-override-defaults", &lightdm_gtk_greeter_override_defaults)) @@ -3087,8 +3197,7 @@ main (int argc, char **argv) read_monitor_configuration (CONFIG_GROUP_DEFAULT, GREETER_BACKGROUND_DEFAULT); - gchar **config_group; - gchar **config_groups = config_get_groups (CONFIG_GROUP_MONITOR); + config_groups = config_get_groups (CONFIG_GROUP_MONITOR); for (config_group = config_groups; *config_group; ++config_group) { const gchar *name = *config_group + sizeof (CONFIG_GROUP_MONITOR); @@ -3135,17 +3244,18 @@ main (int argc, char **argv) gtk_builder_connect_signals (builder, greeter); - gchar **a11y_states = config_get_string_list (NULL, CONFIG_KEY_A11Y_STATES, NULL); + a11y_states = config_get_string_list (NULL, CONFIG_KEY_A11Y_STATES, NULL); if (a11y_states && *a11y_states) { - GHashTable *items = g_hash_table_new (g_str_hash, g_str_equal); - g_hash_table_insert (items, "contrast", contrast_menuitem); - g_hash_table_insert (items, "font", font_menuitem); - g_hash_table_insert (items, "keyboard", keyboard_menuitem); - g_hash_table_insert (items, "reader", reader_menuitem); - - gpointer item; + gpointer a11y_item; gchar **values_iter; + + GHashTable *a11y_items = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify)g_free, NULL); + g_hash_table_insert (a11y_items, g_strdup("contrast"), contrast_menuitem); + g_hash_table_insert (a11y_items, g_strdup("font"), font_menuitem); + g_hash_table_insert (a11y_items, g_strdup("keyboard"), keyboard_menuitem); + g_hash_table_insert (a11y_items, g_strdup("reader"), reader_menuitem); + for (values_iter = a11y_states; *values_iter; ++values_iter) { value = *values_iter; @@ -3154,28 +3264,26 @@ main (int argc, char **argv) case '-': continue; case '+': - if (g_hash_table_lookup_extended (items, &value[1], NULL, &item) && - gtk_widget_get_visible (GTK_WIDGET (item))) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE); + if (g_hash_table_lookup_extended (a11y_items, &value[1], NULL, &a11y_item) && + gtk_widget_get_visible (GTK_WIDGET (a11y_item))) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (a11y_item), TRUE); break; - case '~': - value++; default: - if (g_hash_table_lookup_extended (items, value, NULL, &item) && - gtk_widget_get_visible (GTK_WIDGET (item))) + if (g_hash_table_lookup_extended (a11y_items, value, NULL, &a11y_item) && + gtk_widget_get_visible (GTK_WIDGET (a11y_item))) { - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (a11y_item), config_get_bool (STATE_SECTION_A11Y, value, FALSE)); - g_signal_connect (G_OBJECT (item), "toggled", G_CALLBACK (a11y_menuitem_toggled_cb), g_strdup (value)); + g_signal_connect (G_OBJECT (a11y_item), "toggled", G_CALLBACK (a11y_menuitem_toggled_cb), g_strdup (value)); } } } - g_hash_table_unref (items); + g_hash_table_unref (a11y_items); } g_strfreev (a11y_states); /* There is no window manager, so we need to implement some of its functionality */ - GdkWindow* root_window = gdk_get_default_root_window (); + root_window = gdk_get_default_root_window (); gdk_window_set_events (root_window, gdk_window_get_events (root_window) | GDK_SUBSTRUCTURE_MASK); gdk_window_add_filter (root_window, wm_window_filter, NULL); @@ -3187,5 +3295,17 @@ main (int argc, char **argv) sigterm_cb (/* is_callback */ GINT_TO_POINTER (FALSE)); + { + Display *display = gdk_x11_display_get_xdisplay (gdk_display_get_default ()); + int screen = XDefaultScreen (display); + Window w = RootWindow (display, screen); + Atom id = XInternAtom (display, "AT_SPI_BUS", True); + if (id != None) + { + XDeleteProperty (display, w, id); + XSync (display, FALSE); + } + } + return EXIT_SUCCESS; } |