Clutter 不支持多线程
看这个简单的例子:
#include <clutter/clutter.h> static gpointer gen_slide (gpointer data) { return clutter_cairo_texture_new (800.0, 600.0); } static gboolean on_stage_button_press (ClutterActor *stage, ClutterEvent *event, gpointer data) { g_thread_new ("test", gen_slide, NULL); return TRUE; } int main(int argc, char *argv[]) { if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS) return 1; ClutterColor stage_color = { 0x21, 0x43, 0x5e, 0xff }; ClutterActor *stage = clutter_stage_get_default (); clutter_stage_set_title (CLUTTER_STAGE (stage), "CairoTexture!"); clutter_actor_set_size (stage, 400, 400); clutter_stage_set_color (CLUTTER_STAGE (stage), &stage_color); clutter_stage_set_user_resizable (CLUTTER_STAGE (stage), TRUE); clutter_actor_show_all (stage); g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL); g_signal_connect (stage, "button-press-event", G_CALLBACK (on_stage_button_press), NULL); clutter_main (); return 0; }
编译它:
gcc `pkg-config --cflags --libs clutter-1.0` test.c
这个程序需要 >=glib-2.32 版本的支持。运行程序时,鼠标点一下窗口内部区域,在我这里程序便会崩溃。不知是不是只有我遇到这个问题。
这样子,Cikada 就没法实现单独加载 pdf 页面的线程了。
DIY 一个用于显示 PDF 页面的 Clutter Actor
最近打算基于 Clutter 做一个 PDF 文档的演示工具,首先要解决在 Clutter 场景中渲染 PDF 页面的问题。可以通过 Poppler 库将 PDF 页面转换为 Cairo 图形,进而利用 Clutter 的 CairoTexture Actor 进行 Cairo 图形渲染解决这一问题 [1]。本文将上述过程中的一些细节(例如尺寸与位置的控制)封装为一个便于使用的 Clutter Actor。
Clutter Actor 的位置与尺寸约束
为了更好的解决 Actor 之间的相对定位问题,Clutter 提供了位置与尺寸约束的机制。例如对于 "stage" 和 "rectangle" 这两个 Actor 而言,可以通过位置约束,使得 "rectangle" 居于 "stage" 中心的位置,而无论 "stage" 的尺寸如何变化。Clutter 提供了 Align、Bind、Path 和 Snap 四种约束,也可以按照 [1] 自定义约束。文献 [2] 中已经给出了 Bind 约束与 Align 约束的示例,揭示了 Clutter 位置与尺寸约束功能的基本用法。本文主要讲述如何将 Clutter 的位置与尺寸约束通过 JSON 文本的形式记载于 Clutter 场景图中。
Clutter 的脚本
Clutter 提供了 JSON 格式的脚本机制,以便程序员或用户能够灵活定制场景图。本文通过对 [1] 中的的单一布局的示例基于 Clutter 脚本的形式进行改写,聊表 Clutter 脚本功能的基本用法。
Clutter 布局管理
[1] 中的各个 Actor 在 Stage 中的定位都是硬编码的方式实现的,当 Stage 的尺寸发生变化时,这些 Actor 的位置通常难以进行适应调整。Clutter 提供了布局管理机制,用来实现 Actor 的尺寸与位置控制。
Clutter (1.7.4)提供了五种布局方式:
- 固定布局(ClutterFixedLayout):跟 Actor 硬编码定位没有太多区别,通常不使用它;
- 单一布局(ClutterBinLayout):将 Actor 叠放成一摞,通常可用于将多个 Actor 复合在一起;
- 流布局(ClutterFlowLayout):当你不知道有多少个 Actor 的时候,并且又想让它们按照水平方向或竖直方向均匀排列,那么就可以使用流布局;
- 盒子布局(ClutterBoxLayout):将 Actor 单行水平或竖直均匀排列;
- 表格布局(ClutterTableLayout):将 Actor 按表格的方式均匀排列。
本文只介绍单一布局与流布局,其他布局方式与这两种布局大同小异。
在 Clutter 场景中显示 PDF 页面
之所以开始学习 Clutter 主要是因为 Pinpoint [1] 引起了一些兴趣,用 Clutter 来制作 PDF 文档的演示工具,效果应该会很好。对 Clutter 的一些基本的 Actor 有所了解之后,发现要实现这个 PDF 演示工具不是很困难。按照 Clutter cookbook [2] 的提示,可以利用 Poppler 库轻易的载入 PDF 页面并将其渲染到 Cairo 环境中,继而使用 ClutterCairoTexture 将 PDF 页面显示在 Stage 中。
五个演员
这篇文章的标题并非暗示我要写一篇影视娱乐方面的文章,它只是表示我将“Actor”这个英文单词翻译成了中文。本文主要介绍 Clutter 库提供的五个基本的 Actor 的用法。
凌乱的舞台
这篇文章的标题并非暗示我要写一篇文学作品,它只是表示我将“Clutter”与“Stage”这两个英文单词翻译成了中文。本文主要介绍 Clutter Stage 的基本知识。