diff --git a/base/logonui/src/welcome/userlist.c b/base/logonui/src/welcome/userlist.c index 0ff71bf..cfd3a22 100644 --- a/base/logonui/src/welcome/userlist.c +++ b/base/logonui/src/welcome/userlist.c @@ -20,6 +20,7 @@ #define USER_TILE_OFFSET_Y 6 #define USER_PIC_OFFSET 5 +#define USER_PIC_SIZE 48 #define USER_NAME_OFFSET_X 75 #define USER_NAME_OFFSET_Y 25 @@ -37,6 +38,15 @@ enum N_PROPERTIES }; +// +// PRIVATE STRUCTURES +// +typedef struct _WinTCWelcomeUserpic +{ + GdkPixbuf* pixbuf; + cairo_surface_t* surface; +} WinTCWelcomeUserpic; + // // FORWARD DECLARATIONS // @@ -126,10 +136,18 @@ static void wintc_welcome_user_list_set_vadjustment_values( ); static void draw_user( - cairo_t* cr, - LightDMUser* user, - const gboolean selected, - const WinTCWelcomeUserList* user_list + cairo_t* cr, + LightDMUser* user, + gboolean selected, + WinTCWelcomeUserList* user_list +); +static WinTCWelcomeUserpic* wintc_welcome_user_list_get_userpic( + WinTCWelcomeUserList* user_list, + const gchar* path +); + +static void free_userpic( + WinTCWelcomeUserpic* userpic ); static void on_self_adjustment_changed( @@ -181,13 +199,14 @@ struct _WinTCWelcomeUserList // GdkPixbuf* pixbuf_tile; GdkPixbuf* pixbuf_tilehot; - GdkPixbuf* pixbuf_userpic; GdkPixbuf* pixbuf_usersel; cairo_surface_t* surface_tile; cairo_surface_t* surface_tilehot; - cairo_surface_t* surface_userpic; cairo_surface_t* surface_usersel; + GHashTable* map_path_to_userpic; + WinTCWelcomeUserpic* default_userpic; + // Geometry // gint item_height; @@ -299,11 +318,6 @@ static void wintc_welcome_user_list_init( "/uk/oddmatics/wintc/logonui/tilehot.png", NULL // FIXME: Error reporting ); - self->pixbuf_userpic = - gdk_pixbuf_new_from_resource( - "/uk/oddmatics/wintc/logonui/userpic.png", - NULL // FIXME: Error reporting - ); self->pixbuf_usersel = gdk_pixbuf_new_from_resource( "/uk/oddmatics/wintc/logonui/usersel.png", @@ -322,12 +336,6 @@ static void wintc_welcome_user_list_init( 1, NULL ); - self->surface_userpic = - gdk_cairo_surface_create_from_pixbuf( - self->pixbuf_userpic, - 1, - NULL - ); self->surface_usersel = gdk_cairo_surface_create_from_pixbuf( self->pixbuf_usersel, @@ -335,6 +343,30 @@ static void wintc_welcome_user_list_init( NULL ); + // Set up userpic map and default userpic + // + self->map_path_to_userpic = + g_hash_table_new_full( + g_str_hash, + g_str_equal, + (GDestroyNotify) g_free, + (GDestroyNotify) free_userpic + ); + + self->default_userpic = g_new(WinTCWelcomeUserpic, 1); + + self->default_userpic->pixbuf = + gdk_pixbuf_new_from_resource( + "/uk/oddmatics/wintc/logonui/userpic.png", + NULL // FIXME: Error reporting + ); + self->default_userpic->surface = + gdk_cairo_surface_create_from_pixbuf( + self->default_userpic->pixbuf, + 1, + NULL + ); + // Set up widgets // self->box_auth = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); @@ -422,11 +454,9 @@ static void wintc_welcome_user_list_finalize( cairo_surface_destroy(user_list->surface_tile); cairo_surface_destroy(user_list->surface_tilehot); - cairo_surface_destroy(user_list->surface_userpic); cairo_surface_destroy(user_list->surface_usersel); g_clear_object(&user_list->pixbuf_tile); g_clear_object(&user_list->pixbuf_tilehot); - g_clear_object(&user_list->pixbuf_userpic); g_clear_object(&user_list->pixbuf_usersel); (G_OBJECT_CLASS(wintc_welcome_user_list_parent_class))->finalize(gobject); @@ -954,10 +984,10 @@ static void wintc_welcome_user_list_set_vadjustment_values( static void draw_user( - cairo_t* cr, - LightDMUser* user, - const gboolean selected, - const WinTCWelcomeUserList* user_list + cairo_t* cr, + LightDMUser* user, + gboolean selected, + WinTCWelcomeUserList* user_list ) { //const gchar* text = lightdm_user_get_name(user); @@ -984,6 +1014,12 @@ static void draw_user( // Render userpic // + WinTCWelcomeUserpic* userpic = + wintc_welcome_user_list_get_userpic( + user_list, + lightdm_user_get_image(user) + ); + cairo_set_source_surface( cr, selected ? @@ -996,7 +1032,7 @@ static void draw_user( cairo_set_source_surface( cr, - user_list->surface_userpic, + userpic->surface, USER_TILE_OFFSET_X + USER_PIC_OFFSET, USER_TILE_OFFSET_Y + USER_PIC_OFFSET + origin_y ); @@ -1020,9 +1056,73 @@ static void draw_user( cairo_show_text(cr, lightdm_user_get_name(user)); } +static WinTCWelcomeUserpic* wintc_welcome_user_list_get_userpic( + WinTCWelcomeUserList* user_list, + const gchar* path +) +{ + WinTCWelcomeUserpic* userpic; + + if (!path) + { + return user_list->default_userpic; + } + + userpic = + g_hash_table_lookup( + user_list->map_path_to_userpic, + path + ); + + if (userpic) + { + return userpic; + } + + // Load the userpic + // + GdkPixbuf* pixbuf = + gdk_pixbuf_new_from_file_at_scale( + path, + USER_PIC_SIZE, + USER_PIC_SIZE, + FALSE, + NULL + ); + + if (!pixbuf) + { + return user_list->default_userpic; + } + + // All good, create the userpic mapping + // + userpic = g_new(WinTCWelcomeUserpic, 1); + + userpic->pixbuf = pixbuf; + userpic->surface = gdk_cairo_surface_create_from_pixbuf(pixbuf, 1, NULL); + + g_hash_table_insert( + user_list->map_path_to_userpic, + g_strdup(path), + userpic + ); + + return userpic; +} + // // CALLBACKS // +static void free_userpic( + WinTCWelcomeUserpic* userpic +) +{ + cairo_surface_destroy(userpic->surface); + g_object_unref(userpic->pixbuf); + g_free(userpic); +} + static void on_self_adjustment_changed( WINTC_UNUSED(GtkAdjustment* adjustment), WinTCWelcomeUserList* user_list diff --git a/enduser/userpics/CMakeLists.txt b/enduser/userpics/CMakeLists.txt new file mode 100644 index 0000000..ae977bc --- /dev/null +++ b/enduser/userpics/CMakeLists.txt @@ -0,0 +1,32 @@ +cmake_minimum_required(VERSION 3.12) + +project( + wintc-user-pictures + VERSION 1.0 + DESCRIPTION "Windows Total Conversion user pictures." + LANGUAGES C +) + +set(PROJECT_ANYARCH true) +set(PROJECT_FREESTATUS false) +set(PROJECT_MAINTAINER "Rory Fewell ") + +set(PROJECT_ROOT ${CMAKE_CURRENT_LIST_DIR}) + +include(GNUInstallDirs) + +include(../../packaging/cmake-inc/common/CMakeLists.txt) +include(../../packaging/cmake-inc/packaging/CMakeLists.txt) + +# Installation +# +wintc_configure_and_install_packaging() + +install( + DIRECTORY ${PROJECT_ROOT}/default/ + DESTINATION ${WINTC_ASSETS_INSTALL_DIR}/userpics/default +) +install( + FILES ${PROJECT_ROOT}/guest.bmp + DESTINATION ${WINTC_ASSETS_INSTALL_DIR}/userpics +) diff --git a/enduser/userpics/default/airplane.bmp b/enduser/userpics/default/airplane.bmp new file mode 100644 index 0000000..572a5d8 Binary files /dev/null and b/enduser/userpics/default/airplane.bmp differ diff --git a/enduser/userpics/default/astro.bmp b/enduser/userpics/default/astro.bmp new file mode 100644 index 0000000..8aa8fb2 Binary files /dev/null and b/enduser/userpics/default/astro.bmp differ diff --git a/enduser/userpics/default/beach.bmp b/enduser/userpics/default/beach.bmp new file mode 100644 index 0000000..f10b296 Binary files /dev/null and b/enduser/userpics/default/beach.bmp differ diff --git a/enduser/userpics/default/butterfl.bmp b/enduser/userpics/default/butterfl.bmp new file mode 100644 index 0000000..b2aec89 Binary files /dev/null and b/enduser/userpics/default/butterfl.bmp differ diff --git a/enduser/userpics/default/car.bmp b/enduser/userpics/default/car.bmp new file mode 100644 index 0000000..2d288c6 Binary files /dev/null and b/enduser/userpics/default/car.bmp differ diff --git a/enduser/userpics/default/cat.bmp b/enduser/userpics/default/cat.bmp new file mode 100644 index 0000000..f2354db Binary files /dev/null and b/enduser/userpics/default/cat.bmp differ diff --git a/enduser/userpics/default/chess.bmp b/enduser/userpics/default/chess.bmp new file mode 100644 index 0000000..bdaa76f Binary files /dev/null and b/enduser/userpics/default/chess.bmp differ diff --git a/enduser/userpics/default/dirtbike.bmp b/enduser/userpics/default/dirtbike.bmp new file mode 100644 index 0000000..b3f0b5c Binary files /dev/null and b/enduser/userpics/default/dirtbike.bmp differ diff --git a/enduser/userpics/default/dog.bmp b/enduser/userpics/default/dog.bmp new file mode 100644 index 0000000..31c1c6d Binary files /dev/null and b/enduser/userpics/default/dog.bmp differ diff --git a/enduser/userpics/default/drip.bmp b/enduser/userpics/default/drip.bmp new file mode 100644 index 0000000..2e1f34b Binary files /dev/null and b/enduser/userpics/default/drip.bmp differ diff --git a/enduser/userpics/default/duck.bmp b/enduser/userpics/default/duck.bmp new file mode 100644 index 0000000..5ca4923 Binary files /dev/null and b/enduser/userpics/default/duck.bmp differ diff --git a/enduser/userpics/default/fish.bmp b/enduser/userpics/default/fish.bmp new file mode 100644 index 0000000..eb0e8d3 Binary files /dev/null and b/enduser/userpics/default/fish.bmp differ diff --git a/enduser/userpics/default/frog.bmp b/enduser/userpics/default/frog.bmp new file mode 100644 index 0000000..18139dc Binary files /dev/null and b/enduser/userpics/default/frog.bmp differ diff --git a/enduser/userpics/default/guitar.bmp b/enduser/userpics/default/guitar.bmp new file mode 100644 index 0000000..f67d87b Binary files /dev/null and b/enduser/userpics/default/guitar.bmp differ diff --git a/enduser/userpics/default/horses.bmp b/enduser/userpics/default/horses.bmp new file mode 100644 index 0000000..ef30ac0 Binary files /dev/null and b/enduser/userpics/default/horses.bmp differ diff --git a/enduser/userpics/default/kick.bmp b/enduser/userpics/default/kick.bmp new file mode 100644 index 0000000..dcad246 Binary files /dev/null and b/enduser/userpics/default/kick.bmp differ diff --git a/enduser/userpics/default/liftoff.bmp b/enduser/userpics/default/liftoff.bmp new file mode 100644 index 0000000..78d5404 Binary files /dev/null and b/enduser/userpics/default/liftoff.bmp differ diff --git a/enduser/userpics/default/palmtree.bmp b/enduser/userpics/default/palmtree.bmp new file mode 100644 index 0000000..0b2a99a Binary files /dev/null and b/enduser/userpics/default/palmtree.bmp differ diff --git a/enduser/userpics/default/pnkflowr.bmp b/enduser/userpics/default/pnkflowr.bmp new file mode 100644 index 0000000..2419049 Binary files /dev/null and b/enduser/userpics/default/pnkflowr.bmp differ diff --git a/enduser/userpics/default/redflowr.bmp b/enduser/userpics/default/redflowr.bmp new file mode 100644 index 0000000..4d9adb2 Binary files /dev/null and b/enduser/userpics/default/redflowr.bmp differ diff --git a/enduser/userpics/default/skater.bmp b/enduser/userpics/default/skater.bmp new file mode 100644 index 0000000..afe2681 Binary files /dev/null and b/enduser/userpics/default/skater.bmp differ diff --git a/enduser/userpics/default/snwflake.bmp b/enduser/userpics/default/snwflake.bmp new file mode 100644 index 0000000..7cf831b Binary files /dev/null and b/enduser/userpics/default/snwflake.bmp differ diff --git a/enduser/userpics/default/soccer.bmp b/enduser/userpics/default/soccer.bmp new file mode 100644 index 0000000..1fb4feb Binary files /dev/null and b/enduser/userpics/default/soccer.bmp differ diff --git a/enduser/userpics/guest.bmp b/enduser/userpics/guest.bmp new file mode 100644 index 0000000..70222cd Binary files /dev/null and b/enduser/userpics/guest.bmp differ diff --git a/shell/taskband/res/fpo-userpic.png b/shell/taskband/res/fpo-userpic.png deleted file mode 100644 index 3a24c53..0000000 Binary files a/shell/taskband/res/fpo-userpic.png and /dev/null differ diff --git a/shell/taskband/src/res/resources.xml b/shell/taskband/src/res/resources.xml index 94ec909..5176641 100644 --- a/shell/taskband/src/res/resources.xml +++ b/shell/taskband/src/res/resources.xml @@ -7,6 +7,7 @@ start-menu.css task-buttons.css taskbutton-ctx-menu.ui + userpic.bmp volume-popup.css diff --git a/shell/taskband/src/res/userpic.bmp b/shell/taskband/src/res/userpic.bmp new file mode 100644 index 0000000..bdaa76f Binary files /dev/null and b/shell/taskband/src/res/userpic.bmp differ diff --git a/shell/taskband/src/start/personal.c b/shell/taskband/src/start/personal.c index 2949b17..fa414a4 100644 --- a/shell/taskband/src/start/personal.c +++ b/shell/taskband/src/start/personal.c @@ -925,22 +925,48 @@ static void refresh_userpic( WinTCToolbarStart* toolbar_start ) { - // TODO: Read from AccountsService or whatever on DBus? Default to the - // flower pic -- for now we're just displaying the FPO image - // - static const gchar* css = - "* { background-image: url('" - WINTC_ASSETS_DIR "/shell-res/fpo-userpic.png" - "'); }"; + static const gchar* s_path_face = NULL; - // Give GTK a bump that we want to update the pic + if (!s_path_face) + { + s_path_face = + g_build_path( + G_DIR_SEPARATOR_S, + g_get_home_dir(), + ".face", + NULL + ); + } + + // Update the pic CSS if we have a face, otherwise default to the built-in + // pic // + const gchar* actual_path; + gchar* css; + + if (g_file_test(s_path_face, G_FILE_TEST_IS_REGULAR)) + { + actual_path = s_path_face; + } + else + { + actual_path = "resource:///uk/oddmatics/wintc/taskband/userpic.bmp"; + } + + css = + g_strdup_printf( + "* { background-image: url('%s'); }", + actual_path + ); + gtk_css_provider_load_from_data( GTK_CSS_PROVIDER(toolbar_start->personal.style_userpic), css, -1, NULL ); + + g_free(css); } static void update_personal_menu_mfu_items(