Actually, after testing this, it gives no errors or warnings, but it's not 
doing what I expect.  My on_paint method is never called, and in fact the 
Clutter::Actor::on_paint method is never called.  My constructor is only called 
once to create the type:

 3 MainGridActor::MainGridActor() : Glib::ObjectBase("MainGridActor"), 
padding(10)
 4 {
 5     std::cout << "In MainGridActor constructor.";
 6 }
I don't know how the object is constructed out of the script, but it seems the 
C types are constructed correctly (it works if I subclass ClutterRectangle 
because its paint method is implemented in C).  If the on_paint is a C++ method 
only, then it's not being called.

Brian

On Feb 26, 2011, at 9:51 PM, Brian Gregg wrote:

>> 
>>>  // Get the stage by name, casting it to the correct C++-type.
>>>  const Glib::RefPtr<Clutter::Stage> stage =
>>>    Glib::RefPtr<Clutter::Stage>::cast_static(script->get_object("stage"));
>> 
>> A cast_dyanmic<>, with an if() check, would be generally safer. That's
>> what we generally use with Gtk::Builder::get_widget() too.
> 
> I believe Glib::wrap does a cast_dynamic, I was using that instead to wrap 
> the C types after they come out of the script.  Here's what I've got working:
> 
>  66 int main(int argc, char** argv)
>  67 {
>  68   try
>  69   {
>  70     Clutter::init(&argc, &argv);
>  71 
>  72     // This is needed on OS X to make fonts appear correctly
>  73     clutter_set_font_flags(CLUTTER_FONT_HINTING);
>  74 
>  75     Glib::RefPtr<Clutter::Stage> stage = Clutter::Stage::get_default();
>  76     stage->set_size(1024, 768);
>  77 
>  78     // Call this to instantiate the MainGridActor custom type
>  79     MainGridActor::create();
>  80 
>  81     ClutterScript *script = clutter_script_new();
>  82     clutter_script_load_from_file(script, "GameActor.js", NULL);
>  83 
>  84     Glib::RefPtr<NavManager> navManager = NavManager::create(stage);
>  85 
>  86     ClutterRectangle *rect = 
> CLUTTER_RECTANGLE(clutter_script_get_object(script, "active_rect"));
>  87     ClutterAnimation *anim = clutter_actor_animate(CLUTTER_ACTOR(rect), 
> Clutter::EASE_IN_OUT_CUBIC, 600,
>  88                     "x", 540.0, "y", 284.0, NULL);
>  89 
>  90     // Need to do this in C API since Clutter::Box is not a Clutter::Actor
>  91     ClutterBox *box = CLUTTER_BOX(clutter_script_get_object(script, 
> "game_box"));
>  92     clutter_container_add_actor(CLUTTER_CONTAINER(stage->gobj()), 
> CLUTTER_ACTOR(box));
>  93 
>  94     stage->show();
>  95 
>  96     // Start the main loop, so we can respond to events:
>  97     Clutter::main();
>  98   }
>  99   catch (const Glib::Error& error)
> 100   {
> 101     std::cerr << "Exception: " << error.what() << std::endl;
> 102     return 1;
> 103   }
> 104 
> 105   return 0;
> 106 }
> And my script file:
> 
>  2     {
>   3         "id"    : "game_box",
>   4         "type"  : "ClutterBox",
>   5         "width" : 1024,
>   6         "height": 768,
>   7         "layout-manager": {
>   8             "type"  : "ClutterFixedLayout"
>   9         },
>  10         "children"  : [
>  11             
> ...
> {
>  46                 "type"  : "gtkmm__CustomObject_MainGridActor",
>  47                 "x"     : 340,
>  48                 "y"     : 84,
>  49                 "width" : 600,
>  50                 "height": 600
>  51             },
> You notice in my main.cpp file that I used mostly the C API to get what I 
> wanted from the script.  I tried to use cluttermm objects first, but this 
> would often not work as expected.
> 
> Brian
> 

_______________________________________________
gtkmm-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/gtkmm-list

Reply via email to