#############################################################################
## Name:        XS/Display.xsp
## Purpose:     XS++ for Wx::Display
## Author:      Mattia Barbon
## Modified by:
## Created:     26/09/2007
## RCS-ID:      $Id: Display.xsp 2557 2009-05-11 10:41:11Z mbarbon $
## Copyright:   (c) 2007, 2009 Mattia Barbon
## Licence:     This program is free software; you can redistribute it and/or
##              modify it under the same terms as Perl itself
#############################################################################

%module{Wx};

#include <wx/vidmode.h>
#include <wx/display.h>

#define wxDefaultVideoModePtr (wxVideoMode*)&wxDefaultVideoMode

%typemap{wxDisplay*}{simple};
%typemap{wxVideoMode*}{simple};
%typemap{const wxVideoMode&}{reference};

%name{Wx::VideoMode} class wxVideoMode
{
    wxVideoMode( int width = 0, int height = 0, int depth = 0, int freq = 0 );

%{
static void
wxVideoMode::CLONE()
  CODE:
    wxPli_thread_sv_clone( aTHX_ CLASS, (wxPliCloneSV)wxPli_detach_object );
%}
    ## // thread OK
    ~wxVideoMode()
        %code%{  wxPli_thread_sv_unregister( aTHX_ "Wx::VideoMode", THIS, ST(0) );
                 delete THIS;
               %};

    bool Matches( const wxVideoMode& other ) const;
    int GetWidth() const;
    int GetHeight() const;
    int GetDepth() const;
    bool IsOk() const;
};

%name{Wx::Display} class wxDisplay
{
    wxDisplay( unsigned n = 0 );

%{
static void
wxDisplay::CLONE()
  CODE:
    wxPli_thread_sv_clone( aTHX_ CLASS, (wxPliCloneSV)wxPli_detach_object );
%}
    ## // thread OK
    ~wxDisplay()
        %code%{  wxPli_thread_sv_unregister( aTHX_ "Wx::Display", THIS, ST(0) );
                 delete THIS;
               %};

%{
int
GetCount()
  CODE:
    RETVAL = wxDisplay::GetCount();
  OUTPUT: RETVAL

int
GetFromPoint( point )
    wxPoint point
  CODE:
    RETVAL = wxDisplay::GetFromPoint( point );
  OUTPUT: RETVAL

#if WXPERL_W_VERSION_GE( 2, 7, 0 )

int
GetFromWindow( window )
    wxWindow* window
  CODE:
    RETVAL = wxDisplay::GetFromWindow( window );
  OUTPUT: RETVAL

#endif

%}

    bool IsOk() const;
    const wxRect& GetGeometry() const;
#if WXPERL_W_VERSION_GE( 2, 7, 2 )
    const wxRect& GetClientArea() const;
#endif
    wxString GetName() const;
    bool IsPrimary() const;

#if wxUSE_DISPLAY
%{
void
wxDisplay::GetModes( videoMode = wxDefaultVideoModePtr )
    wxVideoMode* videoMode
  PPCODE:
    wxArrayVideoModes modes = THIS->GetModes( *videoMode );
    size_t mx = modes.GetCount();
    EXTEND( SP, int(mx) );
    for( size_t i = 0; i < mx; ++i )
    {
        wxVideoMode* mode = new wxVideoMode( modes[i] );
        PUSHs( wxPli_non_object_2_sv( aTHX_ sv_newmortal(),
                                      mode, "Wx::VideoMode" ) );
    }
%}
    const wxVideoMode& GetCurrentMode() const;
    bool ChangeMode( const wxVideoMode& mode = wxDefaultVideoModePtr );
    void ResetMode();
#endif // wxUSE_DISPLAY
};
