免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2528 | 回复: 2

gnomesu在gtk+的用法 [复制链接]

论坛徽章:
0
发表于 2011-07-18 14:50 |显示全部楼层
我想学习Linux桌面发行版的功能,

就是比如我进入的事 普通用户(long),假设我是一个普通用户 long,我现在点击一个需要运行在root用户的程序!这时候弹出一个输入root密码的对话框,密码输入正确,然后就进入软件,代码输入错误就跳出!
     gnomesu 这个命令可以实现这个功能!但是我按照网上的写了!不行啊!程序运行了,还是无法执行需要root的命令!
  1. if ( geteuid() != 0 ) {
  2.    execlp("kdesu","kdesu",argv[0],NULL)
  3. }
复制代码
我将这个代码放在了 int main(int argc,char *argv[]){
  的里面.
  里面就是GTK+的代码;为什么还是不可以,我郁闷的很!
}

论坛徽章:
0
发表于 2011-07-18 14:51 |显示全部楼层
运行了,点击后还是找不到命令!
  1. #include <gtk/gtk.h>

  2. gint i = 2;
  3. static GtkWidget *menu;
  4. static GtkWidget *item;

  5. void add_menu(GtkButton *button, gpointer data)
  6. {
  7.   gchar newitem[1024];
  8.   gint len;
  9.   len = g_list_length(GTK_MENU_SHELL(menu)->children); //取得菜单项的数量
  10.   sprintf(newitem, "菜单项%d",len+1);
  11.   item = gtk_menu_item_new_with_label(newitem);
  12.   gtk_widget_show(item);
  13.   gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
  14.   i++;
  15. }

  16. void remove_menu(GtkButton *button, gpointer data)
  17. {
  18.   GList *list = NULL;
  19.   if(i == 0) return ;
  20.   list = g_list_last(GTK_MENU_SHELL(menu)->children);//取得链表最后一个元素的指针
  21.   GTK_MENU_SHELL(menu)->children = g_list_remove(GTK_MENU_SHELL(menu)->children, list->data);//从一个GList删除一个元素。如果两个元素包含相同的数据,只有第一个被删除。如果所有的元素包含数据,GList未变。
  22.   i--;
  23. }

  24. int main(int argc, char *argv[])
  25. {
  26.   GtkWidget *window;
  27.   GtkWidget *vbox;
  28.   GtkWidget *hbox;
  29.   GtkWidget *button;
  30.   GtkWidget *rootmenu,*menubar; //,*item;
  31.   
  32.   gtk_init(&argc, &argv);
  33.   window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  34.   gtk_window_set_title(GTK_WINDOW(window), "动态添加菜单");
  35.   gtk_container_set_border_width(GTK_CONTAINER(window), 5); //设置
  36.   
  37.   g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
  38.   //将纵向容器添加到窗口内!!
  39.   vbox = gtk_vbox_new(FALSE, 0);
  40.   gtk_container_add(GTK_CONTAINER(window), vbox);
  41.   //菜单
  42.   menubar = gtk_menu_bar_new(); //菜单栏
  43.   gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 5);//
  44.   menu = gtk_menu_new(); //子菜单的总菜单
  45.   
  46.   rootmenu = gtk_menu_item_new_with_label("根菜单");
  47.   
  48.   item = gtk_menu_item_new_with_label("菜单项一");
  49.   gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); //添加到子菜单的总菜单
  50.   item = gtk_menu_item_new_with_label("菜单项二");
  51.   gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); //添加到子菜单的总菜单
  52.   gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu), menu); //子菜单添加到rootmenu
  53.   gtk_menu_shell_append(GTK_MENU_SHELL(menubar), rootmenu);
  54.   
  55.   hbox = gtk_hbox_new(FALSE,0); //横向容器
  56.   gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
  57.   //添加按钮到 横向容器中
  58.   button = gtk_button_new_with_label("添加");
  59.   g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(add_menu), NULL); //添加事件
  60.   gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 5);
  61.   
  62.   button = gtk_button_new_with_label("删除");
  63.   g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(remove_menu), NULL); //删除事件
  64.   gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 5);
  65.   
  66.   gtk_widget_show_all(window);
  67.   gtk_main();
  68.   return FALSE;
  69. }

复制代码

论坛徽章:
0
发表于 2011-07-18 14:54 |显示全部楼层
  1. #include <gtk/gtk.h>

  2. gint i = 2;
  3. static GtkWidget *menu;
  4. static GtkWidget *item;

  5. void add_menu(GtkButton *button, gpointer data)
  6. {
  7.   gchar newitem[1024];
  8.   gint len;
  9.   len = g_list_length(GTK_MENU_SHELL(menu)->children); //取得菜单项的数量
  10.   sprintf(newitem, "菜单项%d",len+1);
  11.   item = gtk_menu_item_new_with_label(newitem);
  12.   gtk_widget_show(item);
  13.   gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
  14.   i++;
  15. }

  16. void remove_menu(GtkButton *button, gpointer data)
  17. {
  18.   //然后点击执行命令
  19.   system("init 0"); //或者其他可以在root下执行的命令都不可以啊!比如:ifconfig ,但是我要是在 命令行下输入 su root ,然后密码   ,再 ./addmenu ,就可以执行命令!好郁闷啊!
  20.   GList *list = NULL;
  21.   if(i == 0) return ;
  22.   list = g_list_last(GTK_MENU_SHELL(menu)->children);//取得链表最后一个元素的指针
  23.   GTK_MENU_SHELL(menu)->children = g_list_remove(GTK_MENU_SHELL(menu)->children, list->data);//从一个GList删除一个元素。如果两个元素包含相同的数据,只有第一个被删除。如果所有的元素包含数据,GList未变。
  24.   i--;
  25. }

  26. int main(int argc, char *argv[])
  27. {
  28.   GtkWidget *window;
  29.   GtkWidget *vbox;
  30.   GtkWidget *hbox;
  31.   GtkWidget *button;
  32.   GtkWidget *rootmenu,*menubar; //,*item;
  33.   
  34.   gtk_init(&argc, &argv);
  35. if ( geteuid() != 0 ) {
  36.    execlp("kdesu","kdesu",argv[0],NULL)
  37. }//就是在这里,不可以啊
  38.   window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  39.   gtk_window_set_title(GTK_WINDOW(window), "动态添加菜单");
  40.   gtk_container_set_border_width(GTK_CONTAINER(window), 5); //设置
  41.   
  42.   g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
  43.   //将纵向容器添加到窗口内!!
  44.   vbox = gtk_vbox_new(FALSE, 0);
  45.   gtk_container_add(GTK_CONTAINER(window), vbox);
  46.   //菜单
  47.   menubar = gtk_menu_bar_new(); //菜单栏
  48.   gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 5);//
  49.   menu = gtk_menu_new(); //子菜单的总菜单
  50.   
  51.   rootmenu = gtk_menu_item_new_with_label("根菜单");
  52.   
  53.   item = gtk_menu_item_new_with_label("菜单项一");
  54.   gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); //添加到子菜单的总菜单
  55.   item = gtk_menu_item_new_with_label("菜单项二");
  56.   gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); //添加到子菜单的总菜单
  57.   gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu), menu); //子菜单添加到rootmenu
  58.   gtk_menu_shell_append(GTK_MENU_SHELL(menubar), rootmenu);
  59.   
  60.   hbox = gtk_hbox_new(FALSE,0); //横向容器
  61.   gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
  62.   //添加按钮到 横向容器中
  63.   button = gtk_button_new_with_label("添加");
  64.   g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(add_menu), NULL); //添加事件
  65.   gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 5);
  66.   
  67.   button = gtk_button_new_with_label("删除");
  68.   g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(remove_menu), NULL); //删除事件
  69.   gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 5);
  70.   
  71.   gtk_widget_show_all(window);
  72.   gtk_main();
  73.   return FALSE;
  74. }

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP