Clutter调用底层原理剖析

原创 2011年10月14日 14:16:49

1 初识Clutter

按照Clutter官网所述,Clutter是一个支持2D曲面的3D动画的GUI库,是一个C API集合。目前版本Clutter1.8.0-stable release,http://download.gnome.org/sources/clutter/1.8。

2 编程在Gjs

const Clutter = imports.gi.Clutter;

正是通过这条语句在Gjs编程中导入路Clutter模块,使得Gjs可以访问底层基于C语言实现的Clutter lib。

2.1 基本Class

clutter的核心概念是:stage(画布,舞台)和actor(演员)。莎士比亚说“全世界是一座舞台,所有的男人女人不过是演员”,这句话很好的表现了这点。画布相当于一个window是actor的舞台。Clutter是一种封装,封装就会有container。所以clutter程序都需要创建一个stage,它是最顶层的对象,也是一个container(容器),让其他的actor在其上面表演。actor们本身都是2D对象,是平面的,不过clutter允许我们对这些actor在3D空间进行操作,比如绕着x,y,z轴旋转。

2.2 简单编程示例(C到Gjs)

程序实现一个矩形中嵌套一个小矩形,显示文字,并接受mouse事件。


int main(int argc,char **argv)
{
ClutterColor stage_color ={0x00,0x00,0x00,0xff};
clutter_init (&argc,&argv);
ClutterActor *stage = clutter_stage_get_default();
clutter_actor_set_size(stage,200,200);
clutter_stage_set_color(CLUTTER_STAGE(stage),&stage_color);
ClutterActor *actor= clutter_rectangle_new();
clutter_actor_set_size(actor,100,100);
clutter_container_add_actor(CLUTTER_CONTAINER(stage),actor);
clutter_actor_set_position (actor,50,50);
ClutterColor color_color={0xff,0xff,0xff,0xff};
ClutterActor *label = clutter_text_new_full ("Sans 12","Alex_Test",&color_color);
clutter_actor_set_size (label,50,20);
clutter_actor_set_position (label,20,160);
clutter_container_add_actor (CLUTTER_CONTAINER (stage),label);
clutter_actor_set_scale(actor,0.5,0.5);
clutter_actor_set_scale(actor,0.5,0.5);
clutter_actor_show(stage);
g_signal_connect (stage,"button-press-event",
G_CALLBACK(on_stage_button_press),NULL);
clutter_main();
return EXIT_SUCCESS;
}

使用Gjs编程,就需要改变Mothod,使用Gjs环境下的Clutter编程。方法类的调用,可以通过Clutter-1.0.gir查阅(详见下文)。


<class name="Timeline"
c:symbol-prefix="timeline"
c:type="ClutterTimeline"
version="0.2"
parent="GObject.Object"
glib:type-name="ClutterTimeline"
glib:get-type="clutter_timeline_get_type"
glib:type-struct="TimelineClass">

2.3 ClutterTimeline

 clutter除了可以让我们在3D空间操作2D的actor之外,最有特色的就是可以使用时间线。

以下是改动DockBar js文件中用于隐藏Bar的代码:


_hideDock: function (){
this._timeline = new Clutter.Timeline({ duration: 200 });
this._timeline.start();
this._timeline.connect('new-frame', Lang.bind(this,
function(timeline, frame) {
this._onHideNewFrame(frame);
}));
hideDock=true;
},
_onHideNewFrame : function(frame) {
let monitor = global.get_primary_monitor();
this._time = this._timeline.get_elapsed_time();
this.bin.set_position ((-this.actor.width)*(this._time/200)+1,monitor.height*0.122);
},


3 附录

关于clutter导入细节以及C到js的Clutter方法查询参考。

3.1 lib导入到Gjs(Clutter-1.0 version)

两条路径:

.typelib path:/usr/lib/girepository-1.0/

.gir path:/usr/share/gir-1.0/

GI(GObject Introspection)可以将API的信息描述成XML,再parse成typelib格式,即binary格式,方便runtime时使用。正是通过这一过程,GI使得基于GObject的native lib能轻易porting到script language。

3.2 GNOME 库被 GI 化

现在,GNOME 桌面的大部分程序库皆已 GI 化,通常可在 /usr/lib/girepository-1.0 目录中看到它们,只要在该目录中的出现的 typelib 文件,其对应的库便可在 gjs 通过 imports.gi 对象进行连接。如想查询API在js中使用的方法,可以使用command:

[alex@alex girepository-1.0]$ g-ir-generate Clutter-1.0.typelib | grep timeline

或者 可以从/usr/share/gir-1.0/对应的.gir文件查询C函数原型信息。


网络工程师入门/底层通讯原理

网络工程师是通过学习和训练,掌握网络技术的理论知识和操作技能的网络技术人员。网络工程师能够从事计算机信息系统的设计、建设、运行和维护工作。
  • 2018年03月21日 17:19

Yocto 项目快速入门

欢迎欢迎来到Yocto项目!Yocto项目是一个开源协作项目,其重点是嵌入式Linux系统的开发人员。其中,Yocto项目的构建主机基于OpenEmbedded(OE)项目,使用BitBake工具构建...
  • u014787262
  • u014787262
  • 2017-01-11 08:56:38
  • 5985

深度学习大神都推荐入门必须读完

Introduction        卷积神经网络CNN,虽然它听起来就像是生物学、数学和计算机的奇怪混杂产物,但在近些年的机器视觉领域,它是最具影响力的创新结果。随着Alex Krizhevsky...
  • braverex
  • braverex
  • 2018-02-23 10:05:09
  • 365

深度学习入门(上)-第一章 必备基础知识点

1.深度学习与人工智能简介 大数据时代造就了人工智能的发展,人工智能的时代已经来临。数据规模越大,深度学习算法越好。深度学习有诸多应用,如诉说图片故事,自动驾驶等等。 2.CV面临的挑战与常规...
  • sunshinezhihuo
  • sunshinezhihuo
  • 2018-02-10 18:20:46
  • 78

Arduion基础教程之基本函数

数字IO口相关函数 函数名 参数 描述 pinMode(pin, mode) pin参数代表要配置的引脚;mode参数表示设置的模式,INPUT(输入)或OUTPU...
  • qq_33371343
  • qq_33371343
  • 2017-06-23 20:47:21
  • 444

GStreamer基础教程15——继承Clutter

Clutter是一个开源的库,用来创建快速、可移植和动态的GUI。GStreamer可以通过cluttersink这个element把clutter集成进来,允许视频像纹理一样使用。...
  • sakulafly
  • sakulafly
  • 2014-03-24 13:16:00
  • 2588

深度学习大神都推荐入门必须读完这9篇论文

大数据挖掘DT数据分析  公众号: datadwIntroduction        卷积神经网络CNN,虽然它听起来就像是生物学、数学和计算机的奇怪混杂产物,但在近些年的机器视觉领域,它是最具影响...
  • Candy_GL
  • Candy_GL
  • 2018-02-23 19:31:39
  • 168

Clutter为设备和开发增加了新酷元素

前年8月,Intel收购了OpenedHand,而该公司的Clutter改善了最终用户体验和开发人员体验。Clutter是一个用C语言编写的开源库,它允许用户在三维空间中处理二维图像。对开发人员来说,...
  • txgc1009
  • txgc1009
  • 2011-10-10 13:38:15
  • 709

GStreamer基础教程01——Hello World

原文链接: ​http://blog.csdn.net/sakulafly/article/details/19398257 ​ 目标  对于一个软件库来说,没有比在屏幕上打印出Hel...
  • fireroll
  • fireroll
  • 2016-05-25 13:52:08
  • 648

《大话存储2:存储系统架构与底层原理极限剖析》下载

  • 2013年08月16日 23:59
  • 70KB
  • 下载
收藏助手
不良信息举报
您举报文章:Clutter调用底层原理剖析
举报原因:
原因补充:

(最多只允许输入30个字)