Re: [Vala] all available ccodes
- From: Frederik <scumm_fredo gmx net>
- To: vala-list <vala-list gnome org>
- Subject: Re: [Vala] all available ccodes
- Date: Sun, 08 Nov 2009 15:47:19 +0100
aaron andersen wrote:
Is there a list of all the available tags for the vala parser? Like
[array_length], [array_null_terminated], [NoArrayLength], etc...
Unfortunately, there is no such list. [NoArrayLength] is deprecated in favor
of [CCode (array_length=false)].
I'm trying to figure out how to get the function SDL_ListModes to bind
properly but am at a bit of a loss.
struct SDL_Rect is defined in the vapi as a struct (Rect) and
SDL_ListModes returns a null terminated array of pointers to SDL_Rect
structs...
SDL_Rect **modes = SDL_ListModes(params...);
int i = 0;
while ((SDL_Rect *iterator = modes[i]) != NULL) {
i++
}
Given that the current bindings for SDL just returns a void * I'm not
even sure this is possible with vala?
Any help greatly appreciated!
This is the correct binding:
[CCode (cname="SDL_ListModes", array_length=false, array_null_terminated=true)]
public static unowned Rect*[]? list_modes(PixelFormat? format, uint32 flags);
Explanation:
http://sdl.beuc.net/sdl.wiki/SDL_ListModes
"Return Value: The pointer to the array of SDL_Rect
On success. The pointer to the video dimensions array is managed by SDL
itself. The caller must not free the returned pointer."
* The last sentence means 'unowned'
* '[]' because it is an array
* '?' because it can return 'null'
* The function doesn't have a length out parameter, this means no array length
* The code example 'for (i=0; modes[i]; ++i)' indicates that it is 'null'
terminated instead
Unfortunately, the returned array is somewhat odd because it is an array of
pointers to structs instead of a simple array of structs. Vala expects that
only for arrays of heap-allocated objects but not for struct arrays. That's
why you need to add a '*' and have to access the 'w' and 'h' fields of the
'Rect's with '->' in this example program:
----------------------------------------------------------------------------
using SDL;
int main () {
SDL.init (InitFlag.VIDEO);
var modes = Video.list_modes (null, SurfaceFlag.FULLSCREEN
| SurfaceFlag.HWSURFACE);
if (modes == null) {
stderr.printf ("No modes available!\n");
return 1;
}
if ((int) modes == -1) {
stderr.printf ("All resolutions available.\n");
return 1;
}
foreach (var mode in modes) {
stdout.printf ("%d x %d\n", mode->w, mode->h);
}
SDL.quit ();
return 0;
}
----------------------------------------------------------------------------
Best regards,
Frederik
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]