Clutter学习(三):在GTK容器中加入Clutter容器——Stage Widget小例子

  参看资料: http://www.openismus.com/documents/clutter_tutorial/0.9/docs/tutorial/html/sec-stage-widget.html

  这次我们需要使用Clutter-gtk的开发包。简单的编译如下。请注意pkg-config的引号,不是单引号['],而是[`]。^_^,不要弄错。

gcc -Wall -g example.c -o example `pkg-config clutter-1.0 clutter-gtk-0.10 --cflags --libs`

   源文件为staget_widget.c,我们直接在上次Makefile中增加相关脚本,如下,增加部分使用其他颜色。我们使Makefile更适合具有多个*.c文件的项目,只要我们在OBJ2那里增加我们所需参与编译的文件名即可。我们在这里增加使用了cluter-gtk-0.10的开发包,需要加入相关的头文件路径和lib,利用pkg-config的方式加入。

CC = gcc
#
-Wall表示输出所有警告消息,-g表示编译为debug版本,-O表示编译时进行优化。
CFLAGS += -Wall -g `pkg-config clutter-1.0 clutter-gtk-0.10  --cflags `

LIBS += -Wall -g `pkg-config clutter-1.0 clutter-gtk-0.10 --libs`

TARGET  = stage
OBJ2    = stage_widget.o
TARGET2 = stage_widget

#在Makefile中,$<:依赖文件列表中的第一个依赖文件
#在Makefile中,$@:当前规则下的目标文件列表
%o : %c
        $(CC) $(CFLAGS) -c $< -o $@


stage:
        gcc -Wall -g stage.c -o stage  `pkg-config clutter-1.0 --cflags  --libs`

stage_widget: $(OBJ2)
        $(CC) $(LIBS) -o $(TARGET2) $(OBJ2) 


all:    stage stage_widget

clean:
        rm  $(TARGET) $(TARGET2) *.o

  GtkClutterEmbed小部件(widget)『我觉得widget比之gadget更为滥用,这里请不要和互联网的widget小应用混淆,在图像界面开发中,这里指的就是widget的本质』允许将一个ClutterStage加入一个GTK+的window中。在这个GTK+窗口中的其他GTK小部件是可以和这个clutter小部件进行互动的。

  下面学习这个小例子,他的很多代码以及clutter本身的callback都出现在上一个clutter stage的例子中。

#include <clutter/clutter.h>
#include <clutter-gtk/clutter-gtk.h>
#include <stdlib.h>

ClutterActor * stage = NULL;

/* 这是上次stage的callback函数,给出鼠标点击的坐标位置,我们在这里省略,避免代码太多 */
static gboolean on_stage_button_press (ClutterStage *stage,ClutterEvent *event, gpointer user_data)
{
      … …
}

/* 这是按键后的处理,当GTK+的按钮触发后,改变clutter stage的颜色。可快速略过。*/
static gboolean on_button_clicked(GtkButton * button, gpointer user_data)
{
        static gboolean already_changed = FALSE;
        if(already_changed) {
                ClutterColor stage_color ={0x00,0x00,0x00,0xff};
                clutter_stage_set_color(CLUTTER_STAGE(stage),&stage_color);
        }else {
                ClutterColor stage_color ={0x20,0x20,0xA0,0xff};
                clutter_stage_set_color(CLUTTER_STAGE(stage),&stage_color);
        }

        already_changed = ! already_changed;
        return TRUE;
}

int main(int argc, char * argv[])
{
        ClutterColor stage_color ={0x00,0x00,0x00,0xff};

        /* 这个小程序,允许Clutter和GTK共同使用,将使用到clutter-gtk的资源
         * 因此在初始化中和纯Clutter有差异,它包含gtk_init  */

        gtk_clutter_init(&argc,&argv);

        /* Create the window and some child widgets: */
        /** 创建一个窗口, 顺带学习一下GTK,事实证明走路一定要会爬。
         * 先创建一个window容器,让后创造一个vbox的子容器,可以在里面竖直摆放按钮等小部件,也可以摆放clutter小部件*/

        GtkWidget * window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        /** 创建一个可以竖直存放子部件的容器
GtkBox : vbox,将其放入GTK窗口,并置为可视模式*/
        GtkWidget * vbox   = gtk_vbox_new(FALSE,6);
        gtk_container_add(GTK_CONTAINER(window),vbox);
        gtk_widget_show(vbox);
       
/** 创建一个GTK的button,加在vbox的最下端,并置为可视模式,同时加上按键触发回调函数 */
        GtkWidget *button = gtk_button_new_with_label("改变颜色");
        gtk_box_pack_end(GTK_BOX(vbox),button,FALSE,FALSE,0);
        gtk_widget_show(button);
        g_signal_connect(button,"clicked",G_CALLBACK(on_button_clicked),NULL);
        /* 注意窗口的这个回调函数,如果没有这个函数,我们在关闭窗口的时候,程序并没有退出。*/
        g_signal_connect(window,"hide",G_CALLBACK(gtk_main_quit),NULL);

        /** Clutter widget终于来了
         * 生成一个可以在GTK加载的clutter小部件,并放入GTK的容器vbox中,置为可视模式,同时设置小部件的大小 */

        GtkWidget *clutter_widget = gtk_clutter_embed_new ();
        gtk_box_pack_start(GTK_BOX(vbox),clutter_widget,TRUE,TRUE,0);
        gtk_widget_show(clutter_widget);
        gtk_widget_set_size_request(clutter_widget,200,200);
        /** 对于所有的Clutter,我们都应该至少有一个ClutterStage(从ClutterAction中衍生),
         * 这个例子从加入GTK的小部件GtkClutterEmbed中获取,剩下的操作在上个stage例子中都出现过 */
        stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED(clutter_widget));
        clutter_stage_set_color(CLUTTER_STAGE(stage),&stage_color);
       
        g_signal_connect(stage,"button-press-event", G_CALLBACK(on_stage_button_press),NULL);

        gtk_widget_show(GTK_WIDGET(window));

        clutter_actor_show(stage);

       /* 主窗口是GTK窗口,使用GKT的主循环来代替Clutter的主循环,Start the main loop, so we can respond to events: */
        gtk_main();

        return EXIT_SUCCESS;
}

在moblin机器上运行的一些问题:

  如果在mobiln的机器上运行,请注意gtk_widget_show(window)和clutter_actor_show(stage)的顺序 ,必须将gtk_widget_show(window)放置在前面。否者程序不稳定,容易引起死机。我们没有查到资料有要求这两者的顺序,而且在desktop上是没有这个顺序要求的。是个奇怪的现象,在开发的时候要特别注意。

   另外在moblin中会报告:

do_wait: drmWaitVBlank returned -1, IRQs don't seem to be working correctly.
Try adjusting the vblank_mode configuration parameter.

   我们试图修复这个问题, 通过设定vblank_mode也无法消除, 其实这个问题没有造成什么影响,只是报错看起来很不顺眼,这可能和moblin整合clutter UI有关系(怀疑ing)。过程记录如下:

安装driconf的rpm包, dirconf文件如下:

<driconf>
    <device screen="0" driver="i915">
        <application name="Default">
            <option name="force_s3tc_enable" value="false" />
            <option name="no_rast" value="false" />
            <option name="fthrottle_mode" value="2" />
            <option name="always_flush_cache" value="false" />
            <option name="always_flush_batch" value="false" />
            <option name="bo_reuse" value="1" />
            <option name="vblank_mode" value="0" />
            <option name="allow_large_textures" value="2" />
        </application>
    </device>
</driconf>
将vblank_mode分别设为0,1,2,3,分别重启试过,一样报告错误:
do_wait: drmWaitVBlank returned -1, IRQs don't seem to be working correctly.
Try adjusting the vblank_mode configuration parameter.

相关链接:
我的Clutter相关博客

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值