Last week was the fifth edition of the GNOME+Rust hackfest. What about talking a bit about what happened there?
The goals of this edition were:
It has been asked a certain amount of time so I decided that I'd take this hackfest opportunity to finally write it down. This is a nice introduction on how to generate your own GObject-based crate from the
.gir files. I covered the basics and a bit more, however, I didn't cover errors much. Maybe for a next tutorial? I'll first wait to get some feedbacks to check what people got struggles with.
The cairo crate is a bit "special" in the gtk-rs environment: it's the only not automatically generated. Because of this, it stands out a bit on a few points, the API notably. We started talking about it, if you want to join the discussions:
Please feel free to do so!
We're a bit lacking behind on this part: gtk-rs crates are still using the 2015 syntax. We intend to update all of our crates soon and we actually already started by updating gir to the 2018 syntax (we had to start somewhere after all!). The pull request is here for the curious ones.
We first intended to make a new gtk-rs release soon after the last one, but then we implemented a lot of new features. Therefore, it needs to be tested and checked before we can release them. We still intend to make a new release in the next two months. More to come soon!
We found two bugs in gir during this hackfest:
When multiple callbacks are generated for one
user data pointer, we were generating invalid code. Currently, when we have a C function with callbacks, we pass our callbacks (the closures provided by the user) inside that
user_data parameter (it's a
*mut c_void after all!). So a function like this (a bit simplified):
void gcab_cabinet_extract( GCab *gcab, const char *path, FileCallback file_callback, ProgressCallback progress_callback, void *user_data, Cancellable cancellable, Error *error);
Generates a function like this:
fn extract<P: IsA<gio::File>, Q: IsA<gio::Cancellable>>( &self, path: Option<&P>, file_callback: Option<&mut dyn (FnMut(&File) -> bool)>, progress_callback: Option<&mut dyn (FnMut(i64, i64))>, cancellable: Option<&Q>, ) -> Result<(), Error>;
progress_callback are callbacks and need to be passed through one
user_data so we can call them inside the C callbacks. In short, a few changes were required so that the lifetime and everything alongside were correctly generated.
In some cases, some objects which are not supposed to be subclassed (meaning, not supposed to be used as parent) got trait implementation such as
impl<O: IsA<Button>> ButtonExt for O, making it possible to "inherit" from them. Thanks to this pull request, it's now fixed!
And the final thanks go to @Zeeshan for organizing this hackfest at the last minute!