GDM-2.20.1与GDM-2.27.1登录主题切换怎么实现的?

通过观察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) //  加载主题元素

  1. static   void   
  2. load_theme (GdmGreeterLoginWindow *login_window)  
  3. {  
  4.         GtkWidget *entry;  
  5.         GtkWidget *button;  
  6.         GtkWidget *box;  
  7.         GtkWidget *image;  
  8.         gdm_profile_start (NULL);  
  9.         glade_set_custom_handler ((GladeXMLCustomWidgetHandler) custom_widget_constructor,  
  10.                                   login_window);  
  11.         login_window->priv->xml = glade_xml_new (GLADEDIR "/"  GLADE_XML_FILE,  
  12.                                                  "window-frame" ,  
  13.                                                  PACKAGE);  
  14.         g_assert (login_window->priv->xml != NULL);  
  15.         image = glade_xml_get_widget (login_window->priv->xml, "logo-image" );  
  16.         if  (image != NULL) {  
  17.                 char         *icon_name;  
  18.                 GError      *error;  
  19.                 error = NULL;  
  20.                 icon_name = gconf_client_get_string (login_window->priv->client, KEY_LOGO, &error);  
  21.                 if  (error != NULL) {  
  22.                         g_debug ("GdmGreeterLoginWindow: unable to get logo icon name: %s" , error->message);  
  23.                         g_error_free (error);  
  24.                 }  
  25.                 g_debug ("GdmGreeterLoginWindow: Got greeter logo '%s'" ,  
  26.                           icon_name ? icon_name : "(null)" );  
  27.                 if  (icon_name != NULL) {  
  28.                         gtk_image_set_from_icon_name (GTK_IMAGE (image),  
  29.                                                       icon_name,  
  30.                                                       GTK_ICON_SIZE_DIALOG);  
  31.                         g_free (icon_name);  
  32.                 }  
  33.         }  
  34.         box = glade_xml_get_widget (login_window->priv->xml, "window-frame" );  
  35.         gtk_container_add (GTK_CONTAINER (login_window), box);  
  36.         login_window->priv->user_chooser = glade_xml_get_widget (login_window->priv->xml,  
  37.                                                                  "user-chooser" );  
  38.         if  (login_window->priv->user_chooser == NULL) {  
  39.                 g_critical ("Userlist box not found" );  
  40.         }  
  41.         gdm_user_chooser_widget_set_show_only_chosen (GDM_USER_CHOOSER_WIDGET (login_window->priv->user_chooser), TRUE);  
  42.         g_signal_connect (login_window->priv->user_chooser,  
  43.                           "loaded" ,  
  44.                           G_CALLBACK (on_users_loaded),  
  45.                           login_window);  
  46.         g_signal_connect (login_window->priv->user_chooser,  
  47.                           "activated" ,  
  48.                           G_CALLBACK (on_user_chosen),  
  49.                           login_window);  
  50.         g_signal_connect (login_window->priv->user_chooser,  
  51.                           "deactivated" ,  
  52.                           G_CALLBACK (on_user_unchosen),  
  53.                           login_window);  
  54.         g_signal_connect_swapped (login_window->priv->user_chooser,  
  55.                                  "notify::list-visible" ,  
  56.                                  G_CALLBACK (on_user_chooser_visibility_changed),  
  57.                                  login_window);  
  58.         gtk_widget_show (login_window->priv->user_chooser);  
  59.         login_window->priv->auth_banner_label = glade_xml_get_widget (login_window->priv->xml, "auth-banner-label" );  
  60.         /*make_label_small_italic (login_window->priv->auth_banner_label);*/   
  61.         button = glade_xml_get_widget (login_window->priv->xml, "suspend-button" );  
  62.         g_signal_connect (button, "clicked" , G_CALLBACK (suspend_button_clicked), login_window);  
  63.         button = glade_xml_get_widget (login_window->priv->xml, "cancel-button" );  
  64.         g_signal_connect (button, "clicked" , G_CALLBACK (cancel_button_clicked), login_window);  
  65.         button = glade_xml_get_widget (login_window->priv->xml, "disconnect-button" );  
  66.         g_signal_connect (button, "clicked" , G_CALLBACK (disconnect_button_clicked), login_window);  
  67.         button = glade_xml_get_widget (login_window->priv->xml, "restart-button" );  
  68.         g_signal_connect (button, "clicked" , G_CALLBACK (restart_button_clicked), login_window);  
  69.         button = glade_xml_get_widget (login_window->priv->xml, "shutdown-button" );  
  70.         g_signal_connect (button, "clicked" , G_CALLBACK (shutdown_button_clicked), login_window);  
  71.         entry = glade_xml_get_widget (login_window->priv->xml, "auth-prompt-entry" );  
  72.         /* Only change the invisible character if it '*' otherwise assume it is OK */   
  73.         if  ( '*'  == gtk_entry_get_invisible_char (GTK_ENTRY (entry))) {  
  74.                 gunichar invisible_char;  
  75.                 invisible_char = INVISIBLE_CHAR_BLACK_CIRCLE;  
  76.                 gtk_entry_set_invisible_char (GTK_ENTRY (entry), invisible_char);  
  77.         }  
  78.         create_computer_info (login_window);  
  79.         box = glade_xml_get_widget (login_window->priv->xml, "computer-info-event-box" );  
  80.         g_signal_connect (box, "button-press-event" , G_CALLBACK (on_computer_info_label_button_press), login_window);  
  81.         switch_mode (login_window, MODE_SELECTION);  
  82.         gdm_profile_end (NULL);  
  83. }  

以上代码可以看出GDM-2.27主题加载方式是读.glade文件。手动主题只能改这个文件来实现。

 

你可能感兴趣的:(C++,c,xml,C#)