⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gnome-desktop.html

📁 这是一个介绍 linux 编程知识的文章。
💻 HTML
字号:
<HTML>
<HEAD>
   <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=GB2312">
    <TITLE>Gnome Desktop Programming</TITLE>
</HEAD>
<BODY>
<P><A HREF="Gnome-prog.html">上一页</A>
<A HREF="Bonobo.html">下一页</A>
<P><B><FONT SIZE=+3>GNOME Desktop</FONT></B><P>
GNOME的桌面中绝大多数应用既是CORBA的Server,同时也有自己的GUI,即它们提供的服务(引出的方法)需要画出图形以供用户访问它们的服务。所以我把GNOME上的应用分成五大类:<P>
<UL><LI>只使用GTK+,与CORBA无关;</LI><P>
<LI>除GTK+外,只使用无GUI的CORBA服务,类似于简单的库函数调用;</LI><P>
<LI>除GTK+外,还包含其它CORBA服务提供的GUI(Bonobo embeddable components),这时它是一个container,而被包含的组件被成为containee;</LI><P>
<LI>只是一个containee;</LI><P>
<LI>既是一个container,同时还是一个containee。</LI><P>
</UL><P>
对于一般的GNOME Desktop应用来说,好在问题没这么复杂。因为GNOME已经用C语言将大量的CORBA接口包裹了起来,你只需要简单象写GTK+程序一样方便地调用。

<P><B><FONT SIZE=+2>举例说明</FONT></B><P>
<P><B><FONT SIZE=+1>GNOME Panel</FONT></B><P>
GNOME Panel是方便用户的一个控制桌面环境的接口,panel的功能相当丰富,用户可以通过点击它上面的菜单或图标来启动一个应用,甚至可以在它上面嵌仍诵须一些应用(被称作applet)。我们下面就看一下一个applet是如何写的。
<P><B>一般的非applet程序</B><P>
<PRE>
 #include <gtk/gtk.h>
 int main(int argc, char **argv)
 {
    /* ... we build the user interface ... */
    gtk_init(&argc, &argv); /* #1 */
    GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL); /* #2 */
    gtk_window_set_title(GTK_WINDOW(window), PACKAGE);
    /* controls is the name of the container all our widgets are in */
    gtk_container_add(GTK_CONTAINER(window), controls); /* #3 */
    gtk_widget_show(window);

    /* Everything's ready to begin our main loop */
    gtk_main(); /* #4 */
    return 0;
 }
</PRE>
<P><B>将其改造为一个applet</B><P>
<PRE>
 #include <applet-widget.h>
 int main(int argc, char **argv)
 {
    applet_widget_init(PACKAGE, VERSION, argc, argv,
                       NULL, 0, NULL); /* #1 */
    GtkWidget* applet = applet_widget_new(PACKAGE); /* #2 */
    applet_widget_add(APPLET_WIDGET(applet), controls); /* #3 */
    gtk_widget_show(applet);
    applet_widget_gtk_main(); /* #4 */
    return 0;
 }
	
</PRE>

<P>通过下面这个函数为你的applet添加右键菜单:<P> 
void applet_widget_register_callback(AppletWidget *applet, char *name, char *menutext, AppletCallbackFunc func, gpointer data);

<P>这样,编译后,在命令行象启动一个普通的GTK应用一样运行它。它会自动出现在你的Panel上,就象普通GTK应用会自动出现在你的GNOME桌面上一样简单。
<P>如果你希望别的程序也可以访问你的applet,就要把它注册到GOAD中。办法是保存一个.gnorba文件,内容可以如下。这个道理我们在前面已经讲过了。
<PRE>
	[my_applet]
	type=exe
	repo_id=IDL:GNOME/Applet:1.0
	description=Example panel applet
	location_info=my_applet
</PRE>  
 
<P><B><FONT SIZE=+1>applet的CORBA实现原理</FONT></B><P>
为了实现GNOME Panel,定义了三个标准的IDL接口:: GNOME::Panel, GNOME::PanelSpot 和 GNOME::Applet。前两个是由panel实现的,第三个由applet实现。Panel接口初始化一个PanelSpot接口供Applet调用。
<P>基本思想是:applet生成一个控件需要显示出来,而panel则提供给这个applet一个画这个控件的窗口。另外applet还要通过Panel的接口告诉它自己的右键菜单。
<P>下面是这三个接口的示意IDL:<P>
<PRE>
module GNOME {
  struct Color {
    unsigned short red, green, blue;
  };
  typedef short AppletId;
  typedef short PanelId;

  interface Panel {
    enum OrientType {
      ORIENT_UP,
      ORIENT_DOWN,
      ORIENT_LEFT,
      ORIENT_RIGHT	
    };
    enum BackType {
      BACK_NONE,
      BACK_COLOR,
      BACK_PIXMAP
    };
    union BackInfoType switch(BackType) {
      case BACK_COLOR: Color c;
      case BACK_PIXMAP: string pmap;
    };
    enum SizeType {
      SIZE_TINY,
      SIZE_STANDARD,
      SIZE_LARGE,
      SIZE_HUGE	
    };

    PanelSpot add_applet(in Applet panel_applet,
                         in string goad_id,
                         out string cfgpath,
                         out string globcfgpath,
                         out unsigned long winid);
    
    oneway void quit ();

    readonly attribute boolean in_drag;
  };
  
  interface PanelSpot {
    // gosh !! i removed many things from here !!
    oneway void add_callback (in string callback_name,
    in string stock_item,
    in string menuitem_text);
    oneway void remove_callback (in string callback_name);
  };

  interface Applet {
    // gosh !! i removed many things from here !!
    oneway void do_callback (in string callback_name);
  };

};

</PRE>

<P>applet设计的一个技巧是利用了GTK+的Plug和Socket控件。Socket是生成一个绘图窗口;GTK_WINDOW_XWINDOW(widget)将这个控件转换为一个winid;而Plug又将这个winid转回为一个GTK的控件。工作过程如下:
<P><UL>
<LI>applet在运行并在ORB注册;</LI><BR>
<LI>applet调用panel的GNOME::Panel::add_applet函数要求加入;</LI><BR>
<LI>panel生成一个Socket;</LI><BR>
<LI>panel将这个控件转换为一个winid;</LI><BR>
<LI>这个winid通过add_applet调用的返回被传送给applet;</LI><BR>
<LI>applet把这个winid转回为一个控件Plug;</LI><BR>
<LI>applet把自己的控件加到gtk_plug中;</LI><BR>
<LI>添加右键菜单。</LI><BR>
</UL>
<P>大家看到了生成一个applet的实际过程,其复杂性实在令人头疼。好在已经全被C包裹了。

<P>
<P><A HREF="Gnome-prog.html">上一页</A>
<A HREF="Bonobo.html">下一页</A><P>
</BODY>
</HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -