summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am4
-rw-r--r--src/greeterbackground.c292
-rw-r--r--src/greeterconfiguration.c68
-rw-r--r--src/greeterdeprecated.c117
-rw-r--r--src/greeterdeprecated.h41
-rw-r--r--src/greetermenubar.c51
-rw-r--r--src/lightdm-gtk-greeter.c414
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;
}