On 08/06/2013 01:01 AM, andrea9940 wrote:

> Hi, I'm working with the X11 library available from
> https://github.com/D-Programming-Deimos/libX11
> If I try to call XSynchronize(display, True) the compilation fails with
> "Error: function deimos.X11.Xlib.XSynchronize (_XDisplay*) is not
> callable using argument types (_XDisplay*, int)"
>
> I am sure the arguments are correct (see http://goo.gl/8Hzn8s for
> example) so I think there is a conversion problem between the C and D
> definition of the function:
>
> --- Xlib.h
> extern int (*XSynchronize(
>      Display*        /* display */,
>      Bool        /* onoff */
> ))(
>      Display*        /* display */
> );

I have written the following stubs for C:

typedef void Display;
typedef int Bool;

extern int (*XSynchronize(
    Display*        /* display */,
    Bool        /* onoff */
))(
    Display*        /* display */
);

typedef int(*PreviousAfterFunction)(Display*);

int previous_after_foo(Display* display)
{
    return 0;
}

PreviousAfterFunction XSynchronize(Display* display, Bool onoff)
{
    return &previous_after_foo;
}

int main()
{
    int (*paf)(Display*) = XSynchronize(0, 1);
    paf(0);
}

And then I have written the direct translation in D, which works as well:

struct Display
{}

alias PreviousAfterFunction = int function(Display*);

int previousAfterFoo(Display *)
{
    return 0;
}

PreviousAfterFunction XSynchronize(Display*, bool)
{
    return &previousAfterFoo;
}

void main()
{
    PreviousAfterFunction paf = XSynchronize(null, 1);
    paf(null);
}

> --- Xlib.d
> extern int function(
>      Display*            /* display */,
>      Bool                /* onoff */
> )XSynchronize(
>      Display*            /* display */
> );

It looks like Xlib.d got it backwards: XSynchronize takes two parameters and returns a function pointer that takes a single parameter. It should be the following:

int function(Display*) XSynchronize(Display*, bool);

> Also I can't understand why the C version is not "extern int
> XSynchronize(Display*,
>      Bool);" which would be the simplest definition.

That's different. That would be a function taking two parameters and returning int. However, XSynchronize takes two parameters and return a function pointer (that takes one parameter and returns an int).

Ali

Reply via email to