I know this method, and I'm happy it's possible. And no, I don't have problem at all while coding, I just think that Vala shell support also other syntax. I just wish Vala could use some thing like this: another_object.my_signal.connect(user_data:my_method); I wasn't a real C developer in my past, but I think they would agree that Vala code generator shell call callbacks directly when possible, not via the generated lambda function. I know that there won't be an extra call at run time, if my_method be an internal method. I just think that if it possible to do it in other language, C practically, and it's not such a bad idea, doesn't conflict with Vala mechanics, so why not? Again, it's just a feature request, and I ask from developers and users to tell me if it would be great to have it in Vala. So what do you think?
From: alexandre.rosenf...@gmail.com Date: Mon, 10 Oct 2011 14:32:15 -0300 Subject: Re: [Vala] Passing user_data in signals is supported, but could be better. To: tal...@hotmail.com CC: vala-list@gnome.org I understand your problem, but you can still use lambdas. If you try to fool the compiler into taking a pointer as a user data, you end up with reference issues (what happens if no one uses the object but the signal handler?). The easiest solution is to use lambdas, so that Vala manages the references to objects for you automatically. And from the lambda you can call another method. For instance, check this non-working, out-of-my-head code: class A : Object { void my_method(int b) { printf("Got %d\n", b); } } int main(string[] args) { a = new A(); int i = 5; another_object.my_signal.connect(() => { a.my_method(i); }); } If you check the generated C code, you´ll see Vala created a reference-counted struct to hold a and i. This struct is automatically freed for you and it holds the a reference, so that when you free a in the main, the signal will keep working since it holds a reference to the data struct, which holds a reference to a. If you just use pointers to try and fool the compiler into accepting an object as user_data, you end up having to do this management yourself and many times it´s actually impossible to do it right. Alexandre Rosenfeld 2011/10/10 Tal Hadad <tal...@hotmail.com> Thanks for your answer Alexandre Rosenfeld, but you get me wrong. > Why not just use lambda? From the Gtk+ example: Yes I know I can do this. I point this out in my post: > 2. Variables outside the lambda expression. Some prefer using lambda, some prefer using traditional methods. Another quote I said: > Method 2 is done perfectly by Vala, when we talk about lambda expression. Some(I'm included) prefer to use traditional methods than lambda. It is easier to read, document, etc. Don't you think it's a good idea to allow passing user_data directly using traditional methods? The last sentence is the whole point of my post. From: alexandre.rosenf...@gmail.com Date: Mon, 10 Oct 2011 12:16:13 -0300 Subject: Re: [Vala] Passing user_data in signals is supported, but could be better. To: tal...@hotmail.com CC: vala-list@gnome.org Why not just use lambda? From the Gtk+ example: var button = new Button.with_label ("Click me!"); button.clicked.connect (() => { button.label = "Thank you"; this.my_data = 3; }); And you can have that my_data be anything you want, an instance member or a property in any other instance (doesnt have to be from this). Alexandre Rosenfeld 2011/10/10 Tal Hadad <tal...@hotmail.com> Vala does support passing a "context" argument, calling user_data to callbacks, by this two methods(source: FAQ and Tutorial): 1. Passing "this"/self as user_data, for instance method. 2. Variables outside the lambda expression. Method 2 is done perfectly by Vala, when we talk about lambda expression. But method 1 is not enough... Not always it's "this"/self what that needed to be passed. By now, two ways to overcome this, without using lambda: * The dirty trick: instance.event_name.connect (((instance_type*)user_data)->method); ... private void method ([args]) { user_data_type* user_data = this; // Perform action with user_data. } * Back to basic(using GLib.Signal namespace): Signal.connect (instance, "event_name", (GLib.Callback)method, user_data); ... private static void static_on_stop_clicked ([args], user_data_type user_data) { // Perform action with user_data. } Both works, but I think a proper syntax should be. I really like the instance.method way for passing callbacks, but it's valid only for "this"/self. So, perhaps, instance:method for static methods? What do you think? Shell Vala support this feature? Tal _______________________________________________ vala-list mailing list vala-list@gnome.org http://mail.gnome.org/mailman/listinfo/vala-list _______________________________________________ vala-list mailing list vala-list@gnome.org http://mail.gnome.org/mailman/listinfo/vala-list
_______________________________________________ vala-list mailing list vala-list@gnome.org http://mail.gnome.org/mailman/listinfo/vala-list