Applied patch for multiple file selection, documented.
Fixed some compilation warnings, Minor change to OpenGL code. Documented wxImageHandler::GetImageCount() and related. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4784 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -26,7 +26,7 @@ If path is ``", the current directory will be used. If filename is ``",
|
|||||||
no default filename will be supplied. The wildcard determines what files
|
no default filename will be supplied. The wildcard determines what files
|
||||||
are displayed in the file selector, and file extension supplies a type
|
are displayed in the file selector, and file extension supplies a type
|
||||||
extension for the required filename. Flags may be a combination of wxOPEN,
|
extension for the required filename. Flags may be a combination of wxOPEN,
|
||||||
wxSAVE, wxOVERWRITE\_PROMPT, wxHIDE\_READONLY, or 0.
|
wxSAVE, wxOVERWRITE\_PROMPT, wxHIDE\_READONLY, wxMULTIPLE or 0.
|
||||||
|
|
||||||
Both the X and Windows versions implement a wildcard filter. Typing a
|
Both the X and Windows versions implement a wildcard filter. Typing a
|
||||||
filename containing wildcards (*, ?) in the filename text item, and
|
filename containing wildcards (*, ?) in the filename text item, and
|
||||||
|
@@ -481,7 +481,7 @@ If path is empty, the current directory will be used. If filename is empty,
|
|||||||
no default filename will be supplied. The wildcard determines what files
|
no default filename will be supplied. The wildcard determines what files
|
||||||
are displayed in the file selector, and file extension supplies a type
|
are displayed in the file selector, and file extension supplies a type
|
||||||
extension for the required filename. Flags may be a combination of wxOPEN,
|
extension for the required filename. Flags may be a combination of wxOPEN,
|
||||||
wxSAVE, wxOVERWRITE\_PROMPT, wxHIDE\_READONLY, or 0.
|
wxSAVE, wxOVERWRITE\_PROMPT, wxHIDE\_READONLY, wxMULTIPLE or 0.
|
||||||
|
|
||||||
Both the Unix and Windows versions implement a wildcard filter. Typing a
|
Both the Unix and Windows versions implement a wildcard filter. Typing a
|
||||||
filename containing wildcards (*, ?) in the filename text item, and
|
filename containing wildcards (*, ?) in the filename text item, and
|
||||||
|
@@ -625,6 +625,20 @@ Gets the name of this handler.
|
|||||||
|
|
||||||
Gets the file extension associated with this handler.
|
Gets the file extension associated with this handler.
|
||||||
|
|
||||||
|
\membersection{wxImageHandler::GetImageCount}\label{wximagehandlergetimagecount}
|
||||||
|
|
||||||
|
\func{int}{GetImageCount}{\param{wxInputStream\&}{ stream}}
|
||||||
|
|
||||||
|
If the image file contains more than one image and the image handler is capable
|
||||||
|
of retrieving these individually, this function will return the number of
|
||||||
|
available images.
|
||||||
|
|
||||||
|
\docparam{stream}{Opened input stream for reading image file.}
|
||||||
|
|
||||||
|
\wxheading{Return value}
|
||||||
|
|
||||||
|
Number of available images. For most image handles, this defaults to 1.
|
||||||
|
|
||||||
\membersection{wxImageHandler::GetType}
|
\membersection{wxImageHandler::GetType}
|
||||||
|
|
||||||
\constfunc{long}{GetType}{\void}
|
\constfunc{long}{GetType}{\void}
|
||||||
@@ -639,16 +653,21 @@ Gets the MIME type associated with this handler.
|
|||||||
|
|
||||||
\membersection{wxImageHandler::LoadFile}\label{wximagehandlerloadfile}
|
\membersection{wxImageHandler::LoadFile}\label{wximagehandlerloadfile}
|
||||||
|
|
||||||
\func{bool}{LoadFile}{\param{wxImage* }{image}, \param{wxInputStream\&}{ stream}}
|
\func{bool}{LoadFile}{\param{wxImage* }{image}, \param{wxInputStream\&}{ stream}, \param{bool}{ verbose=TRUE}, \param{int}{ index=0}}
|
||||||
|
|
||||||
Loads a image from a stream, putting the resulting data into {\it image}.
|
Loads a image from a stream, putting the resulting data into {\it image}. If the image file contains
|
||||||
|
more than one image and the image handler is capable of retrieving these individually, {\it index}
|
||||||
|
indicates which image to read from the stream.
|
||||||
|
|
||||||
\wxheading{Parameters}
|
\wxheading{Parameters}
|
||||||
|
|
||||||
\docparam{image}{The image object which is to be affected by this operation.}
|
\docparam{image}{The image object which is to be affected by this operation.}
|
||||||
|
|
||||||
\docparam{stream}{Opened input stream.
|
\docparam{stream}{Opened input stream for reading images.}
|
||||||
The meaning of {\it stream} is determined by the {\it type} parameter.}
|
|
||||||
|
\docparam{verbose}{If set to TRUE, errors reported by the image handler will produce wxLogMessages.}
|
||||||
|
|
||||||
|
\docparam{index}{The index of the image in the file (starting from zero).}
|
||||||
|
|
||||||
\wxheading{Return value}
|
\wxheading{Return value}
|
||||||
|
|
||||||
@@ -670,7 +689,7 @@ Saves a image in the output stream.
|
|||||||
|
|
||||||
\docparam{image}{The image object which is to be affected by this operation.}
|
\docparam{image}{The image object which is to be affected by this operation.}
|
||||||
|
|
||||||
\docparam{stream}{A stream. The meaning of {\it stream} is determined by the {\it type} parameter.}
|
\docparam{stream}{An opened stream for writing images.}
|
||||||
|
|
||||||
\wxheading{Return value}
|
\wxheading{Return value}
|
||||||
|
|
||||||
|
@@ -154,7 +154,11 @@ public:
|
|||||||
wxString GetFilename() const { return m_fileName; }
|
wxString GetFilename() const { return m_fileName; }
|
||||||
wxString GetWildcard() const { return m_wildCard; }
|
wxString GetWildcard() const { return m_wildCard; }
|
||||||
long GetStyle() const { return m_dialogStyle; }
|
long GetStyle() const { return m_dialogStyle; }
|
||||||
int GetFilterIndex() const { return m_filterIndex ; }
|
int GetFilterIndex() const { return m_filterIndex; }
|
||||||
|
|
||||||
|
// for multiple file selection
|
||||||
|
void GetPaths(wxArrayString& paths) const;
|
||||||
|
void GetFilenames(wxArrayString& files) const;
|
||||||
|
|
||||||
void OnSelected( wxListEvent &event );
|
void OnSelected( wxListEvent &event );
|
||||||
void OnActivated( wxListEvent &event );
|
void OnActivated( wxListEvent &event );
|
||||||
@@ -195,7 +199,8 @@ enum
|
|||||||
wxSAVE = 2,
|
wxSAVE = 2,
|
||||||
wxOVERWRITE_PROMPT = 4,
|
wxOVERWRITE_PROMPT = 4,
|
||||||
wxHIDE_READONLY = 8,
|
wxHIDE_READONLY = 8,
|
||||||
wxFILE_MUST_EXIST = 16
|
wxFILE_MUST_EXIST = 16,
|
||||||
|
wxMULTIPLE = 32
|
||||||
};
|
};
|
||||||
|
|
||||||
// File selector - backward compatibility
|
// File selector - backward compatibility
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
; First, some wxWindows documentation files:
|
; First, some wxWindows documentation files:
|
||||||
;
|
;
|
||||||
0 wx.html ;wxWindows: Help index; additional keywords like overview
|
0 wx.html ;wxWindows: Help index; additional keywords like overview
|
||||||
1 wx34.htm#classref ; wxWindows Class References
|
1 wxwin.htm ; wxWindows Class References
|
||||||
2 wx204.htm#functions ; wxWindows Function References; methods
|
2 wx204.htm#functions ; wxWindows Function References; methods
|
||||||
;
|
;
|
||||||
; Some doc++ generated files:
|
; Some doc++ generated files:
|
||||||
|
@@ -574,6 +574,10 @@ wxFileDialog::wxFileDialog(wxWindow *parent,
|
|||||||
|
|
||||||
m_message = message;
|
m_message = message;
|
||||||
m_dialogStyle = style;
|
m_dialogStyle = style;
|
||||||
|
|
||||||
|
if ((m_dialogStyle & wxMULTIPLE ) && !(m_dialogStyle & wxOPEN))
|
||||||
|
m_dialogStyle &= ~wxMULTIPLE;
|
||||||
|
|
||||||
m_dir = defaultDir;
|
m_dir = defaultDir;
|
||||||
if (m_dir.IsEmpty())
|
if (m_dir.IsEmpty())
|
||||||
{
|
{
|
||||||
@@ -657,8 +661,12 @@ wxFileDialog::wxFileDialog(wxWindow *parent,
|
|||||||
staticsizer->Add( m_static, 1 );
|
staticsizer->Add( m_static, 1 );
|
||||||
mainsizer->Add( staticsizer, 0, wxEXPAND | wxLEFT|wxRIGHT|wxBOTTOM, 10 );
|
mainsizer->Add( staticsizer, 0, wxEXPAND | wxLEFT|wxRIGHT|wxBOTTOM, 10 );
|
||||||
|
|
||||||
m_list = new wxFileCtrl( this, ID_LIST_CTRL, m_dir, firstWild, wxDefaultPosition, wxSize(440,180),
|
if (m_dialogStyle & wxMULTIPLE)
|
||||||
wxLC_LIST | wxSUNKEN_BORDER | wxLC_SINGLE_SEL );
|
m_list = new wxFileCtrl( this, ID_LIST_CTRL, m_dir, firstWild, wxDefaultPosition,
|
||||||
|
wxSize(440,180), wxLC_LIST | wxSUNKEN_BORDER );
|
||||||
|
else
|
||||||
|
m_list = new wxFileCtrl( this, ID_LIST_CTRL, m_dir, firstWild, wxDefaultPosition,
|
||||||
|
wxSize(440,180), wxLC_LIST | wxSUNKEN_BORDER | wxLC_SINGLE_SEL );
|
||||||
mainsizer->Add( m_list, 1, wxEXPAND | wxLEFT|wxRIGHT, 10 );
|
mainsizer->Add( m_list, 1, wxEXPAND | wxLEFT|wxRIGHT, 10 );
|
||||||
|
|
||||||
wxBoxSizer *textsizer = new wxBoxSizer( wxHORIZONTAL );
|
wxBoxSizer *textsizer = new wxBoxSizer( wxHORIZONTAL );
|
||||||
@@ -890,6 +898,44 @@ void wxFileDialog::SetPath( const wxString& path )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxFileDialog::GetPaths( wxArrayString& paths ) const
|
||||||
|
{
|
||||||
|
paths.Empty();
|
||||||
|
paths.Alloc( m_list->GetSelectedItemCount() );
|
||||||
|
|
||||||
|
wxString dir;
|
||||||
|
m_list->GetDir( dir );
|
||||||
|
if (dir != wxT("/")) dir += wxT("/");
|
||||||
|
|
||||||
|
wxListItem item;
|
||||||
|
item.m_mask = wxLIST_MASK_TEXT;
|
||||||
|
|
||||||
|
item.m_itemId = m_list->GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED );
|
||||||
|
while ( item.m_itemId != -1 ) {
|
||||||
|
m_list->GetItem( item );
|
||||||
|
paths.Add( dir + item.m_text );
|
||||||
|
item.m_itemId = m_list->GetNextItem( item.m_itemId + 1,
|
||||||
|
wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxFileDialog::GetFilenames(wxArrayString& files) const
|
||||||
|
{
|
||||||
|
files.Empty();
|
||||||
|
files.Alloc( m_list->GetSelectedItemCount() );
|
||||||
|
|
||||||
|
wxListItem item;
|
||||||
|
item.m_mask = wxLIST_MASK_TEXT;
|
||||||
|
|
||||||
|
item.m_itemId = m_list->GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED );
|
||||||
|
while ( item.m_itemId != -1 ) {
|
||||||
|
m_list->GetItem( item );
|
||||||
|
files.Add( item.m_text );
|
||||||
|
item.m_itemId = m_list->GetNextItem( item.m_itemId + 1,
|
||||||
|
wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// global functions
|
// global functions
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@@ -226,12 +226,25 @@ void wxapp_install_idle_handler()
|
|||||||
{
|
{
|
||||||
wxASSERT_MSG( wxTheApp->m_idleTag == 0, wxT("attempt to install idle handler twice") );
|
wxASSERT_MSG( wxTheApp->m_idleTag == 0, wxT("attempt to install idle handler twice") );
|
||||||
|
|
||||||
/* this routine gets called by all event handlers
|
/* This routine gets called by all event handlers
|
||||||
indicating that the idle is over. */
|
indicating that the idle is over. It may also
|
||||||
|
get called from other thread for sending events
|
||||||
|
to the main thread (and processing these in
|
||||||
|
idle time). */
|
||||||
|
|
||||||
|
#if wxUSE_THREADS
|
||||||
|
if (!wxThread::IsMain())
|
||||||
|
GDK_THREADS_ENTER ();
|
||||||
|
#endif
|
||||||
|
|
||||||
wxTheApp->m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL );
|
wxTheApp->m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL );
|
||||||
|
|
||||||
g_isIdle = FALSE;
|
g_isIdle = FALSE;
|
||||||
|
|
||||||
|
#if wxUSE_THREADS
|
||||||
|
if (!wxThread::IsMain())
|
||||||
|
GDK_THREADS_LEAVE ();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if wxUSE_THREADS
|
#if wxUSE_THREADS
|
||||||
|
@@ -204,7 +204,7 @@ size_t wxFileDataObject::GetDataSize() const
|
|||||||
return res + 1;
|
return res + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxFileDataObject::SetData(size_t size, const void *buf)
|
bool wxFileDataObject::SetData(size_t WXUNUSED(size), const void *buf)
|
||||||
{
|
{
|
||||||
// VZ: old format
|
// VZ: old format
|
||||||
#if 0
|
#if 0
|
||||||
|
@@ -188,7 +188,7 @@ wxFont::wxFont( const wxString& fontname, const wxFontData& fontdata )
|
|||||||
|
|
||||||
tmp = tn.GetNextToken(); // pointsize
|
tmp = tn.GetNextToken(); // pointsize
|
||||||
long num = wxStrtol (tmp.c_str(), (wxChar **) NULL, 10);
|
long num = wxStrtol (tmp.c_str(), (wxChar **) NULL, 10);
|
||||||
M_FONTDATA->m_pointSize = num / 10;
|
M_FONTDATA->m_pointSize = (int)(num / 10);
|
||||||
|
|
||||||
tn.GetNextToken(); // x-res
|
tn.GetNextToken(); // x-res
|
||||||
tn.GetNextToken(); // y-res
|
tn.GetNextToken(); // y-res
|
||||||
|
@@ -48,7 +48,7 @@ extern wxList wxPendingDelete;
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_mdi_page_change_callback( GtkNotebook *widget,
|
gtk_mdi_page_change_callback( GtkNotebook *WXUNUSED(widget),
|
||||||
GtkNotebookPage *page,
|
GtkNotebookPage *page,
|
||||||
gint WXUNUSED(page_num),
|
gint WXUNUSED(page_num),
|
||||||
wxMDIParentFrame *parent )
|
wxMDIParentFrame *parent )
|
||||||
|
@@ -179,7 +179,7 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
|
|||||||
GDK_BUTTON1_MOTION_MASK),
|
GDK_BUTTON1_MOTION_MASK),
|
||||||
(GdkWindow *) NULL,
|
(GdkWindow *) NULL,
|
||||||
(GdkCursor *) NULL,
|
(GdkCursor *) NULL,
|
||||||
GDK_CURRENT_TIME );
|
(unsigned int) GDK_CURRENT_TIME );
|
||||||
|
|
||||||
win->m_diffX = (int)gdk_event->x;
|
win->m_diffX = (int)gdk_event->x;
|
||||||
win->m_diffY = (int)gdk_event->y;
|
win->m_diffY = (int)gdk_event->y;
|
||||||
|
@@ -201,7 +201,7 @@ gtk_pizza_new ()
|
|||||||
return GTK_WIDGET (pizza);
|
return GTK_WIDGET (pizza);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
static void
|
||||||
gtk_pizza_scroll_set_adjustments (GtkPizza *pizza,
|
gtk_pizza_scroll_set_adjustments (GtkPizza *pizza,
|
||||||
GtkAdjustment *hadj,
|
GtkAdjustment *hadj,
|
||||||
GtkAdjustment *vadj)
|
GtkAdjustment *vadj)
|
||||||
|
@@ -226,12 +226,25 @@ void wxapp_install_idle_handler()
|
|||||||
{
|
{
|
||||||
wxASSERT_MSG( wxTheApp->m_idleTag == 0, wxT("attempt to install idle handler twice") );
|
wxASSERT_MSG( wxTheApp->m_idleTag == 0, wxT("attempt to install idle handler twice") );
|
||||||
|
|
||||||
/* this routine gets called by all event handlers
|
/* This routine gets called by all event handlers
|
||||||
indicating that the idle is over. */
|
indicating that the idle is over. It may also
|
||||||
|
get called from other thread for sending events
|
||||||
|
to the main thread (and processing these in
|
||||||
|
idle time). */
|
||||||
|
|
||||||
|
#if wxUSE_THREADS
|
||||||
|
if (!wxThread::IsMain())
|
||||||
|
GDK_THREADS_ENTER ();
|
||||||
|
#endif
|
||||||
|
|
||||||
wxTheApp->m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL );
|
wxTheApp->m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL );
|
||||||
|
|
||||||
g_isIdle = FALSE;
|
g_isIdle = FALSE;
|
||||||
|
|
||||||
|
#if wxUSE_THREADS
|
||||||
|
if (!wxThread::IsMain())
|
||||||
|
GDK_THREADS_LEAVE ();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if wxUSE_THREADS
|
#if wxUSE_THREADS
|
||||||
|
@@ -204,7 +204,7 @@ size_t wxFileDataObject::GetDataSize() const
|
|||||||
return res + 1;
|
return res + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxFileDataObject::SetData(size_t size, const void *buf)
|
bool wxFileDataObject::SetData(size_t WXUNUSED(size), const void *buf)
|
||||||
{
|
{
|
||||||
// VZ: old format
|
// VZ: old format
|
||||||
#if 0
|
#if 0
|
||||||
|
@@ -188,7 +188,7 @@ wxFont::wxFont( const wxString& fontname, const wxFontData& fontdata )
|
|||||||
|
|
||||||
tmp = tn.GetNextToken(); // pointsize
|
tmp = tn.GetNextToken(); // pointsize
|
||||||
long num = wxStrtol (tmp.c_str(), (wxChar **) NULL, 10);
|
long num = wxStrtol (tmp.c_str(), (wxChar **) NULL, 10);
|
||||||
M_FONTDATA->m_pointSize = num / 10;
|
M_FONTDATA->m_pointSize = (int)(num / 10);
|
||||||
|
|
||||||
tn.GetNextToken(); // x-res
|
tn.GetNextToken(); // x-res
|
||||||
tn.GetNextToken(); // y-res
|
tn.GetNextToken(); // y-res
|
||||||
|
@@ -48,7 +48,7 @@ extern wxList wxPendingDelete;
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_mdi_page_change_callback( GtkNotebook *widget,
|
gtk_mdi_page_change_callback( GtkNotebook *WXUNUSED(widget),
|
||||||
GtkNotebookPage *page,
|
GtkNotebookPage *page,
|
||||||
gint WXUNUSED(page_num),
|
gint WXUNUSED(page_num),
|
||||||
wxMDIParentFrame *parent )
|
wxMDIParentFrame *parent )
|
||||||
|
@@ -179,7 +179,7 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
|
|||||||
GDK_BUTTON1_MOTION_MASK),
|
GDK_BUTTON1_MOTION_MASK),
|
||||||
(GdkWindow *) NULL,
|
(GdkWindow *) NULL,
|
||||||
(GdkCursor *) NULL,
|
(GdkCursor *) NULL,
|
||||||
GDK_CURRENT_TIME );
|
(unsigned int) GDK_CURRENT_TIME );
|
||||||
|
|
||||||
win->m_diffX = (int)gdk_event->x;
|
win->m_diffX = (int)gdk_event->x;
|
||||||
win->m_diffY = (int)gdk_event->y;
|
win->m_diffY = (int)gdk_event->y;
|
||||||
|
@@ -201,7 +201,7 @@ gtk_pizza_new ()
|
|||||||
return GTK_WIDGET (pizza);
|
return GTK_WIDGET (pizza);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
static void
|
||||||
gtk_pizza_scroll_set_adjustments (GtkPizza *pizza,
|
gtk_pizza_scroll_set_adjustments (GtkPizza *pizza,
|
||||||
GtkAdjustment *hadj,
|
GtkAdjustment *hadj,
|
||||||
GtkAdjustment *vadj)
|
GtkAdjustment *vadj)
|
||||||
|
@@ -154,6 +154,26 @@ gtk_glwindow_realized_callback( GtkWidget * WXUNUSED(widget), wxGLCanvas *win )
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// "map" from m_wxwindow
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static gint
|
||||||
|
gtk_glwindow_map_callback( GtkWidget * WXUNUSED(widget), wxGLCanvas *win )
|
||||||
|
{
|
||||||
|
if (win->m_glContext/* && win->m_exposed*/)
|
||||||
|
{
|
||||||
|
wxPaintEvent event( win->GetId() );
|
||||||
|
event.SetEventObject( win );
|
||||||
|
win->GetEventHandler()->ProcessEvent( event );
|
||||||
|
|
||||||
|
win->m_exposed = FALSE;
|
||||||
|
win->GetUpdateRegion().Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// "expose_event" of m_wxwindow
|
// "expose_event" of m_wxwindow
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -314,6 +334,9 @@ bool wxGLCanvas::Create( wxWindow *parent,
|
|||||||
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "realize",
|
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "realize",
|
||||||
GTK_SIGNAL_FUNC(gtk_glwindow_realized_callback), (gpointer) this );
|
GTK_SIGNAL_FUNC(gtk_glwindow_realized_callback), (gpointer) this );
|
||||||
|
|
||||||
|
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "map",
|
||||||
|
GTK_SIGNAL_FUNC(gtk_glwindow_map_callback), (gpointer) this );
|
||||||
|
|
||||||
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event",
|
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event",
|
||||||
GTK_SIGNAL_FUNC(gtk_glwindow_expose_callback), (gpointer)this );
|
GTK_SIGNAL_FUNC(gtk_glwindow_expose_callback), (gpointer)this );
|
||||||
|
|
||||||
|
@@ -12,12 +12,10 @@
|
|||||||
# on your system.
|
# on your system.
|
||||||
#
|
#
|
||||||
|
|
||||||
CC = g++
|
CC = gcc
|
||||||
|
|
||||||
cube: cube.o glcanvas.o
|
cube: cube.o glcanvas.o
|
||||||
$(CC) -o cube \
|
$(CC) -o cube cube.o glcanvas.o `wx-config --libs` -lMesaGL -lMesaGLU
|
||||||
cube.o glcanvas.o \
|
|
||||||
`wx-config --libs` -lMesaGL -lMesaGLU
|
|
||||||
|
|
||||||
cube.o: cube.cpp
|
cube.o: cube.cpp
|
||||||
$(CC) `wx-config --cflags` -I../../gtk -c cube.cpp
|
$(CC) `wx-config --cflags` -I../../gtk -c cube.cpp
|
||||||
|
@@ -76,6 +76,7 @@ void ScanCodeCtrl::OnKeyDown( wxKeyEvent& event )
|
|||||||
/*------------------------------------------------------------------
|
/*------------------------------------------------------------------
|
||||||
Dialog for defining a keypress
|
Dialog for defining a keypress
|
||||||
-------------------------------------------------------------------*/
|
-------------------------------------------------------------------*/
|
||||||
|
|
||||||
class ScanCodeDialog : public wxDialog
|
class ScanCodeDialog : public wxDialog
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -85,16 +86,8 @@ public:
|
|||||||
private:
|
private:
|
||||||
ScanCodeCtrl *m_ScanCode;
|
ScanCodeCtrl *m_ScanCode;
|
||||||
wxTextCtrl *m_Description;
|
wxTextCtrl *m_Description;
|
||||||
// any class wishing to process wxWindows events must use this macro
|
|
||||||
DECLARE_EVENT_TABLE()
|
|
||||||
};
|
};
|
||||||
|
|
||||||
BEGIN_EVENT_TABLE( ScanCodeDialog, wxDialog )
|
|
||||||
//
|
|
||||||
END_EVENT_TABLE()
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------- */
|
|
||||||
|
|
||||||
ScanCodeDialog::ScanCodeDialog( wxWindow* parent, wxWindowID id,
|
ScanCodeDialog::ScanCodeDialog( wxWindow* parent, wxWindowID id,
|
||||||
const int code, const wxString &descr, const wxString& title )
|
const int code, const wxString &descr, const wxString& title )
|
||||||
: wxDialog( parent, id, title, wxPoint(-1, -1), wxSize(96*2,76*2) )
|
: wxDialog( parent, id, title, wxPoint(-1, -1), wxSize(96*2,76*2) )
|
||||||
@@ -172,46 +165,49 @@ TestGLCanvas::TestGLCanvas(wxWindow *parent, wxWindowID id,
|
|||||||
const wxPoint& pos, const wxSize& size, long style, const wxString& name):
|
const wxPoint& pos, const wxSize& size, long style, const wxString& name):
|
||||||
wxGLCanvas(parent, NULL, id, pos, size, style, name )
|
wxGLCanvas(parent, NULL, id, pos, size, style, name )
|
||||||
{
|
{
|
||||||
m_init = FALSE;
|
m_init = FALSE;
|
||||||
m_gllist = 0;
|
m_gllist = 0;
|
||||||
m_rleft = WXK_LEFT;
|
m_rleft = WXK_LEFT;
|
||||||
m_rright = WXK_RIGHT;
|
m_rright = WXK_RIGHT;
|
||||||
}
|
}
|
||||||
|
|
||||||
TestGLCanvas::TestGLCanvas(wxWindow *parent, const TestGLCanvas &other,
|
TestGLCanvas::TestGLCanvas(wxWindow *parent, const TestGLCanvas &other,
|
||||||
wxWindowID id, const wxPoint& pos, const wxSize& size, long style,
|
wxWindowID id, const wxPoint& pos, const wxSize& size, long style,
|
||||||
const wxString& name ) :
|
const wxString& name ) :
|
||||||
wxGLCanvas(parent, other.GetContext(), id, pos, size, style, name )
|
wxGLCanvas(parent, other.GetContext(), id, pos, size, style, name )
|
||||||
{
|
{
|
||||||
m_init = FALSE;
|
m_init = FALSE;
|
||||||
m_gllist = other.m_gllist; /* share display list */
|
m_gllist = other.m_gllist; /* share display list */
|
||||||
m_rleft = WXK_LEFT;
|
m_rleft = WXK_LEFT;
|
||||||
m_rright = WXK_RIGHT;
|
m_rright = WXK_RIGHT;
|
||||||
}
|
}
|
||||||
TestGLCanvas::~TestGLCanvas(void)
|
|
||||||
|
TestGLCanvas::~TestGLCanvas()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestGLCanvas::Render( void )
|
void TestGLCanvas::Render()
|
||||||
{
|
{
|
||||||
wxPaintDC dc(this);
|
wxPaintDC dc(this);
|
||||||
|
|
||||||
#ifndef __WXMOTIF__
|
#ifndef __WXMOTIF__
|
||||||
if (!GetContext()) return;
|
if (!GetContext()) return;
|
||||||
#endif
|
#endif
|
||||||
SetCurrent();
|
|
||||||
/* init OpenGL once, but after SetCurrent */
|
SetCurrent();
|
||||||
if (!m_init)
|
/* init OpenGL once, but after SetCurrent */
|
||||||
{
|
if (!m_init)
|
||||||
InitGL();
|
{
|
||||||
m_init = TRUE;
|
InitGL();
|
||||||
}
|
m_init = TRUE;
|
||||||
/* clear color and depth buffers */
|
}
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
||||||
|
/* clear color and depth buffers */
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
if( m_gllist == 0 )
|
if( m_gllist == 0 )
|
||||||
{
|
{
|
||||||
m_gllist = glGenLists( 1 );
|
m_gllist = glGenLists( 1 );
|
||||||
printf( "List=%d\n", m_gllist );
|
|
||||||
glNewList( m_gllist, GL_COMPILE_AND_EXECUTE );
|
glNewList( m_gllist, GL_COMPILE_AND_EXECUTE );
|
||||||
/* draw six faces of a cube */
|
/* draw six faces of a cube */
|
||||||
glBegin(GL_QUADS);
|
glBegin(GL_QUADS);
|
||||||
@@ -251,26 +247,26 @@ void TestGLCanvas::Render( void )
|
|||||||
|
|
||||||
void TestGLCanvas::OnEnterWindow( wxMouseEvent& event )
|
void TestGLCanvas::OnEnterWindow( wxMouseEvent& event )
|
||||||
{
|
{
|
||||||
SetFocus();
|
SetFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestGLCanvas::OnPaint( wxPaintEvent& event )
|
void TestGLCanvas::OnPaint( wxPaintEvent& event )
|
||||||
{
|
{
|
||||||
Render();
|
Render();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestGLCanvas::OnSize(wxSizeEvent& event)
|
void TestGLCanvas::OnSize(wxSizeEvent& event)
|
||||||
{
|
{
|
||||||
int width, height;
|
int width, height;
|
||||||
GetClientSize(& width, & height);
|
GetClientSize(& width, & height);
|
||||||
|
|
||||||
#ifndef __WXMOTIF__
|
#ifndef __WXMOTIF__
|
||||||
if (GetContext())
|
if (GetContext())
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
SetCurrent();
|
SetCurrent();
|
||||||
glViewport(0, 0, width, height);
|
glViewport(0, 0, width, height);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestGLCanvas::OnEraseBackground(wxEraseEvent& event)
|
void TestGLCanvas::OnEraseBackground(wxEraseEvent& event)
|
||||||
@@ -278,25 +274,25 @@ void TestGLCanvas::OnEraseBackground(wxEraseEvent& event)
|
|||||||
// Do nothing, to avoid flashing.
|
// Do nothing, to avoid flashing.
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestGLCanvas::InitGL(void)
|
void TestGLCanvas::InitGL()
|
||||||
{
|
{
|
||||||
SetCurrent();
|
SetCurrent();
|
||||||
|
|
||||||
/* set viewing projection */
|
/* set viewing projection */
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glFrustum(-0.5F, 0.5F, -0.5F, 0.5F, 1.0F, 3.0F);
|
glFrustum(-0.5F, 0.5F, -0.5F, 0.5F, 1.0F, 3.0F);
|
||||||
|
|
||||||
/* position viewer */
|
/* position viewer */
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
glTranslatef(0.0F, 0.0F, -2.0F);
|
glTranslatef(0.0F, 0.0F, -2.0F);
|
||||||
|
|
||||||
/* position object */
|
/* position object */
|
||||||
glRotatef(30.0F, 1.0F, 0.0F, 0.0F);
|
glRotatef(30.0F, 1.0F, 0.0F, 0.0F);
|
||||||
glRotatef(30.0F, 0.0F, 1.0F, 0.0F);
|
glRotatef(30.0F, 0.0F, 1.0F, 0.0F);
|
||||||
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
glEnable(GL_LIGHTING);
|
glEnable(GL_LIGHTING);
|
||||||
glEnable(GL_LIGHT0);
|
glEnable(GL_LIGHT0);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLfloat TestGLCanvas::CalcRotateSpeed( unsigned long acceltime )
|
GLfloat TestGLCanvas::CalcRotateSpeed( unsigned long acceltime )
|
||||||
@@ -314,65 +310,74 @@ GLfloat TestGLCanvas::CalcRotateSpeed( unsigned long acceltime )
|
|||||||
|
|
||||||
return(v);
|
return(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLfloat TestGLCanvas::CalcRotateAngle( unsigned long lasttime,
|
GLfloat TestGLCanvas::CalcRotateAngle( unsigned long lasttime,
|
||||||
unsigned long acceltime )
|
unsigned long acceltime )
|
||||||
{
|
{
|
||||||
GLfloat t,s1,s2;
|
GLfloat t,s1,s2;
|
||||||
|
|
||||||
t = ((GLfloat)(acceltime - lasttime)) / 1000.0f;
|
t = ((GLfloat)(acceltime - lasttime)) / 1000.0f;
|
||||||
s1 = CalcRotateSpeed( lasttime );
|
s1 = CalcRotateSpeed( lasttime );
|
||||||
s2 = CalcRotateSpeed( acceltime );
|
s2 = CalcRotateSpeed( acceltime );
|
||||||
return( t * (s1 + s2) * 135.0f );
|
|
||||||
|
return( t * (s1 + s2) * 135.0f );
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestGLCanvas::Action( long code, unsigned long lasttime,
|
void TestGLCanvas::Action( long code, unsigned long lasttime,
|
||||||
unsigned long acceltime )
|
unsigned long acceltime )
|
||||||
{
|
{
|
||||||
GLfloat angle = CalcRotateAngle( lasttime, acceltime );
|
GLfloat angle = CalcRotateAngle( lasttime, acceltime );
|
||||||
|
|
||||||
if( code == m_rleft ) Rotate( angle );
|
if (code == m_rleft)
|
||||||
else if( code == m_rright ) Rotate( -angle );
|
Rotate( angle );
|
||||||
|
else if (code == m_rright)
|
||||||
|
Rotate( -angle );
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestGLCanvas::OnKeyDown( wxKeyEvent& event )
|
void TestGLCanvas::OnKeyDown( wxKeyEvent& event )
|
||||||
{
|
{
|
||||||
long evkey = event.KeyCode();
|
long evkey = event.KeyCode();
|
||||||
if( evkey == 0 ) return;
|
if (evkey == 0) return;
|
||||||
|
|
||||||
if( !m_TimeInitialized )
|
if (!m_TimeInitialized)
|
||||||
{
|
{
|
||||||
m_TimeInitialized = 1;
|
m_TimeInitialized = 1;
|
||||||
m_xsynct = event.m_timeStamp;
|
m_xsynct = event.m_timeStamp;
|
||||||
m_gsynct = wxStopWatch(&m_secbase);
|
m_gsynct = wxStopWatch(&m_secbase);
|
||||||
|
|
||||||
m_Key = evkey;
|
m_Key = evkey;
|
||||||
m_StartTime = 0;
|
m_StartTime = 0;
|
||||||
m_LastTime = 0;
|
m_LastTime = 0;
|
||||||
m_LastRedraw = 0;
|
m_LastRedraw = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long currTime = event.m_timeStamp - m_xsynct;
|
unsigned long currTime = event.m_timeStamp - m_xsynct;
|
||||||
|
|
||||||
if( evkey != m_Key )
|
if (evkey != m_Key)
|
||||||
{
|
{
|
||||||
m_Key = evkey;
|
m_Key = evkey;
|
||||||
m_LastRedraw = m_StartTime = m_LastTime = currTime;
|
m_LastRedraw = m_StartTime = m_LastTime = currTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( currTime >= m_LastRedraw ) // Redraw:
|
if (currTime >= m_LastRedraw) // Redraw:
|
||||||
{
|
{
|
||||||
Action( m_Key, m_LastTime-m_StartTime, currTime-m_StartTime );
|
Action( m_Key, m_LastTime-m_StartTime, currTime-m_StartTime );
|
||||||
|
|
||||||
m_LastRedraw = wxStopWatch(&m_secbase) - m_gsynct;
|
m_LastRedraw = wxStopWatch(&m_secbase) - m_gsynct;
|
||||||
m_LastTime = currTime;
|
m_LastTime = currTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
event.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestGLCanvas::OnKeyUp( wxKeyEvent& event )
|
void TestGLCanvas::OnKeyUp( wxKeyEvent& event )
|
||||||
{
|
{
|
||||||
m_Key = 0;
|
m_Key = 0;
|
||||||
m_StartTime = 0;
|
m_StartTime = 0;
|
||||||
m_LastTime = 0;
|
m_LastTime = 0;
|
||||||
m_LastRedraw = 0;
|
m_LastRedraw = 0;
|
||||||
|
|
||||||
|
event.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestGLCanvas::Rotate( GLfloat deg )
|
void TestGLCanvas::Rotate( GLfloat deg )
|
||||||
|
@@ -12,16 +12,14 @@
|
|||||||
# on your system.
|
# on your system.
|
||||||
#
|
#
|
||||||
|
|
||||||
CPP = g++
|
CPP = gcc
|
||||||
CC = gcc
|
CC = gcc
|
||||||
|
|
||||||
Penguin: penguin.o trackball.o lw.o glcanvas.o
|
Penguin: penguin.o trackball.o lw.o glcanvas.o
|
||||||
$(CPP) -o Penguin \
|
$(CPP) -o Penguin penguin.o trackball.o lw.o glcanvas.o `wx-config --libs` -lMesaGL -lMesaGLU
|
||||||
penguin.o trackball.o lw.o glcanvas.o \
|
|
||||||
`wx-config --libs` -lMesaGL -lMesaGLU
|
|
||||||
|
|
||||||
penguin.o: penguin.cpp
|
penguin.o: penguin.cpp
|
||||||
$(CPP) `wx-config --cflags` -g -I../../gtk -c penguin.cpp
|
$(CPP) `wx-config --cflags` -I../../gtk -c penguin.cpp
|
||||||
|
|
||||||
lw.o: lw.cpp
|
lw.o: lw.cpp
|
||||||
$(CPP) `wx-config --cflags` -I../../gtk -c lw.cpp
|
$(CPP) `wx-config --cflags` -I../../gtk -c lw.cpp
|
||||||
|
Reference in New Issue
Block a user