通过观察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) // 加载主题元素
- static void
- load_theme (GdmGreeterLoginWindow *login_window)
- {
- GtkWidget *entry;
- GtkWidget *button;
- GtkWidget *box;
- GtkWidget *image;
- gdm_profile_start (NULL);
- glade_set_custom_handler ((GladeXMLCustomWidgetHandler) custom_widget_constructor,
- login_window);
- login_window->priv->xml = glade_xml_new (GLADEDIR "/" GLADE_XML_FILE,
- "window-frame" ,
- PACKAGE);
- g_assert (login_window->priv->xml != NULL);
- image = glade_xml_get_widget (login_window->priv->xml, "logo-image" );
- if (image != NULL) {
- char *icon_name;
- GError *error;
- error = NULL;
- icon_name = gconf_client_get_string (login_window->priv->client, KEY_LOGO, &error);
- if (error != NULL) {
- g_debug ("GdmGreeterLoginWindow: unable to get logo icon name: %s" , error->message);
- g_error_free (error);
- }
- g_debug ("GdmGreeterLoginWindow: Got greeter logo '%s'" ,
- icon_name ? icon_name : "(null)" );
- if (icon_name != NULL) {
- gtk_image_set_from_icon_name (GTK_IMAGE (image),
- icon_name,
- GTK_ICON_SIZE_DIALOG);
- g_free (icon_name);
- }
- }
- box = glade_xml_get_widget (login_window->priv->xml, "window-frame" );
- gtk_container_add (GTK_CONTAINER (login_window), box);
- login_window->priv->user_chooser = glade_xml_get_widget (login_window->priv->xml,
- "user-chooser" );
- if (login_window->priv->user_chooser == NULL) {
- g_critical ("Userlist box not found" );
- }
- gdm_user_chooser_widget_set_show_only_chosen (GDM_USER_CHOOSER_WIDGET (login_window->priv->user_chooser), TRUE);
- g_signal_connect (login_window->priv->user_chooser,
- "loaded" ,
- G_CALLBACK (on_users_loaded),
- login_window);
- g_signal_connect (login_window->priv->user_chooser,
- "activated" ,
- G_CALLBACK (on_user_chosen),
- login_window);
- g_signal_connect (login_window->priv->user_chooser,
- "deactivated" ,
- G_CALLBACK (on_user_unchosen),
- login_window);
- g_signal_connect_swapped (login_window->priv->user_chooser,
- "notify::list-visible" ,
- G_CALLBACK (on_user_chooser_visibility_changed),
- login_window);
- gtk_widget_show (login_window->priv->user_chooser);
- login_window->priv->auth_banner_label = glade_xml_get_widget (login_window->priv->xml, "auth-banner-label" );
-
- button = glade_xml_get_widget (login_window->priv->xml, "suspend-button" );
- g_signal_connect (button, "clicked" , G_CALLBACK (suspend_button_clicked), login_window);
- button = glade_xml_get_widget (login_window->priv->xml, "cancel-button" );
- g_signal_connect (button, "clicked" , G_CALLBACK (cancel_button_clicked), login_window);
- button = glade_xml_get_widget (login_window->priv->xml, "disconnect-button" );
- g_signal_connect (button, "clicked" , G_CALLBACK (disconnect_button_clicked), login_window);
- button = glade_xml_get_widget (login_window->priv->xml, "restart-button" );
- g_signal_connect (button, "clicked" , G_CALLBACK (restart_button_clicked), login_window);
- button = glade_xml_get_widget (login_window->priv->xml, "shutdown-button" );
- g_signal_connect (button, "clicked" , G_CALLBACK (shutdown_button_clicked), login_window);
- entry = glade_xml_get_widget (login_window->priv->xml, "auth-prompt-entry" );
-
- if ( '*' == gtk_entry_get_invisible_char (GTK_ENTRY (entry))) {
- gunichar invisible_char;
- invisible_char = INVISIBLE_CHAR_BLACK_CIRCLE;
- gtk_entry_set_invisible_char (GTK_ENTRY (entry), invisible_char);
- }
- create_computer_info (login_window);
- box = glade_xml_get_widget (login_window->priv->xml, "computer-info-event-box" );
- g_signal_connect (box, "button-press-event" , G_CALLBACK (on_computer_info_label_button_press), login_window);
- switch_mode (login_window, MODE_SELECTION);
- gdm_profile_end (NULL);
- }
以上代码可以看出GDM-2.27主题加载方式是读.glade文件。手动主题只能改这个文件来实现。