Clutter這是一個相當不錯的open source project。
在第一次看到是在jserv的blog,之後就相當喜愛。
只可惜一直沒機會把玩一番。
一次的偶然之中,朋友希望能用C++ binding for clutter設計一些東西,
雖然計劃最後告吹(被打),但為了不讓那一陣子的努力化為烏有,
覺得還是可以分享一些東西,也做一個小記錄。
C++ binding clutter就稱為cluttermm。可以在這裡下載得到。
自己懶得包deb了,所以不會tarball安裝的...請參考鳥哥的Linux私房菜吧(煙)
stage算是clutter的最主要的部份之一。
每一個clutter的程式,最少都包含了一個stage。
stage範例如下:
- #include <cluttermm.h>
- int main(int argc, char *argv[])
- {
- Clutter::init(&argc, &argv);
- Clutter::Color color(0x61, 0x64, 0x8c, 0xff);
- Glib::RefPtr<Clutter::Stage> stage = Clutter::Stage::get_default();
- stage->set_size(200, 200);
- stage->set_color(color);
- stage->show();
- Clutter::main();
- return 0;
- }
第9行宣告並建立一個stage的Clutter:Stage的物件後,
就利用set_size, set_color及show等成員函式,設定屬性。
最後由Clutter::main()執行。
有了stage,總得對Clutter的signal做一個介紹
- #include <cluttermm.h>
- #include <iostream>
- bool on_button_press(Clutter::ButtonEvent *event, const Glib::RefPtr<Clutter::Stage>& stage)
- {
- Glib::RefPtr<Clutter::Actor> e = stage->get_actor_at_pos(event->x, event->y);
- std::cout << "*** (x, y) = ( " << event->x << ", " << event->y << ")" << std::endl;
- return true;
- }
- bool on_key_release(Clutter::KeyEvent *event)
- {
- std::cout << "*** key press event (key:" << Clutter::key_event_symbol(event) << ") ***\n";
- if(Clutter::key_event_symbol(event) == CLUTTER_q)
- Clutter::main_quit();
- return false;
- }
- int main(int argc, char *argv[])
- {
- Clutter::init(&argc, &argv);
- Clutter::Color color(0x61, 0x64, 0x8c, 0xff);
- Glib::RefPtr<Clutter::Stage> stage = Clutter::Stage::get_default();
- stage->set_size(200, 200);
- stage->set_color(color);
- stage->signal_button_press_event().connect(sigc::bind(sigc::ptr_fun(on_button_press), stage));
- stage->signal_key_release_event().connect(sigc::ptr_fun(on_key_release));
- stage->show();
- Clutter::main();
- return 0;
- }
主要就是註冊了二個event:button_press及key_release。
- button_press就是在stage中按下滑鼠的左鍵後,會被呼叫的動作
- key_release則是在鍵盤上按下任一按鍵,會被呼叫的動作

在介紹了stage及signal後,當然不能少了actor。
Clutter中,actor有著相當多的分類:
- - ClutterRectangle — An actor that displays a simple rectangle.
- - ClutterTexture — An actor for displaying and manipulating images.
- - ClutterCloneTexture — Actor for cloning existing textures in an efficient way.
- - ClutterLabel — Actor for displaying text
- - ClutterEntry — A single line text entry actor
- - ClutterGroup — Actor class containing multiple children. actors.
- - ClutterStage — Top level visual element to which actors are placed.
- #include <cluttermm.h>
- #include <iostream>
- bool on_button_press(Clutter::ButtonEvent *event, const Glib::RefPtr<Clutter::Label>& label)
- {
- int x;
- int y;
- label->get_position(x, y);
- label->set_position(x+2, y+2);
- return true;
- }
- bool on_button_release(Clutter::ButtonEvent *event, const Glib::RefPtr<Clutter::Label>& label)
- {
- int x;
- int y;
- label->get_position(x, y);
- label->set_position(x-2, y-2);
- return true;
- }
- bool on_key_release(Clutter::KeyEvent *event)
- {
- std::cout << "*** key press event (key:" << Clutter::key_event_symbol(event) << ") ***\n";
- if(Clutter::key_event_symbol(event) == CLUTTER_q)
- Clutter::main_quit();
- return false;
- }
- int main(int argc, char *argv[])
- {
- Clutter::init(&argc, &argv);
- Clutter::Color color(0x61, 0x64, 0x8c, 0xff);
- Clutter::Color actor(0xFF, 0xBB, 0xAA, 0xff);
- Glib::RefPtr<Clutter::Stage> stage = Clutter::Stage::get_default();
- Glib::RefPtr<Clutter::Label> label = Clutter::Label::create("Sans 12", "test", actor);
- stage->set_size(200, 200);
- stage->set_color(color);
- stage->signal_button_press_event().connect(sigc::bind(sigc::ptr_fun(on_button_press), label));
- stage->signal_button_release_event().connect(sigc::bind(sigc::ptr_fun(on_button_release), label));
- stage->signal_key_release_event().connect(sigc::ptr_fun(on_key_release));
- stage->show();
- label->set_size(40, 40);
- label->set_position(20, 20);
- label->show();
- stage->add_actor(label);
- Clutter::main();
- return 0;
- }
等到滑鼠左鍵被放開,就恢復原狀。
當actor產生後,總是要有stage才能有其用處,所以
Clutter利用add_actor()將actor的物件,加入stage之中。