The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#include "include/FLTK_pm.h"

SV * file_chooser_cb;

void _cb_f (const char * file) { // Callback for file_chooser
    dTHX;
    if ( ! SvOK( file_chooser_cb ) ) return;
    dSP;
    ENTER;
        SAVETMPS;
            PUSHMARK( sp );
    XPUSHs( newSVpv( file, strlen( file ) ) );
            PUTBACK;
    call_sv( file_chooser_cb, G_DISCARD );
        FREETMPS;
    LEAVE;
}

MODULE = FLTK::file_chooser               PACKAGE = FLTK::file_chooser

#ifndef DISABLE_FILE_CHOOSER

#include <fltk/file_chooser.h>

MODULE = FLTK::file_chooser               PACKAGE = FLTK

const char *
dir_chooser( char * message, char * directory, int relative = 0 )
    CODE:
        RETVAL = fltk::dir_chooser( message, directory, relative );
    OUTPUT:
        RETVAL


BOOT:
    export_tag("dir_chooser", "dialog");
    export_tag("dir_chooser", "default");

const char *
file_chooser( char * message, char * pattern, char * filename, int relative = 0 )
    CODE:
        RETVAL = fltk::file_chooser( message, pattern, filename, relative );
    OUTPUT:
        RETVAL

BOOT:
    export_tag("alert", "dialog");
    export_tag("alert", "default");

MODULE = FLTK::file_chooser               PACKAGE = FLTK::file_chooser

MODULE = FLTK::file_chooser               PACKAGE = FLTK

void
file_chooser_callback( CV * coderef )
    CODE:
        file_chooser_cb = newSVsv( ST( 0 ) );
        fltk::file_chooser_callback(_cb_f);

BOOT:
    export_tag("file_chooser_callback", "dialog");
    export_tag("file_chooser_callback", "default");

#endif // ifndef DISABLE_FILE_CHOOSER