[gdm] greeter: port to account service library
- From: Ray Strode <halfline src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gdm] greeter: port to account service library
- Date: Fri, 18 Feb 2011 23:11:43 +0000 (UTC)
commit ec034f78dcb27baf240658323892ac2a665c6580
Author: Ray Strode <rstrode redhat com>
Date: Fri Feb 18 17:54:08 2011 -0500
greeter: port to account service library
The current user manager code is a mess of dbus code for
talking to the accounts daemon and code for falling back if
it isn't there. The accounts daemon is no longer optional,
so drop all that and just use the accounts service library
directly.
configure.ac | 1 +
gui/simple-greeter/Makefile.am | 27 -
gui/simple-greeter/gdm-user-chooser-widget.c | 370 +++-
gui/simple-greeter/gdm-user-manager.c | 3082 --------------------------
gui/simple-greeter/gdm-user-manager.h | 91 -
gui/simple-greeter/test-user-manager.c | 27 +-
6 files changed, 316 insertions(+), 3282 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index fe612e7..48be019 100644
--- a/configure.ac
+++ b/configure.ac
@@ -125,6 +125,7 @@ PKG_CHECK_MODULES(SIMPLE_GREETER,
gtk+-3.0 >= $GTK_REQUIRED_VERSION
gconf-2.0 >= $GCONF_REQUIRED_VERSION
fontconfig >= $FONTCONFIG_REQUIRED_VERSION
+ accountsservice >= $ACCOUNTS_SERVICE_REQUIRED_VERSION
x11
)
SIMPLE_GREETER_LIBS="$SIMPLE_GREETER_LIBS -lm"
diff --git a/gui/simple-greeter/Makefile.am b/gui/simple-greeter/Makefile.am
index aa78504..a842c7b 100644
--- a/gui/simple-greeter/Makefile.am
+++ b/gui/simple-greeter/Makefile.am
@@ -26,29 +26,6 @@ schemasdir = @GCONF_SCHEMA_FILE_DIR@
schemas_in_files = gdm-simple-greeter.schemas.in
schemas_DATA = $(schemas_in_files:.schemas.in=.schemas)
-noinst_LTLIBRARIES = \
- libgdmuser.la \
- $(null)
-
-libgdmuser_la_SOURCES = \
- gdm-user.c \
- gdm-user.h \
- gdm-user-private.h \
- gdm-user-manager.c \
- gdm-user-manager.h \
- $(NULL)
-
-libgdmuser_la_CFLAGS = \
- $(SIMPLE_GREETER_CFLAGS) \
- $(NULL)
-
-libgdmuser_la_LIBADD = \
- $(NULL)
-
-libgdmuser_la_LDFLAGS = \
- -export-dynamic \
- $(NULL)
-
noinst_PROGRAMS = \
test-filesystem-type \
test-greeter-login-window \
@@ -87,7 +64,6 @@ test_greeter_login_window_SOURCES = \
test_greeter_login_window_LDADD = \
$(top_builddir)/common/libgdmcommon.la \
- libgdmuser.la \
$(COMMON_LIBS) \
$(SIMPLE_GREETER_LIBS) \
$(RBAC_LIBS) \
@@ -216,7 +192,6 @@ test_user_chooser_SOURCES = \
$(NULL)
test_user_chooser_LDADD = \
- libgdmuser.la \
$(top_builddir)/common/libgdmcommon.la \
$(COMMON_LIBS) \
$(SIMPLE_GREETER_LIBS) \
@@ -227,7 +202,6 @@ test_user_manager_SOURCES = \
$(NULL)
test_user_manager_LDADD = \
- libgdmuser.la \
$(top_builddir)/common/libgdmcommon.la \
$(COMMON_LIBS) \
$(SIMPLE_GREETER_LIBS) \
@@ -281,7 +255,6 @@ gdm_simple_greeter_SOURCES = \
gdm_simple_greeter_LDADD = \
$(top_builddir)/common/libgdmcommon.la \
- libgdmuser.la \
$(COMMON_LIBS) \
$(EXTRA_GREETER_LIBS) \
$(SIMPLE_GREETER_LIBS) \
diff --git a/gui/simple-greeter/gdm-user-chooser-widget.c b/gui/simple-greeter/gdm-user-chooser-widget.c
index 4b5a80f..a385218 100644
--- a/gui/simple-greeter/gdm-user-chooser-widget.c
+++ b/gui/simple-greeter/gdm-user-chooser-widget.c
@@ -37,7 +37,9 @@
#include <gconf/gconf-client.h>
-#include "gdm-user-manager.h"
+#include <act/act-user-manager.h>
+#include <act/act-user.h>
+
#include "gdm-user-chooser-widget.h"
#include "gdm-settings-keys.h"
#include "gdm-settings-client.h"
@@ -59,7 +61,7 @@ enum {
struct GdmUserChooserWidgetPrivate
{
- GdmUserManager *manager;
+ ActUserManager *manager;
GtkIconTheme *icon_theme;
GSList *users_to_add;
@@ -170,45 +172,307 @@ queue_update_other_user_visibility (GdmUserChooserWidget *widget)
}
static void
+rounded_rectangle (cairo_t *cr,
+ gdouble aspect,
+ gdouble x,
+ gdouble y,
+ gdouble corner_radius,
+ gdouble width,
+ gdouble height)
+{
+ gdouble radius;
+ gdouble degrees;
+
+ radius = corner_radius / aspect;
+ degrees = G_PI / 180.0;
+
+ cairo_new_sub_path (cr);
+ cairo_arc (cr,
+ x + width - radius,
+ y + radius,
+ radius,
+ -90 * degrees,
+ 0 * degrees);
+ cairo_arc (cr,
+ x + width - radius,
+ y + height - radius,
+ radius,
+ 0 * degrees,
+ 90 * degrees);
+ cairo_arc (cr,
+ x + radius,
+ y + height - radius,
+ radius,
+ 90 * degrees,
+ 180 * degrees);
+ cairo_arc (cr,
+ x + radius,
+ y + radius,
+ radius,
+ 180 * degrees,
+ 270 * degrees);
+ cairo_close_path (cr);
+}
+
+static cairo_surface_t *
+surface_from_pixbuf (GdkPixbuf *pixbuf)
+{
+ cairo_surface_t *surface;
+ cairo_t *cr;
+
+ surface = cairo_image_surface_create (gdk_pixbuf_get_has_alpha (pixbuf) ?
+ CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24,
+ gdk_pixbuf_get_width (pixbuf),
+ gdk_pixbuf_get_height (pixbuf));
+ cr = cairo_create (surface);
+ gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
+ cairo_paint (cr);
+ cairo_destroy (cr);
+
+ return surface;
+}
+
+/**
+ * go_cairo_convert_data_to_pixbuf:
+ * @src: a pointer to pixel data in cairo format
+ * @dst: a pointer to pixel data in pixbuf format
+ * @width: image width
+ * @height: image height
+ * @rowstride: data rowstride
+ *
+ * Converts the pixel data stored in @src in CAIRO_FORMAT_ARGB32 cairo format
+ * to GDK_COLORSPACE_RGB pixbuf format and move them
+ * to @dst. If @src == @dst, pixel are converted in place.
+ **/
+
+static void
+go_cairo_convert_data_to_pixbuf (unsigned char *dst,
+ unsigned char const *src,
+ int width,
+ int height,
+ int rowstride)
+{
+ int i,j;
+ unsigned int t;
+ unsigned char a, b, c;
+
+ g_return_if_fail (dst != NULL);
+
+#define MULT(d,c,a,t) G_STMT_START { t = (a)? c * 255 / a: 0; d = t;} G_STMT_END
+
+ if (src == dst || src == NULL) {
+ for (i = 0; i < height; i++) {
+ for (j = 0; j < width; j++) {
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ MULT(a, dst[2], dst[3], t);
+ MULT(b, dst[1], dst[3], t);
+ MULT(c, dst[0], dst[3], t);
+ dst[0] = a;
+ dst[1] = b;
+ dst[2] = c;
+#else
+ MULT(a, dst[1], dst[0], t);
+ MULT(b, dst[2], dst[0], t);
+ MULT(c, dst[3], dst[0], t);
+ dst[3] = dst[0];
+ dst[0] = a;
+ dst[1] = b;
+ dst[2] = c;
+#endif
+ dst += 4;
+ }
+ dst += rowstride - width * 4;
+ }
+ } else {
+ for (i = 0; i < height; i++) {
+ for (j = 0; j < width; j++) {
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ MULT(dst[0], src[2], src[3], t);
+ MULT(dst[1], src[1], src[3], t);
+ MULT(dst[2], src[0], src[3], t);
+ dst[3] = src[3];
+#else
+ MULT(dst[0], src[1], src[0], t);
+ MULT(dst[1], src[2], src[0], t);
+ MULT(dst[2], src[3], src[0], t);
+ dst[3] = src[0];
+#endif
+ src += 4;
+ dst += 4;
+ }
+ src += rowstride - width * 4;
+ dst += rowstride - width * 4;
+ }
+ }
+#undef MULT
+}
+
+static void
+cairo_to_pixbuf (guint8 *src_data,
+ GdkPixbuf *dst_pixbuf)
+{
+ unsigned char *src;
+ unsigned char *dst;
+ guint w;
+ guint h;
+ guint rowstride;
+
+ w = gdk_pixbuf_get_width (dst_pixbuf);
+ h = gdk_pixbuf_get_height (dst_pixbuf);
+ rowstride = gdk_pixbuf_get_rowstride (dst_pixbuf);
+
+ dst = gdk_pixbuf_get_pixels (dst_pixbuf);
+ src = src_data;
+
+ go_cairo_convert_data_to_pixbuf (dst, src, w, h, rowstride);
+}
+
+static GdkPixbuf *
+frame_pixbuf (GdkPixbuf *source)
+{
+ GdkPixbuf *dest;
+ cairo_t *cr;
+ cairo_surface_t *surface;
+ guint w;
+ guint h;
+ guint rowstride;
+ int frame_width;
+ double radius;
+ guint8 *data;
+
+ frame_width = 2;
+
+ w = gdk_pixbuf_get_width (source) + frame_width * 2;
+ h = gdk_pixbuf_get_height (source) + frame_width * 2;
+ radius = w / 10;
+
+ dest = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
+ TRUE,
+ 8,
+ w,
+ h);
+ rowstride = gdk_pixbuf_get_rowstride (dest);
+
+
+ data = g_new0 (guint8, h * rowstride);
+
+ surface = cairo_image_surface_create_for_data (data,
+ CAIRO_FORMAT_ARGB32,
+ w,
+ h,
+ rowstride);
+ cr = cairo_create (surface);
+ cairo_surface_destroy (surface);
+
+ /* set up image */
+ cairo_rectangle (cr, 0, 0, w, h);
+ cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0);
+ cairo_fill (cr);
+
+ rounded_rectangle (cr,
+ 1.0,
+ frame_width + 0.5,
+ frame_width + 0.5,
+ radius,
+ w - frame_width * 2 - 1,
+ h - frame_width * 2 - 1);
+ cairo_set_source_rgba (cr, 0.5, 0.5, 0.5, 0.3);
+ cairo_fill_preserve (cr);
+
+ surface = surface_from_pixbuf (source);
+ cairo_set_source_surface (cr, surface, frame_width, frame_width);
+ cairo_fill (cr);
+ cairo_surface_destroy (surface);
+
+ cairo_to_pixbuf (data, dest);
+
+ cairo_destroy (cr);
+ g_free (data);
+
+ return dest;
+}
+
+static GdkPixbuf *
+render_user_icon (GdmUserChooserWidget *widget,
+ ActUser *user)
+{
+ int size;
+ const char *file;
+ GdkPixbuf *pixbuf;
+ GdkPixbuf *framed;
+
+ pixbuf = NULL;
+
+ size = get_icon_height_for_widget (GTK_WIDGET (widget));
+ file = act_user_get_icon_file (user);
+
+ if (file) {
+ pixbuf = gdk_pixbuf_new_from_file_at_size (file, size, size, NULL);
+ }
+
+ if (pixbuf == NULL) {
+ GError *error;
+
+ error = NULL;
+ pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
+ "avatar-default",
+ size,
+ GTK_ICON_LOOKUP_FORCE_SIZE,
+ &error);
+ if (error != NULL) {
+ g_warning ("%s", error->message);
+ g_error_free (error);
+ }
+ }
+
+ if (pixbuf != NULL) {
+ framed = frame_pixbuf (pixbuf);
+ g_object_unref (pixbuf);
+
+ pixbuf = framed;
+ }
+
+ return pixbuf;
+}
+
+static void
update_item_for_user (GdmUserChooserWidget *widget,
- GdmUser *user)
+ ActUser *user)
{
GdkPixbuf *pixbuf;
char *tooltip;
gboolean is_logged_in;
- int size;
char *escaped_username;
char *escaped_real_name;
- if (!gdm_user_is_loaded (user)) {
+ if (!act_user_is_loaded (user)) {
return;
}
- size = get_icon_height_for_widget (GTK_WIDGET (widget));
- pixbuf = gdm_user_render_icon (user, size);
+ pixbuf = render_user_icon (widget, user);
if (pixbuf == NULL && widget->priv->stock_person_pixbuf != NULL) {
pixbuf = g_object_ref (widget->priv->stock_person_pixbuf);
}
tooltip = g_strdup_printf (_("Log in as %s"),
- gdm_user_get_user_name (user));
+ act_user_get_user_name (user));
- is_logged_in = gdm_user_is_logged_in (user);
+ is_logged_in = act_user_is_logged_in (user);
g_debug ("GdmUserChooserWidget: User added name:%s logged-in:%d pixbuf:%p",
- gdm_user_get_user_name (user),
+ act_user_get_user_name (user),
is_logged_in,
pixbuf);
- escaped_username = g_markup_escape_text (gdm_user_get_user_name (user), -1);
- escaped_real_name = g_markup_escape_text (gdm_user_get_real_name (user), -1);
+ escaped_username = g_markup_escape_text (act_user_get_user_name (user), -1);
+ escaped_real_name = g_markup_escape_text (act_user_get_real_name (user), -1);
gdm_chooser_widget_update_item (GDM_CHOOSER_WIDGET (widget),
escaped_username,
pixbuf,
escaped_real_name,
tooltip,
- gdm_user_get_login_frequency (user),
+ act_user_get_login_frequency (user),
is_logged_in,
FALSE);
g_free (escaped_real_name);
@@ -225,7 +489,7 @@ on_item_load (GdmChooserWidget *widget,
const char *id,
GdmUserChooserWidget *user_chooser)
{
- GdmUser *user;
+ ActUser *user;
g_debug ("GdmUserChooserWidget: Loading item for id=%s", id);
@@ -241,7 +505,7 @@ on_item_load (GdmChooserWidget *widget,
return;
}
- user = gdm_user_manager_get_user (user_chooser->priv->manager, id);
+ user = act_user_manager_get_user (user_chooser->priv->manager, id);
if (user != NULL) {
update_item_for_user (user_chooser, user);
}
@@ -467,7 +731,7 @@ is_user_list_disabled (GdmUserChooserWidget *widget)
static void
add_user (GdmUserChooserWidget *widget,
- GdmUser *user)
+ ActUser *user)
{
GdkPixbuf *pixbuf;
char *tooltip;
@@ -486,18 +750,18 @@ add_user (GdmUserChooserWidget *widget,
}
tooltip = g_strdup_printf (_("Log in as %s"),
- gdm_user_get_user_name (user));
+ act_user_get_user_name (user));
- is_logged_in = gdm_user_is_logged_in (user);
+ is_logged_in = act_user_is_logged_in (user);
- escaped_username = g_markup_escape_text (gdm_user_get_user_name (user), -1);
- escaped_real_name = g_markup_escape_text (gdm_user_get_real_name (user), -1);
+ escaped_username = g_markup_escape_text (act_user_get_user_name (user), -1);
+ escaped_real_name = g_markup_escape_text (act_user_get_real_name (user), -1);
gdm_chooser_widget_add_item (GDM_CHOOSER_WIDGET (widget),
escaped_username,
pixbuf,
escaped_real_name,
tooltip,
- gdm_user_get_login_frequency (user),
+ act_user_get_login_frequency (user),
is_logged_in,
FALSE,
(GdmChooserWidgetItemLoadFunc) on_item_load,
@@ -514,8 +778,8 @@ add_user (GdmUserChooserWidget *widget,
}
static void
-on_user_added (GdmUserManager *manager,
- GdmUser *user,
+on_user_added (ActUserManager *manager,
+ ActUser *user,
GdmUserChooserWidget *widget)
{
/* wait for all users to be loaded */
@@ -526,19 +790,19 @@ on_user_added (GdmUserManager *manager,
}
static void
-on_user_removed (GdmUserManager *manager,
- GdmUser *user,
+on_user_removed (ActUserManager *manager,
+ ActUser *user,
GdmUserChooserWidget *widget)
{
const char *user_name;
- g_debug ("GdmUserChooserWidget: User removed: %s", gdm_user_get_user_name (user));
+ g_debug ("GdmUserChooserWidget: User removed: %s", act_user_get_user_name (user));
/* wait for all users to be loaded */
if (! widget->priv->loaded) {
return;
}
- user_name = gdm_user_get_user_name (user);
+ user_name = act_user_get_user_name (user);
gdm_chooser_widget_remove_item (GDM_CHOOSER_WIDGET (widget),
user_name);
@@ -547,17 +811,17 @@ on_user_removed (GdmUserManager *manager,
}
static void
-on_user_is_logged_in_changed (GdmUserManager *manager,
- GdmUser *user,
+on_user_is_logged_in_changed (ActUserManager *manager,
+ ActUser *user,
GdmUserChooserWidget *widget)
{
const char *user_name;
gboolean is_logged_in;
- g_debug ("GdmUserChooserWidget: User logged in changed: %s", gdm_user_get_user_name (user));
+ g_debug ("GdmUserChooserWidget: User logged in changed: %s", act_user_get_user_name (user));
- user_name = gdm_user_get_user_name (user);
- is_logged_in = gdm_user_is_logged_in (user);
+ user_name = act_user_get_user_name (user);
+ is_logged_in = act_user_is_logged_in (user);
gdm_chooser_widget_set_item_in_use (GDM_CHOOSER_WIDGET (widget),
user_name,
@@ -565,8 +829,8 @@ on_user_is_logged_in_changed (GdmUserManager *manager,
}
static void
-on_user_changed (GdmUserManager *manager,
- GdmUser *user,
+on_user_changed (ActUserManager *manager,
+ ActUser *user,
GdmUserChooserWidget *widget)
{
/* wait for all users to be loaded */
@@ -612,7 +876,7 @@ queue_add_users (GdmUserChooserWidget *widget)
}
static void
-on_is_loaded_changed (GdmUserManager *manager,
+on_is_loaded_changed (ActUserManager *manager,
GParamSpec *pspec,
GdmUserChooserWidget *widget)
{
@@ -622,7 +886,7 @@ on_is_loaded_changed (GdmUserManager *manager,
g_debug ("GdmUserChooserWidget: Users loaded");
- users = gdm_user_manager_list_users (manager);
+ users = act_user_manager_list_users (manager);
g_slist_foreach (users, (GFunc) g_object_ref, NULL);
widget->priv->users_to_add = g_slist_concat (widget->priv->users_to_add, g_slist_copy (users));
@@ -658,38 +922,7 @@ load_users (GdmUserChooserWidget *widget)
{
if (widget->priv->show_normal_users) {
- char *temp;
- gboolean res;
- gboolean include_all;
- GSList *includes;
- GSList *excludes;
-
- widget->priv->manager = gdm_user_manager_ref_default ();
-
- /* exclude/include */
- g_debug ("Setting users to include:");
- res = gdm_settings_client_get_string (GDM_KEY_INCLUDE,
- &temp);
- parse_string_list (temp, &includes);
-
- g_debug ("Setting users to exclude:");
- res = gdm_settings_client_get_string (GDM_KEY_EXCLUDE,
- &temp);
- parse_string_list (temp, &excludes);
-
- include_all = FALSE;
- res = gdm_settings_client_get_boolean (GDM_KEY_INCLUDE_ALL,
- &include_all);
- g_object_set (widget->priv->manager,
- "include-all", include_all,
- "include-usernames-list", includes,
- "exclude-usernames-list", excludes,
- NULL);
-
- g_slist_foreach (includes, (GFunc) g_free, NULL);
- g_slist_free (includes);
- g_slist_foreach (excludes, (GFunc) g_free, NULL);
- g_slist_free (excludes);
+ widget->priv->manager = act_user_manager_get_default ();
g_signal_connect (widget->priv->manager,
"user-added",
@@ -711,7 +944,6 @@ load_users (GdmUserChooserWidget *widget)
"user-changed",
G_CALLBACK (on_user_changed),
widget);
- gdm_user_manager_queue_load (widget->priv->manager);
} else {
gdm_chooser_widget_loaded (GDM_CHOOSER_WIDGET (widget));
}
diff --git a/gui/simple-greeter/test-user-manager.c b/gui/simple-greeter/test-user-manager.c
index d0f6427..03b7a21 100644
--- a/gui/simple-greeter/test-user-manager.c
+++ b/gui/simple-greeter/test-user-manager.c
@@ -30,10 +30,12 @@
#include <glib/gi18n.h>
#include <gtk/gtk.h>
-#include "gdm-user-manager.h"
+#include <act/act-user-manager.h>
+#include <act/act-user.h>
+
#include "gdm-settings-client.h"
-static GdmUserManager *manager = NULL;
+static ActUserManager *manager = NULL;
static GMainLoop *main_loop = NULL;
static gboolean do_monitor = FALSE;
@@ -45,7 +47,7 @@ static GOptionEntry entries [] = {
};
static void
-on_is_loaded_changed (GdmUserManager *manager,
+on_is_loaded_changed (ActUserManager *manager,
GParamSpec *pspec,
gpointer data)
{
@@ -53,9 +55,9 @@ on_is_loaded_changed (GdmUserManager *manager,
g_debug ("Users loaded");
- users = gdm_user_manager_list_users (manager);
+ users = act_user_manager_list_users (manager);
while (users != NULL) {
- g_print ("User: %s\n", gdm_user_get_user_name (users->data));
+ g_print ("User: %s\n", act_user_get_user_name (users->data));
users = g_slist_delete_link (users, users);
}
@@ -65,19 +67,19 @@ on_is_loaded_changed (GdmUserManager *manager,
}
static void
-on_user_added (GdmUserManager *manager,
- GdmUser *user,
+on_user_added (ActUserManager *manager,
+ ActUser *user,
gpointer data)
{
- g_debug ("User added: %s", gdm_user_get_user_name (user));
+ g_debug ("User added: %s", act_user_get_user_name (user));
}
static void
-on_user_removed (GdmUserManager *manager,
- GdmUser *user,
+on_user_removed (ActUserManager *manager,
+ ActUser *user,
gpointer data)
{
- g_debug ("User removed: %s", gdm_user_get_user_name (user));
+ g_debug ("User removed: %s", act_user_get_user_name (user));
}
int
@@ -123,7 +125,7 @@ main (int argc, char *argv[])
exit (1);
}
- manager = gdm_user_manager_ref_default ();
+ manager = act_user_manager_get_default ();
g_object_set (manager, "include-all", TRUE, NULL);
g_signal_connect (manager,
"notify::is-loaded",
@@ -137,7 +139,6 @@ main (int argc, char *argv[])
"user-removed",
G_CALLBACK (on_user_removed),
NULL);
- gdm_user_manager_queue_load (manager);
main_loop = g_main_loop_new (NULL, FALSE);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]