Display of system users: Selecting the face

Friedrich W. H. Kossebau Friedrich.W.H at kossebau.de
Thu Jul 7 02:22:53 BST 2005


Hello,

as written for an enhanced display of system users I would like to reuse the 
user pictures shown by the display manager(s), also known as "face"s.

State of art:
---------------
At least KDM and GDM offer the option to display some faces along the system 
users. Such faces seem not to be part of the system user description in 
standards like POSIX. So the programmers of the dms obviously invented their 
own faces extensions and developed some quite complex configuration system 
for sources of faces.
There are two principle sources of faces: 
* one global, filled by the admin
* local ones, a file per user in his home directory. 
Which one to take is controlled (in KDM) by a setting with the following 
options:
* AdminOnly: only take faces from global dir
* PreferAdmin: first look for a face in the global dir
* PreferUser (standard in GDM): first look for a face given by the user
* UserOnly: only take the face given by the user
If no face is found a default face will be used. 

Two picture sizes are supported:
* 48x48 icon: named $LOGINNAME.face.icon in global dir, .face.icon in $HOME
* 300x300 image: named $LOGINNAME.face in global dir, .icon in $HOME
Format should be anything loadable by Imlib and Qt, usually is jpg or png.
The small icon is used as user symbol. The image is "used only as a fallback 
and is scaled down, but in the future it might be displayed full-size in the 
logo area or a tooltip." (from kdebase/kdm/config.def)

Special support for systems with management by LDAP etc. is unknown to me.


Discussion:
-------------
1. Size:
For comparison other places where faces/avatars are in use:
* xfaces in news/mails, also 48x48
* KAddressbook: support for face pixmaps up to 140x140
* Blogs, Bulletin boards:
  * phpBB: 81x81
  * kde-look.org: 50x50
  * others: up to 100x100 or above
So there seems not be to be some broader standard for the typical size of a 
face. As the faces are about to be used like icons the typical sizes from 22 
to 128 should be supported. This could be done by downscaling from one given 
picture with the largest size needed, like 140x140 or 300x300. No idea 
whether other image ratios than 1:1 have use cases and should be standarized.

2. Source of faces:
Enabling users to provide their own face as a file in their home dir works 
with display managers. They usually are run with superuser rights (or have 
some helper demons which are), so they can access all files. But with plain 
applications run by other users this can fail, depending on the rights. To 
circumvent this a special demon would be needed, which is suboptimal.

3. Type of faces:
Both (cropped) photographs and symbolic icons (pixel and vector) seem to be 
popular as user symbols. So both should be supported. While photographs have 
to be scaled anyway symbolic icons might be used prerendered for better 
quality, where possible.

4. Public/Private faces:
Displayed faces can have different publicity. Those on login/lock screens are 
possibly viewed by more people than those used in one's normal apps. 
Customization is one strength of Free Software so the demand can be perceived 
to enable each user to use his personal faces for the other users (perhaps 
even displayed names?)*. If private faces are enabled it has to be made sure 
they are not shown in public displays. Since some public visible displays are 
run by plain user's (e.g. the lock screen) this has to be reflected in the 
api for faces.

* E.g. by taking them from the address book. But might this put danger on 
security? What if someone manipulated one's addressbook and therefore the 
system displays the wrong person?

Proposal:
-----------
1. Admin only faces:
For a start only faces installed by the admin should be used. Per user 
customizations with private faces etc. should be delayed until security 
related problems have been cleared out. 
User given faces might be used if the files are readable to other user and 
allowed to be used. In fact we rip out the controlling of faces from the 
display manager and plant it to the user management (there are other things 
that should follow BTW).

2. Fallback icons:
For users with no own face two fallback faces are used: First the one of the 
primary group the user is in (e.g. users), if none is found, then a global 
one. So in opposite to the dm schemes there is an additional fallback icon 
per primary group.

3. Size: 
For a start the sizes and types used by the display managers should be 
overtaken. In the long run it might get some rethinking.

4. API:
For consistency the face loading should be designed along KIcon* classes. Some 
convenience functions with KUser might be liked, too. The experimental face 
using implementations I did proposed the following API to be a good start:

// size 0 results in original size/group default
// policy left out for now
class KUserFaceLoader { // singleton

  QImage loadFace(const KUser &user, int size = 0,
    KUserFaceLoader::Policy policy = KUserFaceLoader::Private*/);
 
  QPixmap loadFaceIcon(const KUser &user, 
    KIcon::Group group, int size = 0, int state = KIcon::DefaultState/*,
    KUserFaceLoader::Policy policy = KUserFaceLoader::Private*/);

  QIconSet loadFaceIconSet(const KUser &user, 
    KIcon::Group group, int size = 0/*, 
    KUserFaceLoader::Policy policy = KUserFaceLoader::Private*/);
};

class KUser  {
(...)
  QImage face(int size = 0/*, 
    KUserFaceLoader::Policy policy = KUserFaceLoader::Private*/) const;

  QPixmap faceIcon(KIcon::Group group,
    int size = 0, int state = KIcon::DefaultState/*,
    KUserFaceLoader::Policy policy = KUserFaceLoader::Private*/) const;

  QIconSet faceIconSet( KIcon::Group group, 
    int size = 0/*, 
    KUserFaceLoader::Policy policy = KUserFaceLoader::Private*/) const;
};

5. Support for LDAP etc.:
I don't know how faces might be supported by LDAP/SMB/etc. managed systems but 
the backend should transparently use it if available. Implementation details 
will surely arrive, once the basic infrastructure is done.

Waiting for your comments/suggestions, please :)

Regards
Friedrich




More information about the kde-core-devel mailing list