通过观察GDM-2.20.1的代码我们可以发现,登录主题主要是通过GDM-2.20.1.src/gui/greeter/greeter.c类来实现。
简单来说其中的调用流程就是:main()->get_theme_file().
通过来获得对应主题的.desktop和.xml文件,以此来实现登录主题的加载。
这样,用户除了可以直接使用gdmsetup中系统提供的主题,还可以通过修改GdmGreeterTheme.desktop对应xxtheme.xml和图片文件等发方法来实现自己定制主题。
有趣的是,GDM-2.20之后到GDM-2.27之间这段版本里,并不提供主题的手动定制。主要是因为其代码被完全重写了,代码都包含#include <glib.h>,使之完全基于glib库。
遗憾的是GDM-2.27也不提供这个功能,在dm-2.27.4/gui/simple-greeter/greeter-main.c代码中可以看到:
greeter-main.c
main()
->调用
gdm-greeter-session.c
gdm_greeter_session_start()
->调用
toggle_login_window() // 窗口调用触发器
session->priv->login_window = gdm_greeter_login_window_new (is_local);
->调用
gdm-greeter-login-window.c
#define GLADE_XML_FILE "gdm-greeter-login-window.glade" // 定义主题布局
gdm_greeter_login_window_class_init()
-> 调用
gdm_greeter_login_window_constructor()
-> 调用
load_theme (GdmGreeterLoginWindow *login_window) // 加载主题元素
以上代码可以看出GDM-2.27主题加载方式是读.glade文件。手动主题只能改这个文件来实现。