实现GConf修改/监视功能!

昨天看了一些文档,并自己写了个实例,终于实现了GConf修改/监视功能。

什么是GConf修改/监视功能呢?用过Ubuntu的朋友一定接触过gconf- editor,通过这个Ubuntu下的"注册表",我们可以来修改一些并不能在系统设置工具中进行的设置。

GConf不是Windows的注册表这么简单, 这不是三言两语就能讲完的。

GConf相当于Windows下的注册表,但事实并非这么简单。其中区别很大,但也不是三言两者能讲完的。我就按照自己的理解列出几个GConf的特点:

  1. GConf数据库是由多层次的文件夹+许多XML文件组成的,而非注册表的单一的不能通过普通手段编辑的文件;
  2. GConf有一个监视进程叫gconfd,修改某配置一般是通过调用gconfclient来修改,一经修改,马上生效,gconfd再会通知所有用到这个配置的应用程序,保持最新状态(真先进啊~);

大概就这两点吧!哈哈。

所以说,实现GConf的功能以后,就能自己写程序来修改系统配置了,更好的是,大多数GNOME下的软件的配置都保存在GConf下的,所以,OK,GConf就像注册表一样重要!

昨天试验了一会,写了个小实例,终于实现了GConf的修改和监视功能。

请看下图:

save_session-1.jpg

save_session-2.jpg

那个test是我写的小实例,功能是勾上这个选项,就相当于打开了"自动保存会话"的功能。我还在后面打开了gconf- editor,定位于同样的auto_ave_session,因为这里也是控制"自动保存会话"的地方。

这时,我只要勾上我那个test,gconf-editor里也自动会勾上,反之亦然。这说明gconfd自动监视/修改功能起作用了。哈哈。

下面是源代码(暂先不注释了,记录一下):

#include <gconf/gconf-client.h>
#include <gtk/gtk.h>

#include 
#include

void key_changed_callback(GConfClient* client,
    guint id,
    GConfEntry* entry,
    gpointer user_data)
{
  GtkWidget* label;
  gboolean bool;

  label= GTK_WIDGET(user_data);
  bool=gconf_value_get_bool(entry->value);

  if(bool==TRUE){
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(label),TRUE);
  }
  else {
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(label),FALSE);
  }
}

void button_toggled(GtkWidget *checkbutton,gpointer data)
{
  GConfClient *client;
  gboolean bool;

  client=GCONF_CLIENT(data);
  bool=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton));

  if(bool==TRUE){
    gconf_client_set_bool(client,"/apps/gnome-session/options/auto_save_session",TRUE,NULL);
  }else{
    gconf_client_set_bool(client,"/apps/gnome-session/options/auto_save_session",FALSE,NULL);
  }
}

int main(int argc, char** argv)
{
  GtkWidget* window;
  GtkWidget *checkbutton;
  GConfClient* client;
  gboolean bool;

  gtk_init(&argc, &argv);
  gconf_init(argc, argv, NULL);

  client = gconf_client_get_default();
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

  gtk_window_set_default_size(GTK_WINDOW(window),200,100);
  g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);

  bool=gconf_client_get_bool(client,"/apps/gnome-session/options/auto_save_session",NULL);
  checkbutton=gtk_check_button_new_with_label("自动保存会话");
  gtk_container_add(GTK_CONTAINER(window), checkbutton);
  g_signal_connect(G_OBJECT(checkbutton),"toggled",G_CALLBACK(button_toggled),client);

  if(bool==TRUE){
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton),TRUE);
  }
  else {
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton),FALSE);
  }

  gconf_client_add_dir(client,
      "/apps/gnome-session/options",
      GCONF_CLIENT_PRELOAD_NONE,
      NULL);

  gconf_client_notify_add(client, "/apps/gnome-session/options/auto_save_session",
      key_changed_callback,
      checkbutton,
      NULL, NULL);

  gtk_widget_show_all(window);
  gtk_main();

  return 0;
}

随着这个的完成,Cyrix/Tualatin混合开发阶段正式来临!

<推广> 本站架设于 Linode

No Comment

Leave a Comment