Cluttermm progrmming

Clutter這是一個相當不錯的open source project。
在第一次看到是在jserv的blog,之後就相當喜愛。
只可惜一直沒機會把玩一番。

一次的偶然之中,朋友希望能用C++ binding for clutter設計一些東西,
雖然計劃最後告吹(被打),但為了不讓那一陣子的努力化為烏有,
覺得還是可以分享一些東西,也做一個小記錄。

C++ binding clutter就稱為cluttermm。可以在這裡下載得到。
自己懶得包deb了,所以不會tarball安裝的...請參考鳥哥的Linux私房菜吧(煙)

stage算是clutter的最主要的部份之一。
每一個clutter的程式,最少都包含了一個stage。

stage範例如下:

  1. #include <cluttermm.h>

  2. int main(int argc, char *argv[])
  3. {
  4. Clutter::init(&argc, &argv);

  5. Clutter::Color color(0x61, 0x64, 0x8c, 0xff);

  6. Glib::RefPtr<Clutter::Stage> stage = Clutter::Stage::get_default();
  7. stage->set_size(200, 200);
  8. stage->set_color(color);
  9. stage->show();

  10. Clutter::main();

  11. return 0;
  12. }
這範例算得上是hello world級的程式囉。
第9行宣告並建立一個stage的Clutter:Stage的物件後,
就利用set_size, set_color及show等成員函式,設定屬性。
最後由Clutter::main()執行。

有了stage,總得對Clutter的signal做一個介紹

  1. #include <cluttermm.h>
  2. #include <iostream>

  3. bool on_button_press(Clutter::ButtonEvent *event, const Glib::RefPtr<Clutter::Stage>& stage)
  4. {
  5. Glib::RefPtr<Clutter::Actor> e = stage->get_actor_at_pos(event->x, event->y);

  6. std::cout << "*** (x, y) = ( " << event->x << ", " << event->y << ")" << std::endl;

  7. return true;

  8. }

  9. bool on_key_release(Clutter::KeyEvent *event)
  10. {
  11. std::cout << "*** key press event (key:" << Clutter::key_event_symbol(event) << ") ***\n";

  12. if(Clutter::key_event_symbol(event) == CLUTTER_q)
  13. Clutter::main_quit();

  14. return false;

  15. }

  16. int main(int argc, char *argv[])
  17. {
  18. Clutter::init(&argc, &argv);

  19. Clutter::Color color(0x61, 0x64, 0x8c, 0xff);

  20. Glib::RefPtr<Clutter::Stage> stage = Clutter::Stage::get_default();
  21. stage->set_size(200, 200);
  22. stage->set_color(color);
  23. stage->signal_button_press_event().connect(sigc::bind(sigc::ptr_fun(on_button_press), stage));
  24. stage->signal_key_release_event().connect(sigc::ptr_fun(on_key_release));
  25. stage->show();

  26. Clutter::main();

  27. return 0;
  28. }

signal這範例,是由stage範例延伸而來的。(紅色為新增之部份)
主要就是註冊了二個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.
僅以label做為範例介紹(被拖走):

  1. #include <cluttermm.h>
  2. #include <iostream>

  3. bool on_button_press(Clutter::ButtonEvent *event, const Glib::RefPtr<Clutter::Label>& label)
  4. {
  5. int x;
  6. int y;
  7. label->get_position(x, y);
  8. label->set_position(x+2, y+2);

  9. return true;
  10. }

  11. bool on_button_release(Clutter::ButtonEvent *event, const Glib::RefPtr<Clutter::Label>& label)
  12. {
  13. int x;
  14. int y;
  15. label->get_position(x, y);
  16. label->set_position(x-2, y-2);

  17. return true;
  18. }

  19. bool on_key_release(Clutter::KeyEvent *event)
  20. {
  21. std::cout << "*** key press event (key:" << Clutter::key_event_symbol(event) << ") ***\n";

  22. if(Clutter::key_event_symbol(event) == CLUTTER_q)
  23. Clutter::main_quit();

  24. return false;

  25. }

  26. int main(int argc, char *argv[])
  27. {
  28. Clutter::init(&argc, &argv);

  29. Clutter::Color color(0x61, 0x64, 0x8c, 0xff);
  30. Clutter::Color actor(0xFF, 0xBB, 0xAA, 0xff);

  31. Glib::RefPtr<Clutter::Stage> stage = Clutter::Stage::get_default();
  32. Glib::RefPtr<Clutter::Label> label = Clutter::Label::create("Sans 12", "test", actor);
  33. stage->set_size(200, 200);
  34. stage->set_color(color);
  35. stage->signal_button_press_event().connect(sigc::bind(sigc::ptr_fun(on_button_press), label));
  36. stage->signal_button_release_event().connect(sigc::bind(sigc::ptr_fun(on_button_release), label));
  37. stage->signal_key_release_event().connect(sigc::ptr_fun(on_key_release));
  38. stage->show();

  39. label->set_size(40, 40);
  40. label->set_position(20, 20);
  41. label->show();

  42. stage->add_actor(label);

  43. Clutter::main();

  44. return 0;
  45. }
這個範例效果相當地簡單,在stage中按下了滑鼠左鍵後,會將字型做一平移,
等到滑鼠左鍵被放開,就恢復原狀。

當actor產生後,總是要有stage才能有其用處,所以
Clutter利用add_actor()將actor的物件,加入stage之中。


0 意見: