commit d0eaab4e1a4a79d7e321203870f9e5ceb2ff66da Author: adbrt <88463212+adbrt@users.noreply.github.com> Date: Sat Nov 18 17:56:10 2023 +0100 First version diff --git a/Samples/tcptest/resource.rc b/Samples/tcptest/resource.rc new file mode 100644 index 0000000..553c482 --- /dev/null +++ b/Samples/tcptest/resource.rc @@ -0,0 +1,3 @@ +aaaa ICON "wx/msw/std.ico" + +#include "wx/msw/wx.rc" diff --git a/Samples/tcptest/tcpclient.cpp b/Samples/tcptest/tcpclient.cpp new file mode 100644 index 0000000..d232e5f --- /dev/null +++ b/Samples/tcptest/tcpclient.cpp @@ -0,0 +1,271 @@ +#include "tcpclient.h" + +#define BUF_SIZE 1024 + +const long SimpleTCPClient::SOCKET_ID = wxNewId(); + +BEGIN_EVENT_TABLE(SimpleTCPClient, wxEvtHandler) + EVT_SOCKET(SOCKET_ID, SimpleTCPClient::OnSocketEvent) +END_EVENT_TABLE() + + +DEFINE_EVENT_TYPE(EV_CONNECTED); +DEFINE_EVENT_TYPE(EV_CLIENTONDATA); + +SimpleTCPClient::SimpleTCPClient(wxEvtHandler* parent, wxWindowID id) +{ + + m_id = id; + m_parent = parent; + logBox = NULL; + Client = NULL; + +} + +SimpleTCPClient::~SimpleTCPClient() +{ + +} + +// Read specified number of bytes to specified buffer from socket and return actual number of read bytes +int SimpleTCPClient::Read( void *buffer, unsigned int nbytes ) +{ + + int result = 0; + + // Read data + if (Client != NULL) + { + if ( Client->IsConnected() && !disconnected) + { + Client->Read(buffer, nbytes); + result = Client->LastCount(); // Set number of actually read bytes as result + } + } + + return result; +} + +// Peek specified number of bytes to specified buffer from socket and return actual number of peeked bytes +// This doesn't remove the data from socket and it can be read afterwards +int SimpleTCPClient::Peek( void *buffer, unsigned int nbytes ) +{ + int result = 0; + // Peek data + if (Client != NULL && !disconnected) + { + if ( Client->IsConnected() ) + { + Client->Peek(buffer, nbytes); + result = Client->LastCount(); // Set number of actually peeked bytes as result + } + } + return result; +} + + +// Read from socket and return a string (this should be mostly used for "human-readable" data) +wxString SimpleTCPClient::ReadStr() +{ + wxString readString = ""; + + char buff[BUF_SIZE + 1]; // Buffer with byte for zero termination (end of string) + memset(buff, 0, sizeof(buff)); + + // Read data + if (Client != NULL) Client->Read(&buff, BUF_SIZE); + + readString = buff; + + return readString; +} + + +// Peek data in socket without clearing the data and return a string (this should be mostly used for "human-readable" data) +wxString SimpleTCPClient::PeekStr() +{ + wxString readString = ""; + + char buff[BUF_SIZE + 1]; // Buffer with byte for zero termination (end of string) + memset(buff, 0, sizeof(buff)); + + // Read data + if (Client != NULL) Client->Peek(&buff, BUF_SIZE); + + readString = buff; + + return readString; +} + +void SimpleTCPClient::LogClient( wxString logText ) +{ + // Append text to provided wxTextCtrl (if exists) + // "(internal)" is added just to make it easier to understand how the application works + // It will show which messages came from the "inside" of tcpclient.cpp file + if (logBox != NULL) logBox->WriteText("(internal) " + logText + "\n"); +} + +void SimpleTCPClient::Connect(wxString hostname, unsigned int port) +{ + if (Client == NULL) + { + wxIPV4address ipaddr; + ipaddr.Hostname(hostname); + ipaddr.Service(port); + + LogClient("Opening client"); + Client = new wxSocketClient(); + Client->SetFlags(wxSOCKET_NOWAIT); // wxSOCKET_NONE is default but produced some segfaults on retry + + Client->SetEventHandler(*this, SOCKET_ID); + Client->SetNotify(wxSOCKET_CONNECTION_FLAG | wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG); + Client->Notify(true); + + Client->Connect(ipaddr, false); + + } + else + { + + if ( Client->IsConnected() ) + { + LogClient( "Already connected" ); + } + else if ( !Client->IsConnected() ) + { + LogClient( "Connection in progress" ); + } + + } +} + + +void SimpleTCPClient::WriteStr( wxString str_in ) +{ + if (Client != NULL) // No point in trying if client is not active + { + // Send string to server + if ( Client->IsConnected() ) + { + Client->Write(str_in.c_str(), str_in.Length()); + LogClient("Sent \"" + str_in + "\""); + } + } +} + +void SimpleTCPClient::Write( const void *data, unsigned int dataBytes ) +{ + if (Client != NULL) // No point in trying if client is not active + { + // Write data + if ( Client->IsConnected() ) + { + Client->Write(data, dataBytes); + LogClient("Sent binary data"); + } + } +} + +void SimpleTCPClient::WriteWait( const void *data, unsigned int dataBytes ) +{ + if (Client != NULL) // No point in trying if client is not active + { + // Write data + if ( Client->IsConnected() ) + { + //wxSocketFlags tempFlags = Client->GetFlags(); + + //Client->SetFlags(wxSOCKET_BLOCK); + + Client->Write(data, dataBytes); + Client->WaitForWrite(0,10); + + //Client->SetFlags(tempFlags); + } + } +} + + +void SimpleTCPClient::OnRecv(wxSocketBase *sock) +{ + + LogClient("Incoming data"); + + // Put current socket in event data, so main application will be able to read it + wxCommandEvent myevent(EV_CLIENTONDATA, m_id); + myevent.SetClientData( sock ); + wxPostEvent(m_parent, myevent); + + + //**** Data must be handled in main application. + //**** If main application will only read partial data, + //**** next events will be fired until all data is read. + //**** But if application does not read any data, + //**** data receive event will get stuck until it is manually read + + //if ( sock->IsData() ) OnRecv( sock ); // Keep receiving if more data is available (this is default behavior anyway) + +} + +void SimpleTCPClient::Disconnect() +{ + if (Client != NULL) + { + Client->Destroy(); + Client->WaitForLost(0,50); + Client = NULL; + LogClient("Disconnecting from server"); + } +} + +void SimpleTCPClient::OnSocketEvent(wxSocketEvent &event) +{ + + LogClient("Socket event"); + + wxSocketBase *sock = event.GetSocket(); + + switch(event.GetSocketEvent()) + { + case wxSOCKET_CONNECTION: + { + LogClient("Successfully connected"); + + + wxCommandEvent myevent(EV_CONNECTED, m_id); + myevent.SetClientData( sock ); + wxPostEvent(m_parent, myevent); + disconnected = false; + + break; + } + + case wxSOCKET_INPUT: + { + // Redirect to OnRecv function + OnRecv(event.GetSocket()); + break; + } + + case wxSOCKET_LOST: + { + LogClient("Disconnected"); + sock->Close(); + sock->Discard(); + sock->Destroy(); + Client->Close(); + Client->Discard(); + Client->Destroy(); + Client = NULL; + disconnected = true; + break; + } + + default: + { + LogClient("Unknown event"); + break; + } + } + +} diff --git a/Samples/tcptest/tcpclient.h b/Samples/tcptest/tcpclient.h new file mode 100644 index 0000000..6131163 --- /dev/null +++ b/Samples/tcptest/tcpclient.h @@ -0,0 +1,80 @@ +#ifndef TCPCLIENT_H +#define TCPCLIENT_H + +#include "wx/wx.h" +#include "wx/socket.h" +#include "wx/event.h" +#include + +DECLARE_EVENT_TYPE(EV_CONNECTED, wxCommandEvent); +DECLARE_EVENT_TYPE(EV_CLIENTONDATA, wxCommandEvent); + +class SimpleTCPClient : public wxEvtHandler +{ + + public: + + + int maxClients; + + SimpleTCPClient(wxEvtHandler* parent, wxWindowID id); // Constructor + virtual ~SimpleTCPClient(); // Destructor + + void Connect( wxString hostname, unsigned int port ); // This will start listening (address is optional, port can be also set with different function) + + void Disconnect(); + + unsigned int Port( unsigned int port = 0 ); // Return current port number (if no arguments) or set new port number (if specified) + + wxTextCtrl *logBox; // Text control to be used as log output (optional) + + + void OnSocketEvent(wxSocketEvent &event); + + void OnRecv(wxSocketBase *sock); + + wxString ReadStr(); + + int Read( void *buffer, unsigned int nbytes ); + + wxString PeekStr(); + + int Peek( void *buffer, unsigned int nbytes ); + + void WriteStr( wxString str_in ); + + // Write data (for example char array) to socket + void Write( const void *data, unsigned int dataBytes ); + + // Write data (for example char array) to socket + void WriteWait( const void *data, unsigned int dataBytes ); + + bool isDisconnected() + { + if (Client) + { + if (Client->IsDisconnected()) return true; + else return false; + } + else return true; + }; + + + private: + + + bool disconnected; + wxEvtHandler * m_parent; // Parent form + wxWindowID m_id; // ID assigned to current instance of server + + wxSocketClient *Client; // Client things will happen here + + void LogClient( wxString logText ); // Log will be printed with this function if required + + + static const long SOCKET_ID; // For event handling + DECLARE_EVENT_TABLE() // For event handling + +}; + +#endif // TCPCLIENT_H diff --git a/Samples/tcptest/tcpserver.cpp b/Samples/tcptest/tcpserver.cpp new file mode 100644 index 0000000..63b1f18 --- /dev/null +++ b/Samples/tcptest/tcpserver.cpp @@ -0,0 +1,492 @@ +#include "tcpserver.h" + +#define BUF_SIZE 1024 + +const long SimpleTCPServer::SERVER_ID = wxNewId(); +const long SimpleTCPServer::CLIENT_ID = wxNewId(); + +BEGIN_EVENT_TABLE(SimpleTCPServer, wxEvtHandler) + EVT_SOCKET(SERVER_ID, SimpleTCPServer::OnServerEvent) + EVT_SOCKET(CLIENT_ID, SimpleTCPServer::OnClientEvent) +END_EVENT_TABLE() + + +DEFINE_EVENT_TYPE(EV_CLIENTCONNECTED); +DEFINE_EVENT_TYPE(EV_CLIENTDISCONNECTED); +DEFINE_EVENT_TYPE(EV_ONDATA); +DEFINE_EVENT_TYPE(EV_ONERROR); +DEFINE_EVENT_TYPE(EV_ONCLOSE); + + +SimpleTCPServer::SimpleTCPServer(wxEvtHandler* parent, wxWindowID id) +{ + maxClients = 10; // Clients beyond that will be rejected by server (more than 1 is not handled well right now) + m_id = id; + m_parent = parent; + logBox = NULL; + logLevel = 0; + Listener = NULL; + currentClient = new wxSocketBase(); // Socket of current/most recent client will be stored here + +} + +SimpleTCPServer::~SimpleTCPServer() +{ + +} + + +void SimpleTCPServer::LogServer( wxString logText ) +{ + // Append text to provided wxTextCtrl (if exists) + // "(internal)" is added just to make it easier to understand how the application works + // It will show which messages came from the "inside" of tcpserver.cpp file + if (logBox != NULL) logBox->WriteText("(internal) " + logText + "\n"); +} + +void SimpleTCPServer::Open(unsigned int port) +{ + if (Listener == NULL) + { + wxIPV4address ipaddr; + ipaddr.AnyAddress(); + if (port == NULL) + { + ipaddr.Service( srvPort ); + } + else ipaddr.Service( port ); + + + LogServer("Opening server"); + Listener = new wxSocketServer(ipaddr); + connectedClients = 0; + currentClient = NULL; + + if(Listener->Ok()) + LogServer("Started listening"); + else + LogServer("Could not start listening"); + + Listener->SetEventHandler(*this, SERVER_ID); + Listener->SetNotify(wxSOCKET_CONNECTION_FLAG); + Listener->Notify(true); + } + else + { + LogServer("Server already opened"); + } +} + +void SimpleTCPServer::Close() +{ + if (Listener) + { + /** Removed in favor of map of clients + // Iterate over list of connected clients to disconnect them all + std::list::iterator it; + for (it = clients.begin(); it != clients.end(); ++it) + { + (*it)->Destroy(); // Disconnect client + } + clients.clear(); // Clear the list after everyone is disconnected + **/ + + if (connectedClients >0) + { + // Iterate over map of connected clients + for( std::map::const_iterator it = clientMap.begin(); + it != clientMap.end(); ++it) + { + it->first->Destroy(); // Disconnect client ( ->first means first element of map, that is wxSocketBase ) + } + clientMap.clear(); // Clear the map of clients + + connectedClients = 0; // Clear number of clients + } + currentClient = NULL; // Clear current client + + Listener->Destroy(); // Remove the server + Listener = NULL; + + LogServer("Closing server"); + + // Post event about server closing + //wxCommandEvent myevent(EV_ONCLOSE, m_id); + //wxPostEvent(m_parent, myevent); + + } + else LogServer("Server already closed"); + + + +} + + +// Peek buffer, provide socket to read or use default one +int SimpleTCPServer::Peek( void *buffer, unsigned int nbytes, wxSocketBase* sock ) +{ + int result = 0; + + // Read from specified socket or default socket if not specified + if (sock != NULL) + { + sock->Peek(buffer, nbytes); + result = sock->LastCount(); + } + else if (currentClient != NULL) + { + currentClient->Peek(buffer, nbytes); + result = currentClient->LastCount(); + } + + return result; +} + +// Peek buffer as string, provide socket to read or use default one +wxString SimpleTCPServer::PeekStr(wxSocketBase* sock) +{ + wxString readString = ""; + + char buff[BUF_SIZE + 1]; // Buffer with byte for zero termination (end of string) + memset(buff, 0, sizeof(buff)); + + + if (sock != NULL) + { + sock->Peek(&buff, BUF_SIZE); + } + else if (currentClient != NULL) + { + currentClient->Peek(&buff, BUF_SIZE); + } + + readString = buff; + + return readString; +} + +// Peek buffer, provide socket to read or use default one +int SimpleTCPServer::Read( void *buffer, unsigned int nbytes, wxSocketBase* sock ) +{ + int result = 0; + + // Read from specified socket or default socket if not specified + if (sock != NULL) + { + sock->Read(buffer, nbytes); + result = sock->LastCount(); + } + else if (currentClient != NULL) + { + currentClient->Read(buffer, nbytes); + result = currentClient->LastCount(); + } + + return result; +} + + +// Read from socket and return a string (this should be mostly used for "human-readable" data) +wxString SimpleTCPServer::ReadStr( wxSocketBase* sock ) +{ + wxString readString = ""; + + char buff[BUF_SIZE + 1]; // Buffer with byte for zero termination (end of string) + memset(buff, 0, sizeof(buff)); + + // Read from specified socket or default socket if not specified + if (sock != NULL) sock->Read(&buff, BUF_SIZE); + else if (currentClient != NULL) currentClient->Read(&buff, BUF_SIZE); + + readString = buff; + + return readString; +} + +void SimpleTCPServer::WriteStr( wxString str_in, wxSocketBase* sock ) +{ + if (Listener != NULL) // No point in trying if server doesn't exist + { + // Write string to specified socket + if (sock != NULL) + { + sock->Write(str_in.c_str(), str_in.Length()); + } + else // Send to everyone + { + // Iterate over map of connected clients + for( std::map::const_iterator it = clientMap.begin(); + it != clientMap.end(); ++it) + { + WriteStr(str_in, it->first); + } + LogServer("Sent \"" + str_in + "\""); + + + } + //else if (currentClient != NULL) currentClient->Write(str_in.c_str(), str_in.Length()); + + } + +} + +void SimpleTCPServer::WriteStr( wxString str_in, wxString ip_port ) +{ + + bool success = false; + + // Iterate over map of connected clients + for( std::map::const_iterator it = clientMap.begin(); + it != clientMap.end(); ++it) + { + if (it->second == ip_port) // If provided address matches one of connected sockets + { + WriteStr(str_in, it->first); + success = true; + LogServer("Sent \"" + str_in + "\""); + + } + if (success) return; + } + +} + + +void SimpleTCPServer::Write( const void *data, unsigned int dataBytes, wxSocketBase* sock ) +{ + if (Listener != NULL) // No point in trying if server doesn't exist + { + // Write data to specified socket or default socket + if (sock != NULL) sock->Write(data, dataBytes); + else if (currentClient != NULL) currentClient->Write(data, dataBytes); + LogServer("Sent binary data"); + } + +} + +void SimpleTCPServer::Write( const void *data, unsigned int dataBytes, wxString ip_port ) +{ + + bool success = false; + + // Iterate over map of connected clients + for( std::map::const_iterator it = clientMap.begin(); + it != clientMap.end(); ++it) + { + if (it->second == ip_port) // If provided address matches one of connected sockets + { + Write(data, dataBytes, it->first); + success = true; + } + if (success) return; + } + +} + + + +void SimpleTCPServer::OnServerEvent(wxSocketEvent &event) +{ + if(event.GetSocketEvent() == wxSOCKET_CONNECTION) + { + wxSocketBase *clientSock = Listener->Accept(false); + + // Drop client if exceeded maximum count of clients + if (connectedClients >= maxClients) + { + clientSock->Destroy(); + LogServer("Client rejected (limit exceeded)"); + } + else + { + // Proceed normally if limit not exceeded + + clientSock->SetEventHandler(*this, CLIENT_ID); + clientSock->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG); + clientSock->Notify(true); + + + + // Get IP address and port of connected client + wxIPV4address clientAddr; + clientSock->GetPeer(clientAddr); + // Prepare a string with address:port + wxString clientAddStr = clientAddr.IPAddress() + ":" + wxString::Format(wxT("%i"),clientAddr.Service()); + + // Store client data in map with pair of socket and string with address:port + clientMap.insert( std::pair(clientSock, clientAddStr) ); + + currentClient = clientSock; // Set this client as current client + + connectedClients++; + LogServer("Client connected (" + clientAddStr + ")"); // Print log with address of client + + wxCommandEvent myevent(EV_CLIENTCONNECTED, m_id); + wxPostEvent(m_parent, myevent); + + } + + } + +} + +void SimpleTCPServer::OnClientEvent(wxSocketEvent &event) +{ + switch(event.GetSocketEvent()) + { + case wxSOCKET_INPUT: OnRecv(event.GetSocket()); break; + case wxSOCKET_LOST: OnConnLost(event.GetSocket()); break; + } +} + + +unsigned int SimpleTCPServer::Port(unsigned int port) +{ + // Return current port number if no arguments or invalid value specified + if ( (port < 1) || (port > 65535) || port == NULL ) + { + return port; + } + else // Set new port number and reopen the server if needed + { + // Proceed only if port is different + if (port != srvPort) + { + srvPort = port; + LogServer("New port: " + wxString::Format(wxT("%i"),port) ); + + // Restart server with new port (only if it was running before) + if (Listener != NULL) + { + Close(); + Open(); + } + + } + + } + return port; +} + +void SimpleTCPServer::OnRecv(wxSocketBase *sock) +{ + + LogServer("Incoming data"); + + currentClient = sock; // Set data sender as current client (so it will be easy to respond to it later) + + // Put current socket in event data, so main application will be able to read it + wxCommandEvent myevent(EV_ONDATA, m_id); + myevent.SetClientData( sock ); + wxPostEvent(m_parent, myevent); + + + //**** Data must be handled in main application. + //**** If main application will only read partial data, + //**** next events will be fired until all data is read. + //**** But if application does not read any data, + //**** data receive event will get stuck until it is manually read + + //if ( sock->IsData() ) OnRecv( sock ); // Keep receiving if more data is available (this is default behavior anyway) + +} + +void SimpleTCPServer::OnConnLost(wxSocketBase *sock) +{ + LogServer("Client disconnected"); + + wxCommandEvent myevent(EV_CLIENTDISCONNECTED, m_id); + myevent.SetClientData( sock ); + wxPostEvent(m_parent, myevent); + + connectedClients--; + + clientMap.erase( sock ); // Remove client from map of connected clients + + // Removed in favor of map + // clients.remove(sock); // Remove client from list of clients + + if (currentClient == sock) + { + currentClient = NULL; // Clear current client if this is the one disconnecting + LogServer("Clearing current client"); + } + + sock->Destroy(); +} + +void SimpleTCPServer::DropClient(wxSocketBase *sock) +{ + //LogServer("Dropping client"); + + connectedClients--; + + wxCommandEvent myevent(EV_CLIENTDISCONNECTED, m_id); + myevent.SetClientData( sock ); + wxPostEvent(m_parent, myevent); + + clientMap.erase( sock ); // Remove client from map of connected clients + + // Get IP address and port of connected client + wxIPV4address clientAddr; + sock->GetPeer(clientAddr); + // Prepare a string with address:port + wxString clientAddStr = clientAddr.IPAddress() + ":" + wxString::Format(wxT("%i"),clientAddr.Service()); + LogServer("Dropping client " + clientAddStr); + + if (currentClient == sock) + { + currentClient = NULL; // Clear current client if this is the one disconnecting + } + + sock->Destroy(); +} + + + +void SimpleTCPServer::DropClient(wxString ip_port) +{ + + + bool success = false; + + // Iterate over map of connected clients + for( std::map::const_iterator it = clientMap.begin(); + it != clientMap.end(); ++it) + { + if (it->second == ip_port) // If provided address matches one of connected sockets + { + //LogServer("Dropping client"); + + connectedClients--; + + wxCommandEvent myevent(EV_CLIENTDISCONNECTED, m_id); + myevent.SetClientData( it->first ); + wxPostEvent(m_parent, myevent); + + // Get IP address and port of connected client + wxIPV4address clientAddr; + it->first->GetPeer(clientAddr); + // Prepare a string with address:port + wxString clientAddStr = clientAddr.IPAddress() + ":" + wxString::Format(wxT("%i"),clientAddr.Service()); + LogServer("Dropping client " + clientAddStr); + + if (currentClient == it->first) + { + currentClient = NULL; // Clear current client if this is the one disconnecting + } + + clientMap.erase( it->first ); // Remove client from map of connected clients + + it->first->Destroy(); + + + } + } + + +} + + + + diff --git a/Samples/tcptest/tcpserver.h b/Samples/tcptest/tcpserver.h new file mode 100644 index 0000000..68e04c2 --- /dev/null +++ b/Samples/tcptest/tcpserver.h @@ -0,0 +1,113 @@ +#ifndef TCPSERVER_H +#define TCPSERVER_H + +#include "wx/wx.h" +#include "wx/socket.h" +#include "wx/event.h" +#include +#include + + +DECLARE_EVENT_TYPE(EV_CLIENTCONNECTED, wxCommandEvent); +DECLARE_EVENT_TYPE(EV_CLIENTDISCONNECTED, wxCommandEvent); +DECLARE_EVENT_TYPE(EV_ONDATA, wxCommandEvent); +DECLARE_EVENT_TYPE(EV_ONERROR, wxCommandEvent); +DECLARE_EVENT_TYPE(EV_ONCLOSE, wxCommandEvent); + + +class SimpleTCPServer : public wxEvtHandler +{ + + public: + + + int maxClients; + + int logLevel; + + SimpleTCPServer(wxEvtHandler* parent, wxWindowID id); // Constructor + virtual ~SimpleTCPServer(); // Destructor + + void Open( unsigned int port = NULL ); // This will start listening (address is optional, port can be also set with different function) + + wxSocketBase *currentClient; // Client currently interacting with server (automatically updated when someone connects or send data) + + wxString ReadStr( wxSocketBase* sock = NULL ); // Read from buffer as string, provide socket to read or use default one + + // Write string to socket (provide a socket or use currentClient) + void WriteStr( wxString str_in, wxSocketBase* sock = NULL ); + + // Write string to provided "ip:port" if a matching socket is connected + void WriteStr( wxString str_in, wxString ip_port ); + + // Write data (for example char array) to socket (provide a socket or use currentClient) + void Write( const void *data, unsigned int dataBytes, wxSocketBase* sock = NULL ); + + // Write data (for example char array) to provided "ip:port" if a matching socket is connected + void Write( const void *data, unsigned int dataBytes, wxString ip_port ); + + // Peek buffer as string, provide socket to read or use default one + wxString PeekStr(wxSocketBase* sock = NULL); + + // Peek buffer, provide socket to read or use default one + int Peek( void *buffer, unsigned int nbytes, wxSocketBase* sock = NULL ); + + // Read buffer, provide socket to read or use default one + int Read( void *buffer, unsigned int nbytes, wxSocketBase* sock = NULL ); + + void Close(); // This will stop listening and disconnect everyone + + void DropClient(wxSocketBase *sock); // This will disconnect chosen client + + void DropClient(wxString ip_port); // This will disconnect chosen client + + + unsigned int Port( unsigned int port = 0 ); // Return current port number (if no arguments) or set new port number (if specified) + + + unsigned int clientCount() { return connectedClients; }; // Returns number of connected clients + + // Connected clients will be stored here along with info + // wxSocketBase* is the actual socket, wxString is human-readable representation of address + std::map clientMap; + + wxTextCtrl *logBox; // Text control to be used as log output (optional) + + + + void OnServerEvent(wxSocketEvent &event); + void OnClientEvent(wxSocketEvent &event); + + void OnRecv(wxSocketBase *sock); + void OnConnLost(wxSocketBase *sock); + + bool IsOk() + { + if (Listener) return Listener->IsOk(); + else return false; + } + + + + + private: + + wxEvtHandler * m_parent; // Parent form + wxWindowID m_id; // ID assigned to current instance of server + + wxSocketServer* Listener; // Server things will be handled here + + unsigned int connectedClients; // Client count is stored here + + unsigned int srvPort; + + void LogServer( wxString logText ); // Log will be printed with this function if required + + + static const long SERVER_ID; // For event handling + static const long CLIENT_ID; // For event handling + DECLARE_EVENT_TABLE() // For event handling + +}; + +#endif // TCPSERVER_H diff --git a/Samples/tcptest/tcptest.cbp b/Samples/tcptest/tcptest.cbp new file mode 100644 index 0000000..5e386db --- /dev/null +++ b/Samples/tcptest/tcptest.cbp @@ -0,0 +1,148 @@ + + + + + + diff --git a/Samples/tcptest/tcptest.depend b/Samples/tcptest/tcptest.depend new file mode 100644 index 0000000..6fadea3 --- /dev/null +++ b/Samples/tcptest/tcptest.depend @@ -0,0 +1,9893 @@ +# depslib dependency file v1.0 +1620913520 source:h:\cblegacy\samples\tcptest\resource.rc + "wx/msw/wx.rc" + +1300793816 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\wx.rc + + + "wx/msw/wince/wince.rc" + "wx/msw/rcdefs.h" + +1300793816 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\wince.rc + + "wx/msw/wince/smartphone.rc" + +1300793816 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\smartphone.rc + + "wx/msw/wince/resources.h" + +1300793816 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\resources.h + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\rcdefs.h + +1699653562 source:h:\cblegacy\samples\tcptest\tcptestapp.cpp + "tcptestApp.h" + "tcptestMain.h" + + +1699653562 h:\cblegacy\samples\tcptest\tcptestapp.h + + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\app.h + "wx/event.h" + "wx/build.h" + "wx/init.h" + "wx/intl.h" + "wx/palmos/app.h" + "wx/msw/app.h" + "wx/motif/app.h" + "wx/mgl/app.h" + "wx/dfb/app.h" + "wx/gtk/app.h" + "wx/gtk1/app.h" + "wx/x11/app.h" + "wx/mac/app.h" + "wx/cocoa/app.h" + "wx/os2/app.h" + "wx/univ/theme.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\event.h + "wx/defs.h" + "wx/cpp.h" + "wx/object.h" + "wx/clntdata.h" + "wx/gdicmn.h" + "wx/cursor.h" + "wx/thread.h" + "wx/dynarray.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\defs.h + "wx/platform.h" + "wx/features.h" + "wx/version.h" + "wx/dlimpexp.h" + "wx/debug.h" + + + + "wx/msw/winundef.h" + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\platform.h + + + + "wx/mac/carbon/config_xcode.h" + "wx/setup.h" + "wx/chkconf.h" + "wx/msw/wince/libraries.h" + "wx/msw/libraries.h" + "wx/msw/gccpriv.h" + + +1664022903 h:\cblegacy\codeblocks\wxmsw-2.8.12\lib\bcc_lib\msw\wx\setup.h + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\chkconf.h + "wx/palmos/chkconf.h" + "wx/msw/wince/chkconf.h" + "wx/msw/chkconf.h" + "wx/mac/chkconf.h" + "wx/os2/chkconf.h" + "wx/mgl/chkconf.h" + "wx/dfb/chkconf.h" + "wx/motif/chkconf.h" + "wx/x11/chkconf.h" + "wx/univ/chkconf.h" + +1300793816 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\chkconf.h + +1300793814 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\chkconf.h + +1300793818 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\chkconf.h + +1300793816 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\libraries.h + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\libraries.h + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\gccpriv.h + <_mingw.h> + + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\features.h + +1300793744 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\version.h + "wx/cpp.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\cpp.h + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\dlimpexp.h + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\debug.h + + + "wx/wxchar.h" + +1300793744 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\wxchar.h + "wx/platform.h" + "wx/dlimpexp.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + +1300793816 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\winundef.h + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\object.h + "wx/memory.h" + "wx/xti.h" + "wx/msw/msvcrt.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\memory.h + "wx/defs.h" + "wx/string.h" + "wx/msgout.h" + + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\string.h + "wx/defs.h" + + + + + + + + + + + + + "wx/wxchar.h" + "wx/buffer.h" + "wx/strconv.h" + "wx/beforestd.h" + + "wx/afterstd.h" + "wx/arrstr.h" + "wx/iosfwrap.h" + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\buffer.h + "wx/wxchar.h" + + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\strconv.h + "wx/defs.h" + "wx/wxchar.h" + "wx/buffer.h" + "typeinfo.h" + + "wx/fontenc.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\fontenc.h + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\beforestd.h + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\afterstd.h + "wx/msw/winundef.h" + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\arrstr.h + "wx/defs.h" + "wx/string.h" + "wx/dynarray.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\dynarray.h + "wx/defs.h" + "wx/beforestd.h" + + + "wx/afterstd.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\iosfwrap.h + + + "wx/msw/winundef.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msgout.h + "wx/defs.h" + "wx/wxchar.h" + +1300793744 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\xti.h + "wx/defs.h" + "wx/memory.h" + "wx/flags.h" + "wx/string.h" + "wx/arrstr.h" + "wx/hashmap.h" + "wx/log.h" + "wx/intl.h" + + "wx/dynarray.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\flags.h + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\hashmap.h + "wx/string.h" + + + + + + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\log.h + "wx/defs.h" + "wx/string.h" + "wx/arrstr.h" + + "wx/dynarray.h" + "wx/iosfwrap.h" + "wx/generic/logg.h" + "wx/cocoa/log.h" + +1300793756 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\generic\logg.h + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\intl.h + "wx/defs.h" + "wx/string.h" + "wx/fontenc.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\msvcrt.h + + + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\clntdata.h + "wx/defs.h" + "wx/string.h" + "wx/hashmap.h" + "wx/vector.h" + +1300793744 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\vector.h + "wx/defs.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\gdicmn.h + "wx/defs.h" + "wx/list.h" + "wx/string.h" + "wx/fontenc.h" + "wx/hashmap.h" + "wx/math.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\list.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/beforestd.h" + + + + "wx/afterstd.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\math.h + "wx/defs.h" + + + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\cursor.h + "wx/defs.h" + "wx/palmos/cursor.h" + "wx/msw/cursor.h" + "wx/motif/cursor.h" + "wx/gtk/cursor.h" + "wx/gtk1/cursor.h" + "wx/x11/cursor.h" + "wx/mgl/cursor.h" + "wx/dfb/cursor.h" + "wx/mac/cursor.h" + "wx/cocoa/cursor.h" + "wx/os2/cursor.h" + "wx/utils.h" + +1300793814 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\cursor.h + "wx/msw/gdiimage.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\gdiimage.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/list.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\gdiobj.h + "wx/object.h" + +1300793744 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\utils.h + "wx/object.h" + "wx/list.h" + "wx/filefn.h" + "wx/gdicmn.h" + "wx/longlong.h" + "wx/platinfo.h" + + + + + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\filefn.h + "wx/list.h" + "wx/arrstr.h" + "wx/msw/wince/time.h" + "wx/msw/private.h" + + + + + + + + + + + + "wx/os2/private.h" + + + + + + + + + + + + + + + + + + + +1300793816 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\time.h + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\private.h + "wx/msw/wrapwin.h" + "wx/msw/microwin.h" + "wx/log.h" + "wx/gdicmn.h" + "wx/colour.h" + +1300793816 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\wrapwin.h + "wx/platform.h" + + "wx/msw/winundef.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\microwin.h + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\colour.h + "wx/defs.h" + "wx/gdiobj.h" + "wx/variant.h" + "wx/generic/colour.h" + "wx/msw/colour.h" + "wx/motif/colour.h" + "wx/gtk/colour.h" + "wx/gtk1/colour.h" + "wx/generic/colour.h" + "wx/generic/colour.h" + "wx/x11/colour.h" + "wx/mac/colour.h" + "wx/cocoa/colour.h" + "wx/os2/colour.h" + +1300793744 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\variant.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/arrstr.h" + "wx/list.h" + "wx/cpp.h" + "wx/datetime.h" + "wx/db.h" + "wx/iosfwrap.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\datetime.h + "wx/defs.h" + + "wx/msw/wince/time.h" + + "wx/longlong.h" + "wx/dynarray.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\longlong.h + "wx/defs.h" + "wx/string.h" + + "wx/iosfwrap.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\db.h + "wx/defs.h" + "wx/string.h" + + "wx/msw/wrapwin.h" + "sql.h" + "sqlext.h" + "odbcinst.h" + "wx/msw/wrapwin.h" + "wx/isql.h" + "wx/isqlext.h" + + + + + "wx/object.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\isql.h + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\isqlext.h + "wx/isql.h" + +1300793756 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\generic\colour.h + "wx/object.h" + +1300793814 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\colour.h + "wx/object.h" + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\platinfo.h + "wx/string.h" + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\thread.h + "wx/defs.h" + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\build.h + "wx/version.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\init.h + "wx/defs.h" + "wx/wxchar.h" + +1300793814 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\app.h + "wx/event.h" + "wx/icon.h" + "wx/msw/wrapwin.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\icon.h + "wx/iconloc.h" + "wx/generic/icon.h" + "wx/msw/icon.h" + "wx/motif/icon.h" + "wx/generic/icon.h" + "wx/generic/icon.h" + "wx/generic/icon.h" + "wx/generic/icon.h" + "wx/generic/icon.h" + "wx/mac/icon.h" + "wx/cocoa/icon.h" + "wx/os2/icon.h" + "wx/variant.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\iconloc.h + "wx/string.h" + +1300793756 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\generic\icon.h + "wx/bitmap.h" + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\bitmap.h + "wx/string.h" + "wx/gdicmn.h" + "wx/colour.h" + "wx/variant.h" + "wx/palmos/bitmap.h" + "wx/msw/bitmap.h" + "wx/x11/bitmap.h" + "wx/gtk/bitmap.h" + "wx/gtk1/bitmap.h" + "wx/x11/bitmap.h" + "wx/mgl/bitmap.h" + "wx/dfb/bitmap.h" + "wx/mac/bitmap.h" + "wx/cocoa/bitmap.h" + "wx/os2/bitmap.h" + "wx/generic/mask.h" + +1300793814 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\bitmap.h + "wx/msw/gdiimage.h" + "wx/palette.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\palette.h + "wx/defs.h" + "wx/object.h" + "wx/gdiobj.h" + "wx/palmos/palette.h" + "wx/msw/palette.h" + "wx/motif/palette.h" + "wx/generic/paletteg.h" + "wx/x11/palette.h" + "wx/mgl/palette.h" + "wx/mac/palette.h" + "wx/os2/palette.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\palette.h + "wx/gdiobj.h" + +1300793756 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\generic\paletteg.h + "wx/defs.h" + "wx/object.h" + "wx/gdiobj.h" + "wx/gdicmn.h" + +1300793756 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\generic\mask.h + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\icon.h + "wx/msw/gdiimage.h" + +1300793819 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\theme.h + "wx/string.h" + +1699705966 h:\cblegacy\samples\tcptest\tcptestmain.h + + + + + + + + + + + + + "tcpserver.h" + "tcpclient.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\frame.h + "wx/toplevel.h" + "wx/univ/frame.h" + "wx/palmos/frame.h" + "wx/msw/frame.h" + "wx/gtk/frame.h" + "wx/gtk1/frame.h" + "wx/motif/frame.h" + "wx/mac/frame.h" + "wx/cocoa/frame.h" + "wx/os2/frame.h" + +1300793744 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\toplevel.h + "wx/window.h" + "wx/iconbndl.h" + "wx/palmos/toplevel.h" + "wx/msw/toplevel.h" + "wx/gtk/toplevel.h" + "wx/gtk1/toplevel.h" + "wx/x11/toplevel.h" + "wx/mgl/toplevel.h" + "wx/dfb/toplevel.h" + "wx/mac/toplevel.h" + "wx/cocoa/toplevel.h" + "wx/os2/toplevel.h" + "wx/motif/toplevel.h" + "wx/univ/toplevel.h" + +1300793744 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\window.h + "wx/event.h" + "wx/list.h" + "wx/cursor.h" + "wx/font.h" + "wx/colour.h" + "wx/region.h" + "wx/utils.h" + "wx/intl.h" + "wx/validate.h" + "wx/palette.h" + "wx/accel.h" + "wx/access.h" + "wx/palmos/window.h" + "wx/msw/window.h" + "wx/motif/window.h" + "wx/gtk/window.h" + "wx/gtk1/window.h" + "wx/x11/window.h" + "wx/mgl/window.h" + "wx/dfb/window.h" + "wx/mac/window.h" + "wx/cocoa/window.h" + "wx/os2/window.h" + "wx/univ/window.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\font.h + "wx/defs.h" + "wx/fontenc.h" + "wx/gdiobj.h" + "wx/palmos/font.h" + "wx/msw/font.h" + "wx/motif/font.h" + "wx/gtk/font.h" + "wx/gtk1/font.h" + "wx/x11/font.h" + "wx/mgl/font.h" + "wx/dfb/font.h" + "wx/mac/font.h" + "wx/cocoa/font.h" + "wx/os2/font.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\font.h + "wx/gdicmn.h" + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\region.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/palmos/region.h" + "wx/msw/region.h" + "wx/gtk/region.h" + "wx/gtk1/region.h" + "wx/x11/region.h" + "wx/mgl/region.h" + "wx/dfb/region.h" + "wx/mac/region.h" + "wx/cocoa/region.h" + "wx/os2/region.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\region.h + +1300793744 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\validate.h + "wx/defs.h" + "wx/event.h" + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\accel.h + "wx/defs.h" + "wx/object.h" + "wx/generic/accel.h" + "wx/msw/accel.h" + "wx/motif/accel.h" + "wx/gtk/accel.h" + "wx/gtk1/accel.h" + "wx/mac/accel.h" + "wx/generic/accel.h" + "wx/os2/accel.h" + +1300793756 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\generic\accel.h + +1300793814 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\accel.h + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\access.h + "wx/defs.h" + "wx/variant.h" + "wx/msw/ole/access.h" + +1300793816 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\ole\access.h + +1300793816 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\window.h + "wx/hash.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\hash.h + "wx/defs.h" + "wx/object.h" + "wx/list.h" + "wx/dynarray.h" + +1300793819 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\window.h + "wx/bitmap.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\iconbndl.h + "wx/dynarray.h" + "wx/gdicmn.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\toplevel.h + +1300793819 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\toplevel.h + "wx/univ/inpcons.h" + "wx/univ/inphand.h" + "wx/icon.h" + +1300793818 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\inpcons.h + "wx/object.h" + "wx/event.h" + +1300793818 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\inphand.h + "wx/univ/inpcons.h" + +1300793818 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\frame.h + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\frame.h + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\listbox.h + "wx/defs.h" + "wx/ctrlsub.h" + "wx/univ/listbox.h" + "wx/msw/listbox.h" + "wx/motif/listbox.h" + "wx/gtk/listbox.h" + "wx/gtk1/listbox.h" + "wx/mac/listbox.h" + "wx/os2/listbox.h" + "wx/cocoa/listbox.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\ctrlsub.h + "wx/defs.h" + "wx/control.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\control.h + "wx/defs.h" + "wx/window.h" + "wx/univ/control.h" + "wx/palmos/control.h" + "wx/msw/control.h" + "wx/motif/control.h" + "wx/gtk/control.h" + "wx/gtk1/control.h" + "wx/mac/control.h" + "wx/cocoa/control.h" + "wx/os2/control.h" + +1300793818 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\control.h + "wx/univ/inphand.h" + "wx/univ/inpcons.h" + +1300793814 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\control.h + "wx/dynarray.h" + +1300793818 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\listbox.h + "wx/scrolwin.h" + "wx/dynarray.h" + "wx/arrstr.h" + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\scrolwin.h + "wx/panel.h" + "wx/gtk/scrolwin.h" + "wx/gtk1/scrolwin.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\panel.h + "wx/generic/panelg.h" + +1300793756 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\generic\panelg.h + "wx/window.h" + "wx/containr.h" + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\containr.h + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\listbox.h + "wx/dynarray.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\menu.h + "wx/defs.h" + "wx/list.h" + "wx/window.h" + "wx/menuitem.h" + "wx/univ/menu.h" + "wx/palmos/menu.h" + "wx/msw/menu.h" + "wx/motif/menu.h" + "wx/gtk/menu.h" + "wx/gtk1/menu.h" + "wx/mac/menu.h" + "wx/cocoa/menu.h" + "wx/os2/menu.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\menuitem.h + "wx/defs.h" + "wx/object.h" + "wx/univ/menuitem.h" + "wx/palmos/menuitem.h" + "wx/msw/menuitem.h" + "wx/motif/menuitem.h" + "wx/gtk/menuitem.h" + "wx/gtk1/menuitem.h" + "wx/mac/menuitem.h" + "wx/cocoa/menuitem.h" + "wx/os2/menuitem.h" + +1300793818 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\menuitem.h + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\menuitem.h + "wx/ownerdrw.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\ownerdrw.h + "wx/defs.h" + "wx/bitmap.h" + "wx/colour.h" + "wx/font.h" + +1300793818 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\menu.h + "wx/accel.h" + "wx/dynarray.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\menu.h + "wx/accel.h" + "wx/dynarray.h" + "wx/arrstr.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\notebook.h + "wx/defs.h" + "wx/bookctrl.h" + "wx/univ/notebook.h" + "wx/msw/notebook.h" + "wx/generic/notebook.h" + "wx/gtk/notebook.h" + "wx/gtk1/notebook.h" + "wx/mac/notebook.h" + "wx/cocoa/notebook.h" + "wx/os2/notebook.h" + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\bookctrl.h + "wx/defs.h" + "wx/control.h" + "wx/dynarray.h" + "wx/notebook.h" + "wx/choicebk.h" + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\choicebk.h + "wx/defs.h" + "wx/bookctrl.h" + "wx/choice.h" + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\choice.h + "wx/defs.h" + "wx/ctrlsub.h" + "wx/univ/choice.h" + "wx/msw/wince/choicece.h" + "wx/msw/choice.h" + "wx/motif/choice.h" + "wx/gtk/choice.h" + "wx/gtk1/choice.h" + "wx/mac/choice.h" + "wx/cocoa/choice.h" + "wx/os2/choice.h" + +1300793818 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\choice.h + "wx/combobox.h" + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\combobox.h + "wx/defs.h" + "wx/textctrl.h" + "wx/ctrlsub.h" + "wx/univ/combobox.h" + "wx/msw/combobox.h" + "wx/motif/combobox.h" + "wx/gtk/combobox.h" + "wx/gtk1/combobox.h" + "wx/mac/combobox.h" + "wx/cocoa/combobox.h" + "wx/os2/combobox.h" + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\textctrl.h + "wx/defs.h" + "wx/control.h" + "wx/dynarray.h" + "wx/gdicmn.h" + "wx/ioswrap.h" + "wx/x11/textctrl.h" + "wx/univ/textctrl.h" + "wx/msw/wince/textctrlce.h" + "wx/msw/textctrl.h" + "wx/motif/textctrl.h" + "wx/gtk/textctrl.h" + "wx/gtk1/textctrl.h" + "wx/mac/textctrl.h" + "wx/cocoa/textctrl.h" + "wx/os2/textctrl.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\ioswrap.h + + + "wx/msw/winundef.h" + +1300793819 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\textctrl.h + "wx/scrolwin.h" + "wx/univ/inphand.h" + +1300793816 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\textctrlce.h + "wx/dynarray.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\textctrl.h + +1300793818 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\combobox.h + "wx/combo.h" + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\combo.h + "wx/defs.h" + "wx/control.h" + "wx/renderer.h" + "wx/bitmap.h" + "wx/msw/combo.h" + "wx/generic/combo.h" + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\renderer.h + "wx/gdicmn.h" + "wx/colour.h" + "wx/font.h" + "wx/bitmap.h" + "wx/string.h" + +1300793814 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\combo.h + "wx/timer.h" + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\timer.h + "wx/defs.h" + "wx/object.h" + "wx/longlong.h" + "wx/event.h" + "wx/stopwatch.h" + "wx/window.h" + "wx/msw/timer.h" + "wx/motif/timer.h" + "wx/gtk/timer.h" + "wx/gtk1/timer.h" + "wx/generic/timer.h" + "wx/cocoa/timer.h" + "wx/mac/timer.h" + "wx/os2/timer.h" + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\stopwatch.h + "wx/defs.h" + "wx/longlong.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\timer.h + +1300793756 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\generic\timer.h + +1300793756 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\generic\combo.h + +1300793814 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\combobox.h + "wx/choice.h" + +1300793816 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\choicece.h + "wx/defs.h" + "wx/dynarray.h" + +1300793814 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\choice.h + +1300793818 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\notebook.h + "wx/arrstr.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\notebook.h + "wx/control.h" + +1300793756 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\generic\notebook.h + "wx/event.h" + "wx/control.h" + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\sizer.h + "wx/defs.h" + "wx/window.h" + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\stattext.h + "wx/defs.h" + "wx/control.h" + "wx/univ/stattext.h" + "wx/msw/stattext.h" + "wx/motif/stattext.h" + "wx/gtk/stattext.h" + "wx/gtk1/stattext.h" + "wx/mac/stattext.h" + "wx/cocoa/stattext.h" + "wx/os2/stattext.h" + "wx/palmos/stattext.h" + +1300793819 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\stattext.h + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\stattext.h + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\statusbr.h + "wx/defs.h" + "wx/window.h" + "wx/list.h" + "wx/dynarray.h" + "wx/univ/statusbr.h" + "wx/palmos/statusbr.h" + "wx/msw/statbr95.h" + "wx/generic/statusbr.h" + "wx/mac/statusbr.h" + "wx/generic/statusbr.h" + +1300793819 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\statusbr.h + "wx/univ/inpcons.h" + "wx/arrstr.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\statbr95.h + +1300793756 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\generic\statusbr.h + "wx/defs.h" + "wx/pen.h" + "wx/arrstr.h" + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\pen.h + "wx/defs.h" + "wx/palmos/pen.h" + "wx/msw/pen.h" + "wx/x11/pen.h" + "wx/gtk/pen.h" + "wx/gtk1/pen.h" + "wx/mgl/pen.h" + "wx/dfb/pen.h" + "wx/mac/pen.h" + "wx/cocoa/pen.h" + "wx/os2/pen.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\pen.h + "wx/gdiobj.h" + "wx/bitmap.h" + "wx/colour.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\image.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdicmn.h" + "wx/hashmap.h" + "wx/stream.h" + "wx/variant.h" + "wx/imagbmp.h" + "wx/imagpng.h" + "wx/imaggif.h" + "wx/imagpcx.h" + "wx/imagjpeg.h" + "wx/imagtga.h" + "wx/imagtiff.h" + "wx/imagpnm.h" + "wx/imagxpm.h" + "wx/imagiff.h" + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\stream.h + "wx/defs.h" + + "wx/object.h" + "wx/string.h" + "wx/filefn.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\imagbmp.h + "wx/image.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\imagpng.h + "wx/defs.h" + "wx/image.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\imaggif.h + "wx/image.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\imagpcx.h + "wx/image.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\imagjpeg.h + "wx/defs.h" + "wx/image.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\imagtga.h + "wx/image.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\imagtiff.h + "wx/defs.h" + "wx/image.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\imagpnm.h + "wx/image.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\imagxpm.h + "wx/image.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\imagiff.h + "wx/image.h" + +1699706597 source:h:\cblegacy\samples\tcptest\tcptestmain.cpp + "tcptestMain.h" + + + + + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msgdlg.h + "wx/defs.h" + "wx/generic/msgdlgg.h" + "wx/generic/msgdlgg.h" + "wx/palmos/msgdlg.h" + "wx/msw/msgdlg.h" + "wx/motif/msgdlg.h" + "wx/gtk/msgdlg.h" + "wx/generic/msgdlgg.h" + "wx/generic/msgdlgg.h" + "wx/mac/msgdlg.h" + "wx/cocoa/msgdlg.h" + "wx/os2/msgdlg.h" + +1300793756 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\generic\msgdlgg.h + "wx/defs.h" + "wx/dialog.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\dialog.h + "wx/defs.h" + "wx/containr.h" + "wx/toplevel.h" + "wx/univ/dialog.h" + "wx/palmos/dialog.h" + "wx/msw/dialog.h" + "wx/motif/dialog.h" + "wx/gtk/dialog.h" + "wx/gtk1/dialog.h" + "wx/mac/dialog.h" + "wx/cocoa/dialog.h" + "wx/os2/dialog.h" + +1300793818 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\dialog.h + +1300793814 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\dialog.h + "wx/panel.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\msgdlg.h + "wx/defs.h" + "wx/dialog.h" + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\settings.h + "wx/colour.h" + "wx/font.h" + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\button.h + "wx/defs.h" + "wx/control.h" + "wx/univ/button.h" + "wx/msw/button.h" + "wx/motif/button.h" + "wx/gtk/button.h" + "wx/gtk1/button.h" + "wx/mac/button.h" + "wx/cocoa/button.h" + "wx/os2/button.h" + "wx/palmos/button.h" + +1300793818 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\button.h + "wx/bitmap.h" + +1300793814 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\button.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\wx.rc + + "wx/msw/wince/wince.rc" + "wx/msw/rcdefs.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\wince.rc + + "wx/msw/wince/resources.h" + "wx/msw/wince/smartphone.rc" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\resources.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\smartphone.rc + + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\rcdefs.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\app.h + "wx/event.h" + "wx/eventfilter.h" + "wx/build.h" + "wx/cmdargs.h" + "wx/init.h" + "wx/intl.h" + "wx/log.h" + "wx/unix/app.h" + "wx/msw/app.h" + "wx/motif/app.h" + "wx/dfb/app.h" + "wx/gtk/app.h" + "wx/gtk1/app.h" + "wx/x11/app.h" + "wx/osx/app.h" + "wx/cocoa/app.h" + "wx/os2/app.h" + "wx/univ/theme.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\event.h + "wx/defs.h" + "wx/cpp.h" + "wx/object.h" + "wx/clntdata.h" + "wx/gdicmn.h" + "wx/cursor.h" + "wx/mousestate.h" + "wx/dynarray.h" + "wx/thread.h" + "wx/tracker.h" + "wx/typeinfo.h" + "wx/any.h" + "wx/meta/convertible.h" + "wx/meta/removeref.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\defs.h + "wx/platform.h" + "wx/version.h" + "wx/dlimpexp.h" + + "wx/debug.h" + + + "wx/windowid.h" + + "wx/msw/winundef.h" + "wx/features.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\platform.h + + + + "wx/osx/config_xcode.h" + "wx/android/config_android.h" + "wx/compiler.h" + "wx/setup.h" + "wx/msw/wince/libraries.h" + "wx/msw/libraries.h" + "wx/msw/gccpriv.h" + + + "wx/chkconf.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\config_xcode.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\android\config_android.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\compiler.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\lib\gcc_lib\mswu\wx\setup.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\libraries.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\libraries.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\gccpriv.h + <_mingw.h> + + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\chkconf.h + "wx/msw/wince/chkconf.h" + "wx/msw/chkconf.h" + "wx/gtk/chkconf.h" + "wx/gtk/chkconf.h" + "wx/cocoa/chkconf.h" + "wx/osx/chkconf.h" + "wx/os2/chkconf.h" + "wx/dfb/chkconf.h" + "wx/motif/chkconf.h" + "wx/x11/chkconf.h" + "wx/android/chkconf.h" + "wx/unix/chkconf.h" + "wx/univ/chkconf.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\chkconf.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\chkconf.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\chkconf.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\chkconf.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\chkconf.h + "wx/osx/iphone/chkconf.h" + "wx/osx/carbon/chkconf.h" + "wx/osx/cocoa/chkconf.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\iphone\chkconf.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\carbon\chkconf.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\cocoa\chkconf.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\chkconf.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dfb\chkconf.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\chkconf.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\x11\chkconf.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\android\chkconf.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\unix\chkconf.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\chkconf.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\version.h + "wx/cpp.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cpp.h + "wx/compiler.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dlimpexp.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\debug.h + + + "wx/chartype.h" + "wx/cpp.h" + "wx/dlimpexp.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\chartype.h + "wx/platform.h" + + + + + + + + + + + + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\windowid.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\winundef.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\features.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\object.h + "wx/memory.h" + "wx/xti.h" + "wx/rtti.h" + "wx/xti2.h" + "wx/msw/msvcrt.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\memory.h + "wx/defs.h" + "wx/string.h" + "wx/msgout.h" + + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\string.h + "wx/defs.h" + + + + + + + + + + + "wx/wxcrtbase.h" + "wx/strvararg.h" + "wx/buffer.h" + "wx/strconv.h" + "wx/stringimpl.h" + "wx/stringops.h" + "wx/unichar.h" + "wx/tls.h" + "wx/iosfwrap.h" + "wx/crt.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\wxcrtbase.h + "wx/chartype.h" + + + + + + + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\strvararg.h + "wx/platform.h" + "wx/cpp.h" + "wx/chartype.h" + "wx/strconv.h" + "wx/buffer.h" + "wx/unichar.h" + + + + "wx/stringimpl.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\strconv.h + "wx/defs.h" + "wx/chartype.h" + "wx/buffer.h" + "typeinfo.h" + + "wx/fontenc.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\buffer.h + "wx/chartype.h" + "wx/wxcrtbase.h" + + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\typeinfo.h + "wx/defs.h" + + + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\fontenc.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\unichar.h + "wx/defs.h" + "wx/chartype.h" + "wx/stringimpl.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\stringimpl.h + "wx/defs.h" + "wx/chartype.h" + "wx/wxcrtbase.h" + + "wx/beforestd.h" + + "wx/afterstd.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\beforestd.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\afterstd.h + "wx/msw/winundef.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\stringops.h + "wx/chartype.h" + "wx/stringimpl.h" + "wx/unichar.h" + "wx/buffer.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\tls.h + "wx/defs.h" + "wx/msw/tls.h" + "wx/os2/tls.h" + "wx/unix/tls.h" + + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\tls.h + "wx/msw/wrapwin.h" + "wx/thread.h" + "wx/vector.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\wrapwin.h + "wx/platform.h" + + + "wx/msw/winundef.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\thread.h + "wx/defs.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\vector.h + "wx/defs.h" + + + "wx/scopeguard.h" + "wx/meta/movable.h" + "wx/meta/if.h" + "wx/beforestd.h" + + "wx/afterstd.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\scopeguard.h + "wx/defs.h" + "wx/except.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\except.h + "wx/defs.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\meta\movable.h + "wx/meta/pod.h" + "wx/string.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\meta\pod.h + "wx/defs.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\meta\if.h + "wx/defs.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\tls.h + "wx/os2/private.h" + "wx/thread.h" + "wx/vector.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\private.h + + + + + + + + "wx/dlimpexp.h" + "wx/fontenc.h" + "wx/thread.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\unix\tls.h + + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\iosfwrap.h + + + "wx/msw/winundef.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\crt.h + "wx/defs.h" + "wx/chartype.h" + "wx/wxcrt.h" + "wx/wxcrtvararg.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\wxcrt.h + "wx/wxcrtbase.h" + "wx/string.h" + + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\wxcrtvararg.h + "wx/wxcrt.h" + "wx/strvararg.h" + "wx/string.h" + + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msgout.h + "wx/defs.h" + "wx/chartype.h" + "wx/strvararg.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\xti.h + "wx/defs.h" + "wx/xtitypes.h" + "wx/xtihandler.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\xtitypes.h + "wx/defs.h" + "wx/string.h" + "wx/hashmap.h" + "wx/arrstr.h" + "wx/flags.h" + "wx/intl.h" + "wx/log.h" + + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\hashmap.h + "wx/string.h" + "wx/wxcrt.h" + + + + + + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\arrstr.h + "wx/defs.h" + "wx/string.h" + "wx/dynarray.h" + "wx/beforestd.h" + + "wx/afterstd.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dynarray.h + "wx/defs.h" + "wx/beforestd.h" + + + "wx/afterstd.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\flags.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\intl.h + "wx/defs.h" + "wx/string.h" + "wx/translation.h" + "wx/fontenc.h" + "wx/language.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\translation.h + "wx/defs.h" + "wx/string.h" + "wx/buffer.h" + "wx/language.h" + "wx/hashmap.h" + "wx/strconv.h" + "wx/scopedptr.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\language.h + "wx/defs.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\scopedptr.h + "wx/defs.h" + "wx/checkeddelete.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\checkeddelete.h + "wx/cpp.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\log.h + "wx/defs.h" + "wx/cpp.h" + "wx/string.h" + "wx/strvararg.h" + "wx/arrstr.h" + + "wx/dynarray.h" + "wx/hashmap.h" + "wx/thread.h" + "wx/iosfwrap.h" + "wx/generic/logg.h" + "wx/cocoa/log.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\logg.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\log.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\xtihandler.h + "wx/defs.h" + "wx/xti.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\rtti.h + "wx/memory.h" + "wx/flags.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\xti2.h + "wx/xtiprop.h" + "wx/xtictor.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\xtiprop.h + "wx/defs.h" + "wx/xti.h" + "wx/any.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\any.h + "wx/defs.h" + + "wx/string.h" + "wx/meta/if.h" + "wx/typeinfo.h" + "wx/list.h" + "wx/datetime.h" + "wx/variant.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\list.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/vector.h" + "wx/beforestd.h" + + + + "wx/afterstd.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\datetime.h + "wx/defs.h" + "wx/msw/wince/time.h" + + + "wx/longlong.h" + "wx/anystr.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\time.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\longlong.h + "wx/defs.h" + "wx/string.h" + + "wx/iosfwrap.h" + + "wx/strvararg.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\anystr.h + "wx/string.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\variant.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/arrstr.h" + "wx/list.h" + "wx/cpp.h" + "wx/longlong.h" + "wx/datetime.h" + "wx/iosfwrap.h" + "wx/any.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\xtictor.h + "wx/defs.h" + "wx/xti.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\msvcrt.h + + + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\clntdata.h + "wx/defs.h" + "wx/string.h" + "wx/hashmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gdicmn.h + "wx/defs.h" + "wx/list.h" + "wx/string.h" + "wx/fontenc.h" + "wx/hashmap.h" + "wx/math.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\math.h + "wx/defs.h" + + + + + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cursor.h + "wx/defs.h" + "wx/msw/cursor.h" + "wx/motif/cursor.h" + "wx/gtk/cursor.h" + "wx/gtk1/cursor.h" + "wx/x11/cursor.h" + "wx/dfb/cursor.h" + "wx/osx/cursor.h" + "wx/cocoa/cursor.h" + "wx/os2/cursor.h" + "wx/utils.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\cursor.h + "wx/msw/gdiimage.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\gdiimage.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/list.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gdiobj.h + "wx/object.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\cursor.h + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\cursor.h + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\cursor.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/image.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\image.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdicmn.h" + "wx/hashmap.h" + "wx/arrstr.h" + "wx/stream.h" + "wx/variant.h" + "wx/imagbmp.h" + "wx/imagpng.h" + "wx/imaggif.h" + "wx/imagpcx.h" + "wx/imagjpeg.h" + "wx/imagtga.h" + "wx/imagtiff.h" + "wx/imagpnm.h" + "wx/imagxpm.h" + "wx/imagiff.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\stream.h + "wx/defs.h" + + "wx/object.h" + "wx/string.h" + "wx/filefn.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\filefn.h + "wx/list.h" + "wx/arrstr.h" + "wx/msw/wince/time.h" + "wx/msw/private.h" + + + + + "wx/os2/private.h" + + + + + + + + + + + + + + + + + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\private.h + "wx/msw/wrapwin.h" + "wx/msw/microwin.h" + "wx/log.h" + "wx/window.h" + "wx/gdicmn.h" + "wx/colour.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\microwin.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\window.h + "wx/event.h" + "wx/list.h" + "wx/cursor.h" + "wx/font.h" + "wx/colour.h" + "wx/region.h" + "wx/utils.h" + "wx/intl.h" + "wx/validate.h" + "wx/palette.h" + "wx/accel.h" + "wx/access.h" + "wx/msw/window.h" + "wx/motif/window.h" + "wx/gtk/window.h" + "wx/gtk1/window.h" + "wx/x11/window.h" + "wx/dfb/window.h" + "wx/osx/window.h" + "wx/cocoa/window.h" + "wx/os2/window.h" + "wx/univ/window.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\font.h + "wx/defs.h" + "wx/fontenc.h" + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/msw/font.h" + "wx/motif/font.h" + "wx/gtk/font.h" + "wx/gtk1/font.h" + "wx/x11/font.h" + "wx/dfb/font.h" + "wx/osx/font.h" + "wx/cocoa/font.h" + "wx/os2/font.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\font.h + "wx/gdicmn.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\font.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\font.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\font.h + "wx/hash.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\hash.h + "wx/defs.h" + "wx/string.h" + "wx/object.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\x11\font.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dfb\font.h + "wx/dfb/dfbptr.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dfb\dfbptr.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\font.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\font.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\font.h + "wx/gdiobj.h" + "wx/os2/private.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\colour.h + "wx/defs.h" + "wx/gdiobj.h" + "wx/variant.h" + "wx/msw/colour.h" + "wx/motif/colour.h" + "wx/gtk/colour.h" + "wx/gtk1/colour.h" + "wx/generic/colour.h" + "wx/x11/colour.h" + "wx/osx/colour.h" + "wx/cocoa/colour.h" + "wx/os2/colour.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\colour.h + "wx/object.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\colour.h + "wx/object.h" + "wx/string.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\colour.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\colour.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdiobj.h" + "wx/palette.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\palette.h + "wx/defs.h" + "wx/object.h" + "wx/gdiobj.h" + "wx/msw/palette.h" + "wx/x11/palette.h" + "wx/generic/paletteg.h" + "wx/osx/palette.h" + "wx/os2/palette.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\palette.h + "wx/gdiobj.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\x11\palette.h + "wx/list.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\paletteg.h + "wx/defs.h" + "wx/object.h" + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\palette.h + "wx/gdiobj.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\palette.h + "wx/gdiobj.h" + "wx/os2/private.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\colour.h + "wx/object.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\x11\colour.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdiobj.h" + "wx/palette.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\colour.h + "wx/osx/core/colour.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\core\colour.h + "wx/object.h" + "wx/string.h" + "wx/osx/core/cfref.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\core\cfref.h + + + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\colour.h + "wx/object.h" + "wx/string.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\colour.h + "wx/object.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\region.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/msw/region.h" + "wx/gtk/region.h" + "wx/gtk1/region.h" + "wx/x11/region.h" + "wx/dfb/region.h" + "wx/osx/region.h" + "wx/cocoa/region.h" + "wx/os2/region.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\region.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\region.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\region.h + "wx/list.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\x11\region.h + "wx/list.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dfb\region.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\region.h + "wx/osx/carbon/region.h" + "wx/generic/region.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\carbon\region.h + "wx/list.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\region.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\region.h + "wx/generic/region.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\region.h + "wx/list.h" + "wx/os2/private.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\utils.h + "wx/object.h" + "wx/list.h" + "wx/filefn.h" + "wx/hashmap.h" + "wx/versioninfo.h" + "wx/meta/implicitconversion.h" + "wx/gdicmn.h" + "wx/mousestate.h" + "wx/longlong.h" + "wx/platinfo.h" + + + + + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\versioninfo.h + "wx/string.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\meta\implicitconversion.h + "wx/defs.h" + "wx/meta/if.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\mousestate.h + "wx/gdicmn.h" + "wx/kbdstate.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\kbdstate.h + "wx/defs.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\platinfo.h + "wx/string.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\validate.h + "wx/defs.h" + "wx/event.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\accel.h + "wx/defs.h" + "wx/object.h" + "wx/generic/accel.h" + "wx/msw/accel.h" + "wx/motif/accel.h" + "wx/gtk/accel.h" + "wx/gtk1/accel.h" + "wx/osx/accel.h" + "wx/generic/accel.h" + "wx/os2/accel.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\accel.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\accel.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\accel.h + "wx/object.h" + "wx/string.h" + "wx/event.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\accel.h + "wx/generic/accel.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\accel.h + "wx/generic/accel.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\accel.h + "wx/string.h" + "wx/event.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\accel.h + "wx/object.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\access.h + "wx/defs.h" + "wx/variant.h" + "wx/msw/ole/access.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\ole\access.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\window.h + "wx/settings.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\settings.h + "wx/colour.h" + "wx/font.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\window.h + "wx/region.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\window.h + "wx/dynarray.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\window.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\x11\window.h + "wx/region.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dfb\window.h + "wx/dfb/dfbptr.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\window.h + "wx/brush.h" + "wx/dc.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\brush.h + "wx/defs.h" + "wx/object.h" + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/msw/brush.h" + "wx/x11/brush.h" + "wx/gtk/brush.h" + "wx/gtk1/brush.h" + "wx/dfb/brush.h" + "wx/osx/brush.h" + "wx/cocoa/brush.h" + "wx/os2/brush.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\brush.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\x11\brush.h + "wx/gdiobj.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\brush.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\brush.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdiobj.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\bitmap.h + "wx/string.h" + "wx/gdicmn.h" + "wx/colour.h" + "wx/image.h" + "wx/variant.h" + "wx/msw/bitmap.h" + "wx/x11/bitmap.h" + "wx/gtk/bitmap.h" + "wx/gtk1/bitmap.h" + "wx/x11/bitmap.h" + "wx/dfb/bitmap.h" + "wx/osx/bitmap.h" + "wx/cocoa/bitmap.h" + "wx/os2/bitmap.h" + "wx/generic/mask.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\bitmap.h + "wx/msw/gdiimage.h" + "wx/math.h" + "wx/palette.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\x11\bitmap.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/palette.h" + "wx/gdiobj.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\bitmap.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\bitmap.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/palette.h" + "wx/gdiobj.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dfb\bitmap.h + "wx/dfb/dfbptr.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\bitmap.h + "wx/palette.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\bitmap.h + "wx/palette.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\bitmap.h + "wx/os2/private.h" + "wx/os2/gdiimage.h" + "wx/gdicmn.h" + "wx/palette.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\gdiimage.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/list.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\mask.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dfb\brush.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdiobj.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\brush.h + "wx/gdicmn.h" + "wx/gdiobj.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\brush.h + "wx/gdicmn.h" + "wx/gdiobj.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\brush.h + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dc.h + "wx/object.h" + "wx/intl.h" + "wx/cursor.h" + "wx/font.h" + "wx/colour.h" + "wx/bitmap.h" + "wx/brush.h" + "wx/pen.h" + "wx/palette.h" + "wx/dynarray.h" + "wx/math.h" + "wx/image.h" + "wx/region.h" + "wx/affinematrix2d.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\pen.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/msw/pen.h" + "wx/x11/pen.h" + "wx/gtk/pen.h" + "wx/gtk1/pen.h" + "wx/dfb/pen.h" + "wx/osx/pen.h" + "wx/cocoa/pen.h" + "wx/os2/pen.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\pen.h + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\x11\pen.h + "wx/gdicmn.h" + "wx/gdiobj.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\pen.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\pen.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dfb\pen.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\pen.h + "wx/gdiobj.h" + "wx/colour.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\pen.h + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\pen.h + "wx/gdiobj.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\affinematrix2d.h + "wx/defs.h" + "wx/affinematrix2dbase.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\affinematrix2dbase.h + "wx/defs.h" + "wx/geometry.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\geometry.h + "wx/defs.h" + "wx/utils.h" + "wx/gdicmn.h" + "wx/math.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\window.h + "wx/cocoa/NSView.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nsview.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\objcassociate.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\window.h + + "wx/hash.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\window.h + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\imagbmp.h + "wx/image.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\imagpng.h + "wx/defs.h" + "wx/image.h" + "wx/versioninfo.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\imaggif.h + "wx/image.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\imagpcx.h + "wx/image.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\imagjpeg.h + "wx/defs.h" + "wx/image.h" + "wx/versioninfo.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\imagtga.h + "wx/image.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\imagtiff.h + "wx/defs.h" + "wx/image.h" + "wx/versioninfo.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\imagpnm.h + "wx/image.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\imagxpm.h + "wx/image.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\imagiff.h + "wx/image.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\x11\cursor.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/colour.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dfb\cursor.h + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\cursor.h + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\cursor.h + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\cursor.h + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\tracker.h + "wx/defs.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\meta\convertible.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\meta\removeref.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\eventfilter.h + "wx/defs.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\build.h + "wx/version.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cmdargs.h + "wx/arrstr.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\init.h + "wx/defs.h" + "wx/chartype.h" + "wx/msw/init.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\init.h + "wx/msw/wrapwin.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\unix\app.h + + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\app.h + "wx/event.h" + "wx/icon.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\icon.h + "wx/iconloc.h" + "wx/msw/icon.h" + "wx/motif/icon.h" + "wx/generic/icon.h" + "wx/generic/icon.h" + "wx/generic/icon.h" + "wx/generic/icon.h" + "wx/osx/icon.h" + "wx/generic/icon.h" + "wx/cocoa/icon.h" + "wx/os2/icon.h" + "wx/variant.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\iconloc.h + "wx/string.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\icon.h + "wx/msw/gdiimage.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\icon.h + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\icon.h + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\icon.h + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\icon.h + "wx/gdicmn.h" + "wx/gdiobj.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\icon.h + "wx/bitmap.h" + "wx/os2/gdiimage.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\app.h + "wx/event.h" + "wx/hashmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dfb\app.h + "wx/dfb/dfbptr.h" + "wx/vidmode.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\vidmode.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\app.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\app.h + "wx/frame.h" + "wx/icon.h" + "wx/strconv.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\frame.h + "wx/toplevel.h" + "wx/statusbr.h" + "wx/univ/frame.h" + "wx/msw/frame.h" + "wx/gtk/frame.h" + "wx/gtk1/frame.h" + "wx/motif/frame.h" + "wx/osx/frame.h" + "wx/cocoa/frame.h" + "wx/os2/frame.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\toplevel.h + "wx/nonownedwnd.h" + "wx/iconbndl.h" + "wx/weakref.h" + "wx/msw/toplevel.h" + "wx/gtk/toplevel.h" + "wx/gtk1/toplevel.h" + "wx/x11/toplevel.h" + "wx/dfb/toplevel.h" + "wx/osx/toplevel.h" + "wx/cocoa/toplevel.h" + "wx/os2/toplevel.h" + "wx/motif/toplevel.h" + "wx/univ/toplevel.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\nonownedwnd.h + "wx/window.h" + "wx/dfb/nonownedwnd.h" + "wx/gtk/nonownedwnd.h" + "wx/osx/nonownedwnd.h" + "wx/msw/nonownedwnd.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dfb\nonownedwnd.h + "wx/window.h" + "wx/dfb/dfbptr.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\nonownedwnd.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\nonownedwnd.h + "wx/window.h" + "wx/graphics.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\graphics.h + "wx/defs.h" + "wx/geometry.h" + "wx/dynarray.h" + "wx/dc.h" + "wx/image.h" + "wx/vector.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\nonownedwnd.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\iconbndl.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/icon.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\weakref.h + "wx/tracker.h" + "wx/meta/convertible.h" + "wx/meta/int2type.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\meta\int2type.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\toplevel.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\toplevel.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\toplevel.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\x11\toplevel.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dfb\toplevel.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\toplevel.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\toplevel.h + "wx/hashmap.h" + "wx/cocoa/NSWindow.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nswindow.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\toplevel.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\toplevel.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\toplevel.h + "wx/univ/inpcons.h" + "wx/univ/inphand.h" + "wx/icon.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\inpcons.h + "wx/object.h" + "wx/event.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\inphand.h + "wx/univ/inpcons.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\statusbr.h + "wx/defs.h" + "wx/control.h" + "wx/list.h" + "wx/dynarray.h" + "wx/univ/statusbr.h" + "wx/msw/statusbar.h" + "wx/generic/statusbr.h" + "wx/osx/statusbr.h" + "wx/generic/statusbr.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\control.h + "wx/defs.h" + "wx/window.h" + "wx/univ/control.h" + "wx/msw/control.h" + "wx/motif/control.h" + "wx/gtk/control.h" + "wx/gtk1/control.h" + "wx/osx/control.h" + "wx/cocoa/control.h" + "wx/os2/control.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\control.h + "wx/univ/inphand.h" + "wx/univ/inpcons.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\control.h + "wx/dynarray.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\control.h + "wx/window.h" + "wx/list.h" + "wx/validate.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\control.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\control.h + "wx/defs.h" + "wx/object.h" + "wx/list.h" + "wx/window.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\control.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\control.h + "wx/cocoa/NSControl.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nscontrol.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\control.h + "wx/dynarray.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\statusbr.h + "wx/univ/inpcons.h" + "wx/arrstr.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\statusbar.h + "wx/vector.h" + "wx/tooltip.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\tooltip.h + "wx/defs.h" + "wx/msw/tooltip.h" + "wx/gtk/tooltip.h" + "wx/gtk1/tooltip.h" + "wx/osx/tooltip.h" + "wx/cocoa/tooltip.h" + "wx/os2/tooltip.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\tooltip.h + "wx/object.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\tooltip.h + "wx/string.h" + "wx/object.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\tooltip.h + "wx/defs.h" + "wx/string.h" + "wx/object.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\tooltip.h + "wx/string.h" + "wx/event.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\tooltip.h + "wx/object.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\tooltip.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\statusbr.h + "wx/defs.h" + "wx/pen.h" + "wx/arrstr.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\statusbr.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\frame.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\frame.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\frame.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\frame.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\frame.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\frame.h + "wx/toolbar.h" + "wx/accel.h" + "wx/icon.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\toolbar.h + "wx/defs.h" + "wx/tbarbase.h" + "wx/univ/toolbar.h" + "wx/msw/toolbar.h" + "wx/msw/wince/tbarwce.h" + "wx/motif/toolbar.h" + "wx/gtk/toolbar.h" + "wx/gtk1/toolbar.h" + "wx/osx/toolbar.h" + "wx/cocoa/toolbar.h" + "wx/os2/toolbar.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\tbarbase.h + "wx/defs.h" + "wx/bitmap.h" + "wx/list.h" + "wx/control.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\toolbar.h + "wx/button.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\button.h + "wx/defs.h" + "wx/anybutton.h" + "wx/univ/button.h" + "wx/msw/button.h" + "wx/motif/button.h" + "wx/gtk/button.h" + "wx/gtk1/button.h" + "wx/osx/button.h" + "wx/cocoa/button.h" + "wx/os2/button.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\anybutton.h + "wx/defs.h" + "wx/bitmap.h" + "wx/control.h" + "wx/univ/anybutton.h" + "wx/msw/anybutton.h" + "wx/gtk/anybutton.h" + "wx/osx/anybutton.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\anybutton.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\anybutton.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\anybutton.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\anybutton.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\button.h + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\button.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\button.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\button.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\button.h + "wx/defs.h" + "wx/object.h" + "wx/list.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\button.h + "wx/control.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\button.h + "wx/cocoa/NSButton.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nsbutton.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + "wx/cocoa/ObjcRef.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\objcref.h + "wx/osx/core/cfref.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\button.h + "wx/control.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\toolbar.h + "wx/dynarray.h" + "wx/imaglist.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\imaglist.h + "wx/defs.h" + "wx/generic/imaglist.h" + "wx/msw/imaglist.h" + "wx/osx/imaglist.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\imaglist.h + "wx/list.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\imaglist.h + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\imaglist.h + "wx/defs.h" + "wx/list.h" + "wx/icon.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\tbarwce.h + "wx/dynarray.h" + "wx/msw/toolbar.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\toolbar.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\toolbar.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\toolbar.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\toolbar.h + "wx/tbarbase.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\toolbar.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\toolbar.h + "wx/timer.h" + "wx/tbarbase.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\timer.h + "wx/defs.h" + "wx/object.h" + "wx/longlong.h" + "wx/event.h" + "wx/stopwatch.h" + "wx/utils.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\stopwatch.h + "wx/defs.h" + "wx/longlong.h" + "wx/time.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\time.h + "wx/longlong.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\frame.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\frame.h + "wx/os2/wxrsc.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\wxrsc.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\x11\app.h + "wx/gdicmn.h" + "wx/event.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\app.h + "wx/defs.h" + "wx/object.h" + "wx/gdicmn.h" + "wx/event.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\app.h + "wx/osx/core/cfref.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\app.h + + + + + + + + + "wx/event.h" + "wx/icon.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\theme.h + "wx/string.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\listbox.h + "wx/defs.h" + "wx/ctrlsub.h" + "wx/univ/listbox.h" + "wx/msw/listbox.h" + "wx/motif/listbox.h" + "wx/gtk/listbox.h" + "wx/gtk1/listbox.h" + "wx/osx/listbox.h" + "wx/os2/listbox.h" + "wx/cocoa/listbox.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\ctrlsub.h + "wx/defs.h" + "wx/arrstr.h" + "wx/control.h" + "wx/msw/ctrlsub.h" + "wx/motif/ctrlsub.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\ctrlsub.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\ctrlsub.h + "wx/dynarray.h" + "wx/generic/ctrlsub.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\ctrlsub.h + "wx/dynarray.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\listbox.h + "wx/scrolwin.h" + "wx/dynarray.h" + "wx/arrstr.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\scrolwin.h + "wx/panel.h" + "wx/gtk/scrolwin.h" + "wx/gtk1/scrolwin.h" + "wx/generic/scrolwin.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\panel.h + "wx/window.h" + "wx/containr.h" + "wx/univ/panel.h" + "wx/msw/panel.h" + "wx/generic/panelg.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\containr.h + "wx/defs.h" + "wx/event.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\panel.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\panel.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\panelg.h + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\scrolwin.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\scrolwin.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\scrolwin.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\listbox.h + "wx/dynarray.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\listbox.h + "wx/ctrlsub.h" + "wx/clntdata.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\listbox.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\listbox.h + "wx/list.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\listbox.h + "wx/dynarray.h" + "wx/arrstr.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\listbox.h + "wx/dynarray.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\listbox.h + "wx/cocoa/NSTableView.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nstableview.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\menu.h + "wx/defs.h" + "wx/list.h" + "wx/window.h" + "wx/menuitem.h" + "wx/univ/menu.h" + "wx/msw/menu.h" + "wx/motif/menu.h" + "wx/gtk/menu.h" + "wx/gtk1/menu.h" + "wx/osx/menu.h" + "wx/cocoa/menu.h" + "wx/os2/menu.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\menuitem.h + "wx/defs.h" + "wx/object.h" + "wx/univ/menuitem.h" + "wx/msw/menuitem.h" + "wx/motif/menuitem.h" + "wx/gtk/menuitem.h" + "wx/gtk1/menuitem.h" + "wx/osx/menuitem.h" + "wx/cocoa/menuitem.h" + "wx/os2/menuitem.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\menuitem.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\menuitem.h + "wx/ownerdrw.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\ownerdrw.h + "wx/defs.h" + "wx/font.h" + "wx/colour.h" + "wx/msw/ownerdrw.h" + "wx/os2/ownerdrw.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\ownerdrw.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\ownerdrw.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\menuitem.h + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\menuitem.h + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\menuitem.h + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\menuitem.h + "wx/defs.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\menuitem.h + "wx/hashmap.h" + "wx/bitmap.h" + "wx/cocoa/ObjcRef.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\menuitem.h + "wx/defs.h" + "wx/os2/private.h" + "wx/ownerdrw.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\menu.h + "wx/accel.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\menu.h + "wx/accel.h" + "wx/dynarray.h" + "wx/arrstr.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\menu.h + "wx/colour.h" + "wx/font.h" + "wx/arrstr.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\menu.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\menu.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\menu.h + "wx/arrstr.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\menu.h + "wx/cocoa/NSMenu.h" + "wx/accel.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nsmenu.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\menu.h + "wx/accel.h" + "wx/list.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\notebook.h + "wx/defs.h" + "wx/bookctrl.h" + "wx/univ/notebook.h" + "wx/msw/notebook.h" + "wx/generic/notebook.h" + "wx/gtk/notebook.h" + "wx/gtk1/notebook.h" + "wx/osx/notebook.h" + "wx/cocoa/notebook.h" + "wx/os2/notebook.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\bookctrl.h + "wx/defs.h" + "wx/control.h" + "wx/dynarray.h" + "wx/withimages.h" + "wx/notebook.h" + "wx/choicebk.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\withimages.h + "wx/defs.h" + "wx/icon.h" + "wx/imaglist.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\choicebk.h + "wx/defs.h" + "wx/bookctrl.h" + "wx/choice.h" + "wx/containr.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\choice.h + "wx/defs.h" + "wx/ctrlsub.h" + "wx/univ/choice.h" + "wx/msw/wince/choicece.h" + "wx/msw/choice.h" + "wx/motif/choice.h" + "wx/gtk/choice.h" + "wx/gtk1/choice.h" + "wx/osx/choice.h" + "wx/cocoa/choice.h" + "wx/os2/choice.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\choice.h + "wx/combobox.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\combobox.h + "wx/defs.h" + "wx/textctrl.h" + "wx/ctrlsub.h" + "wx/textentry.h" + "wx/univ/combobox.h" + "wx/msw/combobox.h" + "wx/motif/combobox.h" + "wx/gtk/combobox.h" + "wx/gtk1/combobox.h" + "wx/osx/combobox.h" + "wx/cocoa/combobox.h" + "wx/os2/combobox.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\textctrl.h + "wx/defs.h" + "wx/control.h" + "wx/textentry.h" + "wx/dynarray.h" + "wx/gdicmn.h" + "wx/ioswrap.h" + "wx/x11/textctrl.h" + "wx/univ/textctrl.h" + "wx/msw/wince/textctrlce.h" + "wx/msw/textctrl.h" + "wx/motif/textctrl.h" + "wx/gtk/textctrl.h" + "wx/gtk1/textctrl.h" + "wx/osx/textctrl.h" + "wx/cocoa/textctrl.h" + "wx/os2/textctrl.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\textentry.h + "wx/filefn.h" + "wx/gdicmn.h" + "wx/gtk/textentry.h" + "wx/osx/textentry.h" + "wx/msw/textentry.h" + "wx/motif/textentry.h" + "wx/os2/textentry.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\textentry.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\textentry.h + "wx/control.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\textentry.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\textentry.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\textentry.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\ioswrap.h + "wx/beforestd.h" + + + "wx/afterstd.h" + "wx/msw/winundef.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\x11\textctrl.h + "wx/univ/textctrl.h" + "wx/scrolwin.h" + "wx/arrstr.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\textctrl.h + "wx/scrolwin.h" + "wx/univ/inphand.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\textctrlce.h + "wx/dynarray.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\textctrl.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\textctrl.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\textctrl.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\textctrl.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\textctrl.h + "wx/control.h" + "wx/textctrl.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\textctrl.h + "wx/cocoa/NSTextField.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nstextfield.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\textctrl.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\combobox.h + "wx/combo.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\combo.h + "wx/defs.h" + "wx/control.h" + "wx/renderer.h" + "wx/bitmap.h" + "wx/textentry.h" + "wx/msw/combo.h" + "wx/generic/combo.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\renderer.h + "wx/gdicmn.h" + "wx/colour.h" + "wx/font.h" + "wx/bitmap.h" + "wx/string.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\combo.h + "wx/timer.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\combo.h + "wx/dcbuffer.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dcbuffer.h + "wx/dcmemory.h" + "wx/dcclient.h" + "wx/window.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dcmemory.h + "wx/dc.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dcclient.h + "wx/dc.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\combobox.h + "wx/choice.h" + "wx/textentry.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\combobox.h + "wx/choice.h" + "wx/textentry.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\combobox.h + "wx/choice.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\combobox.h + "wx/defs.h" + "wx/object.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\combobox.h + "wx/containr.h" + "wx/choice.h" + "wx/textctrl.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\combobox.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + "wx/textctrl.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\combobox.h + "wx/choice.h" + "wx/textentry.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\choicece.h + "wx/defs.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\choice.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\choice.h + "wx/clntdata.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\choice.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\choice.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\choice.h + "wx/control.h" + "wx/dynarray.h" + "wx/arrstr.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\choice.h + "wx/cocoa/NSMenu.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\choice.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\notebook.h + "wx/arrstr.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\notebook.h + "wx/control.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\notebook.h + "wx/event.h" + "wx/control.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\notebook.h + "wx/list.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\notebook.h + "wx/list.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\notebook.h + "wx/event.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\notebook.h + "wx/cocoa/NSTabView.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nstabview.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + "wx/cocoa/ObjcRef.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\notebook.h + "wx/control.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\sizer.h + "wx/defs.h" + "wx/window.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\stattext.h + "wx/defs.h" + "wx/control.h" + "wx/univ/stattext.h" + "wx/msw/stattext.h" + "wx/motif/stattext.h" + "wx/gtk/stattext.h" + "wx/gtk1/stattext.h" + "wx/osx/stattext.h" + "wx/cocoa/stattext.h" + "wx/os2/stattext.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\stattext.h + "wx/generic/stattextg.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\stattextg.h + "wx/stattext.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\stattext.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\stattext.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\stattext.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\stattext.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\stattext.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\stattext.h + "wx/cocoa/NSTextField.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\stattext.h + "wx/control.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msgdlg.h + "wx/defs.h" + "wx/dialog.h" + "wx/stockitem.h" + "wx/generic/msgdlgg.h" + "wx/cocoa/msgdlg.h" + "wx/msw/msgdlg.h" + "wx/motif/msgdlg.h" + "wx/gtk/msgdlg.h" + "wx/osx/msgdlg.h" + "wx/os2/msgdlg.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dialog.h + "wx/toplevel.h" + "wx/containr.h" + "wx/sharedptr.h" + "wx/univ/dialog.h" + "wx/msw/dialog.h" + "wx/motif/dialog.h" + "wx/gtk/dialog.h" + "wx/gtk1/dialog.h" + "wx/osx/dialog.h" + "wx/cocoa/dialog.h" + "wx/os2/dialog.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\sharedptr.h + "wx/defs.h" + "wx/atomic.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\atomic.h + "wx/defs.h" + "wx/msw/wrapwin.h" + "libkern/OSAtomic.h" + + "wx/thread.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\dialog.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\dialog.h + "wx/panel.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\dialog.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\dialog.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\dialog.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\dialog.h + "wx/panel.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\dialog.h + "wx/defs.h" + "wx/panel.h" + "wx/cocoa/NSPanel.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nspanel.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\dialog.h + "wx/panel.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\stockitem.h + "wx/defs.h" + "wx/chartype.h" + "wx/string.h" + "wx/accel.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\msgdlgg.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\msgdlg.h + "wx/msgdlg.h" + "wx/generic/msgdlgg.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\msgdlg.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\msgdlg.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\msgdlg.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\msgdlg.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\msgdlg.h + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\spinctrl.h + "wx/defs.h" + "wx/spinbutt.h" + "wx/generic/spinctlg.h" + "wx/msw/spinctrl.h" + "wx/os2/spinctrl.h" + "wx/gtk/spinctrl.h" + "wx/gtk1/spinctrl.h" + "wx/generic/spinctlg.h" + "wx/mac/spinctrl.h" + "wx/generic/spinctlg.h" + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\spinbutt.h + "wx/defs.h" + "wx/control.h" + "wx/event.h" + "wx/univ/spinbutt.h" + "wx/msw/spinbutt.h" + "wx/motif/spinbutt.h" + "wx/gtk/spinbutt.h" + "wx/gtk1/spinbutt.h" + "wx/mac/spinbutt.h" + "wx/cocoa/spinbutt.h" + "wx/os2/spinbutt.h" + +1300793819 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\spinbutt.h + "wx/univ/scrarrow.h" + +1300793819 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\scrarrow.h + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\spinbutt.h + "wx/control.h" + "wx/event.h" + +1300793756 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\generic\spinctlg.h + "wx/textctrl.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\spinctrl.h + "wx/spinbutt.h" + "wx/dynarray.h" + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\checkbox.h + "wx/defs.h" + "wx/control.h" + "wx/univ/checkbox.h" + "wx/msw/checkbox.h" + "wx/motif/checkbox.h" + "wx/gtk/checkbox.h" + "wx/gtk1/checkbox.h" + "wx/mac/checkbox.h" + "wx/cocoa/checkbox.h" + "wx/os2/checkbox.h" + "wx/palmos/checkbox.h" + +1300793818 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\checkbox.h + "wx/button.h" + +1300793814 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\checkbox.h + +1699704379 h:\cblegacy\samples\tcptest\tcpserver.h + "wx/wx.h" + "wx/socket.h" + "wx/event.h" + + + +1300793744 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\wx.h + "wx/defs.h" + "wx/object.h" + "wx/dynarray.h" + "wx/list.h" + "wx/hash.h" + "wx/string.h" + "wx/hashmap.h" + "wx/arrstr.h" + "wx/intl.h" + "wx/log.h" + "wx/event.h" + "wx/app.h" + "wx/utils.h" + "wx/stream.h" + "wx/memory.h" + "wx/math.h" + "wx/stopwatch.h" + "wx/module.h" + "wx/window.h" + "wx/containr.h" + "wx/panel.h" + "wx/toplevel.h" + "wx/frame.h" + "wx/gdicmn.h" + "wx/gdiobj.h" + "wx/region.h" + "wx/bitmap.h" + "wx/image.h" + "wx/colour.h" + "wx/font.h" + "wx/dc.h" + "wx/dcclient.h" + "wx/dcmemory.h" + "wx/dcprint.h" + "wx/dcscreen.h" + "wx/button.h" + "wx/menuitem.h" + "wx/menu.h" + "wx/pen.h" + "wx/brush.h" + "wx/palette.h" + "wx/icon.h" + "wx/cursor.h" + "wx/dialog.h" + "wx/timer.h" + "wx/settings.h" + "wx/msgdlg.h" + "wx/cmndata.h" + "wx/dataobj.h" + "wx/control.h" + "wx/ctrlsub.h" + "wx/bmpbuttn.h" + "wx/checkbox.h" + "wx/checklst.h" + "wx/choice.h" + "wx/scrolbar.h" + "wx/stattext.h" + "wx/statbmp.h" + "wx/statbox.h" + "wx/listbox.h" + "wx/radiobox.h" + "wx/radiobut.h" + "wx/textctrl.h" + "wx/slider.h" + "wx/gauge.h" + "wx/scrolwin.h" + "wx/dirdlg.h" + "wx/toolbar.h" + "wx/combobox.h" + "wx/layout.h" + "wx/sizer.h" + "wx/mdi.h" + "wx/statusbr.h" + "wx/choicdlg.h" + "wx/textdlg.h" + "wx/filedlg.h" + "wx/validate.h" + "wx/valtext.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\module.h + "wx/object.h" + "wx/list.h" + "wx/dynarray.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\dc.h + "wx/object.h" + "wx/intl.h" + "wx/cursor.h" + "wx/font.h" + "wx/colour.h" + "wx/bitmap.h" + "wx/brush.h" + "wx/pen.h" + "wx/palette.h" + "wx/list.h" + "wx/dynarray.h" + "wx/math.h" + "wx/palmos/dc.h" + "wx/msw/dc.h" + "wx/motif/dc.h" + "wx/gtk/dc.h" + "wx/gtk1/dc.h" + "wx/x11/dc.h" + "wx/mgl/dc.h" + "wx/dfb/dc.h" + "wx/mac/dc.h" + "wx/cocoa/dc.h" + "wx/os2/dc.h" + "wx/dcgraph.h" + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\brush.h + "wx/defs.h" + "wx/object.h" + "wx/gdiobj.h" + "wx/palmos/brush.h" + "wx/msw/brush.h" + "wx/x11/brush.h" + "wx/gtk/brush.h" + "wx/gtk1/brush.h" + "wx/mgl/brush.h" + "wx/dfb/brush.h" + "wx/mac/brush.h" + "wx/cocoa/brush.h" + "wx/os2/brush.h" + +1300793814 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\brush.h + "wx/gdicmn.h" + "wx/gdiobj.h" + "wx/bitmap.h" + +1300793814 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\dc.h + "wx/defs.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\dcgraph.h + "wx/geometry.h" + "wx/dynarray.h" + "wx/graphics.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\geometry.h + "wx/defs.h" + "wx/utils.h" + "wx/gdicmn.h" + "wx/math.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\graphics.h + "wx/defs.h" + "wx/geometry.h" + "wx/dynarray.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\dcclient.h + "wx/defs.h" + "wx/palmos/dcclient.h" + "wx/msw/dcclient.h" + "wx/motif/dcclient.h" + "wx/gtk/dcclient.h" + "wx/gtk1/dcclient.h" + "wx/x11/dcclient.h" + "wx/mgl/dcclient.h" + "wx/dfb/dcclient.h" + "wx/mac/dcclient.h" + "wx/cocoa/dcclient.h" + "wx/os2/dcclient.h" + +1300793814 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\dcclient.h + "wx/dc.h" + "wx/dynarray.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\dcmemory.h + "wx/bitmap.h" + "wx/palmos/dcmemory.h" + "wx/msw/dcmemory.h" + "wx/motif/dcmemory.h" + "wx/gtk/dcmemory.h" + "wx/gtk1/dcmemory.h" + "wx/x11/dcmemory.h" + "wx/mgl/dcmemory.h" + "wx/dfb/dcmemory.h" + "wx/mac/dcmemory.h" + "wx/cocoa/dcmemory.h" + "wx/os2/dcmemory.h" + +1300793814 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\dcmemory.h + "wx/dcclient.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\dcprint.h + "wx/defs.h" + "wx/palmos/dcprint.h" + "wx/msw/dcprint.h" + "wx/os2/dcprint.h" + "wx/mac/dcprint.h" + +1300793814 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\dcprint.h + "wx/dc.h" + "wx/cmndata.h" + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\cmndata.h + "wx/window.h" + "wx/font.h" + "wx/encinfo.h" + "wx/colour.h" + "wx/gdicmn.h" + "wx/stream.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\encinfo.h + "wx/string.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\dcscreen.h + "wx/defs.h" + "wx/palmos/dcscreen.h" + "wx/msw/dcscreen.h" + "wx/motif/dcscreen.h" + "wx/gtk/dcscreen.h" + "wx/gtk1/dcscreen.h" + "wx/x11/dcscreen.h" + "wx/mgl/dcscreen.h" + "wx/dfb/dcscreen.h" + "wx/mac/dcscreen.h" + "wx/cocoa/dcscreen.h" + "wx/os2/dcscreen.h" + +1300793814 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\dcscreen.h + "wx/dc.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\dataobj.h + "wx/defs.h" + "wx/string.h" + "wx/bitmap.h" + "wx/list.h" + "wx/arrstr.h" + "wx/msw/ole/dataform.h" + "wx/motif/dataform.h" + "wx/gtk/dataform.h" + "wx/gtk1/dataform.h" + "wx/x11/dataform.h" + "wx/mac/dataform.h" + "wx/cocoa/dataform.h" + "wx/os2/dataform.h" + "wx/msw/ole/dataobj.h" + "wx/motif/dataobj.h" + "wx/x11/dataobj.h" + "wx/gtk/dataobj.h" + "wx/gtk1/dataobj.h" + "wx/mac/dataobj.h" + "wx/cocoa/dataobj.h" + "wx/os2/dataobj.h" + "wx/msw/ole/dataobj2.h" + "wx/gtk/dataobj2.h" + "wx/gtk1/dataobj2.h" + "wx/x11/dataobj2.h" + "wx/motif/dataobj2.h" + "wx/mac/dataobj2.h" + "wx/cocoa/dataobj2.h" + "wx/os2/dataobj2.h" + +1300793816 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\ole\dataform.h + +1300793816 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\ole\dataobj.h + +1300793816 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\ole\dataobj2.h + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\bmpbuttn.h + "wx/defs.h" + "wx/bitmap.h" + "wx/button.h" + "wx/univ/bmpbuttn.h" + "wx/msw/bmpbuttn.h" + "wx/motif/bmpbuttn.h" + "wx/gtk/bmpbuttn.h" + "wx/gtk1/bmpbuttn.h" + "wx/mac/bmpbuttn.h" + "wx/cocoa/bmpbuttn.h" + "wx/os2/bmpbuttn.h" + +1300793818 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\bmpbuttn.h + +1300793814 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\bmpbuttn.h + "wx/button.h" + "wx/bitmap.h" + "wx/brush.h" + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\checklst.h + "wx/listbox.h" + "wx/univ/checklst.h" + "wx/msw/wince/checklst.h" + "wx/msw/checklst.h" + "wx/motif/checklst.h" + "wx/gtk/checklst.h" + "wx/gtk1/checklst.h" + "wx/mac/checklst.h" + "wx/cocoa/checklst.h" + "wx/os2/checklst.h" + +1300793818 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\checklst.h + +1300793816 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\checklst.h + +1300793814 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\checklst.h + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\scrolbar.h + "wx/defs.h" + "wx/control.h" + "wx/univ/scrolbar.h" + "wx/msw/scrolbar.h" + "wx/motif/scrolbar.h" + "wx/gtk/scrolbar.h" + "wx/gtk1/scrolbar.h" + "wx/mac/scrolbar.h" + "wx/cocoa/scrolbar.h" + "wx/os2/scrolbar.h" + +1300793819 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\scrolbar.h + "wx/univ/scrarrow.h" + "wx/renderer.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\scrolbar.h + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\statbmp.h + "wx/defs.h" + "wx/control.h" + "wx/bitmap.h" + "wx/icon.h" + "wx/univ/statbmp.h" + "wx/msw/statbmp.h" + "wx/motif/statbmp.h" + "wx/gtk/statbmp.h" + "wx/gtk1/statbmp.h" + "wx/mac/statbmp.h" + "wx/cocoa/statbmp.h" + "wx/os2/statbmp.h" + +1300793819 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\statbmp.h + "wx/bitmap.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\statbmp.h + "wx/control.h" + "wx/icon.h" + "wx/bitmap.h" + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\statbox.h + "wx/defs.h" + "wx/control.h" + "wx/univ/statbox.h" + "wx/msw/statbox.h" + "wx/motif/statbox.h" + "wx/gtk/statbox.h" + "wx/gtk1/statbox.h" + "wx/mac/statbox.h" + "wx/cocoa/statbox.h" + "wx/os2/statbox.h" + +1300793819 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\statbox.h + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\statbox.h + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\radiobox.h + "wx/ctrlsub.h" + "wx/dynarray.h" + "wx/univ/radiobox.h" + "wx/msw/radiobox.h" + "wx/motif/radiobox.h" + "wx/gtk/radiobox.h" + "wx/gtk1/radiobox.h" + "wx/mac/radiobox.h" + "wx/cocoa/radiobox.h" + "wx/os2/radiobox.h" + "wx/palmos/radiobox.h" + +1300793818 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\radiobox.h + "wx/statbox.h" + "wx/dynarray.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\radiobox.h + "wx/statbox.h" + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\radiobut.h + "wx/defs.h" + "wx/control.h" + "wx/univ/radiobut.h" + "wx/msw/radiobut.h" + "wx/motif/radiobut.h" + "wx/gtk/radiobut.h" + "wx/gtk1/radiobut.h" + "wx/mac/radiobut.h" + "wx/cocoa/radiobut.h" + "wx/os2/radiobut.h" + "wx/palmos/radiobut.h" + +1300793819 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\radiobut.h + "wx/checkbox.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\radiobut.h + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\slider.h + "wx/defs.h" + "wx/control.h" + "wx/univ/slider.h" + "wx/msw/slider95.h" + "wx/motif/slider.h" + "wx/gtk/slider.h" + "wx/gtk1/slider.h" + "wx/mac/slider.h" + "wx/cocoa/slider.h" + "wx/os2/slider.h" + "wx/palmos/slider.h" + +1300793819 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\slider.h + "wx/univ/scrthumb.h" + +1300793819 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\scrthumb.h + "wx/timer.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\slider95.h + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\gauge.h + "wx/defs.h" + "wx/control.h" + "wx/univ/gauge.h" + "wx/msw/gauge95.h" + "wx/motif/gauge.h" + "wx/gtk/gauge.h" + "wx/gtk1/gauge.h" + "wx/mac/gauge.h" + "wx/cocoa/gauge.h" + "wx/os2/gauge.h" + +1300793818 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\gauge.h + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\gauge95.h + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\dirdlg.h + "wx/dialog.h" + "wx/generic/dirdlgg.h" + "wx/generic/dirdlgg.h" + "wx/generic/dirdlgg.h" + "wx/msw/dirdlg.h" + "wx/gtk/dirdlg.h" + "wx/generic/dirdlgg.h" + "wx/mac/dirdlg.h" + "wx/cocoa/dirdlg.h" + "wx/generic/dirdlgg.h" + +1300793756 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\generic\dirdlgg.h + "wx/dialog.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\dirdlg.h + +1300793744 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\toolbar.h + "wx/defs.h" + "wx/tbarbase.h" + "wx/univ/toolbar.h" + "wx/palmos/toolbar.h" + "wx/msw/tbar95.h" + "wx/msw/wince/tbarwce.h" + "wx/motif/toolbar.h" + "wx/gtk/tbargtk.h" + "wx/gtk1/tbargtk.h" + "wx/mac/toolbar.h" + "wx/cocoa/toolbar.h" + "wx/os2/toolbar.h" + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\tbarbase.h + "wx/defs.h" + "wx/bitmap.h" + "wx/list.h" + "wx/control.h" + +1300793819 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\univ\toolbar.h + "wx/button.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\tbar95.h + "wx/dynarray.h" + "wx/imaglist.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\imaglist.h + "wx/generic/imaglist.h" + "wx/msw/imaglist.h" + "wx/mac/imaglist.h" + +1300793756 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\generic\imaglist.h + "wx/defs.h" + "wx/list.h" + "wx/icon.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\imaglist.h + "wx/bitmap.h" + +1300793816 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\tbarwce.h + "wx/dynarray.h" + "wx/msw/tbar95.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\layout.h + "wx/object.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\mdi.h + "wx/defs.h" + "wx/generic/mdig.h" + "wx/msw/mdi.h" + "wx/motif/mdi.h" + "wx/gtk/mdi.h" + "wx/gtk1/mdi.h" + "wx/mac/mdi.h" + "wx/cocoa/mdi.h" + "wx/generic/mdig.h" + +1300793756 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\generic\mdig.h + "wx/frame.h" + "wx/panel.h" + "wx/notebook.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\mdi.h + "wx/frame.h" + +1300793740 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\choicdlg.h + "wx/generic/choicdgg.h" + +1300793756 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\generic\choicdgg.h + "wx/dynarray.h" + "wx/dialog.h" + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\textdlg.h + "wx/generic/textdlgg.h" + "wx/numdlg.h" + +1300793756 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\generic\textdlgg.h + "wx/defs.h" + "wx/dialog.h" + "wx/valtext.h" + +1300793744 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\valtext.h + "wx/defs.h" + "wx/textctrl.h" + "wx/validate.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\numdlg.h + "wx/defs.h" + "wx/generic/numdlgg.h" + +1300793756 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\generic\numdlgg.h + "wx/defs.h" + "wx/dialog.h" + +1300793741 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\filedlg.h + "wx/defs.h" + "wx/dialog.h" + "wx/arrstr.h" + "wx/generic/filedlgg.h" + "wx/msw/filedlg.h" + "wx/motif/filedlg.h" + "wx/gtk/filedlg.h" + "wx/generic/filedlgg.h" + "wx/gtk1/filedlg.h" + "wx/mac/filedlg.h" + "wx/cocoa/filedlg.h" + "wx/os2/filedlg.h" + +1300793756 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\generic\filedlgg.h + "wx/listctrl.h" + "wx/datetime.h" + "wx/filefn.h" + "wx/filedlg.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\listctrl.h + "wx/defs.h" + "wx/listbase.h" + "wx/msw/listctrl.h" + "wx/mac/carbon/listctrl.h" + "wx/generic/listctrl.h" + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\listbase.h + "wx/colour.h" + "wx/font.h" + "wx/gdicmn.h" + "wx/event.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\listctrl.h + "wx/textctrl.h" + +1300793756 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\generic\listctrl.h + "wx/textctrl.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\filedlg.h + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\socket.h + "wx/defs.h" + "wx/event.h" + "wx/sckaddr.h" + "wx/gsocket.h" + "wx/list.h" + +1300793743 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\sckaddr.h + "wx/defs.h" + "wx/string.h" + "wx/gsocket.h" + + + +1300793742 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\gsocket.h + "wx/defs.h" + "wx/dlimpexp.h" + + + + "wx/msw/gsockmsw.h" + "wx/mac/gsockmac.h" + "wx/unix/gsockunx.h" + +1300793815 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\msw\gsockmsw.h + "wx/setup.h" + "wx/gsocket.h" + "gsocket.h" + "wx/msw/wrapwin.h" + + + +1300793818 h:\cblegacy\codeblocks\wxmsw-2.8.12\include\wx\unix\gsockunx.h + "wx/setup.h" + "wx/gsocket.h" + "gsocket.h" + +1699651599 h:\cblegacy\samples\tcptest\tcpclient.h + "wx/wx.h" + "wx/socket.h" + "wx/event.h" + + +1699651610 source:h:\cblegacy\samples\tcptest\tcpclient.cpp + "tcpclient.h" + +1699734225 source:h:\cblegacy\samples\tcptest\tcpserver.cpp + "tcpserver.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\wx.h + "wx/defs.h" + "wx/object.h" + "wx/dynarray.h" + "wx/list.h" + "wx/hash.h" + "wx/string.h" + "wx/hashmap.h" + "wx/arrstr.h" + "wx/intl.h" + "wx/log.h" + "wx/event.h" + "wx/app.h" + "wx/utils.h" + "wx/stream.h" + "wx/memory.h" + "wx/math.h" + "wx/stopwatch.h" + "wx/timer.h" + "wx/module.h" + "wx/wxcrt.h" + "wx/wxcrtvararg.h" + "wx/window.h" + "wx/containr.h" + "wx/panel.h" + "wx/toplevel.h" + "wx/frame.h" + "wx/gdicmn.h" + "wx/gdiobj.h" + "wx/region.h" + "wx/bitmap.h" + "wx/image.h" + "wx/colour.h" + "wx/font.h" + "wx/dc.h" + "wx/dcclient.h" + "wx/dcmemory.h" + "wx/dcprint.h" + "wx/dcscreen.h" + "wx/button.h" + "wx/menuitem.h" + "wx/menu.h" + "wx/pen.h" + "wx/brush.h" + "wx/palette.h" + "wx/icon.h" + "wx/cursor.h" + "wx/dialog.h" + "wx/settings.h" + "wx/msgdlg.h" + "wx/dataobj.h" + "wx/control.h" + "wx/ctrlsub.h" + "wx/bmpbuttn.h" + "wx/checkbox.h" + "wx/checklst.h" + "wx/choice.h" + "wx/scrolbar.h" + "wx/stattext.h" + "wx/statbmp.h" + "wx/statbox.h" + "wx/listbox.h" + "wx/radiobox.h" + "wx/radiobut.h" + "wx/textctrl.h" + "wx/slider.h" + "wx/gauge.h" + "wx/scrolwin.h" + "wx/dirdlg.h" + "wx/toolbar.h" + "wx/combobox.h" + "wx/layout.h" + "wx/sizer.h" + "wx/statusbr.h" + "wx/choicdlg.h" + "wx/textdlg.h" + "wx/filedlg.h" + "wx/mdi.h" + "wx/validate.h" + "wx/valtext.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\module.h + "wx/object.h" + "wx/list.h" + "wx/arrstr.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dcprint.h + "wx/defs.h" + "wx/dc.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dcscreen.h + "wx/defs.h" + "wx/dc.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dataobj.h + "wx/defs.h" + "wx/string.h" + "wx/bitmap.h" + "wx/list.h" + "wx/arrstr.h" + "wx/msw/ole/dataform.h" + "wx/motif/dataform.h" + "wx/gtk/dataform.h" + "wx/gtk1/dataform.h" + "wx/x11/dataform.h" + "wx/osx/dataform.h" + "wx/cocoa/dataform.h" + "wx/os2/dataform.h" + "wx/msw/ole/dataobj.h" + "wx/motif/dataobj.h" + "wx/x11/dataobj.h" + "wx/gtk/dataobj.h" + "wx/gtk1/dataobj.h" + "wx/osx/dataobj.h" + "wx/cocoa/dataobj.h" + "wx/os2/dataobj.h" + "wx/msw/ole/dataobj2.h" + "wx/gtk/dataobj2.h" + "wx/gtk1/dataobj2.h" + "wx/x11/dataobj2.h" + "wx/motif/dataobj2.h" + "wx/osx/dataobj2.h" + "wx/cocoa/dataobj2.h" + "wx/os2/dataobj2.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\ole\dataform.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\dataform.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\dataform.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\dataform.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\x11\dataform.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\dataform.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\dataform.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\dataform.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\ole\dataobj.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\dataobj.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\x11\dataobj.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\dataobj.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\dataobj.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\dataobj.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\dataobj.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\dataobj.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\ole\dataobj2.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\dataobj2.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\dataobj2.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\x11\dataobj2.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\dataobj2.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\dataobj2.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\dataobj2.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\dataobj2.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\bmpbuttn.h + "wx/defs.h" + "wx/button.h" + "wx/univ/bmpbuttn.h" + "wx/msw/bmpbuttn.h" + "wx/motif/bmpbuttn.h" + "wx/gtk/bmpbuttn.h" + "wx/gtk1/bmpbuttn.h" + "wx/osx/bmpbuttn.h" + "wx/cocoa/bmpbuttn.h" + "wx/os2/bmpbuttn.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\bmpbuttn.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\bmpbuttn.h + "wx/button.h" + "wx/bitmap.h" + "wx/brush.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\bmpbuttn.h + "wx/motif/bmpmotif.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\bmpmotif.h + "wx/defs.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\bmpbuttn.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\bmpbuttn.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\bmpbuttn.h + "wx/button.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\bmpbuttn.h + "wx/cocoa/NSButton.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\bmpbuttn.h + "wx/button.h" + "wx/dcclient.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\checkbox.h + "wx/defs.h" + "wx/control.h" + "wx/univ/checkbox.h" + "wx/msw/checkbox.h" + "wx/motif/checkbox.h" + "wx/gtk/checkbox.h" + "wx/gtk1/checkbox.h" + "wx/osx/checkbox.h" + "wx/cocoa/checkbox.h" + "wx/os2/checkbox.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\checkbox.h + "wx/button.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\checkbox.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\checkbox.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\checkbox.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\checkbox.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\checkbox.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\checkbox.h + "wx/cocoa/NSButton.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\checkbox.h + "wx/control.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\checklst.h + "wx/defs.h" + "wx/listbox.h" + "wx/univ/checklst.h" + "wx/msw/wince/checklst.h" + "wx/msw/checklst.h" + "wx/motif/checklst.h" + "wx/gtk/checklst.h" + "wx/gtk1/checklst.h" + "wx/osx/checklst.h" + "wx/cocoa/checklst.h" + "wx/os2/checklst.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\checklst.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\checklst.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\checklst.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\checklst.h + "wx/listbox.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\checklst.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\checklst.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\checklst.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\checklst.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\checklst.h + + "wx/defs.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\scrolbar.h + "wx/defs.h" + "wx/control.h" + "wx/univ/scrolbar.h" + "wx/msw/scrolbar.h" + "wx/motif/scrolbar.h" + "wx/gtk/scrolbar.h" + "wx/gtk1/scrolbar.h" + "wx/osx/scrolbar.h" + "wx/cocoa/scrolbar.h" + "wx/os2/scrolbar.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\scrolbar.h + "wx/univ/scrarrow.h" + "wx/renderer.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\scrarrow.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\scrolbar.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\scrolbar.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\scrolbar.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\scrolbar.h + "wx/defs.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\scrolbar.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\scrolbar.h + "wx/cocoa/NSScroller.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nsscroller.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + "wx/cocoa/ObjcRef.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\scrolbar.h + "wx/scrolbar.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\statbmp.h + "wx/defs.h" + "wx/control.h" + "wx/bitmap.h" + "wx/icon.h" + "wx/univ/statbmp.h" + "wx/msw/statbmp.h" + "wx/motif/statbmp.h" + "wx/gtk/statbmp.h" + "wx/gtk1/statbmp.h" + "wx/osx/statbmp.h" + "wx/cocoa/statbmp.h" + "wx/os2/statbmp.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\statbmp.h + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\statbmp.h + "wx/control.h" + "wx/icon.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\statbmp.h + "wx/motif/bmpmotif.h" + "wx/icon.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\statbmp.h + "wx/icon.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\statbmp.h + "wx/icon.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\statbmp.h + "wx/osx/carbon/statbmp.h" + "wx/generic/statbmpg.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\carbon\statbmp.h + "wx/icon.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\statbmpg.h + "wx/statbmp.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\statbmp.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\statbmp.h + "wx/control.h" + "wx/icon.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\statbox.h + "wx/defs.h" + "wx/control.h" + "wx/containr.h" + "wx/univ/statbox.h" + "wx/msw/statbox.h" + "wx/motif/statbox.h" + "wx/gtk/statbox.h" + "wx/gtk1/statbox.h" + "wx/osx/statbox.h" + "wx/cocoa/statbox.h" + "wx/os2/statbox.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\statbox.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\statbox.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\statbox.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\statbox.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\statbox.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\statbox.h + "wx/control.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\statbox.h + "wx/cocoa/NSBox.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nsbox.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\statbox.h + "wx/control.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\radiobox.h + "wx/defs.h" + "wx/ctrlsub.h" + "wx/dynarray.h" + "wx/univ/radiobox.h" + "wx/msw/radiobox.h" + "wx/motif/radiobox.h" + "wx/gtk/radiobox.h" + "wx/gtk1/radiobox.h" + "wx/osx/radiobox.h" + "wx/cocoa/radiobox.h" + "wx/os2/radiobox.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\radiobox.h + "wx/statbox.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\radiobox.h + "wx/statbox.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\radiobox.h + "wx/dynarray.h" + "wx/arrstr.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\radiobox.h + "wx/bitmap.h" + "wx/list.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\radiobox.h + "wx/bitmap.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\radiobox.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\radiobox.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\radiobox.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\radiobut.h + "wx/defs.h" + "wx/control.h" + "wx/univ/radiobut.h" + "wx/msw/radiobut.h" + "wx/motif/radiobut.h" + "wx/gtk/radiobut.h" + "wx/gtk1/radiobut.h" + "wx/osx/radiobut.h" + "wx/cocoa/radiobut.h" + "wx/os2/radiobut.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\radiobut.h + "wx/checkbox.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\radiobut.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\radiobut.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\radiobut.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\radiobut.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\radiobut.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\radiobut.h + "wx/cocoa/NSButton.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\radiobut.h + "wx/control.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\slider.h + "wx/defs.h" + "wx/control.h" + "wx/univ/slider.h" + "wx/msw/slider.h" + "wx/motif/slider.h" + "wx/gtk/slider.h" + "wx/gtk1/slider.h" + "wx/osx/slider.h" + "wx/cocoa/slider.h" + "wx/os2/slider.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\slider.h + "wx/univ/scrthumb.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\scrthumb.h + "wx/timer.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\slider.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\slider.h + "wx/control.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\slider.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\slider.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\slider.h + "wx/control.h" + "wx/slider.h" + "wx/stattext.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\slider.h + "wx/cocoa/NSSlider.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nsslider.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + "wx/cocoa/ObjcRef.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\slider.h + "wx/control.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gauge.h + "wx/defs.h" + "wx/control.h" + "wx/univ/gauge.h" + "wx/msw/gauge.h" + "wx/motif/gauge.h" + "wx/gtk/gauge.h" + "wx/gtk1/gauge.h" + "wx/osx/gauge.h" + "wx/cocoa/gauge.h" + "wx/os2/gauge.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\gauge.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\gauge.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\gauge.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\gauge.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\gauge.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\gauge.h + "wx/control.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\gauge.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\gauge.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\dirdlg.h + "wx/defs.h" + "wx/dialog.h" + "wx/generic/dirdlgg.h" + "wx/generic/dirdlgg.h" + "wx/generic/dirdlgg.h" + "wx/msw/dirdlg.h" + "wx/gtk/dirdlg.h" + "wx/generic/dirdlgg.h" + "wx/osx/dirdlg.h" + "wx/cocoa/dirdlg.h" + "wx/generic/dirdlgg.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\dirdlgg.h + "wx/dialog.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\dirdlg.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\dirdlg.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\dirdlg.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\dirdlg.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\layout.h + "wx/object.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\choicdlg.h + "wx/defs.h" + "wx/generic/choicdgg.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\choicdgg.h + "wx/dynarray.h" + "wx/dialog.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\textdlg.h + "wx/generic/textdlgg.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\textdlgg.h + "wx/defs.h" + "wx/dialog.h" + "wx/valtext.h" + "wx/textctrl.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\valtext.h + "wx/defs.h" + "wx/validate.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\filedlg.h + "wx/defs.h" + "wx/dialog.h" + "wx/arrstr.h" + "wx/generic/filedlgg.h" + "wx/msw/filedlg.h" + "wx/motif/filedlg.h" + "wx/gtk/filedlg.h" + "wx/gtk1/filedlg.h" + "wx/osx/filedlg.h" + "wx/cocoa/filedlg.h" + "wx/os2/filedlg.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\filedlgg.h + "wx/listctrl.h" + "wx/datetime.h" + "wx/filefn.h" + "wx/artprov.h" + "wx/filedlg.h" + "wx/generic/filectrlg.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\listctrl.h + "wx/defs.h" + "wx/listbase.h" + "wx/msw/listctrl.h" + "wx/osx/listctrl.h" + "wx/generic/listctrl.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\listbase.h + "wx/colour.h" + "wx/font.h" + "wx/gdicmn.h" + "wx/event.h" + "wx/control.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\listctrl.h + "wx/textctrl.h" + "wx/dynarray.h" + "wx/vector.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\listctrl.h + "wx/defs.h" + "wx/generic/listctrl.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\listctrl.h + "wx/containr.h" + "wx/scrolwin.h" + "wx/textctrl.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\artprov.h + "wx/string.h" + "wx/bitmap.h" + "wx/icon.h" + "wx/iconbndl.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\filectrlg.h + "wx/containr.h" + "wx/listctrl.h" + "wx/filectrl.h" + "wx/filename.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\filectrl.h + "wx/defs.h" + "wx/string.h" + "wx/event.h" + "wx/gtk/filectrl.h" + "wx/generic/filectrlg.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\filectrl.h + "wx/control.h" + "wx/filectrl.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\filename.h + "wx/arrstr.h" + "wx/filefn.h" + "wx/datetime.h" + "wx/intl.h" + "wx/longlong.h" + "wx/file.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\file.h + "wx/defs.h" + "wx/string.h" + "wx/filefn.h" + "wx/convauto.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\convauto.h + "wx/strconv.h" + "wx/fontenc.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\filedlg.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\filedlg.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\filedlg.h + "wx/gtk/filectrl.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\filedlg.h + "wx/generic/filedlgg.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\filedlg.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\filedlg.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\filedlg.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\mdi.h + "wx/defs.h" + "wx/frame.h" + "wx/menu.h" + "wx/generic/mdig.h" + "wx/msw/mdi.h" + "wx/gtk/mdi.h" + "wx/gtk1/mdi.h" + "wx/osx/mdi.h" + "wx/cocoa/mdi.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\mdig.h + "wx/panel.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\mdi.h + "wx/frame.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\mdi.h + "wx/frame.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\mdi.h + "wx/frame.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\mdi.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\mdi.h + "wx/frame.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\socket.h + "wx/defs.h" + "wx/event.h" + "wx/sckaddr.h" + "wx/list.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\sckaddr.h + "wx/defs.h" + "wx/string.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\spinctrl.h + "wx/defs.h" + "wx/spinbutt.h" + "wx/msw/spinctrl.h" + "wx/os2/spinctrl.h" + "wx/gtk/spinctrl.h" + "wx/gtk1/spinctrl.h" + "wx/generic/spinctlg.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\spinbutt.h + "wx/defs.h" + "wx/control.h" + "wx/event.h" + "wx/range.h" + "wx/univ/spinbutt.h" + "wx/msw/spinbutt.h" + "wx/motif/spinbutt.h" + "wx/gtk/spinbutt.h" + "wx/gtk1/spinbutt.h" + "wx/osx/spinbutt.h" + "wx/cocoa/spinbutt.h" + "wx/os2/spinbutt.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\range.h + "wx/defs.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\univ\spinbutt.h + "wx/univ/scrarrow.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\spinbutt.h + "wx/control.h" + "wx/event.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\motif\spinbutt.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\spinbutt.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\spinbutt.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\osx\spinbutt.h + "wx/control.h" + "wx/event.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\spinbutt.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\spinbutt.h + "wx/control.h" + "wx/event.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\msw\spinctrl.h + "wx/spinbutt.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\os2\spinctrl.h + "wx/spinbutt.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk\spinctrl.h + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\spinctrl.h + "wx/defs.h" + "wx/control.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\generic\spinctlg.h + "wx/compositewin.h" + "wx/textctrl.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\include\wx\compositewin.h + "wx/window.h" + "wx/containr.h" + +1587557368 h:\cblegacy\codeblocks\wxwidgets-3.0.5\lib\gcc_lib\mswud\wx\setup.h + +1699737500 h:\cblegacy\codeblocks\wxmsw-2.8.12\lib\gcc_lib\msw\wx\setup.h + +1620913520 source:h:\cblegacy_new\samples\tcptest\resource.rc + "wx/msw/wx.rc" + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\wx.rc + + + "wx/msw/wince/wince.rc" + "wx/msw/rcdefs.h" + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\wince.rc + + "wx/msw/wince/smartphone.rc" + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\smartphone.rc + + "wx/msw/wince/resources.h" + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\resources.h + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\rcdefs.h + +1699809594 source:h:\cblegacy_new\samples\tcptest\tcpclient.cpp + "tcpclient.h" + +1699651599 h:\cblegacy_new\samples\tcptest\tcpclient.h + "wx/wx.h" + "wx/socket.h" + "wx/event.h" + + +1300793744 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\wx.h + "wx/defs.h" + "wx/object.h" + "wx/dynarray.h" + "wx/list.h" + "wx/hash.h" + "wx/string.h" + "wx/hashmap.h" + "wx/arrstr.h" + "wx/intl.h" + "wx/log.h" + "wx/event.h" + "wx/app.h" + "wx/utils.h" + "wx/stream.h" + "wx/memory.h" + "wx/math.h" + "wx/stopwatch.h" + "wx/module.h" + "wx/window.h" + "wx/containr.h" + "wx/panel.h" + "wx/toplevel.h" + "wx/frame.h" + "wx/gdicmn.h" + "wx/gdiobj.h" + "wx/region.h" + "wx/bitmap.h" + "wx/image.h" + "wx/colour.h" + "wx/font.h" + "wx/dc.h" + "wx/dcclient.h" + "wx/dcmemory.h" + "wx/dcprint.h" + "wx/dcscreen.h" + "wx/button.h" + "wx/menuitem.h" + "wx/menu.h" + "wx/pen.h" + "wx/brush.h" + "wx/palette.h" + "wx/icon.h" + "wx/cursor.h" + "wx/dialog.h" + "wx/timer.h" + "wx/settings.h" + "wx/msgdlg.h" + "wx/cmndata.h" + "wx/dataobj.h" + "wx/control.h" + "wx/ctrlsub.h" + "wx/bmpbuttn.h" + "wx/checkbox.h" + "wx/checklst.h" + "wx/choice.h" + "wx/scrolbar.h" + "wx/stattext.h" + "wx/statbmp.h" + "wx/statbox.h" + "wx/listbox.h" + "wx/radiobox.h" + "wx/radiobut.h" + "wx/textctrl.h" + "wx/slider.h" + "wx/gauge.h" + "wx/scrolwin.h" + "wx/dirdlg.h" + "wx/toolbar.h" + "wx/combobox.h" + "wx/layout.h" + "wx/sizer.h" + "wx/mdi.h" + "wx/statusbr.h" + "wx/choicdlg.h" + "wx/textdlg.h" + "wx/filedlg.h" + "wx/validate.h" + "wx/valtext.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\defs.h + "wx/platform.h" + "wx/features.h" + "wx/version.h" + "wx/dlimpexp.h" + "wx/debug.h" + + + + "wx/msw/winundef.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\platform.h + + + + "wx/mac/carbon/config_xcode.h" + "wx/setup.h" + "wx/chkconf.h" + "wx/msw/wince/libraries.h" + "wx/msw/libraries.h" + "wx/msw/gccpriv.h" + + +1699795188 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\lib\gcc_lib\msw\wx\setup.h + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\chkconf.h + "wx/palmos/chkconf.h" + "wx/msw/wince/chkconf.h" + "wx/msw/chkconf.h" + "wx/mac/chkconf.h" + "wx/os2/chkconf.h" + "wx/mgl/chkconf.h" + "wx/dfb/chkconf.h" + "wx/motif/chkconf.h" + "wx/x11/chkconf.h" + "wx/univ/chkconf.h" + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\chkconf.h + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\chkconf.h + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\chkconf.h + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\libraries.h + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\libraries.h + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\gccpriv.h + <_mingw.h> + + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\features.h + +1300793744 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\version.h + "wx/cpp.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\cpp.h + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\dlimpexp.h + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\debug.h + + + "wx/wxchar.h" + +1300793744 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\wxchar.h + "wx/platform.h" + "wx/dlimpexp.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\winundef.h + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\object.h + "wx/memory.h" + "wx/xti.h" + "wx/msw/msvcrt.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\memory.h + "wx/defs.h" + "wx/string.h" + "wx/msgout.h" + + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\string.h + "wx/defs.h" + + + + + + + + + + + + + "wx/wxchar.h" + "wx/buffer.h" + "wx/strconv.h" + "wx/beforestd.h" + + "wx/afterstd.h" + "wx/arrstr.h" + "wx/iosfwrap.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\buffer.h + "wx/wxchar.h" + + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\strconv.h + "wx/defs.h" + "wx/wxchar.h" + "wx/buffer.h" + "typeinfo.h" + + "wx/fontenc.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\fontenc.h + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\beforestd.h + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\afterstd.h + "wx/msw/winundef.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\arrstr.h + "wx/defs.h" + "wx/string.h" + "wx/dynarray.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\dynarray.h + "wx/defs.h" + "wx/beforestd.h" + + + "wx/afterstd.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\iosfwrap.h + + + "wx/msw/winundef.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msgout.h + "wx/defs.h" + "wx/wxchar.h" + +1300793744 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\xti.h + "wx/defs.h" + "wx/memory.h" + "wx/flags.h" + "wx/string.h" + "wx/arrstr.h" + "wx/hashmap.h" + "wx/log.h" + "wx/intl.h" + + "wx/dynarray.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\flags.h + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\hashmap.h + "wx/string.h" + + + + + + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\log.h + "wx/defs.h" + "wx/string.h" + "wx/arrstr.h" + + "wx/dynarray.h" + "wx/iosfwrap.h" + "wx/generic/logg.h" + "wx/cocoa/log.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\logg.h + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\intl.h + "wx/defs.h" + "wx/string.h" + "wx/fontenc.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\msvcrt.h + + + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\list.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/beforestd.h" + + + + "wx/afterstd.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\hash.h + "wx/defs.h" + "wx/object.h" + "wx/list.h" + "wx/dynarray.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\event.h + "wx/defs.h" + "wx/cpp.h" + "wx/object.h" + "wx/clntdata.h" + "wx/gdicmn.h" + "wx/cursor.h" + "wx/thread.h" + "wx/dynarray.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\clntdata.h + "wx/defs.h" + "wx/string.h" + "wx/hashmap.h" + "wx/vector.h" + +1300793744 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\vector.h + "wx/defs.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\gdicmn.h + "wx/defs.h" + "wx/list.h" + "wx/string.h" + "wx/fontenc.h" + "wx/hashmap.h" + "wx/math.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\math.h + "wx/defs.h" + + + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\cursor.h + "wx/defs.h" + "wx/palmos/cursor.h" + "wx/msw/cursor.h" + "wx/motif/cursor.h" + "wx/gtk/cursor.h" + "wx/gtk1/cursor.h" + "wx/x11/cursor.h" + "wx/mgl/cursor.h" + "wx/dfb/cursor.h" + "wx/mac/cursor.h" + "wx/cocoa/cursor.h" + "wx/os2/cursor.h" + "wx/utils.h" + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\cursor.h + "wx/msw/gdiimage.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\gdiimage.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/list.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\gdiobj.h + "wx/object.h" + +1300793744 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\utils.h + "wx/object.h" + "wx/list.h" + "wx/filefn.h" + "wx/gdicmn.h" + "wx/longlong.h" + "wx/platinfo.h" + + + + + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\filefn.h + "wx/list.h" + "wx/arrstr.h" + "wx/msw/wince/time.h" + "wx/msw/private.h" + + + + + + + + + + + + "wx/os2/private.h" + + + + + + + + + + + + + + + + + + + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\time.h + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\private.h + "wx/msw/wrapwin.h" + "wx/msw/microwin.h" + "wx/log.h" + "wx/gdicmn.h" + "wx/colour.h" + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\wrapwin.h + "wx/platform.h" + + "wx/msw/winundef.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\microwin.h + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\colour.h + "wx/defs.h" + "wx/gdiobj.h" + "wx/variant.h" + "wx/generic/colour.h" + "wx/msw/colour.h" + "wx/motif/colour.h" + "wx/gtk/colour.h" + "wx/gtk1/colour.h" + "wx/generic/colour.h" + "wx/generic/colour.h" + "wx/x11/colour.h" + "wx/mac/colour.h" + "wx/cocoa/colour.h" + "wx/os2/colour.h" + +1300793744 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\variant.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/arrstr.h" + "wx/list.h" + "wx/cpp.h" + "wx/datetime.h" + "wx/db.h" + "wx/iosfwrap.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\datetime.h + "wx/defs.h" + + "wx/msw/wince/time.h" + + "wx/longlong.h" + "wx/dynarray.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\longlong.h + "wx/defs.h" + "wx/string.h" + + "wx/iosfwrap.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\db.h + "wx/defs.h" + "wx/string.h" + + "wx/msw/wrapwin.h" + "sql.h" + "sqlext.h" + "odbcinst.h" + "wx/msw/wrapwin.h" + "wx/isql.h" + "wx/isqlext.h" + + + + + "wx/object.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\isql.h + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\isqlext.h + "wx/isql.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\colour.h + "wx/object.h" + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\colour.h + "wx/object.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\platinfo.h + "wx/string.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\thread.h + "wx/defs.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\app.h + "wx/event.h" + "wx/build.h" + "wx/init.h" + "wx/intl.h" + "wx/palmos/app.h" + "wx/msw/app.h" + "wx/motif/app.h" + "wx/mgl/app.h" + "wx/dfb/app.h" + "wx/gtk/app.h" + "wx/gtk1/app.h" + "wx/x11/app.h" + "wx/mac/app.h" + "wx/cocoa/app.h" + "wx/os2/app.h" + "wx/univ/theme.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\build.h + "wx/version.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\init.h + "wx/defs.h" + "wx/wxchar.h" + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\app.h + "wx/event.h" + "wx/icon.h" + "wx/msw/wrapwin.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\icon.h + "wx/iconloc.h" + "wx/generic/icon.h" + "wx/msw/icon.h" + "wx/motif/icon.h" + "wx/generic/icon.h" + "wx/generic/icon.h" + "wx/generic/icon.h" + "wx/generic/icon.h" + "wx/generic/icon.h" + "wx/mac/icon.h" + "wx/cocoa/icon.h" + "wx/os2/icon.h" + "wx/variant.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\iconloc.h + "wx/string.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\icon.h + "wx/bitmap.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\bitmap.h + "wx/string.h" + "wx/gdicmn.h" + "wx/colour.h" + "wx/variant.h" + "wx/palmos/bitmap.h" + "wx/msw/bitmap.h" + "wx/x11/bitmap.h" + "wx/gtk/bitmap.h" + "wx/gtk1/bitmap.h" + "wx/x11/bitmap.h" + "wx/mgl/bitmap.h" + "wx/dfb/bitmap.h" + "wx/mac/bitmap.h" + "wx/cocoa/bitmap.h" + "wx/os2/bitmap.h" + "wx/generic/mask.h" + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\bitmap.h + "wx/msw/gdiimage.h" + "wx/palette.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\palette.h + "wx/defs.h" + "wx/object.h" + "wx/gdiobj.h" + "wx/palmos/palette.h" + "wx/msw/palette.h" + "wx/motif/palette.h" + "wx/generic/paletteg.h" + "wx/x11/palette.h" + "wx/mgl/palette.h" + "wx/mac/palette.h" + "wx/os2/palette.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\palette.h + "wx/gdiobj.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\paletteg.h + "wx/defs.h" + "wx/object.h" + "wx/gdiobj.h" + "wx/gdicmn.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\mask.h + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\icon.h + "wx/msw/gdiimage.h" + +1300793819 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\theme.h + "wx/string.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\stream.h + "wx/defs.h" + + "wx/object.h" + "wx/string.h" + "wx/filefn.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\stopwatch.h + "wx/defs.h" + "wx/longlong.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\module.h + "wx/object.h" + "wx/list.h" + "wx/dynarray.h" + +1300793744 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\window.h + "wx/event.h" + "wx/list.h" + "wx/cursor.h" + "wx/font.h" + "wx/colour.h" + "wx/region.h" + "wx/utils.h" + "wx/intl.h" + "wx/validate.h" + "wx/palette.h" + "wx/accel.h" + "wx/access.h" + "wx/palmos/window.h" + "wx/msw/window.h" + "wx/motif/window.h" + "wx/gtk/window.h" + "wx/gtk1/window.h" + "wx/x11/window.h" + "wx/mgl/window.h" + "wx/dfb/window.h" + "wx/mac/window.h" + "wx/cocoa/window.h" + "wx/os2/window.h" + "wx/univ/window.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\font.h + "wx/defs.h" + "wx/fontenc.h" + "wx/gdiobj.h" + "wx/palmos/font.h" + "wx/msw/font.h" + "wx/motif/font.h" + "wx/gtk/font.h" + "wx/gtk1/font.h" + "wx/x11/font.h" + "wx/mgl/font.h" + "wx/dfb/font.h" + "wx/mac/font.h" + "wx/cocoa/font.h" + "wx/os2/font.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\font.h + "wx/gdicmn.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\region.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/palmos/region.h" + "wx/msw/region.h" + "wx/gtk/region.h" + "wx/gtk1/region.h" + "wx/x11/region.h" + "wx/mgl/region.h" + "wx/dfb/region.h" + "wx/mac/region.h" + "wx/cocoa/region.h" + "wx/os2/region.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\region.h + +1300793744 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\validate.h + "wx/defs.h" + "wx/event.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\accel.h + "wx/defs.h" + "wx/object.h" + "wx/generic/accel.h" + "wx/msw/accel.h" + "wx/motif/accel.h" + "wx/gtk/accel.h" + "wx/gtk1/accel.h" + "wx/mac/accel.h" + "wx/generic/accel.h" + "wx/os2/accel.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\accel.h + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\accel.h + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\access.h + "wx/defs.h" + "wx/variant.h" + "wx/msw/ole/access.h" + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\ole\access.h + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\window.h + "wx/hash.h" + +1300793819 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\window.h + "wx/bitmap.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\containr.h + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\panel.h + "wx/generic/panelg.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\panelg.h + "wx/window.h" + "wx/containr.h" + +1300793744 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\toplevel.h + "wx/window.h" + "wx/iconbndl.h" + "wx/palmos/toplevel.h" + "wx/msw/toplevel.h" + "wx/gtk/toplevel.h" + "wx/gtk1/toplevel.h" + "wx/x11/toplevel.h" + "wx/mgl/toplevel.h" + "wx/dfb/toplevel.h" + "wx/mac/toplevel.h" + "wx/cocoa/toplevel.h" + "wx/os2/toplevel.h" + "wx/motif/toplevel.h" + "wx/univ/toplevel.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\iconbndl.h + "wx/dynarray.h" + "wx/gdicmn.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\toplevel.h + +1300793819 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\toplevel.h + "wx/univ/inpcons.h" + "wx/univ/inphand.h" + "wx/icon.h" + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\inpcons.h + "wx/object.h" + "wx/event.h" + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\inphand.h + "wx/univ/inpcons.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\frame.h + "wx/toplevel.h" + "wx/univ/frame.h" + "wx/palmos/frame.h" + "wx/msw/frame.h" + "wx/gtk/frame.h" + "wx/gtk1/frame.h" + "wx/motif/frame.h" + "wx/mac/frame.h" + "wx/cocoa/frame.h" + "wx/os2/frame.h" + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\frame.h + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\frame.h + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\image.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdicmn.h" + "wx/hashmap.h" + "wx/stream.h" + "wx/variant.h" + "wx/imagbmp.h" + "wx/imagpng.h" + "wx/imaggif.h" + "wx/imagpcx.h" + "wx/imagjpeg.h" + "wx/imagtga.h" + "wx/imagtiff.h" + "wx/imagpnm.h" + "wx/imagxpm.h" + "wx/imagiff.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\imagbmp.h + "wx/image.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\imagpng.h + "wx/defs.h" + "wx/image.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\imaggif.h + "wx/image.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\imagpcx.h + "wx/image.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\imagjpeg.h + "wx/defs.h" + "wx/image.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\imagtga.h + "wx/image.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\imagtiff.h + "wx/defs.h" + "wx/image.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\imagpnm.h + "wx/image.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\imagxpm.h + "wx/image.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\imagiff.h + "wx/image.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\dc.h + "wx/object.h" + "wx/intl.h" + "wx/cursor.h" + "wx/font.h" + "wx/colour.h" + "wx/bitmap.h" + "wx/brush.h" + "wx/pen.h" + "wx/palette.h" + "wx/list.h" + "wx/dynarray.h" + "wx/math.h" + "wx/palmos/dc.h" + "wx/msw/dc.h" + "wx/motif/dc.h" + "wx/gtk/dc.h" + "wx/gtk1/dc.h" + "wx/x11/dc.h" + "wx/mgl/dc.h" + "wx/dfb/dc.h" + "wx/mac/dc.h" + "wx/cocoa/dc.h" + "wx/os2/dc.h" + "wx/dcgraph.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\brush.h + "wx/defs.h" + "wx/object.h" + "wx/gdiobj.h" + "wx/palmos/brush.h" + "wx/msw/brush.h" + "wx/x11/brush.h" + "wx/gtk/brush.h" + "wx/gtk1/brush.h" + "wx/mgl/brush.h" + "wx/dfb/brush.h" + "wx/mac/brush.h" + "wx/cocoa/brush.h" + "wx/os2/brush.h" + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\brush.h + "wx/gdicmn.h" + "wx/gdiobj.h" + "wx/bitmap.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\pen.h + "wx/defs.h" + "wx/palmos/pen.h" + "wx/msw/pen.h" + "wx/x11/pen.h" + "wx/gtk/pen.h" + "wx/gtk1/pen.h" + "wx/mgl/pen.h" + "wx/dfb/pen.h" + "wx/mac/pen.h" + "wx/cocoa/pen.h" + "wx/os2/pen.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\pen.h + "wx/gdiobj.h" + "wx/bitmap.h" + "wx/colour.h" + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\dc.h + "wx/defs.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\dcgraph.h + "wx/geometry.h" + "wx/dynarray.h" + "wx/graphics.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\geometry.h + "wx/defs.h" + "wx/utils.h" + "wx/gdicmn.h" + "wx/math.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\graphics.h + "wx/defs.h" + "wx/geometry.h" + "wx/dynarray.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\dcclient.h + "wx/defs.h" + "wx/palmos/dcclient.h" + "wx/msw/dcclient.h" + "wx/motif/dcclient.h" + "wx/gtk/dcclient.h" + "wx/gtk1/dcclient.h" + "wx/x11/dcclient.h" + "wx/mgl/dcclient.h" + "wx/dfb/dcclient.h" + "wx/mac/dcclient.h" + "wx/cocoa/dcclient.h" + "wx/os2/dcclient.h" + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\dcclient.h + "wx/dc.h" + "wx/dynarray.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\dcmemory.h + "wx/bitmap.h" + "wx/palmos/dcmemory.h" + "wx/msw/dcmemory.h" + "wx/motif/dcmemory.h" + "wx/gtk/dcmemory.h" + "wx/gtk1/dcmemory.h" + "wx/x11/dcmemory.h" + "wx/mgl/dcmemory.h" + "wx/dfb/dcmemory.h" + "wx/mac/dcmemory.h" + "wx/cocoa/dcmemory.h" + "wx/os2/dcmemory.h" + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\dcmemory.h + "wx/dcclient.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\dcprint.h + "wx/defs.h" + "wx/palmos/dcprint.h" + "wx/msw/dcprint.h" + "wx/os2/dcprint.h" + "wx/mac/dcprint.h" + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\dcprint.h + "wx/dc.h" + "wx/cmndata.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\cmndata.h + "wx/window.h" + "wx/font.h" + "wx/encinfo.h" + "wx/colour.h" + "wx/gdicmn.h" + "wx/stream.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\encinfo.h + "wx/string.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\dcscreen.h + "wx/defs.h" + "wx/palmos/dcscreen.h" + "wx/msw/dcscreen.h" + "wx/motif/dcscreen.h" + "wx/gtk/dcscreen.h" + "wx/gtk1/dcscreen.h" + "wx/x11/dcscreen.h" + "wx/mgl/dcscreen.h" + "wx/dfb/dcscreen.h" + "wx/mac/dcscreen.h" + "wx/cocoa/dcscreen.h" + "wx/os2/dcscreen.h" + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\dcscreen.h + "wx/dc.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\button.h + "wx/defs.h" + "wx/control.h" + "wx/univ/button.h" + "wx/msw/button.h" + "wx/motif/button.h" + "wx/gtk/button.h" + "wx/gtk1/button.h" + "wx/mac/button.h" + "wx/cocoa/button.h" + "wx/os2/button.h" + "wx/palmos/button.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\control.h + "wx/defs.h" + "wx/window.h" + "wx/univ/control.h" + "wx/palmos/control.h" + "wx/msw/control.h" + "wx/motif/control.h" + "wx/gtk/control.h" + "wx/gtk1/control.h" + "wx/mac/control.h" + "wx/cocoa/control.h" + "wx/os2/control.h" + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\control.h + "wx/univ/inphand.h" + "wx/univ/inpcons.h" + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\control.h + "wx/dynarray.h" + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\button.h + "wx/bitmap.h" + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\button.h + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\menuitem.h + "wx/defs.h" + "wx/object.h" + "wx/univ/menuitem.h" + "wx/palmos/menuitem.h" + "wx/msw/menuitem.h" + "wx/motif/menuitem.h" + "wx/gtk/menuitem.h" + "wx/gtk1/menuitem.h" + "wx/mac/menuitem.h" + "wx/cocoa/menuitem.h" + "wx/os2/menuitem.h" + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\menuitem.h + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\menuitem.h + "wx/ownerdrw.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\ownerdrw.h + "wx/defs.h" + "wx/bitmap.h" + "wx/colour.h" + "wx/font.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\menu.h + "wx/defs.h" + "wx/list.h" + "wx/window.h" + "wx/menuitem.h" + "wx/univ/menu.h" + "wx/palmos/menu.h" + "wx/msw/menu.h" + "wx/motif/menu.h" + "wx/gtk/menu.h" + "wx/gtk1/menu.h" + "wx/mac/menu.h" + "wx/cocoa/menu.h" + "wx/os2/menu.h" + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\menu.h + "wx/accel.h" + "wx/dynarray.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\menu.h + "wx/accel.h" + "wx/dynarray.h" + "wx/arrstr.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\dialog.h + "wx/defs.h" + "wx/containr.h" + "wx/toplevel.h" + "wx/univ/dialog.h" + "wx/palmos/dialog.h" + "wx/msw/dialog.h" + "wx/motif/dialog.h" + "wx/gtk/dialog.h" + "wx/gtk1/dialog.h" + "wx/mac/dialog.h" + "wx/cocoa/dialog.h" + "wx/os2/dialog.h" + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\dialog.h + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\dialog.h + "wx/panel.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\timer.h + "wx/defs.h" + "wx/object.h" + "wx/longlong.h" + "wx/event.h" + "wx/stopwatch.h" + "wx/window.h" + "wx/msw/timer.h" + "wx/motif/timer.h" + "wx/gtk/timer.h" + "wx/gtk1/timer.h" + "wx/generic/timer.h" + "wx/cocoa/timer.h" + "wx/mac/timer.h" + "wx/os2/timer.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\timer.h + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\timer.h + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\settings.h + "wx/colour.h" + "wx/font.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msgdlg.h + "wx/defs.h" + "wx/generic/msgdlgg.h" + "wx/generic/msgdlgg.h" + "wx/palmos/msgdlg.h" + "wx/msw/msgdlg.h" + "wx/motif/msgdlg.h" + "wx/gtk/msgdlg.h" + "wx/generic/msgdlgg.h" + "wx/generic/msgdlgg.h" + "wx/mac/msgdlg.h" + "wx/cocoa/msgdlg.h" + "wx/os2/msgdlg.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\msgdlgg.h + "wx/defs.h" + "wx/dialog.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\msgdlg.h + "wx/defs.h" + "wx/dialog.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\dataobj.h + "wx/defs.h" + "wx/string.h" + "wx/bitmap.h" + "wx/list.h" + "wx/arrstr.h" + "wx/msw/ole/dataform.h" + "wx/motif/dataform.h" + "wx/gtk/dataform.h" + "wx/gtk1/dataform.h" + "wx/x11/dataform.h" + "wx/mac/dataform.h" + "wx/cocoa/dataform.h" + "wx/os2/dataform.h" + "wx/msw/ole/dataobj.h" + "wx/motif/dataobj.h" + "wx/x11/dataobj.h" + "wx/gtk/dataobj.h" + "wx/gtk1/dataobj.h" + "wx/mac/dataobj.h" + "wx/cocoa/dataobj.h" + "wx/os2/dataobj.h" + "wx/msw/ole/dataobj2.h" + "wx/gtk/dataobj2.h" + "wx/gtk1/dataobj2.h" + "wx/x11/dataobj2.h" + "wx/motif/dataobj2.h" + "wx/mac/dataobj2.h" + "wx/cocoa/dataobj2.h" + "wx/os2/dataobj2.h" + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\ole\dataform.h + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\ole\dataobj.h + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\ole\dataobj2.h + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\ctrlsub.h + "wx/defs.h" + "wx/control.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\bmpbuttn.h + "wx/defs.h" + "wx/bitmap.h" + "wx/button.h" + "wx/univ/bmpbuttn.h" + "wx/msw/bmpbuttn.h" + "wx/motif/bmpbuttn.h" + "wx/gtk/bmpbuttn.h" + "wx/gtk1/bmpbuttn.h" + "wx/mac/bmpbuttn.h" + "wx/cocoa/bmpbuttn.h" + "wx/os2/bmpbuttn.h" + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\bmpbuttn.h + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\bmpbuttn.h + "wx/button.h" + "wx/bitmap.h" + "wx/brush.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\checkbox.h + "wx/defs.h" + "wx/control.h" + "wx/univ/checkbox.h" + "wx/msw/checkbox.h" + "wx/motif/checkbox.h" + "wx/gtk/checkbox.h" + "wx/gtk1/checkbox.h" + "wx/mac/checkbox.h" + "wx/cocoa/checkbox.h" + "wx/os2/checkbox.h" + "wx/palmos/checkbox.h" + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\checkbox.h + "wx/button.h" + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\checkbox.h + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\checklst.h + "wx/listbox.h" + "wx/univ/checklst.h" + "wx/msw/wince/checklst.h" + "wx/msw/checklst.h" + "wx/motif/checklst.h" + "wx/gtk/checklst.h" + "wx/gtk1/checklst.h" + "wx/mac/checklst.h" + "wx/cocoa/checklst.h" + "wx/os2/checklst.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\listbox.h + "wx/defs.h" + "wx/ctrlsub.h" + "wx/univ/listbox.h" + "wx/msw/listbox.h" + "wx/motif/listbox.h" + "wx/gtk/listbox.h" + "wx/gtk1/listbox.h" + "wx/mac/listbox.h" + "wx/os2/listbox.h" + "wx/cocoa/listbox.h" + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\listbox.h + "wx/scrolwin.h" + "wx/dynarray.h" + "wx/arrstr.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\scrolwin.h + "wx/panel.h" + "wx/gtk/scrolwin.h" + "wx/gtk1/scrolwin.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\listbox.h + "wx/dynarray.h" + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\checklst.h + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\checklst.h + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\checklst.h + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\choice.h + "wx/defs.h" + "wx/ctrlsub.h" + "wx/univ/choice.h" + "wx/msw/wince/choicece.h" + "wx/msw/choice.h" + "wx/motif/choice.h" + "wx/gtk/choice.h" + "wx/gtk1/choice.h" + "wx/mac/choice.h" + "wx/cocoa/choice.h" + "wx/os2/choice.h" + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\choice.h + "wx/combobox.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\combobox.h + "wx/defs.h" + "wx/textctrl.h" + "wx/ctrlsub.h" + "wx/univ/combobox.h" + "wx/msw/combobox.h" + "wx/motif/combobox.h" + "wx/gtk/combobox.h" + "wx/gtk1/combobox.h" + "wx/mac/combobox.h" + "wx/cocoa/combobox.h" + "wx/os2/combobox.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\textctrl.h + "wx/defs.h" + "wx/control.h" + "wx/dynarray.h" + "wx/gdicmn.h" + "wx/ioswrap.h" + "wx/x11/textctrl.h" + "wx/univ/textctrl.h" + "wx/msw/wince/textctrlce.h" + "wx/msw/textctrl.h" + "wx/motif/textctrl.h" + "wx/gtk/textctrl.h" + "wx/gtk1/textctrl.h" + "wx/mac/textctrl.h" + "wx/cocoa/textctrl.h" + "wx/os2/textctrl.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\ioswrap.h + + + "wx/msw/winundef.h" + +1300793819 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\textctrl.h + "wx/scrolwin.h" + "wx/univ/inphand.h" + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\textctrlce.h + "wx/dynarray.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\textctrl.h + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\combobox.h + "wx/combo.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\combo.h + "wx/defs.h" + "wx/control.h" + "wx/renderer.h" + "wx/bitmap.h" + "wx/msw/combo.h" + "wx/generic/combo.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\renderer.h + "wx/gdicmn.h" + "wx/colour.h" + "wx/font.h" + "wx/bitmap.h" + "wx/string.h" + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\combo.h + "wx/timer.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\combo.h + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\combobox.h + "wx/choice.h" + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\choicece.h + "wx/defs.h" + "wx/dynarray.h" + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\choice.h + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\scrolbar.h + "wx/defs.h" + "wx/control.h" + "wx/univ/scrolbar.h" + "wx/msw/scrolbar.h" + "wx/motif/scrolbar.h" + "wx/gtk/scrolbar.h" + "wx/gtk1/scrolbar.h" + "wx/mac/scrolbar.h" + "wx/cocoa/scrolbar.h" + "wx/os2/scrolbar.h" + +1300793819 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\scrolbar.h + "wx/univ/scrarrow.h" + "wx/renderer.h" + +1300793819 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\scrarrow.h + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\scrolbar.h + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\stattext.h + "wx/defs.h" + "wx/control.h" + "wx/univ/stattext.h" + "wx/msw/stattext.h" + "wx/motif/stattext.h" + "wx/gtk/stattext.h" + "wx/gtk1/stattext.h" + "wx/mac/stattext.h" + "wx/cocoa/stattext.h" + "wx/os2/stattext.h" + "wx/palmos/stattext.h" + +1300793819 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\stattext.h + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\stattext.h + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\statbmp.h + "wx/defs.h" + "wx/control.h" + "wx/bitmap.h" + "wx/icon.h" + "wx/univ/statbmp.h" + "wx/msw/statbmp.h" + "wx/motif/statbmp.h" + "wx/gtk/statbmp.h" + "wx/gtk1/statbmp.h" + "wx/mac/statbmp.h" + "wx/cocoa/statbmp.h" + "wx/os2/statbmp.h" + +1300793819 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\statbmp.h + "wx/bitmap.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\statbmp.h + "wx/control.h" + "wx/icon.h" + "wx/bitmap.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\statbox.h + "wx/defs.h" + "wx/control.h" + "wx/univ/statbox.h" + "wx/msw/statbox.h" + "wx/motif/statbox.h" + "wx/gtk/statbox.h" + "wx/gtk1/statbox.h" + "wx/mac/statbox.h" + "wx/cocoa/statbox.h" + "wx/os2/statbox.h" + +1300793819 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\statbox.h + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\statbox.h + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\radiobox.h + "wx/ctrlsub.h" + "wx/dynarray.h" + "wx/univ/radiobox.h" + "wx/msw/radiobox.h" + "wx/motif/radiobox.h" + "wx/gtk/radiobox.h" + "wx/gtk1/radiobox.h" + "wx/mac/radiobox.h" + "wx/cocoa/radiobox.h" + "wx/os2/radiobox.h" + "wx/palmos/radiobox.h" + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\radiobox.h + "wx/statbox.h" + "wx/dynarray.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\radiobox.h + "wx/statbox.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\radiobut.h + "wx/defs.h" + "wx/control.h" + "wx/univ/radiobut.h" + "wx/msw/radiobut.h" + "wx/motif/radiobut.h" + "wx/gtk/radiobut.h" + "wx/gtk1/radiobut.h" + "wx/mac/radiobut.h" + "wx/cocoa/radiobut.h" + "wx/os2/radiobut.h" + "wx/palmos/radiobut.h" + +1300793819 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\radiobut.h + "wx/checkbox.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\radiobut.h + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\slider.h + "wx/defs.h" + "wx/control.h" + "wx/univ/slider.h" + "wx/msw/slider95.h" + "wx/motif/slider.h" + "wx/gtk/slider.h" + "wx/gtk1/slider.h" + "wx/mac/slider.h" + "wx/cocoa/slider.h" + "wx/os2/slider.h" + "wx/palmos/slider.h" + +1300793819 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\slider.h + "wx/univ/scrthumb.h" + +1300793819 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\scrthumb.h + "wx/timer.h" + +1699738830 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\slider95.h + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\gauge.h + "wx/defs.h" + "wx/control.h" + "wx/univ/gauge.h" + "wx/msw/gauge95.h" + "wx/motif/gauge.h" + "wx/gtk/gauge.h" + "wx/gtk1/gauge.h" + "wx/mac/gauge.h" + "wx/cocoa/gauge.h" + "wx/os2/gauge.h" + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\gauge.h + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\gauge95.h + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\dirdlg.h + "wx/dialog.h" + "wx/generic/dirdlgg.h" + "wx/generic/dirdlgg.h" + "wx/generic/dirdlgg.h" + "wx/msw/dirdlg.h" + "wx/gtk/dirdlg.h" + "wx/generic/dirdlgg.h" + "wx/mac/dirdlg.h" + "wx/cocoa/dirdlg.h" + "wx/generic/dirdlgg.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\dirdlgg.h + "wx/dialog.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\dirdlg.h + +1300793744 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\toolbar.h + "wx/defs.h" + "wx/tbarbase.h" + "wx/univ/toolbar.h" + "wx/palmos/toolbar.h" + "wx/msw/tbar95.h" + "wx/msw/wince/tbarwce.h" + "wx/motif/toolbar.h" + "wx/gtk/tbargtk.h" + "wx/gtk1/tbargtk.h" + "wx/mac/toolbar.h" + "wx/cocoa/toolbar.h" + "wx/os2/toolbar.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\tbarbase.h + "wx/defs.h" + "wx/bitmap.h" + "wx/list.h" + "wx/control.h" + +1300793819 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\toolbar.h + "wx/button.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\tbar95.h + "wx/dynarray.h" + "wx/imaglist.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\imaglist.h + "wx/generic/imaglist.h" + "wx/msw/imaglist.h" + "wx/mac/imaglist.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\imaglist.h + "wx/defs.h" + "wx/list.h" + "wx/icon.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\imaglist.h + "wx/bitmap.h" + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\tbarwce.h + "wx/dynarray.h" + "wx/msw/tbar95.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\layout.h + "wx/object.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\sizer.h + "wx/defs.h" + "wx/window.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\mdi.h + "wx/defs.h" + "wx/generic/mdig.h" + "wx/msw/mdi.h" + "wx/motif/mdi.h" + "wx/gtk/mdi.h" + "wx/gtk1/mdi.h" + "wx/mac/mdi.h" + "wx/cocoa/mdi.h" + "wx/generic/mdig.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\mdig.h + "wx/frame.h" + "wx/panel.h" + "wx/notebook.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\notebook.h + "wx/defs.h" + "wx/bookctrl.h" + "wx/univ/notebook.h" + "wx/msw/notebook.h" + "wx/generic/notebook.h" + "wx/gtk/notebook.h" + "wx/gtk1/notebook.h" + "wx/mac/notebook.h" + "wx/cocoa/notebook.h" + "wx/os2/notebook.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\bookctrl.h + "wx/defs.h" + "wx/control.h" + "wx/dynarray.h" + "wx/notebook.h" + "wx/choicebk.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\choicebk.h + "wx/defs.h" + "wx/bookctrl.h" + "wx/choice.h" + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\notebook.h + "wx/arrstr.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\notebook.h + "wx/control.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\notebook.h + "wx/event.h" + "wx/control.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\mdi.h + "wx/frame.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\statusbr.h + "wx/defs.h" + "wx/window.h" + "wx/list.h" + "wx/dynarray.h" + "wx/univ/statusbr.h" + "wx/palmos/statusbr.h" + "wx/msw/statbr95.h" + "wx/generic/statusbr.h" + "wx/mac/statusbr.h" + "wx/generic/statusbr.h" + +1300793819 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\statusbr.h + "wx/univ/inpcons.h" + "wx/arrstr.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\statbr95.h + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\statusbr.h + "wx/defs.h" + "wx/pen.h" + "wx/arrstr.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\choicdlg.h + "wx/generic/choicdgg.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\choicdgg.h + "wx/dynarray.h" + "wx/dialog.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\textdlg.h + "wx/generic/textdlgg.h" + "wx/numdlg.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\textdlgg.h + "wx/defs.h" + "wx/dialog.h" + "wx/valtext.h" + +1300793744 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\valtext.h + "wx/defs.h" + "wx/textctrl.h" + "wx/validate.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\numdlg.h + "wx/defs.h" + "wx/generic/numdlgg.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\numdlgg.h + "wx/defs.h" + "wx/dialog.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\filedlg.h + "wx/defs.h" + "wx/dialog.h" + "wx/arrstr.h" + "wx/generic/filedlgg.h" + "wx/msw/filedlg.h" + "wx/motif/filedlg.h" + "wx/gtk/filedlg.h" + "wx/generic/filedlgg.h" + "wx/gtk1/filedlg.h" + "wx/mac/filedlg.h" + "wx/cocoa/filedlg.h" + "wx/os2/filedlg.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\filedlgg.h + "wx/listctrl.h" + "wx/datetime.h" + "wx/filefn.h" + "wx/filedlg.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\listctrl.h + "wx/defs.h" + "wx/listbase.h" + "wx/msw/listctrl.h" + "wx/mac/carbon/listctrl.h" + "wx/generic/listctrl.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\listbase.h + "wx/colour.h" + "wx/font.h" + "wx/gdicmn.h" + "wx/event.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\listctrl.h + "wx/textctrl.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\listctrl.h + "wx/textctrl.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\filedlg.h + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\socket.h + "wx/defs.h" + "wx/event.h" + "wx/sckaddr.h" + "wx/gsocket.h" + "wx/list.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\sckaddr.h + "wx/defs.h" + "wx/string.h" + "wx/gsocket.h" + + + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\gsocket.h + "wx/defs.h" + "wx/dlimpexp.h" + + + + "wx/msw/gsockmsw.h" + "wx/mac/gsockmac.h" + "wx/unix/gsockunx.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\gsockmsw.h + "wx/setup.h" + "wx/gsocket.h" + "gsocket.h" + "wx/msw/wrapwin.h" + + + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\unix\gsockunx.h + "wx/setup.h" + "wx/gsocket.h" + "gsocket.h" + +1699734225 source:h:\cblegacy_new\samples\tcptest\tcpserver.cpp + "tcpserver.h" + +1699704379 h:\cblegacy_new\samples\tcptest\tcpserver.h + "wx/wx.h" + "wx/socket.h" + "wx/event.h" + + + +1699653562 source:h:\cblegacy_new\samples\tcptest\tcptestapp.cpp + "tcptestApp.h" + "tcptestMain.h" + + +1699653562 h:\cblegacy_new\samples\tcptest\tcptestapp.h + + +1699705966 h:\cblegacy_new\samples\tcptest\tcptestmain.h + + + + + + + + + + + + + "tcpserver.h" + "tcpclient.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\spinctrl.h + "wx/defs.h" + "wx/spinbutt.h" + "wx/generic/spinctlg.h" + "wx/msw/spinctrl.h" + "wx/os2/spinctrl.h" + "wx/gtk/spinctrl.h" + "wx/gtk1/spinctrl.h" + "wx/generic/spinctlg.h" + "wx/mac/spinctrl.h" + "wx/generic/spinctlg.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\spinbutt.h + "wx/defs.h" + "wx/control.h" + "wx/event.h" + "wx/univ/spinbutt.h" + "wx/msw/spinbutt.h" + "wx/motif/spinbutt.h" + "wx/gtk/spinbutt.h" + "wx/gtk1/spinbutt.h" + "wx/mac/spinbutt.h" + "wx/cocoa/spinbutt.h" + "wx/os2/spinbutt.h" + +1300793819 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\spinbutt.h + "wx/univ/scrarrow.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\spinbutt.h + "wx/control.h" + "wx/event.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\spinctlg.h + "wx/textctrl.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\spinctrl.h + "wx/spinbutt.h" + "wx/dynarray.h" + +1699706597 source:h:\cblegacy_new\samples\tcptest\tcptestmain.cpp + "tcptestMain.h" + + + + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\wx.rc + + "wx/msw/wince/wince.rc" + "wx/msw/rcdefs.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\wince.rc + + "wx/msw/wince/resources.h" + "wx/msw/wince/smartphone.rc" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\resources.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\smartphone.rc + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\rcdefs.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\app.h + "wx/event.h" + "wx/eventfilter.h" + "wx/build.h" + "wx/cmdargs.h" + "wx/init.h" + "wx/intl.h" + "wx/log.h" + "wx/unix/app.h" + "wx/msw/app.h" + "wx/motif/app.h" + "wx/dfb/app.h" + "wx/gtk/app.h" + "wx/gtk1/app.h" + "wx/x11/app.h" + "wx/osx/app.h" + "wx/cocoa/app.h" + "wx/os2/app.h" + "wx/univ/theme.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\event.h + "wx/defs.h" + "wx/cpp.h" + "wx/object.h" + "wx/clntdata.h" + "wx/gdicmn.h" + "wx/cursor.h" + "wx/mousestate.h" + "wx/dynarray.h" + "wx/thread.h" + "wx/tracker.h" + "wx/typeinfo.h" + "wx/any.h" + "wx/meta/convertible.h" + "wx/meta/removeref.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\defs.h + "wx/platform.h" + "wx/version.h" + "wx/dlimpexp.h" + + "wx/debug.h" + + + "wx/windowid.h" + + "wx/msw/winundef.h" + "wx/features.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\platform.h + + + + "wx/osx/config_xcode.h" + "wx/android/config_android.h" + "wx/compiler.h" + "wx/setup.h" + "wx/msw/wince/libraries.h" + "wx/msw/libraries.h" + "wx/msw/gccpriv.h" + + + "wx/chkconf.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\config_xcode.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\android\config_android.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\compiler.h + +1699795883 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\lib\gcc_lib\mswu\wx\setup.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\libraries.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\libraries.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\gccpriv.h + <_mingw.h> + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\chkconf.h + "wx/msw/wince/chkconf.h" + "wx/msw/chkconf.h" + "wx/gtk/chkconf.h" + "wx/gtk/chkconf.h" + "wx/cocoa/chkconf.h" + "wx/osx/chkconf.h" + "wx/os2/chkconf.h" + "wx/dfb/chkconf.h" + "wx/motif/chkconf.h" + "wx/x11/chkconf.h" + "wx/android/chkconf.h" + "wx/unix/chkconf.h" + "wx/univ/chkconf.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\chkconf.h + "wx/osx/iphone/chkconf.h" + "wx/osx/carbon/chkconf.h" + "wx/osx/cocoa/chkconf.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\iphone\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\carbon\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\cocoa\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\android\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\unix\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\version.h + "wx/cpp.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cpp.h + "wx/compiler.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dlimpexp.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\debug.h + + + "wx/chartype.h" + "wx/cpp.h" + "wx/dlimpexp.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\chartype.h + "wx/platform.h" + + + + + + + + + + + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\windowid.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\winundef.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\features.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\object.h + "wx/memory.h" + "wx/xti.h" + "wx/rtti.h" + "wx/xti2.h" + "wx/msw/msvcrt.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\memory.h + "wx/defs.h" + "wx/string.h" + "wx/msgout.h" + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\string.h + "wx/defs.h" + + + + + + + + + + + "wx/wxcrtbase.h" + "wx/strvararg.h" + "wx/buffer.h" + "wx/strconv.h" + "wx/stringimpl.h" + "wx/stringops.h" + "wx/unichar.h" + "wx/tls.h" + "wx/iosfwrap.h" + "wx/crt.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\wxcrtbase.h + "wx/chartype.h" + + + + + + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\strvararg.h + "wx/platform.h" + "wx/cpp.h" + "wx/chartype.h" + "wx/strconv.h" + "wx/buffer.h" + "wx/unichar.h" + + + + "wx/stringimpl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\strconv.h + "wx/defs.h" + "wx/chartype.h" + "wx/buffer.h" + "typeinfo.h" + + "wx/fontenc.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\buffer.h + "wx/chartype.h" + "wx/wxcrtbase.h" + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\typeinfo.h + "wx/defs.h" + + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\fontenc.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\unichar.h + "wx/defs.h" + "wx/chartype.h" + "wx/stringimpl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\stringimpl.h + "wx/defs.h" + "wx/chartype.h" + "wx/wxcrtbase.h" + + "wx/beforestd.h" + + "wx/afterstd.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\beforestd.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\afterstd.h + "wx/msw/winundef.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\stringops.h + "wx/chartype.h" + "wx/stringimpl.h" + "wx/unichar.h" + "wx/buffer.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\tls.h + "wx/defs.h" + "wx/msw/tls.h" + "wx/os2/tls.h" + "wx/unix/tls.h" + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\tls.h + "wx/msw/wrapwin.h" + "wx/thread.h" + "wx/vector.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\wrapwin.h + "wx/platform.h" + + + "wx/msw/winundef.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\thread.h + "wx/defs.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\vector.h + "wx/defs.h" + + + "wx/scopeguard.h" + "wx/meta/movable.h" + "wx/meta/if.h" + "wx/beforestd.h" + + "wx/afterstd.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\scopeguard.h + "wx/defs.h" + "wx/except.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\except.h + "wx/defs.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\meta\movable.h + "wx/meta/pod.h" + "wx/string.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\meta\pod.h + "wx/defs.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\meta\if.h + "wx/defs.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\tls.h + "wx/os2/private.h" + "wx/thread.h" + "wx/vector.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\private.h + + + + + + + + "wx/dlimpexp.h" + "wx/fontenc.h" + "wx/thread.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\unix\tls.h + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\iosfwrap.h + + + "wx/msw/winundef.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\crt.h + "wx/defs.h" + "wx/chartype.h" + "wx/wxcrt.h" + "wx/wxcrtvararg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\wxcrt.h + "wx/wxcrtbase.h" + "wx/string.h" + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\wxcrtvararg.h + "wx/wxcrt.h" + "wx/strvararg.h" + "wx/string.h" + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msgout.h + "wx/defs.h" + "wx/chartype.h" + "wx/strvararg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\xti.h + "wx/defs.h" + "wx/xtitypes.h" + "wx/xtihandler.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\xtitypes.h + "wx/defs.h" + "wx/string.h" + "wx/hashmap.h" + "wx/arrstr.h" + "wx/flags.h" + "wx/intl.h" + "wx/log.h" + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\hashmap.h + "wx/string.h" + "wx/wxcrt.h" + + + + + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\arrstr.h + "wx/defs.h" + "wx/string.h" + "wx/dynarray.h" + "wx/beforestd.h" + + "wx/afterstd.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dynarray.h + "wx/defs.h" + "wx/beforestd.h" + + + "wx/afterstd.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\flags.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\intl.h + "wx/defs.h" + "wx/string.h" + "wx/translation.h" + "wx/fontenc.h" + "wx/language.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\translation.h + "wx/defs.h" + "wx/string.h" + "wx/buffer.h" + "wx/language.h" + "wx/hashmap.h" + "wx/strconv.h" + "wx/scopedptr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\language.h + "wx/defs.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\scopedptr.h + "wx/defs.h" + "wx/checkeddelete.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\checkeddelete.h + "wx/cpp.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\log.h + "wx/defs.h" + "wx/cpp.h" + "wx/string.h" + "wx/strvararg.h" + "wx/arrstr.h" + + "wx/dynarray.h" + "wx/hashmap.h" + "wx/thread.h" + "wx/iosfwrap.h" + "wx/generic/logg.h" + "wx/cocoa/log.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\logg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\log.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\xtihandler.h + "wx/defs.h" + "wx/xti.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\rtti.h + "wx/memory.h" + "wx/flags.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\xti2.h + "wx/xtiprop.h" + "wx/xtictor.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\xtiprop.h + "wx/defs.h" + "wx/xti.h" + "wx/any.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\any.h + "wx/defs.h" + + "wx/string.h" + "wx/meta/if.h" + "wx/typeinfo.h" + "wx/list.h" + "wx/datetime.h" + "wx/variant.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\list.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/vector.h" + "wx/beforestd.h" + + + + "wx/afterstd.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\datetime.h + "wx/defs.h" + "wx/msw/wince/time.h" + + + "wx/longlong.h" + "wx/anystr.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\time.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\longlong.h + "wx/defs.h" + "wx/string.h" + + "wx/iosfwrap.h" + + "wx/strvararg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\anystr.h + "wx/string.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\variant.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/arrstr.h" + "wx/list.h" + "wx/cpp.h" + "wx/longlong.h" + "wx/datetime.h" + "wx/iosfwrap.h" + "wx/any.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\xtictor.h + "wx/defs.h" + "wx/xti.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\msvcrt.h + + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\clntdata.h + "wx/defs.h" + "wx/string.h" + "wx/hashmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gdicmn.h + "wx/defs.h" + "wx/list.h" + "wx/string.h" + "wx/fontenc.h" + "wx/hashmap.h" + "wx/math.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\math.h + "wx/defs.h" + + + + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cursor.h + "wx/defs.h" + "wx/msw/cursor.h" + "wx/motif/cursor.h" + "wx/gtk/cursor.h" + "wx/gtk1/cursor.h" + "wx/x11/cursor.h" + "wx/dfb/cursor.h" + "wx/osx/cursor.h" + "wx/cocoa/cursor.h" + "wx/os2/cursor.h" + "wx/utils.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\cursor.h + "wx/msw/gdiimage.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\gdiimage.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/list.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gdiobj.h + "wx/object.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\cursor.h + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\cursor.h + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\cursor.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/image.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\image.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdicmn.h" + "wx/hashmap.h" + "wx/arrstr.h" + "wx/stream.h" + "wx/variant.h" + "wx/imagbmp.h" + "wx/imagpng.h" + "wx/imaggif.h" + "wx/imagpcx.h" + "wx/imagjpeg.h" + "wx/imagtga.h" + "wx/imagtiff.h" + "wx/imagpnm.h" + "wx/imagxpm.h" + "wx/imagiff.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\stream.h + "wx/defs.h" + + "wx/object.h" + "wx/string.h" + "wx/filefn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\filefn.h + "wx/list.h" + "wx/arrstr.h" + "wx/msw/wince/time.h" + "wx/msw/private.h" + + + + + "wx/os2/private.h" + + + + + + + + + + + + + + + + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\private.h + "wx/msw/wrapwin.h" + "wx/msw/microwin.h" + "wx/log.h" + "wx/window.h" + "wx/gdicmn.h" + "wx/colour.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\microwin.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\window.h + "wx/event.h" + "wx/list.h" + "wx/cursor.h" + "wx/font.h" + "wx/colour.h" + "wx/region.h" + "wx/utils.h" + "wx/intl.h" + "wx/validate.h" + "wx/palette.h" + "wx/accel.h" + "wx/access.h" + "wx/msw/window.h" + "wx/motif/window.h" + "wx/gtk/window.h" + "wx/gtk1/window.h" + "wx/x11/window.h" + "wx/dfb/window.h" + "wx/osx/window.h" + "wx/cocoa/window.h" + "wx/os2/window.h" + "wx/univ/window.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\font.h + "wx/defs.h" + "wx/fontenc.h" + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/msw/font.h" + "wx/motif/font.h" + "wx/gtk/font.h" + "wx/gtk1/font.h" + "wx/x11/font.h" + "wx/dfb/font.h" + "wx/osx/font.h" + "wx/cocoa/font.h" + "wx/os2/font.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\font.h + "wx/gdicmn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\font.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\font.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\font.h + "wx/hash.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\hash.h + "wx/defs.h" + "wx/string.h" + "wx/object.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\font.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\font.h + "wx/dfb/dfbptr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\dfbptr.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\font.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\font.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\font.h + "wx/gdiobj.h" + "wx/os2/private.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\colour.h + "wx/defs.h" + "wx/gdiobj.h" + "wx/variant.h" + "wx/msw/colour.h" + "wx/motif/colour.h" + "wx/gtk/colour.h" + "wx/gtk1/colour.h" + "wx/generic/colour.h" + "wx/x11/colour.h" + "wx/osx/colour.h" + "wx/cocoa/colour.h" + "wx/os2/colour.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\colour.h + "wx/object.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\colour.h + "wx/object.h" + "wx/string.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\colour.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\colour.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdiobj.h" + "wx/palette.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\palette.h + "wx/defs.h" + "wx/object.h" + "wx/gdiobj.h" + "wx/msw/palette.h" + "wx/x11/palette.h" + "wx/generic/paletteg.h" + "wx/osx/palette.h" + "wx/os2/palette.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\palette.h + "wx/gdiobj.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\palette.h + "wx/list.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\paletteg.h + "wx/defs.h" + "wx/object.h" + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\palette.h + "wx/gdiobj.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\palette.h + "wx/gdiobj.h" + "wx/os2/private.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\colour.h + "wx/object.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\colour.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdiobj.h" + "wx/palette.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\colour.h + "wx/osx/core/colour.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\core\colour.h + "wx/object.h" + "wx/string.h" + "wx/osx/core/cfref.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\core\cfref.h + + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\colour.h + "wx/object.h" + "wx/string.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\colour.h + "wx/object.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\region.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/msw/region.h" + "wx/gtk/region.h" + "wx/gtk1/region.h" + "wx/x11/region.h" + "wx/dfb/region.h" + "wx/osx/region.h" + "wx/cocoa/region.h" + "wx/os2/region.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\region.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\region.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\region.h + "wx/list.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\region.h + "wx/list.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\region.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\region.h + "wx/osx/carbon/region.h" + "wx/generic/region.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\carbon\region.h + "wx/list.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\region.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\region.h + "wx/generic/region.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\region.h + "wx/list.h" + "wx/os2/private.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\utils.h + "wx/object.h" + "wx/list.h" + "wx/filefn.h" + "wx/hashmap.h" + "wx/versioninfo.h" + "wx/meta/implicitconversion.h" + "wx/gdicmn.h" + "wx/mousestate.h" + "wx/longlong.h" + "wx/platinfo.h" + + + + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\versioninfo.h + "wx/string.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\meta\implicitconversion.h + "wx/defs.h" + "wx/meta/if.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\mousestate.h + "wx/gdicmn.h" + "wx/kbdstate.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\kbdstate.h + "wx/defs.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\platinfo.h + "wx/string.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\validate.h + "wx/defs.h" + "wx/event.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\accel.h + "wx/defs.h" + "wx/object.h" + "wx/generic/accel.h" + "wx/msw/accel.h" + "wx/motif/accel.h" + "wx/gtk/accel.h" + "wx/gtk1/accel.h" + "wx/osx/accel.h" + "wx/generic/accel.h" + "wx/os2/accel.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\accel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\accel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\accel.h + "wx/object.h" + "wx/string.h" + "wx/event.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\accel.h + "wx/generic/accel.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\accel.h + "wx/generic/accel.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\accel.h + "wx/string.h" + "wx/event.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\accel.h + "wx/object.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\access.h + "wx/defs.h" + "wx/variant.h" + "wx/msw/ole/access.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\ole\access.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\window.h + "wx/settings.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\settings.h + "wx/colour.h" + "wx/font.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\window.h + "wx/region.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\window.h + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\window.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\window.h + "wx/region.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\window.h + "wx/dfb/dfbptr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\window.h + "wx/brush.h" + "wx/dc.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\brush.h + "wx/defs.h" + "wx/object.h" + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/msw/brush.h" + "wx/x11/brush.h" + "wx/gtk/brush.h" + "wx/gtk1/brush.h" + "wx/dfb/brush.h" + "wx/osx/brush.h" + "wx/cocoa/brush.h" + "wx/os2/brush.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\brush.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\brush.h + "wx/gdiobj.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\brush.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\brush.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdiobj.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\bitmap.h + "wx/string.h" + "wx/gdicmn.h" + "wx/colour.h" + "wx/image.h" + "wx/variant.h" + "wx/msw/bitmap.h" + "wx/x11/bitmap.h" + "wx/gtk/bitmap.h" + "wx/gtk1/bitmap.h" + "wx/x11/bitmap.h" + "wx/dfb/bitmap.h" + "wx/osx/bitmap.h" + "wx/cocoa/bitmap.h" + "wx/os2/bitmap.h" + "wx/generic/mask.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\bitmap.h + "wx/msw/gdiimage.h" + "wx/math.h" + "wx/palette.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\bitmap.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/palette.h" + "wx/gdiobj.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\bitmap.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\bitmap.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/palette.h" + "wx/gdiobj.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\bitmap.h + "wx/dfb/dfbptr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\bitmap.h + "wx/palette.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\bitmap.h + "wx/palette.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\bitmap.h + "wx/os2/private.h" + "wx/os2/gdiimage.h" + "wx/gdicmn.h" + "wx/palette.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\gdiimage.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/list.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\mask.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\brush.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdiobj.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\brush.h + "wx/gdicmn.h" + "wx/gdiobj.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\brush.h + "wx/gdicmn.h" + "wx/gdiobj.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\brush.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dc.h + "wx/object.h" + "wx/intl.h" + "wx/cursor.h" + "wx/font.h" + "wx/colour.h" + "wx/bitmap.h" + "wx/brush.h" + "wx/pen.h" + "wx/palette.h" + "wx/dynarray.h" + "wx/math.h" + "wx/image.h" + "wx/region.h" + "wx/affinematrix2d.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\pen.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/msw/pen.h" + "wx/x11/pen.h" + "wx/gtk/pen.h" + "wx/gtk1/pen.h" + "wx/dfb/pen.h" + "wx/osx/pen.h" + "wx/cocoa/pen.h" + "wx/os2/pen.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\pen.h + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\pen.h + "wx/gdicmn.h" + "wx/gdiobj.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\pen.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\pen.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\pen.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\pen.h + "wx/gdiobj.h" + "wx/colour.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\pen.h + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\pen.h + "wx/gdiobj.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\affinematrix2d.h + "wx/defs.h" + "wx/affinematrix2dbase.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\affinematrix2dbase.h + "wx/defs.h" + "wx/geometry.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\geometry.h + "wx/defs.h" + "wx/utils.h" + "wx/gdicmn.h" + "wx/math.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\window.h + "wx/cocoa/NSView.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nsview.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\objcassociate.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\window.h + + "wx/hash.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\window.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\imagbmp.h + "wx/image.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\imagpng.h + "wx/defs.h" + "wx/image.h" + "wx/versioninfo.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\imaggif.h + "wx/image.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\imagpcx.h + "wx/image.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\imagjpeg.h + "wx/defs.h" + "wx/image.h" + "wx/versioninfo.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\imagtga.h + "wx/image.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\imagtiff.h + "wx/defs.h" + "wx/image.h" + "wx/versioninfo.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\imagpnm.h + "wx/image.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\imagxpm.h + "wx/image.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\imagiff.h + "wx/image.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\cursor.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/colour.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\cursor.h + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\cursor.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\cursor.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\cursor.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\tracker.h + "wx/defs.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\meta\convertible.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\meta\removeref.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\eventfilter.h + "wx/defs.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\build.h + "wx/version.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cmdargs.h + "wx/arrstr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\init.h + "wx/defs.h" + "wx/chartype.h" + "wx/msw/init.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\init.h + "wx/msw/wrapwin.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\unix\app.h + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\app.h + "wx/event.h" + "wx/icon.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\icon.h + "wx/iconloc.h" + "wx/msw/icon.h" + "wx/motif/icon.h" + "wx/generic/icon.h" + "wx/generic/icon.h" + "wx/generic/icon.h" + "wx/generic/icon.h" + "wx/osx/icon.h" + "wx/generic/icon.h" + "wx/cocoa/icon.h" + "wx/os2/icon.h" + "wx/variant.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\iconloc.h + "wx/string.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\icon.h + "wx/msw/gdiimage.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\icon.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\icon.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\icon.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\icon.h + "wx/gdicmn.h" + "wx/gdiobj.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\icon.h + "wx/bitmap.h" + "wx/os2/gdiimage.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\app.h + "wx/event.h" + "wx/hashmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\app.h + "wx/dfb/dfbptr.h" + "wx/vidmode.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\vidmode.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\app.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\app.h + "wx/frame.h" + "wx/icon.h" + "wx/strconv.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\frame.h + "wx/toplevel.h" + "wx/statusbr.h" + "wx/univ/frame.h" + "wx/msw/frame.h" + "wx/gtk/frame.h" + "wx/gtk1/frame.h" + "wx/motif/frame.h" + "wx/osx/frame.h" + "wx/cocoa/frame.h" + "wx/os2/frame.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\toplevel.h + "wx/nonownedwnd.h" + "wx/iconbndl.h" + "wx/weakref.h" + "wx/msw/toplevel.h" + "wx/gtk/toplevel.h" + "wx/gtk1/toplevel.h" + "wx/x11/toplevel.h" + "wx/dfb/toplevel.h" + "wx/osx/toplevel.h" + "wx/cocoa/toplevel.h" + "wx/os2/toplevel.h" + "wx/motif/toplevel.h" + "wx/univ/toplevel.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\nonownedwnd.h + "wx/window.h" + "wx/dfb/nonownedwnd.h" + "wx/gtk/nonownedwnd.h" + "wx/osx/nonownedwnd.h" + "wx/msw/nonownedwnd.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\nonownedwnd.h + "wx/window.h" + "wx/dfb/dfbptr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\nonownedwnd.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\nonownedwnd.h + "wx/window.h" + "wx/graphics.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\graphics.h + "wx/defs.h" + "wx/geometry.h" + "wx/dynarray.h" + "wx/dc.h" + "wx/image.h" + "wx/vector.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\nonownedwnd.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\iconbndl.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/icon.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\weakref.h + "wx/tracker.h" + "wx/meta/convertible.h" + "wx/meta/int2type.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\meta\int2type.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\toplevel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\toplevel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\toplevel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\toplevel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\toplevel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\toplevel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\toplevel.h + "wx/hashmap.h" + "wx/cocoa/NSWindow.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nswindow.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\toplevel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\toplevel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\toplevel.h + "wx/univ/inpcons.h" + "wx/univ/inphand.h" + "wx/icon.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\inpcons.h + "wx/object.h" + "wx/event.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\inphand.h + "wx/univ/inpcons.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\statusbr.h + "wx/defs.h" + "wx/control.h" + "wx/list.h" + "wx/dynarray.h" + "wx/univ/statusbr.h" + "wx/msw/statusbar.h" + "wx/generic/statusbr.h" + "wx/osx/statusbr.h" + "wx/generic/statusbr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\control.h + "wx/defs.h" + "wx/window.h" + "wx/univ/control.h" + "wx/msw/control.h" + "wx/motif/control.h" + "wx/gtk/control.h" + "wx/gtk1/control.h" + "wx/osx/control.h" + "wx/cocoa/control.h" + "wx/os2/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\control.h + "wx/univ/inphand.h" + "wx/univ/inpcons.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\control.h + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\control.h + "wx/window.h" + "wx/list.h" + "wx/validate.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\control.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\control.h + "wx/defs.h" + "wx/object.h" + "wx/list.h" + "wx/window.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\control.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\control.h + "wx/cocoa/NSControl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nscontrol.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\control.h + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\statusbr.h + "wx/univ/inpcons.h" + "wx/arrstr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\statusbar.h + "wx/vector.h" + "wx/tooltip.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\tooltip.h + "wx/defs.h" + "wx/msw/tooltip.h" + "wx/gtk/tooltip.h" + "wx/gtk1/tooltip.h" + "wx/osx/tooltip.h" + "wx/cocoa/tooltip.h" + "wx/os2/tooltip.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\tooltip.h + "wx/object.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\tooltip.h + "wx/string.h" + "wx/object.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\tooltip.h + "wx/defs.h" + "wx/string.h" + "wx/object.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\tooltip.h + "wx/string.h" + "wx/event.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\tooltip.h + "wx/object.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\tooltip.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\statusbr.h + "wx/defs.h" + "wx/pen.h" + "wx/arrstr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\statusbr.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\frame.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\frame.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\frame.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\frame.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\frame.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\frame.h + "wx/toolbar.h" + "wx/accel.h" + "wx/icon.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\toolbar.h + "wx/defs.h" + "wx/tbarbase.h" + "wx/univ/toolbar.h" + "wx/msw/toolbar.h" + "wx/msw/wince/tbarwce.h" + "wx/motif/toolbar.h" + "wx/gtk/toolbar.h" + "wx/gtk1/toolbar.h" + "wx/osx/toolbar.h" + "wx/cocoa/toolbar.h" + "wx/os2/toolbar.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\tbarbase.h + "wx/defs.h" + "wx/bitmap.h" + "wx/list.h" + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\toolbar.h + "wx/button.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\button.h + "wx/defs.h" + "wx/anybutton.h" + "wx/univ/button.h" + "wx/msw/button.h" + "wx/motif/button.h" + "wx/gtk/button.h" + "wx/gtk1/button.h" + "wx/osx/button.h" + "wx/cocoa/button.h" + "wx/os2/button.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\anybutton.h + "wx/defs.h" + "wx/bitmap.h" + "wx/control.h" + "wx/univ/anybutton.h" + "wx/msw/anybutton.h" + "wx/gtk/anybutton.h" + "wx/osx/anybutton.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\anybutton.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\anybutton.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\anybutton.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\anybutton.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\button.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\button.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\button.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\button.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\button.h + "wx/defs.h" + "wx/object.h" + "wx/list.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\button.h + "wx/control.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\button.h + "wx/cocoa/NSButton.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nsbutton.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + "wx/cocoa/ObjcRef.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\objcref.h + "wx/osx/core/cfref.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\button.h + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\toolbar.h + "wx/dynarray.h" + "wx/imaglist.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\imaglist.h + "wx/defs.h" + "wx/generic/imaglist.h" + "wx/msw/imaglist.h" + "wx/osx/imaglist.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\imaglist.h + "wx/list.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\imaglist.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\imaglist.h + "wx/defs.h" + "wx/list.h" + "wx/icon.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\tbarwce.h + "wx/dynarray.h" + "wx/msw/toolbar.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\toolbar.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\toolbar.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\toolbar.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\toolbar.h + "wx/tbarbase.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\toolbar.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\toolbar.h + "wx/timer.h" + "wx/tbarbase.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\timer.h + "wx/defs.h" + "wx/object.h" + "wx/longlong.h" + "wx/event.h" + "wx/stopwatch.h" + "wx/utils.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\stopwatch.h + "wx/defs.h" + "wx/longlong.h" + "wx/time.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\time.h + "wx/longlong.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\frame.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\frame.h + "wx/os2/wxrsc.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\wxrsc.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\app.h + "wx/gdicmn.h" + "wx/event.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\app.h + "wx/defs.h" + "wx/object.h" + "wx/gdicmn.h" + "wx/event.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\app.h + "wx/osx/core/cfref.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\app.h + + + + + + + + + "wx/event.h" + "wx/icon.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\theme.h + "wx/string.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\checkbox.h + "wx/defs.h" + "wx/control.h" + "wx/univ/checkbox.h" + "wx/msw/checkbox.h" + "wx/motif/checkbox.h" + "wx/gtk/checkbox.h" + "wx/gtk1/checkbox.h" + "wx/osx/checkbox.h" + "wx/cocoa/checkbox.h" + "wx/os2/checkbox.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\checkbox.h + "wx/button.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\checkbox.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\checkbox.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\checkbox.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\checkbox.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\checkbox.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\checkbox.h + "wx/cocoa/NSButton.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\checkbox.h + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\listbox.h + "wx/defs.h" + "wx/ctrlsub.h" + "wx/univ/listbox.h" + "wx/msw/listbox.h" + "wx/motif/listbox.h" + "wx/gtk/listbox.h" + "wx/gtk1/listbox.h" + "wx/osx/listbox.h" + "wx/os2/listbox.h" + "wx/cocoa/listbox.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\ctrlsub.h + "wx/defs.h" + "wx/arrstr.h" + "wx/control.h" + "wx/msw/ctrlsub.h" + "wx/motif/ctrlsub.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\ctrlsub.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\ctrlsub.h + "wx/dynarray.h" + "wx/generic/ctrlsub.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\ctrlsub.h + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\listbox.h + "wx/scrolwin.h" + "wx/dynarray.h" + "wx/arrstr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\scrolwin.h + "wx/panel.h" + "wx/gtk/scrolwin.h" + "wx/gtk1/scrolwin.h" + "wx/generic/scrolwin.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\panel.h + "wx/window.h" + "wx/containr.h" + "wx/univ/panel.h" + "wx/msw/panel.h" + "wx/generic/panelg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\containr.h + "wx/defs.h" + "wx/event.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\panel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\panel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\panelg.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\scrolwin.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\scrolwin.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\scrolwin.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\listbox.h + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\listbox.h + "wx/ctrlsub.h" + "wx/clntdata.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\listbox.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\listbox.h + "wx/list.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\listbox.h + "wx/dynarray.h" + "wx/arrstr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\listbox.h + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\listbox.h + "wx/cocoa/NSTableView.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nstableview.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\menu.h + "wx/defs.h" + "wx/list.h" + "wx/window.h" + "wx/menuitem.h" + "wx/univ/menu.h" + "wx/msw/menu.h" + "wx/motif/menu.h" + "wx/gtk/menu.h" + "wx/gtk1/menu.h" + "wx/osx/menu.h" + "wx/cocoa/menu.h" + "wx/os2/menu.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\menuitem.h + "wx/defs.h" + "wx/object.h" + "wx/univ/menuitem.h" + "wx/msw/menuitem.h" + "wx/motif/menuitem.h" + "wx/gtk/menuitem.h" + "wx/gtk1/menuitem.h" + "wx/osx/menuitem.h" + "wx/cocoa/menuitem.h" + "wx/os2/menuitem.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\menuitem.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\menuitem.h + "wx/ownerdrw.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\ownerdrw.h + "wx/defs.h" + "wx/font.h" + "wx/colour.h" + "wx/msw/ownerdrw.h" + "wx/os2/ownerdrw.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\ownerdrw.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\ownerdrw.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\menuitem.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\menuitem.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\menuitem.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\menuitem.h + "wx/defs.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\menuitem.h + "wx/hashmap.h" + "wx/bitmap.h" + "wx/cocoa/ObjcRef.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\menuitem.h + "wx/defs.h" + "wx/os2/private.h" + "wx/ownerdrw.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\menu.h + "wx/accel.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\menu.h + "wx/accel.h" + "wx/dynarray.h" + "wx/arrstr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\menu.h + "wx/colour.h" + "wx/font.h" + "wx/arrstr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\menu.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\menu.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\menu.h + "wx/arrstr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\menu.h + "wx/cocoa/NSMenu.h" + "wx/accel.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nsmenu.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\menu.h + "wx/accel.h" + "wx/list.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\notebook.h + "wx/defs.h" + "wx/bookctrl.h" + "wx/univ/notebook.h" + "wx/msw/notebook.h" + "wx/generic/notebook.h" + "wx/gtk/notebook.h" + "wx/gtk1/notebook.h" + "wx/osx/notebook.h" + "wx/cocoa/notebook.h" + "wx/os2/notebook.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\bookctrl.h + "wx/defs.h" + "wx/control.h" + "wx/dynarray.h" + "wx/withimages.h" + "wx/notebook.h" + "wx/choicebk.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\withimages.h + "wx/defs.h" + "wx/icon.h" + "wx/imaglist.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\choicebk.h + "wx/defs.h" + "wx/bookctrl.h" + "wx/choice.h" + "wx/containr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\choice.h + "wx/defs.h" + "wx/ctrlsub.h" + "wx/univ/choice.h" + "wx/msw/wince/choicece.h" + "wx/msw/choice.h" + "wx/motif/choice.h" + "wx/gtk/choice.h" + "wx/gtk1/choice.h" + "wx/osx/choice.h" + "wx/cocoa/choice.h" + "wx/os2/choice.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\choice.h + "wx/combobox.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\combobox.h + "wx/defs.h" + "wx/textctrl.h" + "wx/ctrlsub.h" + "wx/textentry.h" + "wx/univ/combobox.h" + "wx/msw/combobox.h" + "wx/motif/combobox.h" + "wx/gtk/combobox.h" + "wx/gtk1/combobox.h" + "wx/osx/combobox.h" + "wx/cocoa/combobox.h" + "wx/os2/combobox.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\textctrl.h + "wx/defs.h" + "wx/control.h" + "wx/textentry.h" + "wx/dynarray.h" + "wx/gdicmn.h" + "wx/ioswrap.h" + "wx/x11/textctrl.h" + "wx/univ/textctrl.h" + "wx/msw/wince/textctrlce.h" + "wx/msw/textctrl.h" + "wx/motif/textctrl.h" + "wx/gtk/textctrl.h" + "wx/gtk1/textctrl.h" + "wx/osx/textctrl.h" + "wx/cocoa/textctrl.h" + "wx/os2/textctrl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\textentry.h + "wx/filefn.h" + "wx/gdicmn.h" + "wx/gtk/textentry.h" + "wx/osx/textentry.h" + "wx/msw/textentry.h" + "wx/motif/textentry.h" + "wx/os2/textentry.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\textentry.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\textentry.h + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\textentry.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\textentry.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\textentry.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\ioswrap.h + "wx/beforestd.h" + + + "wx/afterstd.h" + "wx/msw/winundef.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\textctrl.h + "wx/univ/textctrl.h" + "wx/scrolwin.h" + "wx/arrstr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\textctrl.h + "wx/scrolwin.h" + "wx/univ/inphand.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\textctrlce.h + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\textctrl.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\textctrl.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\textctrl.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\textctrl.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\textctrl.h + "wx/control.h" + "wx/textctrl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\textctrl.h + "wx/cocoa/NSTextField.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nstextfield.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\textctrl.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\combobox.h + "wx/combo.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\combo.h + "wx/defs.h" + "wx/control.h" + "wx/renderer.h" + "wx/bitmap.h" + "wx/textentry.h" + "wx/msw/combo.h" + "wx/generic/combo.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\renderer.h + "wx/gdicmn.h" + "wx/colour.h" + "wx/font.h" + "wx/bitmap.h" + "wx/string.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\combo.h + "wx/timer.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\combo.h + "wx/dcbuffer.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dcbuffer.h + "wx/dcmemory.h" + "wx/dcclient.h" + "wx/window.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dcmemory.h + "wx/dc.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dcclient.h + "wx/dc.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\combobox.h + "wx/choice.h" + "wx/textentry.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\combobox.h + "wx/choice.h" + "wx/textentry.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\combobox.h + "wx/choice.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\combobox.h + "wx/defs.h" + "wx/object.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\combobox.h + "wx/containr.h" + "wx/choice.h" + "wx/textctrl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\combobox.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + "wx/textctrl.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\combobox.h + "wx/choice.h" + "wx/textentry.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\choicece.h + "wx/defs.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\choice.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\choice.h + "wx/clntdata.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\choice.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\choice.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\choice.h + "wx/control.h" + "wx/dynarray.h" + "wx/arrstr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\choice.h + "wx/cocoa/NSMenu.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\choice.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\notebook.h + "wx/arrstr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\notebook.h + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\notebook.h + "wx/event.h" + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\notebook.h + "wx/list.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\notebook.h + "wx/list.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\notebook.h + "wx/event.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\notebook.h + "wx/cocoa/NSTabView.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nstabview.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + "wx/cocoa/ObjcRef.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\notebook.h + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\sizer.h + "wx/defs.h" + "wx/window.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\spinctrl.h + "wx/defs.h" + "wx/spinbutt.h" + "wx/msw/spinctrl.h" + "wx/os2/spinctrl.h" + "wx/gtk/spinctrl.h" + "wx/gtk1/spinctrl.h" + "wx/generic/spinctlg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\spinbutt.h + "wx/defs.h" + "wx/control.h" + "wx/event.h" + "wx/range.h" + "wx/univ/spinbutt.h" + "wx/msw/spinbutt.h" + "wx/motif/spinbutt.h" + "wx/gtk/spinbutt.h" + "wx/gtk1/spinbutt.h" + "wx/osx/spinbutt.h" + "wx/cocoa/spinbutt.h" + "wx/os2/spinbutt.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\range.h + "wx/defs.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\spinbutt.h + "wx/univ/scrarrow.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\scrarrow.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\spinbutt.h + "wx/control.h" + "wx/event.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\spinbutt.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\spinbutt.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\spinbutt.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\spinbutt.h + "wx/control.h" + "wx/event.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\spinbutt.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\spinbutt.h + "wx/control.h" + "wx/event.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\spinctrl.h + "wx/spinbutt.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\spinctrl.h + "wx/spinbutt.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\spinctrl.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\spinctrl.h + "wx/defs.h" + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\spinctlg.h + "wx/compositewin.h" + "wx/textctrl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\compositewin.h + "wx/window.h" + "wx/containr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\stattext.h + "wx/defs.h" + "wx/control.h" + "wx/univ/stattext.h" + "wx/msw/stattext.h" + "wx/motif/stattext.h" + "wx/gtk/stattext.h" + "wx/gtk1/stattext.h" + "wx/osx/stattext.h" + "wx/cocoa/stattext.h" + "wx/os2/stattext.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\stattext.h + "wx/generic/stattextg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\stattextg.h + "wx/stattext.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\stattext.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\stattext.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\stattext.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\stattext.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\stattext.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\stattext.h + "wx/cocoa/NSTextField.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\stattext.h + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\wx.h + "wx/defs.h" + "wx/object.h" + "wx/dynarray.h" + "wx/list.h" + "wx/hash.h" + "wx/string.h" + "wx/hashmap.h" + "wx/arrstr.h" + "wx/intl.h" + "wx/log.h" + "wx/event.h" + "wx/app.h" + "wx/utils.h" + "wx/stream.h" + "wx/memory.h" + "wx/math.h" + "wx/stopwatch.h" + "wx/timer.h" + "wx/module.h" + "wx/wxcrt.h" + "wx/wxcrtvararg.h" + "wx/window.h" + "wx/containr.h" + "wx/panel.h" + "wx/toplevel.h" + "wx/frame.h" + "wx/gdicmn.h" + "wx/gdiobj.h" + "wx/region.h" + "wx/bitmap.h" + "wx/image.h" + "wx/colour.h" + "wx/font.h" + "wx/dc.h" + "wx/dcclient.h" + "wx/dcmemory.h" + "wx/dcprint.h" + "wx/dcscreen.h" + "wx/button.h" + "wx/menuitem.h" + "wx/menu.h" + "wx/pen.h" + "wx/brush.h" + "wx/palette.h" + "wx/icon.h" + "wx/cursor.h" + "wx/dialog.h" + "wx/settings.h" + "wx/msgdlg.h" + "wx/dataobj.h" + "wx/control.h" + "wx/ctrlsub.h" + "wx/bmpbuttn.h" + "wx/checkbox.h" + "wx/checklst.h" + "wx/choice.h" + "wx/scrolbar.h" + "wx/stattext.h" + "wx/statbmp.h" + "wx/statbox.h" + "wx/listbox.h" + "wx/radiobox.h" + "wx/radiobut.h" + "wx/textctrl.h" + "wx/slider.h" + "wx/gauge.h" + "wx/scrolwin.h" + "wx/dirdlg.h" + "wx/toolbar.h" + "wx/combobox.h" + "wx/layout.h" + "wx/sizer.h" + "wx/statusbr.h" + "wx/choicdlg.h" + "wx/textdlg.h" + "wx/filedlg.h" + "wx/mdi.h" + "wx/validate.h" + "wx/valtext.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\module.h + "wx/object.h" + "wx/list.h" + "wx/arrstr.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dcprint.h + "wx/defs.h" + "wx/dc.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dcscreen.h + "wx/defs.h" + "wx/dc.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dialog.h + "wx/toplevel.h" + "wx/containr.h" + "wx/sharedptr.h" + "wx/univ/dialog.h" + "wx/msw/dialog.h" + "wx/motif/dialog.h" + "wx/gtk/dialog.h" + "wx/gtk1/dialog.h" + "wx/osx/dialog.h" + "wx/cocoa/dialog.h" + "wx/os2/dialog.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\sharedptr.h + "wx/defs.h" + "wx/atomic.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\atomic.h + "wx/defs.h" + "wx/msw/wrapwin.h" + "libkern/OSAtomic.h" + + "wx/thread.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\dialog.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\dialog.h + "wx/panel.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\dialog.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\dialog.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\dialog.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\dialog.h + "wx/panel.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\dialog.h + "wx/defs.h" + "wx/panel.h" + "wx/cocoa/NSPanel.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nspanel.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\dialog.h + "wx/panel.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msgdlg.h + "wx/defs.h" + "wx/dialog.h" + "wx/stockitem.h" + "wx/generic/msgdlgg.h" + "wx/cocoa/msgdlg.h" + "wx/msw/msgdlg.h" + "wx/motif/msgdlg.h" + "wx/gtk/msgdlg.h" + "wx/osx/msgdlg.h" + "wx/os2/msgdlg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\stockitem.h + "wx/defs.h" + "wx/chartype.h" + "wx/string.h" + "wx/accel.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\msgdlgg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\msgdlg.h + "wx/msgdlg.h" + "wx/generic/msgdlgg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\msgdlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\msgdlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\msgdlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\msgdlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\msgdlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dataobj.h + "wx/defs.h" + "wx/string.h" + "wx/bitmap.h" + "wx/list.h" + "wx/arrstr.h" + "wx/msw/ole/dataform.h" + "wx/motif/dataform.h" + "wx/gtk/dataform.h" + "wx/gtk1/dataform.h" + "wx/x11/dataform.h" + "wx/osx/dataform.h" + "wx/cocoa/dataform.h" + "wx/os2/dataform.h" + "wx/msw/ole/dataobj.h" + "wx/motif/dataobj.h" + "wx/x11/dataobj.h" + "wx/gtk/dataobj.h" + "wx/gtk1/dataobj.h" + "wx/osx/dataobj.h" + "wx/cocoa/dataobj.h" + "wx/os2/dataobj.h" + "wx/msw/ole/dataobj2.h" + "wx/gtk/dataobj2.h" + "wx/gtk1/dataobj2.h" + "wx/x11/dataobj2.h" + "wx/motif/dataobj2.h" + "wx/osx/dataobj2.h" + "wx/cocoa/dataobj2.h" + "wx/os2/dataobj2.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\ole\dataform.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\dataform.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\dataform.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\dataform.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\dataform.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\dataform.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\dataform.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\dataform.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\ole\dataobj.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\dataobj.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\dataobj.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\dataobj.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\dataobj.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\dataobj.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\dataobj.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\dataobj.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\ole\dataobj2.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\dataobj2.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\dataobj2.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\dataobj2.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\dataobj2.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\dataobj2.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\dataobj2.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\dataobj2.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\bmpbuttn.h + "wx/defs.h" + "wx/button.h" + "wx/univ/bmpbuttn.h" + "wx/msw/bmpbuttn.h" + "wx/motif/bmpbuttn.h" + "wx/gtk/bmpbuttn.h" + "wx/gtk1/bmpbuttn.h" + "wx/osx/bmpbuttn.h" + "wx/cocoa/bmpbuttn.h" + "wx/os2/bmpbuttn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\bmpbuttn.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\bmpbuttn.h + "wx/button.h" + "wx/bitmap.h" + "wx/brush.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\bmpbuttn.h + "wx/motif/bmpmotif.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\bmpmotif.h + "wx/defs.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\bmpbuttn.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\bmpbuttn.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\bmpbuttn.h + "wx/button.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\bmpbuttn.h + "wx/cocoa/NSButton.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\bmpbuttn.h + "wx/button.h" + "wx/dcclient.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\checklst.h + "wx/defs.h" + "wx/listbox.h" + "wx/univ/checklst.h" + "wx/msw/wince/checklst.h" + "wx/msw/checklst.h" + "wx/motif/checklst.h" + "wx/gtk/checklst.h" + "wx/gtk1/checklst.h" + "wx/osx/checklst.h" + "wx/cocoa/checklst.h" + "wx/os2/checklst.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\checklst.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\checklst.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\checklst.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\checklst.h + "wx/listbox.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\checklst.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\checklst.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\checklst.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\checklst.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\checklst.h + + "wx/defs.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\scrolbar.h + "wx/defs.h" + "wx/control.h" + "wx/univ/scrolbar.h" + "wx/msw/scrolbar.h" + "wx/motif/scrolbar.h" + "wx/gtk/scrolbar.h" + "wx/gtk1/scrolbar.h" + "wx/osx/scrolbar.h" + "wx/cocoa/scrolbar.h" + "wx/os2/scrolbar.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\scrolbar.h + "wx/univ/scrarrow.h" + "wx/renderer.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\scrolbar.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\scrolbar.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\scrolbar.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\scrolbar.h + "wx/defs.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\scrolbar.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\scrolbar.h + "wx/cocoa/NSScroller.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nsscroller.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + "wx/cocoa/ObjcRef.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\scrolbar.h + "wx/scrolbar.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\statbmp.h + "wx/defs.h" + "wx/control.h" + "wx/bitmap.h" + "wx/icon.h" + "wx/univ/statbmp.h" + "wx/msw/statbmp.h" + "wx/motif/statbmp.h" + "wx/gtk/statbmp.h" + "wx/gtk1/statbmp.h" + "wx/osx/statbmp.h" + "wx/cocoa/statbmp.h" + "wx/os2/statbmp.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\statbmp.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\statbmp.h + "wx/control.h" + "wx/icon.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\statbmp.h + "wx/motif/bmpmotif.h" + "wx/icon.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\statbmp.h + "wx/icon.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\statbmp.h + "wx/icon.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\statbmp.h + "wx/osx/carbon/statbmp.h" + "wx/generic/statbmpg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\carbon\statbmp.h + "wx/icon.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\statbmpg.h + "wx/statbmp.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\statbmp.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\statbmp.h + "wx/control.h" + "wx/icon.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\statbox.h + "wx/defs.h" + "wx/control.h" + "wx/containr.h" + "wx/univ/statbox.h" + "wx/msw/statbox.h" + "wx/motif/statbox.h" + "wx/gtk/statbox.h" + "wx/gtk1/statbox.h" + "wx/osx/statbox.h" + "wx/cocoa/statbox.h" + "wx/os2/statbox.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\statbox.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\statbox.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\statbox.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\statbox.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\statbox.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\statbox.h + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\statbox.h + "wx/cocoa/NSBox.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nsbox.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\statbox.h + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\radiobox.h + "wx/defs.h" + "wx/ctrlsub.h" + "wx/dynarray.h" + "wx/univ/radiobox.h" + "wx/msw/radiobox.h" + "wx/motif/radiobox.h" + "wx/gtk/radiobox.h" + "wx/gtk1/radiobox.h" + "wx/osx/radiobox.h" + "wx/cocoa/radiobox.h" + "wx/os2/radiobox.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\radiobox.h + "wx/statbox.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\radiobox.h + "wx/statbox.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\radiobox.h + "wx/dynarray.h" + "wx/arrstr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\radiobox.h + "wx/bitmap.h" + "wx/list.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\radiobox.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\radiobox.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\radiobox.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\radiobox.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\radiobut.h + "wx/defs.h" + "wx/control.h" + "wx/univ/radiobut.h" + "wx/msw/radiobut.h" + "wx/motif/radiobut.h" + "wx/gtk/radiobut.h" + "wx/gtk1/radiobut.h" + "wx/osx/radiobut.h" + "wx/cocoa/radiobut.h" + "wx/os2/radiobut.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\radiobut.h + "wx/checkbox.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\radiobut.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\radiobut.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\radiobut.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\radiobut.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\radiobut.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\radiobut.h + "wx/cocoa/NSButton.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\radiobut.h + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\slider.h + "wx/defs.h" + "wx/control.h" + "wx/univ/slider.h" + "wx/msw/slider.h" + "wx/motif/slider.h" + "wx/gtk/slider.h" + "wx/gtk1/slider.h" + "wx/osx/slider.h" + "wx/cocoa/slider.h" + "wx/os2/slider.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\slider.h + "wx/univ/scrthumb.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\scrthumb.h + "wx/timer.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\slider.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\slider.h + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\slider.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\slider.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\slider.h + "wx/control.h" + "wx/slider.h" + "wx/stattext.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\slider.h + "wx/cocoa/NSSlider.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nsslider.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + "wx/cocoa/ObjcRef.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\slider.h + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gauge.h + "wx/defs.h" + "wx/control.h" + "wx/univ/gauge.h" + "wx/msw/gauge.h" + "wx/motif/gauge.h" + "wx/gtk/gauge.h" + "wx/gtk1/gauge.h" + "wx/osx/gauge.h" + "wx/cocoa/gauge.h" + "wx/os2/gauge.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\gauge.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\gauge.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\gauge.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\gauge.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\gauge.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\gauge.h + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\gauge.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\gauge.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dirdlg.h + "wx/defs.h" + "wx/dialog.h" + "wx/generic/dirdlgg.h" + "wx/generic/dirdlgg.h" + "wx/generic/dirdlgg.h" + "wx/msw/dirdlg.h" + "wx/gtk/dirdlg.h" + "wx/generic/dirdlgg.h" + "wx/osx/dirdlg.h" + "wx/cocoa/dirdlg.h" + "wx/generic/dirdlgg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\dirdlgg.h + "wx/dialog.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\dirdlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\dirdlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\dirdlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\dirdlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\layout.h + "wx/object.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\choicdlg.h + "wx/defs.h" + "wx/generic/choicdgg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\choicdgg.h + "wx/dynarray.h" + "wx/dialog.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\textdlg.h + "wx/generic/textdlgg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\textdlgg.h + "wx/defs.h" + "wx/dialog.h" + "wx/valtext.h" + "wx/textctrl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\valtext.h + "wx/defs.h" + "wx/validate.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\filedlg.h + "wx/defs.h" + "wx/dialog.h" + "wx/arrstr.h" + "wx/generic/filedlgg.h" + "wx/msw/filedlg.h" + "wx/motif/filedlg.h" + "wx/gtk/filedlg.h" + "wx/gtk1/filedlg.h" + "wx/osx/filedlg.h" + "wx/cocoa/filedlg.h" + "wx/os2/filedlg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\filedlgg.h + "wx/listctrl.h" + "wx/datetime.h" + "wx/filefn.h" + "wx/artprov.h" + "wx/filedlg.h" + "wx/generic/filectrlg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\listctrl.h + "wx/defs.h" + "wx/listbase.h" + "wx/msw/listctrl.h" + "wx/osx/listctrl.h" + "wx/generic/listctrl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\listbase.h + "wx/colour.h" + "wx/font.h" + "wx/gdicmn.h" + "wx/event.h" + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\listctrl.h + "wx/textctrl.h" + "wx/dynarray.h" + "wx/vector.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\listctrl.h + "wx/defs.h" + "wx/generic/listctrl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\listctrl.h + "wx/containr.h" + "wx/scrolwin.h" + "wx/textctrl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\artprov.h + "wx/string.h" + "wx/bitmap.h" + "wx/icon.h" + "wx/iconbndl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\filectrlg.h + "wx/containr.h" + "wx/listctrl.h" + "wx/filectrl.h" + "wx/filename.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\filectrl.h + "wx/defs.h" + "wx/string.h" + "wx/event.h" + "wx/gtk/filectrl.h" + "wx/generic/filectrlg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\filectrl.h + "wx/control.h" + "wx/filectrl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\filename.h + "wx/arrstr.h" + "wx/filefn.h" + "wx/datetime.h" + "wx/intl.h" + "wx/longlong.h" + "wx/file.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\file.h + "wx/defs.h" + "wx/string.h" + "wx/filefn.h" + "wx/convauto.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\convauto.h + "wx/strconv.h" + "wx/fontenc.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\filedlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\filedlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\filedlg.h + "wx/gtk/filectrl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\filedlg.h + "wx/generic/filedlgg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\filedlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\filedlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\filedlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\mdi.h + "wx/defs.h" + "wx/frame.h" + "wx/menu.h" + "wx/generic/mdig.h" + "wx/msw/mdi.h" + "wx/gtk/mdi.h" + "wx/gtk1/mdi.h" + "wx/osx/mdi.h" + "wx/cocoa/mdi.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\mdig.h + "wx/panel.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\mdi.h + "wx/frame.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\mdi.h + "wx/frame.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\mdi.h + "wx/frame.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\mdi.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\mdi.h + "wx/frame.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\socket.h + "wx/defs.h" + "wx/event.h" + "wx/sckaddr.h" + "wx/list.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\sckaddr.h + "wx/defs.h" + "wx/string.h" + +1699796749 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\lib\gcc_lib\msw\wx\setup.h + diff --git a/Samples/tcptest/tcptest.layout b/Samples/tcptest/tcptest.layout new file mode 100644 index 0000000..17c2d48 --- /dev/null +++ b/Samples/tcptest/tcptest.layout @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/tcptest/tcptestApp.cpp b/Samples/tcptest/tcptestApp.cpp new file mode 100644 index 0000000..46f7d77 --- /dev/null +++ b/Samples/tcptest/tcptestApp.cpp @@ -0,0 +1,33 @@ +/*************************************************************** + * Name: tcptestApp.cpp + * Purpose: Code for Application Class + * Author: () + * Created: 2023-11-10 + * Copyright: () + * License: + **************************************************************/ + +#include "tcptestApp.h" + +//(*AppHeaders +#include "tcptestMain.h" +#include +//*) + +IMPLEMENT_APP(tcptestApp); + +bool tcptestApp::OnInit() +{ + //(*AppInitialize + bool wxsOK = true; + wxInitAllImageHandlers(); + if ( wxsOK ) + { + tcptestFrame* Frame = new tcptestFrame(0); + Frame->Show(); + SetTopWindow(Frame); + } + //*) + return wxsOK; + +} diff --git a/Samples/tcptest/tcptestApp.h b/Samples/tcptest/tcptestApp.h new file mode 100644 index 0000000..b4e2bfd --- /dev/null +++ b/Samples/tcptest/tcptestApp.h @@ -0,0 +1,21 @@ +/*************************************************************** + * Name: tcptestApp.h + * Purpose: Defines Application Class + * Author: () + * Created: 2023-11-10 + * Copyright: () + * License: + **************************************************************/ + +#ifndef TCPTESTAPP_H +#define TCPTESTAPP_H + +#include + +class tcptestApp : public wxApp +{ + public: + virtual bool OnInit(); +}; + +#endif // TCPTESTAPP_H diff --git a/Samples/tcptest/tcptestMain.cpp b/Samples/tcptest/tcptestMain.cpp new file mode 100644 index 0000000..c1d7f53 --- /dev/null +++ b/Samples/tcptest/tcptestMain.cpp @@ -0,0 +1,764 @@ +/*************************************************************** + * Name: tcptestMain.cpp + * Purpose: Code for Application Frame + * Author: () + * Created: 2023-11-10 + * Copyright: () + * License: + **************************************************************/ + +#include "tcptestMain.h" +#include + +//(*InternalHeaders(tcptestFrame) +#include +#include +#include +//*) + +//helper functions +enum wxbuildinfoformat { + short_f, long_f }; + +wxString wxbuildinfo(wxbuildinfoformat format) +{ + wxString wxbuild(wxVERSION_STRING); + + if (format == long_f ) + { +#if defined(__WXMSW__) + wxbuild << _T("-Windows"); +#elif defined(__UNIX__) + wxbuild << _T("-Linux"); +#endif + +#if wxUSE_UNICODE + wxbuild << _T("-Unicode build"); +#else + wxbuild << _T("-ANSI build"); +#endif // wxUSE_UNICODE + } + + return wxbuild; +} + +//(*IdInit(tcptestFrame) +const long tcptestFrame::ID_STATICTEXT3 = wxNewId(); +const long tcptestFrame::ID_STATICTEXT4 = wxNewId(); +const long tcptestFrame::ID_TEXTCTRL2 = wxNewId(); +const long tcptestFrame::ID_BUTTON1 = wxNewId(); +const long tcptestFrame::ID_BUTTON2 = wxNewId(); +const long tcptestFrame::ID_PANEL5 = wxNewId(); +const long tcptestFrame::ID_STATICTEXT1 = wxNewId(); +const long tcptestFrame::ID_LISTBOX1 = wxNewId(); +const long tcptestFrame::ID_BUTTON8 = wxNewId(); +const long tcptestFrame::ID_PANEL6 = wxNewId(); +const long tcptestFrame::ID_STATICTEXT2 = wxNewId(); +const long tcptestFrame::ID_TEXTCTRL1 = wxNewId(); +const long tcptestFrame::ID_PANEL7 = wxNewId(); +const long tcptestFrame::ID_PANEL2 = wxNewId(); +const long tcptestFrame::ID_TEXTCTRL3 = wxNewId(); +const long tcptestFrame::ID_CHECKBOX1 = wxNewId(); +const long tcptestFrame::ID_SPINCTRL1 = wxNewId(); +const long tcptestFrame::ID_PANEL10 = wxNewId(); +const long tcptestFrame::ID_PANEL8 = wxNewId(); +const long tcptestFrame::ID_BUTTON3 = wxNewId(); +const long tcptestFrame::ID_BUTTON4 = wxNewId(); +const long tcptestFrame::ID_PANEL9 = wxNewId(); +const long tcptestFrame::ID_PANEL4 = wxNewId(); +const long tcptestFrame::ID_PANEL3 = wxNewId(); +const long tcptestFrame::ID_STATICTEXT5 = wxNewId(); +const long tcptestFrame::ID_TEXTCTRL7 = wxNewId(); +const long tcptestFrame::ID_STATICTEXT6 = wxNewId(); +const long tcptestFrame::ID_TEXTCTRL4 = wxNewId(); +const long tcptestFrame::ID_BUTTON5 = wxNewId(); +const long tcptestFrame::ID_BUTTON6 = wxNewId(); +const long tcptestFrame::ID_PANEL14 = wxNewId(); +const long tcptestFrame::ID_STATICTEXT8 = wxNewId(); +const long tcptestFrame::ID_TEXTCTRL5 = wxNewId(); +const long tcptestFrame::ID_PANEL16 = wxNewId(); +const long tcptestFrame::ID_PANEL13 = wxNewId(); +const long tcptestFrame::ID_TEXTCTRL6 = wxNewId(); +const long tcptestFrame::ID_CHECKBOX2 = wxNewId(); +const long tcptestFrame::ID_SPINCTRL2 = wxNewId(); +const long tcptestFrame::ID_PANEL19 = wxNewId(); +const long tcptestFrame::ID_PANEL18 = wxNewId(); +const long tcptestFrame::ID_BUTTON7 = wxNewId(); +const long tcptestFrame::ID_PANEL20 = wxNewId(); +const long tcptestFrame::ID_PANEL17 = wxNewId(); +const long tcptestFrame::ID_PANEL12 = wxNewId(); +const long tcptestFrame::ID_NOTEBOOK1 = wxNewId(); +const long tcptestFrame::ID_PANEL1 = wxNewId(); +const long tcptestFrame::idMenuQuit = wxNewId(); +const long tcptestFrame::idMenuAbout = wxNewId(); +const long tcptestFrame::ID_STATUSBAR1 = wxNewId(); +//*) + + +const long tcptestFrame::ID_TCPSERVER1 = wxNewId(); +const long tcptestFrame::ID_TCPCLIENT1 = wxNewId(); + + +BEGIN_EVENT_TABLE(tcptestFrame,wxFrame) + //(*EventTable(tcptestFrame) + //*) +END_EVENT_TABLE() + +tcptestFrame::tcptestFrame(wxWindow* parent,wxWindowID id) +{ + //(*Initialize(tcptestFrame) + wxBoxSizer* BoxSizer10; + wxBoxSizer* BoxSizer11; + wxBoxSizer* BoxSizer12; + wxBoxSizer* BoxSizer13; + wxBoxSizer* BoxSizer14; + wxBoxSizer* BoxSizer16; + wxBoxSizer* BoxSizer17; + wxBoxSizer* BoxSizer18; + wxBoxSizer* BoxSizer19; + wxBoxSizer* BoxSizer1; + wxBoxSizer* BoxSizer20; + wxBoxSizer* BoxSizer2; + wxBoxSizer* BoxSizer3; + wxBoxSizer* BoxSizer4; + wxBoxSizer* BoxSizer5; + wxBoxSizer* BoxSizer6; + wxBoxSizer* BoxSizer7; + wxBoxSizer* BoxSizer8; + wxBoxSizer* BoxSizer9; + wxMenu* Menu1; + wxMenu* Menu2; + wxMenuBar* MenuBar1; + wxMenuItem* MenuItem1; + wxMenuItem* MenuItem2; + + Create(parent, wxID_ANY, _("TCP Client/Server"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE|wxFULL_REPAINT_ON_RESIZE, _T("wxID_ANY")); + SetMinSize(wxSize(340,320)); + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE)); + // This code will set a smaller font if Win 3.11 is detected: + int majorVer; int minorVer; + wxGetOsVersion(&majorVer, &minorVer); + if (minorVer == 30 || majorVer == 30 || majorVer == 3) + { + wxFont thisFont(8,wxFONTFAMILY_DEFAULT,wxFONTSTYLE_NORMAL,wxFONTWEIGHT_NORMAL,false,wxEmptyString,wxFONTENCODING_DEFAULT); + SetFont(thisFont); + } + BoxSizer1 = new wxBoxSizer(wxHORIZONTAL); + Panel1 = new wxPanel(this, ID_PANEL1, wxDefaultPosition, wxSize(286,334), wxTAB_TRAVERSAL, _T("ID_PANEL1")); + BoxSizer2 = new wxBoxSizer(wxVERTICAL); + Notebook1 = new wxNotebook(Panel1, ID_NOTEBOOK1, wxDefaultPosition, wxDefaultSize, 0, _T("ID_NOTEBOOK1")); + Panel3 = new wxPanel(Notebook1, ID_PANEL3, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL3")); + BoxSizer4 = new wxBoxSizer(wxVERTICAL); + Panel2 = new wxPanel(Panel3, ID_PANEL2, wxDefaultPosition, wxSize(330,191), wxTAB_TRAVERSAL, _T("ID_PANEL2")); + BoxSizer3 = new wxBoxSizer(wxHORIZONTAL); + Panel5 = new wxPanel(Panel2, ID_PANEL5, wxDefaultPosition, wxDLG_UNIT(Panel2,wxSize(58,36)), wxTAB_TRAVERSAL, _T("ID_PANEL5")); + BoxSizer7 = new wxBoxSizer(wxVERTICAL); + LabelCount1 = new wxStaticText(Panel5, ID_STATICTEXT3, _("Client count: 0"), wxDefaultPosition, wxDLG_UNIT(Panel5,wxSize(56,8)), wxST_NO_AUTORESIZE, _T("ID_STATICTEXT3")); + BoxSizer7->Add(LabelCount1, 0, wxALIGN_LEFT, 0); + BoxSizer7->Add(20,1,0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + StaticText4 = new wxStaticText(Panel5, ID_STATICTEXT4, _("Port"), wxDefaultPosition, wxDLG_UNIT(Panel5,wxSize(38,8)), wxST_NO_AUTORESIZE, _T("ID_STATICTEXT4")); + BoxSizer7->Add(StaticText4, 0, wxALIGN_LEFT, 5); + PortSrvText1 = new wxTextCtrl(Panel5, ID_TEXTCTRL2, _("3000"), wxDefaultPosition, wxDLG_UNIT(Panel5,wxSize(30,-1)), wxBORDER_SIMPLE, wxDefaultValidator, _T("ID_TEXTCTRL2")); + BoxSizer7->Add(PortSrvText1, 0, wxTOP|wxBOTTOM, 0); + BtnOpenSrv = new wxButton(Panel5, ID_BUTTON1, _("Open server"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON1")); + BoxSizer7->Add(BtnOpenSrv, 0, wxTOP|wxEXPAND, 8); + BtnCloseSrv = new wxButton(Panel5, ID_BUTTON2, _("Close server"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON2")); + BoxSizer7->Add(BtnCloseSrv, 0, wxTOP|wxBOTTOM|wxEXPAND, 4); + Panel5->SetSizer(BoxSizer7); + BoxSizer3->Add(Panel5, 0, wxALL|wxEXPAND, 5); + Panel6 = new wxPanel(Panel2, ID_PANEL6, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL6")); + BoxSizer5 = new wxBoxSizer(wxVERTICAL); + StaticText1 = new wxStaticText(Panel6, ID_STATICTEXT1, _("Client list"), wxDefaultPosition, wxDLG_UNIT(Panel6,wxSize(45,8)), wxST_NO_AUTORESIZE, _T("ID_STATICTEXT1")); + BoxSizer5->Add(StaticText1, 0, wxALL|wxALIGN_LEFT, 5); + ListBox1 = new wxListBox(Panel6, ID_LISTBOX1, wxDefaultPosition, wxDefaultSize, 0, 0, wxBORDER_SIMPLE, wxDefaultValidator, _T("ID_LISTBOX1")); + BoxSizer5->Add(ListBox1, 1, wxALL|wxEXPAND, 5); + BtnDropClient = new wxButton(Panel6, ID_BUTTON8, _("Drop client"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON8")); + BoxSizer5->Add(BtnDropClient, 0, wxALL|wxALIGN_LEFT, 4); + Panel6->SetSizer(BoxSizer5); + BoxSizer3->Add(Panel6, 1, wxALL|wxEXPAND, 0); + Panel7 = new wxPanel(Panel2, ID_PANEL7, wxDefaultPosition, wxSize(360,172), wxTAB_TRAVERSAL, _T("ID_PANEL7")); + BoxSizer6 = new wxBoxSizer(wxVERTICAL); + StaticText2 = new wxStaticText(Panel7, ID_STATICTEXT2, _("Log"), wxDefaultPosition, wxDLG_UNIT(Panel7,wxSize(61,8)), wxST_NO_AUTORESIZE, _T("ID_STATICTEXT2")); + BoxSizer6->Add(StaticText2, 0, wxALL|wxALIGN_LEFT, 5); + LogSrv1 = new wxTextCtrl(Panel7, ID_TEXTCTRL1, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxBORDER_SIMPLE, wxDefaultValidator, _T("ID_TEXTCTRL1")); + BoxSizer6->Add(LogSrv1, 1, wxALL|wxEXPAND, 5); + Panel7->SetSizer(BoxSizer6); + BoxSizer3->Add(Panel7, 2, wxALL|wxEXPAND, 0); + Panel2->SetSizer(BoxSizer3); + BoxSizer4->Add(Panel2, 1, wxALL|wxEXPAND, 5); + Panel4 = new wxPanel(Panel3, ID_PANEL4, wxDefaultPosition, wxSize(646,79), wxTAB_TRAVERSAL, _T("ID_PANEL4")); + BoxSizer8 = new wxBoxSizer(wxHORIZONTAL); + Panel8 = new wxPanel(Panel4, ID_PANEL8, wxDefaultPosition, wxDLG_UNIT(Panel4,wxSize(68,26)), wxTAB_TRAVERSAL, _T("ID_PANEL8")); + BoxSizer9 = new wxBoxSizer(wxVERTICAL); + TextSendSrv1 = new wxTextCtrl(Panel8, ID_TEXTCTRL3, _("Message"), wxDefaultPosition, wxDefaultSize, wxBORDER_SIMPLE, wxDefaultValidator, _T("ID_TEXTCTRL3")); + BoxSizer9->Add(TextSendSrv1, 0, wxEXPAND, 0); + Panel10 = new wxPanel(Panel8, ID_PANEL10, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL10")); + BoxSizer10 = new wxBoxSizer(wxHORIZONTAL); + CheckBinarySrv = new wxCheckBox(Panel10, ID_CHECKBOX1, _("Binary mode (send a number)"), wxDefaultPosition, wxDLG_UNIT(Panel10,wxSize(119,8)), 0, wxDefaultValidator, _T("ID_CHECKBOX1")); + CheckBinarySrv->SetValue(false); + BoxSizer10->Add(CheckBinarySrv, 1, wxTOP|wxBOTTOM|wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + SpinCtrlSrv1 = new wxSpinCtrl(Panel10, ID_SPINCTRL1, _T("12345"), wxDefaultPosition, wxDLG_UNIT(Panel10,wxSize(80,-1)), wxBORDER_SIMPLE, -32737, 32737, 12345, _T("ID_SPINCTRL1")); + SpinCtrlSrv1->SetValue(_T("12345")); + SpinCtrlSrv1->Disable(); + BoxSizer10->Add(SpinCtrlSrv1, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5); + Panel10->SetSizer(BoxSizer10); + BoxSizer9->Add(Panel10, 1, wxALL|wxEXPAND, 0); + Panel8->SetSizer(BoxSizer9); + BoxSizer8->Add(Panel8, 1, wxBOTTOM|wxLEFT|wxRIGHT|wxEXPAND, 4); + Panel9 = new wxPanel(Panel4, ID_PANEL9, wxDefaultPosition, wxSize(139,95), wxTAB_TRAVERSAL, _T("ID_PANEL9")); + BoxSizer11 = new wxBoxSizer(wxVERTICAL); + BtnSrvSendAll = new wxButton(Panel9, ID_BUTTON3, _("Send to all"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON3")); + BtnSrvSendAll->SetMinSize(wxDLG_UNIT(Panel9,wxSize(48,13))); + BoxSizer11->Add(BtnSrvSendAll, 0, wxEXPAND, 0); + BtnSrvSendSel = new wxButton(Panel9, ID_BUTTON4, _("Send to sel"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON4")); + BtnSrvSendSel->SetMinSize(wxDLG_UNIT(Panel9,wxSize(48,13))); + BoxSizer11->Add(BtnSrvSendSel, 0, wxTOP|wxEXPAND, 4); + Panel9->SetSizer(BoxSizer11); + BoxSizer8->Add(Panel9, 0, wxLEFT|wxEXPAND, 2); + Panel4->SetSizer(BoxSizer8); + BoxSizer4->Add(Panel4, 0, wxALL|wxEXPAND, 5); + Panel3->SetSizer(BoxSizer4); + Panel12 = new wxPanel(Notebook1, ID_PANEL12, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL12")); + BoxSizer12 = new wxBoxSizer(wxVERTICAL); + Panel13 = new wxPanel(Panel12, ID_PANEL13, wxDefaultPosition, wxSize(330,191), wxTAB_TRAVERSAL, _T("ID_PANEL13")); + BoxSizer13 = new wxBoxSizer(wxHORIZONTAL); + Panel14 = new wxPanel(Panel13, ID_PANEL14, wxDefaultPosition, wxDLG_UNIT(Panel13,wxSize(58,36)), wxTAB_TRAVERSAL, _T("ID_PANEL14")); + BoxSizer14 = new wxBoxSizer(wxVERTICAL); + StaticText3 = new wxStaticText(Panel14, ID_STATICTEXT5, _("Address"), wxDefaultPosition, wxDLG_UNIT(Panel14,wxSize(56,8)), wxST_NO_AUTORESIZE, _T("ID_STATICTEXT5")); + BoxSizer14->Add(StaticText3, 0, wxBOTTOM|wxALIGN_LEFT, 5); + TextClientHost1 = new wxTextCtrl(Panel14, ID_TEXTCTRL7, _("127.0.0.1"), wxDefaultPosition, wxDLG_UNIT(Panel14,wxSize(30,-1)), wxBORDER_SIMPLE, wxDefaultValidator, _T("ID_TEXTCTRL7")); + BoxSizer14->Add(TextClientHost1, 0, wxTOP|wxBOTTOM|wxEXPAND, 0); + StaticText5 = new wxStaticText(Panel14, ID_STATICTEXT6, _("Port"), wxDefaultPosition, wxDLG_UNIT(Panel14,wxSize(38,8)), wxST_NO_AUTORESIZE, _T("ID_STATICTEXT6")); + BoxSizer14->Add(StaticText5, 0, wxALIGN_LEFT, 5); + TextClientPort1 = new wxTextCtrl(Panel14, ID_TEXTCTRL4, _("3000"), wxDefaultPosition, wxDLG_UNIT(Panel14,wxSize(30,-1)), wxBORDER_SIMPLE, wxDefaultValidator, _T("ID_TEXTCTRL4")); + BoxSizer14->Add(TextClientPort1, 0, wxTOP|wxBOTTOM, 0); + BtnClientConn = new wxButton(Panel14, ID_BUTTON5, _("Connect"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON5")); + BoxSizer14->Add(BtnClientConn, 0, wxTOP|wxEXPAND, 8); + BtnClientDisconn = new wxButton(Panel14, ID_BUTTON6, _("Disconnect"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON6")); + BoxSizer14->Add(BtnClientDisconn, 0, wxTOP|wxBOTTOM|wxEXPAND, 4); + Panel14->SetSizer(BoxSizer14); + BoxSizer13->Add(Panel14, 0, wxALL|wxEXPAND, 5); + Panel16 = new wxPanel(Panel13, ID_PANEL16, wxDefaultPosition, wxSize(360,172), wxTAB_TRAVERSAL, _T("ID_PANEL16")); + BoxSizer16 = new wxBoxSizer(wxVERTICAL); + StaticText7 = new wxStaticText(Panel16, ID_STATICTEXT8, _("Log"), wxDefaultPosition, wxDLG_UNIT(Panel16,wxSize(61,8)), wxST_NO_AUTORESIZE, _T("ID_STATICTEXT8")); + BoxSizer16->Add(StaticText7, 0, wxALL|wxALIGN_LEFT, 5); + LogClient1 = new wxTextCtrl(Panel16, ID_TEXTCTRL5, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxBORDER_SIMPLE, wxDefaultValidator, _T("ID_TEXTCTRL5")); + BoxSizer16->Add(LogClient1, 1, wxALL|wxEXPAND, 5); + Panel16->SetSizer(BoxSizer16); + BoxSizer13->Add(Panel16, 2, wxALL|wxEXPAND, 0); + Panel13->SetSizer(BoxSizer13); + BoxSizer12->Add(Panel13, 1, wxALL|wxEXPAND, 5); + Panel17 = new wxPanel(Panel12, ID_PANEL17, wxDefaultPosition, wxSize(646,79), wxTAB_TRAVERSAL, _T("ID_PANEL17")); + BoxSizer17 = new wxBoxSizer(wxHORIZONTAL); + Panel18 = new wxPanel(Panel17, ID_PANEL18, wxDefaultPosition, wxDLG_UNIT(Panel17,wxSize(68,26)), wxTAB_TRAVERSAL, _T("ID_PANEL18")); + BoxSizer18 = new wxBoxSizer(wxVERTICAL); + TextSendClient1 = new wxTextCtrl(Panel18, ID_TEXTCTRL6, _("Message"), wxDefaultPosition, wxDefaultSize, wxBORDER_SIMPLE, wxDefaultValidator, _T("ID_TEXTCTRL6")); + BoxSizer18->Add(TextSendClient1, 0, wxEXPAND, 0); + Panel19 = new wxPanel(Panel18, ID_PANEL19, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL19")); + BoxSizer19 = new wxBoxSizer(wxHORIZONTAL); + CheckBinaryClient = new wxCheckBox(Panel19, ID_CHECKBOX2, _("Binary mode (send a number)"), wxDefaultPosition, wxDLG_UNIT(Panel19,wxSize(119,8)), 0, wxDefaultValidator, _T("ID_CHECKBOX2")); + CheckBinaryClient->SetValue(false); + BoxSizer19->Add(CheckBinaryClient, 1, wxTOP|wxBOTTOM|wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + SpinCtrlClient1 = new wxSpinCtrl(Panel19, ID_SPINCTRL2, _T("12345"), wxDefaultPosition, wxDLG_UNIT(Panel19,wxSize(80,-1)), wxBORDER_SIMPLE, -32737, 32737, 12345, _T("ID_SPINCTRL2")); + SpinCtrlClient1->SetValue(_T("12345")); + SpinCtrlClient1->Disable(); + BoxSizer19->Add(SpinCtrlClient1, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5); + Panel19->SetSizer(BoxSizer19); + BoxSizer18->Add(Panel19, 1, wxALL|wxEXPAND, 0); + Panel18->SetSizer(BoxSizer18); + BoxSizer17->Add(Panel18, 1, wxBOTTOM|wxLEFT|wxRIGHT|wxEXPAND, 4); + Panel20 = new wxPanel(Panel17, ID_PANEL20, wxDefaultPosition, wxSize(139,95), wxTAB_TRAVERSAL, _T("ID_PANEL20")); + BoxSizer20 = new wxBoxSizer(wxVERTICAL); + BtnClientSend = new wxButton(Panel20, ID_BUTTON7, _("Send"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON7")); + BtnClientSend->SetMinSize(wxDLG_UNIT(Panel20,wxSize(48,13))); + BoxSizer20->Add(BtnClientSend, 0, wxEXPAND, 0); + Panel20->SetSizer(BoxSizer20); + BoxSizer17->Add(Panel20, 0, wxLEFT|wxEXPAND, 2); + Panel17->SetSizer(BoxSizer17); + BoxSizer12->Add(Panel17, 0, wxALL|wxEXPAND, 5); + Panel12->SetSizer(BoxSizer12); + Notebook1->AddPage(Panel3, _("Server"), false); + Notebook1->AddPage(Panel12, _("Client"), false); + BoxSizer2->Add(Notebook1, 1, wxALL|wxEXPAND, 5); + Panel1->SetSizer(BoxSizer2); + BoxSizer1->Add(Panel1, 1, wxALL|wxEXPAND, 0); + SetSizer(BoxSizer1); + MenuBar1 = new wxMenuBar(); + Menu1 = new wxMenu(); + MenuItem1 = new wxMenuItem(Menu1, idMenuQuit, _("Quit\tAlt-F4"), _("Quit the application"), wxITEM_NORMAL); + Menu1->Append(MenuItem1); + MenuBar1->Append(Menu1, _("&File")); + Menu2 = new wxMenu(); + MenuItem2 = new wxMenuItem(Menu2, idMenuAbout, _("About\tF1"), _("Show info about this application"), wxITEM_NORMAL); + Menu2->Append(MenuItem2); + MenuBar1->Append(Menu2, _("Help")); + SetMenuBar(MenuBar1); + StatusBar1 = new wxStatusBar(this, ID_STATUSBAR1, 0, _T("ID_STATUSBAR1")); + int __wxStatusBarWidths_1[1] = { -1 }; + int __wxStatusBarStyles_1[1] = { wxSB_NORMAL }; + StatusBar1->SetFieldsCount(1,__wxStatusBarWidths_1); + StatusBar1->SetStatusStyles(1,__wxStatusBarStyles_1); + SetStatusBar(StatusBar1); + Fit(); + + Connect(ID_BUTTON1,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&tcptestFrame::OnBtnOpenSrvClick1); + Connect(ID_BUTTON2,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&tcptestFrame::OnBtnCloseSrvClick); + Connect(ID_BUTTON8,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&tcptestFrame::OnBtnDropClientClick); + Connect(ID_CHECKBOX1,wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)&tcptestFrame::OnCheckBinarySrvClick); + Connect(ID_BUTTON3,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&tcptestFrame::OnBtnSrvSendAllClick); + Connect(ID_BUTTON4,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&tcptestFrame::OnBtnSrvSendSelClick); + Connect(ID_BUTTON5,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&tcptestFrame::OnBtnClientConnClick); + Connect(ID_BUTTON6,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&tcptestFrame::OnBtnClientDisconnClick); + Connect(ID_CHECKBOX2,wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)&tcptestFrame::OnCheckBinaryClientClick); + Connect(ID_BUTTON7,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&tcptestFrame::OnBtnClientSendClick); + Connect(idMenuQuit,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&tcptestFrame::OnQuit); + Connect(idMenuAbout,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&tcptestFrame::OnAbout); + //*) + + TCPServer1 = new SimpleTCPServer(this, ID_TCPSERVER1); + Connect(ID_TCPSERVER1, EV_CLIENTCONNECTED,(wxObjectEventFunction)&tcptestFrame::TCPServer1OnConnected); + Connect(ID_TCPSERVER1, EV_CLIENTDISCONNECTED,(wxObjectEventFunction)&tcptestFrame::TCPServer1OnDisconnected); + Connect(ID_TCPSERVER1, EV_ONDATA,(wxObjectEventFunction)&tcptestFrame::TCPServer1OnData); + + + TCPClient1 = new SimpleTCPClient(this, ID_TCPCLIENT1); + Connect(ID_TCPCLIENT1, EV_CLIENTONDATA,(wxObjectEventFunction)&tcptestFrame::TCPClient1OnData); + +} + +// Old habits... +wxString IntToStr( int num_in ) +{ + wxString str_out = wxString::Format(wxT("%i"),num_in); + return str_out; +} +int StrToInt( wxString str_in ) +{ + int int_out = wxAtoi(str_in); + return int_out; +} +void tcptestFrame::LogServer( wxString logText ) +{ + // Prints log to a text control + // "(GUI)" is prepended to make it easier to understand how the application works + // It will show which part of log was generated here + LogSrv1->WriteText("(GUI) " + logText + "\n"); +} +void tcptestFrame::LogClient( wxString logText ) +{ + // Prints log to a text control + // "(GUI)" is prepended to make it easier to understand how the application works + // It will show which part of log was generated here + LogClient1->WriteText("(GUI) " + logText + "\n"); +} + +void tcptestFrame::TCPClient1OnData(wxCommandEvent& event) +{ + + // This will turn true if we find non-string data + bool binaryData = false; + + LogClient("Incoming data:"); + + // Peek single byte (peeking doesn't clear data that was read) + unsigned char peekBuf[1]; + TCPClient1->Peek(peekBuf, 1); + + // If data starts with 0x00 or 0x01 we assume that it is binary data + // This is just an example and not a standard of any kind + if (peekBuf[0] == 0x00 || peekBuf[0] == 0x01) binaryData = true; + + + // If this is not binary data, just read it as text string and print to log + if ( !binaryData ) + { + LogClient( TCPClient1->ReadStr() ); + } + else if ( binaryData ) // If it is binary data, then proceed with it + { + LogClient("Found binary data"); + + // Prepare 8-byte data buffer to receive data + // because currently we are only handling 8-byte data packets + + unsigned char recvBuf[8]; + memset(recvBuf, 0, 8); // Fill with zeros + + // Read 8 bytes to buffer + TCPClient1->Read(recvBuf, 8); + + // Check if data contains header and termination that we can understand + // Currently we are only expecting data in this format: + // 0x01 0x49 0x04 X X X X 0x04 + // where X X X X are 4 bytes of 32-bit integer number + // + if (recvBuf[0] == 0x01 && recvBuf[1] == 0x49 && recvBuf[2] == 0x04 && recvBuf[7] == 0x04) + { + // Resulting number will be stored here + long integerValue = 0; + + // Read 4 bytes of data into 32-bit integer + // i<4 means 4 bytes, recvBuf[3+i] means we start reading from 3rd byte of buffer + for (int i=0; i<4; i++) integerValue |= (recvBuf[3+i] << i*8); + + // Print received integer value in log + LogClient("Received 32-bit integer value:\n" + + wxString::Format(wxT("%i"),integerValue) ); + + } + else LogClient("Unknown format of data"); // Warn about unrecognized data if it didn't met specified conditions + + } + +} + +void tcptestFrame::TCPServer1OnConnected(wxCommandEvent& event) +{ + LogServer("Client connected"); + UpdateGUI(); +} + +void tcptestFrame::TCPServer1OnDisconnected(wxCommandEvent& event) +{ + LogServer("Client disconnected"); + UpdateGUI(); +} + +void tcptestFrame::TCPServer1OnData(wxCommandEvent& event) +{ + + wxSocketBase *sock = (wxSocketBase*) event.GetClientData(); + wxIPV4address addr; + sock->GetPeer(addr); + + //LogServer( "Data from " + addr.IPAddress() + ":\n" + // + TCPServer1->ReadStr( sock ) ); + + + // This will turn true if we find non-string data + bool binaryData = false; + + LogServer( "Data from " + addr.IPAddress() + "\n" ); + + // Peek single byte (peeking doesn't clear data that was read) + unsigned char peekBuf[1]; + TCPServer1->Peek(peekBuf, 1, sock); + + // If data starts with 0x00 or 0x01 we assume that it is binary data + // This is just an example and not a standard of any kind + if (peekBuf[0] == 0x00 || peekBuf[0] == 0x01) binaryData = true; + + + // If this is not binary data, just read it as text string and print to log + if ( !binaryData ) + { + LogServer( TCPServer1->ReadStr(sock) ); + } + else if ( binaryData ) // If it is binary data, then proceed with it + { + LogServer("Found binary data"); + + // Prepare 8-byte data buffer to receive data + // because currently we are only handling 8-byte data packets + + unsigned char recvBuf[8]; + memset(recvBuf, 0, 8); // Fill with zeros + + // Read 8 bytes to buffer + TCPServer1->Read(recvBuf, 8, sock); + + // Check if data contains header and termination that we can understand + // Currently we are only expecting data in this format: + // 0x01 0x49 0x04 X X X X 0x04 + // where X X X X are 4 bytes of 32-bit integer number + // + if (recvBuf[0] == 0x01 && recvBuf[1] == 0x49 && recvBuf[2] == 0x04 && recvBuf[7] == 0x04) + { + // Resulting number will be stored here + long integerValue = 0; + + // Read 4 bytes of data into 32-bit integer + // i<4 means 4 bytes, recvBuf[3+i] means we start reading from 3rd byte of buffer + for (int i=0; i<4; i++) integerValue |= (recvBuf[3+i] << i*8); + + // Print received integer value in log + LogServer("Received 32-bit integer value:\n" + + wxString::Format(wxT("%i"),integerValue) ); + + } + else LogServer("Unknown format of data"); // Warn about unrecognized data if it didn't met specified conditions + + } + +} + + +tcptestFrame::~tcptestFrame() +{ + //(*Destroy(tcptestFrame) + //*) +} + +void tcptestFrame::OnQuit(wxCommandEvent& event) +{ + Close(); +} + + +void tcptestFrame::UpdateGUI() +{ + + if (TCPServer1) // Update IP list and client count with current server data + { + // Display client count + LabelCount1->SetLabel( "Client count: " + IntToStr( TCPServer1->clientCount() ) ); + + // Get target address from selected IP list field + int lastIndex = ListBox1->GetSelection(); + wxString lastSelection = ""; + if (lastIndex >= 0) lastSelection = ListBox1->GetString(lastIndex); + + ListBox1->Clear(); // Temporarily clear list of clients + + // Iterate over map of connected clients and update list + for( std::map::const_iterator it = TCPServer1->clientMap.begin(); + it != TCPServer1->clientMap.end(); ++it) + { + ListBox1->Append( it->second ); + } + + // Bring back the last selection + if (lastIndex >= 0) ListBox1->SetStringSelection(lastSelection); + + } + else // Clear everything if server is not active + { + ListBox1->Clear(); + LabelCount1->SetLabel( "Client count: 0" ); + } +} + + +void tcptestFrame::OnAbout(wxCommandEvent& event) +{ + wxString msg = "TCP test built with \n" + wxbuildinfo(long_f); + wxMessageBox(msg, _("About")); +} + +void tcptestFrame::OnBtnOpenSrvClick(wxCommandEvent& event) +{ + + +} + +void tcptestFrame::OnBtnSrvSendSelClick(wxCommandEvent& event) +{ + + // If no binary mode checked, just send text string + if (!CheckBinarySrv->GetValue()) + { + // Get target address from selected IP list field + int selectedAddrIndex = ListBox1->GetSelection(); + + // Proceed only if selection index is 0 or greater (-1 would mean no selection) + if (selectedAddrIndex >= 0) + { + wxString targetAddr = ListBox1->GetString(selectedAddrIndex); + // Send to target address + TCPServer1->WriteStr(TextSendSrv1->GetValue(), targetAddr ); + } + } + else + { + // Prepare 8-byte data buffer + unsigned char sendBuf[8]; + memset(sendBuf, 0, 8); // Fill with zeros + + // Get a number that we want to send as binary data + // It will be stored in 32-bit integer, that means 4 bytes of data + long integerValue = SpinCtrlSrv1->GetValue(); + + // Create a header in first three bytes (we are counting bytes from zero) + // this is just an example and not some standard format, client application needs to recognize our format + sendBuf[0] = 0x01; // Receiver will read this as beginning of binary packet + sendBuf[1] = 0x49; // This is hex code of "I" letter, that will mean signed integer + sendBuf[2] = 0x04; // 0x04 will mean we are sending 4 bytes of 32-bit integer + + // Put 32-bit integer into buffer + // 3 in sendBuf[3+i] means that value will be placed starting with 3rd byte of buffer + // i<4 means that we are writing 4 bytes + for (int i=0; i<4; i++) sendBuf[3+i] = (integerValue >> i*8) & 0xFF; + + sendBuf[7] = 0x04; // Set last byte to 0x04 as a footer (this is just an arbitrary choice) + + // Get target address from selected IP list field + int selectedAddrIndex = ListBox1->GetSelection(); + + // Proceed only if selection index is 0 or greater (-1 would mean no selection) + if (selectedAddrIndex >= 0) + { + wxString targetAddr = ListBox1->GetString(selectedAddrIndex); + // Send to target address + TCPServer1->Write(sendBuf, 8, targetAddr ); + } + + /* + // Note: because we are sending binary data, it also needs to be read as such. + // Reading it as text would result in empty string or random characters. + // Receiver should read first bytes of our header, recognize format of the data + // and process it properly (this is done in client receiving example). + */ + } + + +} + +void tcptestFrame::OnBtnOpenSrvClick1(wxCommandEvent& event) +{ + TCPServer1->logBox = LogSrv1; + TCPServer1->Port( wxAtoi( PortSrvText1->GetValue() ) ); + TCPServer1->Open(); +} + +void tcptestFrame::OnBtnCloseSrvClick(wxCommandEvent& event) +{ + TCPServer1->Close(); + UpdateGUI(); +} + +void tcptestFrame::OnBtnClientConnClick(wxCommandEvent& event) +{ + TCPClient1->logBox = LogClient1; + TCPClient1->Connect( TextClientHost1->GetValue(), wxAtoi( TextClientPort1->GetValue() ) ); +} + +void tcptestFrame::OnBtnClientDisconnClick(wxCommandEvent& event) +{ + TCPClient1->Disconnect(); +} + +void tcptestFrame::OnBtnClientSendClick(wxCommandEvent& event) +{ + + if (!CheckBinaryClient->GetValue()) + { + TCPClient1->WriteStr( TextSendClient1->GetValue() ); + } + else + { + // Prepare 8-byte data buffer + unsigned char sendBuf[8]; + memset(sendBuf, 0, 8); // Fill with zeros + + // Get a number that we want to send as binary data + // It will be stored in 32-bit integer, that means 4 bytes of data + long integerValue = SpinCtrlClient1->GetValue(); + + // Create a header in first three bytes (we are counting bytes from zero) + // this is just an example and not some standard format, client application needs to recognize our format + sendBuf[0] = 0x01; // Receiver will read this as beginning of binary packet + sendBuf[1] = 0x49; // This is hex code of "I" letter, that will mean signed integer + sendBuf[2] = 0x04; // 0x04 will mean we are sending 4 bytes of 32-bit integer + + // Put 32-bit integer into buffer + // 3 in sendBuf[3+i] means that value will be placed starting with 3rd byte of buffer + // i<4 means that we are writing 4 bytes + for (int i=0; i<4; i++) sendBuf[3+i] = (integerValue >> i*8) & 0xFF; + + sendBuf[7] = 0x04; // Set last byte to 0x04 as a footer (this is just an arbitrary choice) + + TCPClient1->Write(sendBuf, 8); + } + +} + + + +void tcptestFrame::OnBtnSrvSendAllClick(wxCommandEvent& event) +{ + // If no binary mode checked, just send text string + if (!CheckBinarySrv->GetValue()) + { + TCPServer1->WriteStr(TextSendSrv1->GetValue()); + } + else + { + // Prepare 8-byte data buffer + unsigned char sendBuf[8]; + memset(sendBuf, 0, 8); // Fill with zeros + + // Get a number that we want to send as binary data + // It will be stored in 32-bit integer, that means 4 bytes of data + long integerValue = SpinCtrlSrv1->GetValue(); + + // Create a header in first three bytes (we are counting bytes from zero) + // this is just an example and not some standard format, client application needs to recognize our format + sendBuf[0] = 0x01; // Receiver will read this as beginning of binary packet + sendBuf[1] = 0x49; // This is hex code of "I" letter, that will mean signed integer + sendBuf[2] = 0x04; // 0x04 will mean we are sending 4 bytes of 32-bit integer + + // Put 32-bit integer into buffer + // 3 in sendBuf[3+i] means that value will be placed starting with 3rd byte of buffer + // i<4 means that we are writing 4 bytes + for (int i=0; i<4; i++) sendBuf[3+i] = (integerValue >> i*8) & 0xFF; + + sendBuf[7] = 0x04; // Set last byte to 0x04 as a footer (this is just an arbitrary choice) + + // Iterate over list of all clients and send data + for (int i=0; i< ListBox1->GetCount(); i++) + { + wxString targetAddr = ListBox1->GetString(i); + TCPServer1->Write(sendBuf, 8, targetAddr ); + } + + /* + // Note: because we are sending binary data, it also needs to be read as such. + // Reading it as text would result in empty string or random characters. + // Receiver should read first bytes of our header, recognize format of the data + // and process it properly (this is done in client receiving example). + */ + } + +} + +void tcptestFrame::OnCheckBinarySrvClick(wxCommandEvent& event) +{ + if (CheckBinarySrv->GetValue()) + { + SpinCtrlSrv1->Enable(); + TextSendSrv1->Disable(); + } + else + { + SpinCtrlSrv1->Disable(); + TextSendSrv1->Enable(); + } +} + +void tcptestFrame::OnBtnDropClientClick(wxCommandEvent& event) +{ + // Get target address from selected IP list field + int selectedAddrIndex = ListBox1->GetSelection(); + + // Proceed only if selection index is 0 or greater (-1 would mean no selection) + if (selectedAddrIndex >= 0) + { + wxString targetAddr = ListBox1->GetString(selectedAddrIndex); + // Send to target address + TCPServer1->DropClient(targetAddr); + } +} + +void tcptestFrame::OnCheckBinaryClientClick(wxCommandEvent& event) +{ + if (CheckBinaryClient->GetValue()) + { + SpinCtrlClient1->Enable(); + TextSendClient1->Disable(); + } + else + { + SpinCtrlClient1->Disable(); + TextSendClient1->Enable(); + } +} diff --git a/Samples/tcptest/tcptestMain.h b/Samples/tcptest/tcptestMain.h new file mode 100644 index 0000000..ff2ba02 --- /dev/null +++ b/Samples/tcptest/tcptestMain.h @@ -0,0 +1,183 @@ +#ifndef HEADER_878F1DDCB707631B +#define HEADER_878F1DDCB707631B + +/*************************************************************** + * Name: tcptestMain.h + * Purpose: Defines Application Frame + * Author: () + * Created: 2023-11-10 + * Copyright: () + * License: + **************************************************************/ + +#ifndef TCPTESTMAIN_H +#define TCPTESTMAIN_H + +//(*Headers(tcptestFrame) +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//*) + +#include "tcpserver.h" +#include "tcpclient.h" + +class tcptestFrame: public wxFrame +{ + public: + + tcptestFrame(wxWindow* parent,wxWindowID id = -1); + virtual ~tcptestFrame(); + + void LogServer(wxString logText); + void LogClient(wxString logText); + void UpdateGUI(); + + + private: + + //(*Handlers(tcptestFrame) + void OnQuit(wxCommandEvent& event); + void OnAbout(wxCommandEvent& event); + void OnBtnOpenSrvClick(wxCommandEvent& event); + void OnBtnSrvSendSelClick(wxCommandEvent& event); + void OnBtnOpenSrvClick1(wxCommandEvent& event); + void OnBtnCloseSrvClick(wxCommandEvent& event); + void OnBtnClientConnClick(wxCommandEvent& event); + void OnBtnClientDisconnClick(wxCommandEvent& event); + void OnBtnClientSendClick(wxCommandEvent& event); + void OnBtnSrvSendAllClick(wxCommandEvent& event); + void OnCheckBinarySrvClick(wxCommandEvent& event); + void OnBtnDropClientClick(wxCommandEvent& event); + void OnCheckBinaryClientClick(wxCommandEvent& event); + //*) + + //(*Identifiers(tcptestFrame) + static const long ID_STATICTEXT3; + static const long ID_STATICTEXT4; + static const long ID_TEXTCTRL2; + static const long ID_BUTTON1; + static const long ID_BUTTON2; + static const long ID_PANEL5; + static const long ID_STATICTEXT1; + static const long ID_LISTBOX1; + static const long ID_BUTTON8; + static const long ID_PANEL6; + static const long ID_STATICTEXT2; + static const long ID_TEXTCTRL1; + static const long ID_PANEL7; + static const long ID_PANEL2; + static const long ID_TEXTCTRL3; + static const long ID_CHECKBOX1; + static const long ID_SPINCTRL1; + static const long ID_PANEL10; + static const long ID_PANEL8; + static const long ID_BUTTON3; + static const long ID_BUTTON4; + static const long ID_PANEL9; + static const long ID_PANEL4; + static const long ID_PANEL3; + static const long ID_STATICTEXT5; + static const long ID_TEXTCTRL7; + static const long ID_STATICTEXT6; + static const long ID_TEXTCTRL4; + static const long ID_BUTTON5; + static const long ID_BUTTON6; + static const long ID_PANEL14; + static const long ID_STATICTEXT8; + static const long ID_TEXTCTRL5; + static const long ID_PANEL16; + static const long ID_PANEL13; + static const long ID_TEXTCTRL6; + static const long ID_CHECKBOX2; + static const long ID_SPINCTRL2; + static const long ID_PANEL19; + static const long ID_PANEL18; + static const long ID_BUTTON7; + static const long ID_PANEL20; + static const long ID_PANEL17; + static const long ID_PANEL12; + static const long ID_NOTEBOOK1; + static const long ID_PANEL1; + static const long idMenuQuit; + static const long idMenuAbout; + static const long ID_STATUSBAR1; + //*) + + //(*Declarations(tcptestFrame) + wxButton* BtnClientConn; + wxButton* BtnClientDisconn; + wxButton* BtnClientSend; + wxButton* BtnCloseSrv; + wxButton* BtnDropClient; + wxButton* BtnOpenSrv; + wxButton* BtnSrvSendAll; + wxButton* BtnSrvSendSel; + wxCheckBox* CheckBinaryClient; + wxCheckBox* CheckBinarySrv; + wxListBox* ListBox1; + wxNotebook* Notebook1; + wxPanel* Panel10; + wxPanel* Panel12; + wxPanel* Panel13; + wxPanel* Panel14; + wxPanel* Panel16; + wxPanel* Panel17; + wxPanel* Panel18; + wxPanel* Panel19; + wxPanel* Panel1; + wxPanel* Panel20; + wxPanel* Panel2; + wxPanel* Panel3; + wxPanel* Panel4; + wxPanel* Panel5; + wxPanel* Panel6; + wxPanel* Panel7; + wxPanel* Panel8; + wxPanel* Panel9; + wxSpinCtrl* SpinCtrlClient1; + wxSpinCtrl* SpinCtrlSrv1; + wxStaticText* LabelCount1; + wxStaticText* StaticText1; + wxStaticText* StaticText2; + wxStaticText* StaticText3; + wxStaticText* StaticText4; + wxStaticText* StaticText5; + wxStaticText* StaticText7; + wxStatusBar* StatusBar1; + wxTextCtrl* LogClient1; + wxTextCtrl* LogSrv1; + wxTextCtrl* PortSrvText1; + wxTextCtrl* TextClientHost1; + wxTextCtrl* TextClientPort1; + wxTextCtrl* TextSendClient1; + wxTextCtrl* TextSendSrv1; + //*) + + SimpleTCPServer *TCPServer1; + static const long ID_TCPSERVER1; + void TCPServer1OnConnected( wxCommandEvent& event ); // When new client is connected + void TCPServer1OnDisconnected( wxCommandEvent& event ); // When a client is disconnected + void TCPServer1OnData( wxCommandEvent& event ); // When new data is available + void TCPServer1OnError( wxCommandEvent& event ); // When an error happens + + SimpleTCPClient *TCPClient1; + static const long ID_TCPCLIENT1; + void TCPClient1OnData( wxCommandEvent& event ); // When new data is available + + + DECLARE_EVENT_TABLE() +}; + +#endif // TCPTESTMAIN_H +#endif // header guard + diff --git a/Samples/tcptest/wxsmith/tcptestframe.wxs b/Samples/tcptest/wxsmith/tcptestframe.wxs new file mode 100644 index 0000000..d9bb113 --- /dev/null +++ b/Samples/tcptest/wxsmith/tcptestframe.wxs @@ -0,0 +1,455 @@ + + + + TCP Client/Server + wxSYS_COLOUR_BTNFACE + 340,320 + // This code will set a smaller font if Win 3.11 is detected: int majorVer; int minorVer; wxGetOsVersion(&majorVer, &minorVer); if (minorVer == 30 || majorVer == 30 || majorVer == 3) { wxFont thisFont(8,wxFONTFAMILY__DEFAULT,wxFONTSTYLE__NORMAL,wxFONTWEIGHT__NORMAL,false,wxEmptyString,wxFONTENCODING__DEFAULT); SetFont(thisFont); } + 0 + + + + + 286,334 + + wxVERTICAL + + + + + + wxVERTICAL + + + 330,191 + + + + 58,36d + + wxVERTICAL + + + + 56,8d + + + wxALIGN_LEFT + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + 20,1 + + + + + 38,8d + + + wxALIGN_LEFT + 5 + + + + 3000 + 30,-1d + + + wxTOP|wxBOTTOM + + + + + + + wxTOP|wxEXPAND + 8 + + + + + + + wxTOP|wxBOTTOM|wxEXPAND + 4 + + + + wxALL|wxEXPAND + 5 + + + + + wxVERTICAL + + + + 45,8d + + + wxALL|wxALIGN_LEFT + 5 + + + + -1 + + + wxALL|wxEXPAND + 5 + + + + + + + + wxALL|wxALIGN_LEFT + 4 + + + + wxALL|wxEXPAND + + + + + 360,172 + + wxVERTICAL + + + + 61,8d + + + wxALL|wxALIGN_LEFT + 5 + + + + + + wxALL|wxEXPAND + 5 + + + + + wxALL|wxEXPAND + + + + + wxALL|wxEXPAND + 5 + + + + + 646,79 + + + + 68,26d + + wxVERTICAL + + + Message + + + wxEXPAND + + + + + + + + 119,8d + + + wxTOP|wxBOTTOM|wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + + + + 12345 + -32737 + 32737 + 80,-1d + 0 + + + wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL + 5 + + + + wxALL|wxEXPAND + + + + + wxBOTTOM|wxLEFT|wxRIGHT|wxEXPAND + 4 + + + + + 139,95 + + wxVERTICAL + + + + 48,13d + + + wxEXPAND + + + + + 48,13d + + + wxTOP|wxEXPAND + 4 + + + + wxLEFT|wxEXPAND + 2 + + + + wxALL|wxEXPAND + 5 + + + + + + + + + wxVERTICAL + + + 330,191 + + + + 58,36d + + wxVERTICAL + + + + 56,8d + + + wxBOTTOM|wxALIGN_LEFT + 5 + + + + 127.0.0.1 + 30,-1d + + + wxTOP|wxBOTTOM|wxEXPAND + + + + + 38,8d + + + wxALIGN_LEFT + 5 + + + + 3000 + 30,-1d + + + wxTOP|wxBOTTOM + + + + + + + wxTOP|wxEXPAND + 8 + + + + + + + wxTOP|wxBOTTOM|wxEXPAND + 4 + + + + wxALL|wxEXPAND + 5 + + + + 360,172 + + wxVERTICAL + + + + 61,8d + + + wxALL|wxALIGN_LEFT + 5 + + + + + + wxALL|wxEXPAND + 5 + + + + + wxALL|wxEXPAND + + + + + wxALL|wxEXPAND + 5 + + + + + 646,79 + + + + 68,26d + + wxVERTICAL + + + Message + + + wxEXPAND + + + + + + + + 119,8d + + + wxTOP|wxBOTTOM|wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + + + + 12345 + -32737 + 32737 + 80,-1d + 0 + + + wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL + 5 + + + + wxALL|wxEXPAND + + + + + wxBOTTOM|wxLEFT|wxRIGHT|wxEXPAND + 4 + + + + + 139,95 + + wxVERTICAL + + + + 48,13d + + + wxEXPAND + + + + wxLEFT|wxEXPAND + 2 + + + + wxALL|wxEXPAND + 5 + + + + + + + wxALL|wxEXPAND + 5 + + + + + wxALL|wxEXPAND + + + + + + + + + Alt-F4 + Quit the application + + + + + + + + F1 + Show info about this application + + + + + + 1 + -1 + wxSB_NORMAL + + + diff --git a/Samples/vidplay/resource.rc b/Samples/vidplay/resource.rc new file mode 100644 index 0000000..553c482 --- /dev/null +++ b/Samples/vidplay/resource.rc @@ -0,0 +1,3 @@ +aaaa ICON "wx/msw/std.ico" + +#include "wx/msw/wx.rc" diff --git a/Samples/vidplay/video.avi b/Samples/vidplay/video.avi new file mode 100644 index 0000000..7b2d7a5 Binary files /dev/null and b/Samples/vidplay/video.avi differ diff --git a/Samples/vidplay/video.mpg b/Samples/vidplay/video.mpg new file mode 100644 index 0000000..53aec74 Binary files /dev/null and b/Samples/vidplay/video.mpg differ diff --git a/Samples/vidplay/vidplay.cbp b/Samples/vidplay/vidplay.cbp new file mode 100644 index 0000000..28c6845 --- /dev/null +++ b/Samples/vidplay/vidplay.cbp @@ -0,0 +1,159 @@ + + + + + + diff --git a/Samples/vidplay/vidplay.depend b/Samples/vidplay/vidplay.depend new file mode 100644 index 0000000..390733c --- /dev/null +++ b/Samples/vidplay/vidplay.depend @@ -0,0 +1,3125 @@ +# depslib dependency file v1.0 +1620913520 source:h:\vidplay\vidplay\resource.rc + "wx/msw/wx.rc" + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\wx.rc + + + "wx/msw/wince/wince.rc" + "wx/msw/rcdefs.h" + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\wince.rc + + "wx/msw/wince/smartphone.rc" + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\smartphone.rc + + "wx/msw/wince/resources.h" + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\resources.h + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\rcdefs.h + +1699805744 source:h:\vidplay\vidplay\vidplayapp.cpp + "vidplayApp.h" + "vidplayMain.h" + + +1699805744 h:\vidplay\vidplay\vidplayapp.h + + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\app.h + "wx/event.h" + "wx/build.h" + "wx/init.h" + "wx/intl.h" + "wx/palmos/app.h" + "wx/msw/app.h" + "wx/motif/app.h" + "wx/mgl/app.h" + "wx/dfb/app.h" + "wx/gtk/app.h" + "wx/gtk1/app.h" + "wx/x11/app.h" + "wx/mac/app.h" + "wx/cocoa/app.h" + "wx/os2/app.h" + "wx/univ/theme.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\event.h + "wx/defs.h" + "wx/cpp.h" + "wx/object.h" + "wx/clntdata.h" + "wx/gdicmn.h" + "wx/cursor.h" + "wx/thread.h" + "wx/dynarray.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\defs.h + "wx/platform.h" + "wx/features.h" + "wx/version.h" + "wx/dlimpexp.h" + "wx/debug.h" + + + + "wx/msw/winundef.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\platform.h + + + + "wx/mac/carbon/config_xcode.h" + "wx/setup.h" + "wx/chkconf.h" + "wx/msw/wince/libraries.h" + "wx/msw/libraries.h" + "wx/msw/gccpriv.h" + + +1699794608 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\lib\bcc_lib\msw\wx\setup.h + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\chkconf.h + "wx/palmos/chkconf.h" + "wx/msw/wince/chkconf.h" + "wx/msw/chkconf.h" + "wx/mac/chkconf.h" + "wx/os2/chkconf.h" + "wx/mgl/chkconf.h" + "wx/dfb/chkconf.h" + "wx/motif/chkconf.h" + "wx/x11/chkconf.h" + "wx/univ/chkconf.h" + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\chkconf.h + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\chkconf.h + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\chkconf.h + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\libraries.h + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\libraries.h + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\gccpriv.h + <_mingw.h> + + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\features.h + +1300793744 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\version.h + "wx/cpp.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\cpp.h + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\dlimpexp.h + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\debug.h + + + "wx/wxchar.h" + +1300793744 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\wxchar.h + "wx/platform.h" + "wx/dlimpexp.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\winundef.h + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\object.h + "wx/memory.h" + "wx/xti.h" + "wx/msw/msvcrt.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\memory.h + "wx/defs.h" + "wx/string.h" + "wx/msgout.h" + + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\string.h + "wx/defs.h" + + + + + + + + + + + + + "wx/wxchar.h" + "wx/buffer.h" + "wx/strconv.h" + "wx/beforestd.h" + + "wx/afterstd.h" + "wx/arrstr.h" + "wx/iosfwrap.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\buffer.h + "wx/wxchar.h" + + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\strconv.h + "wx/defs.h" + "wx/wxchar.h" + "wx/buffer.h" + "typeinfo.h" + + "wx/fontenc.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\fontenc.h + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\beforestd.h + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\afterstd.h + "wx/msw/winundef.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\arrstr.h + "wx/defs.h" + "wx/string.h" + "wx/dynarray.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\dynarray.h + "wx/defs.h" + "wx/beforestd.h" + + + "wx/afterstd.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\iosfwrap.h + + + "wx/msw/winundef.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msgout.h + "wx/defs.h" + "wx/wxchar.h" + +1300793744 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\xti.h + "wx/defs.h" + "wx/memory.h" + "wx/flags.h" + "wx/string.h" + "wx/arrstr.h" + "wx/hashmap.h" + "wx/log.h" + "wx/intl.h" + + "wx/dynarray.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\flags.h + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\hashmap.h + "wx/string.h" + + + + + + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\log.h + "wx/defs.h" + "wx/string.h" + "wx/arrstr.h" + + "wx/dynarray.h" + "wx/iosfwrap.h" + "wx/generic/logg.h" + "wx/cocoa/log.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\logg.h + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\intl.h + "wx/defs.h" + "wx/string.h" + "wx/fontenc.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\msvcrt.h + + + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\clntdata.h + "wx/defs.h" + "wx/string.h" + "wx/hashmap.h" + "wx/vector.h" + +1300793744 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\vector.h + "wx/defs.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\gdicmn.h + "wx/defs.h" + "wx/list.h" + "wx/string.h" + "wx/fontenc.h" + "wx/hashmap.h" + "wx/math.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\list.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/beforestd.h" + + + + "wx/afterstd.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\math.h + "wx/defs.h" + + + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\cursor.h + "wx/defs.h" + "wx/palmos/cursor.h" + "wx/msw/cursor.h" + "wx/motif/cursor.h" + "wx/gtk/cursor.h" + "wx/gtk1/cursor.h" + "wx/x11/cursor.h" + "wx/mgl/cursor.h" + "wx/dfb/cursor.h" + "wx/mac/cursor.h" + "wx/cocoa/cursor.h" + "wx/os2/cursor.h" + "wx/utils.h" + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\cursor.h + "wx/msw/gdiimage.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\gdiimage.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/list.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\gdiobj.h + "wx/object.h" + +1300793744 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\utils.h + "wx/object.h" + "wx/list.h" + "wx/filefn.h" + "wx/gdicmn.h" + "wx/longlong.h" + "wx/platinfo.h" + + + + + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\filefn.h + "wx/list.h" + "wx/arrstr.h" + "wx/msw/wince/time.h" + "wx/msw/private.h" + + + + + + + + + + + + "wx/os2/private.h" + + + + + + + + + + + + + + + + + + + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\time.h + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\private.h + "wx/msw/wrapwin.h" + "wx/msw/microwin.h" + "wx/log.h" + "wx/gdicmn.h" + "wx/colour.h" + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\wrapwin.h + "wx/platform.h" + + "wx/msw/winundef.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\microwin.h + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\colour.h + "wx/defs.h" + "wx/gdiobj.h" + "wx/variant.h" + "wx/generic/colour.h" + "wx/msw/colour.h" + "wx/motif/colour.h" + "wx/gtk/colour.h" + "wx/gtk1/colour.h" + "wx/generic/colour.h" + "wx/generic/colour.h" + "wx/x11/colour.h" + "wx/mac/colour.h" + "wx/cocoa/colour.h" + "wx/os2/colour.h" + +1300793744 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\variant.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/arrstr.h" + "wx/list.h" + "wx/cpp.h" + "wx/datetime.h" + "wx/db.h" + "wx/iosfwrap.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\datetime.h + "wx/defs.h" + + "wx/msw/wince/time.h" + + "wx/longlong.h" + "wx/dynarray.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\longlong.h + "wx/defs.h" + "wx/string.h" + + "wx/iosfwrap.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\db.h + "wx/defs.h" + "wx/string.h" + + "wx/msw/wrapwin.h" + "sql.h" + "sqlext.h" + "odbcinst.h" + "wx/msw/wrapwin.h" + "wx/isql.h" + "wx/isqlext.h" + + + + + "wx/object.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\isql.h + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\isqlext.h + "wx/isql.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\colour.h + "wx/object.h" + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\colour.h + "wx/object.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\platinfo.h + "wx/string.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\thread.h + "wx/defs.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\build.h + "wx/version.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\init.h + "wx/defs.h" + "wx/wxchar.h" + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\app.h + "wx/event.h" + "wx/icon.h" + "wx/msw/wrapwin.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\icon.h + "wx/iconloc.h" + "wx/generic/icon.h" + "wx/msw/icon.h" + "wx/motif/icon.h" + "wx/generic/icon.h" + "wx/generic/icon.h" + "wx/generic/icon.h" + "wx/generic/icon.h" + "wx/generic/icon.h" + "wx/mac/icon.h" + "wx/cocoa/icon.h" + "wx/os2/icon.h" + "wx/variant.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\iconloc.h + "wx/string.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\icon.h + "wx/bitmap.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\bitmap.h + "wx/string.h" + "wx/gdicmn.h" + "wx/colour.h" + "wx/variant.h" + "wx/palmos/bitmap.h" + "wx/msw/bitmap.h" + "wx/x11/bitmap.h" + "wx/gtk/bitmap.h" + "wx/gtk1/bitmap.h" + "wx/x11/bitmap.h" + "wx/mgl/bitmap.h" + "wx/dfb/bitmap.h" + "wx/mac/bitmap.h" + "wx/cocoa/bitmap.h" + "wx/os2/bitmap.h" + "wx/generic/mask.h" + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\bitmap.h + "wx/msw/gdiimage.h" + "wx/palette.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\palette.h + "wx/defs.h" + "wx/object.h" + "wx/gdiobj.h" + "wx/palmos/palette.h" + "wx/msw/palette.h" + "wx/motif/palette.h" + "wx/generic/paletteg.h" + "wx/x11/palette.h" + "wx/mgl/palette.h" + "wx/mac/palette.h" + "wx/os2/palette.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\palette.h + "wx/gdiobj.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\paletteg.h + "wx/defs.h" + "wx/object.h" + "wx/gdiobj.h" + "wx/gdicmn.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\mask.h + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\icon.h + "wx/msw/gdiimage.h" + +1300793819 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\theme.h + "wx/string.h" + +1699806013 h:\vidplay\vidplay\vidplaymain.h + + + + + + + + + + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\button.h + "wx/defs.h" + "wx/control.h" + "wx/univ/button.h" + "wx/msw/button.h" + "wx/motif/button.h" + "wx/gtk/button.h" + "wx/gtk1/button.h" + "wx/mac/button.h" + "wx/cocoa/button.h" + "wx/os2/button.h" + "wx/palmos/button.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\control.h + "wx/defs.h" + "wx/window.h" + "wx/univ/control.h" + "wx/palmos/control.h" + "wx/msw/control.h" + "wx/motif/control.h" + "wx/gtk/control.h" + "wx/gtk1/control.h" + "wx/mac/control.h" + "wx/cocoa/control.h" + "wx/os2/control.h" + +1300793744 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\window.h + "wx/event.h" + "wx/list.h" + "wx/cursor.h" + "wx/font.h" + "wx/colour.h" + "wx/region.h" + "wx/utils.h" + "wx/intl.h" + "wx/validate.h" + "wx/palette.h" + "wx/accel.h" + "wx/access.h" + "wx/palmos/window.h" + "wx/msw/window.h" + "wx/motif/window.h" + "wx/gtk/window.h" + "wx/gtk1/window.h" + "wx/x11/window.h" + "wx/mgl/window.h" + "wx/dfb/window.h" + "wx/mac/window.h" + "wx/cocoa/window.h" + "wx/os2/window.h" + "wx/univ/window.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\font.h + "wx/defs.h" + "wx/fontenc.h" + "wx/gdiobj.h" + "wx/palmos/font.h" + "wx/msw/font.h" + "wx/motif/font.h" + "wx/gtk/font.h" + "wx/gtk1/font.h" + "wx/x11/font.h" + "wx/mgl/font.h" + "wx/dfb/font.h" + "wx/mac/font.h" + "wx/cocoa/font.h" + "wx/os2/font.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\font.h + "wx/gdicmn.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\region.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/palmos/region.h" + "wx/msw/region.h" + "wx/gtk/region.h" + "wx/gtk1/region.h" + "wx/x11/region.h" + "wx/mgl/region.h" + "wx/dfb/region.h" + "wx/mac/region.h" + "wx/cocoa/region.h" + "wx/os2/region.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\region.h + +1300793744 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\validate.h + "wx/defs.h" + "wx/event.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\accel.h + "wx/defs.h" + "wx/object.h" + "wx/generic/accel.h" + "wx/msw/accel.h" + "wx/motif/accel.h" + "wx/gtk/accel.h" + "wx/gtk1/accel.h" + "wx/mac/accel.h" + "wx/generic/accel.h" + "wx/os2/accel.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\accel.h + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\accel.h + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\access.h + "wx/defs.h" + "wx/variant.h" + "wx/msw/ole/access.h" + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\ole\access.h + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\window.h + "wx/hash.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\hash.h + "wx/defs.h" + "wx/object.h" + "wx/list.h" + "wx/dynarray.h" + +1300793819 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\window.h + "wx/bitmap.h" + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\control.h + "wx/univ/inphand.h" + "wx/univ/inpcons.h" + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\inphand.h + "wx/univ/inpcons.h" + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\inpcons.h + "wx/object.h" + "wx/event.h" + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\control.h + "wx/dynarray.h" + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\button.h + "wx/bitmap.h" + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\button.h + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\frame.h + "wx/toplevel.h" + "wx/univ/frame.h" + "wx/palmos/frame.h" + "wx/msw/frame.h" + "wx/gtk/frame.h" + "wx/gtk1/frame.h" + "wx/motif/frame.h" + "wx/mac/frame.h" + "wx/cocoa/frame.h" + "wx/os2/frame.h" + +1300793744 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\toplevel.h + "wx/window.h" + "wx/iconbndl.h" + "wx/palmos/toplevel.h" + "wx/msw/toplevel.h" + "wx/gtk/toplevel.h" + "wx/gtk1/toplevel.h" + "wx/x11/toplevel.h" + "wx/mgl/toplevel.h" + "wx/dfb/toplevel.h" + "wx/mac/toplevel.h" + "wx/cocoa/toplevel.h" + "wx/os2/toplevel.h" + "wx/motif/toplevel.h" + "wx/univ/toplevel.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\iconbndl.h + "wx/dynarray.h" + "wx/gdicmn.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\toplevel.h + +1300793819 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\toplevel.h + "wx/univ/inpcons.h" + "wx/univ/inphand.h" + "wx/icon.h" + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\frame.h + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\frame.h + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\panel.h + "wx/generic/panelg.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\panelg.h + "wx/window.h" + "wx/containr.h" + +1300793740 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\containr.h + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\sizer.h + "wx/defs.h" + "wx/window.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\slider.h + "wx/defs.h" + "wx/control.h" + "wx/univ/slider.h" + "wx/msw/slider95.h" + "wx/motif/slider.h" + "wx/gtk/slider.h" + "wx/gtk1/slider.h" + "wx/mac/slider.h" + "wx/cocoa/slider.h" + "wx/os2/slider.h" + "wx/palmos/slider.h" + +1300793819 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\slider.h + "wx/univ/scrthumb.h" + +1300793819 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\scrthumb.h + "wx/timer.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\timer.h + "wx/defs.h" + "wx/object.h" + "wx/longlong.h" + "wx/event.h" + "wx/stopwatch.h" + "wx/window.h" + "wx/msw/timer.h" + "wx/motif/timer.h" + "wx/gtk/timer.h" + "wx/gtk1/timer.h" + "wx/generic/timer.h" + "wx/cocoa/timer.h" + "wx/mac/timer.h" + "wx/os2/timer.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\stopwatch.h + "wx/defs.h" + "wx/longlong.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\timer.h + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\timer.h + +1699738830 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\slider95.h + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\stattext.h + "wx/defs.h" + "wx/control.h" + "wx/univ/stattext.h" + "wx/msw/stattext.h" + "wx/motif/stattext.h" + "wx/gtk/stattext.h" + "wx/gtk1/stattext.h" + "wx/mac/stattext.h" + "wx/cocoa/stattext.h" + "wx/os2/stattext.h" + "wx/palmos/stattext.h" + +1300793819 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\stattext.h + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\stattext.h + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\textctrl.h + "wx/defs.h" + "wx/control.h" + "wx/dynarray.h" + "wx/gdicmn.h" + "wx/ioswrap.h" + "wx/x11/textctrl.h" + "wx/univ/textctrl.h" + "wx/msw/wince/textctrlce.h" + "wx/msw/textctrl.h" + "wx/motif/textctrl.h" + "wx/gtk/textctrl.h" + "wx/gtk1/textctrl.h" + "wx/mac/textctrl.h" + "wx/cocoa/textctrl.h" + "wx/os2/textctrl.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\ioswrap.h + + + "wx/msw/winundef.h" + +1300793819 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\textctrl.h + "wx/scrolwin.h" + "wx/univ/inphand.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\scrolwin.h + "wx/panel.h" + "wx/gtk/scrolwin.h" + "wx/gtk1/scrolwin.h" + +1300793816 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\wince\textctrlce.h + "wx/dynarray.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\textctrl.h + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\mediactrl.h + "wx/defs.h" + "wx/control.h" + "wx/uri.h" + +1300793744 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\uri.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\image.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdicmn.h" + "wx/hashmap.h" + "wx/stream.h" + "wx/variant.h" + "wx/imagbmp.h" + "wx/imagpng.h" + "wx/imaggif.h" + "wx/imagpcx.h" + "wx/imagjpeg.h" + "wx/imagtga.h" + "wx/imagtiff.h" + "wx/imagpnm.h" + "wx/imagxpm.h" + "wx/imagiff.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\stream.h + "wx/defs.h" + + "wx/object.h" + "wx/string.h" + "wx/filefn.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\imagbmp.h + "wx/image.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\imagpng.h + "wx/defs.h" + "wx/image.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\imaggif.h + "wx/image.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\imagpcx.h + "wx/image.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\imagjpeg.h + "wx/defs.h" + "wx/image.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\imagtga.h + "wx/image.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\imagtiff.h + "wx/defs.h" + "wx/image.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\imagpnm.h + "wx/image.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\imagxpm.h + "wx/image.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\imagiff.h + "wx/image.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\wx.rc + + "wx/msw/wince/wince.rc" + "wx/msw/rcdefs.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\wince.rc + + "wx/msw/wince/resources.h" + "wx/msw/wince/smartphone.rc" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\resources.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\smartphone.rc + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\rcdefs.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\app.h + "wx/event.h" + "wx/eventfilter.h" + "wx/build.h" + "wx/cmdargs.h" + "wx/init.h" + "wx/intl.h" + "wx/log.h" + "wx/unix/app.h" + "wx/msw/app.h" + "wx/motif/app.h" + "wx/dfb/app.h" + "wx/gtk/app.h" + "wx/gtk1/app.h" + "wx/x11/app.h" + "wx/osx/app.h" + "wx/cocoa/app.h" + "wx/os2/app.h" + "wx/univ/theme.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\event.h + "wx/defs.h" + "wx/cpp.h" + "wx/object.h" + "wx/clntdata.h" + "wx/gdicmn.h" + "wx/cursor.h" + "wx/mousestate.h" + "wx/dynarray.h" + "wx/thread.h" + "wx/tracker.h" + "wx/typeinfo.h" + "wx/any.h" + "wx/meta/convertible.h" + "wx/meta/removeref.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\defs.h + "wx/platform.h" + "wx/version.h" + "wx/dlimpexp.h" + + "wx/debug.h" + + + "wx/windowid.h" + + "wx/msw/winundef.h" + "wx/features.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\platform.h + + + + "wx/osx/config_xcode.h" + "wx/android/config_android.h" + "wx/compiler.h" + "wx/setup.h" + "wx/msw/wince/libraries.h" + "wx/msw/libraries.h" + "wx/msw/gccpriv.h" + + + "wx/chkconf.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\config_xcode.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\android\config_android.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\compiler.h + +1699795883 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\lib\gcc_lib\mswu\wx\setup.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\libraries.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\libraries.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\gccpriv.h + <_mingw.h> + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\chkconf.h + "wx/msw/wince/chkconf.h" + "wx/msw/chkconf.h" + "wx/gtk/chkconf.h" + "wx/gtk/chkconf.h" + "wx/cocoa/chkconf.h" + "wx/osx/chkconf.h" + "wx/os2/chkconf.h" + "wx/dfb/chkconf.h" + "wx/motif/chkconf.h" + "wx/x11/chkconf.h" + "wx/android/chkconf.h" + "wx/unix/chkconf.h" + "wx/univ/chkconf.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\chkconf.h + "wx/osx/iphone/chkconf.h" + "wx/osx/carbon/chkconf.h" + "wx/osx/cocoa/chkconf.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\iphone\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\carbon\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\cocoa\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\android\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\unix\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\chkconf.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\version.h + "wx/cpp.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cpp.h + "wx/compiler.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dlimpexp.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\debug.h + + + "wx/chartype.h" + "wx/cpp.h" + "wx/dlimpexp.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\chartype.h + "wx/platform.h" + + + + + + + + + + + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\windowid.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\winundef.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\features.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\object.h + "wx/memory.h" + "wx/xti.h" + "wx/rtti.h" + "wx/xti2.h" + "wx/msw/msvcrt.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\memory.h + "wx/defs.h" + "wx/string.h" + "wx/msgout.h" + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\string.h + "wx/defs.h" + + + + + + + + + + + "wx/wxcrtbase.h" + "wx/strvararg.h" + "wx/buffer.h" + "wx/strconv.h" + "wx/stringimpl.h" + "wx/stringops.h" + "wx/unichar.h" + "wx/tls.h" + "wx/iosfwrap.h" + "wx/crt.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\wxcrtbase.h + "wx/chartype.h" + + + + + + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\strvararg.h + "wx/platform.h" + "wx/cpp.h" + "wx/chartype.h" + "wx/strconv.h" + "wx/buffer.h" + "wx/unichar.h" + + + + "wx/stringimpl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\strconv.h + "wx/defs.h" + "wx/chartype.h" + "wx/buffer.h" + "typeinfo.h" + + "wx/fontenc.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\buffer.h + "wx/chartype.h" + "wx/wxcrtbase.h" + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\typeinfo.h + "wx/defs.h" + + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\fontenc.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\unichar.h + "wx/defs.h" + "wx/chartype.h" + "wx/stringimpl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\stringimpl.h + "wx/defs.h" + "wx/chartype.h" + "wx/wxcrtbase.h" + + "wx/beforestd.h" + + "wx/afterstd.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\beforestd.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\afterstd.h + "wx/msw/winundef.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\stringops.h + "wx/chartype.h" + "wx/stringimpl.h" + "wx/unichar.h" + "wx/buffer.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\tls.h + "wx/defs.h" + "wx/msw/tls.h" + "wx/os2/tls.h" + "wx/unix/tls.h" + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\tls.h + "wx/msw/wrapwin.h" + "wx/thread.h" + "wx/vector.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\wrapwin.h + "wx/platform.h" + + + "wx/msw/winundef.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\thread.h + "wx/defs.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\vector.h + "wx/defs.h" + + + "wx/scopeguard.h" + "wx/meta/movable.h" + "wx/meta/if.h" + "wx/beforestd.h" + + "wx/afterstd.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\scopeguard.h + "wx/defs.h" + "wx/except.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\except.h + "wx/defs.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\meta\movable.h + "wx/meta/pod.h" + "wx/string.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\meta\pod.h + "wx/defs.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\meta\if.h + "wx/defs.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\tls.h + "wx/os2/private.h" + "wx/thread.h" + "wx/vector.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\private.h + + + + + + + + "wx/dlimpexp.h" + "wx/fontenc.h" + "wx/thread.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\unix\tls.h + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\iosfwrap.h + + + "wx/msw/winundef.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\crt.h + "wx/defs.h" + "wx/chartype.h" + "wx/wxcrt.h" + "wx/wxcrtvararg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\wxcrt.h + "wx/wxcrtbase.h" + "wx/string.h" + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\wxcrtvararg.h + "wx/wxcrt.h" + "wx/strvararg.h" + "wx/string.h" + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msgout.h + "wx/defs.h" + "wx/chartype.h" + "wx/strvararg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\xti.h + "wx/defs.h" + "wx/xtitypes.h" + "wx/xtihandler.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\xtitypes.h + "wx/defs.h" + "wx/string.h" + "wx/hashmap.h" + "wx/arrstr.h" + "wx/flags.h" + "wx/intl.h" + "wx/log.h" + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\hashmap.h + "wx/string.h" + "wx/wxcrt.h" + + + + + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\arrstr.h + "wx/defs.h" + "wx/string.h" + "wx/dynarray.h" + "wx/beforestd.h" + + "wx/afterstd.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dynarray.h + "wx/defs.h" + "wx/beforestd.h" + + + "wx/afterstd.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\flags.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\intl.h + "wx/defs.h" + "wx/string.h" + "wx/translation.h" + "wx/fontenc.h" + "wx/language.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\translation.h + "wx/defs.h" + "wx/string.h" + "wx/buffer.h" + "wx/language.h" + "wx/hashmap.h" + "wx/strconv.h" + "wx/scopedptr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\language.h + "wx/defs.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\scopedptr.h + "wx/defs.h" + "wx/checkeddelete.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\checkeddelete.h + "wx/cpp.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\log.h + "wx/defs.h" + "wx/cpp.h" + "wx/string.h" + "wx/strvararg.h" + "wx/arrstr.h" + + "wx/dynarray.h" + "wx/hashmap.h" + "wx/thread.h" + "wx/iosfwrap.h" + "wx/generic/logg.h" + "wx/cocoa/log.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\logg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\log.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\xtihandler.h + "wx/defs.h" + "wx/xti.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\rtti.h + "wx/memory.h" + "wx/flags.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\xti2.h + "wx/xtiprop.h" + "wx/xtictor.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\xtiprop.h + "wx/defs.h" + "wx/xti.h" + "wx/any.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\any.h + "wx/defs.h" + + "wx/string.h" + "wx/meta/if.h" + "wx/typeinfo.h" + "wx/list.h" + "wx/datetime.h" + "wx/variant.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\list.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/vector.h" + "wx/beforestd.h" + + + + "wx/afterstd.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\datetime.h + "wx/defs.h" + "wx/msw/wince/time.h" + + + "wx/longlong.h" + "wx/anystr.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\time.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\longlong.h + "wx/defs.h" + "wx/string.h" + + "wx/iosfwrap.h" + + "wx/strvararg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\anystr.h + "wx/string.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\variant.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/arrstr.h" + "wx/list.h" + "wx/cpp.h" + "wx/longlong.h" + "wx/datetime.h" + "wx/iosfwrap.h" + "wx/any.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\xtictor.h + "wx/defs.h" + "wx/xti.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\msvcrt.h + + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\clntdata.h + "wx/defs.h" + "wx/string.h" + "wx/hashmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gdicmn.h + "wx/defs.h" + "wx/list.h" + "wx/string.h" + "wx/fontenc.h" + "wx/hashmap.h" + "wx/math.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\math.h + "wx/defs.h" + + + + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cursor.h + "wx/defs.h" + "wx/msw/cursor.h" + "wx/motif/cursor.h" + "wx/gtk/cursor.h" + "wx/gtk1/cursor.h" + "wx/x11/cursor.h" + "wx/dfb/cursor.h" + "wx/osx/cursor.h" + "wx/cocoa/cursor.h" + "wx/os2/cursor.h" + "wx/utils.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\cursor.h + "wx/msw/gdiimage.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\gdiimage.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/list.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gdiobj.h + "wx/object.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\cursor.h + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\cursor.h + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\cursor.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/image.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\image.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdicmn.h" + "wx/hashmap.h" + "wx/arrstr.h" + "wx/stream.h" + "wx/variant.h" + "wx/imagbmp.h" + "wx/imagpng.h" + "wx/imaggif.h" + "wx/imagpcx.h" + "wx/imagjpeg.h" + "wx/imagtga.h" + "wx/imagtiff.h" + "wx/imagpnm.h" + "wx/imagxpm.h" + "wx/imagiff.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\stream.h + "wx/defs.h" + + "wx/object.h" + "wx/string.h" + "wx/filefn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\filefn.h + "wx/list.h" + "wx/arrstr.h" + "wx/msw/wince/time.h" + "wx/msw/private.h" + + + + + "wx/os2/private.h" + + + + + + + + + + + + + + + + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\private.h + "wx/msw/wrapwin.h" + "wx/msw/microwin.h" + "wx/log.h" + "wx/window.h" + "wx/gdicmn.h" + "wx/colour.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\microwin.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\window.h + "wx/event.h" + "wx/list.h" + "wx/cursor.h" + "wx/font.h" + "wx/colour.h" + "wx/region.h" + "wx/utils.h" + "wx/intl.h" + "wx/validate.h" + "wx/palette.h" + "wx/accel.h" + "wx/access.h" + "wx/msw/window.h" + "wx/motif/window.h" + "wx/gtk/window.h" + "wx/gtk1/window.h" + "wx/x11/window.h" + "wx/dfb/window.h" + "wx/osx/window.h" + "wx/cocoa/window.h" + "wx/os2/window.h" + "wx/univ/window.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\font.h + "wx/defs.h" + "wx/fontenc.h" + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/msw/font.h" + "wx/motif/font.h" + "wx/gtk/font.h" + "wx/gtk1/font.h" + "wx/x11/font.h" + "wx/dfb/font.h" + "wx/osx/font.h" + "wx/cocoa/font.h" + "wx/os2/font.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\font.h + "wx/gdicmn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\font.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\font.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\font.h + "wx/hash.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\hash.h + "wx/defs.h" + "wx/string.h" + "wx/object.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\font.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\font.h + "wx/dfb/dfbptr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\dfbptr.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\font.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\font.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\font.h + "wx/gdiobj.h" + "wx/os2/private.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\colour.h + "wx/defs.h" + "wx/gdiobj.h" + "wx/variant.h" + "wx/msw/colour.h" + "wx/motif/colour.h" + "wx/gtk/colour.h" + "wx/gtk1/colour.h" + "wx/generic/colour.h" + "wx/x11/colour.h" + "wx/osx/colour.h" + "wx/cocoa/colour.h" + "wx/os2/colour.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\colour.h + "wx/object.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\colour.h + "wx/object.h" + "wx/string.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\colour.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\colour.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdiobj.h" + "wx/palette.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\palette.h + "wx/defs.h" + "wx/object.h" + "wx/gdiobj.h" + "wx/msw/palette.h" + "wx/x11/palette.h" + "wx/generic/paletteg.h" + "wx/osx/palette.h" + "wx/os2/palette.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\palette.h + "wx/gdiobj.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\palette.h + "wx/list.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\paletteg.h + "wx/defs.h" + "wx/object.h" + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\palette.h + "wx/gdiobj.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\palette.h + "wx/gdiobj.h" + "wx/os2/private.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\colour.h + "wx/object.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\colour.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdiobj.h" + "wx/palette.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\colour.h + "wx/osx/core/colour.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\core\colour.h + "wx/object.h" + "wx/string.h" + "wx/osx/core/cfref.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\core\cfref.h + + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\colour.h + "wx/object.h" + "wx/string.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\colour.h + "wx/object.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\region.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/msw/region.h" + "wx/gtk/region.h" + "wx/gtk1/region.h" + "wx/x11/region.h" + "wx/dfb/region.h" + "wx/osx/region.h" + "wx/cocoa/region.h" + "wx/os2/region.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\region.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\region.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\region.h + "wx/list.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\region.h + "wx/list.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\region.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\region.h + "wx/osx/carbon/region.h" + "wx/generic/region.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\carbon\region.h + "wx/list.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\region.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\region.h + "wx/generic/region.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\region.h + "wx/list.h" + "wx/os2/private.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\utils.h + "wx/object.h" + "wx/list.h" + "wx/filefn.h" + "wx/hashmap.h" + "wx/versioninfo.h" + "wx/meta/implicitconversion.h" + "wx/gdicmn.h" + "wx/mousestate.h" + "wx/longlong.h" + "wx/platinfo.h" + + + + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\versioninfo.h + "wx/string.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\meta\implicitconversion.h + "wx/defs.h" + "wx/meta/if.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\mousestate.h + "wx/gdicmn.h" + "wx/kbdstate.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\kbdstate.h + "wx/defs.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\platinfo.h + "wx/string.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\validate.h + "wx/defs.h" + "wx/event.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\accel.h + "wx/defs.h" + "wx/object.h" + "wx/generic/accel.h" + "wx/msw/accel.h" + "wx/motif/accel.h" + "wx/gtk/accel.h" + "wx/gtk1/accel.h" + "wx/osx/accel.h" + "wx/generic/accel.h" + "wx/os2/accel.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\accel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\accel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\accel.h + "wx/object.h" + "wx/string.h" + "wx/event.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\accel.h + "wx/generic/accel.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\accel.h + "wx/generic/accel.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\accel.h + "wx/string.h" + "wx/event.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\accel.h + "wx/object.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\access.h + "wx/defs.h" + "wx/variant.h" + "wx/msw/ole/access.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\ole\access.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\window.h + "wx/settings.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\settings.h + "wx/colour.h" + "wx/font.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\window.h + "wx/region.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\window.h + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\window.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\window.h + "wx/region.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\window.h + "wx/dfb/dfbptr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\window.h + "wx/brush.h" + "wx/dc.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\brush.h + "wx/defs.h" + "wx/object.h" + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/msw/brush.h" + "wx/x11/brush.h" + "wx/gtk/brush.h" + "wx/gtk1/brush.h" + "wx/dfb/brush.h" + "wx/osx/brush.h" + "wx/cocoa/brush.h" + "wx/os2/brush.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\brush.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\brush.h + "wx/gdiobj.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\brush.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\brush.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdiobj.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\bitmap.h + "wx/string.h" + "wx/gdicmn.h" + "wx/colour.h" + "wx/image.h" + "wx/variant.h" + "wx/msw/bitmap.h" + "wx/x11/bitmap.h" + "wx/gtk/bitmap.h" + "wx/gtk1/bitmap.h" + "wx/x11/bitmap.h" + "wx/dfb/bitmap.h" + "wx/osx/bitmap.h" + "wx/cocoa/bitmap.h" + "wx/os2/bitmap.h" + "wx/generic/mask.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\bitmap.h + "wx/msw/gdiimage.h" + "wx/math.h" + "wx/palette.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\bitmap.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/palette.h" + "wx/gdiobj.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\bitmap.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\bitmap.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/palette.h" + "wx/gdiobj.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\bitmap.h + "wx/dfb/dfbptr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\bitmap.h + "wx/palette.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\bitmap.h + "wx/palette.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\bitmap.h + "wx/os2/private.h" + "wx/os2/gdiimage.h" + "wx/gdicmn.h" + "wx/palette.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\gdiimage.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/list.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\mask.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\brush.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdiobj.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\brush.h + "wx/gdicmn.h" + "wx/gdiobj.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\brush.h + "wx/gdicmn.h" + "wx/gdiobj.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\brush.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dc.h + "wx/object.h" + "wx/intl.h" + "wx/cursor.h" + "wx/font.h" + "wx/colour.h" + "wx/bitmap.h" + "wx/brush.h" + "wx/pen.h" + "wx/palette.h" + "wx/dynarray.h" + "wx/math.h" + "wx/image.h" + "wx/region.h" + "wx/affinematrix2d.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\pen.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/msw/pen.h" + "wx/x11/pen.h" + "wx/gtk/pen.h" + "wx/gtk1/pen.h" + "wx/dfb/pen.h" + "wx/osx/pen.h" + "wx/cocoa/pen.h" + "wx/os2/pen.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\pen.h + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\pen.h + "wx/gdicmn.h" + "wx/gdiobj.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\pen.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\pen.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\pen.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\pen.h + "wx/gdiobj.h" + "wx/colour.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\pen.h + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\pen.h + "wx/gdiobj.h" + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\affinematrix2d.h + "wx/defs.h" + "wx/affinematrix2dbase.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\affinematrix2dbase.h + "wx/defs.h" + "wx/geometry.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\geometry.h + "wx/defs.h" + "wx/utils.h" + "wx/gdicmn.h" + "wx/math.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\window.h + "wx/cocoa/NSView.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nsview.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\objcassociate.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\window.h + + "wx/hash.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\window.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\imagbmp.h + "wx/image.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\imagpng.h + "wx/defs.h" + "wx/image.h" + "wx/versioninfo.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\imaggif.h + "wx/image.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\imagpcx.h + "wx/image.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\imagjpeg.h + "wx/defs.h" + "wx/image.h" + "wx/versioninfo.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\imagtga.h + "wx/image.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\imagtiff.h + "wx/defs.h" + "wx/image.h" + "wx/versioninfo.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\imagpnm.h + "wx/image.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\imagxpm.h + "wx/image.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\imagiff.h + "wx/image.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\cursor.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/colour.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\cursor.h + "wx/gdiobj.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\cursor.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\cursor.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\cursor.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\tracker.h + "wx/defs.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\meta\convertible.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\meta\removeref.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\eventfilter.h + "wx/defs.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\build.h + "wx/version.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cmdargs.h + "wx/arrstr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\init.h + "wx/defs.h" + "wx/chartype.h" + "wx/msw/init.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\init.h + "wx/msw/wrapwin.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\unix\app.h + + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\app.h + "wx/event.h" + "wx/icon.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\icon.h + "wx/iconloc.h" + "wx/msw/icon.h" + "wx/motif/icon.h" + "wx/generic/icon.h" + "wx/generic/icon.h" + "wx/generic/icon.h" + "wx/generic/icon.h" + "wx/osx/icon.h" + "wx/generic/icon.h" + "wx/cocoa/icon.h" + "wx/os2/icon.h" + "wx/variant.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\iconloc.h + "wx/string.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\icon.h + "wx/msw/gdiimage.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\icon.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\icon.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\icon.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\icon.h + "wx/gdicmn.h" + "wx/gdiobj.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\icon.h + "wx/bitmap.h" + "wx/os2/gdiimage.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\app.h + "wx/event.h" + "wx/hashmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\app.h + "wx/dfb/dfbptr.h" + "wx/vidmode.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\vidmode.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\app.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\app.h + "wx/frame.h" + "wx/icon.h" + "wx/strconv.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\frame.h + "wx/toplevel.h" + "wx/statusbr.h" + "wx/univ/frame.h" + "wx/msw/frame.h" + "wx/gtk/frame.h" + "wx/gtk1/frame.h" + "wx/motif/frame.h" + "wx/osx/frame.h" + "wx/cocoa/frame.h" + "wx/os2/frame.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\toplevel.h + "wx/nonownedwnd.h" + "wx/iconbndl.h" + "wx/weakref.h" + "wx/msw/toplevel.h" + "wx/gtk/toplevel.h" + "wx/gtk1/toplevel.h" + "wx/x11/toplevel.h" + "wx/dfb/toplevel.h" + "wx/osx/toplevel.h" + "wx/cocoa/toplevel.h" + "wx/os2/toplevel.h" + "wx/motif/toplevel.h" + "wx/univ/toplevel.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\nonownedwnd.h + "wx/window.h" + "wx/dfb/nonownedwnd.h" + "wx/gtk/nonownedwnd.h" + "wx/osx/nonownedwnd.h" + "wx/msw/nonownedwnd.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\nonownedwnd.h + "wx/window.h" + "wx/dfb/dfbptr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\nonownedwnd.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\nonownedwnd.h + "wx/window.h" + "wx/graphics.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\graphics.h + "wx/defs.h" + "wx/geometry.h" + "wx/dynarray.h" + "wx/dc.h" + "wx/image.h" + "wx/vector.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\nonownedwnd.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\iconbndl.h + "wx/gdiobj.h" + "wx/gdicmn.h" + "wx/icon.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\weakref.h + "wx/tracker.h" + "wx/meta/convertible.h" + "wx/meta/int2type.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\meta\int2type.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\toplevel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\toplevel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\toplevel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\toplevel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dfb\toplevel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\toplevel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\toplevel.h + "wx/hashmap.h" + "wx/cocoa/NSWindow.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nswindow.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\toplevel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\toplevel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\toplevel.h + "wx/univ/inpcons.h" + "wx/univ/inphand.h" + "wx/icon.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\inpcons.h + "wx/object.h" + "wx/event.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\inphand.h + "wx/univ/inpcons.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\statusbr.h + "wx/defs.h" + "wx/control.h" + "wx/list.h" + "wx/dynarray.h" + "wx/univ/statusbr.h" + "wx/msw/statusbar.h" + "wx/generic/statusbr.h" + "wx/osx/statusbr.h" + "wx/generic/statusbr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\control.h + "wx/defs.h" + "wx/window.h" + "wx/univ/control.h" + "wx/msw/control.h" + "wx/motif/control.h" + "wx/gtk/control.h" + "wx/gtk1/control.h" + "wx/osx/control.h" + "wx/cocoa/control.h" + "wx/os2/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\control.h + "wx/univ/inphand.h" + "wx/univ/inpcons.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\control.h + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\control.h + "wx/window.h" + "wx/list.h" + "wx/validate.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\control.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\control.h + "wx/defs.h" + "wx/object.h" + "wx/list.h" + "wx/window.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\control.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\control.h + "wx/cocoa/NSControl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nscontrol.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\control.h + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\statusbr.h + "wx/univ/inpcons.h" + "wx/arrstr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\statusbar.h + "wx/vector.h" + "wx/tooltip.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\tooltip.h + "wx/defs.h" + "wx/msw/tooltip.h" + "wx/gtk/tooltip.h" + "wx/gtk1/tooltip.h" + "wx/osx/tooltip.h" + "wx/cocoa/tooltip.h" + "wx/os2/tooltip.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\tooltip.h + "wx/object.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\tooltip.h + "wx/string.h" + "wx/object.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\tooltip.h + "wx/defs.h" + "wx/string.h" + "wx/object.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\tooltip.h + "wx/string.h" + "wx/event.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\tooltip.h + "wx/object.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\tooltip.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\statusbr.h + "wx/defs.h" + "wx/pen.h" + "wx/arrstr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\statusbr.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\frame.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\frame.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\frame.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\frame.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\frame.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\frame.h + "wx/toolbar.h" + "wx/accel.h" + "wx/icon.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\toolbar.h + "wx/defs.h" + "wx/tbarbase.h" + "wx/univ/toolbar.h" + "wx/msw/toolbar.h" + "wx/msw/wince/tbarwce.h" + "wx/motif/toolbar.h" + "wx/gtk/toolbar.h" + "wx/gtk1/toolbar.h" + "wx/osx/toolbar.h" + "wx/cocoa/toolbar.h" + "wx/os2/toolbar.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\tbarbase.h + "wx/defs.h" + "wx/bitmap.h" + "wx/list.h" + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\toolbar.h + "wx/button.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\button.h + "wx/defs.h" + "wx/anybutton.h" + "wx/univ/button.h" + "wx/msw/button.h" + "wx/motif/button.h" + "wx/gtk/button.h" + "wx/gtk1/button.h" + "wx/osx/button.h" + "wx/cocoa/button.h" + "wx/os2/button.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\anybutton.h + "wx/defs.h" + "wx/bitmap.h" + "wx/control.h" + "wx/univ/anybutton.h" + "wx/msw/anybutton.h" + "wx/gtk/anybutton.h" + "wx/osx/anybutton.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\anybutton.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\anybutton.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\anybutton.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\anybutton.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\button.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\button.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\button.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\button.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\button.h + "wx/defs.h" + "wx/object.h" + "wx/list.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\button.h + "wx/control.h" + "wx/gdicmn.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\button.h + "wx/cocoa/NSButton.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nsbutton.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + "wx/cocoa/ObjcRef.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\objcref.h + "wx/osx/core/cfref.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\button.h + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\toolbar.h + "wx/dynarray.h" + "wx/imaglist.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\imaglist.h + "wx/defs.h" + "wx/generic/imaglist.h" + "wx/msw/imaglist.h" + "wx/osx/imaglist.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\imaglist.h + "wx/list.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\imaglist.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\imaglist.h + "wx/defs.h" + "wx/list.h" + "wx/icon.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\tbarwce.h + "wx/dynarray.h" + "wx/msw/toolbar.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\toolbar.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\toolbar.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\toolbar.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\toolbar.h + "wx/tbarbase.h" + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\toolbar.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\toolbar.h + "wx/timer.h" + "wx/tbarbase.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\timer.h + "wx/defs.h" + "wx/object.h" + "wx/longlong.h" + "wx/event.h" + "wx/stopwatch.h" + "wx/utils.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\stopwatch.h + "wx/defs.h" + "wx/longlong.h" + "wx/time.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\time.h + "wx/longlong.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\frame.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\frame.h + "wx/os2/wxrsc.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\wxrsc.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\app.h + "wx/gdicmn.h" + "wx/event.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\app.h + "wx/defs.h" + "wx/object.h" + "wx/gdicmn.h" + "wx/event.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\app.h + "wx/osx/core/cfref.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\app.h + + + + + + + + + "wx/event.h" + "wx/icon.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\theme.h + "wx/string.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\panel.h + "wx/window.h" + "wx/containr.h" + "wx/univ/panel.h" + "wx/msw/panel.h" + "wx/generic/panelg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\containr.h + "wx/defs.h" + "wx/event.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\panel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\panel.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\panelg.h + "wx/bitmap.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\sizer.h + "wx/defs.h" + "wx/window.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\slider.h + "wx/defs.h" + "wx/control.h" + "wx/univ/slider.h" + "wx/msw/slider.h" + "wx/motif/slider.h" + "wx/gtk/slider.h" + "wx/gtk1/slider.h" + "wx/osx/slider.h" + "wx/cocoa/slider.h" + "wx/os2/slider.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\slider.h + "wx/univ/scrthumb.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\scrthumb.h + "wx/timer.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\slider.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\slider.h + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\slider.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\slider.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\slider.h + "wx/control.h" + "wx/slider.h" + "wx/stattext.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\stattext.h + "wx/defs.h" + "wx/control.h" + "wx/univ/stattext.h" + "wx/msw/stattext.h" + "wx/motif/stattext.h" + "wx/gtk/stattext.h" + "wx/gtk1/stattext.h" + "wx/osx/stattext.h" + "wx/cocoa/stattext.h" + "wx/os2/stattext.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\stattext.h + "wx/generic/stattextg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\stattextg.h + "wx/stattext.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\stattext.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\stattext.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\stattext.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\stattext.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\stattext.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\stattext.h + "wx/cocoa/NSTextField.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nstextfield.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\stattext.h + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\slider.h + "wx/cocoa/NSSlider.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nsslider.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + "wx/cocoa/ObjcRef.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\slider.h + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\textctrl.h + "wx/defs.h" + "wx/control.h" + "wx/textentry.h" + "wx/dynarray.h" + "wx/gdicmn.h" + "wx/ioswrap.h" + "wx/x11/textctrl.h" + "wx/univ/textctrl.h" + "wx/msw/wince/textctrlce.h" + "wx/msw/textctrl.h" + "wx/motif/textctrl.h" + "wx/gtk/textctrl.h" + "wx/gtk1/textctrl.h" + "wx/osx/textctrl.h" + "wx/cocoa/textctrl.h" + "wx/os2/textctrl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\textentry.h + "wx/filefn.h" + "wx/gdicmn.h" + "wx/gtk/textentry.h" + "wx/osx/textentry.h" + "wx/msw/textentry.h" + "wx/motif/textentry.h" + "wx/os2/textentry.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\textentry.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\textentry.h + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\textentry.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\textentry.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\textentry.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\ioswrap.h + "wx/beforestd.h" + + + "wx/afterstd.h" + "wx/msw/winundef.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\x11\textctrl.h + "wx/univ/textctrl.h" + "wx/scrolwin.h" + "wx/arrstr.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\textctrl.h + "wx/scrolwin.h" + "wx/univ/inphand.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\scrolwin.h + "wx/panel.h" + "wx/gtk/scrolwin.h" + "wx/gtk1/scrolwin.h" + "wx/generic/scrolwin.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\scrolwin.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\scrolwin.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\scrolwin.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\wince\textctrlce.h + "wx/dynarray.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\textctrl.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\textctrl.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\textctrl.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\textctrl.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\textctrl.h + "wx/control.h" + "wx/textctrl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\textctrl.h + "wx/cocoa/NSTextField.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\textctrl.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\mediactrl.h + "wx/defs.h" + "wx/control.h" + "wx/uri.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\uri.h + "wx/defs.h" + "wx/object.h" + "wx/string.h" + "wx/arrstr.h" + +1699810453 source:h:\vidplay\vidplay\vidplaymain.cpp + "vidplayMain.h" + + + + + + + "wx/link.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msgdlg.h + "wx/defs.h" + "wx/dialog.h" + "wx/stockitem.h" + "wx/generic/msgdlgg.h" + "wx/cocoa/msgdlg.h" + "wx/msw/msgdlg.h" + "wx/motif/msgdlg.h" + "wx/gtk/msgdlg.h" + "wx/osx/msgdlg.h" + "wx/os2/msgdlg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\dialog.h + "wx/toplevel.h" + "wx/containr.h" + "wx/sharedptr.h" + "wx/univ/dialog.h" + "wx/msw/dialog.h" + "wx/motif/dialog.h" + "wx/gtk/dialog.h" + "wx/gtk1/dialog.h" + "wx/osx/dialog.h" + "wx/cocoa/dialog.h" + "wx/os2/dialog.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\sharedptr.h + "wx/defs.h" + "wx/atomic.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\atomic.h + "wx/defs.h" + "wx/msw/wrapwin.h" + "libkern/OSAtomic.h" + + "wx/thread.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\univ\dialog.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\dialog.h + "wx/panel.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\dialog.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\dialog.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\dialog.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\dialog.h + "wx/panel.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\dialog.h + "wx/defs.h" + "wx/panel.h" + "wx/cocoa/NSPanel.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\nspanel.h + "wx/hashmap.h" + "wx/cocoa/ObjcAssociate.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\dialog.h + "wx/panel.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\stockitem.h + "wx/defs.h" + "wx/chartype.h" + "wx/string.h" + "wx/accel.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\msgdlgg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\msgdlg.h + "wx/msgdlg.h" + "wx/generic/msgdlgg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\msgdlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\msgdlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\msgdlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\msgdlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\msgdlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\filedlg.h + "wx/defs.h" + "wx/dialog.h" + "wx/arrstr.h" + "wx/generic/filedlgg.h" + "wx/msw/filedlg.h" + "wx/motif/filedlg.h" + "wx/gtk/filedlg.h" + "wx/gtk1/filedlg.h" + "wx/osx/filedlg.h" + "wx/cocoa/filedlg.h" + "wx/os2/filedlg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\filedlgg.h + "wx/listctrl.h" + "wx/datetime.h" + "wx/filefn.h" + "wx/artprov.h" + "wx/filedlg.h" + "wx/generic/filectrlg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\listctrl.h + "wx/defs.h" + "wx/listbase.h" + "wx/msw/listctrl.h" + "wx/osx/listctrl.h" + "wx/generic/listctrl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\listbase.h + "wx/colour.h" + "wx/font.h" + "wx/gdicmn.h" + "wx/event.h" + "wx/control.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\listctrl.h + "wx/textctrl.h" + "wx/dynarray.h" + "wx/vector.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\listctrl.h + "wx/defs.h" + "wx/generic/listctrl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\listctrl.h + "wx/containr.h" + "wx/scrolwin.h" + "wx/textctrl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\artprov.h + "wx/string.h" + "wx/bitmap.h" + "wx/icon.h" + "wx/iconbndl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\generic\filectrlg.h + "wx/containr.h" + "wx/listctrl.h" + "wx/filectrl.h" + "wx/filename.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\filectrl.h + "wx/defs.h" + "wx/string.h" + "wx/event.h" + "wx/gtk/filectrl.h" + "wx/generic/filectrlg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\filectrl.h + "wx/control.h" + "wx/filectrl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\filename.h + "wx/arrstr.h" + "wx/filefn.h" + "wx/datetime.h" + "wx/intl.h" + "wx/longlong.h" + "wx/file.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\file.h + "wx/defs.h" + "wx/string.h" + "wx/filefn.h" + "wx/convauto.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\convauto.h + "wx/strconv.h" + "wx/fontenc.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\msw\filedlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\motif\filedlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk\filedlg.h + "wx/gtk/filectrl.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\gtk1\filedlg.h + "wx/generic/filedlgg.h" + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\osx\filedlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\cocoa\filedlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\os2\filedlg.h + +1587557368 h:\cblegacy_new\codeblocks\wxwidgets-3.0.5\include\wx\link.h + +1699795188 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\lib\gcc_lib\msw\wx\setup.h + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msgdlg.h + "wx/defs.h" + "wx/generic/msgdlgg.h" + "wx/generic/msgdlgg.h" + "wx/palmos/msgdlg.h" + "wx/msw/msgdlg.h" + "wx/motif/msgdlg.h" + "wx/gtk/msgdlg.h" + "wx/generic/msgdlgg.h" + "wx/generic/msgdlgg.h" + "wx/mac/msgdlg.h" + "wx/cocoa/msgdlg.h" + "wx/os2/msgdlg.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\msgdlgg.h + "wx/defs.h" + "wx/dialog.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\dialog.h + "wx/defs.h" + "wx/containr.h" + "wx/toplevel.h" + "wx/univ/dialog.h" + "wx/palmos/dialog.h" + "wx/msw/dialog.h" + "wx/motif/dialog.h" + "wx/gtk/dialog.h" + "wx/gtk1/dialog.h" + "wx/mac/dialog.h" + "wx/cocoa/dialog.h" + "wx/os2/dialog.h" + +1300793818 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\univ\dialog.h + +1300793814 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\dialog.h + "wx/panel.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\msgdlg.h + "wx/defs.h" + "wx/dialog.h" + +1300793743 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\settings.h + "wx/colour.h" + "wx/font.h" + +1300793741 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\filedlg.h + "wx/defs.h" + "wx/dialog.h" + "wx/arrstr.h" + "wx/generic/filedlgg.h" + "wx/msw/filedlg.h" + "wx/motif/filedlg.h" + "wx/gtk/filedlg.h" + "wx/generic/filedlgg.h" + "wx/gtk1/filedlg.h" + "wx/mac/filedlg.h" + "wx/cocoa/filedlg.h" + "wx/os2/filedlg.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\filedlgg.h + "wx/listctrl.h" + "wx/datetime.h" + "wx/filefn.h" + "wx/filedlg.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\listctrl.h + "wx/defs.h" + "wx/listbase.h" + "wx/msw/listctrl.h" + "wx/mac/carbon/listctrl.h" + "wx/generic/listctrl.h" + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\listbase.h + "wx/colour.h" + "wx/font.h" + "wx/gdicmn.h" + "wx/event.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\listctrl.h + "wx/textctrl.h" + +1300793756 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\generic\listctrl.h + "wx/textctrl.h" + +1300793815 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\msw\filedlg.h + +1300793742 h:\cblegacy_new\codeblocks\wxmsw-2.8.12\include\wx\link.h + diff --git a/Samples/vidplay/vidplay.layout b/Samples/vidplay/vidplay.layout new file mode 100644 index 0000000..4405dbe --- /dev/null +++ b/Samples/vidplay/vidplay.layout @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/Samples/vidplay/vidplayApp.cpp b/Samples/vidplay/vidplayApp.cpp new file mode 100644 index 0000000..ca4b2d8 --- /dev/null +++ b/Samples/vidplay/vidplayApp.cpp @@ -0,0 +1,33 @@ +/*************************************************************** + * Name: vidplayApp.cpp + * Purpose: Code for Application Class + * Author: () + * Created: 2023-11-12 + * Copyright: () + * License: + **************************************************************/ + +#include "vidplayApp.h" + +//(*AppHeaders +#include "vidplayMain.h" +#include +//*) + +IMPLEMENT_APP(vidplayApp); + +bool vidplayApp::OnInit() +{ + //(*AppInitialize + bool wxsOK = true; + wxInitAllImageHandlers(); + if ( wxsOK ) + { + vidplayFrame* Frame = new vidplayFrame(0); + Frame->Show(); + SetTopWindow(Frame); + } + //*) + return wxsOK; + +} diff --git a/Samples/vidplay/vidplayApp.h b/Samples/vidplay/vidplayApp.h new file mode 100644 index 0000000..b0cf394 --- /dev/null +++ b/Samples/vidplay/vidplayApp.h @@ -0,0 +1,21 @@ +/*************************************************************** + * Name: vidplayApp.h + * Purpose: Defines Application Class + * Author: () + * Created: 2023-11-12 + * Copyright: () + * License: + **************************************************************/ + +#ifndef VIDPLAYAPP_H +#define VIDPLAYAPP_H + +#include + +class vidplayApp : public wxApp +{ + public: + virtual bool OnInit(); +}; + +#endif // VIDPLAYAPP_H diff --git a/Samples/vidplay/vidplayMain.cpp b/Samples/vidplay/vidplayMain.cpp new file mode 100644 index 0000000..55a0726 --- /dev/null +++ b/Samples/vidplay/vidplayMain.cpp @@ -0,0 +1,361 @@ +/*************************************************************** + * Name: vidplayMain.cpp + * Purpose: Code for Application Frame + * Author: () + * Created: 2023-11-12 + * Copyright: () + * License: + ******************************************Œ********************/ + +#include "vidplayMain.h" +#include +//#include + +//(*InternalHeaders(vidplayFrame) +#include +#include +#include +//*) + +#include +#include + +// Load additional backend for newer wx versions +#if wxCHECK_VERSION(3, 0, 0) + #if defined(__WXMSW__) && !defined(WXUSINGDLL) + #include "wx/link.h" + wxFORCE_LINK_MODULE(wxmediabackend_am) + #endif // static wxMSW build +#endif + + +//helper functions +enum wxbuildinfoformat { + short_f, long_f }; + +wxString wxbuildinfo(wxbuildinfoformat format) +{ + wxString wxbuild(wxVERSION_STRING); + + if (format == long_f ) + { +#if defined(__WXMSW__) + wxbuild << _T("-Windows"); +#elif defined(__UNIX__) + wxbuild << _T("-Linux"); +#endif + +#if wxUSE_UNICODE + wxbuild << _T("-Unicode build"); +#else + wxbuild << _T("-ANSI build"); +#endif // wxUSE_UNICODE + } + + return wxbuild; +} + + +const long vidplayFrame::ID_MEDIACTRL1 = wxNewId(); + +//(*IdInit(vidplayFrame) +const long vidplayFrame::ID_PANEL2 = wxNewId(); +const long vidplayFrame::ID_BUTTON1 = wxNewId(); +const long vidplayFrame::ID_STATICTEXT1 = wxNewId(); +const long vidplayFrame::ID_TEXTCTRL1 = wxNewId(); +const long vidplayFrame::ID_BUTTON3 = wxNewId(); +const long vidplayFrame::ID_BUTTON2 = wxNewId(); +const long vidplayFrame::ID_PANEL1 = wxNewId(); +const long vidplayFrame::ID_SLIDER1 = wxNewId(); +const long vidplayFrame::ID_PANEL3 = wxNewId(); +const long vidplayFrame::ID_PANEL4 = wxNewId(); +const long vidplayFrame::ID_TIMER1 = wxNewId(); +const long vidplayFrame::ID_TIMER2 = wxNewId(); +//*) + + +BEGIN_EVENT_TABLE(vidplayFrame,wxFrame) + //(*EventTable(vidplayFrame) + //*) +END_EVENT_TABLE() + +wxString wxItoa(int number) +{ + +} + +vidplayFrame::vidplayFrame(wxWindow* parent,wxWindowID id) +{ + //(*Initialize(vidplayFrame) + wxBoxSizer* BoxSizer1; + wxBoxSizer* BoxSizer3; + wxBoxSizer* BoxSizer4; + wxBoxSizer* BoxSizer5; + wxBoxSizer* BoxSizer6; + wxBoxSizer* BoxSizer7; + wxBoxSizer* BoxSizer8; + + Create(parent, wxID_ANY, _("Video player"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE|wxFULL_REPAINT_ON_RESIZE, _T("wxID_ANY")); + SetMinSize(wxSize(-1,250)); + SetBackgroundColour(wxColour(0,0,0)); + // This code will set a smaller font if Win 3.11 is detected: + int majorVer; int minorVer; + wxGetOsVersion(&majorVer, &minorVer); + if (minorVer == 30 || majorVer == 30 || majorVer == 3) + { + wxFont thisFont(8,wxFONTFAMILY_DEFAULT,wxFONTSTYLE_NORMAL,wxFONTWEIGHT_NORMAL,false,wxEmptyString,wxFONTENCODING_DEFAULT); + SetFont(thisFont); + } + BoxSizer1 = new wxBoxSizer(wxHORIZONTAL); + BoxSizer3 = new wxBoxSizer(wxVERTICAL); + BoxSizer4 = new wxBoxSizer(wxHORIZONTAL); + BoxSizer5 = new wxBoxSizer(wxVERTICAL); + BoxSizer4->Add(BoxSizer5, 1, wxALL|wxEXPAND, 0); + Placeholder = new wxPanel(this, ID_PANEL2, wxDefaultPosition, wxSize(10,156), wxTAB_TRAVERSAL, _T("ID_PANEL2")); + Placeholder->SetMaxSize(wxSize(-1,-1)); + Placeholder->Hide(); + Placeholder->SetBackgroundColour(wxColour(0,0,0)); + BoxSizer4->Add(Placeholder, 0, wxALL, 0); + BoxSizer3->Add(BoxSizer4, 1, wxALL|wxEXPAND, 1); + BoxSizer6 = new wxBoxSizer(wxVERTICAL); + Panel1 = new wxPanel(this, ID_PANEL1, wxDefaultPosition, wxSize(406,77), wxTAB_TRAVERSAL, _T("ID_PANEL1")); + Panel1->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE)); + Button1 = new wxButton(Panel1, ID_BUTTON1, _("Play"), wxPoint(8,8), wxSize(72,32), 0, wxDefaultValidator, _T("ID_BUTTON1")); + StaticText1 = new wxStaticText(Panel1, ID_STATICTEXT1, _("Time"), wxPoint(8,48), wxSize(184,24), wxST_NO_AUTORESIZE, _T("ID_STATICTEXT1")); + TextCtrl1 = new wxTextCtrl(Panel1, ID_TEXTCTRL1, _("video.avi"), wxPoint(224,8), wxSize(173,32), wxBORDER_SIMPLE, wxDefaultValidator, _T("ID_TEXTCTRL1")); + Button3 = new wxButton(Panel1, ID_BUTTON3, _("Load"), wxPoint(160,8), wxSize(56,32), 0, wxDefaultValidator, _T("ID_BUTTON3")); + Button2 = new wxButton(Panel1, ID_BUTTON2, _("Pause"), wxPoint(88,8), wxSize(64,32), 0, wxDefaultValidator, _T("ID_BUTTON2")); + BoxSizer6->Add(Panel1, 0, wxEXPAND|wxFIXED_MINSIZE, 0); + BoxSizer3->Add(BoxSizer6, 0, wxALL|wxEXPAND, 0); + Panel2 = new wxPanel(this, ID_PANEL3, wxDefaultPosition, wxSize(362,24), wxTAB_TRAVERSAL, _T("ID_PANEL3")); + Panel2->SetMinSize(wxDLG_UNIT(this,wxSize(-1,16))); + Panel2->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW)); + BoxSizer7 = new wxBoxSizer(wxVERTICAL); + Slider1 = new wxSlider(Panel2, ID_SLIDER1, 0, 0, 200, wxDefaultPosition, wxDLG_UNIT(Panel2,wxSize(-1,10)), wxSL_BOTH|wxBORDER_SIMPLE, wxDefaultValidator, _T("ID_SLIDER1")); + BoxSizer7->Add(Slider1, 1, wxEXPAND, 0); + Panel2->SetSizer(BoxSizer7); + BoxSizer3->Add(Panel2, 0, wxALL|wxEXPAND, 0); + BoxSizer8 = new wxBoxSizer(wxVERTICAL); + Panel3 = new wxPanel(this, ID_PANEL4, wxDefaultPosition, wxSize(362,16), wxTAB_TRAVERSAL, _T("ID_PANEL4")); + Panel3->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE)); + BoxSizer8->Add(Panel3, 0, wxALL|wxEXPAND, 0); + BoxSizer3->Add(BoxSizer8, 0, wxALL|wxEXPAND, 0); + BoxSizer1->Add(BoxSizer3, 2, wxALL|wxEXPAND, 0); + SetSizer(BoxSizer1); + Timer1.SetOwner(this, ID_TIMER1); + Timer1.Start(66, false); + Timer2.SetOwner(this, ID_TIMER2); + Fit(); + + Connect(ID_BUTTON1,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&vidplayFrame::OnButton1Click); + Connect(ID_BUTTON3,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&vidplayFrame::OnButton3Click); + Connect(ID_BUTTON2,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&vidplayFrame::OnButton2Click); + Connect(ID_SLIDER1,wxEVT_COMMAND_SLIDER_UPDATED,(wxObjectEventFunction)&vidplayFrame::OnSlider1CmdSliderUpdated); + Connect(ID_TIMER1,wxEVT_TIMER,(wxObjectEventFunction)&vidplayFrame::OnTimer1Trigger); + Connect(ID_TIMER2,wxEVT_TIMER,(wxObjectEventFunction)&vidplayFrame::OnTimer2Trigger); + Connect(wxEVT_SIZE,(wxObjectEventFunction)&vidplayFrame::OnResize); + //*) + + + // Create a media player control and load media backend. + // Note: it uses wxMEDIABACKEND_MCI, which is considered to be obsolete, + // but that's the only thing that also works under Win 3.11 + + // wxMEDIABACKEND_MCI currently will work only with wx 2.8 + + m_mediactrl = new wxMediaCtrl(); + + wxString mediaBackend = wxMEDIABACKEND_MCI; + + // Use direct show backend on newer wx versions, because MCI wouldn't work + #if wxCHECK_VERSION(3, 0, 0) + mediaBackend = wxMEDIABACKEND_DIRECTSHOW; + #endif // wxCHECK_VERSION + + bool bOK = m_mediactrl->Create(this, ID_MEDIACTRL1, wxEmptyString, wxDefaultPosition, wxSize(320,240), NULL, mediaBackend ); + + Connect(ID_MEDIACTRL1, wxEVT_MEDIA_LOADED, wxMediaEventHandler(vidplayFrame::OnMediaLoaded)); + + VideoSizer = BoxSizer5; + + VideoSizer->Add(m_mediactrl, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND|wxSHAPED, 0); + + if (m_mediactrl) m_mediactrl->Load(TextCtrl1->GetValue()); + + if (!bOK) wxMessageBox("Could not load media backend"); + + +} + +vidplayFrame::~vidplayFrame() +{ + //(*Destroy(vidplayFrame) + //*) +} + +void vidplayFrame::OnMediaLoaded(wxMediaEvent& WXUNUSED(evt)) +{ + // This will determine the proper size + wxSize vidsize = m_mediactrl->GetBestSize(); + wxString sizeStr; + + sizeStr << vidsize.GetWidth(); + + VideoSizer->GetItem(m_mediactrl)->SetRatio(vidsize.GetWidth(), vidsize.GetHeight()); +} + + +void vidplayFrame::OnQuit(wxCommandEvent& event) +{ + Close(); +} + +void vidplayFrame::OnAbout(wxCommandEvent& event) +{ + wxString msg = wxbuildinfo(long_f); + wxMessageBox(msg, _("Welcome to...")); +} + +void vidplayFrame::OnButton1Click(wxCommandEvent& event) +{ + m_mediactrl->Play(); +} + +void vidplayFrame::OnSlider1CmdSliderUpdated(wxScrollEvent& event) +{ + if (m_mediactrl) + { + long newOffset = 0; + long maxVal = Slider1->GetMax(); + long mediaLength = m_mediactrl->Length(); + long sliderVal = Slider1->GetValue(); + if (sliderVal > 0) + { + newOffset = (mediaLength) * (float(sliderVal)/maxVal); + } + else newOffset = 0; + + m_mediactrl->Seek(newOffset); + + wxString progressStr; + progressStr << newOffset; + } +} + +void vidplayFrame::OnButton2Click(wxCommandEvent& event) +{ + if (m_mediactrl) m_mediactrl->Pause(); +} + +void vidplayFrame::OnTimer1Trigger(wxTimerEvent& event) +{ + if (m_mediactrl) + { + long maxVal = Slider1->GetMax(); + long mediaPos = m_mediactrl->Tell(); + long mediaLength = m_mediactrl->Length(); + + if (mediaLength > 0 && (m_mediactrl->GetState() == wxMEDIASTATE_PLAYING) ) + { + int newSliderVal = (float(mediaPos)/mediaLength)*maxVal; + Slider1->SetValue(newSliderVal); + } + + int minutes = (mediaPos/1000)/60; + int hours = minutes/60; + int seconds = (mediaPos/1000); + int milliseconds = mediaPos - (seconds*1000); + + wxString durationString = wxString::Format(("%02d:%02d:%02d,%02d"),hours,minutes,seconds,milliseconds); + + StaticText1->SetLabel(durationString); + } +} + +void vidplayFrame::OnResize(wxSizeEvent& event) +{ + // This will check one time after 100 milliseconds if the player window is correct size + // May look like a hack, but works rather well + Timer2.Start(100, true); + + // Skip means process the rest of events normally + event.Skip(); +} + +void vidplayFrame::OnTimer2Trigger(wxTimerEvent& event) +{ + if (m_mediactrl) + { + VideoSizer->Fit(m_mediactrl); + Layout(); + } +} + +void vidplayFrame::OnButton3Click(wxCommandEvent& event) +{ + + // This button is used to open a file browser + // and load a media file. This is one of the trickier + // examples when we want to have Win 3.11 compatibility. + + // This code will check if Win 3.11 is running: + int majorVer; int minorVer; + wxGetOsVersion(&majorVer, &minorVer); + if (minorVer == 30 || majorVer == 30 || majorVer == 3) + { + // Would not compile in unicode + #ifndef wxUSE_UNICODE + // The following code is only for Win 3.11, + // it invokes legacy file browser + typedef BOOL WINAPI (*GetOpenFileName_f)( LPOPENFILENAME ofn ); + GetOpenFileName_f func_GetOpenFileName; + + static char achFileName[128]; + static char szAppFilter[]="Media files\0*.avi;*.mpg;*.mp4;*.ts\0"; + OPENFILENAME ofn; + + HWND hwnd = (HWND)this->GetHWND(); + + ofn.lStructSize = sizeof(OPENFILENAME); + ofn.hwndOwner = hwnd; + ofn.hInstance = NULL; + ofn.lpstrFilter = szAppFilter; + ofn.lpstrCustomFilter = NULL; + ofn.nMaxCustFilter = 0; + ofn.nFilterIndex = 0; + ofn.lpstrFile = achFileName; + ofn.nMaxFile = sizeof(achFileName); + ofn.lpstrFileTitle = NULL; + ofn.nMaxFileTitle = 0; + ofn.lpstrInitialDir = NULL; + ofn.lpstrTitle = NULL; + ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY; + ofn.nFileOffset = 0; + ofn.nFileExtension = 0; + ofn.lpstrDefExt = NULL; + ofn.lCustData = 0; + ofn.lpfnHook = NULL; + ofn.lpTemplateName = NULL; + + if(GetOpenFileNameA(&ofn)) + { + TextCtrl1->SetValue( ofn.lpstrFile ); + } + if (m_mediactrl) m_mediactrl->Load(TextCtrl1->GetValue()); + #endif // wxUSE_UNICODE + } + + else // if Win 3.11 is NOT detected, then it is really easy: + { + // This will work if we are using Win 95 or anything newer + wxFileDialog* FileDialog1 = new wxFileDialog(this, _("Select file"), + wxEmptyString, wxEmptyString, wxFileSelectorDefaultWildcardStr, + wxFD_DEFAULT_STYLE, wxDefaultPosition, wxDefaultSize, _T("wxFileDialog")); + + bool dialog = FileDialog1->ShowModal(); + if (dialog) TextCtrl1->SetValue(FileDialog1->GetFilename()); + if (m_mediactrl) m_mediactrl->Load(TextCtrl1->GetValue()); + + FileDialog1->Destroy(); + } +} diff --git a/Samples/vidplay/vidplayMain.h b/Samples/vidplay/vidplayMain.h new file mode 100644 index 0000000..55c24fc --- /dev/null +++ b/Samples/vidplay/vidplayMain.h @@ -0,0 +1,88 @@ +/*************************************************************** + * Name: vidplayMain.h + * Purpose: Defines Application Frame + * Author: () + * Created: 2023-11-12 + * Copyright: () + * License: + **************************************************************/ + +#ifndef VIDPLAYMAIN_H +#define VIDPLAYMAIN_H + +//(*Headers(vidplayFrame) +#include +#include +#include +#include +#include +#include +#include +#include +//*) + +#include + +class vidplayFrame: public wxFrame +{ + public: + + vidplayFrame(wxWindow* parent,wxWindowID id = -1); + virtual ~vidplayFrame(); + + private: + + //(*Handlers(vidplayFrame) + void OnQuit(wxCommandEvent& event); + void OnAbout(wxCommandEvent& event); + void OnButton1Click(wxCommandEvent& event); + void OnSlider1CmdSliderUpdated(wxScrollEvent& event); + void OnButton2Click(wxCommandEvent& event); + void OnTimer1Trigger(wxTimerEvent& event); + void OnResize(wxSizeEvent& event); + void OnTimer2Trigger(wxTimerEvent& event); + void OnButton3Click(wxCommandEvent& event); + //*) + + //(*Identifiers(vidplayFrame) + static const long ID_PANEL2; + static const long ID_BUTTON1; + static const long ID_STATICTEXT1; + static const long ID_TEXTCTRL1; + static const long ID_BUTTON3; + static const long ID_BUTTON2; + static const long ID_PANEL1; + static const long ID_SLIDER1; + static const long ID_PANEL3; + static const long ID_PANEL4; + static const long ID_TIMER1; + static const long ID_TIMER2; + //*) + + //(*Declarations(vidplayFrame) + wxButton* Button1; + wxButton* Button2; + wxButton* Button3; + wxPanel* Panel1; + wxPanel* Panel2; + wxPanel* Panel3; + wxPanel* Placeholder; + wxSlider* Slider1; + wxStaticText* StaticText1; + wxTextCtrl* TextCtrl1; + wxTimer Timer1; + wxTimer Timer2; + //*) + + + static const long ID_MEDIACTRL1; + wxMediaCtrl* m_mediactrl; + + void OnMediaLoaded(wxMediaEvent& event); + + wxSizer * VideoSizer; + + DECLARE_EVENT_TABLE() +}; + +#endif // VIDPLAYMAIN_H diff --git a/Samples/vidplay/wxsmith/vidplayframe.wxs b/Samples/vidplay/wxsmith/vidplayframe.wxs new file mode 100644 index 0000000..7ca54d5 --- /dev/null +++ b/Samples/vidplay/wxsmith/vidplayframe.wxs @@ -0,0 +1,129 @@ + + + + Video player + #000000 + -1,250 + // This code will set a smaller font if Win 3.11 is detected: int majorVer; int minorVer; wxGetOsVersion(&majorVer, &minorVer); if (minorVer == 30 || majorVer == 30 || majorVer == 3) { wxFont thisFont(8,wxFONTFAMILY__DEFAULT,wxFONTSTYLE__NORMAL,wxFONTWEIGHT__NORMAL,false,wxEmptyString,wxFONTENCODING__DEFAULT); SetFont(thisFont); } + 0 + + + + + + wxVERTICAL + + + + + wxVERTICAL + + wxALL|wxEXPAND + + + + + 10,156 + 1 + #000000 + -1,-1 + + wxALL + + + wxALL|wxEXPAND + 1 + + + + + wxVERTICAL + + + 406,77 + wxSYS_COLOUR_BTNFACE + + + 8,8 + 72,32 + + + + + 8,48 + 184,24 + + + + video.avi + 224,8 + 173,32 + + + + + 160,8 + 56,32 + + + + + 88,8 + 64,32 + + + + wxEXPAND|wxFIXED_MINSIZE + + + wxALL|wxEXPAND + + + + 362,24 + wxSYS_COLOUR_BTNSHADOW + -1,16d + + wxVERTICAL + + + 200 + -1,10d + + + + wxEXPAND + + + + + wxALL|wxEXPAND + + + + wxVERTICAL + + + 362,16 + wxSYS_COLOUR_BTNFACE + + wxALL|wxEXPAND + + + wxALL|wxEXPAND + + + wxALL|wxEXPAND + + + + + 66 + + + + 1 + + + + diff --git a/SetupCodeBlocks_AllInOne.bat b/SetupCodeBlocks_AllInOne.bat new file mode 100644 index 0000000..b20e45d --- /dev/null +++ b/SetupCodeBlocks_AllInOne.bat @@ -0,0 +1,206 @@ +@echo off +echo CB4LSD+ : CodeBlocks for Legacy Software Development (+ modern) installer bundle +echo This scripts automatically installs CodeBlocks IDE (https://www.codeblocks.org/) and various compilers +echo. +echo This package allows building software for Windows 3.11 (Win32s), ANSI Windows 9x, +echo Windows 9x with Unicode (MSLU/Unicows), modern 64-bit Windows, MS-DOS +echo. +echo This script will download and prepare for use following software: +echo Code::Blocks 64-bit IDE wxWidgets 2.8.12, wxWidgets 3.0.5, wxWidgets 3.2.1 +echo Compilers: Borland BCC5.5 (free version), TDM-GCC 32bit, MinGW-W64, DJGPP, OpenWatcom +echo. +echo DOSBox-X will also be installed to allow executing and testing MS-DOS software. +echo Windows 3.11 and Windows 95 will also be installed and configured +echo to allow automatic execution IF YOU PROVIDE YOUR OWN installation files. +echo Only English Windows 95 OSR2 and English WfW 3.11 are supported now. +echo. +echo. +pause + + +SET ZPATH=%~dp0\installers\7-zip + +if not exist "%ZPATH%\7zr.exe" ( +mkdir .\installers\7-zip +echo Downloading 7-zip +powershell wget https://www.7-zip.org/a/7zr.exe -UseBasicParsing -OutFile "%~dp0\installers\7-zip\7zr.exe" +powershell wget https://www.7-zip.org/a/7z2201.exe -UseBasicParsing -OutFile "%~dp0\installers\7-zip\7z2201.exe" +"%~dp0\installers\7-zip\7zr.exe" x "%~dp0\installers\7-zip\7z2201.exe" -o"%~dp0\installers\7-zip" +) + +if not exist "%ZPATH%\7z.exe" ( +"%~dp0\installers\7-zip\7zr.exe" x "%~dp0\installers\7-zip\7z2201.exe" -o"%~dp0\installers\7-zip" +) + + +xcopy "%~dp0\installers\_install-*.bat" "%~dp0" + + + +REM CODE::BLOCKS INSTALLATION +REM ========================= +pushd "%~dp0" +if not exist "%~dp0\installers\CB_202*.<7z" ( +mkdir installers +echo Downloading Code::Blocks 2022.06.19 Win 64-bit +powershell Invoke-WebRequest https://master.dl.sourceforge.net/project/codeblocks/Binaries/Nightlies/2022/CB_20220619_rev12839_win64.7z -UserAgent "Wget" -OutFile '%~dp0\installers\CB_20220619_rev12839_win64.7z' +echo Downloading prerequisites +powershell Invoke-WebRequest https://kumisystems.dl.sourceforge.net/project/codeblocks/Binaries/Nightlies/Prerequisites/wxmsw31u_gcc_cb_wx315_2D_gcc810-mingw64.7z -UserAgent "Wget" -OutFile '%~dp0\installers\wxmsw31u_gcc_cb_wx315_2D_gcc810-mingw64.7z' +powershell Invoke-WebRequest https://altushost-swe.dl.sourceforge.net/project/codeblocks/Binaries/Nightlies/Prerequisites/Mingw64dlls8.1.0.7z -UserAgent "Wget" -OutFile '%~dp0\installers\Mingw64dlls8.1.0.7z' + +) + +if not exist .\CodeBlocks\ ( +echo. +echo Extracting Code::Blocks +REM powershell "Expand-Archive '%~dp0\installers\codeblocks-20.03-nosetup.zip' '%~dp0\CodeBlocks'" +"%ZPATH%\7z.exe" x "%~dp0\installers\CB_202*" -o"%~dp0\CodeBlocks" +"%ZPATH%\7z.exe" x "%~dp0\installers\wxmsw3*" -o"%~dp0\CodeBlocks" +"%ZPATH%\7z.exe" x "%~dp0\installers\mingw64dlls*" -o"%~dp0\CodeBlocks" +) + + +REM BCC5.5 INSTALLATION +call _install-bcc55.bat + +REM TDM-GCC 4.7.1 32-bit installation +call _install-tdmgcc32.bat + +REM MinGW-W64 8.1.0 64-bit installation +call _install-mingw64.bat + +REM DJGPP INSTALLATION +call _install-djgpp.bat + +REM OPENWATCOM INSTALLATION +call _install-openwatcom.bat + +REM WXWIDGETS 2.8.12 BUILD +if not exist "%~dp0\installers\wxMSW-2.8.12_prebuild.7z" ( +call _install-wxmsw28bcc.bat +call _install-wxmsw28tdm32.bat +) + +if exist "%~dp0\installers\wxMSW-2.8.12_prebuild.7z" ( +if not exist "%~dp0\CodeBlocks\wxMSW-2.8.12\lib\bcc_lib\wxmsw28.lib" ( +echo Unpacking pre-built wxWidgets 2.8.12 +"%ZPATH%\7z.exe" x "%~dp0\installers\wxMSW-2.8.12_prebuild.7z" -o"%~dp0\CodeBlocks" +) +) +REM =============================== + +REM WXWIDGETS 3.0.5 TDM-GCC32 BUILD +if not exist "%~dp0\installers\wxWidgets-3.0.5_prebuild.7z" ( +call _install-wxmsw305tdm32.bat +) + +if exist "%~dp0\installers\wxWidgets-3.0.5_prebuild.7z" ( +if not exist "%~dp0\CodeBlocks\wxWidgets-3.0.5\lib\gcc_lib\libwxmsw30u.a" ( +echo Unpacking pre-built wxWidgets 3.0.5 for TDM-GCC 32bit +"%ZPATH%\7z.exe" x "%~dp0\installers\wxWidgets-3.0.5_prebuild.7z" -o"%~dp0\CodeBlocks" +) +) +REM =============================== + +REM WXWIDGETS 3.2.1 MINGW-W64 BUILD +if not exist "%~dp0\installers\wxWidgets-3.2.1_mingw64-810_msw64_prebuild.7z" ( +call _install-wxmsw321mingw64.bat +) + +if exist "%~dp0\installers\wxWidgets-3.2.1_mingw64-810_msw64_prebuild.7z" ( +if not exist "%~dp0\CodeBlocks\wxWidgets-3.2.1\lib\gcc_lib\libwxmsw32u.a" ( +echo Unpacking pre-built wxWidgets 3.2.1 for MinGW-W64 8.1.0 +"%ZPATH%\7z.exe" x "%~dp0\installers\wxWidgets-3.2.1_mingw64-810_msw64_prebuild.7z" -o"%~dp0\CodeBlocks" +) +) +REM =============================== + + + + + +pushd "%~dp0" +echo Copying project templates +xcopy /E /Y ".\installers\wizard\*.*" "%~dp0\CodeBlocks\share\CodeBlocks\templates\wizard\*.*" + + +echo Copying DOSBOX +xcopy /E /Y ".\installers\dosbox\*.*" "%~dp0\CodeBlocks\dosbox\*.*" + +echo Copying DOSBOX-X +xcopy /E /Y ".\installers\dosboxx\*.*" "%~dp0\CodeBlocks\dosboxx\*.*" + +echo Copying DOSBOXW31 +xcopy /E /Y ".\installers\dosboxw31\*.*" "%~dp0\CodeBlocks\dosboxw31\*.*" + + +echo Copying DOSBOXW95 +xcopy /E /Y ".\installers\dosboxw95\*.*" "%~dp0\CodeBlocks\dosboxw95\*.*" + + +echo Copying utils +xcopy /E /Y ".\installers\utils\*.*" "%~dp0\CodeBlocks\utils\*.*" + + +echo. +echo Generating run script + + +echo @echo off > runCodeBlocks.bat +echo cd /D ""%%~dp0"" >> runCodeBlocks.bat +echo cd CodeBlocks >> runCodeBlocks.bat +echo cd BCC55 >> runCodeBlocks.bat +echo set PATH=%%PATH%%;%%CD%% >> runCodeBlocks.bat +echo cd.. >> runCodeBlocks.bat +echo cd CodeBlocks >> runCodeBlocks.bat +echo START """" ""CbLauncher.exe"" >> runCodeBlocks.bat + +echo. +echo Copying default config file +mkdir "%~dp0\CodeBlocks\AppData\codeblocks\" +copy "%~dp0\installers\default.conf" "%~dp0\CodeBlocks\AppData\codeblocks\default.conf" +echo. +echo. +echo Updating config file with local paths +pushd "%~dp0" +cd CodeBlocks +cd watcom +set WATCOMPATH=%CD% +pushd "%~dp0" +cd CodeBlocks +cd AppData +cd codeblocks +powershell "((Get-Content -path default.conf -Raw) -replace '\$\(APP-PATH\)\\watcom','%WATCOMPATH%') | Set-Content -Path default.conf" +pushd "%~dp0" +echo. +echo Unpacking samples +"%ZPATH%\7z.exe" x "%~dp0\installers\Samples.zip" -o"%~dp0" + + +pushd "%~dp0" + +del /Q _install-*.bat + +echo. +echo Installing DOSBOX and DOSBOX-X w/ Win3.11, Win95 + +pushd "%~dp0\CodeBlocks\dosboxx" +call dosboxx_install.bat + +pushd "%~dp0\CodeBlocks\dosboxw31" +call _WFW311AUTOINSTALLER_.bat + +pushd "%~dp0\CodeBlocks\dosboxw95" +call SetupW95DosboxX.bat + +pushd "%~dp0" + + +echo All done. +echo. +echo Run runCodeBlocks.bat file to start the IDE. +echo. +pause +ren SetupCodeBlocks_AllInOne.bat SetupCodeBlocks_AllInOne.bak + + diff --git a/installers/DEPENDENCIES.txt b/installers/DEPENDENCIES.txt new file mode 100644 index 0000000..05a468f --- /dev/null +++ b/installers/DEPENDENCIES.txt @@ -0,0 +1,35 @@ +These files should be included in release version. + +Installation script should be able to download necessary files +and build them even if they are not present, but this process takes quite a bit of time +and there may be some errors at the current stage. + +* 7-zip + +* CodeBlocks: +CB_20220619_rev12839_win64.7z + +* Dosbox-x: +dosbox-x-mingw-win64-20220901233004.zip + +* Compilers: +djgpp-mingw-gcc930-standalone.zip +open-watcom-c-win32-1.9.exe +x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z +tdm-gcc-4.7.1-2.exe + +* Additional files: +libunicows-1.1.1-mingw32.zip +Mingw64dlls8.1.0.7z +wxmsw31u_gcc_cb_wx315_2D_gcc810-mingw64.7z + +* Source code for wxWidgets: +wxMSW-2.8.12.zip +wxWidgets-3.0.5.zip +wxWidgets-3.2.1.7z + +* Pre-built wxWidgets: +wxMSW-2.8.12_BCC55_prebuild.7z +wxMSW-2.8.12_prebuild.7z +wxWidgets-3.0.5_prebuild.7z +wxWidgets-3.2.1_mingw64-810_msw64_prebuild.7z \ No newline at end of file diff --git a/installers/THIRD_PARTY_FILES.txt b/installers/THIRD_PARTY_FILES.txt new file mode 100644 index 0000000..5f80c0e --- /dev/null +++ b/installers/THIRD_PARTY_FILES.txt @@ -0,0 +1,27 @@ +* WfW 3.11 and Win 95 files: you need to provide those on your own +Installation disks of English Windows for Workgroups 3.11 (images 1-8) +Installation CD of English Windows 95 OSR2 (WIN95 subdirectory) + +These files need to be downloaded by the autoinstaller or manually: + +* Borland BCC5.5 compiler (freecommandLinetools.exe) +SHA256: 433B44741F07F2AD673EB936511D498C5A6B7F260F98C4D9A6DA70C41A56D855 + +* Files required for Win 3.11 installation: + +Win32S PW1118.exe +TCP32B tcp32b.exe +Video for Windows wv1160.exe +Windows Media Player MPSetup.exe +WingG 1.0 wing10.exe +S3 driver w3117004.zip + +* Files required for Win 95 installation: + +DirectX 7.0A DX7Aeng.exe 564de93dcc50691480332e2ccb5565908760b295faa70f8c68854f69dad87189 +DCOM95 dcom95.exe 6706f79435d75682b0ce69b144108b3c344cae9f7aee7490de47aa20b4f311d3 +Year 2000 patch w95y2k.exe d3c063f2b04311ddbffd8461aa47147d6307f26d2163bef2c715cd168657aa3f +Windows Media Player 6.4 mpfull.exe a39b2b9735cedd513fcb78f8634695d35073e9d7e865e536a0da6db38c7225e4 +Winsock 2 Update W95WS2setup.exe 48c82825328ef63bce1d471d505f0e243cae94b5b05c66cf2e51b75c6d4d4922 +3Dfx Voodoo Graphics driver vg-w9x-q3.exe afde9cfc18080ba4bd94972b783867a9c713e6df3643fef84db5da19414ceea8 +S3 Graphics driver w9521103.zip fb691c872cd7dcc00d7b9445af6d82777586e356e165d5db56f213fa81e96881 \ No newline at end of file diff --git a/installers/_install-bcc55.bat b/installers/_install-bcc55.bat new file mode 100644 index 0000000..383165c --- /dev/null +++ b/installers/_install-bcc55.bat @@ -0,0 +1,55 @@ +@echo off +REM BCC5.5 INSTALLATION +REM ========================= + +set PATH=%PATH%;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\ + +pushd "%~dp0" +if not exist "%~dp0\CodeBlocks\" mkdir CodeBlocks +cd CodeBlocks +if not exist "%~dp0\installers\freecommandLinetools.exe" ( +mkdir installers +echo Downloading BCC5.5 compiler from http://altd.embarcadero.com/download/bcppbuilder/freecommandLinetools.exe +powershell wget http://altd.embarcadero.com/download/bcppbuilder/freecommandLinetools.exe -UseBasicParsing -OutFile "%~dp0\installers\freecommandLinetools.exe" +) + + +echo Checking SHA256 of freecommandLinetools.exe (433B44741F07F2AD673EB936511D498C5A6B7F260F98C4D9A6DA70C41A56D855 expected) + +powershell "Get-FileHash '%~dp0\installers\freecommandLinetools.exe' -Algorithm SHA256 | %% { if($_.Hash -match '433B44741F07F2AD673EB936511D498C5A6B7F260F98C4D9A6DA70C41A56D855') {Echo 'SHA256 OK'} else{exit 1} }" + +if errorlevel 1 ( +echo. +echo Bad freecommandLinetools.exe checksum +echo Trying to download again from another sourcce +powershell wget http://web.archive.org/web/20220816023824if_/http://altd.embarcadero.com/download/bcppbuilder/freecommandLinetools.exe -UseBasicParsing -OutFile "%~dp0\installers\freecommandLinetools.exe" +) + +echo Checking SHA256 of freecommandLinetools.exe (433B44741F07F2AD673EB936511D498C5A6B7F260F98C4D9A6DA70C41A56D855 expected) + +powershell "Get-FileHash '%~dp0\installers\freecommandLinetools.exe' -Algorithm SHA256 | %% { if($_.Hash -match '433B44741F07F2AD673EB936511D498C5A6B7F260F98C4D9A6DA70C41A56D855') {Echo 'SHA256 OK'} else{exit 1} }" + +if errorlevel 1 ( +echo. +echo Bad freecommandLinetools.exe checksum +echo Download the file manually and place freecommandLinetools.exe in directory +echo then press any key to continue, or close the console window and exit +echo. +pause +) + +if not exist "%~dp0\CodeBlocks\BCC55\bin\bcc32.exe" ( +echo Unpacking BCC55 +"%ZPATH%\7z.exe" x "%~dp0\installers\freecommandLinetools.exe" -o"%~dp0\CodeBlocks\BCC55" +) + +echo Updating BCC55 default path + +cd /D "%~dp0" +cd CodeBlocks\share\CodeBlocks\compilers +powershell "((Get-Content -path compiler_bcc.xml -Raw) -replace 'C:\\Borland\\BCC55','\$(APPPATH)\\BCC55') | Set-Content -Path compiler_bcc.xml" + +REM add additional path for resource compiler +powershell "((Get-Content -path compiler_bcc.xml -Raw) -replace ' ','\include') | Set-Content -Path compiler_bcc.xml" + +pushd %~dp0 \ No newline at end of file diff --git a/installers/_install-djgpp.bat b/installers/_install-djgpp.bat new file mode 100644 index 0000000..506a30f --- /dev/null +++ b/installers/_install-djgpp.bat @@ -0,0 +1,35 @@ +@echo off +REM DJGPP INSTALLATION +REM ========================= + +set PATH=%PATH%;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\ + +pushd "%~dp0" +if not exist "%~dp0\installers\djgpp-mingw-gcc930-standalone.zip" ( +echo Downloading DJGPP +powershell wget https://github.com/andrewwutw/build-djgpp/releases/download/v3.0/djgpp-mingw-gcc930-standalone.zip -UseBasicParsing -OutFile '%~dp0\installers\djgpp-mingw-gcc930-standalone.zip' +) + +if not exist .\CodeBlocks\djgpp ( +echo. +mkdir "%~dp0\CodeBlocks" +echo Extracting DJGPP +REM powershell "Expand-Archive '%~dp0\installers\djgpp-mingw-gcc930-standalone.zip' '%~dp0\CodeBlocks'" +"%ZPATH%\7z.exe" x "%~dp0\installers\djgpp-mingw-gcc930-standalone.zip" -o"%~dp0\CodeBlocks" +) + +REM hardcode some defs to fix not working code completion +REM this is probably not a great thing to do, but is important from user experience perspective +cd "%~dp0\CodeBlocks\djgpp\lib\gcc\i586-pc-msdosdjgpp\9.3.0\include\c++\" + + +if exist "cstdio" ( +echo // Prepended hardcoded __STDC_VERSION__ to fix problems with CodeBlocks parser > cstdio.tmp +echo #ifndef __STDC_VERSION__ >> cstdio.tmp +echo #define __STDC_VERSION__ 199901L >> cstdio.tmp +echo #endif >> cstdio.tmp +type cstdio >> cstdio.tmp +del cstdio +ren cstdio.tmp cstdio +) +pushd "%~dp0" diff --git a/installers/_install-mingw64.bat b/installers/_install-mingw64.bat new file mode 100644 index 0000000..349769b --- /dev/null +++ b/installers/_install-mingw64.bat @@ -0,0 +1,16 @@ +@echo off +REM MinGW-W64 installation +REM ================================= + + +pushd "%~dp0" +mkdir CodeBlocks +if not exist "%~dp0\installers\x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z" ( +mkdir installers +echo Downloading MinGW-W64 8.1.0 compiler + +powershell Invoke-WebRequest 'https://altushost-swe.dl.sourceforge.net/project/mingw-w64/Toolchains targetting Win64/Personal Builds/mingw-builds/8.1.0/threads-posix/seh/x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z' -UserAgent "Wget" -OutFile "%~dp0\installers\x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z" +) + +echo Unpacking MinGW-W64 8.1.0 +"%ZPATH%\7z.exe" x "%~dp0\installers\x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z" -o"%~dp0\CodeBlocks" diff --git a/installers/_install-openwatcom.bat b/installers/_install-openwatcom.bat new file mode 100644 index 0000000..abefd29 --- /dev/null +++ b/installers/_install-openwatcom.bat @@ -0,0 +1,15 @@ +@echo off +REM OPENWATCOM INSTALLATION +REM ========================= + +pushd "%~dp0" +if not exist "%~dp0\installers\open-watcom-c-win32-1.9.exe" ( +echo Downloading OpenWatcom 1.9 +powershell wget https://github.com/open-watcom/open-watcom-1.9/releases/download/ow1.9/open-watcom-c-win32-1.9.exe -UseBasicParsing -OutFile '%~dp0\installers\open-watcom-c-win32-1.9.exe' +) + +if not exist .\CodeBlocks\watcom ( +echo. +echo Extracting OpenWatcom +"%ZPATH%\7z.exe" x "%~dp0\installers\open-watcom-c-win32-1.9.exe" -o"%~dp0\CodeBlocks\watcom" +) \ No newline at end of file diff --git a/installers/_install-tdmgcc32.bat b/installers/_install-tdmgcc32.bat new file mode 100644 index 0000000..4b3fca0 --- /dev/null +++ b/installers/_install-tdmgcc32.bat @@ -0,0 +1,63 @@ +@echo off +REM TDM-GCC 4.7.1 32-bit installation +REM ================================= + + +pushd "%~dp0" +mkdir CodeBlocks +if not exist "%~dp0\installers\tdm-gcc-4.7.1-2.exe" ( +mkdir installers +echo Downloading TDM-GCC 4.7.1 32-bit compiler + +REM powershell "$client = New-Object System.Net.WebClient; $client.DownloadFile('https://downloads.sourceforge.net/project/tdm-gcc/TDM-GCC Installer/Previous/1.1006.0/tdm-gcc-4.7.1-2.exe','%~dp0\installers\tdm-gcc-4.7.1-2.exe')" + +powershell Invoke-WebRequest 'https://master.dl.sourceforge.net/project/tdm-gcc/TDM-GCC Installer/Previous/1.1006.0/tdm-gcc-4.7.1-2.exe?viasf=1' -UserAgent "Wget" -OutFile '%~dp0\installers\tdm-gcc-4.7.1-2.exe' + +REM powershell "wget 'https://master.dl.sourceforge.net/project/tdm-gcc/TDM-GCC Installer/Previous/1.1006.0/tdm-gcc-4.7.1-2.exe?viasf=1' -UseBasicParsing -OutFile "%~dp0\installers\tdm-gcc-4.7.1-2.exe" +) + +echo Unpacking TDM-GCC installer +"%ZPATH%\7z.exe" x "%~dp0\installers\tdm-gcc-4.7.1-2.exe" -o"%~dp0\installers\tdm-gcc-4.7.1-2" + +cd "%~dp0\installers\tdm-gcc-4.7.1-2\$PLUGINSDIR" + +"%ZPATH%\7z.exe" x "*.lzma" -o".\tdmgcc32" +"%ZPATH%\7z.exe" x "*.gz" -o".\tdmgcc32" + +cd tdmgcc32 + +"%ZPATH%\7z.exe" x "*.tar" -o"%~dp0\CodeBlocks\tdmgcc32" -aos +del /Q *.tar + +pushd "%~dp0" + +cd installers +rmdir /S /Q "tdm-gcc-4.7.1-2" + +pushd "%~dp0" + +if not exist "%~dp0\installers\libunicows-1.1.1-mingw32.zip" ( +echo Downloading libunicows-1.1.1-mingw32.zip +powershell wget https://master.dl.sourceforge.net/project/libunicows/libunicows/1.1.1/libunicows-1.1.1-mingw32.zip?viasf=1 -UseBasicParsing -OutFile '%~dp0\installers\libunicows-1.1.1-mingw32.zip' +) + +if not exist "%~dp0\installers\libunicows-1.1.1-mingw32\libunicows.a" ( +echo Extracting libunicows-1.1.1-mingw32 +"%ZPATH%\7z.exe" x "%~dp0\installers\libunicows-1.1.1-mingw32.zip" -o"%~dp0\installers" +) + +copy "%~dp0\installers\libunicows-1.1.1-mingw32\libunicows.a" "%~dp0\CodeBlocks\tdmgcc32\lib\libunicows.a" +copy "%~dp0\installers\libunicows-1.1.1-mingw32\liblibunicows.a" "%~dp0\CodeBlocks\tdmgcc32\lib\liblibunicows.a" + + +pushd "%~dp0" +if not exist "%~dp0\installers\unicows.exe" ( +echo Downloading unicows redistributable +powershell wget http://web.archive.org/web/20051029063254if_/http://download.microsoft.com/download/b/7/5/b75eace3-00e2-4aa0-9a6f-0b6882c71642/unicows.exe -UseBasicParsing -OutFile '%~dp0\installers\unicows.exe' +) + +if not exist "%~dp0\CodeBlocks\redist\unicows\unicows.dll" ( +echo Extracting unicows.dll +mkdir "%~dp0\CodeBlocks\redist\unicows" +"%ZPATH%\7z.exe" x "%~dp0\installers\unicows.exe" -o"%~dp0\CodeBlocks\redist\unicows" +) diff --git a/installers/_install-wxmsw28bcc.bat b/installers/_install-wxmsw28bcc.bat new file mode 100644 index 0000000..874b95a --- /dev/null +++ b/installers/_install-wxmsw28bcc.bat @@ -0,0 +1,81 @@ +@echo off +REM WXWIDGETS 2.8.12 INSTALLATION +REM ============================= + +pushd "%~dp0" + +if not exist "%~dp0\installers\wxMSW-2.8.12.zip" ( +echo Downloading wxWidgets 2.8.12 +powershell wget https://github.com/wxWidgets/wxWidgets/releases/download/v2.8.12/wxMSW-2.8.12.zip -UseBasicParsing -OutFile '%~dp0\installers\wxMSW-2.8.12.zip' +) + +if not exist "%~dp0\CodeBlocks\wxMSW-2.8.12\" ( +echo. +mkdir "%~dp0\CodeBlocks" +echo Extracting wxWidgets 2.8.12 +REM powershell "Expand-Archive '%~dp0\installers\wxMSW-2.8.12.zip' '%~dp0\CodeBlocks'" +"%ZPATH%\7z.exe" x "%~dp0\installers\wxMSW-2.8.12.zip" -o"%~dp0\CodeBlocks" +) + +echo Applying patches for Win32s/Win3.11 compatibility +xcopy /Y /E "%~dp0\installers\patch_wx28_win32s\*.*" "%~dp0\CodeBlocks\wxMSW-2.8.12" + +SET BUILDTYPE=release +SET UNICODE=0 +call :BUILDWX + +SET BUILDTYPE=debug +SET UNICODE=0 +call :BUILDWX + +GOTO END + +:BUILDWX +echo. +echo Building wxWidgets 2.8.12 with BCC5.5 compiler +cd /D %~dp0 +cd CodeBlocks +cd BCC55 +cd Bin +echo Updating environmental variables +set PATH=%WINDIR%;%WINDIR%\System32;%CD% +pushd "%~dp0" +cd CodeBlocks + +echo. +echo wxWidgets 2.8.12 %BUILDTYPE% UNICODE=%UNICODE% WINVER=0x0400 + +echo Cleaning up + +cd .\wxMSW-2.8.12\build\msw +make SHELL=CMD.exe -f makefile.bcc -DWINVER=0x0400 SHARED=0 MONOLITHIC=1 UNICODE=%UNICODE% BUILD=%BUILDTYPE% clean + +echo Building +make SHELL=CMD.exe -f makefile.bcc -DWINVER=0x0400 SHARED=0 MONOLITHIC=1 UNICODE=%UNICODE% BUILD=%BUILDTYPE% + +echo Building done + +echo Prepending __WXMSW__ to setup.h to fix not working code completion in wx 2.8.12 +pushd "%~dp0" +if "%BUILDTYPE%"=="release" ( +if "%UNICODE%"=="0" cd CodeBlocks\wxMSW-2.8.12\lib\bcc_lib\msw\wx +if "%UNICODE%"=="1" cd CodeBlocks\wxMSW-2.8.12\lib\bcc_lib\mswu\wx +) +if "%BUILDTYPE%"=="debug" ( +if "%UNICODE%"=="0" cd CodeBlocks\wxMSW-2.8.12\lib\bcc_lib\mswd\wx +if "%UNICODE%"=="1" cd CodeBlocks\wxMSW-2.8.12\lib\bcc_lib\mswud\wx +) + +if exist "setup.h" ( +echo // Prepended __WXMSW__ to fix problems with CodeBlocks parser > setup0.tmp +echo #ifndef __WXMSW__ >> setup0.tmp +echo #define __WXMSW__ >> setup0.tmp +echo #endif >> setup0.tmp +type setup.h >> setup0.tmp +del setup.h +ren setup0.tmp setup.h +) +pushd "%~dp0" +goto :eof + +:END \ No newline at end of file diff --git a/installers/_install-wxmsw28tdm32.bat b/installers/_install-wxmsw28tdm32.bat new file mode 100644 index 0000000..b6e9e1a --- /dev/null +++ b/installers/_install-wxmsw28tdm32.bat @@ -0,0 +1,119 @@ +@echo on +REM WXWIDGETS 2.8.12 INSTALLATION +REM ============================= + +set PATH=%PATH%;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\ + +pushd "%~dp0" +if not exist "%~dp0\installers\wxMSW-2.8.12.zip" ( +echo Downloading wxWidgets 2.8.12 +powershell wget https://github.com/wxWidgets/wxWidgets/releases/download/v2.8.12/wxMSW-2.8.12.zip -UseBasicParsing -OutFile '%~dp0\installers\wxMSW-2.8.12.zip' +) + +if not exist "%~dp0\CodeBlocks\wxMSW-2.8.12\" ( +echo. +mkdir "%~dp0\CodeBlocks" +echo Extracting wxWidgets 2.8.12 +REM powershell "Expand-Archive '%~dp0\installers\wxMSW-2.8.12.zip' '%~dp0\CodeBlocks'" +"%ZPATH%\7z.exe" x "%~dp0\installers\wxMSW-2.8.12.zip" -o"%~dp0\CodeBlocks" +) + + +SET BUILDTYPE=release +SET UNICODE=1 +if not exist "%~dp0\CodeBlocks\wxMSW-2.8.12\lib\gcc_lib\mswu\wx\setup.h" ( +mkdir "%~dp0\CodeBlocks\wxMSW-2.8.12\lib\gcc_lib\mswu\wx" +copy "%~dp0\CodeBlocks\wxMSW-2.8.12\include\wx\msw\setup.h" "%~dp0\CodeBlocks\wxMSW-2.8.12\lib\gcc_lib\mswu\wx\setup.h" +) +call :BUILDWX + +SET BUILDTYPE=debug +SET UNICODE=1 +if not exist "%~dp0\CodeBlocks\wxMSW-2.8.12\lib\gcc_lib\mswud\wx\setup.h" ( +mkdir "%~dp0\CodeBlocks\wxMSW-2.8.12\lib\gcc_lib\mswud\wx" +copy "%~dp0\CodeBlocks\wxMSW-2.8.12\include\wx\msw\setup.h" "%~dp0\CodeBlocks\wxMSW-2.8.12\lib\gcc_lib\mswud\wx\setup.h" +) +call :BUILDWX + +SET BUILDTYPE=release +SET UNICODE=0 +if not exist "%~dp0\CodeBlocks\wxMSW-2.8.12\lib\gcc_lib\msw\wx\setup.h" ( +mkdir "%~dp0\CodeBlocks\wxMSW-2.8.12\lib\gcc_lib\msw\wx" +copy "%~dp0\CodeBlocks\wxMSW-2.8.12\include\wx\msw\setup.h" "%~dp0\CodeBlocks\wxMSW-2.8.12\lib\gcc_lib\msw\wx\setup.h" +) +call :BUILDWX + +SET BUILDTYPE=debug +SET UNICODE=0 +if not exist "%~dp0\CodeBlocks\wxMSW-2.8.12\lib\gcc_lib\mswd\wx\setup.h" ( +mkdir "%~dp0\CodeBlocks\wxMSW-2.8.12\lib\gcc_lib\mswd\wx" +copy "%~dp0\CodeBlocks\wxMSW-2.8.12\include\wx\msw\setup.h" "%~dp0\CodeBlocks\wxMSW-2.8.12\lib\gcc_lib\mswd\wx\setup.h" +) +call :BUILDWX + + +GOTO END + +:BUILDWX +echo ======================================== +echo ==Building %BUILDTYPE% UNICODE=%UNICODE% +echo ======================================== +pushd "%~dp0" +cd ".\CodeBlocks\tdmgcc32" +SET MINGWPATH=%CD% +pushd "%~dp0" + +cd ".\CodeBlocks\tdmgcc32\bin" +SET PATH=%PATH%;%WINDIR%;%WINDIR%\System32;%CD% + +pushd "%~dp0" +cd ".\CodeBlocks\tdmgcc32\libexec\gcc\mingw32\4.7.1" +SET PATH=%PATH%;%WINDIR%;%WINDIR%\System32;%CD% + +pushd "%~dp0" + +echo Cleaning up +cd ".\CodeBlocks\wxMSW-2.8.12\build\msw" +SET WXBUILDPATH=%CD% + +SET DEBUGFLAG=0 +if "%BUILDTYPE%"=="debug" SET DEBUGFLAG=1 + +@echo on +"%MINGWPATH%\bin\mingw32-make.exe" SHELL=CMD.exe -f makefile.gcc SHARED=0 DEBUG_FLAG=%DEBUGFLAG% MONOLITHIC=1 MSLU=%UNICODE% UNICODE=%UNICODE% BUILD=%BUILDTYPE% clean CXXFLAGS="-DWINVER=0x0400" + +@echo off +echo Building +"%MINGWPATH%\bin\mingw32-make.exe" SHELL=CMD.exe -f makefile.gcc SHARED=0 DEBUG_FLAG=%DEBUGFLAG% MONOLITHIC=1 MSLU=%UNICODE% UNICODE=%UNICODE% BUILD=%BUILDTYPE% CXXFLAGS="-DWINVER=0x0400" -j4 + +@echo off + +echo Building done + +echo Prepending __WXMSW__ to setup.h to fix not working code completion in wxWidgets-2.8.12 +pushd "%~dp0" + +if "%BUILDTYPE%"=="release" ( +if "%UNICODE%"=="0" cd CodeBlocks\wxMSW-2.8.12\lib\gcc_lib\msw\wx +if "%UNICODE%"=="1" cd CodeBlocks\wxMSW-2.8.12\lib\gcc_lib\mswu\wx +) +if "%BUILDTYPE%"=="debug" ( +if "%UNICODE%"=="0" cd CodeBlocks\wxMSW-2.8.12\lib\gcc_lib\mswd\wx +if "%UNICODE%"=="1" cd CodeBlocks\wxMSW-2.8.12\lib\gcc_lib\mswud\wx +) + +if exist "setup.h" ( +echo // Prepended __WXMSW__ to fix problems with CodeBlocks parser > setup0.tmp +echo #ifndef __WXMSW__ >> setup0.tmp +echo #define __WXMSW__ >> setup0.tmp +echo #endif >> setup0.tmp +type setup.h >> setup0.tmp +del setup.h +ren setup0.tmp setup.h +) +goto :eof + + +:END + +pushd "%~dp0" diff --git a/installers/_install-wxmsw305tdm32.bat b/installers/_install-wxmsw305tdm32.bat new file mode 100644 index 0000000..9703d55 --- /dev/null +++ b/installers/_install-wxmsw305tdm32.bat @@ -0,0 +1,119 @@ +@echo off +REM WXWIDGETS 3.0.5 INSTALLATION +REM ============================= + +set PATH=%PATH%;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\ + +pushd "%~dp0" +if not exist "%~dp0\installers\wxWidgets-3.0.5.zip" ( +echo Downloading wxWidgets-3.0.5.zip +powershell wget https://github.com/wxWidgets/wxWidgets/releases/download/v3.0.5/wxWidgets-3.0.5.zip -UseBasicParsing -OutFile '%~dp0\installers\wxWidgets-3.0.5.zip' +) + +if not exist "%~dp0\CodeBlocks\wxWidgets-3.0.5\" ( +echo. +mkdir "%~dp0\CodeBlocks" +echo Extracting wxWidgets-3.0.5 +REM powershell "Expand-Archive '%~dp0\installers\wxWidgets-3.0.5.zip' '%~dp0\CodeBlocks\wxWidgets-3.0.5'" +"%ZPATH%\7z.exe" x "%~dp0\installers\wxWidgets-3.0.5.zip" -o"%~dp0\CodeBlocks\wxWidgets-3.0.5" +) + +echo Applying patches for Win9x compatibility +xcopy /Y /E "%~dp0\installers\patch_wx305_9x\*.*" "%~dp0\CodeBlocks\wxWidgets-3.0.5" + + +SET BUILDTYPE=release +SET UNICODE=1 +if not exist "%~dp0\CodeBlocks\wxWidgets-3.0.5\lib\gcc_lib\mswu\wx\setup.h" ( +mkdir "%~dp0\CodeBlocks\wxWidgets-3.0.5\lib\gcc_lib\mswu\wx" +copy "%~dp0\CodeBlocks\wxWidgets-3.0.5\include\wx\msw\setup.h" "%~dp0\CodeBlocks\wxWidgets-3.0.5\lib\gcc_lib\mswu\wx\setup.h" +) +call :BUILDWX + +SET BUILDTYPE=debug +SET UNICODE=1 +if not exist "%~dp0\CodeBlocks\wxWidgets-3.0.5\lib\gcc_lib\mswud\wx\setup.h" ( +mkdir "%~dp0\CodeBlocks\wxWidgets-3.0.5\lib\gcc_lib\mswud\wx" +copy "%~dp0\CodeBlocks\wxWidgets-3.0.5\include\wx\msw\setup.h" "%~dp0\CodeBlocks\wxWidgets-3.0.5\lib\gcc_lib\mswud\wx\setup.h" +) +call :BUILDWX + +SET BUILDTYPE=release +SET UNICODE=0 +if not exist "%~dp0\CodeBlocks\wxWidgets-3.0.5\lib\gcc_lib\msw\wx\setup.h" ( +mkdir "%~dp0\CodeBlocks\wxWidgets-3.0.5\lib\gcc_lib\msw\wx" +copy "%~dp0\CodeBlocks\wxWidgets-3.0.5\include\wx\msw\setup.h" "%~dp0\CodeBlocks\wxWidgets-3.0.5\lib\gcc_lib\msw\wx\setup.h" +) +call :BUILDWX + +SET BUILDTYPE=debug +SET UNICODE=0 +if not exist "%~dp0\CodeBlocks\wxWidgets-3.0.5\lib\gcc_lib\mswd\wx\setup.h" ( +mkdir "%~dp0\CodeBlocks\wxWidgets-3.0.5\lib\gcc_lib\mswd\wx" +copy "%~dp0\CodeBlocks\wxWidgets-3.0.5\include\wx\msw\setup.h" "%~dp0\CodeBlocks\wxWidgets-3.0.5\lib\gcc_lib\mswd\wx\setup.h" +) +call :BUILDWX + + +GOTO END + +:BUILDWX +pushd "%~dp0" +cd ".\CodeBlocks\tdmgcc32" +SET MINGWPATH=%CD% +pushd "%~dp0" + +cd ".\CodeBlocks\tdmgcc32\bin" +SET PATH=%PATH%;%WINDIR%;%WINDIR%\System32;%CD% + +pushd "%~dp0" +cd ".\CodeBlocks\tdmgcc32\libexec\gcc\mingw32\4.7.1" +SET PATH=%PATH%;%WINDIR%;%WINDIR%\System32;%CD% + +pushd "%~dp0" + +echo Cleaning up +cd ".\CodeBlocks\wxWidgets-3.0.5\build\msw" +SET WXBUILDPATH=%CD% + +SET DEBUGFLAG=0 +if "%BUILDTYPE%"=="debug" SET DEBUGFLAG=1 + +@echo on +"%MINGWPATH%\bin\mingw32-make.exe" SHELL=CMD.exe -f makefile.gcc SHARED=0 DEBUG_FLAG=%DEBUGFLAG% MONOLITHIC=1 MSLU=%UNICODE% UNICODE=%UNICODE% BUILD=%BUILDTYPE% clean CXXFLAGS="-DWINVER=0x0400" + +@echo off +echo Building +"%MINGWPATH%\bin\mingw32-make.exe" SHELL=CMD.exe -f makefile.gcc SHARED=0 DEBUG_FLAG=%DEBUGFLAG% MONOLITHIC=1 MSLU=%UNICODE% UNICODE=%UNICODE% BUILD=%BUILDTYPE% CXXFLAGS="-DWINVER=0x0400" -j4 + +@echo off + +echo Building done + +echo Prepending __WXMSW__ to setup.h to fix not working code completion in wxWidgets-3.0.5 +pushd "%~dp0" + +if "%BUILDTYPE%"=="release" ( +if "%UNICODE%"=="0" cd CodeBlocks\wxWidgets-3.0.5\lib\gcc_lib\msw\wx +if "%UNICODE%"=="1" cd CodeBlocks\wxWidgets-3.0.5\lib\gcc_lib\mswu\wx +) +if "%BUILDTYPE%"=="debug" ( +if "%UNICODE%"=="0" cd CodeBlocks\wxWidgets-3.0.5\lib\gcc_lib\mswd\wx +if "%UNICODE%"=="1" cd CodeBlocks\wxWidgets-3.0.5\lib\gcc_lib\mswud\wx +) + +if exist "setup.h" ( +echo // Prepended __WXMSW__ to fix problems with CodeBlocks parser > setup0.tmp +echo #ifndef __WXMSW__ >> setup0.tmp +echo #define __WXMSW__ >> setup0.tmp +echo #endif >> setup0.tmp +type setup.h >> setup0.tmp +del setup.h +ren setup0.tmp setup.h +) +goto :eof + + +:END + +pushd "%~dp0" \ No newline at end of file diff --git a/installers/_install-wxmsw321mingw64.bat b/installers/_install-wxmsw321mingw64.bat new file mode 100644 index 0000000..12d6b5c --- /dev/null +++ b/installers/_install-wxmsw321mingw64.bat @@ -0,0 +1,88 @@ +@echo off +REM WXWIDGETS 3.2.1 INSTALLATION +REM ============================= + +pushd "%~dp0" +if not exist "%~dp0\installers\wxWidgets-3.2.1.7z" ( +echo Downloading wxWidgets-3.2.1.7z +powershell wget https://github.com/wxWidgets/wxWidgets/releases/download/v3.2.1/wxWidgets-3.2.1.7z -UseBasicParsing -OutFile '%~dp0\installers\wxWidgets-3.2.1.7z' +) + +if not exist "%~dp0\CodeBlocks\wxWidgets-3.2.1\" ( +echo. +mkdir "%~dp0\CodeBlocks" +echo Extracting wxWidgets-3.2.1 +"%ZPATH%\7z.exe" x "%~dp0\installers\wxWidgets-3.2.1.7z" -o"%~dp0\CodeBlocks\wxWidgets-3.2.1" +) + + +SET BUILDTYPE=release +SET UNICODE=1 +call :BUILDWX + +SET BUILDTYPE=debug +SET UNICODE=1 +call :BUILDWX + +GOTO END + +:BUILDWX +pushd "%~dp0" +cd ".\CodeBlocks\mingw64" +SET MINGWPATH=%CD% +pushd "%~dp0" + +cd ".\CodeBlocks\mingw64\bin" +SET PATH = %WINDIR%;%WINDIR%\System32;%CD% + +pushd "%~dp0" +cd ".\CodeBlocks\mingw64\libexec\gcc\x86_64-w64-mingw32\8.1.0" +SET PATH = %WINDIR%;%WINDIR%\System32;%CD% + +pushd "%~dp0" + +echo Cleaning up +cd ".\CodeBlocks\wxWidgets-3.2.1\build\msw" +SET WXBUILDPATH=%CD% + +SET DEBUGFLAG=0 +if "%BUILDTYPE%"=="debug" SET DEBUGFLAG=1 + +@echo on +mingw32-make SHELL=CMD.exe -f makefile.gcc SHARED=0 DEBUG_FLAG=%DEBUGFLAG% MONOLITHIC=1 UNICODE=%UNICODE% BUILD=%BUILDTYPE% CXXFLAGS="-march=x86-64" LDFLAGS="-m64" clean + +@echo off +echo Building +mingw32-make SHELL=CMD.exe -f makefile.gcc SHARED=0 DEBUG_FLAG=%DEBUGFLAG% MONOLITHIC=1 UNICODE=%UNICODE% BUILD=%BUILDTYPE% CXXFLAGS="-march=x86-64" LDFLAGS="-m64" + +@echo off + +echo Building done + +echo Prepending __WXMSW__ to setup.h because it might make code completion work better +pushd "%~dp0" + +if "%BUILDTYPE%"=="release" ( +if "%UNICODE%"=="0" cd CodeBlocks\wxWidgets-3.2.1\lib\gcc_lib\msw\wx +if "%UNICODE%"=="1" cd CodeBlocks\wxWidgets-3.2.1\lib\gcc_lib\mswu\wx +) +if "%BUILDTYPE%"=="debug" ( +if "%UNICODE%"=="0" cd CodeBlocks\wxWidgets-3.2.1\lib\gcc_lib\mswd\wx +if "%UNICODE%"=="1" cd CodeBlocks\wxWidgets-3.2.1\lib\gcc_lib\mswud\wx +) + +if exist "setup.h" ( +echo // Prepended __WXMSW__ to fix problems with CodeBlocks parser > setup0.tmp +echo #ifndef __WXMSW__ >> setup0.tmp +echo #define __WXMSW__ >> setup0.tmp +echo #endif >> setup0.tmp +type setup.h >> setup0.tmp +del setup.h +ren setup0.tmp setup.h +) +goto :eof + + +:END + +pushd "%~dp0" \ No newline at end of file diff --git a/installers/default.conf b/installers/default.conf new file mode 100644 index 0000000..fe86d19 --- /dev/null +++ b/installers/default.conf @@ -0,0 +1,635 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/installers/dosbox/dosbox.conf b/installers/dosbox/dosbox.conf new file mode 100644 index 0000000..dbd5b41 --- /dev/null +++ b/installers/dosbox/dosbox.conf @@ -0,0 +1,7 @@ +[sdl] +windowresolution=1080x600 +output=opengl +[cpu] +core=dynamic +[render] +scaler=normal2x forced \ No newline at end of file diff --git a/installers/dosboxw31/INSTALLERS/CFG/AUTOEXEC.BAT b/installers/dosboxw31/INSTALLERS/CFG/AUTOEXEC.BAT new file mode 100644 index 0000000..f3e8fbc --- /dev/null +++ b/installers/dosboxw31/INSTALLERS/CFG/AUTOEXEC.BAT @@ -0,0 +1,4 @@ +C:\WINDOWS\SMARTDRV.EXE +C:\WINDOWS\net start +PATH C:\WINDOWS; +SET TEMP=C:\WINDOWS\TEMP diff --git a/installers/dosboxw31/INSTALLERS/CFG/CONFIG.SYS b/installers/dosboxw31/INSTALLERS/CFG/CONFIG.SYS new file mode 100644 index 0000000..2b89390 --- /dev/null +++ b/installers/dosboxw31/INSTALLERS/CFG/CONFIG.SYS @@ -0,0 +1,7 @@ +FILES=30 +BUFFERS=30 +LASTDRIVE=Z +DEVICE=C:\WINDOWS\HIMEM.SYS +DEVICE=C:\WINDOWS\SMARTDRV.EXE /DOUBLE_BUFFER +DEVICE=C:\WINDOWS\IFSHLP.SYS +STACKS=9,256 diff --git a/installers/dosboxw31/INSTALLERS/CFG/WIN32APP.GRP b/installers/dosboxw31/INSTALLERS/CFG/WIN32APP.GRP new file mode 100644 index 0000000..851c7b7 Binary files /dev/null and b/installers/dosboxw31/INSTALLERS/CFG/WIN32APP.GRP differ diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/ACCESSOR.GRP b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/ACCESSOR.GRP new file mode 100644 index 0000000..7733e5e Binary files /dev/null and b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/ACCESSOR.GRP differ diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/CONTROL.INI b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/CONTROL.INI new file mode 100644 index 0000000..be43a29 --- /dev/null +++ b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/CONTROL.INI @@ -0,0 +1,94 @@ +[current] +color schemes=Dark Blue + +[color schemes] +Arizona=804000,FFFFFF,FFFFFF,0,FFFFFF,0,808040,C0C0C0,FFFFFF,4080FF,C0C0C0,0,C0C0C0,C0C0C0,808080,0,808080,808000,FFFFFF,0,FFFFFF +Black Leather Jacket=0,C0C0C0,FFFFFF,0,C0C0C0,0,800040,808080,FFFFFF,808080,808080,0,10E0E0E0,C0C0C0,808080,0,808080,0,FFFFFF,0,FFFFFF +Bordeaux=400080,C0C0C0,FFFFFF,0,FFFFFF,0,800080,C0C0C0,FFFFFF,FF0080,C0C0C0,0,C0C0C0,C0C0C0,808080,0,808080,800080,FFFFFF,0,FFFFFF +Cinnamon=404080,C0C0C0,FFFFFF,0,FFFFFF,0,80,C0C0C0,FFFFFF,80,C0C0C0,0,C0C0C0,C0C0C0,808080,0,808080,80,FFFFFF,0,FFFFFF +Designer=7C7C3F,C0C0C0,FFFFFF,0,FFFFFF,0,808000,C0C0C0,FFFFFF,C0C0C0,C0C0C0,0,C0C0C0,C0C0C0,808080,0,C0C0C0,808000,0,0,FFFFFF +Emerald City=404000,C0C0C0,FFFFFF,0,C0C0C0,0,408000,808040,FFFFFF,408000,808040,0,C0C0C0,C0C0C0,808080,0,808080,8000,FFFFFF,0,FFFFFF +Fluorescent=0,FFFFFF,FFFFFF,0,FF00,0,FF00FF,C0C0C0,0,FF80,C0C0C0,0,C0C0C0,C0C0C0,808080,0,808080,0,FFFFFF,0,FFFFFF +Hotdog Stand=FFFF,FFFF,FF,FFFFFF,FFFFFF,0,0,FF,FFFFFF,FF,FF,0,C0C0C0,C0C0C0,808080,0,808080,0,FFFFFF,FFFFFF,FFFFFF +LCD Default Screen Settings=808080,C0C0C0,C0C0C0,0,C0C0C0,0,800000,C0C0C0,FFFFFF,800000,C0C0C0,0,C0C0C0,C0C0C0,7F8080,0,808080,800000,FFFFFF,0,FFFFFF +LCD Reversed - Dark=0,80,80,FFFFFF,8080,0,8080,800000,0,8080,800000,0,8080,C0C0C0,7F8080,0,C0C0C0,800000,FFFFFF,828282,FFFFFF +LCD Reversed - Light=800000,FFFFFF,FFFFFF,0,FFFFFF,0,808040,FFFFFF,0,C0C0C0,C0C0C0,800000,C0C0C0,C0C0C0,7F8080,0,808040,800000,FFFFFF,0,FFFFFF +Mahogany=404040,C0C0C0,FFFFFF,0,FFFFFF,0,40,C0C0C0,FFFFFF,C0C0C0,C0C0C0,0,C0C0C0,C0C0C0,808080,0,C0C0C0,80,FFFFFF,0,FFFFFF +Monochrome=C0C0C0,FFFFFF,FFFFFF,0,FFFFFF,0,0,C0C0C0,FFFFFF,C0C0C0,C0C0C0,0,808080,C0C0C0,808080,0,808080,0,FFFFFF,0,FFFFFF +Ocean=808000,408000,FFFFFF,0,FFFFFF,0,804000,C0C0C0,FFFFFF,C0C0C0,C0C0C0,0,C0C0C0,C0C0C0,808080,0,0,808000,0,0,FFFFFF +Pastel=C0FF82,80FFFF,FFFFFF,0,FFFFFF,0,FFFF80,FFFFFF,0,C080FF,FFFFFF,808080,C0C0C0,C0C0C0,808080,0,C0C0C0,FFFF00,0,0,FFFFFF +Patchwork=9544BB,C1FBFA,FFFFFF,0,FFFFFF,0,FFFF80,FFFFFF,0,64B14E,FFFFFF,0,C0C0C0,C0C0C0,808080,0,808080,FFFF00,0,0,FFFFFF +Plasma Power Saver=0,FF0000,0,FFFFFF,FF00FF,0,800000,C0C0C0,0,80,FFFFFF,C0C0C0,FF0000,C0C0C0,808080,0,C0C0C0,FFFFFF,0,0,FFFFFF +Rugby=C0C0C0,80FFFF,FFFFFF,0,FFFFFF,0,800000,FFFFFF,FFFFFF,80,FFFFFF,0,C0C0C0,C0C0C0,808080,0,808080,800000,FFFFFF,0,FFFFFF +The Blues=804000,C0C0C0,FFFFFF,0,FFFFFF,0,800000,C0C0C0,FFFFFF,C0C0C0,C0C0C0,0,C0C0C0,C0C0C0,808080,0,C0C0C0,800000,FFFFFF,0,FFFFFF +Tweed=6A619E,C0C0C0,FFFFFF,0,FFFFFF,0,408080,C0C0C0,FFFFFF,404080,C0C0C0,0,10E0E0E0,C0C0C0,808080,0,C0C0C0,8080,0,0,FFFFFF +Valentine=C080FF,FFFFFF,FFFFFF,0,FFFFFF,0,8000FF,400080,FFFFFF,C080FF,C080FF,0,C0C0C0,C0C0C0,808080,0,808080,FF00FF,0,FFFFFF,FFFFFF +Wingtips=408080,C0C0C0,FFFFFF,0,FFFFFF,0,808080,FFFFFF,FFFFFF,4080,FFFFFF,0,808080,C0C0C0,808080,0,C0C0C0,808080,FFFFFF,0,FFFFFF +Dark Blue=800000,FFFFFF,FFFFFF,0,FFFFFF,0,800000,FFFFFF,FFFFFF,C0C0C0,C0C0C0,0,C0C0C0,C0C0C0,808080,0,C0C0C0,800000,FFFFFF,0,FFFFFF + +[Custom Colors] +ColorA=FFFFFF +ColorB=FFFFFF +ColorC=FFFFFF +ColorD=FFFFFF +ColorE=FFFFFF +ColorF=FFFFFF +ColorG=FFFFFF +ColorH=FFFFFF +ColorI=FFFFFF +ColorJ=FFFFFF +ColorK=FFFFFF +ColorL=FFFFFF +ColorM=FFFFFF +ColorN=FFFFFF +ColorO=FFFFFF +ColorP=FFFFFF + +[Patterns] +(None)=(None) +Boxes=127 65 65 65 65 65 127 0 +Paisley=2 7 7 2 32 80 80 32 +Weave=136 84 34 69 136 21 34 81 +Waffle=0 0 0 0 128 128 128 240 +Tulip=0 0 84 124 124 56 146 124 +Spinner=20 12 200 121 158 19 48 40 +Scottie=64 192 200 120 120 72 0 0 +Critters=0 80 114 32 0 5 39 2 +50% Gray=170 85 170 85 170 85 170 85 +Quilt=130 68 40 17 40 68 130 1 +Diamonds=32 80 136 80 32 0 0 0 +Thatches=248 116 34 71 143 23 34 113 +Pattern=224 128 142 136 234 10 14 0 + +[MMCPL] +NumApps=16 +X=22 +Y=22 +W=430 +H=240 + +[drivers.desc] +msacm.drv=Microsoft Sound Mapper V2.00 +msadpcm.acm=Microsoft ADPCM Codec V2.00 +imaadpcm.acm=Microsoft IMA ADPCM Codec V2.00 +mciwave.drv=[MCI] Sound +mciseq.drv=[MCI] MIDI Sequencer +mciavi.drv=[MCI] Microsoft Video for Windows +UDH.DLL=Universal Draw Handler +timer.drv=Timer +midimap.drv=MIDI Mapper +iccvid.drv=SuperMatch Cinepak Codec +msvidc.drv=Microsoft Video 1 Compressor +ir32.dll=Intel Indeo(TM) Video R3.2 +MSRLE.drv=Microsoft RLE Compressor +ir21_r.dll=Intel Indeo(TM) Video R2.1/Raw +sndblst2.drv=Creative Labs Sound Blaster 1.5 +msadlib.drv=Ad Lib + +[Userinstallable.drivers] +Wave=sndblst2.drv +MIDI1=msadlib.drv + +[related.desc] +Wave=msadlib.drv, +MIDI1= diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/DOSPRMPT.PIF b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/DOSPRMPT.PIF new file mode 100644 index 0000000..d9ad9ef Binary files /dev/null and b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/DOSPRMPT.PIF differ diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/ENTPACK.INI b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/ENTPACK.INI new file mode 100644 index 0000000..e69de29 diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/GAMES.GRP b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/GAMES.GRP new file mode 100644 index 0000000..0a1e617 Binary files /dev/null and b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/GAMES.GRP differ diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/INDEO.INI b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/INDEO.INI new file mode 100644 index 0000000..dde820e --- /dev/null +++ b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/INDEO.INI @@ -0,0 +1,2 @@ +[dcisvga.dll] +chipset=S3 diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/MAIN.GRP b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/MAIN.GRP new file mode 100644 index 0000000..710670f Binary files /dev/null and b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/MAIN.GRP differ diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/MICROSOF.GRP b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/MICROSOF.GRP new file mode 100644 index 0000000..709602e Binary files /dev/null and b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/MICROSOF.GRP differ diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/MSACM.INI b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/MSACM.INI new file mode 100644 index 0000000..1a37f1a --- /dev/null +++ b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/MSACM.INI @@ -0,0 +1,4 @@ +[Priority] +Priority1=1, MS-ADPCM, Microsoft ADPCM CODEC +Priority2=1, Microsoft IMA ADPCM, Microsoft IMA ADPCM CODEC +Priority3=1, MS-PCM, Microsoft PCM Converter diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/NCDINFO.INI b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/NCDINFO.INI new file mode 100644 index 0000000..cbb0613 --- /dev/null +++ b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/NCDINFO.INI @@ -0,0 +1,5 @@ +[NCD] +NETCARD1=214,-1,0x300,32,0xffff,-1,0xffff,-1,-1,0,-1,0xffffffff,-1,0xd9b5 + +[LastDetectedFromSetup] +NETCARD1=214,-1,0x300,32,0xffff,-1,0xffff,-1,-1,0,-1,0xffffffff,-1,0xd9b5 diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/NETWORK.GRP b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/NETWORK.GRP new file mode 100644 index 0000000..d276590 Binary files /dev/null and b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/NETWORK.GRP differ diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/PROGMAN.INI b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/PROGMAN.INI new file mode 100644 index 0000000..a27cc92 --- /dev/null +++ b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/PROGMAN.INI @@ -0,0 +1,14 @@ +[Settings] +display.drv=s3trio.drv +Order= 8 1 4 5 6 7 3 2 +Window=68 48 580 384 1 + +[Groups] +Group1=C:\WINDOWS\MICROSOF.GRP +Group2=C:\WINDOWS\MAIN.GRP +Group3=C:\WINDOWS\ACCESSOR.GRP +Group4=C:\WINDOWS\NETWORK.GRP +Group5=C:\WINDOWS\GAMES.GRP +Group6=C:\WINDOWS\STARTUP.GRP +Group7=C:\WINDOWS\WINGSDK.GRP +Group8=C:\WIN32APP.GRP diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/PROTOCOL.CLN b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/PROTOCOL.CLN new file mode 100644 index 0000000..65c3bad --- /dev/null +++ b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/PROTOCOL.CLN @@ -0,0 +1,42 @@ +[network.setup] +version=0x3110 +netcard=ms$ne2clone,1,MS$NE2CLONE,3 +transport=ms$nwlinknb,NWLINK +transport=ms$ndishlp,MS$NDISHLP +transport=ms$netbeui,NETBEUI +transport=tcpip-32r,MSTCP32 +lana0=ms$ne2clone,1,tcpip-32r +lana1=ms$ne2clone,1,ms$nwlinknb +lana2=ms$ne2clone,1,ms$ndishlp +lana3=ms$ne2clone,1,ms$netbeui + + +[protman] +DriverName=PROTMAN$ +PRIORITY=MS$NDISHLP + +[MS$NE2CLONE] +DriverName=MS2000$ +INTERRUPT=10 +IOBASE=0x300 + +[NE2000] +Adapters=MS$NE2CLONE + +[NWLINK] + +BINDINGS=MS$NE2CLONE +[MS$NDISHLP] +DriverName=ndishlp$ +BINDINGS=MS$NE2CLONE + +[NETBEUI] +DriverName=netbeui$ +SESSIONS=10 +NCBS=12 +BINDINGS=MS$NE2CLONE +LANABASE=2 + +[MSTCP32] +BINDINGS=MS$NE2CLONE +LANABASE=0 diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/PROTOCOL.INI b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/PROTOCOL.INI new file mode 100644 index 0000000..65c3bad --- /dev/null +++ b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/PROTOCOL.INI @@ -0,0 +1,42 @@ +[network.setup] +version=0x3110 +netcard=ms$ne2clone,1,MS$NE2CLONE,3 +transport=ms$nwlinknb,NWLINK +transport=ms$ndishlp,MS$NDISHLP +transport=ms$netbeui,NETBEUI +transport=tcpip-32r,MSTCP32 +lana0=ms$ne2clone,1,tcpip-32r +lana1=ms$ne2clone,1,ms$nwlinknb +lana2=ms$ne2clone,1,ms$ndishlp +lana3=ms$ne2clone,1,ms$netbeui + + +[protman] +DriverName=PROTMAN$ +PRIORITY=MS$NDISHLP + +[MS$NE2CLONE] +DriverName=MS2000$ +INTERRUPT=10 +IOBASE=0x300 + +[NE2000] +Adapters=MS$NE2CLONE + +[NWLINK] + +BINDINGS=MS$NE2CLONE +[MS$NDISHLP] +DriverName=ndishlp$ +BINDINGS=MS$NE2CLONE + +[NETBEUI] +DriverName=netbeui$ +SESSIONS=10 +NCBS=12 +BINDINGS=MS$NE2CLONE +LANABASE=2 + +[MSTCP32] +BINDINGS=MS$NE2CLONE +LANABASE=0 diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/REG.DAT b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/REG.DAT new file mode 100644 index 0000000..21fde6a Binary files /dev/null and b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/REG.DAT differ diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/SERIALNO.INI b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/SERIALNO.INI new file mode 100644 index 0000000..516625f --- /dev/null +++ b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/SERIALNO.INI @@ -0,0 +1,7 @@ +[Microsoft Products] +mswindows=Microsoft Windows for Workgrou + +[mswindows] +username=WIN311 +company= +serialno= diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/SHARES.PWL b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/SHARES.PWL new file mode 100644 index 0000000..700f999 Binary files /dev/null and b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/SHARES.PWL differ diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/STARTUP.GRP b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/STARTUP.GRP new file mode 100644 index 0000000..1bfb2d6 Binary files /dev/null and b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/STARTUP.GRP differ diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/SYSTEM.CLN b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/SYSTEM.CLN new file mode 100644 index 0000000..449f35b --- /dev/null +++ b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/SYSTEM.CLN @@ -0,0 +1,170 @@ +[boot] +oemfonts.fon=vgaoem.fon +fixedfon.fon=vgafix.fon +fonts.fon=vgasys.fon +display.drv=s3trio.drv +shell=progman.exe +network.drv=wfwnet.drv +mouse.drv=dboxmpi.drv +language.dll= +sound.drv=mmsound.drv +comm.drv=comm.drv +keyboard.drv=keyboard.drv +system.drv=system.drv +386grabber=vga_eng.3gr +drivers=mmsystem.dll + +[keyboard] +subtype= +type=4 +keyboard.dll= +oemansi.bin= + +[boot.description] +keyboard.typ=Enhanced 101 or 102 key US and Non US keyboards +mouse.drv=DOSBox-X Mouse Pointer Integration +language.dll=English (American) +system.drv=MS-DOS System +codepage=852 +woafont.fon= +aspect=100,96,96 +display.drv=S3 Trio64V 1.70.04 640x480 256 +network.drv=Microsoft Windows Network (version 3.11) +secondnet.drv=No Additional Network Installed + +[386Enh] +device=*vpd +mouse=*vmd +ebios=*ebios +woafont= +display=vdds3764.386 +EGA80WOA.FON=EGA80WOA.FON +EGA40WOA.FON=EGA40WOA.FON +CGA80WOA.FON=CGA80WOA.FON +CGA40WOA.FON=CGA40WOA.FON +keyboard=*vkd +network=*vnetbios,*vwc,vnetsup.386,vredir.386,vserver.386 +netheapsize=20 +device=*vcd +device=*vpicd +device=*vtd +device=*reboot +device=*vdmad +device=*vsd +device=*v86mmgr +device=*pageswap +device=*dosmgr +device=*vmpoll +device=*wshell +device=*PAGEFILE +device=*BLOCKDEV +device=*vfd +device=*parity +device=*biosxlat +device=*vmcpd +device=*combuff +device=*cdpscsi +device=vtdapi.386 +device=vpmtd.386 +device=vcomm.386 +device=serial.386 +device=lpt.386 +device=ifsmgr.386 +device=vcache.386 +device=vshare.386 +local=CON +FileSysChange=off +COM3Irq=4 +COM3Base=03E8 +COM4Irq=3 +COM4Base=02E8 +PagingFile=C:\WINDOWS\WIN386.SWP +MaxPagingFileSize=61440 +netmisc=ndis.386,ndis2sup.386,wsock.386,wstcp.386 +netcard=ne2000.386 +transport=nwlink.386,nwnblink.386,netbeui.386,vip.386,vdhcp.386,vtdi.386,vtcp.386,vnbt.386 +InDOSPolling=FALSE + +[NonWindowsApp] +localtsrs=dosedit,ced + +[vcache] +minfilecache=512 + +[mci] +WaveAudio=mciwave.drv +Sequencer=mciseq.drv +CDAudio=mcicda.drv + +[drivers] +DCI=RFMDCI +VIDS.DRAW=UDH.DLL +timer=timer.drv +midimapper=midimap.drv + +[DDEShares] +CHAT$=winchat,chat,,31,,0,,0,0,0 +SCHAT$=winchat,chat,,31,,0,,0,0,0 +CLPBK$=clipsrv,system,,31,,0,,0,0,0 +HEARTS$=mshearts,hearts,,15,,0,,0,0,0 + +[Network] +winnet=wfwnet/00025100 +multinet=nonet +FileSharing=Yes +PrintSharing=Yes +LogonDisconnected=yes +EnableSharing=Yes +UserName=WIN311 +Workgroup=WORKGROUP +ComputerName=WIN311 +Comment=WIN311 + + + +[Debug] +OutputTo=NUL + +[DISPLAY] +dpi=96 +color-format=8 +screen-size=640 +fastmmio=on +textrmw=0 +scache=on +ellipse-support=on +polygon-support=on +dac-type=nbt + +[network drivers] +netcard=ne2000.dos +transport=ndishlp.sys,*netbeui +devdir=C:\WINDOWS +LoadRMDrivers=No + +[NWNBLINK] +LANABASE=1 + +[ms$ne2clone0] +DefaultGateway=10.0.2.2 +IPMask=255.255.255.0 +IPAddress=10.0.2.15 +Description=NE2000 Compatible +Binding=ms$ne2clone + +[MSTCP] +EnableRouting=0 +Interfaces=ms$ne2clone0 +deadgwdetect=1 +pmtudiscovery=1 + +[DNS] +DNSServers=10.0.2.3 +HostName=WIN311 +DomainName= +DNSDomains= + +[NBT] +LANABASE=0 +EnableProxy=0 +EnableDNS=0 diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/SYSTEM.INI b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/SYSTEM.INI new file mode 100644 index 0000000..1cd3ac5 --- /dev/null +++ b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/SYSTEM.INI @@ -0,0 +1,198 @@ +[boot] +oemfonts.fon=vgaoem.fon +fixedfon.fon=vgafix.fon +fonts.fon=vgasys.fon +display.drv=s3trio.drv +shell=progman.exe +network.drv=wfwnet.drv +mouse.drv=dboxmpi.drv +language.dll= +sound.drv=mmsound.drv +comm.drv=comm.drv +keyboard.drv=keyboard.drv +system.drv=system.drv +386grabber=vga_eng.3gr +drivers=mmsystem.dll winmm16.dll +SCRNSAVE.EXE=(None) + +[keyboard] +subtype= +type=4 +keyboard.dll= +oemansi.bin= + +[boot.description] +keyboard.typ=Enhanced 101 or 102 key US and Non US keyboards +mouse.drv=DOSBox-X Mouse Pointer Integration +language.dll=English (American) +system.drv=MS-DOS System +codepage=852 +woafont.fon= +aspect=100,96,96 +display.drv=S3 Trio64V 1.70.04 640x480 256 +network.drv=Microsoft Windows Network (version 3.11) +secondnet.drv=No Additional Network Installed + +[386Enh] +device=C:\WINDOWS\SYSTEM\WIN32S\W32S.386 +device=dva.386 +device=*vpd +mouse=*vmd +ebios=*ebios +woafont= +display=vdds3764.386 +EGA80WOA.FON=EGA80WOA.FON +EGA40WOA.FON=EGA40WOA.FON +CGA80WOA.FON=CGA80WOA.FON +CGA40WOA.FON=CGA40WOA.FON +keyboard=*vkd +network=*vnetbios,*vwc,vnetsup.386,vredir.386,vserver.386 +netheapsize=20 +device=*vcd +device=*vpicd +device=*vtd +device=*reboot +device=*vdmad +device=*vsd +device=*v86mmgr +device=*pageswap +device=*dosmgr +device=*vmpoll +device=*wshell +device=*PAGEFILE +device=*BLOCKDEV +device=*vfd +device=*parity +device=*biosxlat +device=*vmcpd +device=*combuff +device=*cdpscsi +device=vtdapi.386 +device=vpmtd.386 +device=vcomm.386 +device=serial.386 +device=lpt.386 +device=ifsmgr.386 +device=vcache.386 +device=vshare.386 +local=CON +FileSysChange=off +COM3Irq=4 +COM3Base=03E8 +COM4Irq=3 +COM4Base=02E8 +PagingFile=C:\WINDOWS\WIN386.SWP +MaxPagingFileSize=61440 +netmisc=ndis.386,ndis2sup.386,wsock.386,wstcp.386 +netcard=ne2000.386 +transport=nwlink.386,nwnblink.386,netbeui.386,vip.386,vdhcp.386,vtdi.386,vtcp.386,vnbt.386 +InDOSPolling=FALSE + +device=vsbd.386 +device=vadlibd.386 +[NonWindowsApp] +localtsrs=dosedit,ced + +[vcache] +minfilecache=512 + +[mci] +WaveAudio=mciwave.drv +Sequencer=mciseq.drv +CDAudio=mcicda.drv +AVIVideo=mciavi.drv + +[drivers] +DCI=RFMDCI +VIDS.DRAW=UDH.DLL +timer=timer.drv +midimapper=midimap.drv +VIDC.CVID=iccvid.drv +VIDC.MSVC=msvidc.drv +VIDC.IV32=ir32.dll +VIDC.IV31=IR32.dll +VIDC.MRLE=MSRLE.drv +VIDC.RT21=ir21_r.dll +VIDC.YVU9=ir21_r.dll +WaveMapper=msacm.drv +MSACM.msadpcm=msadpcm.acm +MSACM.imaadpcm=imaadpcm.acm +Wave=sndblst2.drv +MIDI=sndblst2.drv +MIDI1=msadlib.drv + +[DDEShares] +CHAT$=winchat,chat,,31,,0,,0,0,0 +SCHAT$=winchat,chat,,31,,0,,0,0,0 +CLPBK$=clipsrv,system,,31,,0,,0,0,0 +HEARTS$=mshearts,hearts,,15,,0,,0,0,0 + +[Network] +winnet=wfwnet/00025100 +multinet=nonet +FileSharing=Yes +PrintSharing=Yes +LogonDisconnected=yes +EnableSharing=Yes +UserName=WIN311 +Workgroup=WORKGROUP +ComputerName=WIN311 +Comment=WIN311 +logonvalidated=no + + + +[Debug] +OutputTo=NUL + +[DISPLAY] +dpi=96 +color-format=8 +screen-size=640 +fastmmio=on +textrmw=0 +scache=on +ellipse-support=on +polygon-support=on +dac-type=nbt + +[network drivers] +netcard=ne2000.dos +transport=ndishlp.sys,*netbeui +devdir=C:\WINDOWS +LoadRMDrivers=No + +[NWNBLINK] +LANABASE=1 + +[ms$ne2clone0] +DefaultGateway=10.0.2.2 +IPMask=255.255.255.0 +IPAddress=10.0.2.15 +Description=NE2000 Compatible +Binding=ms$ne2clone + +[MSTCP] +EnableRouting=0 +Interfaces=ms$ne2clone0 +deadgwdetect=1 +pmtudiscovery=1 + +[DNS] +DNSServers=10.0.2.3 +HostName=WIN311 +DomainName= +DNSDomains= + +[NBT] +LANABASE=0 +EnableProxy=0 +EnableDNS=0 + +[Password Lists] +*Shares=C:\WINDOWS\Share000.PWL +WIN311=C:\WINDOWS\WIN311.PWL + +[sndblst.drv] +port=220 +int=7 diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/SYSTEM/WIN32S.INI b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/SYSTEM/WIN32S.INI new file mode 100644 index 0000000..d14c3a8 --- /dev/null +++ b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/SYSTEM/WIN32S.INI @@ -0,0 +1,14 @@ +[Win32s] +Setup=1 +Version=1.30.172.0 + +[OLE] +Setup=1 +Version=2.3.130.168 + +[Nls] +AnsiCP=1252 + +[Freecell] +Setup=1 +Version=1.30.172.0 diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/WFWSYS.CFG b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/WFWSYS.CFG new file mode 100644 index 0000000..72492d6 Binary files /dev/null and b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/WFWSYS.CFG differ diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/WIN.CLN b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/WIN.CLN new file mode 100644 index 0000000..1a4baa3 --- /dev/null +++ b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/WIN.CLN @@ -0,0 +1,167 @@ +[windows] +spooler=yes +load= +run= +Beep=yes +NullPort=None +device= +BorderWidth=3 +CursorBlinkRate=530 +DoubleClickSpeed=452 +Programs=com exe bat pif +Documents= +DeviceNotSelectedTimeout=15 +TransmissionRetryTimeout=45 +KeyboardDelay=2 +KeyboardSpeed=31 +ScreenSaveActive=0 +ScreenSaveTimeOut=120 + +[Desktop] +Pattern=(None) +TileWallPaper=0 +GridGranularity=0 + +[Extensions] +crd=cardfile.exe ^.crd +trm=terminal.exe ^.trm +txt=notepad.exe ^.txt +ini=notepad.exe ^.ini +pcx=pbrush.exe ^.pcx +bmp=pbrush.exe ^.bmp +wri=write.exe ^.wri +rec=recorder.exe ^.rec +hlp=winhelp.exe ^.hlp +mmf=msmail.exe /f ^.mmf + +[intl] +sLanguage=enu +sCountry=United States +iCountry=1 +iDate=0 +iTime=0 +iTLZero=0 +iCurrency=0 +iCurrDigits=2 +iNegCurr=0 +iLzero=1 +iDigits=2 +iMeasure=1 +s1159=AM +s2359=PM +sCurrency=$ +sThousand=, +sDecimal=. +sDate=/ +sTime=: +sList=, +sShortDate=M/d/yy +sLongDate=dddd, MMMM dd, yyyy + +[ports] +; A line with [filename].PRN followed by an equal sign causes +; [filename] to appear in the Control Panel's Printer Configuration dialog +; box. A printer connected to [filename] directs its output into this file. +; The file must be on one of your local drives; you cannot print to a network +; file. +LPT1:= +LPT2:= +LPT3:= +COM1:=9600,n,8,1,x +COM2:=9600,n,8,1,x +COM3:=9600,n,8,1,x +COM4:=9600,n,8,1,x +EPT:= +FILE:= +LPT1.DOS= +LPT2.DOS= + +[FontSubstitutes] +Helv=MS Sans Serif +Tms Rmn=MS Serif +Times=Times New Roman +Helvetica=Arial + +[TrueType] + +[Sounds] +SystemDefault=ding.wav, Default Beep +SystemExclamation=ding.wav, Exclamation +SystemStart=chimes.wav, Windows Start +SystemExit=chimes.wav, Windows Exit +SystemHand=ding.wav, Critical Stop +SystemQuestion=ding.wav, Question +SystemAsterisk=ding.wav, Asterisk +RingIn=ringin.wav, Incoming Call +RingOut=ringout.wav, Outgoing Call + +[mci extensions] +wav=waveaudio +mid=sequencer +rmi=sequencer + +[Compatibility] +NOTSHELL=0x0001 +WPWINFIL=0x0006 +CCMAIL=0x0008 +AMIPRO=0x0010 +REM=0x8022 +PIXIE=0x0040 +CP=0x0040 +JW=0x42080 +TME=0x0100 +VB=0x0200 +WIN2WRS=0x1210 +PACKRAT=0x0800 +VISION=0x0040 +MCOURIER=0x0800 +_BNOTES=0x24000 +MILESV3=0x1000 +PM4=0x2000 +DESIGNER=0x2000 +PLANNER=0x2000 +DRAW=0x2000 +WINSIM=0x2000 +CHARISMA=0x2000 +PR2=0x2000 +PLUS=0x1000 +ED=0x00010000 +APORIA=0x0100 +EXCEL=0x1000 +GUIDE=0x1000 +NETSET2=0x0100 +W4GL=0x4000 +W4GLR=0x4000 +TURBOTAX=0x00080000 + +[winsetup] +source_disk_path=C:\INST311 + +[fonts] +Arial (TrueType)=ARIAL.FOT +Arial Bold (TrueType)=ARIALBD.FOT +Arial Bold Italic (TrueType)=ARIALBI.FOT +Arial Italic (TrueType)=ARIALI.FOT +Courier New (TrueType)=COUR.FOT +Courier New Bold (TrueType)=COURBD.FOT +Courier New Bold Italic (TrueType)=COURBI.FOT +Courier New Italic (TrueType)=COURI.FOT +Times New Roman (TrueType)=TIMES.FOT +Times New Roman Bold (TrueType)=TIMESBD.FOT +Times New Roman Bold Italic (TrueType)=TIMESBI.FOT +Times New Roman Italic (TrueType)=TIMESI.FOT +WingDings (TrueType)=WINGDING.FOT +MS Sans Serif 8,10,12,14,18,24 (VGA res)=SSERIFE.FON +Courier 10,12,15 (VGA res)=COURE.FON +MS Serif 8,10,12,14,18,24 (VGA res)=SERIFE.FON +Symbol 8,10,12,14,18,24 (VGA res)=SYMBOLE.FON +Roman (Plotter)=ROMAN.FON +Script (Plotter)=SCRIPT.FON +Modern (Plotter)=MODERN.FON +Small Fonts (VGA res)=SMALLE.FON +Symbol (TrueType)=SYMBOL.FOT + +[embedding] +SoundRec=Sound,Sound,SoundRec.exe,picture +Package=Package,Package,packager.exe,picture +PBrush=Paintbrush Picture,Paintbrush Picture,pbrush.exe,picture diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/WIN.INI b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/WIN.INI new file mode 100644 index 0000000..c3dc8cc --- /dev/null +++ b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/WIN.INI @@ -0,0 +1,202 @@ +[windows] +spooler=yes +load= +run= +Beep=yes +NullPort=None +device= +BorderWidth=3 +CursorBlinkRate=530 +DoubleClickSpeed=452 +Programs=com exe bat pif +Documents= +DeviceNotSelectedTimeout=15 +TransmissionRetryTimeout=45 +KeyboardDelay=2 +KeyboardSpeed=31 +ScreenSaveActive=0 +ScreenSaveTimeOut=120 +CoolSwitch=1 + +[Desktop] +Pattern=136 84 34 69 136 21 34 81 +TileWallPaper=0 +GridGranularity=0 +IconSpacing=75 +WallPaper=(None) + +[Extensions] +crd=cardfile.exe ^.crd +trm=terminal.exe ^.trm +txt=notepad.exe ^.txt +ini=notepad.exe ^.ini +pcx=pbrush.exe ^.pcx +bmp=pbrush.exe ^.bmp +wri=write.exe ^.wri +rec=recorder.exe ^.rec +hlp=winhelp.exe ^.hlp +mmf=msmail.exe /f ^.mmf + +[intl] +sLanguage=enu +sCountry=United States +iCountry=1 +iDate=0 +iTime=0 +iTLZero=0 +iCurrency=0 +iCurrDigits=2 +iNegCurr=0 +iLzero=1 +iDigits=2 +iMeasure=1 +s1159=AM +s2359=PM +sCurrency=$ +sThousand=, +sDecimal=. +sDate=/ +sTime=: +sList=, +sShortDate=M/d/yy +sLongDate=dddd, MMMM dd, yyyy + +[ports] +; A line with [filename].PRN followed by an equal sign causes +; [filename] to appear in the Control Panel's Printer Configuration dialog +; box. A printer connected to [filename] directs its output into this file. +; The file must be on one of your local drives; you cannot print to a network +; file. +LPT1:= +LPT2:= +LPT3:= +COM1:=9600,n,8,1,x +COM2:=9600,n,8,1,x +COM3:=9600,n,8,1,x +COM4:=9600,n,8,1,x +EPT:= +FILE:= +LPT1.DOS= +LPT2.DOS= + +[FontSubstitutes] +Helv=MS Sans Serif +Tms Rmn=MS Serif +Times=Times New Roman +Helvetica=Arial + +[TrueType] + +[mci extensions] +wav=waveaudio +mid=sequencer +rmi=sequencer +avi=AVIVideo + +[Compatibility] +NOTSHELL=0x0001 +WPWINFIL=0x0006 +CCMAIL=0x0008 +AMIPRO=0x0010 +REM=0x8022 +PIXIE=0x0040 +CP=0x0040 +JW=0x42080 +TME=0x0100 +VB=0x0200 +WIN2WRS=0x1210 +PACKRAT=0x0800 +VISION=0x0040 +MCOURIER=0x0800 +_BNOTES=0x24000 +MILESV3=0x1000 +PM4=0x2000 +DESIGNER=0x2000 +PLANNER=0x2000 +DRAW=0x2000 +WINSIM=0x2000 +CHARISMA=0x2000 +PR2=0x2000 +PLUS=0x1000 +ED=0x00010000 +APORIA=0x0100 +EXCEL=0x1000 +GUIDE=0x1000 +NETSET2=0x0100 +W4GL=0x4000 +W4GLR=0x4000 +TURBOTAX=0x00080000 + +[winsetup] +source_disk_path=C:\INST311 + +[fonts] +Arial (TrueType)=ARIAL.FOT +Arial Bold (TrueType)=ARIALBD.FOT +Arial Bold Italic (TrueType)=ARIALBI.FOT +Arial Italic (TrueType)=ARIALI.FOT +Courier New (TrueType)=COUR.FOT +Courier New Bold (TrueType)=COURBD.FOT +Courier New Bold Italic (TrueType)=COURBI.FOT +Courier New Italic (TrueType)=COURI.FOT +Times New Roman (TrueType)=TIMES.FOT +Times New Roman Bold (TrueType)=TIMESBD.FOT +Times New Roman Bold Italic (TrueType)=TIMESBI.FOT +Times New Roman Italic (TrueType)=TIMESI.FOT +WingDings (TrueType)=WINGDING.FOT +MS Sans Serif 8,10,12,14,18,24 (VGA res)=SSERIFE.FON +Courier 10,12,15 (VGA res)=COURE.FON +MS Serif 8,10,12,14,18,24 (VGA res)=SERIFE.FON +Symbol 8,10,12,14,18,24 (VGA res)=SYMBOLE.FON +Roman (Plotter)=ROMAN.FON +Script (Plotter)=SCRIPT.FON +Modern (Plotter)=MODERN.FON +Small Fonts (VGA res)=SMALLE.FON +Symbol (TrueType)=SYMBOL.FOT + +[embedding] +SoundRec=Sound,Sound,SoundRec.exe,picture +Package=Package,Package,packager.exe,picture +PBrush=Paintbrush Picture,Paintbrush Picture,pbrush.exe,picture +MPlayer=Media Clip,Media Clip,mplayer.exe,picture + +[colors] +Background=0 0 128 +AppWorkspace=255 255 255 +Window=255 255 255 +WindowText=0 0 0 +Menu=255 255 255 +MenuText=0 0 0 +ActiveTitle=0 0 128 +InactiveTitle=255 255 255 +TitleText=255 255 255 +ActiveBorder=192 192 192 +InactiveBorder=192 192 192 +WindowFrame=0 0 0 +Scrollbar=192 192 192 +ButtonFace=192 192 192 +ButtonShadow=128 128 128 +ButtonText=0 0 0 +GrayText=192 192 192 +Hilight=0 0 128 +HilightText=255 255 255 +InactiveTitleText=0 0 0 +ButtonHilight=255 255 255 + +[drawdib] +s3trio.drv 640x480x8(5)=1,0,0,0 + +[sounds] +SystemAsterisk=ding.wav,Asterisk +SystemHand=ding.wav,Critical Stop +SystemDefault=ding.wav,Default Beep +SystemExclamation=ding.wav,Exclamation +RingIn=ringin.wav,Incoming Call +RingOut=ringout.wav,Outgoing Call +SystemQuestion=ding.wav,Question +SystemExit=,Windows Exit +SystemStart=,Windows Start + +[WinG] +s3trio.drv640x480x8(0,12)v1.70.4.0-2336-1.0.0.37=ECHGECHGECHGECHGDDFFDDFFDDFFDDFFZZZZZZZZZZZZZZZZDDFGDGFGDDFFDDFG1F + diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/WIN311.PWL b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/WIN311.PWL new file mode 100644 index 0000000..115d49b Binary files /dev/null and b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/WIN311.PWL differ diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/WINFILE.INI b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/WINFILE.INI new file mode 100644 index 0000000..6274338 --- /dev/null +++ b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/WINFILE.INI @@ -0,0 +1,3 @@ +[Settings] +Window=0,0,640,480, , ,1 +dir1=0,0,522,249,-1,-1,1,0,201,1905,174,C:\*.* diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/WINGSDK.GRP b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/WINGSDK.GRP new file mode 100644 index 0000000..94fd110 Binary files /dev/null and b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/WINGSDK.GRP differ diff --git a/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/_DEFAULT.PIF b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/_DEFAULT.PIF new file mode 100644 index 0000000..ebb35c7 Binary files /dev/null and b/installers/dosboxw31/INSTALLERS/CFG/WINDOWS/_DEFAULT.PIF differ diff --git a/installers/dosboxw31/INSTALLERS/INST311/_PLACE_WIN311_FILES_HERE_ b/installers/dosboxw31/INSTALLERS/INST311/_PLACE_WIN311_FILES_HERE_ new file mode 100644 index 0000000..a60141c --- /dev/null +++ b/installers/dosboxw31/INSTALLERS/INST311/_PLACE_WIN311_FILES_HERE_ @@ -0,0 +1 @@ +"" diff --git a/installers/dosboxw31/INSTALLERS/LINKS.txt b/installers/dosboxw31/INSTALLERS/LINKS.txt new file mode 100644 index 0000000..5848484 --- /dev/null +++ b/installers/dosboxw31/INSTALLERS/LINKS.txt @@ -0,0 +1,25 @@ +S3: +http://web.archive.org/web/20070404005124/http://drivers.s3graphics.com/en/download/drivers/legacy/Trio64V_765/w3117004.zip +http://web.archive.org/web/19980623182122/http://www.s3.com/bbs/764drv/w3117004.zip + +PW1118.exe (Win32s): +https://web.archive.org/web/20220831184504/http://ftpmirror.your.org/pub/misc/ftp.microsoft.com/Softlib/MSLFILES/PW1118.EXE +http://web.mit.edu/cascon/microsoft/pw1118.exe +http://web.archive.org/web/20010430062244if_/http://web.mit.edu:80/cascon/microsoft/pw1118.exe + +TCP32b: +http://web.archive.org/web/20010526175751/http://mssjus.www.conxion.com/download/wfw311/update/3.11b/wfw/en-us/tcp32b.exe +http://web.archive.org/web/20061212121000/http://download.microsoft.com/download/wfw311/update/3.11b/wfw/en-us/tcp32b.exe + +WV1160 (Video for Windows) +http://web.archive.org/web/20021016075846/http://www.ic.sunysb.edu/pub/wv1160.exe +http://ftp.lanet.lv/ftp/windows/www/netscape3.0/wv1160.exe +*BROKEN* web.archive.org/web/20150714132235/http://web1.toshiba.ca/support/isg/drivers/archives/files_Archive/win3x/wv1160.exe + +WING10 +http://web.archive.org/web/20040604045533/http://download.microsoft.com/download/platformsdk/wing/1/win98/en-us/wing10.exe +http://ftpmirror.your.org/pub/misc/ftp.microsoft.com/Softlib/MSLFILES/WING10.EXE +http://web.archive.org/web/20220831185005/http://ftpmirror.your.org/pub/misc/ftp.microsoft.com/Softlib/MSLFILES/WING10.EXE + +WMP +http://web.archive.org/web/20011206032410/http://msdl.microsoft.com/msdownload/mplayer/3.0/b1/en/MPSetup.exe \ No newline at end of file diff --git a/installers/dosboxw31/INSTALLERS/dosbox-x.conf b/installers/dosboxw31/INSTALLERS/dosbox-x.conf new file mode 100644 index 0000000..cafa5a5 --- /dev/null +++ b/installers/dosboxw31/INSTALLERS/dosbox-x.conf @@ -0,0 +1,1297 @@ +# This is the configuration file for DOSBox-X 2022.08.0. (Please use the latest version of DOSBox-X) +# Lines starting with a # are comment lines and are ignored by DOSBox-X. +# They are used to (briefly) document the effect of each option. +# To write out ALL options, use command 'config -all' with -wc or -writeconf options. + +[sdl] +# fullscreen: Start DOSBox-X directly in fullscreen. (Press [F11/F12]+F to go back) +# fulldouble: Use double buffering in fullscreen. It can reduce screen flickering, but it can also result in a slow DOSBox-X. +# fullresolution: What resolution to use for fullscreen: original, desktop or a fixed size (e.g. 1024x768). +# Using your monitor's native resolution with aspect=true might give the best results. +# If you end up with small window on a large screen, try an output different from surface. +# windowresolution: Scale the window to this size IF the output device supports hardware scaling. +# (output=surface does not!) +# windowposition: Set the window position at startup in the positionX,positionY format (e.g.: 1300,200). +# The window will be centered with "," (or empty), and will be in the original position with "-". +# display: Specify a screen/display number to use for a multi-screen setup (0 = default). +# output: What video system to use for output (openglnb = OpenGL nearest; openglpp = OpenGL perfect; ttf = TrueType font output). +# Possible values: default, surface, overlay, ttf, opengl, openglnb, openglhq, openglpp, ddraw, direct3d. +# videodriver: Forces a video driver (e.g. windib/windows, directx, x11, fbcon, dummy, etc) for the SDL library to use. +# transparency: Set the transparency of the DOSBox-X screen (both windowed and full-screen modes, on SDL2 and Windows SDL1 builds). +# The valid value is from 0 (no transparency, the default setting) to 90 (high transparency). +# maximize: If set, the DOSBox-X window will be maximized at start (SDL2 and Windows SDL1 builds only; use fullscreen for TTF output). +# autolock: Mouse will automatically lock, if you click on the screen. (Press CTRL-F10 to unlock) +# autolock_feedback: Autolock status feedback type, i.e. visual, auditive, none. +# Possible values: none, beep, flash. +# middle_unlock: Whether you can press the middle mouse button to unlock the mouse when the mouse has been locked. +# If set to "manual", it works only with "autolock=false"; if set to "auto", it works only with "autolock=true". +# Possible values: none, manual, auto, both. +# clip_mouse_button: Select the mouse button or use arrow keys for the shared clipboard copy/paste function. +# The default mouse button is "right", which means using the right mouse button to select text, copy to and paste from the host clipboard. +# Set to "middle" to use the middle mouse button, "arrows" to use arrow keys instead of a mouse button, or "none" to disable this feature. +# For "arrows", press Home key (or Fn+Shift+Left on Mac laptops) to start selection, and End key (or Fn+Shift+Right on Mac laptops) to end selection. +# Possible values: none, middle, right, arrows. +# clip_key_modifier: Change the keyboard modifier for the shared clipboard copy/paste function using a mouse button or arrow keys. +# The default modifier is "shift" (both left and right shift keys). Set to "none" if no modifier is desired. +# Possible values: none, ctrl, lctrl, rctrl, alt, lalt, ralt, shift, lshift, rshift, ctrlalt, ctrlshift, altshift, lctrlalt, lctrlshift, laltshift, rctrlalt, rctrlshift, raltshift. +# clip_paste_bios: Specify whether to use BIOS keyboard functions for the clipboard pasting instead of the keystroke method. +# For pasting clipboard text into Windows 3.x/9x applications (e.g. Notepad), make sure to use the keystroke method. +# Possible values: true, false, 1, 0, default. +# clip_paste_speed: Set keyboard speed for pasting text from the shared clipboard. +# If the default setting of 30 causes lost keystrokes, increase the number. +# Or experiment with decreasing the number for applications that accept keystrokes quickly. +# sensitivity: Mouse sensitivity. The optional second parameter specifies vertical sensitivity (e.g. 100,-50). +# usesystemcursor: Use the mouse cursor of the host system instead of drawing a DOS mouse cursor. Activated when the mouse is not locked. +# mouse_emulation: When is mouse emulated ? +# integration: when not locked +# locked: when locked +# always: every time +# never: at no time +# If disabled, the mouse position in DOSBox-X is exactly where the host OS reports it. +# When using a high DPI mouse, the emulation of mouse movement can noticeably reduce the +# sensitiveness of your device, i.e. the mouse is slower but more precise. +# Possible values: integration, locked, always, never. +# mouse_wheel_key: Convert mouse wheel movements into keyboard presses such as arrow keys. +# 0: disabled; 1: up/down arrows; 2: left/right arrows; 3: PgUp/PgDn keys. +# 4: Ctrl+up/down arrows; 5: Ctrl+left/right arrows; 6: Ctrl+PgUp/PgDn keys. +# 7: Ctrl+W/Z, as supported by text editors like WordStar and MS-DOS EDIT. +# Putting a minus sign in front will disable the conversion for guest systems. +# waitonerror: Wait before closing the console if DOSBox-X has an error. +# priority: Priority levels for DOSBox-X. Second entry behind the comma is for when DOSBox-X is not focused/minimized. +# pause is only valid for the second entry. +# Possible values: lowest, lower, normal, higher, highest, pause. +# mapperfile: File used to load/save the key/event mappings from. Resetmapper only works with the default value. +# usescancodes: Avoid usage of symkeys, in favor of scancodes. Might not work on all operating systems. +# If set to "auto" (default), it is enabled when using non-US keyboards in SDL1 builds. +# Possible values: true, false, 1, 0, auto. +# overscan: Width of the overscan border (0 to 10) for the "surface" output. +# titlebar: Change the string displayed in the DOSBox-X title bar. +# showbasic: If set, DOSBox-X will show basic information including the DOSBox-X version number and current running speed in the title bar. +# showdetails: If set, DOSBox-X will show the cycles count (FPS) and emulation speed relative to realtime in the title bar. +# showmenu: Whether to show the menu bar (if supported). Default true. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> mapperfile_sdl1; mapperfile_sdl2; forcesquarecorner +# +fullscreen = false +fulldouble = false +fullresolution = desktop +windowresolution = 960x720 +windowposition = +display = 0 +output = +videodriver = +transparency = 0 +maximize = false +autolock = false +autolock_feedback = beep +middle_unlock = manual +clip_mouse_button = right +clip_key_modifier = shift +clip_paste_bios = default +clip_paste_speed = 30 +sensitivity = 100 +usesystemcursor = false +mouse_emulation = integration +mouse_wheel_key = -1 +waitonerror = true +priority = higher,normal +mapperfile = mapper-dosbox-x.map +usescancodes = auto +overscan = 0 +titlebar = +showbasic = true +showdetails = false +showmenu = true + +[log] +# logfile: file where the log messages will be saved to +# debuggerrun: The run mode when the DOSBox-X Debugger starts. +# Possible values: debugger, normal, watch. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> vga; vgagfx; vgamisc; int10; sblaster; dma_control; fpu; cpu; paging; fcb; files; ioctl; exec; dosmisc; pit; keyboard; pic; mouse; bios; gui; misc; io; pci; sst; int21; fileio +# +logfile = +debuggerrun = debugger + +[dosbox] +# language: Select a language file for DOSBox-X to use. Encoded with either UTF-8 or a DOS code page. +# You can set code page either in the language file or with "country" setting in [config] section. +# title: Additional text to place in the title bar of the window. +# fastbioslogo: If set, DOSBox-X will skip the BIOS screen by activating fast BIOS logo mode (without 1-second pause). +# startbanner: If set (default), DOSBox-X will display the welcome banner when it starts. +# bannercolortheme: You can specify a different background color theme for the welcome banner from the default one. +# Possible values: default, black, red, green, yellow, blue, magenta, cyan, white. +# dpi aware: Set this option (auto by default) to indicate to your OS that DOSBox-X is DPI aware. +# If it is not set, Windows Vista/7/8/10 and higher may upscale the DOSBox-X window +# on higher resolution monitors which is probably not what you want. +# Possible values: true, false, 1, 0, auto. +# quit warning: Set this option to indicate whether DOSBox-X should show a warning message when the user tries to close its window. +# If set to auto (default), DOSBox-X will warn if a DOS program, game or a guest system is currently running. +# If set to autofile, DOSBox-X will warn if there are open file handles or a guest system is currently running. +# Possible values: true, false, 1, 0, auto, autofile. +# working directory option: Select an option for DOSBox-X's working directory when it runs. +# autoprompt: DOSBox-X will auto-decide whether to prompt for a working directory. +# config: DOSBox-X will use the primary config file directory as the working directory. +# custom: Specify a working directory via the "working directory default" option. +# default: Similar to autoprompt, but DOSBox-X will ask whether to save the selected folder. +# force: Similar to "custom", while overriding -defaultdir command-line option if used. +# noprompt: DOSBox-X uses the current directory and never prompts for a working directory. +# program: DOSBox-X will use the DOSBox-X program directory as the working directory. +# prompt: DOSBox-X will always ask the user to select a working directory when it runs. +# userconfig: DOSBox-X will use its user configuration directory as the working directory. +# Possible values: autoprompt, config, custom, default, force, noprompt, program, prompt, userconfig. +# working directory default: The default directory to act as DOSBox-X's working directory. See also the setting "working directory option". +# For working directory option=prompt, the specified directory becomes the default directory for the folder selection. +# show advanced options: If set, the Configuration Tool will display all config options (including advanced ones) by default. +# resolve config path: If set to true, DOSBox-X will resolve options containing paths in the config file (except [autoexec] section). +# This includes environment variables (%VAR% [DOS/Windows] or ${VAR} [Linux/macOS] and tilde (~) in Linux/macOS. +# If set to dosvar, DOSBox-X forces to resolve DOS-style environment variables (%VAR%) in all platforms (and tilde). +# If set to tilde, DOSBox-X will only resolve tilde (~) in Linux/macOS but will not resolve environment variables. +# Possible values: true, false, dosvar, tilde, 1, 0. +# hostkey: By default, DOSBox-X uses the mapper-defined host key, which defaults to F11 on Windows and F12 on other platforms. +# You may alternatively specify a host key with this setting and bypass the host key as defined in the mapper. +# This can also be done from the menu ("Main" => "Select host key"). +# Possible values: ctrlalt, ctrlshift, altshift, mapper. +# mapper send key: Select the key the mapper SendKey function will send. +# Possible values: winlogo, winmenu, alttab, ctrlesc, ctrlbreak, ctrlaltdel. +# ime: Enables support for the system input methods (IME) for inputting characters in Windows and Linux builds. +# If set to auto, this feature is only enabled if DOSBox-X starts with a Chinese/Japanese/Korean code page. +# Possible values: true, false, 1, 0, auto. +# synchronize time: If set, DOSBox-X will try to automatically synchronize time with the host, unless you decide to change the date/time manually. +# machine: The type of machine DOSBox-X tries to emulate. +# Possible values: mda, cga, cga_mono, cga_rgb, cga_composite, cga_composite2, hercules, tandy, pcjr, pcjr_composite, pcjr_composite2, amstrad, ega, ega200, jega, mcga, vgaonly, svga_s3, svga_s386c928, svga_s3vision864, svga_s3vision868, svga_s3vision964, svga_s3vision968, svga_s3trio32, svga_s3trio64, svga_s3trio64v+, svga_s3virge, svga_s3virgevx, svga_et3000, svga_et4000, svga_paradise, vesa_nolfb, vesa_oldvbe, vesa_oldvbe10, pc98, pc9801, pc9821, fm_towns. +# captures: Directory where things like wave, midi, screenshot get captured. +# autosave: Enable the auto-save state feature. Specify a time interval in seconds, and optionally a save slot or start and end save slots. +# For example, "autosave=10 11-20" will set a 10-second time interval for auto-saving, and the save slots used will be between 11 and 20. +# You can additionally specify up to 9 programs for this feature, e.g. "autosave=10 11-20 EDIT:21-30 EDITOR:35" for "EDIT" and "EDITOR". +# Putting a minus sign (-) before the time interval causes the auto-saving function to not be activated at start. +# saveslot: Select the default save slot (1-100) to save/load states. +# savefile: Select the default save file to save/load states. If specified it will be used instead of the save slot. +# saveremark: If set, the save state feature will ask users to enter remarks when saving a state. +# forceloadstate: If set, DOSBox-X will load a saved state even if it finds there is a mismatch in the DOSBox-X version, machine type, program name and/or the memory size. +# a20: A20 gate emulation mode. +# The on/off/on_fake/off_fake options are intended for testing and debugging DOS development, +# or to emulate obscure hardware, or to work around potential extended memory problems with DOS programs. +# on_fake/off_fake are intended to test whether a program carries out a memory test to ensure the A20 +# gate is set as intended (as HIMEM.SYS does). If it goes by the gate bit alone, it WILL crash. +# This parameter is also changeable from the builtin A20GATE command. +# fast Emulate A20 gating by remapping the first 64KB @ 1MB boundary (fast, mainline DOSBox behavior) +# mask Emulate A20 gating by masking memory I/O address (accurate) +# off Lock A20 gate off (Software/OS cannot enable A20) +# on Lock A20 gate on (Software/OS cannot disable A20) +# off_fake Lock A20 gate off but allow bit to toggle (hope your DOS game tests the HMA!) +# on_fake Lock A20 gate on but allow bit to toggle +# memsize: Amount of memory DOSBox-X has in megabytes. +# This value is best left at its default to avoid problems with some games, +# although other games and applications may require a higher value. +# Programs that use 286 protected mode like Windows 3.0 in Standard Mode may crash with more than 15MB. +# nocachedir: If set, MOUNT commands will mount with -nocachedir (disable directory caching) by default. +# freesizecap: If set to "cap" (="true"), the value of MOUNT -freesize will apply only if the actual free size is greater than the specified value. +# If set to "relative", the value of MOUNT -freesize will change relative to the specified value. +# If set to "fixed" (="false"), the value of MOUNT -freesize will be a fixed one to be reported all the time. +# Possible values: true, false, fixed, relative, cap, 2, 1, 0. +# convertdrivefat: If set, DOSBox-X will auto-convert mounted non-FAT drives (such as local drives) to FAT format for use with guest systems. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> disable graphical splash; allow quit after warning; keyboard hook; weitek; bochs debug port e9; compresssaveparts; show recorded filename; skip encoding unchanged frames; capture chroma format; capture format; shell environment size; private area size; turn off a20 gate on boot; cbus bus clock; isa bus clock; pci bus clock; call binary on reset; unhandled irq handler; call binary on boot; ibm rom basic; rom bios allocation max; rom bios minimum size; irq delay ns; iodelay; iodelay16; iodelay32; acpi; acpi rsd ptr location; acpi sci irq; acpi iobase; acpi reserved size; memsizekb; dos mem limit; isa memory hole at 512kb; reboot delay; memalias; convert fat free space; convert fat timeout; leading colon write protect image; locking disk image mount; unmask keyboard on int 16 read; int16 keyboard polling undocumented cf behavior; allow port 92 reset; enable port 92; enable 1st dma controller; enable 2nd dma controller; allow dma address decrement; enable 128k capable 16-bit dma; enable dma extra page registers; dma page registers write-only; cascade interrupt never in service; cascade interrupt ignore in service; enable slave pic; enable pc nmi mask; allow more than 640kb base memory; enable pci bus +# +language = +title = +fastbioslogo = true +startbanner = false +bannercolortheme = default +dpi aware = 1 +quit warning = auto +working directory option = default +working directory default = +show advanced options = false +resolve config path = true +hostkey = mapper +mapper send key = ctrlaltdel +ime = auto +synchronize time = false +machine = svga_s3 +captures = capture +autosave = +saveslot = 1 +savefile = +saveremark = true +forceloadstate = false +a20 = mask +memsize = 16 +nocachedir = false +freesizecap = cap +convertdrivefat = true + +[render] +# frameskip: How many frames DOSBox-X skips before drawing one. +# aspect: Aspect ratio correction mode. Can be set to the following values: +# 'false' (default): +# 'direct3d'/opengl outputs: image is simply scaled to full window/fullscreen size, possibly resulting in disproportional image +# 'surface' output: it does no aspect ratio correction (default), resulting in disproportional images if VGA mode pixel ratio is not 4:3 +# 'true': +# 'direct3d'/opengl outputs: uses output driver functions to scale / pad image with black bars, correcting output to proportional 4:3 image +# In most cases image degradation should not be noticeable (it all depends on the video adapter and how much the image is upscaled). +# Should have none to negligible impact on performance, mostly being done in hardware +# For the pixel-perfect scaling (output=openglpp), it is recommended to enable this whenever the emulated display has an aspect ratio of 4:3 +# 'surface' output: inherits old DOSBox aspect ratio correction method (adjusting rendered image line count to correct output to 4:3 ratio) +# Due to source image manipulation this mode does not mix well with scalers, i.e. multiline scalers like hq2x/hq3x will work poorly +# Slightly degrades visual image quality. Has a tiny impact on performance +# When using xBRZ scaler with 'surface' output, aspect ratio correction is done by the scaler itself, so none of the above apply +# Possible values: false, true, 0, 1, yes, no, nearest, bilinear. +# aspect_ratio: Set the aspect ratio (e.g. 16:9) in the aspect ratio correction mode. 0:0 means the default ratio of 4:3, and -1:-1 means the original image ratio. +# char9: Allow 9-pixel wide text mode fonts instead of 8-pixel wide fonts. +# euro: Display Euro symbol instead of the specified ASCII character (33-255). +# For example, setting it to 128 allows Euro symbol to be displayed instead of C-cedilla. +# doublescan: If set, doublescanned output emits two scanlines for each source line, in the +# same manner as the actual VGA output (320x200 is rendered as 640x400 for example). +# If clear, doublescanned output is rendered at the native source resolution (320x200 as 320x200). +# This affects the raster PRIOR to the software or hardware scalers. Choose wisely. +# For pixel-perfect scaling (output=openglpp), it is recommended to turn this option off. +# scaler: Scaler used to enlarge/enhance low resolution modes. If 'forced' is appended, +# then the scaler will be used even if the result might not be desired. +# Appending 'prompt' will cause a confirmation message for forcing the scaler. +# To fit a scaler in the resolution used at full screen may require a border or side bars. +# To fill the screen entirely, depending on your hardware, a different scaler/fullresolution might work. +# Scalers should work with most output options, but they are ignored for openglpp and TrueType font outputs. +# Possible values: none, normal2x, normal3x, normal4x, normal5x, advmame2x, advmame3x, advinterp2x, advinterp3x, hq2x, hq3x, 2xsai, super2xsai, supereagle, tv2x, tv3x, rgb2x, rgb3x, scan2x, scan3x, gray, gray2x, hardware_none, hardware2x, hardware3x, hardware4x, hardware5x, xbrz, xbrz_bilinear. +# glshader: Path to GLSL shader source to use with OpenGL output ("none" to disable, or "default" for default shader). +# Can be either an absolute path, a file in the "glshaders" subdirectory of the DOSBox-X configuration directory, +# or one of the built-in shaders (e.g. "sharp" for the pixel-perfect scaling mode): +# advinterp2x, advinterp3x, advmame2x, advmame3x, rgb2x, rgb3x, scan2x, scan3x, tv2x, tv3x, sharp. +# pixelshader: Set Direct3D pixel shader program (effect file must be in Shaders subdirectory). If 'forced' is appended, +# then the pixel shader will be used even if the result might not be desired. +# autofit: Best fits image to window +# - Intended for output=direct3d, fullresolution=original, aspect=true +# monochrome_pal: Specify the color of monochrome display. +# Possible values: green, amber, gray, white +# Append 'bright' for a brighter look. +# Possible values: green, amber, gray, white. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> alt render; xbrz slice; xbrz fixed scale factor; xbrz max scale factor +# +frameskip = 0 +aspect = true +aspect_ratio = 0:0 +char9 = true +euro = -1 +doublescan = true +scaler = normal2x forced +glshader = none +pixelshader = none +autofit = true +monochrome_pal = green + +[pc98] +# pc-98 BIOS copyright string: If set, the PC-98 BIOS copyright string is placed at E800:0000. Enable this for software that detects PC-98 vs Epson. +# pc-98 fm board: In PC-98 mode, selects the FM music board to emulate. +# Possible values: auto, off, false, board14, board26k, board86, board86c. +# pc-98 enable 256-color: Allow 256-color graphics mode if set, disable if not set +# pc-98 enable 16-color: Allow 16-color graphics mode if set, disable if not set +# pc-98 enable grcg: Allow GRCG graphics functions if set, disable if not set +# pc-98 enable egc: Allow EGC graphics functions if set, disable if not set +# pc-98 bus mouse: Enable PC-98 bus mouse emulation. Disabling this option does not disable INT 33h emulation. +# pc-98 force ibm keyboard layout: Force to use a default keyboard layout like IBM US-English for PC-98 emulation. +# Will only work with apps and games using BIOS for keyboard. +# Possible values: true, false, 1, 0, auto. +# pc-98 try font rom: If enabled, DOSBox-X will first try to load FONT.ROM as generated by T98Tools for PC-98 emulation. +# pc-98 anex86 font: Specify an Anex86 compatible font to load as supported by the Anex86 emulator for PC-98 emulation. +# By default DOSBox-X tries to load ANEX86.BMP followed by FREECG98.BMP after trying to load FONT.ROM. +# If you specify a font here then it will be tried first, perhaps before FONT.ROM (see previous option). +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> pc-98 int 1b fdc timer wait; pc-98 pic init to read isr; pc-98 fm board irq; pc-98 fm board io port; pc-98 sound bios; pc-98 load sound bios rom file; pc-98 buffer page flip; pc-98 enable 256-color planar; pc-98 enable 188 user cg; pc-98 start gdc at 5mhz; pc-98 allow scanline effect; pc-98 video mode; pc-98 timer always cycles; pc-98 timer master frequency; pc-98 allow 4 display partition graphics; pc-98 show graphics layer on initialize +# +pc-98 BIOS copyright string = false +pc-98 fm board = auto +pc-98 enable 256-color = true +pc-98 enable 16-color = true +pc-98 enable grcg = true +pc-98 enable egc = true +pc-98 bus mouse = true +pc-98 force ibm keyboard layout = auto +pc-98 try font rom = true +pc-98 anex86 font = + +[dosv] +# dosv: Enable DOS/V emulation and specify which version to emulate. This option is intended for use with games or software +# originating from East Asia (China, Japan, Korea) that use the double byte character set (DBCS) encodings and DOS/V extensions +# to display Japanese (jp), Chinese (chs/cht/cn/tw), or Korean (ko) text. Note that enabling DOS/V replaces 80x25 text mode with +# a EGA/VGA graphics mode that emulates text mode to display the characters and may be incompatible with non-Asian software that +# assumes direct access to the text mode via segment 0xB800. For a general DOS environment with CJK support please disable DOS/V +# emulation and use TrueType font (TTF) output with a CJK code page (932, 936, 949, 950) and TTF font with CJK characters instead. +# Possible values: off, jp, ko, chs, cht, cn, tw. +# getsysfont: If enabled, DOSBox-X will try to get and use the system fonts on Windows and Linux platforms for the DOS/V emulation. +# If this cannot be done, then DOSBox-X will try to use the internal Japanese DOS/V font, or you can specify a different font. +# fontxsbcs: FONTX2 file used to rendering SBCS characters (8x19) in DOS/V or JEGA mode. If not specified, the default one will be used. +# Loading the ASC16 and ASCFONT.15 font files (from the UCDOS and ETen Chinese DOS systems) is also supported for the DOS/V mode. +# fontxsbcs16: FONTX2 file used to rendering SBCS characters (8x16) in DOS/V or JEGA mode. If not specified, the default one will be used. +# Loading the ASC16 and ASCFONT.15 font files (from the UCDOS and ETen Chinese DOS systems) is also supported for the DOS/V mode. +# fontxsbcs24: FONTX2 file used to rendering SBCS characters (12x24) in DOS/V mode (with V-text). If not specified, the default one will be used. +# Loading the ASC24 and ASCFONT.24? font files (the latter from the ETen Chinese DOS system) is also supported for the DOS/V mode. +# fontxdbcs: FONTX2 file used to rendering DBCS characters (16x16) in DOS/V or VGA/JEGA mode. If not specified, the default one will be used. +# Alternatively, you can load a BDF or PCF font file (16x16 or 15x15), such as the free bitmap fonts from WenQuanYi (https://wenq.org/). +# For Simplified Chinese DOS/V, loading the HZK16 font file (https://github.com/aguegu/BitmapFont/tree/master/font) is also supported. +# For Traditional Chinese DOS/V, loading the STDFONT.15 font file from the ETen Chinese DOS system is also supported. +# fontxdbcs14: FONTX2 file used to rendering DBCS characters (14x14) for Configuration Tool or EGA mode. If not specified, the default one will be used. +# Alternatively, you can load a BDF or PCF font file (14x14 or 15x15), such as the free bitmap fonts from WenQuanYi (https://wenq.org/). +# For Simplified Chinese DOS/V, loading the HZK14 font file (https://github.com/aguegu/BitmapFont/tree/master/font) is also supported. +# For Traditional Chinese DOS/V, loading the STDFONT.15 font file from the ETen Chinese DOS system is also supported. +# fontxdbcs24: FONTX2 file used to rendering DBCS characters (24x24) in DOS/V mode (with V-text and 24-pixel fonts enabled). +# For Simplified Chinese DOS/V, loading the HZK24? font file (https://github.com/aguegu/BitmapFont/tree/master/font) is also supported. +# For Traditional Chinese DOS/V, loading the STDFONT.24 font file from the ETen Chinese DOS system is also supported. +# showdbcsnodosv: Enables rendering of Chinese/Japanese/Korean characters for DBCS code pages in standard VGA and EGA machine types in non-DOS/V and non-TTF mode. +# DOS/V fonts will be used in such cases, which can be adjusted by the above config options (such as fontxdbcs, fontxdbcs14, and fontxdbcs24). +# Setting to "auto" enables Chinese/Japanese/Korean character rendering if a language file is loaded (or with "autodbcs" option set) in such cases. +# Possible values: true, false, 1, 0, auto. +# yen: Enables the Japanese yen symbol at 5ch if it is found at 7fh in a custom SBCS font for the Japanese DOS/V or JEGA emulation. +# fepcontrol: FEP control API for the DOS/V emulation. +# Possible values: ias, mskanji, both. +# vtext1: V-text screen mode 1 for the DOS/V emulation. Enter command "VTEXT 1" for this mode. Note that XGA/SXGA mode is only supported by the svga_s3trio and svga_et4000 machine types. +# Possible values: xga, xga24, sxga, sxga24, svga. +# vtext2: V-text screen mode 2 for the DOS/V emulation. Enter command "VTEXT 2" for this mode. Note that XGA/SXGA mode is only supported by the svga_s3trio and svga_et4000 machine types. +# Possible values: xga, xga24, sxga, sxga24, svga. +# use20pixelfont: Enables the 20 pixel font to be used instead of the 24 pixel system font for the Japanese DOS/V emulation (with V-text enabled). +# j3100: With the setting dosv=jp and a non-off value of this option, the Toshiba J-3100 machine will be emulated with DCGA support. +# Setting to "on" or "auto" starts J-3100 automatically, and with the setting "manual" you can enter J-3100 mode with DCGA command. +# Possible values: off, on, auto, manual, 0, 1, 2. +# j3100type: Specifies the Toshiba J-3100 machine type if J-3100 mode is enabled. The color palette will be changed with different machine types. +# Possible values: default, gt, sgt, gx, gl, sl, sgx, ss, gs, sx, sxb, sxw, sxp, ez, zs, zx. +# j3100colorscroll: Specifies that the color display can be used for scrolling, which is currently incompatible with for example the J-3100 version of the SimCity game. +# The VGA version of the Toshiba Windows 3.1 works fine with the "false" value of this setting, whereas its CGA/EGA version requires a "true" value for this. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> del; j3100backcolor; j3100textcolor +# +dosv = off +getsysfont = true +fontxsbcs = +fontxsbcs16 = +fontxsbcs24 = +fontxdbcs = +fontxdbcs14 = +fontxdbcs24 = +showdbcsnodosv = auto +yen = false +fepcontrol = both +vtext1 = svga +vtext2 = xga +use20pixelfont = false +j3100 = off +j3100type = default +j3100colorscroll = false + +[video] +# vmemsize: Amount of video memory in megabytes. +# The maximum resolution and color depth the svga_s3 will be able to display +# is determined by this value. +# -1: auto (vmemsizekb is ignored) +# 0: 512k (800x600 at 256 colors) if vmemsizekb=0 +# 1: 1024x768 at 256 colors or 800x600 at 64k colors +# 2: 1600x1200 at 256 colors or 1024x768 at 64k colors or 640x480 at 16M colors +# 4: 1600x1200 at 64k colors or 1024x768 at 16M colors +# 8: up to 1600x1200 at 16M colors +# For build engine games, use more memory than in the list above so it can +# use triple buffering and thus won't flicker. +# +# vmemsizekb: Amount of video memory in kilobytes, in addition to vmemsize. +# high intensity blinking: Set to false if you want to see high-intensity background colors instead of blinking foreground text. +# This option has no effect in PC-98 and some other video modes. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> vmemdelay; vbe window granularity; vbe window size; enable 8-bit dac; svga lfb base; pci vga; vga attribute controller mapping; vga bios use rom image; vga bios rom image; vga bios size override; video bios dont duplicate cga first half rom font; video bios always offer 14-pixel high rom font; video bios always offer 16-pixel high rom font; video bios enable cga second half rom font; forcerate; sierra ramdac; sierra ramdac lock 565; vga fill active memory; page flip debug line; vertical retrace poll debug line; cgasnow; vga 3da undefined bits; rom bios 8x8 CGA font; rom bios video parameter table; int 10h points at vga bios; unmask timer on int 10 setmode; vesa bank switching window mirroring; vesa bank switching window range check; vesa zero buffer on get information; vesa set display vsync; vesa lfb base scanline adjust; vesa map non-lfb modes to 128kb region; ega per scanline hpel; allow hpel effects; allow hretrace effects; hretrace effect weight; vesa modelist cap; vesa modelist width limit; vesa modelist height limit; vesa vbe put modelist in vesa information; vesa vbe 1.2 modes are 32bpp; allow low resolution vesa modes; allow explicit 24bpp vesa modes; allow high definition vesa modes; allow unusual vesa modes; allow 32bpp vesa modes; allow 24bpp vesa modes; allow 16bpp vesa modes; allow 15bpp vesa modes; allow 8bpp vesa modes; allow 4bpp vesa modes; allow 4bpp packed vesa modes; allow tty vesa modes; double-buffered line compare; ignore vblank wraparound; ignore extended memory bit; enable vga resize delay; resize only on vga active display width increase; vga palette update on full load; ignore odd-even mode in non-cga modes; ignore sequencer blanking +# +vmemsize = -1 +vmemsizekb = 0 +high intensity blinking = true + +[vsync] +# vsyncmode: Synchronize vsync timing to the host display. Requires calibration within DOSBox-X. +# Possible values: off, on, force, host. +# vsyncrate: Vsync rate used if vsync is enabled. Ignored if vsyncmode is set to host (win32). +# Possible values:. +vsyncmode = off +vsyncrate = 75 + +[cpu] +# core: CPU Core used in emulation. auto will switch to dynamic if available and appropriate. +# For the dynamic core, both dynamic_x86 and dynamic_rec are supported (dynamic_x86 is preferred). +# Windows 95 or other preemptive multitasking OSes will not work with the dynamic_rec core. +# Possible values: auto, dynamic, dynamic_x86, dynamic_nodhfpu, dynamic, dynamic_rec, normal, full, simple. +# fpu: Enable FPU emulation +# Possible values: true, false, 1, 0, auto, 8087, 287, 387. +# segment limits: Enforce checks for segment limits on 80286 and higher CPU types. +# cputype: CPU Type used in emulation. "auto" emulates a 486 which tolerates Pentium instructions. +# "experimental" enables newer instructions not normally found in the CPU types emulated by DOSBox-X, such as FISTTP. +# Possible values: auto, 8086, 8086_prefetch, 80186, 80186_prefetch, 286, 286_prefetch, 386, 386_prefetch, 486old, 486old_prefetch, 486, 486_prefetch, pentium, pentium_mmx, ppro_slow, pentium_ii, pentium_iii, experimental. +# cycles: Number of instructions DOSBox-X tries to emulate each millisecond. +# Setting this value too high results in sound dropouts and lags. +# Cycles can be set in 3 ways: +# 'auto' tries to guess what a game needs. +# It usually works, but can fail for certain games. +# 'fixed #number' will set a fixed number of cycles. This is what you usually +# need if 'auto' fails (Example: fixed 4000). +# 'max' will allocate as much cycles as your computer is able to +# handle. Recommended if better performance is desired. +# Possible values: auto, fixed, max. +# cycleup: Amount of cycles to decrease/increase with the mapped keyboard shortcut. +# cycledown: Setting it lower than 100 will be a percentage. +# turbo: Enables Turbo (Fast Forward) mode to speed up operations. +# apmbios: Emulate Advanced Power Management (APM) BIOS calls. +# integration device: Enable DOSBox-X's integration I/O device, a way for additional software to talk to DOSBox-X. It is currently experimental. +# This can for example be used to return DOSBox-X's current status and by the guest OS to match the mouse pointer position. +# isapnpbios: Emulate ISA Plug & Play BIOS. Enable if using DOSBox-X to run a PnP aware DOS program or if booting Windows 9x. +# Do not disable if Windows 9x is configured around PnP devices, you will likely confuse it. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> processor serial number; double fault; clear trap flag on unhandled int 1; reset on triple fault; always report double fault; always report triple fault; mask stack pointer for enter leave instructions; allow lmsw to exit protected mode; report fdiv bug; enable msr; enable cmpxchg8b; enable syscall; ignore undefined msr; interruptible rep string op; dynamic core cache block size; cycle emulation percentage adjust; stop turbo on key; stop turbo after second; use dynamic core with paging on; ignore opcode 63; apmbios pnp; apm power button event; apmbios version; apmbios allow realmode; apmbios allow 16-bit protected mode; apmbios allow 32-bit protected mode; integration device pnp; isapnpport; realbig16 +# +core = dynamic +fpu = true +segment limits = true +cputype = auto +cycles = max +cycleup = 10 +cycledown = 20 +turbo = false +turbo last second = 3 +stop turbo after second = 3 +stop turbo on key = true +apmbios = true +integration device = true +isapnpbios = true + +[keyboard] +# aux: Enable emulation of the 8042 auxiliary port. PS/2 mouse emulation requires this to be enabled. +# You should enable this if you will be running Windows ME or any other OS that does not use the BIOS to receive mouse events. +# allow output port reset: If set (default), allow the application to reset the CPU through the keyboard controller. +# This option is required to allow Windows ME to reboot properly, whereas Windows 9x and earlier +# will reboot without this option using INT 19h +# controllertype: Type of keyboard controller (and keyboard) attached. +# auto Automatically pick according to machine type +# at AT (PS/2) type keyboard +# xt IBM PC/XT type keyboard +# pcjr IBM PCjr type keyboard (only if machine=pcjr) +# pc98 PC-98 keyboard emulation (only if machine=pc98) +# Possible values: auto, at, xt, pcjr, pc98. +# auxdevice: Type of PS/2 mouse attached to the AUX port +# Possible values: none, 2button, 3button, intellimouse, intellimouse45. +aux = true +allow output port reset = true +controllertype = auto +auxdevice = intellimouse + +[ttf] +# font: Specifies a TrueType font to use for the TTF output. If not specified, the built-in TrueType font will be used. +# Either a font name or full font path can be specified. If file ends with the .TTF extension then the extension can be omitted. +# For a font name or relative path, directories such as the working directory and default system font directory will be searched. +# For example, setting it to "consola" or "consola.ttf" will use Consola font (included in Windows); similar for other TTF fonts. +# Additionally, OTF fonts (e.g. OratorStd.otf), .FON fonts (e.g. vgasys.fon), and .TTC fonts (e.g. msgothic.ttc) are also supported. +# To display Chinese/Japanese/Korean text in these code pages, a font with CJK characters is needed (e.g. GNU Unifont or Sarasa Gothic). +# fontbold: You can optionally specify a bold TrueType font for use with the TTF output that will render the bold text style. +# It requires a word processor be set with the wp option, and this actual bold font will be used for the bold style. +# For example, setting it to "consolab" or "consolab.ttf" will use the Consolab font; similar for other TTF fonts. +# fontital: You can optionally specify an italic TrueType font for use with the TTF output that will render the italic text style. +# It requires a word processor be set with the wp option, and this actual italic font will be used for the italic style. +# For example, setting it to "consolai" or "consolai.ttf" will use the Consolai font; similar for other TTF fonts. +# fontboit: You can optionally specify a bold italic TrueType font for use with the TTF output that will render the bold italic text style. +# It requires a word processor be set with the wp option, and this actual bold-italic font will be used for the bold-italic style. +# For example, setting it to "consolaz" or "consolaz.ttf" will use the Consolaz font; similar for other TTF fonts. +# colors: Specifies a color scheme to use for the TTF output by supply all 16 color values in RGB: (r,g,b) or hexadecimal as in HTML: #RRGGBB +# The original DOS colors (0-15): #000000 #0000aa #00aa00 #00aaaa #aa0000 #aa00aa #aa5500 #aaaaaa #555555 #5555ff #55ff55 #55ffff #ff5555 #ff55ff #ffff55 #ffffff +# gray scaled color scheme: (0,0,0) #0e0e0e (75,75,75) (89,89,89) (38,38,38) (52,52,52) #717171 #c0c0c0 #808080 (28,28,28) (150,150,150) (178,178,178) (76,76,76) (104,104,104) (226,226,226) (255,255,255) +# An optional leading "+" sign allows the preset color scheme to be used when switching from another output. +# outputswitch: Specifies the output that DOSBox-X should switch to from the TTF output when a graphical mode is requested, or auto for automatic selection. +# Possible values: auto, surface, opengl, openglnb, openglhq, openglpp, direct3d. +# winperc: Specifies the window percentage for the TTF output (100 = full screen). Ignored if the ptsize setting is specified. +# ptsize: Specifies the font point size for the TTF output. If specified (minimum: 9), it will override the winperc setting. +# lins: Specifies the number of rows on the screen for the TTF output (0 = default). +# cols: Specifies the number of columns on the screen for the TTF output (0 = default). +# righttoleft: If set, DOSBox-X will display text from right to left instead of left to right on the screen for the TTF output. +# This is especially useful for languages which use right-to-left scripts (such as Arabic and Hebrew). +# wp: You can specify a word processor for the TTF output and optionally also a version number for the word processor. +# Supported word processors are WP=WordPerfect, WS=WordStar, XY=XyWrite, FE=FastEdit, and an optional version number. +# For example, WP6 will set the word processor as WordPerfect 6, and XY4 will set the word processor as XyWrite 4. +# Word processor-specific features like on-screen text styles and 512-character font will be enabled based on this. +# bold: If set, DOSBox-X will display bold text in visually (requires a word processor be set) for the TTF output. +# This is done either with the actual bold font specified by the fontbold option, or by making it bold automatically. +# italic: If set, DOSBox-X will display italicized text visually (requires a word processor be set) for the TTF output. +# This is done either with the actual italic font specified by the fontital option, or by slanting the characters automatically. +# underline: If set, DOSBox-X will display underlined text visually (requires a word processor be set) for the TTF output. +# strikeout: If set, DOSBox-X will display strikeout text visually (requires a word processor be set) for the TTF output. +# printfont: If set, DOSBox-X will force to use the current TrueType font (set via font option) for printing in addition to displaying. +# autodbcs: If set, DOSBox-X enables Chinese/Japanese/Korean DBCS (double-byte) characters when these code pages are active by default. +# Only applicable when using a DBCS code page (932: Japanese, 936: Simplified Chinese; 949: Korean; 950: Traditional Chinese) +# This applies to both the display and printing of these characters (see the [printer] section for details of the latter). +# blinkc: If set to true, the cursor blinks for the TTF output; setting it to false will turn the blinking off. +# You can also change the blinking rate by setting an integer between 1 (fastest) and 7 (slowest), or 0 for no cursor. +# gbk: Enables the GBK extension (in addition to the standard GB2312 charset) for the Simplified Chinese TTF output or DOS/V emulation. +# chinasea: Enables the ChinaSea and Big5-2003 extension (in addition to the standard Big5-1984 charset) for the Traditional Chinese TTF output. +# A TTF/OTF font containing such characters (such as the included SarasaGothicFixed TTF font) is needed to correctly render ChinaSea characters. +# dosvfunc: If set, enables FEP control to function for Japanese DOS/V applications, and changes the blinking of character attributes to high brightness. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> wpbg; wpfg; char512; autoboxdraw; halfwidthkana; uao +# +font = +fontbold = +fontital = +fontboit = +colors = +outputswitch = auto +winperc = 60 +ptsize = 0 +lins = 0 +cols = 0 +righttoleft = false +wp = +bold = true +italic = true +underline = true +strikeout = false +printfont = true +autodbcs = true +blinkc = true +gbk = false +chinasea = false +dosvfunc = false + +[voodoo] +# voodoo_card: Enable support for the 3dfx Voodoo card. +# Possible values: false, software, opengl, auto. +# voodoo_maxmem: Specify whether to enable maximum memory size for the Voodoo card. +# If set (on by default), the memory size will be 12MB (4MB front buffer + 2x4MB texture units) +# Otherwise, the memory size will be the standard 4MB (2MB front buffer + 1x2MB texture unit) +# glide: Enable Glide emulation (Glide API passthrough to the host). +# Requires a Glide wrapper - glide2x.dll (Windows), libglide2x.so (Linux), or libglide2x.dylib (macOS). +# lfb: Enable LFB access for Glide. OpenGlide does not support locking aux buffer, please use _noaux modes. +# Possible values: full, full_noaux, read, read_noaux, write, write_noaux, none. +# splash: Show 3dfx splash screen for Glide emulation (Windows; requires 3dfxSpl2.dll). +voodoo_card = auto +voodoo_maxmem = true +glide = false +lfb = full_noaux +splash = true + +[mixer] +# nosound: Enable silent mode, sound is still emulated though. +# sample accurate: Enable sample accurate mixing, at the expense of some emulation performance. Enable this option for DOS games and demos +# that require such accuracy for correct Tandy/OPL output including digitized speech. This option can also help eliminate +# minor errors in Gravis Ultrasound emulation that result in random echo/attenuation effects. +# swapstereo: Swaps the left and right stereo channels. +# rate: Mixer sample rate, setting any device's rate higher than this will probably lower their sound quality. +# blocksize: Mixer block size, larger blocks might help sound stuttering but sound will also be more lagged. +# Possible values: 1024, 2048, 4096, 8192, 512, 256. +# prebuffer: How many milliseconds of data to keep on top of the blocksize. +nosound = false +sample accurate = false +swapstereo = false +rate = 44100 +blocksize = 1024 +prebuffer = 25 + +[midi] +# mpu401: Type of MPU-401 to emulate. +# Possible values: intelligent, uart, none. +# mpubase: The IO address of the MPU-401. +# Set to 0 to use a default I/O address. +# 300h to 330h are for use with IBM PC mode. +# C0D0h to F8D0h (in steps of 800h) are for use with NEC PC-98 mode (MPU98). +# 80D2h through 80DEh are for use with NEC PC-98 Sound Blaster 16 MPU-401 emulation. +# If not assigned (0), 330h is the default for IBM PC and E0D0h is the default for PC-98. +# Possible values: 0, 300, 310, 320, 330, 332, 334, 336, 340, 360, c0d0, c8d0, d0d0, d8d0, e0d0, e8d0, f0d0, f8d0, 80d2, 80d4, 80d6, 80d8, 80da, 80dc, 80de. +# mididevice: Device that will receive the MIDI data from MPU-401. +# Possible values: default, win32, alsa, oss, coreaudio, coremidi, mt32, synth, fluidsynth, timidity, none. +# midiconfig: Special configuration options for the device driver. This is usually the id or part of the name of the device you want to use +# (find the id/name with mixer/listmidi). +# Or in the case of coreaudio or synth, you can specify a soundfont here. +# When using a Roland MT-32 rev. 0 as midi output device, some games may require a delay in order to prevent 'buffer overflow' issues. +# In that case, add 'delaysysex', for example: midiconfig=2 delaysysex +# See the README/Manual for more details. +# samplerate: Sample rate for MIDI synthesizer, if applicable. +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# mpuirq: MPU-401 IRQ. -1 to automatically choose. +# mt32.romdir: Name of the directory where MT-32 Control and PCM ROM files can be found. Emulation requires these files to work. +# Accepted file names are as follows: +# MT32_CONTROL.ROM or CM32L_CONTROL.ROM - control ROM file. +# MT32_PCM.ROM or CM32L_PCM.ROM - PCM ROM file. +# mt32.model: Model of the MT-32 synthesizer to use. +# Possible values: cm32l, mt32, auto. +# fluid.driver: Driver to use with Fluidsynth, not needed under Windows. Available drivers depend on what Fluidsynth was compiled with. +# Possible values: pulseaudio, alsa, oss, coreaudio, dsound, portaudio, sndman, jack, file, default. +# fluid.soundfont: Soundfont (.SF2 or .SF3) to use with Fluidsynth. One must be specified (e.g. GeneralUser_GS.sf2). +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> mt32.reverse.stereo; mt32.verbose; mt32.thread; mt32.chunk; mt32.prebuffer; mt32.partials; mt32.dac; mt32.analog; mt32.output.gain; mt32.reverb.mode; mt32.reverb.output.gain; mt32.reverb.time; mt32.reverb.level; mt32.rate; mt32.src.quality; mt32.niceampramp; fluid.samplerate; fluid.gain; fluid.polyphony; fluid.cores; fluid.periods; fluid.periodsize; fluid.reverb; fluid.chorus; fluid.reverb.roomsize; fluid.reverb.damping; fluid.reverb.width; fluid.reverb.level; fluid.chorus.number; fluid.chorus.level; fluid.chorus.speed; fluid.chorus.depth; fluid.chorus.type +# +mpu401 = intelligent +mpubase = 0 +mididevice = default +midiconfig = +samplerate = 44100 +mpuirq = -1 +mt32.romdir = +mt32.model = auto +fluid.driver = default +fluid.soundfont = + +[sblaster] +# sbtype: Type of Sound Blaster to emulate. 'gb' is Game Blaster. +# Possible values: sb1, sb2, sbpro1, sbpro2, sb16, sb16vibra, gb, ess688, reveal_sc400, none. +# sbbase: The IO address of the Sound Blaster. +# 220h to 2E0h are for use with IBM PC Sound Blaster emulation. +# D2h to DEh are for use with NEC PC-98 Sound Blaster 16 emulation. +# Possible values: 220, 240, 260, 280, 2a0, 2c0, 2e0, d2, d4, d6, d8, da, dc, de. +# irq: The IRQ number of the Sound Blaster (usually 5 or 7, depending on the sound card type and the game). +# Set to 0 for the default setting of the sound card, or set to -1 to start DOSBox-X with the IRQ unassigned. +# Possible values: 7, 5, 3, 9, 10, 11, 12, 0, -1. +# dma: The DMA number of the Sound Blaster. Set to -1 to start DOSBox-X with the DMA unassigned. +# Possible values: 1, 5, 0, 3, 6, 7, -1. +# hdma: The High DMA number of the Sound Blaster. Set to -1 to start DOSBox-X with the High DMA unassigned. +# Possible values: 1, 5, 0, 3, 6, 7, -1. +# enable speaker: Start the DOS virtual machine with the Sound Blaster speaker enabled. +# Sound Blaster Pro and older cards have a speaker disable/enable command. +# Normally the card boots up with the speaker disabled. If a DOS game or demo +# attempts to play without enabling the speaker, set this option to true to +# compensate. This setting has no meaning if emulating a Sound Blaster 16 card. +# sbmixer: Allow the Sound Blaster mixer to modify the DOSBox-X mixer. +# oplmode: Type of OPL emulation. On 'auto' the mode is determined by the 'sbtype' setting. +# All OPL modes are AdLib-compatible, except for 'cms' (set 'sbtype=none' with 'cms' for a Game Blaster). +# Possible values: auto, cms, opl2, dualopl2, opl3, opl3gold, none, hardware, hardwaregb. +# oplemu: Provider for the OPL emulation. 'compat' might provide better quality. +# 'nuked' is the most accurate (but the most CPU-intensive). See oplrate as well. +# Possible values: default, compat, fast, nuked, mame, opl2board, opl3duoboard, retrowave_opl3. +# oplrate: Sample rate of OPL music emulation. Use 49716 for highest quality (set the mixer rate accordingly). +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# oplport: Serial port of the OPL2 Audio Board when oplemu=opl2board, opl2mode will become 'opl2' automatically. +# retrowave_bus: Bus of the Retrowave series board (serial/spi). SPI is only supported on Linux. +# retrowave_port: Serial port of the Retrowave series board. +# hardwarebase: base address of the real hardware Sound Blaster: +# 210,220,230,240,250,260,280 +# goldplay: Enable goldplay emulation. +# blaster environment variable: Whether or not to set the BLASTER environment variable automatically at startup +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> mindma; irq hack; dsp command aliases; pic unmask irq; enable asp; disable filtering; dsp write buffer status must return 0x7f or 0xff; pre-set sbpro stereo; adlib force timer overflow on detect; retrowave_spi_cs; force dsp auto-init; force goldplay; goldplay stereo; dsp require interrupt acknowledge; dsp write busy delay; sample rate limits; instant direct dac; stereo control with sbpro only; dsp busy cycle rate; dsp busy cycle always; dsp busy cycle duty; io port aliasing +# +sbtype = sb16 +sbbase = 220 +irq = 7 +dma = 1 +hdma = 5 +enable speaker = false +sbmixer = true +oplmode = auto +oplemu = default +oplrate = 44100 +oplport = +retrowave_bus = serial +retrowave_port = +hardwarebase = 220 +goldplay = true +blaster environment variable = true + +[gus] +# gus: Enable the Gravis Ultrasound emulation. +# gusrate: Sample rate of Ultrasound emulation. +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# gusmemsize: Amount of RAM on the Gravis Ultrasound in KB. Set to -1 for default. +# gus master volume: Master Gravis Ultrasound GF1 volume, in decibels. Reducing the master volume can help with games or demoscene productions where the music is too loud and clipping. +# gusbase: The IO base address of the Gravis Ultrasound. +# Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300, 210, 230, 250. +# gusirq: The IRQ number of the Gravis Ultrasound. +# Possible values: 5, 3, 7, 9, 10, 11, 12. +# gusdma: The DMA channel of the Gravis Ultrasound. +# Possible values: 3, 0, 1, 5, 6, 7. +# gustype: Type of Gravis Ultrasound to emulate. +# classic Original Gravis Ultrasound chipset +# classic37 Original Gravis Ultrasound with ICS Mixer (rev 3.7) +# max Gravis Ultrasound MAX emulation (with CS4231 codec) +# interwave Gravis Ultrasound Plug & Play (interwave) +# Possible values: classic, classic37, max, interwave. +# ultradir: Path to Ultrasound directory. In this directory +# there should be a MIDI directory that contains +# the patch files for GUS playback. Patch sets used +# with Timidity should work fine. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> autoamp; unmask dma; ignore channel count while active; pic unmask irq; startup initialized; dma enable on dma control polling; clear dma tc irq if excess polling; force master irq enable; gus panning table; gus fixed render rate; irq hack +# +gus = false +gusrate = 44100 +gusmemsize = -1 +gus master volume = 0.00 +gusbase = 240 +gusirq = 5 +gusdma = 3 +gustype = classic +ultradir = C:\ULTRASND + +[innova] +# innova: Enable the Innovation SSI-2001 emulation. +# samplerate: Sample rate of Innovation SSI-2001 emulation +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# sidbase: SID base port (typically 280h). +# Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300. +# quality: Set SID emulation quality level (0 to 3). +# Possible values: 0, 1, 2, 3. +innova = false +samplerate = 22050 +sidbase = 280 +quality = 0 + +[speaker] +# pcspeaker: Enable PC-Speaker emulation. +# pcrate: Sample rate of the PC-Speaker sound generation. +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# tandy: Enable Tandy Sound System emulation. For 'auto', emulation is present only if machine is set to 'tandy'. +# Possible values: auto, on, off. +# tandyrate: Sample rate of the Tandy 3-Voice generation. +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# disney: Enable Disney Sound Source emulation. (Covox Voice Master and Speech Thing compatible). +# ps1audio: Enable PS1 audio emulation. +# Possible values: on, off. +# ps1audiorate: Sample rate of the PS1 audio emulation. +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> pcspeaker clock gate enable at startup; initial frequency +# +pcspeaker = true +pcrate = 65536 +tandy = auto +tandyrate = 44100 +disney = false +ps1audio = off +ps1audiorate = 22050 + +[joystick] +# joysticktype: Type of joystick to emulate: auto (default), +# none (disables joystick emulation), +# 2axis (supports two joysticks), +# 4axis (supports one joystick, first joystick used), +# 4axis_2 (supports one joystick, second joystick used), +# fcs (Thrustmaster), ch (CH Flightstick). +# auto chooses emulation depending on real joystick(s). +# (Remember to reset DOSBox-X's mapperfile if you saved it earlier) +# Possible values: auto, 2axis, 4axis, 4axis_2, fcs, ch, none. +# timed: enable timed intervals for axis. Experiment with this option, if your joystick drifts (away). +# autofire: continuously fires as long as you keep the button pressed. +# swap34: swap the 3rd and the 4th axis. can be useful for certain joysticks. +# buttonwrap: enable button wrapping at the number of emulated buttons. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> joy1deadzone1; joy1deadzone2; joy2deadzone1; joy1response1; joy1response2; joy2response1; joy1axis0; joy1axis1; joy1axis2; joy1axis3; joy1axis4; joy1axis5; joy1axis6; joy1axis7; joy2axis0; joy2axis1; joy2axis2; joy2axis3; joy2axis4; joy2axis5; joy2axis6; joy2axis7 +# +joysticktype = auto +timed = true +autofire = false +swap34 = false +buttonwrap = false + +[mapper] +# joy1deadzone0-: deadzone for joystick 1 axis 0- +# joy1deadzone0+: deadzone for joystick 1 axis 0+ +# joy1deadzone1-: deadzone for joystick 1 axis 1- +# joy1deadzone1+: deadzone for joystick 1 axis 1+ +# joy1deadzone2-: deadzone for joystick 1 axis 2- +# joy1deadzone2+: deadzone for joystick 1 axis 2+ +# joy1deadzone3-: deadzone for joystick 1 axis 3- +# joy1deadzone3+: deadzone for joystick 1 axis 3+ +# joy1deadzone4-: deadzone for joystick 1 axis 4- +# joy1deadzone4+: deadzone for joystick 1 axis 4+ +# joy1deadzone5-: deadzone for joystick 1 axis 5- +# joy1deadzone5+: deadzone for joystick 1 axis 5+ +# joy1deadzone6-: deadzone for joystick 1 axis 6- +# joy1deadzone6+: deadzone for joystick 1 axis 6+ +# joy1deadzone7-: deadzone for joystick 1 axis 7- +# joy1deadzone7+: deadzone for joystick 1 axis 7+ +# joy2deadzone0-: deadzone for joystick 2 axis 0- +# joy2deadzone0+: deadzone for joystick 2 axis 0+ +# joy2deadzone1-: deadzone for joystick 2 axis 1- +# joy2deadzone1+: deadzone for joystick 2 axis 1+ +# joy2deadzone2-: deadzone for joystick 2 axis 2- +# joy2deadzone2+: deadzone for joystick 2 axis 2+ +# joy2deadzone3-: deadzone for joystick 2 axis 3- +# joy2deadzone3+: deadzone for joystick 2 axis 3+ +# joy2deadzone4-: deadzone for joystick 2 axis 4- +# joy2deadzone4+: deadzone for joystick 2 axis 4+ +# joy2deadzone5-: deadzone for joystick 2 axis 5- +# joy2deadzone5+: deadzone for joystick 2 axis 5+ +# joy2deadzone6-: deadzone for joystick 2 axis 6- +# joy2deadzone6+: deadzone for joystick 2 axis 6+ +# joy2deadzone7-: deadzone for joystick 2 axis 7- +# joy2deadzone7+: deadzone for joystick 2 axis 7+ +joy1deadzone0- = 0.60 +joy1deadzone0+ = 0.60 +joy1deadzone1- = 0.60 +joy1deadzone1+ = 0.60 +joy1deadzone2- = 0.60 +joy1deadzone2+ = 0.60 +joy1deadzone3- = 0.60 +joy1deadzone3+ = 0.60 +joy1deadzone4- = 0.60 +joy1deadzone4+ = 0.60 +joy1deadzone5- = 0.60 +joy1deadzone5+ = 0.60 +joy1deadzone6- = 0.60 +joy1deadzone6+ = 0.60 +joy1deadzone7- = 0.60 +joy1deadzone7+ = 0.60 +joy2deadzone0- = 0.60 +joy2deadzone0+ = 0.60 +joy2deadzone1- = 0.60 +joy2deadzone1+ = 0.60 +joy2deadzone2- = 0.60 +joy2deadzone2+ = 0.60 +joy2deadzone3- = 0.60 +joy2deadzone3+ = 0.60 +joy2deadzone4- = 0.60 +joy2deadzone4+ = 0.60 +joy2deadzone5- = 0.60 +joy2deadzone5+ = 0.60 +joy2deadzone6- = 0.60 +joy2deadzone6+ = 0.60 +joy2deadzone7- = 0.60 +joy2deadzone7+ = 0.60 + +[serial] +# serial1: serial1-9 -- set type of device connected to the serial (COM) port. +# Can be disabled, dummy, file, modem, nullmodem, directserial. +# Additional parameters must be in the same line in the form of +# parameter:value. Parameter for all types is irq (optional). +# for file: specify an output file +# Additional parameters: +# timeout: = how long to wait before closing the file on inactivity (default:0), +# squote to use single quotes instead of double quotes for quoted program commands. +# shellhide to hide the command window when opening programs on the Windows platform. +# openwith:: start a program to open the output file. +# openerror:: start a program to open the output file if an error had occurred. +# Example: serial1=file file:output1.txt timeout:1000 openwith:notepad +# for directserial: realport (required), rxdelay (optional). +# (realport:COM1 realport:ttyS0). +# for modem: listenport (optional). +# for nullmodem: server, rxdelay, txdelay, telnet, usedtr, +# transparent, port, inhsocket, sock, nonlocal (all optional). +# connections are limited to localhost unless you specify nonlocal:1 +# "sock" parameter specifies the protocol to be used by both sides +# of the conection. 0 for TCP and 1 for ENet reliable UDP. +# Example: serial1=modem listenport:5000 sock:1 +# Note: COM1-4 are standard COM ports in DOS, whereas COM5-9 are extended COM ports. +# You can optionally specify base addresses and IRQs for them with base: and irq: options. +# Serial port settings can also be changed via the built-in SERIAL command. +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial2: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial3: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial4: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial5: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial6: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial7: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial8: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial9: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# phonebookfile: File used to map fake phone numbers to addresses. +serial1 = dummy +serial2 = disabled +serial3 = disabled +serial4 = disabled +serial5 = disabled +serial6 = disabled +serial7 = disabled +serial8 = disabled +serial9 = disabled +phonebookfile = phonebook-dosbox-x.txt + +[parallel] +# parallel1: parallel1-9 -- set type of device connected to the parallel (LPT) port. +# Can be: +# reallpt (direct parallel port passthrough), +# file (records data to a file or passes it to a device), +# printer (virtual dot-matrix printer, see [printer] section) +# disney (attach Disney Sound Source emulation to this port) +# Additional parameters must be in the same line in the form of +# parameter:value. +# for reallpt: +# Windows: +# realbase (the base address of your real parallel port). +# Default: 378 +# ecpbase (base address of the ECP registers, optional). +# Linux: realport (the parallel port device i.e. /dev/parport0). +# for file: +# dev: (i.e. dev:lpt1) to forward data to a device, +# or append: appends data to the specified file. +# Without the above parameters data is written to files in the capture dir. +# Additional parameters: +# timeout: = how long to wait before closing the file on inactivity (default:0 or 500), +# squote to use single quotes instead of double quotes for quoted program commands. +# shellhide to hide the command window when opening programs on the Windows platform. +# addFF to add a formfeed when closing, addLF to add a linefeed if the app doesn't. +# cp: to perform codepage translation, i.e. cp:437 +# openps:: start a program to open the file if the print output is detected to be PostScript. +# openpcl:: start a program to open the file if the print output is detected to be PCL. +# openwith:: start a program to open the file in all other conditions. +# openerror:: start a program to open the file if an error had occurred. +# Example: parallel1=file file:output1.prn timeout:1000 openpcl:pcl6 openps:gswin32c openwith:notepad +# for printer: +# printer still has its own configuration section above. +# Note: LPT1-3 are standard LPT ports in DOS, whereas LPT4-9 are extended LPT ports. +# You can optionally specify base addresses and IRQs for them with base: and irq: options. +# Parallel port settings can also be changed via the built-in PARALLEL command. +# parallel2: see parallel1 +# parallel3: see parallel1 +# parallel4: see parallel1 +# parallel5: see parallel1 +# parallel6: see parallel1 +# parallel7: see parallel1 +# parallel8: see parallel1 +# parallel9: see parallel1 +# dongle: Enable dongle +parallel1 = printer +parallel2 = disabled +parallel3 = disabled +parallel4 = disabled +parallel5 = disabled +parallel6 = disabled +parallel7 = disabled +parallel8 = disabled +parallel9 = disabled +dongle = false + +[printer] +# printer: Enable printer emulation. +# dpi: Resolution of printer (default 360). +# width: Width of paper in 1/10 inch (default 85 = 8.5''). +# height: Height of paper in 1/10 inch (default 110 = 11.0''). +# printoutput: Output method for finished pages: +# png : Creates PNG images (default) +# ps : Creates PostScript +# bmp : Creates BMP images (very huge files, not recommended) +# printer : Send to an actual printer in Windows (specify a printer, or Print dialog will appear) +# multipage: Adds all pages to one PostScript file or printer job until CTRL-F2 is pressed. +# device: Specify the Windows printer device to use. You can see the list of devices from the Help +# menu ('List printer devices') or the Status Window. Then make your choice and put either +# the printer device number (e.g. 2) or your printer name (e.g. Microsoft Print to PDF). +# Leaving it empty will show the Windows Print dialog (or '-' for showing once). +# docpath: The path (directory) where the output files are stored. +# fontpath: The path (directory) where the printer fonts (courier.ttf, ocra.ttf, roman.ttf, sansserif.ttf, script.ttf) are located. +# openwith: Start the specified program to open the output file. +# openerror: Start the specified program to open the output file if an error had occurred. +# printdbcs: Allows DOSBox-X to print Chinese/Japanese/Korean DBCS (double-byte) characters when these code pages are active. +# If set to auto (default), this is enabled only for the TrueType font (TTF) output with the DBCS support enabled. +# Only applicable when using a DBCS code page (932: Japanese, 936: Simplified Chinese; 949: Korean; 950: Traditional Chinese) +# Possible values: true, false, 1, 0, auto. +# shellhide: If set, the command window will be hidden for openwith/openerror options on the Windows platform. +# timeout: (in milliseconds) if nonzero: the time the page will be ejected automatically after when no more data arrives at the printer. +printer = true +dpi = 360 +width = 85 +height = 110 +printoutput = printer +multipage = false +device = - +docpath = . +fontpath = FONTS +openwith = +openerror = +printdbcs = auto +shellhide = false +timeout = 0 + +[dos] +# xms: Enable XMS support. +# xms handles: Number of XMS handles available for the DOS environment, or 0 to use a reasonable default +# shell configuration as commands: Allow entering dosbox-x.conf configuration parameters as shell commands to get and set settings. +# This is disabled by default to avoid conflicts between commands and executables. +# It is recommended to get and set dosbox-x.conf settings using the CONFIG command instead. +# Compatibility with DOSBox SVN can be improved by enabling this option. +# hma: Report through XMS that HMA exists (not necessarily available) +# hard drive data rate limit: Slow down (limit) hard disk throughput. This setting controls the limit in bytes/second. +# Set to 0 to disable the limit, or -1 (default) to use a reasonable limit. +# The disk I/O performance as in DOSBox SVN can be achieved by setting this to 0. +# floppy drive data rate limit: Slow down (limit) floppy disk throughput. This setting controls the limit in bytes/second. +# Set to 0 to disable the limit, or -1 (default) to use a reasonable limit. +# The disk I/O performance as in DOSBox SVN can be achieved by setting this to 0. +# ansi.sys: If set (by default), ANSI.SYS emulation is on. If clear, ANSI.SYS is not emulated and will not appear to be installed. +# NOTE: This option has no effect in PC-98 mode where MS-DOS systems integrate ANSI.SYS into the DOS kernel. +# log console: If set, log DOS CON output to the log file. Setting to "quiet" will log DOS CON output only (no debugging output). +# Possible values: true, false, 1, 0, quiet. +# share: Reports SHARE.EXE as resident and provides functions such as file-locking and record-locking, although not all SHARE functions are emulated. +# file access tries: If a positive integer is set, DOSBox-X will try to read/write/lock files directly on mounted local drives for the specified number of times without caching before failing on Windows systems. +# For networked database applications (e.g. dBase, FoxPro, etc), it is strongly recommended to set this to e.g. 3 for correct operations. +# network redirector: Report DOS network redirector as resident. This will allow the host name to be returned unless the secure mode is enabled. +# You can also directly access UNC network paths in the form \\MACHINE\SHARE even if they are not mounted as drives on Windows systems. +# Set either "ipx=true" in [ipx] section or "ne2000=true" in [ne2000] section for a full network redirector environment. +# minimum mcb free: Minimum free segment value to leave free. At startup, the DOS kernel will allocate memory +# up to this point. This can be used to deal with EXEPACK issues or DOS programs that cannot +# be loaded too low in memory. If you want more free conventional memory to be reported, +# you can for example set its value to 1. +# ems: Enable EMS support. The default (=true) provides the best +# compatibility but certain applications may run better with +# other choices, or require EMS support to be disabled (=false) +# to work at all. +# Possible values: true, emsboard, emm386, false, 1, 0. +# umb: Enable UMB support. +# quick reboot: If set, the DOS restart call will reboot the emulated DOS (integrated DOS or guest DOS) instead of the virtual machine. +# +# ver: Set DOS version. Specify as major.minor format. A single number is treated as the major version (compatible with LFN support). Common settings are: +# auto (or unset) Pick a DOS kernel version automatically +# 3.3 MS-DOS 3.3 emulation (not tested!) +# 5.0 MS-DOS 5.0 emulation (recommended for DOS gaming) +# 6.22 MS-DOS 6.22 emulation +# 7.0 MS-DOS 7.0 (or Windows 95 pure DOS mode) emulation +# 7.1 MS-DOS 7.1 (or Windows 98 pure DOS mode) emulation +# Long filename (LFN) support will be enabled with a reported DOS version of 7.0 or higher with "lfn=auto" (default). +# Similarly, FAT32 disk images will be supported with a reported DOS version of 7.1 or higher. +# +# lfn: Enable long filename support. If set to auto (default), LFN support is enabled if the reported DOS version is at least 7.0. +# If set to autostart, the built-in VER command won't activate/deactivate LFN support according to the reported DOS version. +# Possible values: true, false, 1, 0, auto, autostart. +# fat32setversion: Whether DOSBox-X should automatically set the reported DOS version to 7.0/7.10 when it is less than 7.0/7.10 and mounting LBA/FAT32 disk images is requested. +# If set to "ask", a popup message will show up to ask whether DOSBox-X should automatically change the reported DOS version in order to mount the disk image. +# Possible values: ask, auto, manual. +# shellhigh: Load the DOSBox-X command shell into the upper memory when the UMB is available. +# If set to auto (default), it is enabled if the reported DOS version is at least 7.0. +# Possible values: true, false, 1, 0, auto. +# automount: Enable automatic drive mounting in Windows. +# automountall: Automatically mount all available Windows drives at start. +# Possible values: true, false, 1, 0, quiet. +# mountwarning: If set, a warning message will be displayed while trying to auto-mount your Windows host drives. +# autofixwarning: If set to true or both, DOSBox-X shows messages while trying to automatically fix the "Packed file is corrupt" error. +# If set to false or none, DOSBox-X will not show such messages on the screen when the error occurred. +# If set to "a20fix" or "loadfix", DOSBox-X will show the message for the a20fix or the loadfix only. +# Possible values: true, false, 1, 0, both, a20fix, loadfix, none. +# startcmd: Enable START command to start programs to run on the host system. On Windows host programs or commands may also be launched directly. +# starttranspath: Specify whether DOSBox-X should automatically translate all paths in the command-line to host system paths when starting programs to run on the host system. +# startwait: Specify whether DOSBox-X should wait for the host system applications after they are started. +# startquiet: If set, before launching host system applications to run on the host DOSBox-X will not show messages like "Now run it as a Windows application". +# vmware: Enable VMware interface emulation including guest mouse integration (when used along with e.g. VMware mouse driver for Windows 3.x). +# int33: Enable INT 33H for mouse support. +# keyboardlayout: Language code of the keyboard layout (or none). +# customcodepage: Set a custom code page for CHCP command and specify a SBCS code page file, following the standard SBCS code page format. +# Examples of SBCS code pages are available from the Unicode Consortium website: https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/ +# dbcs: Enable DBCS table and Chinese, Japanese, Korean support for the TrueType font (TTF) output. +# CAUTION: Some software will crash without the DBCS table, including the Open Watcom installer. +# dos clipboard device enable: If enabled, a DOS device will be added for bidirectional communications with the shared clipboard. +# Setting to "read" will only allow read access, and setting to "write" will only allow write access. +# Setting to "full" or "true" enables both; setting to "false" or "disabled" disables the access or device. +# The default device name is CLIP$, but can be changed with the "dos clipboard device name" setting below. +# dos clipboard device name: Set DOS device name (up to 8 characters) for bidirectional communications with the shared clipboard. +# If unset or invalid, the default name CLIP$ will be used (e.g. "TYPE CLIP$" shows the clipboard contents). +# It has no effect if "dos clipboard device enable" is disabled, and it is deactivated if the secure mode is enabled. +# dos clipboard api: If set, DOS APIs for communications with the Windows clipboard will be enabled for shared clipboard communications. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> badcommandhandler; hma allow reservation; special operation file prefix; drive z is remote; drive z convert fat; drive z expand path; drive z hide files; hidenonrepresentable; hma minimum allocation; dos sda size; hma free space; cpm compatibility mode; minimum dos initial private segment; minimum mcb segment; enable dummy device mcb; maximum environment block size on exec; additional environment block size on exec; enable a20 on windows init; zero memory on xms memory allocation; vcpi; unmask timer on disk io; zero int 67h if no ems; zero unused int 68h; emm386 startup active; zero memory on ems memory allocation; ems system handle memory size; ems system handle on even megabyte; umb start; umb end; kernel allocation in umb; keep umb on boot; keep private area on boot; private area in umb; autoa20fix; autoloadfix; startincon; int33 hide host cursor if interrupt subroutine; int33 hide host cursor when polling; int33 disable cell granularity; int 13 disk change detect; int 13 extensions; biosps2; int15 wait force unmask irq; int15 mouse callback does not preserve registers; filenamechar; collating and uppercase; con device use int 16h to detect keyboard input; zero memory on int 21h memory allocation; pipe temporary device +# +xms = true +xms handles = 0 +shell configuration as commands = false +hma = true +hard drive data rate limit = 0 +floppy drive data rate limit = 0 +ansi.sys = true +log console = false +share = true +file access tries = 3 +network redirector = true +minimum mcb free = 0 +ems = true +umb = true +quick reboot = false +ver = +lfn = auto +fat32setversion = ask +shellhigh = auto +automount = true +automountall = false +mountwarning = true +autofixwarning = false +startcmd = false +starttranspath = true +startwait = true +startquiet = false +vmware = true +int33 = true +keyboardlayout = auto +customcodepage = +dbcs = true +dos clipboard device enable = false +dos clipboard device name = CLIP$ +dos clipboard api = true + +[ipx] +# ipx: Enable ipx over UDP/IP emulation. +ipx = false + +[ne2000] +# ne2000: Enable NE2000 Ethernet emulation. Either pcap or slirp backend can be used, switchable via "backend" option. +# Settings for the pcap and slirp backends can be found in the [ethernet, pcap] and [ethernet, slirp] sections. +# Once properly set, load the NE2000 packet driver inside DOSBox-X with base address and interrupt specified below. +# nicbase: The base address of the NE2000 board. +# nicirq: The interrupt it uses. Note serial2 uses IRQ3 as default. +# macaddr: The MAC address the emulator will use for its network adapter. +# If you have multiple DOSBox-Xes running on the same network, +# this has to be changed for each. AC:DE:48 is an address range reserved for +# private use, so modify the last three number blocks, e.g. AC:DE:48:88:99:AB. +# backend: The backend (either pcap or slirp is supported) used for the NE2000 Ethernet emulation. +# If set to "auto", then "slirp" is selected when available, otherwise "pcap" is selected when available. +# NE2000 Ethernet emulation will be disabled if no backend is available (or the specified backend if unavailable). +# Possible values: pcap, slirp, auto, none. +ne2000 = true +nicbase = 300 +nicirq = 10 +macaddr = AC:DE:48:88:99:AA +backend = slirp + +[ethernet, pcap] +# realnic: Specifies which of your host network interfaces is used for pcap. +# Write 'list' here to see the list of devices from the Help +# menu ('List network interfaces') or from the Status Window. +# Then make your choice and put either the interface number +# (e.g. 2) or a part of your adapters name (e.g. VIA here). +# timeout: Specifies the read timeout for the device in milliseconds for the pcap backend, or the default value will be used. +realnic = list +timeout = default + +[ethernet, slirp] +# ipv4_network: The IPv4 network the guest and host services are on. +# ipv4_netmask: The netmask for the IPv4 network. +# ipv4_host: The address of the guest on the IPv4 network. +# ipv4_nameserver: The address of the nameserver service provided by the host on the IPv4 network. +# ipv4_dhcp_start: The start address used for DHCP by the host services on the IPv4 network. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> restricted; disable_host_loopback; mtu; mru; tcp_port_forwards; udp_port_forwards +# +ipv4_network = 10.0.2.0 +ipv4_netmask = 255.255.255.0 +ipv4_host = 10.0.2.2 +ipv4_nameserver = 10.0.2.3 +ipv4_dhcp_start = 10.0.2.15 + +[ide, primary] +# enable: Enable IDE interface +# pnp: List IDE device in ISA PnP BIOS enumeration +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> irq; io; altio; int13fakeio; int13fakev86io; enable pio32; ignore pio32; cd-rom spinup time; cd-rom spindown timeout; cd-rom insertion delay +# +enable = true +pnp = true + +[ide, secondary] +enable = true +pnp = true + +[ide, tertiary] +enable = false +pnp = true + +[ide, quaternary] +enable = false +pnp = true + +[ide, quinternary] +enable = false +pnp = true + +[ide, sexternary] +enable = false +pnp = true + +[ide, septernary] +enable = false +pnp = true + +[ide, octernary] +enable = false +pnp = true + +[fdc, primary] +# enable: Enable floppy controller interface +# pnp: List floppy controller in ISA PnP BIOS enumeration +# mode: Floppy controller mode. What the controller acts like. +# ps2 PS/2 mode (most common) +# ps2_model30 PS/2 model 30 +# at AT mode +# xt PC/XT mode +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> irq; io; dma; int13fakev86io; instant mode; auto-attach to int 13h; chip +# +enable = false +pnp = true +mode = ps2 + +[4dos] +rem = This section is the 4DOS.INI file, if you use 4DOS as the command shell + +[config] +# rem: Records comments (remarks). +# break: Sets or clears extended CTRL+C checking. +# Possible values: on, off. +# numlock: Sets the initial state of the NumLock key. +# Possible values: on, off. +# shell: Specifies the command shell (COMMAND.COM or 4DOS.COM). +# dos: Reports whether DOS occupies HMA and allocates UMB memory (if available). +# fcbs: Number of FCB handles available to DOS programs (1-255). +# files: Number of file handles available to DOS programs (8-255). +# country: Country code for date/time/decimal formats and optionally code page for TTF output and language files. +# lastdrive: The maximum drive letter (A-Z) that can be accessed by programs. +# Possible values: a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z. +rem = This section is DOS's CONFIG.SYS file, not all CONFIG.SYS options supported +break = off +numlock = +shell = +dos = high, umb +fcbs = 100 +files = 200 +country = +lastdrive = a +set path = Z:\;Z:\SYSTEM;Z:\BIN;Z:\DOS;Z:\4DOS;Z:\DEBUG;Z:\TEXTUTIL +set prompt = $P$G +set temp = +install = +installhigh = +device = +devicehigh = + +[autoexec] +# Lines in this section will be run at startup. +# You can put your MOUNT lines here. +@ECHO OFF +config -set turbo=true +MOUNT C ".\DRIVE_C" +C: +IF EXIST C:\WINDOWS\IFSHLP.SYS GOTO WFW +IF EXIST C:\WINDOWS\WIN.COM GOTO WINDOWS +GOTO END + +:WFW +echo Starting Windows for Workgroups 3.1x +SET PATH=%PATH%;C:\WINDOWS; +SET TEMP=C:\WINDOWS\TEMP +DEVICE C:\WINDOWS\IFSHLP.SYS +C:\WINDOWS\NET.EXE START +REM C:\WINDOWS\WIN.COM +GOTO END + +:WINDOWS +echo Starting Windows for 3.x +SET PATH=%PATH%;C:\WINDOWS; +SET TEMP=C:\WINDOWS\TEMP +REM C:\WINDOWS\WIN.COM +GOTO END + +:END +REM exit diff --git a/installers/dosboxw31/INSTALLERS/mouse/oemsetup.inf b/installers/dosboxw31/INSTALLERS/mouse/oemsetup.inf new file mode 100644 index 0000000..d52b993 --- /dev/null +++ b/installers/dosboxw31/INSTALLERS/mouse/oemsetup.inf @@ -0,0 +1,11 @@ +[data] + Version = "3.1" + +[disks] + 1 =. ,"DOSBox-X Guest Additions for Windows 3.1 Disk",disk1 + +[pointing.device] +;profile = mouse driver, description, vmd, dos mouse driver base name +; +dboxmpi = 1:dboxmpi.drv, "DOSBox-X Mouse Pointer Integration", x:*vmd,dboxmpi + diff --git a/installers/dosboxw31/INSTALLERS/mouse/source.zip b/installers/dosboxw31/INSTALLERS/mouse/source.zip new file mode 100644 index 0000000..567e0ef Binary files /dev/null and b/installers/dosboxw31/INSTALLERS/mouse/source.zip differ diff --git a/installers/dosboxw31/INSTALLERS/msunpak-source.zip b/installers/dosboxw31/INSTALLERS/msunpak-source.zip new file mode 100644 index 0000000..7be90ff Binary files /dev/null and b/installers/dosboxw31/INSTALLERS/msunpak-source.zip differ diff --git a/installers/dosboxw31/INSTALLERS/msunpak.exe b/installers/dosboxw31/INSTALLERS/msunpak.exe new file mode 100644 index 0000000..bb776d2 Binary files /dev/null and b/installers/dosboxw31/INSTALLERS/msunpak.exe differ diff --git a/installers/dosboxw31/_WFW311AUTOINSTALLER_.bat b/installers/dosboxw31/_WFW311AUTOINSTALLER_.bat new file mode 100644 index 0000000..3eea24c --- /dev/null +++ b/installers/dosboxw31/_WFW311AUTOINSTALLER_.bat @@ -0,0 +1,1228 @@ +@echo off +echo DOSBox-X + Windows 3.11 ENG autoinstaller +echo. +echo This installed DOES NOT provide Windows 3.11 files. +echo. +echo You need to place your own installation files in .\installers\INST311 directory. +echo. +echo You can either copy all files from the floppy disks to .\installers\INST311 directory, +echo or copy disk images in .IMG format to .\installers\INST311 +echo. +echo Only English Windows 3.11 version will work with this script. +echo Other files - redistributables, updates and configuration files - will be downloaded automatically. +echo. +echo If required Windows 3.11 files are not present, you will be prompted to copy them to appropriate directory. +echo. +if not "%1"=="quiet" pause + +pushd "%~dp0" +cd .. +cd .. +cd installers +SET DBOXIN=%CD% +cd 7-zip +SET ZPATH=%CD% +pushd "%~dp0" + + + +if not exist "%~dp0\INSTALLERS\" ( +mkdir "%~dp0\INSTALLERS" +) + + + + +if not exist "%~dp0\INSTALLERS\INST311\gdi.ex_" ( +if not exist "%~dp0\INSTALLERS\INST311\*.img" ( + +mkdir "%~dp0\INSTALLERS\INST311" +echo "" > "%~dp0\INSTALLERS\INST311\_PLACE_WIN311_FILES_HERE_" +echo. +echo Windows 3.11 files not found. Please copy them from floppy disks or place disk images here. +timeout /t 1 > nul +cd "%~dp0\INSTALLERS\INST311\" +start. +cd "%~dp0" +echo. +pause +) +) + + + + +if not exist "%ZPATH%\7zr.exe" ( +mkdir .\installers\7-zip +echo Downloading 7-zip +powershell wget https://www.7-zip.org/a/7zr.exe -UseBasicParsing -OutFile "%~dp0\installers\7-zip\7zr.exe" +powershell wget https://www.7-zip.org/a/7z2201.exe -UseBasicParsing -OutFile "%~dp0\installers\7-zip\7z2201.exe" +"%~dp0\installers\7-zip\7zr.exe" x "%~dp0\installers\7-zip\7z2201.exe" -aoa -o"%~dp0\installers\7-zip" +) + +if not exist "%ZPATH%\7z.exe" ( +"%~dp0\installers\7-zip\7zr.exe" x "%~dp0\installers\7-zip\7z2201.exe" -aoa -o"%~dp0\installers\7-zip" +) + + + +if exist "%~dp0\INSTALLERS\INST311\*.img" ( +if not exist "%~dp0\INSTALLERS\INST311\gdi.ex_" ( + +cd "%~dp0\INSTALLERS\INST311\" +"%ZPATH%\7z.exe" x *.img -o. +) +) + + + + +pushd "%~dp0" + +if not exist "%~dp0\dosbox-x.exe" ( + + +if not exist "%DBOXIN%\dosbox-x-mingw*."%tempfile%" powershell "$dpi = try { (Get-ItemPropertyValue -Path 'HKCU:\Control Panel\Desktop' -Name 'LogPixels') } catch { try { powershell (Get-ItemPropertyValue -Path 'HKCU:\Control Panel\Desktop\WindowMetrics' -Name 'AppliedDPI') } catch { 96 } } ; if ($dpi -In -999..113) { echo 640x480 } ; if ($dpi -In 114..134) { echo 800x600 } ; if ($dpi -In 135..164) { echo 960x720 } ; if ($dpi -In 165..182) { echo 1120x840 } ; if ($dpi -In 183..999) { echo 1280x960 } " + +set /p RESOLUTIONSTRING=<"%tempfile%" +del /q "%tempfile%" + +echo Scaling 640x480 to: +echo %RESOLUTIONSTRING% + +powershell "Get-Content 'dosbox-x.conf' | Foreach-Object {$_ -replace '^windowresolution.+$','windowresolution = %RESOLUTIONSTRING%'} | Set-Content 'dosbox-x.new'" + +if exist "dosbox-x.new" ( +del /Q dosbox-x.conf.bak +rename dosbox-x.conf dosbox-x.conf.bak +rename dosbox-x.new dosbox-x.conf +) + + +echo Done +if not "%1"=="quiet" pause diff --git a/installers/dosboxw31/w31launcher.bat b/installers/dosboxw31/w31launcher.bat new file mode 100644 index 0000000..a8220cd --- /dev/null +++ b/installers/dosboxw31/w31launcher.bat @@ -0,0 +1,20 @@ +@echo off + +if exist "%~1" ( +echo Startup directory: %~dp1 +echo Executable name: %~nx1 + +echo Executing in DOSBox-X Win3.11... +cd "%~dp0" +dosbox-x.exe -c "MOUNT D: '%~dp1' " -c "C:\WINDOWS\WIN.COM D:\%~nx1 " -c "exit " +REM timeout /t 5 +REM del /Q "%~dp1\launchit.cfg" +) + +if not exist "%~1" ( +echo This scripts will run given executable in Windows 3.11 inside DOSBox-X. +echo. +echo Usage: +echo w31launcher.bat "PathToExecutable.exe" +echo. +) diff --git a/installers/dosboxw95/CONFIG_SCRIPTS/1024x768_16bpp_DPI-scaled.bat b/installers/dosboxw95/CONFIG_SCRIPTS/1024x768_16bpp_DPI-scaled.bat new file mode 100644 index 0000000..1e5d34e --- /dev/null +++ b/installers/dosboxw95/CONFIG_SCRIPTS/1024x768_16bpp_DPI-scaled.bat @@ -0,0 +1,30 @@ +@echo off +pushd "%~dp0" +cd .. + +echo Checking DPI and setting correct scaling for 1024x768 +echo. +echo System DPI: +powershell "$dpi = try { (Get-ItemPropertyValue -Path 'HKCU:\Control Panel\Desktop' -Name 'LogPixels') } catch { try { powershell (Get-ItemPropertyValue -Path 'HKCU:\Control Panel\Desktop\WindowMetrics' -Name 'AppliedDPI') } catch { 96 } }; echo $dpi " +echo. + +set "tempfile=tmpresfil.tmp" +>"%tempfile%" powershell "$dpi = try { (Get-ItemPropertyValue -Path 'HKCU:\Control Panel\Desktop' -Name 'LogPixels') } catch { try { powershell (Get-ItemPropertyValue -Path 'HKCU:\Control Panel\Desktop\WindowMetrics' -Name 'AppliedDPI') } catch { 96 } }; if ($dpi -In -999..113) { echo 1024x768 } ; if ($dpi -In 114..134) { echo 1280x960 } ; if ($dpi -In 135..164) { echo 1536x1152 } ; if ($dpi -In 165..182) { echo 1792x1344 } ; if ($dpi -In 183..999) { echo 2048x1536 } " + +set /p RESOLUTIONSTRING=<"%tempfile%" +del /q "%tempfile%" + +echo Scaling 1024x768 to: +echo %RESOLUTIONSTRING% + +powershell "Get-Content 'dosbox-x.conf' | Foreach-Object {$_ -replace '^windowresolution.+$','windowresolution = %RESOLUTIONSTRING%'} | Set-Content 'dosbox-x.new'" + +if exist "dosbox-x.new" ( +del /Q dosbox-x.conf.bak +rename dosbox-x.conf dosbox-x.conf.bak +rename dosbox-x.new dosbox-x.conf +) + +REM del /Q ".\guest_tools\runonce\runonce.bat" +echo. >> ".\guest_tools\runonce\runonce.bat" +type ".\guest_tools\guest-scripts\1024_16bpp.bat" >> ".\guest_tools\runonce\runonce.bat" \ No newline at end of file diff --git a/installers/dosboxw95/CONFIG_SCRIPTS/640x480_16bpp_DPI-scaled.bat b/installers/dosboxw95/CONFIG_SCRIPTS/640x480_16bpp_DPI-scaled.bat new file mode 100644 index 0000000..7661988 --- /dev/null +++ b/installers/dosboxw95/CONFIG_SCRIPTS/640x480_16bpp_DPI-scaled.bat @@ -0,0 +1,30 @@ +@echo off +pushd "%~dp0" +cd .. + +echo Checking DPI and setting correct scaling for 640x480 +echo. +echo System DPI: +powershell "$dpi = try { (Get-ItemPropertyValue -Path 'HKCU:\Control Panel\Desktop' -Name 'LogPixels') } catch { try { powershell (Get-ItemPropertyValue -Path 'HKCU:\Control Panel\Desktop\WindowMetrics' -Name 'AppliedDPI') } catch { 96 } }; echo $dpi " +echo. + +set "tempfile=tmpresfil.tmp" +>"%tempfile%" powershell "$dpi = try { (Get-ItemPropertyValue -Path 'HKCU:\Control Panel\Desktop' -Name 'LogPixels') } catch { try { powershell (Get-ItemPropertyValue -Path 'HKCU:\Control Panel\Desktop\WindowMetrics' -Name 'AppliedDPI') } catch { 96 } } ; if ($dpi -In -999..113) { echo 640x480 } ; if ($dpi -In 114..134) { echo 800x600 } ; if ($dpi -In 135..164) { echo 960x720 } ; if ($dpi -In 165..182) { echo 1120x840 } ; if ($dpi -In 183..999) { echo 1280x960 } " + +set /p RESOLUTIONSTRING=<"%tempfile%" +del /q "%tempfile%" + +echo Scaling 640x480 to: +echo %RESOLUTIONSTRING% + +powershell "Get-Content 'dosbox-x.conf' | Foreach-Object {$_ -replace '^windowresolution.+$','windowresolution = %RESOLUTIONSTRING%'} | Set-Content 'dosbox-x.new'" + +if exist "dosbox-x.new" ( +del /Q dosbox-x.conf.bak +rename dosbox-x.conf dosbox-x.conf.bak +rename dosbox-x.new dosbox-x.conf +) + +REM del /Q ".\guest_tools\runonce\runonce.bat" +echo. >> ".\guest_tools\runonce\runonce.bat" +type ".\guest_tools\guest-scripts\640_16bpp.bat" >> ".\guest_tools\runonce\runonce.bat" \ No newline at end of file diff --git a/installers/dosboxw95/CONFIG_SCRIPTS/800x600_16bpp_DPI-scaled.bat b/installers/dosboxw95/CONFIG_SCRIPTS/800x600_16bpp_DPI-scaled.bat new file mode 100644 index 0000000..c4015eb --- /dev/null +++ b/installers/dosboxw95/CONFIG_SCRIPTS/800x600_16bpp_DPI-scaled.bat @@ -0,0 +1,32 @@ +@echo off +pushd "%~dp0" +cd .. + +echo Checking DPI and setting correct scaling for 800x600 +echo. +echo System DPI: +powershell "$dpi = try { (Get-ItemPropertyValue -Path 'HKCU:\Control Panel\Desktop' -Name 'LogPixels') } catch { try { powershell (Get-ItemPropertyValue -Path 'HKCU:\Control Panel\Desktop\WindowMetrics' -Name 'AppliedDPI') } catch { 96 } }; echo $dpi " + +IF ERRORLEVEL 1 powershell "$dpi = 96 ; $echo scaling not detected, setting default $dpi DPI " +echo. + +set "tempfile=tmpresfil.tmp" +>"%tempfile%" powershell "$dpi = try { (Get-ItemPropertyValue -Path 'HKCU:\Control Panel\Desktop' -Name 'LogPixels') } catch { try { powershell (Get-ItemPropertyValue -Path 'HKCU:\Control Panel\Desktop\WindowMetrics' -Name 'AppliedDPI') } catch { 96 } } ; if ($dpi -In -999..113) { echo 800x600 } ; if ($dpi -In 114..134) { echo 1000x750 } ; if ($dpi -In 135..164) { echo 1200x900 } ; if ($dpi -In 165..182) { echo 1400x1050 } ; if ($dpi -In 183..999) { echo 1600x1200 } " + +set /p RESOLUTIONSTRING=<"%tempfile%" +del /q "%tempfile%" + +echo Scaling 800x600 to: +echo %RESOLUTIONSTRING% + +powershell "Get-Content 'dosbox-x.conf' | Foreach-Object {$_ -replace '^windowresolution.+$','windowresolution = %RESOLUTIONSTRING%'} | Set-Content 'dosbox-x.new'" + +if exist "dosbox-x.new" ( +del /Q dosbox-x.conf.bak +rename dosbox-x.conf dosbox-x.conf.bak +rename dosbox-x.new dosbox-x.conf +) + +REM del /Q ".\guest_tools\runonce\runonce.bat" +echo. >> ".\guest_tools\runonce\runonce.bat" +type ".\guest_tools\guest-scripts\800_16bpp.bat" >> ".\guest_tools\runonce\runonce.bat" \ No newline at end of file diff --git a/installers/dosboxw95/CONFIG_SCRIPTS/_NO-MOUSE-INTEGRATION.bat b/installers/dosboxw95/CONFIG_SCRIPTS/_NO-MOUSE-INTEGRATION.bat new file mode 100644 index 0000000..6b4c811 --- /dev/null +++ b/installers/dosboxw95/CONFIG_SCRIPTS/_NO-MOUSE-INTEGRATION.bat @@ -0,0 +1,22 @@ +@echo off +pushd "%~dp0" +cd .. + +echo Disabling mouse integration + +powershell "Get-Content 'dosbox-x.conf' | Foreach-Object {$_ -replace '^integration device.+$','integration device = false'} | Set-Content 'dosbox-x.new'" + +if exist "dosbox-x.new" ( +del /Q dosbox-x.conf.bak +rename dosbox-x.conf dosbox-x.conf.bak +rename dosbox-x.new dosbox-x.conf +) + + +REM del /Q ".\guest_tools\runonce\runonce.bat" +echo @echo off >> ".\guest_tools\runonce\runonce.bat" +echo O:\setmdrv.exe ps2 >> ".\guest_tools\runonce\runonce.bat" + +if not exist ".\guest_tools\runonce\setmdrv.exe" ( +copy ".\guest_tools\setmdrv\setmdrv.exe" ".\guest_tools\runonce\setmdrv.exe" +) \ No newline at end of file diff --git a/installers/dosboxw95/CONFIG_SCRIPTS/_USE-MOUSE-INTEGRATION.bat b/installers/dosboxw95/CONFIG_SCRIPTS/_USE-MOUSE-INTEGRATION.bat new file mode 100644 index 0000000..9d5cc3e --- /dev/null +++ b/installers/dosboxw95/CONFIG_SCRIPTS/_USE-MOUSE-INTEGRATION.bat @@ -0,0 +1,22 @@ +@echo off +pushd "%~dp0" +cd .. + +echo Disabling mouse integration + +powershell "Get-Content 'dosbox-x.conf' | Foreach-Object {$_ -replace '^integration device.+$','integration device = true'} | Set-Content 'dosbox-x.new'" + +if exist "dosbox-x.new" ( +del /Q dosbox-x.conf.bak +rename dosbox-x.conf dosbox-x.conf.bak +rename dosbox-x.new dosbox-x.conf +) + + +REM del /Q ".\guest_tools\runonce\runonce.bat" +echo @echo off >> ".\guest_tools\runonce\runonce.bat" +echo O:\setmdrv.exe dbox >> ".\guest_tools\runonce\runonce.bat" + +if not exist ".\guest_tools\runonce\setmdrv.exe" ( +copy ".\guest_tools\setmdrv\setmdrv.exe" ".\guest_tools\runonce\setmdrv.exe" +) \ No newline at end of file diff --git a/installers/dosboxw95/SHARED_DRIVE/readme.txt b/installers/dosboxw95/SHARED_DRIVE/readme.txt new file mode 100644 index 0000000..8fde8f1 --- /dev/null +++ b/installers/dosboxw95/SHARED_DRIVE/readme.txt @@ -0,0 +1,2 @@ +You can place here any files from the host operating system that need to be shared with Windows 95 emulated machine. +NOTE: emulated guest machine can read these files and can write to this directory while running, but the changes will NOT be written to this directory after the machine is powered off. \ No newline at end of file diff --git a/installers/dosboxw95/SetupW95DosboxX.bat b/installers/dosboxw95/SetupW95DosboxX.bat new file mode 100644 index 0000000..c980b85 --- /dev/null +++ b/installers/dosboxw95/SetupW95DosboxX.bat @@ -0,0 +1,406 @@ +@echo off + +REM === CUSTOM SETTINGS ==================== + + +REM Select virtual hard drive size. +REM Valid choices: 504MB, 2GB, 4GB, 8GB. +SET HDSIZE=504MB + +REM Select resolution here. May be changed later. +REM Valid choices: 640x480x16bpp, 800x600x16bpp +SET SCREENRES=800x600x16bpp + +REM SET PRODUCTKEY=ask +SET PRODUCTKEY=na + +REM this disables startup/shutdown sounds +SET DISABLEONOFFSOUNDS=true + + +REM === DO NOT EDIT BELOW THIS LINE ======== +REM ======================================== + + +echo Dosbox-x + Windows 95 OSR2 ENG autoinstaller +echo. +echo This installed DOES NOT provide Windows 95 files. +echo. +echo You need to place your own installation files in .\installers\WIN95 directory. +echo Only English OSR2 OEM CD version will work with this script. +echo Other files - redistributables, updates and configuration files - will be downloaded automatically. +echo. +echo If required Windows 95 files are not present, you will be prompted to copy them to appropriate directory. +echo. +pause + + +REM default virtual hard drive size +SET HDCHS=512,63,16,1023 +SET HDTEMPLATE=hd_520 + +if "%HDSIZE%"=="2GB" SET HDCHS=512,63,64,1023 +if "%HDSIZE%"=="2GB" SET HDTEMPLATE=hd_2gig + +if "%HDSIZE%"=="4GB" SET HDCHS=512,63,130,1023 +if "%HDSIZE%"=="4GB" SET HDTEMPLATE=hd_4gig + +if "%HDSIZE%"=="8GB" SET HDCHS=512,63,255,1023 +if "%HDSIZE%"=="8GB" SET HDTEMPLATE=hd_8gig + + +pushd "%~dp0" +cd .. +cd .. +cd installers +SET DBOXIN=%CD% +cd 7-zip +SET ZPATH=%CD% +pushd "%~dp0" + + +if not exist "%~dp0\installers\" ( +mkdir "%~dp0\installers" +) + +if not exist "%~dp0\installers\WIN95\WIN95_02.cab" ( +mkdir "%~dp0\installers\WIN95" +echo "" > "%~dp0\installers\WIN95\_PLACE_WIN95_FILES_HERE_" +echo. +echo Windows 95 files not found. Please copy them from CD-ROM .\WIN95 directory. +timeout /t 1 > nul +cd "%~dp0\installers\WIN95\" +start. +cd "%~dp0" +echo. +pause + +) + +if exist "%~dp0\installers\WIN95\_PLACE_WIN95_FILES_HERE_" ( +del "%~dp0\installers\WIN95\_PLACE_WIN95_FILES_HERE_" +) + + +if not exist "%~dp0\installers\WIN95\WIN95_02.cab" ( +echo Windows 95 installation files still not found. +echo Restart the script after copying installation files. +pause +exit +) + +if not exist "%ZPATH%\7za.exe" ( +mkdir .\installers\7-zip +echo Downloading 7-zip +powershell wget https://www.7-zip.org/a/7zr.exe -UseBasicParsing -OutFile "%~dp0\installers\7-zip\7zr.exe" +powershell wget https://www.7-zip.org/a/7z2201-extra.7z -UseBasicParsing -OutFile "%~dp0\installers\7-zip\7z2201-extra.7z" +"%~dp0\installers\7-zip\7zr.exe" x "%~dp0\installers\7-zip\7z2201-extra.7z" -o"%~dp0\installers\7-zip" +) + +if not exist "%ZPATH%\7za.exe" ( +"%~dp0\installers\7-zip\7zr.exe" x "%~dp0\installers\7-zip\7z2201-extra.7z" -o"%ZPATH%" +) + + +REM ============================= +REM WIN95 FILES EXTRACTION +REM ============================= +echo. +echo Extracting Windows 95 installation files +echo. + +if not exist "%~dp0\installers\WIN95\MINI\KRNL386.EXE" ( +"%ZPATH%\7za.exe" x "%~dp0\installers\WIN95\MINI.CAB" -o"%~dp0\installers\WIN95\MINI" +) +if not exist "%~dp0\installers\WIN95\WIN95_02\VMM32.VXD" ( +"%ZPATH%\7za.exe" x "%~dp0\installers\WIN95\WIN95_02.CAB" -o"%~dp0\installers\WIN95\WIN95_02" +) +if not exist "%~dp0\installers\WIN95\PRECOPY1\COMMAND.COM" ( +"%ZPATH%\7za.exe" x "%~dp0\installers\WIN95\PRECOPY1.CAB" -o"%~dp0\installers\WIN95\PRECOPY1" +) +if not exist "%~dp0\installers\WIN95\SWINST4\REGSVR32.EXE" ( +"%ZPATH%\7za.exe" x "%~dp0\installers\WIN95\SWINST4.EXE" -o"%~dp0\installers\WIN95\SWINST4" +) +if not exist "%~dp0\installers\WIN95\WIN95_02\SETUPSLT\REGSVR32.EXE" ( +"%ZPATH%\7za.exe" x "%~dp0\installers\WIN95\WIN95_02\SETUPSLT.EXE" -o"%~dp0\installers\WIN95\WIN95_02\SETUPSLT" +) +if not exist "%~dp0\installers\WIN95\WIN95_02\SETUP32" ( +"%ZPATH%\7za.exe" x "%~dp0\installers\WIN95\WIN95_02\SETUP32.EXE" -o"%~dp0\installers\WIN95\WIN95_02\SETUP32" +) +if not exist "%~dp0\installers\WIN95\WIN95_02\SETUP25i" ( +"%ZPATH%\7za.exe" x "%~dp0\installers\WIN95\WIN95_02\SETUP25i.EXE" -o"%~dp0\installers\WIN95\WIN95_02\SETUP25i" +) +REM ============================= + + + + + + + + + + +REM ============================= +REM WIN95 UPDATES DOWNLOAD +REM ============================= +if not exist "%~dp0\installers\DX7Aeng.exe" ( +echo Downloading DirectX 7.0A DX7Aeng.exe +powershell wget http://web.archive.org/web/20020607231943if_/http://download.microsoft.com/download/win98SE/Update/7.0a/W9X/EN-US/DX7Aeng.exe -UseBasicParsing -OutFile "%~dp0\installers\DX7Aeng.exe" +) + +if not exist "%~dp0\installers\dcom95.exe" ( +echo Downloading DCOM95 dcom95.exe +powershell wget http://web.archive.org/web/20020223193556if_/http://msdl.microsoft.com/msdownload/dcom/95/x86/en/dcom95.exe -UseBasicParsing -OutFile "%~dp0\installers\dcom95.exe" +) + +if not exist "%~dp0\installers\w95y2k.exe" ( +echo Downloading Year 2000 patch w95y2k.exe +powershell wget http://web.archive.org/web/20010607121741if_/http://msdownload.microsoft.com/msdownload/w95/y2kupdate/x86/en/w95y2k.exe -UseBasicParsing -OutFile "%~dp0\installers\w95y2k.exe" +) + +if not exist "%~dp0\installers\mpfull.exe" ( +echo Downloading Windows Media Player 6.4 mpfull.exe +powershell wget http://web.archive.org/web/20040612122847if_/http://download.microsoft.com/download/winmediaplayer/update/6.4/w9xnt4/en-us/mpfull.exe -UseBasicParsing -OutFile "%~dp0\installers\mpfull.exe" +) + +if not exist "%~dp0\installers\W95WS2setup.exe" ( +echo Downloading Winsock 2 Update W95WS2setup.exe +powershell wget http://web.archive.org/web/20010418081915if_/http://microsoft.com/windows/downloads/bin/W95WS2setup.exe -UseBasicParsing -OutFile "%~dp0\installers\W95WS2setup.exe" +) + +if not exist "%~dp0\installers\vg-w9x-q3.exe" ( +echo Downloading 3Dfx Voodoo Graphics driver vg-w9x-q3.exe +powershell wget http://web.archive.org/web/20031111193444if_/https://www.3dfxzone.it/voodoo1/3dfx/vg-w9x-q3.exe -UseBasicParsing -OutFile "%~dp0\installers\vg-w9x-q3.exe" +) + +if not exist "%~dp0\installers\w9521103.zip" ( +echo Downloading S3 Graphics driver w9521103.zip +powershell wget http://web.archive.org/web/19970625230911if_/http://www.s3.com/bbs/764drv/w9521103.zip -UseBasicParsing -OutFile "%~dp0\installers\w9521103.zip" +) +REM ============================= + + + + + + + + + +REM ============================= +REM DOWNLOADS CHECKSUM VALIDATION +REM ============================= +echo Checking SHA256 of DX7Aeng.exe (564de93dcc50691480332e2ccb5565908760b295faa70f8c68854f69dad87189 expected) +powershell "Get-FileHash '%~dp0\installers\DX7Aeng.exe' -Algorithm SHA256 | %% { if($_.Hash -match '564de93dcc50691480332e2ccb5565908760b295faa70f8c68854f69dad87189') {Echo 'SHA256 OK'} else{exit 1} }" +if errorlevel 1 ( +echo. +echo Bad DX7Aeng.exe checksum +echo Download file manually before continuing or press any key to ignore +pause +) + +echo Checking SHA256 of dcom95.exe (6706f79435d75682b0ce69b144108b3c344cae9f7aee7490de47aa20b4f311d3 expected) +powershell "Get-FileHash '%~dp0\installers\dcom95.exe' -Algorithm SHA256 | %% { if($_.Hash -match '6706f79435d75682b0ce69b144108b3c344cae9f7aee7490de47aa20b4f311d3') {Echo 'SHA256 OK'} else{exit 1} }" +if errorlevel 1 ( +echo. +echo Bad dcom95.exe checksum +echo Download file manually before continuing or press any key to ignore +pause +) + +echo Checking SHA256 of w95y2k.exe (d3c063f2b04311ddbffd8461aa47147d6307f26d2163bef2c715cd168657aa3f expected) +powershell "Get-FileHash '%~dp0\installers\w95y2k.exe' -Algorithm SHA256 | %% { if($_.Hash -match 'd3c063f2b04311ddbffd8461aa47147d6307f26d2163bef2c715cd168657aa3f') {Echo 'SHA256 OK'} else{exit 1} }" +if errorlevel 1 ( +echo. +echo Bad w95y2k.exe checksum +echo Download file manually before continuing or press any key to ignore +pause +) + +echo Checking SHA256 of mpfull.exe (a39b2b9735cedd513fcb78f8634695d35073e9d7e865e536a0da6db38c7225e4 expected) +powershell "Get-FileHash '%~dp0\installers\mpfull.exe' -Algorithm SHA256 | %% { if($_.Hash -match 'a39b2b9735cedd513fcb78f8634695d35073e9d7e865e536a0da6db38c7225e4') {Echo 'SHA256 OK'} else{exit 1} }" +if errorlevel 1 ( +echo. +echo Bad mpfull.exe checksum +echo Download file manually before continuing or press any key to ignore +pause +) + +echo Checking SHA256 of W95WS2setup.exe (48c82825328ef63bce1d471d505f0e243cae94b5b05c66cf2e51b75c6d4d4922 expected) +powershell "Get-FileHash '%~dp0\installers\W95WS2setup.exe' -Algorithm SHA256 | %% { if($_.Hash -match '48c82825328ef63bce1d471d505f0e243cae94b5b05c66cf2e51b75c6d4d4922') {Echo 'SHA256 OK'} else{exit 1} }" +if errorlevel 1 ( +echo. +echo Bad W95WS2setup.exe checksum +echo Download file manually before continuing or press any key to ignore +pause +) + +echo Checking SHA256 of vg-w9x-q3.exe (afde9cfc18080ba4bd94972b783867a9c713e6df3643fef84db5da19414ceea8 expected) +powershell "Get-FileHash '%~dp0\installers\vg-w9x-q3.exe' -Algorithm SHA256 | %% { if($_.Hash -match 'afde9cfc18080ba4bd94972b783867a9c713e6df3643fef84db5da19414ceea8') {Echo 'SHA256 OK'} else{exit 1} }" +if errorlevel 1 ( +echo. +echo Bad vg-w9x-q3.exe checksum +echo Download file manually before continuing or press any key to ignore +pause +) + +echo Checking SHA256 of w9521103.zip (fb691c872cd7dcc00d7b9445af6d82777586e356e165d5db56f213fa81e96881 expected) +powershell "Get-FileHash '%~dp0\installers\w9521103.zip' -Algorithm SHA256 | %% { if($_.Hash -match 'fb691c872cd7dcc00d7b9445af6d82777586e356e165d5db56f213fa81e96881') {Echo 'SHA256 OK'} else{exit 1} }" +if errorlevel 1 ( +echo. +echo Bad w9521103.zip checksum +echo Download file manually before continuing or press any key to ignore +pause +) +REM ============================= + + + + + +REM ============================= +REM UPDATES EXTRACTION +REM ============================= +echo. +echo Extracting Windows 95 installation files +echo. + +mkdir "%~dp0\installers\expanded" + +if not exist "%~dp0\installers\expanded\dcom95\dllhost.exe" ( +"%ZPATH%\7za.exe" x "%~dp0\installers\dcom95.exe" -o"%~dp0\installers\expanded\dcom95" +) +if not exist "%~dp0\installers\expanded\DX7Aeng\ddraw.dll" ( +"%ZPATH%\7za.exe" x "%~dp0\installers\DX7Aeng.exe" -o"%~dp0\installers\expanded\DX7Aeng" +) +if not exist "%~dp0\installers\expanded\mpfull\mplayer2.exe" ( +"%ZPATH%\7za.exe" x "%~dp0\installers\mpfull.exe" -o"%~dp0\installers\expanded\mpfull" +) +if not exist "%~dp0\installers\expanded\mpfull\dxmini\ddhelp.exe" ( +"%ZPATH%\7za.exe" x "%~dp0\installers\mpfull\dxmini.exe" -o"%~dp0\installers\expanded\mpfull\dxmini" +) +if not exist "%~dp0\installers\expanded\vg-w9x-q3\voodoo.inf" ( +"%ZPATH%\7za.exe" x "%~dp0\installers\vg-w9x-q3.exe" -o"%~dp0\installers\expanded\vg-w9x-q3" +) +if not exist "%~dp0\installers\expanded\w9521103\S3.INF" ( +"%ZPATH%\7za.exe" x "%~dp0\installers\w9521103.zip" -o"%~dp0\installers\expanded\w9521103" +) +if not exist "%~dp0\installers\expanded\w95y2k\WINFILE.EXE" ( +"%ZPATH%\7za.exe" x "%~dp0\installers\w95y2k.exe" -o"%~dp0\installers\expanded\w95y2k" +) +if not exist "%~dp0\installers\expanded\W95WS2setup\ping.exe" ( +"%ZPATH%\7za.exe" x "%~dp0\installers\W95WS2setup.exe" -o"%~dp0\installers\expanded\W95WS2setup" +) +REM ============================= + + + +echo. +echo Extracting config files and utilities +"%ZPATH%\7za.exe" x "%~dp0\installers\w95-inst-utils-cfgfiles.7z" -o"%~dp0\installers" + +echo. +echo Creating Windows 95 directory structure +echo. +pushd "%~dp0\installers" +call makewin95dir.bat + +echo. +echo Applying patches +cd "%~dp0\installers\xdelta" +call "%~dp0\installers\xdelta\undelta.bat" +cd "%~dp0\installers" +call "%~dp0\installers\copypatched.bat" + +if not exist "%~dp0\dosbox-x.exe" ( + + +if not exist "%DBOXIN%\dosbox-x-mingw*. nul + +mkdir "%~dp0\HDD" + +pushd "%~dp0" + +dosbox-x.exe -noautoexec -c "config -set turbo=true " -c "IMGMAKE .\HDD\WIN95.IMG -t %HDTEMPLATE% " -c "IMGMOUNT C .\HDD\WIN95.IMG -size %HDCHS% " -c "MOUNT D: .\installers " -c "4dos D:\prephdd.bat" + +timeout /t 1 > NUL + +echo. +echo Setting pre-selected screen resolution +if "%SCREENRES%"=="800x600x16bpp" call "%~dp0\CONFIG_SCRIPTS\800x600_16bpp_DPI-scaled.bat" +if "%SCREENRES%"=="640x480x16bpp" call "%~dp0\CONFIG_SCRIPTS\640x480_16bpp_DPI-scaled.bat" + +REM ask for product key on first boot +if "%PRODUCTKEY%"=="ask" echo. >> "%~dp0\guest_tools\runonce\runonce.bat" +if "%PRODUCTKEY%"=="ask" type "%~dp0\guest_tools\guest-scripts\prodtyp9.bat" >> "%~dp0\guest_tools\runonce\runonce.bat" + + +REM disable startup/shutdown sounds +if "%DISABLEONOFFSOUNDS%"=="true" echo. >> "%~dp0\guest_tools\runonce\runonce.bat" +if "%DISABLEONOFFSOUNDS%"=="true" type "%~dp0\guest_tools\guest-scripts\nostsnd.bat" >> "%~dp0\guest_tools\runonce\runonce.bat" + + +timeout /t 1 > NUL + + +echo Setting HDD size in config file +pushd "%~dp0" +del /Q dosbox-x.new +powershell "Get-Content 'dosbox-x.conf' | Foreach-Object {$_ -replace 'size 512,63,16,1023 -ide 1m','size %HDCHS% -ide 1m'} | Set-Content 'dosbox-x.new'" +del /Q dosbox-x.conf +copy dosbox-x.new dosbox-x.conf + +REM that will make the machine turn off after first boot +copy dosbox-x.new dosbox-x.conf +echo SHUTDOWN > .\SHARED_DRIVE\launchit.cfg + +echo Trying to boot for first time... +dosbox-x.exe -c "MOUNT D: .\SHARED_DRIVE -ide 2s " -c "BOOT C: " + +del /Q .\SHARED_DRIVE\launchit.cfg + + +echo Enabling turbo on boot time +pushd "%~dp0" +del /Q dosbox-x.new +powershell "Get-Content 'dosbox-x.conf' | Foreach-Object {$_ -replace '#turbo last second','turbo last second'} | Set-Content 'dosbox-x.new'" +del /Q dosbox-x.conf +copy dosbox-x.new dosbox-x.conf +powershell "Get-Content 'dosbox-x.conf' | Foreach-Object {$_ -replace '#stop turbo after second','stop turbo after second'} | Set-Content 'dosbox-x.new'" +del /Q dosbox-x.conf +copy dosbox-x.new dosbox-x.conf +powershell "Get-Content 'dosbox-x.conf' | Foreach-Object {$_ -replace '#stop turbo on key','stop turbo on key'} | Set-Content 'dosbox-x.new'" +del /Q dosbox-x.conf +copy dosbox-x.new dosbox-x.conf + + +echo. +echo Done! Start dosbox-x.exe to launch Windows 95. +echo. + +pause + diff --git a/installers/dosboxw95/_startinw95.bat b/installers/dosboxw95/_startinw95.bat new file mode 100644 index 0000000..b087be6 --- /dev/null +++ b/installers/dosboxw95/_startinw95.bat @@ -0,0 +1,29 @@ +@echo off + +if exist "%~1" ( +echo Startup directory: %~dp1 +echo Executable name: %~nx1 +echo Adding launchit.cfg to startup directory... +echo %~nx1 > "%~dp1\launchit.cfg" + +if not [%2]==[] ( +if "%2"=="NOSHUTDOWN" echo Adding NOSHUTDOWN flag +if "%2"=="NOSHUTDOWN" echo NOSHUTDOWN >> "%~dp1\launchit.cfg" +) + +echo Executing in DOSBox-X Win95... +cd "%~dp0" +start dosbox-x.exe -c "MOUNT D: '%~dp1' -ide 2s " -c "BOOT C: " +REM timeout /t 5 +REM del /Q "%~dp1\launchit.cfg" +) + +if not exist "%~1" ( +echo This scripts will run given executable in Windows 95 inside DOSBox-X. +echo. +echo Usage: +echo _startinwin95.bat "PathToExecutable.exe" +echo. +echo Note: a file "launchit.cfg" will be created in executable directory at launch time, it can be safely removed at any time. +echo Emulated machine also needs to have "alaucnhr.exe" installed in autostart directory. +) diff --git a/installers/dosboxw95/dosbox-x.conf b/installers/dosboxw95/dosbox-x.conf new file mode 100644 index 0000000..902f1b6 --- /dev/null +++ b/installers/dosboxw95/dosbox-x.conf @@ -0,0 +1,1281 @@ +# This is the configuration file for DOSBox-X 2022.08.0. (Please use the latest version of DOSBox-X) +# Lines starting with a # are comment lines and are ignored by DOSBox-X. +# They are used to (briefly) document the effect of each option. +# To write out ALL options, use command 'config -all' with -wc or -writeconf options. + +[sdl] +# fullscreen: Start DOSBox-X directly in fullscreen. (Press [F11/F12]+F to go back) +# fulldouble: Use double buffering in fullscreen. It can reduce screen flickering, but it can also result in a slow DOSBox-X. +# fullresolution: What resolution to use for fullscreen: original, desktop or a fixed size (e.g. 1024x768). +# Using your monitor's native resolution with aspect=true might give the best results. +# If you end up with small window on a large screen, try an output different from surface. +# windowresolution: Scale the window to this size IF the output device supports hardware scaling. +# (output=surface does not!) +# windowposition: Set the window position at startup in the positionX,positionY format (e.g.: 1300,200). +# The window will be centered with "," (or empty), and will be in the original position with "-". +# display: Specify a screen/display number to use for a multi-screen setup (0 = default). +# output: What video system to use for output (openglnb = OpenGL nearest; openglpp = OpenGL perfect; ttf = TrueType font output). +# Possible values: default, surface, overlay, ttf, opengl, openglnb, openglhq, openglpp, ddraw, direct3d. +# videodriver: Forces a video driver (e.g. windib/windows, directx, x11, fbcon, dummy, etc) for the SDL library to use. +# transparency: Set the transparency of the DOSBox-X screen (both windowed and full-screen modes, on SDL2 and Windows SDL1 builds). +# The valid value is from 0 (no transparency, the default setting) to 90 (high transparency). +# maximize: If set, the DOSBox-X window will be maximized at start (SDL2 and Windows SDL1 builds only; use fullscreen for TTF output). +# autolock: Mouse will automatically lock, if you click on the screen. (Press CTRL-F10 to unlock) +# autolock_feedback: Autolock status feedback type, i.e. visual, auditive, none. +# Possible values: none, beep, flash. +# middle_unlock: Whether you can press the middle mouse button to unlock the mouse when the mouse has been locked. +# If set to "manual", it works only with "autolock=false"; if set to "auto", it works only with "autolock=true". +# Possible values: none, manual, auto, both. +# clip_mouse_button: Select the mouse button or use arrow keys for the shared clipboard copy/paste function. +# The default mouse button is "right", which means using the right mouse button to select text, copy to and paste from the host clipboard. +# Set to "middle" to use the middle mouse button, "arrows" to use arrow keys instead of a mouse button, or "none" to disable this feature. +# For "arrows", press Home key (or Fn+Shift+Left on Mac laptops) to start selection, and End key (or Fn+Shift+Right on Mac laptops) to end selection. +# Possible values: none, middle, right, arrows. +# clip_key_modifier: Change the keyboard modifier for the shared clipboard copy/paste function using a mouse button or arrow keys. +# The default modifier is "shift" (both left and right shift keys). Set to "none" if no modifier is desired. +# Possible values: none, ctrl, lctrl, rctrl, alt, lalt, ralt, shift, lshift, rshift, ctrlalt, ctrlshift, altshift, lctrlalt, lctrlshift, laltshift, rctrlalt, rctrlshift, raltshift. +# clip_paste_bios: Specify whether to use BIOS keyboard functions for the clipboard pasting instead of the keystroke method. +# For pasting clipboard text into Windows 3.x/9x applications (e.g. Notepad), make sure to use the keystroke method. +# Possible values: true, false, 1, 0, default. +# clip_paste_speed: Set keyboard speed for pasting text from the shared clipboard. +# If the default setting of 30 causes lost keystrokes, increase the number. +# Or experiment with decreasing the number for applications that accept keystrokes quickly. +# sensitivity: Mouse sensitivity. The optional second parameter specifies vertical sensitivity (e.g. 100,-50). +# usesystemcursor: Use the mouse cursor of the host system instead of drawing a DOS mouse cursor. Activated when the mouse is not locked. +# mouse_emulation: When is mouse emulated ? +# integration: when not locked +# locked: when locked +# always: every time +# never: at no time +# If disabled, the mouse position in DOSBox-X is exactly where the host OS reports it. +# When using a high DPI mouse, the emulation of mouse movement can noticeably reduce the +# sensitiveness of your device, i.e. the mouse is slower but more precise. +# Possible values: integration, locked, always, never. +# mouse_wheel_key: Convert mouse wheel movements into keyboard presses such as arrow keys. +# 0: disabled; 1: up/down arrows; 2: left/right arrows; 3: PgUp/PgDn keys. +# 4: Ctrl+up/down arrows; 5: Ctrl+left/right arrows; 6: Ctrl+PgUp/PgDn keys. +# 7: Ctrl+W/Z, as supported by text editors like WordStar and MS-DOS EDIT. +# Putting a minus sign in front will disable the conversion for guest systems. +# waitonerror: Wait before closing the console if DOSBox-X has an error. +# priority: Priority levels for DOSBox-X. Second entry behind the comma is for when DOSBox-X is not focused/minimized. +# pause is only valid for the second entry. +# Possible values: lowest, lower, normal, higher, highest, pause. +# mapperfile: File used to load/save the key/event mappings from. Resetmapper only works with the default value. +# usescancodes: Avoid usage of symkeys, in favor of scancodes. Might not work on all operating systems. +# If set to "auto" (default), it is enabled when using non-US keyboards in SDL1 builds. +# Possible values: true, false, 1, 0, auto. +# overscan: Width of the overscan border (0 to 10) for the "surface" output. +# titlebar: Change the string displayed in the DOSBox-X title bar. +# showbasic: If set, DOSBox-X will show basic information including the DOSBox-X version number and current running speed in the title bar. +# showdetails: If set, DOSBox-X will show the cycles count (FPS) and emulation speed relative to realtime in the title bar. +# showmenu: Whether to show the menu bar (if supported). Default true. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> mapperfile_sdl1; mapperfile_sdl2; forcesquarecorner +# +fullscreen = false +fulldouble = false +fullresolution = desktop +windowresolution = 1200x900 +windowposition = +display = 0 +output = opengl +videodriver = +transparency = 0 +maximize = false +autolock = false +autolock_feedback = beep +middle_unlock = manual +clip_mouse_button = right +clip_key_modifier = shift +clip_paste_bios = default +clip_paste_speed = 30 +sensitivity = 100 +usesystemcursor = false +mouse_emulation = integration +mouse_wheel_key = -1 +waitonerror = true +priority = higher,normal +mapperfile = mapper-dosbox-x.map +usescancodes = auto +overscan = 0 +titlebar = +showbasic = true +showdetails = false +showmenu = true + +[log] +# logfile: file where the log messages will be saved to +# debuggerrun: The run mode when the DOSBox-X Debugger starts. +# Possible values: debugger, normal, watch. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> vga; vgagfx; vgamisc; int10; sblaster; dma_control; fpu; cpu; paging; fcb; files; ioctl; exec; dosmisc; pit; keyboard; pic; mouse; bios; gui; misc; io; pci; sst; int21; fileio +# +logfile = +debuggerrun = debugger + +[dosbox] +# language: Select a language file for DOSBox-X to use. Encoded with either UTF-8 or a DOS code page. +# You can set code page either in the language file or with "country" setting in [config] section. +# title: Additional text to place in the title bar of the window. +# fastbioslogo: If set, DOSBox-X will skip the BIOS screen by activating fast BIOS logo mode (without 1-second pause). +# startbanner: If set (default), DOSBox-X will display the welcome banner when it starts. +# bannercolortheme: You can specify a different background color theme for the welcome banner from the default one. +# Possible values: default, black, red, green, yellow, blue, magenta, cyan, white. +# dpi aware: Set this option (auto by default) to indicate to your OS that DOSBox-X is DPI aware. +# If it is not set, Windows Vista/7/8/10 and higher may upscale the DOSBox-X window +# on higher resolution monitors which is probably not what you want. +# Possible values: true, false, 1, 0, auto. +# quit warning: Set this option to indicate whether DOSBox-X should show a warning message when the user tries to close its window. +# If set to auto (default), DOSBox-X will warn if a DOS program, game or a guest system is currently running. +# If set to autofile, DOSBox-X will warn if there are open file handles or a guest system is currently running. +# Possible values: true, false, 1, 0, auto, autofile. +# working directory option: Select an option for DOSBox-X's working directory when it runs. +# autoprompt: DOSBox-X will auto-decide whether to prompt for a working directory. +# config: DOSBox-X will use the primary config file directory as the working directory. +# custom: Specify a working directory via the "working directory default" option. +# default: Similar to autoprompt, but DOSBox-X will ask whether to save the selected folder. +# force: Similar to "custom", while overriding -defaultdir command-line option if used. +# noprompt: DOSBox-X uses the current directory and never prompts for a working directory. +# program: DOSBox-X will use the DOSBox-X program directory as the working directory. +# prompt: DOSBox-X will always ask the user to select a working directory when it runs. +# userconfig: DOSBox-X will use its user configuration directory as the working directory. +# Possible values: autoprompt, config, custom, default, force, noprompt, program, prompt, userconfig. +# working directory default: The default directory to act as DOSBox-X's working directory. See also the setting "working directory option". +# For working directory option=prompt, the specified directory becomes the default directory for the folder selection. +# show advanced options: If set, the Configuration Tool will display all config options (including advanced ones) by default. +# resolve config path: If set to true, DOSBox-X will resolve options containing paths in the config file (except [autoexec] section). +# This includes environment variables (%VAR% [DOS/Windows] or ${VAR} [Linux/macOS] and tilde (~) in Linux/macOS. +# If set to dosvar, DOSBox-X forces to resolve DOS-style environment variables (%VAR%) in all platforms (and tilde). +# If set to tilde, DOSBox-X will only resolve tilde (~) in Linux/macOS but will not resolve environment variables. +# Possible values: true, false, dosvar, tilde, 1, 0. +# hostkey: By default, DOSBox-X uses the mapper-defined host key, which defaults to F11 on Windows and F12 on other platforms. +# You may alternatively specify a host key with this setting and bypass the host key as defined in the mapper. +# This can also be done from the menu ("Main" => "Select host key"). +# Possible values: ctrlalt, ctrlshift, altshift, mapper. +# mapper send key: Select the key the mapper SendKey function will send. +# Possible values: winlogo, winmenu, alttab, ctrlesc, ctrlbreak, ctrlaltdel. +# ime: Enables support for the system input methods (IME) for inputting characters in Windows and Linux builds. +# If set to auto, this feature is only enabled if DOSBox-X starts with a Chinese/Japanese/Korean code page. +# Possible values: true, false, 1, 0, auto. +# synchronize time: If set, DOSBox-X will try to automatically synchronize time with the host, unless you decide to change the date/time manually. +# machine: The type of machine DOSBox-X tries to emulate. +# Possible values: mda, cga, cga_mono, cga_rgb, cga_composite, cga_composite2, hercules, tandy, pcjr, pcjr_composite, pcjr_composite2, amstrad, ega, ega200, jega, mcga, vgaonly, svga_s3, svga_s386c928, svga_s3vision864, svga_s3vision868, svga_s3vision964, svga_s3vision968, svga_s3trio32, svga_s3trio64, svga_s3trio64v+, svga_s3virge, svga_s3virgevx, svga_et3000, svga_et4000, svga_paradise, vesa_nolfb, vesa_oldvbe, vesa_oldvbe10, pc98, pc9801, pc9821, fm_towns. +# captures: Directory where things like wave, midi, screenshot get captured. +# autosave: Enable the auto-save state feature. Specify a time interval in seconds, and optionally a save slot or start and end save slots. +# For example, "autosave=10 11-20" will set a 10-second time interval for auto-saving, and the save slots used will be between 11 and 20. +# You can additionally specify up to 9 programs for this feature, e.g. "autosave=10 11-20 EDIT:21-30 EDITOR:35" for "EDIT" and "EDITOR". +# Putting a minus sign (-) before the time interval causes the auto-saving function to not be activated at start. +# saveslot: Select the default save slot (1-100) to save/load states. +# savefile: Select the default save file to save/load states. If specified it will be used instead of the save slot. +# saveremark: If set, the save state feature will ask users to enter remarks when saving a state. +# forceloadstate: If set, DOSBox-X will load a saved state even if it finds there is a mismatch in the DOSBox-X version, machine type, program name and/or the memory size. +# a20: A20 gate emulation mode. +# The on/off/on_fake/off_fake options are intended for testing and debugging DOS development, +# or to emulate obscure hardware, or to work around potential extended memory problems with DOS programs. +# on_fake/off_fake are intended to test whether a program carries out a memory test to ensure the A20 +# gate is set as intended (as HIMEM.SYS does). If it goes by the gate bit alone, it WILL crash. +# This parameter is also changeable from the builtin A20GATE command. +# fast Emulate A20 gating by remapping the first 64KB @ 1MB boundary (fast, mainline DOSBox behavior) +# mask Emulate A20 gating by masking memory I/O address (accurate) +# off Lock A20 gate off (Software/OS cannot enable A20) +# on Lock A20 gate on (Software/OS cannot disable A20) +# off_fake Lock A20 gate off but allow bit to toggle (hope your DOS game tests the HMA!) +# on_fake Lock A20 gate on but allow bit to toggle +# memsize: Amount of memory DOSBox-X has in megabytes. +# This value is best left at its default to avoid problems with some games, +# although other games and applications may require a higher value. +# Programs that use 286 protected mode like Windows 3.0 in Standard Mode may crash with more than 15MB. +# nocachedir: If set, MOUNT commands will mount with -nocachedir (disable directory caching) by default. +# freesizecap: If set to "cap" (="true"), the value of MOUNT -freesize will apply only if the actual free size is greater than the specified value. +# If set to "relative", the value of MOUNT -freesize will change relative to the specified value. +# If set to "fixed" (="false"), the value of MOUNT -freesize will be a fixed one to be reported all the time. +# Possible values: true, false, fixed, relative, cap, 2, 1, 0. +# convertdrivefat: If set, DOSBox-X will auto-convert mounted non-FAT drives (such as local drives) to FAT format for use with guest systems. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> disable graphical splash; allow quit after warning; keyboard hook; weitek; bochs debug port e9; compresssaveparts; show recorded filename; skip encoding unchanged frames; capture chroma format; capture format; shell environment size; private area size; turn off a20 gate on boot; cbus bus clock; isa bus clock; pci bus clock; call binary on reset; unhandled irq handler; call binary on boot; ibm rom basic; rom bios allocation max; rom bios minimum size; irq delay ns; iodelay; iodelay16; iodelay32; acpi; acpi rsd ptr location; acpi sci irq; acpi iobase; acpi reserved size; memsizekb; dos mem limit; isa memory hole at 512kb; reboot delay; memalias; convert fat free space; convert fat timeout; leading colon write protect image; locking disk image mount; unmask keyboard on int 16 read; int16 keyboard polling undocumented cf behavior; allow port 92 reset; enable port 92; enable 1st dma controller; enable 2nd dma controller; allow dma address decrement; enable 128k capable 16-bit dma; enable dma extra page registers; dma page registers write-only; cascade interrupt never in service; cascade interrupt ignore in service; enable slave pic; enable pc nmi mask; allow more than 640kb base memory; enable pci bus +# +language = +title = +fastbioslogo = true +startbanner = false +bannercolortheme = default +dpi aware = 1 +quit warning = auto +working directory option = program +working directory default = +show advanced options = false +resolve config path = true +hostkey = mapper +mapper send key = ctrlaltdel +ime = auto +synchronize time = false +machine = svga_s3 +captures = capture +autosave = +saveslot = 1 +savefile = +saveremark = true +forceloadstate = false +a20 = mask +memsize = 64 +nocachedir = false +freesizecap = cap +convertdrivefat = true + +[render] +# frameskip: How many frames DOSBox-X skips before drawing one. +# aspect: Aspect ratio correction mode. Can be set to the following values: +# 'false' (default): +# 'direct3d'/opengl outputs: image is simply scaled to full window/fullscreen size, possibly resulting in disproportional image +# 'surface' output: it does no aspect ratio correction (default), resulting in disproportional images if VGA mode pixel ratio is not 4:3 +# 'true': +# 'direct3d'/opengl outputs: uses output driver functions to scale / pad image with black bars, correcting output to proportional 4:3 image +# In most cases image degradation should not be noticeable (it all depends on the video adapter and how much the image is upscaled). +# Should have none to negligible impact on performance, mostly being done in hardware +# For the pixel-perfect scaling (output=openglpp), it is recommended to enable this whenever the emulated display has an aspect ratio of 4:3 +# 'surface' output: inherits old DOSBox aspect ratio correction method (adjusting rendered image line count to correct output to 4:3 ratio) +# Due to source image manipulation this mode does not mix well with scalers, i.e. multiline scalers like hq2x/hq3x will work poorly +# Slightly degrades visual image quality. Has a tiny impact on performance +# When using xBRZ scaler with 'surface' output, aspect ratio correction is done by the scaler itself, so none of the above apply +# Possible values: false, true, 0, 1, yes, no, nearest, bilinear. +# aspect_ratio: Set the aspect ratio (e.g. 16:9) in the aspect ratio correction mode. 0:0 means the default ratio of 4:3, and -1:-1 means the original image ratio. +# char9: Allow 9-pixel wide text mode fonts instead of 8-pixel wide fonts. +# euro: Display Euro symbol instead of the specified ASCII character (33-255). +# For example, setting it to 128 allows Euro symbol to be displayed instead of C-cedilla. +# doublescan: If set, doublescanned output emits two scanlines for each source line, in the +# same manner as the actual VGA output (320x200 is rendered as 640x400 for example). +# If clear, doublescanned output is rendered at the native source resolution (320x200 as 320x200). +# This affects the raster PRIOR to the software or hardware scalers. Choose wisely. +# For pixel-perfect scaling (output=openglpp), it is recommended to turn this option off. +# scaler: Scaler used to enlarge/enhance low resolution modes. If 'forced' is appended, +# then the scaler will be used even if the result might not be desired. +# Appending 'prompt' will cause a confirmation message for forcing the scaler. +# To fit a scaler in the resolution used at full screen may require a border or side bars. +# To fill the screen entirely, depending on your hardware, a different scaler/fullresolution might work. +# Scalers should work with most output options, but they are ignored for openglpp and TrueType font outputs. +# Possible values: none, normal2x, normal3x, normal4x, normal5x, advmame2x, advmame3x, advinterp2x, advinterp3x, hq2x, hq3x, 2xsai, super2xsai, supereagle, tv2x, tv3x, rgb2x, rgb3x, scan2x, scan3x, gray, gray2x, hardware_none, hardware2x, hardware3x, hardware4x, hardware5x, xbrz, xbrz_bilinear. +# glshader: Path to GLSL shader source to use with OpenGL output ("none" to disable, or "default" for default shader). +# Can be either an absolute path, a file in the "glshaders" subdirectory of the DOSBox-X configuration directory, +# or one of the built-in shaders (e.g. "sharp" for the pixel-perfect scaling mode): +# advinterp2x, advinterp3x, advmame2x, advmame3x, rgb2x, rgb3x, scan2x, scan3x, tv2x, tv3x, sharp. +# pixelshader: Set Direct3D pixel shader program (effect file must be in Shaders subdirectory). If 'forced' is appended, +# then the pixel shader will be used even if the result might not be desired. +# autofit: Best fits image to window +# - Intended for output=direct3d, fullresolution=original, aspect=true +# monochrome_pal: Specify the color of monochrome display. +# Possible values: green, amber, gray, white +# Append 'bright' for a brighter look. +# Possible values: green, amber, gray, white. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> alt render; xbrz slice; xbrz fixed scale factor; xbrz max scale factor +# +frameskip = 0 +aspect = true +aspect_ratio = 0:0 +char9 = true +euro = -1 +doublescan = true +scaler = normal2x forced +glshader = none +pixelshader = none +autofit = true +monochrome_pal = green + +[pc98] +# pc-98 BIOS copyright string: If set, the PC-98 BIOS copyright string is placed at E800:0000. Enable this for software that detects PC-98 vs Epson. +# pc-98 fm board: In PC-98 mode, selects the FM music board to emulate. +# Possible values: auto, off, false, board14, board26k, board86, board86c. +# pc-98 enable 256-color: Allow 256-color graphics mode if set, disable if not set +# pc-98 enable 16-color: Allow 16-color graphics mode if set, disable if not set +# pc-98 enable grcg: Allow GRCG graphics functions if set, disable if not set +# pc-98 enable egc: Allow EGC graphics functions if set, disable if not set +# pc-98 bus mouse: Enable PC-98 bus mouse emulation. Disabling this option does not disable INT 33h emulation. +# pc-98 force ibm keyboard layout: Force to use a default keyboard layout like IBM US-English for PC-98 emulation. +# Will only work with apps and games using BIOS for keyboard. +# Possible values: true, false, 1, 0, auto. +# pc-98 try font rom: If enabled, DOSBox-X will first try to load FONT.ROM as generated by T98Tools for PC-98 emulation. +# pc-98 anex86 font: Specify an Anex86 compatible font to load as supported by the Anex86 emulator for PC-98 emulation. +# By default DOSBox-X tries to load ANEX86.BMP followed by FREECG98.BMP after trying to load FONT.ROM. +# If you specify a font here then it will be tried first, perhaps before FONT.ROM (see previous option). +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> pc-98 int 1b fdc timer wait; pc-98 pic init to read isr; pc-98 fm board irq; pc-98 fm board io port; pc-98 sound bios; pc-98 load sound bios rom file; pc-98 buffer page flip; pc-98 enable 256-color planar; pc-98 enable 188 user cg; pc-98 start gdc at 5mhz; pc-98 allow scanline effect; pc-98 video mode; pc-98 timer always cycles; pc-98 timer master frequency; pc-98 allow 4 display partition graphics; pc-98 show graphics layer on initialize +# +pc-98 BIOS copyright string = false +pc-98 fm board = auto +pc-98 enable 256-color = true +pc-98 enable 16-color = true +pc-98 enable grcg = true +pc-98 enable egc = true +pc-98 bus mouse = true +pc-98 force ibm keyboard layout = auto +pc-98 try font rom = true +pc-98 anex86 font = + +[dosv] +# dosv: Enable DOS/V emulation and specify which version to emulate. This option is intended for use with games or software +# originating from East Asia (China, Japan, Korea) that use the double byte character set (DBCS) encodings and DOS/V extensions +# to display Japanese (jp), Chinese (chs/cht/cn/tw), or Korean (ko) text. Note that enabling DOS/V replaces 80x25 text mode with +# a EGA/VGA graphics mode that emulates text mode to display the characters and may be incompatible with non-Asian software that +# assumes direct access to the text mode via segment 0xB800. For a general DOS environment with CJK support please disable DOS/V +# emulation and use TrueType font (TTF) output with a CJK code page (932, 936, 949, 950) and TTF font with CJK characters instead. +# Possible values: off, jp, ko, chs, cht, cn, tw. +# getsysfont: If enabled, DOSBox-X will try to get and use the system fonts on Windows and Linux platforms for the DOS/V emulation. +# If this cannot be done, then DOSBox-X will try to use the internal Japanese DOS/V font, or you can specify a different font. +# fontxsbcs: FONTX2 file used to rendering SBCS characters (8x19) in DOS/V or JEGA mode. If not specified, the default one will be used. +# Loading the ASC16 and ASCFONT.15 font files (from the UCDOS and ETen Chinese DOS systems) is also supported for the DOS/V mode. +# fontxsbcs16: FONTX2 file used to rendering SBCS characters (8x16) in DOS/V or JEGA mode. If not specified, the default one will be used. +# Loading the ASC16 and ASCFONT.15 font files (from the UCDOS and ETen Chinese DOS systems) is also supported for the DOS/V mode. +# fontxsbcs24: FONTX2 file used to rendering SBCS characters (12x24) in DOS/V mode (with V-text). If not specified, the default one will be used. +# Loading the ASC24 and ASCFONT.24? font files (the latter from the ETen Chinese DOS system) is also supported for the DOS/V mode. +# fontxdbcs: FONTX2 file used to rendering DBCS characters (16x16) in DOS/V or VGA/JEGA mode. If not specified, the default one will be used. +# Alternatively, you can load a BDF or PCF font file (16x16 or 15x15), such as the free bitmap fonts from WenQuanYi (https://wenq.org/). +# For Simplified Chinese DOS/V, loading the HZK16 font file (https://github.com/aguegu/BitmapFont/tree/master/font) is also supported. +# For Traditional Chinese DOS/V, loading the STDFONT.15 font file from the ETen Chinese DOS system is also supported. +# fontxdbcs14: FONTX2 file used to rendering DBCS characters (14x14) for Configuration Tool or EGA mode. If not specified, the default one will be used. +# Alternatively, you can load a BDF or PCF font file (14x14 or 15x15), such as the free bitmap fonts from WenQuanYi (https://wenq.org/). +# For Simplified Chinese DOS/V, loading the HZK14 font file (https://github.com/aguegu/BitmapFont/tree/master/font) is also supported. +# For Traditional Chinese DOS/V, loading the STDFONT.15 font file from the ETen Chinese DOS system is also supported. +# fontxdbcs24: FONTX2 file used to rendering DBCS characters (24x24) in DOS/V mode (with V-text and 24-pixel fonts enabled). +# For Simplified Chinese DOS/V, loading the HZK24? font file (https://github.com/aguegu/BitmapFont/tree/master/font) is also supported. +# For Traditional Chinese DOS/V, loading the STDFONT.24 font file from the ETen Chinese DOS system is also supported. +# showdbcsnodosv: Enables rendering of Chinese/Japanese/Korean characters for DBCS code pages in standard VGA and EGA machine types in non-DOS/V and non-TTF mode. +# DOS/V fonts will be used in such cases, which can be adjusted by the above config options (such as fontxdbcs, fontxdbcs14, and fontxdbcs24). +# Setting to "auto" enables Chinese/Japanese/Korean character rendering if a language file is loaded (or with "autodbcs" option set) in such cases. +# Possible values: true, false, 1, 0, auto. +# yen: Enables the Japanese yen symbol at 5ch if it is found at 7fh in a custom SBCS font for the Japanese DOS/V or JEGA emulation. +# fepcontrol: FEP control API for the DOS/V emulation. +# Possible values: ias, mskanji, both. +# vtext1: V-text screen mode 1 for the DOS/V emulation. Enter command "VTEXT 1" for this mode. Note that XGA/SXGA mode is only supported by the svga_s3trio and svga_et4000 machine types. +# Possible values: xga, xga24, sxga, sxga24, svga. +# vtext2: V-text screen mode 2 for the DOS/V emulation. Enter command "VTEXT 2" for this mode. Note that XGA/SXGA mode is only supported by the svga_s3trio and svga_et4000 machine types. +# Possible values: xga, xga24, sxga, sxga24, svga. +# use20pixelfont: Enables the 20 pixel font to be used instead of the 24 pixel system font for the Japanese DOS/V emulation (with V-text enabled). +# j3100: With the setting dosv=jp and a non-off value of this option, the Toshiba J-3100 machine will be emulated with DCGA support. +# Setting to "on" or "auto" starts J-3100 automatically, and with the setting "manual" you can enter J-3100 mode with DCGA command. +# Possible values: off, on, auto, manual, 0, 1, 2. +# j3100type: Specifies the Toshiba J-3100 machine type if J-3100 mode is enabled. The color palette will be changed with different machine types. +# Possible values: default, gt, sgt, gx, gl, sl, sgx, ss, gs, sx, sxb, sxw, sxp, ez, zs, zx. +# j3100colorscroll: Specifies that the color display can be used for scrolling, which is currently incompatible with for example the J-3100 version of the SimCity game. +# The VGA version of the Toshiba Windows 3.1 works fine with the "false" value of this setting, whereas its CGA/EGA version requires a "true" value for this. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> del; j3100backcolor; j3100textcolor +# +dosv = off +getsysfont = true +fontxsbcs = +fontxsbcs16 = +fontxsbcs24 = +fontxdbcs = +fontxdbcs14 = +fontxdbcs24 = +showdbcsnodosv = auto +yen = false +fepcontrol = both +vtext1 = svga +vtext2 = xga +use20pixelfont = false +j3100 = off +j3100type = default +j3100colorscroll = false + +[video] +# vmemsize: Amount of video memory in megabytes. +# The maximum resolution and color depth the svga_s3 will be able to display +# is determined by this value. +# -1: auto (vmemsizekb is ignored) +# 0: 512k (800x600 at 256 colors) if vmemsizekb=0 +# 1: 1024x768 at 256 colors or 800x600 at 64k colors +# 2: 1600x1200 at 256 colors or 1024x768 at 64k colors or 640x480 at 16M colors +# 4: 1600x1200 at 64k colors or 1024x768 at 16M colors +# 8: up to 1600x1200 at 16M colors +# For build engine games, use more memory than in the list above so it can +# use triple buffering and thus won't flicker. +# +# vmemsizekb: Amount of video memory in kilobytes, in addition to vmemsize. +# high intensity blinking: Set to false if you want to see high-intensity background colors instead of blinking foreground text. +# This option has no effect in PC-98 and some other video modes. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> vmemdelay; vbe window granularity; vbe window size; enable 8-bit dac; svga lfb base; pci vga; vga attribute controller mapping; vga bios use rom image; vga bios rom image; vga bios size override; video bios dont duplicate cga first half rom font; video bios always offer 14-pixel high rom font; video bios always offer 16-pixel high rom font; video bios enable cga second half rom font; forcerate; sierra ramdac; sierra ramdac lock 565; vga fill active memory; page flip debug line; vertical retrace poll debug line; cgasnow; vga 3da undefined bits; rom bios 8x8 CGA font; rom bios video parameter table; int 10h points at vga bios; unmask timer on int 10 setmode; vesa bank switching window mirroring; vesa bank switching window range check; vesa zero buffer on get information; vesa set display vsync; vesa lfb base scanline adjust; vesa map non-lfb modes to 128kb region; ega per scanline hpel; allow hpel effects; allow hretrace effects; hretrace effect weight; vesa modelist cap; vesa modelist width limit; vesa modelist height limit; vesa vbe put modelist in vesa information; vesa vbe 1.2 modes are 32bpp; allow low resolution vesa modes; allow explicit 24bpp vesa modes; allow high definition vesa modes; allow unusual vesa modes; allow 32bpp vesa modes; allow 24bpp vesa modes; allow 16bpp vesa modes; allow 15bpp vesa modes; allow 8bpp vesa modes; allow 4bpp vesa modes; allow 4bpp packed vesa modes; allow tty vesa modes; double-buffered line compare; ignore vblank wraparound; ignore extended memory bit; enable vga resize delay; resize only on vga active display width increase; vga palette update on full load; ignore odd-even mode in non-cga modes; ignore sequencer blanking +# +vmemsize = -1 +vmemsizekb = 0 +high intensity blinking = true + +[vsync] +# vsyncmode: Synchronize vsync timing to the host display. Requires calibration within DOSBox-X. +# Possible values: off, on, force, host. +# vsyncrate: Vsync rate used if vsync is enabled. Ignored if vsyncmode is set to host (win32). +# Possible values:. +vsyncmode = off +vsyncrate = 75 + +[cpu] +# core: CPU Core used in emulation. auto will switch to dynamic if available and appropriate. +# For the dynamic core, both dynamic_x86 and dynamic_rec are supported (dynamic_x86 is preferred). +# Windows 95 or other preemptive multitasking OSes will not work with the dynamic_rec core. +# Possible values: auto, dynamic, dynamic_x86, dynamic_nodhfpu, dynamic, dynamic_rec, normal, full, simple. +# fpu: Enable FPU emulation +# Possible values: true, false, 1, 0, auto, 8087, 287, 387. +# segment limits: Enforce checks for segment limits on 80286 and higher CPU types. +# cputype: CPU Type used in emulation. "auto" emulates a 486 which tolerates Pentium instructions. +# "experimental" enables newer instructions not normally found in the CPU types emulated by DOSBox-X, such as FISTTP. +# Possible values: auto, 8086, 8086_prefetch, 80186, 80186_prefetch, 286, 286_prefetch, 386, 386_prefetch, 486old, 486old_prefetch, 486, 486_prefetch, pentium, pentium_mmx, ppro_slow, pentium_ii, pentium_iii, experimental. +# cycles: Number of instructions DOSBox-X tries to emulate each millisecond. +# Setting this value too high results in sound dropouts and lags. +# Cycles can be set in 3 ways: +# 'auto' tries to guess what a game needs. +# It usually works, but can fail for certain games. +# 'fixed #number' will set a fixed number of cycles. This is what you usually +# need if 'auto' fails (Example: fixed 4000). +# 'max' will allocate as much cycles as your computer is able to +# handle. Recommended if better performance is desired. +# Possible values: auto, fixed, max. +# cycleup: Amount of cycles to decrease/increase with the mapped keyboard shortcut. +# cycledown: Setting it lower than 100 will be a percentage. +# turbo: Enables Turbo (Fast Forward) mode to speed up operations. +# apmbios: Emulate Advanced Power Management (APM) BIOS calls. +# integration device: Enable DOSBox-X's integration I/O device, a way for additional software to talk to DOSBox-X. It is currently experimental. +# This can for example be used to return DOSBox-X's current status and by the guest OS to match the mouse pointer position. +# isapnpbios: Emulate ISA Plug & Play BIOS. Enable if using DOSBox-X to run a PnP aware DOS program or if booting Windows 9x. +# Do not disable if Windows 9x is configured around PnP devices, you will likely confuse it. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> processor serial number; double fault; clear trap flag on unhandled int 1; reset on triple fault; always report double fault; always report triple fault; mask stack pointer for enter leave instructions; allow lmsw to exit protected mode; report fdiv bug; enable msr; enable cmpxchg8b; enable syscall; ignore undefined msr; interruptible rep string op; dynamic core cache block size; cycle emulation percentage adjust; stop turbo on key; stop turbo after second; use dynamic core with paging on; ignore opcode 63; apmbios pnp; apm power button event; apmbios version; apmbios allow realmode; apmbios allow 16-bit protected mode; apmbios allow 32-bit protected mode; integration device pnp; isapnpport; realbig16 +# +core = dynamic_x86 +fpu = true +segment limits = true +cputype = ppro_slow +cycles = max +cycleup = 10 +cycledown = 20 +turbo = false +turbo last second = 6 +apmbios = true +integration device = true +isapnpbios = true +stop turbo after second = 6 +stop turbo on key = true + +[keyboard] +# aux: Enable emulation of the 8042 auxiliary port. PS/2 mouse emulation requires this to be enabled. +# You should enable this if you will be running Windows ME or any other OS that does not use the BIOS to receive mouse events. +# allow output port reset: If set (default), allow the application to reset the CPU through the keyboard controller. +# This option is required to allow Windows ME to reboot properly, whereas Windows 9x and earlier +# will reboot without this option using INT 19h +# controllertype: Type of keyboard controller (and keyboard) attached. +# auto Automatically pick according to machine type +# at AT (PS/2) type keyboard +# xt IBM PC/XT type keyboard +# pcjr IBM PCjr type keyboard (only if machine=pcjr) +# pc98 PC-98 keyboard emulation (only if machine=pc98) +# Possible values: auto, at, xt, pcjr, pc98. +# auxdevice: Type of PS/2 mouse attached to the AUX port +# Possible values: none, 2button, 3button, intellimouse, intellimouse45. +aux = true +allow output port reset = true +controllertype = auto +auxdevice = intellimouse + +[ttf] +# font: Specifies a TrueType font to use for the TTF output. If not specified, the built-in TrueType font will be used. +# Either a font name or full font path can be specified. If file ends with the .TTF extension then the extension can be omitted. +# For a font name or relative path, directories such as the working directory and default system font directory will be searched. +# For example, setting it to "consola" or "consola.ttf" will use Consola font (included in Windows); similar for other TTF fonts. +# Additionally, OTF fonts (e.g. OratorStd.otf), .FON fonts (e.g. vgasys.fon), and .TTC fonts (e.g. msgothic.ttc) are also supported. +# To display Chinese/Japanese/Korean text in these code pages, a font with CJK characters is needed (e.g. GNU Unifont or Sarasa Gothic). +# fontbold: You can optionally specify a bold TrueType font for use with the TTF output that will render the bold text style. +# It requires a word processor be set with the wp option, and this actual bold font will be used for the bold style. +# For example, setting it to "consolab" or "consolab.ttf" will use the Consolab font; similar for other TTF fonts. +# fontital: You can optionally specify an italic TrueType font for use with the TTF output that will render the italic text style. +# It requires a word processor be set with the wp option, and this actual italic font will be used for the italic style. +# For example, setting it to "consolai" or "consolai.ttf" will use the Consolai font; similar for other TTF fonts. +# fontboit: You can optionally specify a bold italic TrueType font for use with the TTF output that will render the bold italic text style. +# It requires a word processor be set with the wp option, and this actual bold-italic font will be used for the bold-italic style. +# For example, setting it to "consolaz" or "consolaz.ttf" will use the Consolaz font; similar for other TTF fonts. +# colors: Specifies a color scheme to use for the TTF output by supply all 16 color values in RGB: (r,g,b) or hexadecimal as in HTML: #RRGGBB +# The original DOS colors (0-15): #000000 #0000aa #00aa00 #00aaaa #aa0000 #aa00aa #aa5500 #aaaaaa #555555 #5555ff #55ff55 #55ffff #ff5555 #ff55ff #ffff55 #ffffff +# gray scaled color scheme: (0,0,0) #0e0e0e (75,75,75) (89,89,89) (38,38,38) (52,52,52) #717171 #c0c0c0 #808080 (28,28,28) (150,150,150) (178,178,178) (76,76,76) (104,104,104) (226,226,226) (255,255,255) +# An optional leading "+" sign allows the preset color scheme to be used when switching from another output. +# outputswitch: Specifies the output that DOSBox-X should switch to from the TTF output when a graphical mode is requested, or auto for automatic selection. +# Possible values: auto, surface, opengl, openglnb, openglhq, openglpp, direct3d. +# winperc: Specifies the window percentage for the TTF output (100 = full screen). Ignored if the ptsize setting is specified. +# ptsize: Specifies the font point size for the TTF output. If specified (minimum: 9), it will override the winperc setting. +# lins: Specifies the number of rows on the screen for the TTF output (0 = default). +# cols: Specifies the number of columns on the screen for the TTF output (0 = default). +# righttoleft: If set, DOSBox-X will display text from right to left instead of left to right on the screen for the TTF output. +# This is especially useful for languages which use right-to-left scripts (such as Arabic and Hebrew). +# wp: You can specify a word processor for the TTF output and optionally also a version number for the word processor. +# Supported word processors are WP=WordPerfect, WS=WordStar, XY=XyWrite, FE=FastEdit, and an optional version number. +# For example, WP6 will set the word processor as WordPerfect 6, and XY4 will set the word processor as XyWrite 4. +# Word processor-specific features like on-screen text styles and 512-character font will be enabled based on this. +# bold: If set, DOSBox-X will display bold text in visually (requires a word processor be set) for the TTF output. +# This is done either with the actual bold font specified by the fontbold option, or by making it bold automatically. +# italic: If set, DOSBox-X will display italicized text visually (requires a word processor be set) for the TTF output. +# This is done either with the actual italic font specified by the fontital option, or by slanting the characters automatically. +# underline: If set, DOSBox-X will display underlined text visually (requires a word processor be set) for the TTF output. +# strikeout: If set, DOSBox-X will display strikeout text visually (requires a word processor be set) for the TTF output. +# printfont: If set, DOSBox-X will force to use the current TrueType font (set via font option) for printing in addition to displaying. +# autodbcs: If set, DOSBox-X enables Chinese/Japanese/Korean DBCS (double-byte) characters when these code pages are active by default. +# Only applicable when using a DBCS code page (932: Japanese, 936: Simplified Chinese; 949: Korean; 950: Traditional Chinese) +# This applies to both the display and printing of these characters (see the [printer] section for details of the latter). +# blinkc: If set to true, the cursor blinks for the TTF output; setting it to false will turn the blinking off. +# You can also change the blinking rate by setting an integer between 1 (fastest) and 7 (slowest), or 0 for no cursor. +# gbk: Enables the GBK extension (in addition to the standard GB2312 charset) for the Simplified Chinese TTF output or DOS/V emulation. +# chinasea: Enables the ChinaSea and Big5-2003 extension (in addition to the standard Big5-1984 charset) for the Traditional Chinese TTF output. +# A TTF/OTF font containing such characters (such as the included SarasaGothicFixed TTF font) is needed to correctly render ChinaSea characters. +# dosvfunc: If set, enables FEP control to function for Japanese DOS/V applications, and changes the blinking of character attributes to high brightness. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> wpbg; wpfg; char512; autoboxdraw; halfwidthkana; uao +# +font = +fontbold = +fontital = +fontboit = +colors = +outputswitch = auto +winperc = 60 +ptsize = 0 +lins = 0 +cols = 0 +righttoleft = false +wp = +bold = true +italic = true +underline = true +strikeout = false +printfont = true +autodbcs = true +blinkc = true +gbk = false +chinasea = false +dosvfunc = false + +[voodoo] +# voodoo_card: Enable support for the 3dfx Voodoo card. +# Possible values: false, software, opengl, auto. +# voodoo_maxmem: Specify whether to enable maximum memory size for the Voodoo card. +# If set (on by default), the memory size will be 12MB (4MB front buffer + 2x4MB texture units) +# Otherwise, the memory size will be the standard 4MB (2MB front buffer + 1x2MB texture unit) +# glide: Enable Glide emulation (Glide API passthrough to the host). +# Requires a Glide wrapper - glide2x.dll (Windows), libglide2x.so (Linux), or libglide2x.dylib (macOS). +# lfb: Enable LFB access for Glide. OpenGlide does not support locking aux buffer, please use _noaux modes. +# Possible values: full, full_noaux, read, read_noaux, write, write_noaux, none. +# splash: Show 3dfx splash screen for Glide emulation (Windows; requires 3dfxSpl2.dll). +voodoo_card = software +voodoo_maxmem = true +glide = false +lfb = full_noaux +splash = true + +[mixer] +# nosound: Enable silent mode, sound is still emulated though. +# sample accurate: Enable sample accurate mixing, at the expense of some emulation performance. Enable this option for DOS games and demos +# that require such accuracy for correct Tandy/OPL output including digitized speech. This option can also help eliminate +# minor errors in Gravis Ultrasound emulation that result in random echo/attenuation effects. +# swapstereo: Swaps the left and right stereo channels. +# rate: Mixer sample rate, setting any device's rate higher than this will probably lower their sound quality. +# blocksize: Mixer block size, larger blocks might help sound stuttering but sound will also be more lagged. +# Possible values: 1024, 2048, 4096, 8192, 512, 256. +# prebuffer: How many milliseconds of data to keep on top of the blocksize. +nosound = false +sample accurate = false +swapstereo = false +rate = 44100 +blocksize = 1024 +prebuffer = 25 + +[midi] +# mpu401: Type of MPU-401 to emulate. +# Possible values: intelligent, uart, none. +# mpubase: The IO address of the MPU-401. +# Set to 0 to use a default I/O address. +# 300h to 330h are for use with IBM PC mode. +# C0D0h to F8D0h (in steps of 800h) are for use with NEC PC-98 mode (MPU98). +# 80D2h through 80DEh are for use with NEC PC-98 Sound Blaster 16 MPU-401 emulation. +# If not assigned (0), 330h is the default for IBM PC and E0D0h is the default for PC-98. +# Possible values: 0, 300, 310, 320, 330, 332, 334, 336, 340, 360, c0d0, c8d0, d0d0, d8d0, e0d0, e8d0, f0d0, f8d0, 80d2, 80d4, 80d6, 80d8, 80da, 80dc, 80de. +# mididevice: Device that will receive the MIDI data from MPU-401. +# Possible values: default, win32, alsa, oss, coreaudio, coremidi, mt32, synth, fluidsynth, timidity, none. +# midiconfig: Special configuration options for the device driver. This is usually the id or part of the name of the device you want to use +# (find the id/name with mixer/listmidi). +# Or in the case of coreaudio or synth, you can specify a soundfont here. +# When using a Roland MT-32 rev. 0 as midi output device, some games may require a delay in order to prevent 'buffer overflow' issues. +# In that case, add 'delaysysex', for example: midiconfig=2 delaysysex +# See the README/Manual for more details. +# samplerate: Sample rate for MIDI synthesizer, if applicable. +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# mpuirq: MPU-401 IRQ. -1 to automatically choose. +# mt32.romdir: Name of the directory where MT-32 Control and PCM ROM files can be found. Emulation requires these files to work. +# Accepted file names are as follows: +# MT32_CONTROL.ROM or CM32L_CONTROL.ROM - control ROM file. +# MT32_PCM.ROM or CM32L_PCM.ROM - PCM ROM file. +# mt32.model: Model of the MT-32 synthesizer to use. +# Possible values: cm32l, mt32, auto. +# fluid.driver: Driver to use with Fluidsynth, not needed under Windows. Available drivers depend on what Fluidsynth was compiled with. +# Possible values: pulseaudio, alsa, oss, coreaudio, dsound, portaudio, sndman, jack, file, default. +# fluid.soundfont: Soundfont (.SF2 or .SF3) to use with Fluidsynth. One must be specified (e.g. GeneralUser_GS.sf2). +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> mt32.reverse.stereo; mt32.verbose; mt32.thread; mt32.chunk; mt32.prebuffer; mt32.partials; mt32.dac; mt32.analog; mt32.output.gain; mt32.reverb.mode; mt32.reverb.output.gain; mt32.reverb.time; mt32.reverb.level; mt32.rate; mt32.src.quality; mt32.niceampramp; fluid.samplerate; fluid.gain; fluid.polyphony; fluid.cores; fluid.periods; fluid.periodsize; fluid.reverb; fluid.chorus; fluid.reverb.roomsize; fluid.reverb.damping; fluid.reverb.width; fluid.reverb.level; fluid.chorus.number; fluid.chorus.level; fluid.chorus.speed; fluid.chorus.depth; fluid.chorus.type +# +mpu401 = intelligent +mpubase = 0 +mididevice = default +midiconfig = +samplerate = 44100 +mpuirq = -1 +mt32.romdir = +mt32.model = auto +fluid.driver = default +fluid.soundfont = + +[sblaster] +# sbtype: Type of Sound Blaster to emulate. 'gb' is Game Blaster. +# Possible values: sb1, sb2, sbpro1, sbpro2, sb16, sb16vibra, gb, ess688, reveal_sc400, none. +# sbbase: The IO address of the Sound Blaster. +# 220h to 2E0h are for use with IBM PC Sound Blaster emulation. +# D2h to DEh are for use with NEC PC-98 Sound Blaster 16 emulation. +# Possible values: 220, 240, 260, 280, 2a0, 2c0, 2e0, d2, d4, d6, d8, da, dc, de. +# irq: The IRQ number of the Sound Blaster (usually 5 or 7, depending on the sound card type and the game). +# Set to 0 for the default setting of the sound card, or set to -1 to start DOSBox-X with the IRQ unassigned. +# Possible values: 7, 5, 3, 9, 10, 11, 12, 0, -1. +# dma: The DMA number of the Sound Blaster. Set to -1 to start DOSBox-X with the DMA unassigned. +# Possible values: 1, 5, 0, 3, 6, 7, -1. +# hdma: The High DMA number of the Sound Blaster. Set to -1 to start DOSBox-X with the High DMA unassigned. +# Possible values: 1, 5, 0, 3, 6, 7, -1. +# enable speaker: Start the DOS virtual machine with the Sound Blaster speaker enabled. +# Sound Blaster Pro and older cards have a speaker disable/enable command. +# Normally the card boots up with the speaker disabled. If a DOS game or demo +# attempts to play without enabling the speaker, set this option to true to +# compensate. This setting has no meaning if emulating a Sound Blaster 16 card. +# sbmixer: Allow the Sound Blaster mixer to modify the DOSBox-X mixer. +# oplmode: Type of OPL emulation. On 'auto' the mode is determined by the 'sbtype' setting. +# All OPL modes are AdLib-compatible, except for 'cms' (set 'sbtype=none' with 'cms' for a Game Blaster). +# Possible values: auto, cms, opl2, dualopl2, opl3, opl3gold, none, hardware, hardwaregb. +# oplemu: Provider for the OPL emulation. 'compat' might provide better quality. +# 'nuked' is the most accurate (but the most CPU-intensive). See oplrate as well. +# Possible values: default, compat, fast, nuked, mame, opl2board, opl3duoboard, retrowave_opl3. +# oplrate: Sample rate of OPL music emulation. Use 49716 for highest quality (set the mixer rate accordingly). +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# oplport: Serial port of the OPL2 Audio Board when oplemu=opl2board, opl2mode will become 'opl2' automatically. +# retrowave_bus: Bus of the Retrowave series board (serial/spi). SPI is only supported on Linux. +# retrowave_port: Serial port of the Retrowave series board. +# hardwarebase: base address of the real hardware Sound Blaster: +# 210,220,230,240,250,260,280 +# goldplay: Enable goldplay emulation. +# blaster environment variable: Whether or not to set the BLASTER environment variable automatically at startup +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> mindma; irq hack; dsp command aliases; pic unmask irq; enable asp; disable filtering; dsp write buffer status must return 0x7f or 0xff; pre-set sbpro stereo; adlib force timer overflow on detect; retrowave_spi_cs; force dsp auto-init; force goldplay; goldplay stereo; dsp require interrupt acknowledge; dsp write busy delay; sample rate limits; instant direct dac; stereo control with sbpro only; dsp busy cycle rate; dsp busy cycle always; dsp busy cycle duty; io port aliasing +# +sbtype = sb16 +sbbase = 220 +irq = 7 +dma = 1 +hdma = 5 +enable speaker = false +sbmixer = true +oplmode = auto +oplemu = default +oplrate = 44100 +oplport = +retrowave_bus = serial +retrowave_port = +hardwarebase = 220 +goldplay = true +blaster environment variable = true + +[gus] +# gus: Enable the Gravis Ultrasound emulation. +# gusrate: Sample rate of Ultrasound emulation. +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# gusmemsize: Amount of RAM on the Gravis Ultrasound in KB. Set to -1 for default. +# gus master volume: Master Gravis Ultrasound GF1 volume, in decibels. Reducing the master volume can help with games or demoscene productions where the music is too loud and clipping. +# gusbase: The IO base address of the Gravis Ultrasound. +# Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300, 210, 230, 250. +# gusirq: The IRQ number of the Gravis Ultrasound. +# Possible values: 5, 3, 7, 9, 10, 11, 12. +# gusdma: The DMA channel of the Gravis Ultrasound. +# Possible values: 3, 0, 1, 5, 6, 7. +# gustype: Type of Gravis Ultrasound to emulate. +# classic Original Gravis Ultrasound chipset +# classic37 Original Gravis Ultrasound with ICS Mixer (rev 3.7) +# max Gravis Ultrasound MAX emulation (with CS4231 codec) +# interwave Gravis Ultrasound Plug & Play (interwave) +# Possible values: classic, classic37, max, interwave. +# ultradir: Path to Ultrasound directory. In this directory +# there should be a MIDI directory that contains +# the patch files for GUS playback. Patch sets used +# with Timidity should work fine. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> autoamp; unmask dma; ignore channel count while active; pic unmask irq; startup initialized; dma enable on dma control polling; clear dma tc irq if excess polling; force master irq enable; gus panning table; gus fixed render rate; irq hack +# +gus = false +gusrate = 44100 +gusmemsize = -1 +gus master volume = 0.00 +gusbase = 240 +gusirq = 5 +gusdma = 3 +gustype = classic +ultradir = C:\ULTRASND + +[innova] +# innova: Enable the Innovation SSI-2001 emulation. +# samplerate: Sample rate of Innovation SSI-2001 emulation +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# sidbase: SID base port (typically 280h). +# Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300. +# quality: Set SID emulation quality level (0 to 3). +# Possible values: 0, 1, 2, 3. +innova = false +samplerate = 22050 +sidbase = 280 +quality = 0 + +[speaker] +# pcspeaker: Enable PC-Speaker emulation. +# pcrate: Sample rate of the PC-Speaker sound generation. +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# tandy: Enable Tandy Sound System emulation. For 'auto', emulation is present only if machine is set to 'tandy'. +# Possible values: auto, on, off. +# tandyrate: Sample rate of the Tandy 3-Voice generation. +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# disney: Enable Disney Sound Source emulation. (Covox Voice Master and Speech Thing compatible). +# ps1audio: Enable PS1 audio emulation. +# Possible values: on, off. +# ps1audiorate: Sample rate of the PS1 audio emulation. +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> pcspeaker clock gate enable at startup; initial frequency +# +pcspeaker = true +pcrate = 65536 +tandy = auto +tandyrate = 44100 +disney = false +ps1audio = off +ps1audiorate = 22050 + +[joystick] +# joysticktype: Type of joystick to emulate: auto (default), +# none (disables joystick emulation), +# 2axis (supports two joysticks), +# 4axis (supports one joystick, first joystick used), +# 4axis_2 (supports one joystick, second joystick used), +# fcs (Thrustmaster), ch (CH Flightstick). +# auto chooses emulation depending on real joystick(s). +# (Remember to reset DOSBox-X's mapperfile if you saved it earlier) +# Possible values: auto, 2axis, 4axis, 4axis_2, fcs, ch, none. +# timed: enable timed intervals for axis. Experiment with this option, if your joystick drifts (away). +# autofire: continuously fires as long as you keep the button pressed. +# swap34: swap the 3rd and the 4th axis. can be useful for certain joysticks. +# buttonwrap: enable button wrapping at the number of emulated buttons. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> joy1deadzone1; joy1deadzone2; joy2deadzone1; joy1response1; joy1response2; joy2response1; joy1axis0; joy1axis1; joy1axis2; joy1axis3; joy1axis4; joy1axis5; joy1axis6; joy1axis7; joy2axis0; joy2axis1; joy2axis2; joy2axis3; joy2axis4; joy2axis5; joy2axis6; joy2axis7 +# +joysticktype = auto +timed = true +autofire = false +swap34 = false +buttonwrap = false + +[mapper] +# joy1deadzone0-: deadzone for joystick 1 axis 0- +# joy1deadzone0+: deadzone for joystick 1 axis 0+ +# joy1deadzone1-: deadzone for joystick 1 axis 1- +# joy1deadzone1+: deadzone for joystick 1 axis 1+ +# joy1deadzone2-: deadzone for joystick 1 axis 2- +# joy1deadzone2+: deadzone for joystick 1 axis 2+ +# joy1deadzone3-: deadzone for joystick 1 axis 3- +# joy1deadzone3+: deadzone for joystick 1 axis 3+ +# joy1deadzone4-: deadzone for joystick 1 axis 4- +# joy1deadzone4+: deadzone for joystick 1 axis 4+ +# joy1deadzone5-: deadzone for joystick 1 axis 5- +# joy1deadzone5+: deadzone for joystick 1 axis 5+ +# joy1deadzone6-: deadzone for joystick 1 axis 6- +# joy1deadzone6+: deadzone for joystick 1 axis 6+ +# joy1deadzone7-: deadzone for joystick 1 axis 7- +# joy1deadzone7+: deadzone for joystick 1 axis 7+ +# joy2deadzone0-: deadzone for joystick 2 axis 0- +# joy2deadzone0+: deadzone for joystick 2 axis 0+ +# joy2deadzone1-: deadzone for joystick 2 axis 1- +# joy2deadzone1+: deadzone for joystick 2 axis 1+ +# joy2deadzone2-: deadzone for joystick 2 axis 2- +# joy2deadzone2+: deadzone for joystick 2 axis 2+ +# joy2deadzone3-: deadzone for joystick 2 axis 3- +# joy2deadzone3+: deadzone for joystick 2 axis 3+ +# joy2deadzone4-: deadzone for joystick 2 axis 4- +# joy2deadzone4+: deadzone for joystick 2 axis 4+ +# joy2deadzone5-: deadzone for joystick 2 axis 5- +# joy2deadzone5+: deadzone for joystick 2 axis 5+ +# joy2deadzone6-: deadzone for joystick 2 axis 6- +# joy2deadzone6+: deadzone for joystick 2 axis 6+ +# joy2deadzone7-: deadzone for joystick 2 axis 7- +# joy2deadzone7+: deadzone for joystick 2 axis 7+ +joy1deadzone0- = 0.60 +joy1deadzone0+ = 0.60 +joy1deadzone1- = 0.60 +joy1deadzone1+ = 0.60 +joy1deadzone2- = 0.60 +joy1deadzone2+ = 0.60 +joy1deadzone3- = 0.60 +joy1deadzone3+ = 0.60 +joy1deadzone4- = 0.60 +joy1deadzone4+ = 0.60 +joy1deadzone5- = 0.60 +joy1deadzone5+ = 0.60 +joy1deadzone6- = 0.60 +joy1deadzone6+ = 0.60 +joy1deadzone7- = 0.60 +joy1deadzone7+ = 0.60 +joy2deadzone0- = 0.60 +joy2deadzone0+ = 0.60 +joy2deadzone1- = 0.60 +joy2deadzone1+ = 0.60 +joy2deadzone2- = 0.60 +joy2deadzone2+ = 0.60 +joy2deadzone3- = 0.60 +joy2deadzone3+ = 0.60 +joy2deadzone4- = 0.60 +joy2deadzone4+ = 0.60 +joy2deadzone5- = 0.60 +joy2deadzone5+ = 0.60 +joy2deadzone6- = 0.60 +joy2deadzone6+ = 0.60 +joy2deadzone7- = 0.60 +joy2deadzone7+ = 0.60 + +[serial] +# serial1: serial1-9 -- set type of device connected to the serial (COM) port. +# Can be disabled, dummy, file, modem, nullmodem, directserial. +# Additional parameters must be in the same line in the form of +# parameter:value. Parameter for all types is irq (optional). +# for file: specify an output file +# Additional parameters: +# timeout: = how long to wait before closing the file on inactivity (default:0), +# squote to use single quotes instead of double quotes for quoted program commands. +# shellhide to hide the command window when opening programs on the Windows platform. +# openwith:: start a program to open the output file. +# openerror:: start a program to open the output file if an error had occurred. +# Example: serial1=file file:output1.txt timeout:1000 openwith:notepad +# for directserial: realport (required), rxdelay (optional). +# (realport:COM1 realport:ttyS0). +# for modem: listenport (optional). +# for nullmodem: server, rxdelay, txdelay, telnet, usedtr, +# transparent, port, inhsocket, sock, nonlocal (all optional). +# connections are limited to localhost unless you specify nonlocal:1 +# "sock" parameter specifies the protocol to be used by both sides +# of the conection. 0 for TCP and 1 for ENet reliable UDP. +# Example: serial1=modem listenport:5000 sock:1 +# Note: COM1-4 are standard COM ports in DOS, whereas COM5-9 are extended COM ports. +# You can optionally specify base addresses and IRQs for them with base: and irq: options. +# Serial port settings can also be changed via the built-in SERIAL command. +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial2: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial3: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial4: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial5: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial6: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial7: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial8: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial9: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# phonebookfile: File used to map fake phone numbers to addresses. +serial1 = dummy +serial2 = disabled +serial3 = disabled +serial4 = disabled +serial5 = disabled +serial6 = disabled +serial7 = disabled +serial8 = disabled +serial9 = disabled +phonebookfile = phonebook-dosbox-x.txt + +[parallel] +# parallel1: parallel1-9 -- set type of device connected to the parallel (LPT) port. +# Can be: +# reallpt (direct parallel port passthrough), +# file (records data to a file or passes it to a device), +# printer (virtual dot-matrix printer, see [printer] section) +# disney (attach Disney Sound Source emulation to this port) +# Additional parameters must be in the same line in the form of +# parameter:value. +# for reallpt: +# Windows: +# realbase (the base address of your real parallel port). +# Default: 378 +# ecpbase (base address of the ECP registers, optional). +# Linux: realport (the parallel port device i.e. /dev/parport0). +# for file: +# dev: (i.e. dev:lpt1) to forward data to a device, +# or append: appends data to the specified file. +# Without the above parameters data is written to files in the capture dir. +# Additional parameters: +# timeout: = how long to wait before closing the file on inactivity (default:0 or 500), +# squote to use single quotes instead of double quotes for quoted program commands. +# shellhide to hide the command window when opening programs on the Windows platform. +# addFF to add a formfeed when closing, addLF to add a linefeed if the app doesn't. +# cp: to perform codepage translation, i.e. cp:437 +# openps:: start a program to open the file if the print output is detected to be PostScript. +# openpcl:: start a program to open the file if the print output is detected to be PCL. +# openwith:: start a program to open the file in all other conditions. +# openerror:: start a program to open the file if an error had occurred. +# Example: parallel1=file file:output1.prn timeout:1000 openpcl:pcl6 openps:gswin32c openwith:notepad +# for printer: +# printer still has its own configuration section above. +# Note: LPT1-3 are standard LPT ports in DOS, whereas LPT4-9 are extended LPT ports. +# You can optionally specify base addresses and IRQs for them with base: and irq: options. +# Parallel port settings can also be changed via the built-in PARALLEL command. +# parallel2: see parallel1 +# parallel3: see parallel1 +# parallel4: see parallel1 +# parallel5: see parallel1 +# parallel6: see parallel1 +# parallel7: see parallel1 +# parallel8: see parallel1 +# parallel9: see parallel1 +# dongle: Enable dongle +parallel1 = printer +parallel2 = disabled +parallel3 = disabled +parallel4 = disabled +parallel5 = disabled +parallel6 = disabled +parallel7 = disabled +parallel8 = disabled +parallel9 = disabled +dongle = false + +[printer] +# printer: Enable printer emulation. +# dpi: Resolution of printer (default 360). +# width: Width of paper in 1/10 inch (default 85 = 8.5''). +# height: Height of paper in 1/10 inch (default 110 = 11.0''). +# printoutput: Output method for finished pages: +# png : Creates PNG images (default) +# ps : Creates PostScript +# bmp : Creates BMP images (very huge files, not recommended) +# printer : Send to an actual printer in Windows (specify a printer, or Print dialog will appear) +# multipage: Adds all pages to one PostScript file or printer job until CTRL-F2 is pressed. +# device: Specify the Windows printer device to use. You can see the list of devices from the Help +# menu ('List printer devices') or the Status Window. Then make your choice and put either +# the printer device number (e.g. 2) or your printer name (e.g. Microsoft Print to PDF). +# Leaving it empty will show the Windows Print dialog (or '-' for showing once). +# docpath: The path (directory) where the output files are stored. +# fontpath: The path (directory) where the printer fonts (courier.ttf, ocra.ttf, roman.ttf, sansserif.ttf, script.ttf) are located. +# openwith: Start the specified program to open the output file. +# openerror: Start the specified program to open the output file if an error had occurred. +# printdbcs: Allows DOSBox-X to print Chinese/Japanese/Korean DBCS (double-byte) characters when these code pages are active. +# If set to auto (default), this is enabled only for the TrueType font (TTF) output with the DBCS support enabled. +# Only applicable when using a DBCS code page (932: Japanese, 936: Simplified Chinese; 949: Korean; 950: Traditional Chinese) +# Possible values: true, false, 1, 0, auto. +# shellhide: If set, the command window will be hidden for openwith/openerror options on the Windows platform. +# timeout: (in milliseconds) if nonzero: the time the page will be ejected automatically after when no more data arrives at the printer. +printer = true +dpi = 360 +width = 85 +height = 110 +printoutput = printer +multipage = false +device = - +docpath = . +fontpath = FONTS +openwith = +openerror = +printdbcs = auto +shellhide = false +timeout = 0 + +[dos] +# xms: Enable XMS support. +# xms handles: Number of XMS handles available for the DOS environment, or 0 to use a reasonable default +# shell configuration as commands: Allow entering dosbox-x.conf configuration parameters as shell commands to get and set settings. +# This is disabled by default to avoid conflicts between commands and executables. +# It is recommended to get and set dosbox-x.conf settings using the CONFIG command instead. +# Compatibility with DOSBox SVN can be improved by enabling this option. +# hma: Report through XMS that HMA exists (not necessarily available) +# hard drive data rate limit: Slow down (limit) hard disk throughput. This setting controls the limit in bytes/second. +# Set to 0 to disable the limit, or -1 (default) to use a reasonable limit. +# The disk I/O performance as in DOSBox SVN can be achieved by setting this to 0. +# floppy drive limit: Slow down (limit) floppy disk throughput. This setting controls the limit in bytes/second. +# Set to 0 to disable the limit, or -1 (default) to use a reasonable limit. +# The disk I/O performance as in DOSBox SVN can be achieved by setting this to 0. +# ansi.sys: If set (by default), ANSI.SYS emulation is on. If clear, ANSI.SYS is not emulated and will not appear to be installed. +# NOTE: This option has no effect in PC-98 mode where MS-DOS systems integrate ANSI.SYS into the DOS kernel. +# log console: If set, log DOS CON output to the log file. Setting to "quiet" will log DOS CON output only (no debugging output). +# Possible values: true, false, 1, 0, quiet. +# share: Reports SHARE.EXE as resident and provides functions such as file-locking and record-locking, although not all SHARE functions are emulated. +# file access tries: If a positive integer is set, DOSBox-X will try to read/write/lock files directly on mounted local drives for the specified number of times without caching before failing on Windows systems. +# For networked database applications (e.g. dBase, FoxPro, etc), it is strongly recommended to set this to e.g. 3 for correct operations. +# network redirector: Report DOS network redirector as resident. This will allow the host name to be returned unless the secure mode is enabled. +# You can also directly access UNC network paths in the form \\MACHINE\SHARE even if they are not mounted as drives on Windows systems. +# Set either "ipx=true" in [ipx] section or "ne2000=true" in [ne2000] section for a full network redirector environment. +# minimum mcb free: Minimum free segment value to leave free. At startup, the DOS kernel will allocate memory +# up to this point. This can be used to deal with EXEPACK issues or DOS programs that cannot +# be loaded too low in memory. If you want more free conventional memory to be reported, +# you can for example set its value to 1. +# ems: Enable EMS support. The default (=true) provides the best +# compatibility but certain applications may run better with +# other choices, or require EMS support to be disabled (=false) +# to work at all. +# Possible values: true, emsboard, emm386, false, 1, 0. +# umb: Enable UMB support. +# quick reboot: If set, the DOS restart call will reboot the emulated DOS (integrated DOS or guest DOS) instead of the virtual machine. +# +# ver: Set DOS version. Specify as major.minor format. A single number is treated as the major version (compatible with LFN support). Common settings are: +# auto (or unset) Pick a DOS kernel version automatically +# 3.3 MS-DOS 3.3 emulation (not tested!) +# 5.0 MS-DOS 5.0 emulation (recommended for DOS gaming) +# 6.22 MS-DOS 6.22 emulation +# 7.0 MS-DOS 7.0 (or Windows 95 pure DOS mode) emulation +# 7.1 MS-DOS 7.1 (or Windows 98 pure DOS mode) emulation +# Long filename (LFN) support will be enabled with a reported DOS version of 7.0 or higher with "lfn=auto" (default). +# Similarly, FAT32 disk images will be supported with a reported DOS version of 7.1 or higher. +# +# lfn: Enable long filename support. If set to auto (default), LFN support is enabled if the reported DOS version is at least 7.0. +# If set to autostart, the built-in VER command won't activate/deactivate LFN support according to the reported DOS version. +# Possible values: true, false, 1, 0, auto, autostart. +# fat32setversion: Whether DOSBox-X should automatically set the reported DOS version to 7.0/7.10 when it is less than 7.0/7.10 and mounting LBA/FAT32 disk images is requested. +# If set to "ask", a popup message will show up to ask whether DOSBox-X should automatically change the reported DOS version in order to mount the disk image. +# Possible values: ask, auto, manual. +# shellhigh: Load the DOSBox-X command shell into the upper memory when the UMB is available. +# If set to auto (default), it is enabled if the reported DOS version is at least 7.0. +# Possible values: true, false, 1, 0, auto. +# automount: Enable automatic drive mounting in Windows. +# automountall: Automatically mount all available Windows drives at start. +# Possible values: true, false, 1, 0, quiet. +# mountwarning: If set, a warning message will be displayed while trying to auto-mount your Windows host drives. +# autofixwarning: If set to true or both, DOSBox-X shows messages while trying to automatically fix the "Packed file is corrupt" error. +# If set to false or none, DOSBox-X will not show such messages on the screen when the error occurred. +# If set to "a20fix" or "loadfix", DOSBox-X will show the message for the a20fix or the loadfix only. +# Possible values: true, false, 1, 0, both, a20fix, loadfix, none. +# startcmd: Enable START command to start programs to run on the host system. On Windows host programs or commands may also be launched directly. +# starttranspath: Specify whether DOSBox-X should automatically translate all paths in the command-line to host system paths when starting programs to run on the host system. +# startwait: Specify whether DOSBox-X should wait for the host system applications after they are started. +# startquiet: If set, before launching host system applications to run on the host DOSBox-X will not show messages like "Now run it as a Windows application". +# vmware: Enable VMware interface emulation including guest mouse integration (when used along with e.g. VMware mouse driver for Windows 3.x). +# int33: Enable INT 33H for mouse support. +# keyboardlayout: Language code of the keyboard layout (or none). +# customcodepage: Set a custom code page for CHCP command and specify a SBCS code page file, following the standard SBCS code page format. +# Examples of SBCS code pages are available from the Unicode Consortium website: https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/ +# dbcs: Enable DBCS table and Chinese, Japanese, Korean support for the TrueType font (TTF) output. +# CAUTION: Some software will crash without the DBCS table, including the Open Watcom installer. +# dos clipboard device enable: If enabled, a DOS device will be added for bidirectional communications with the shared clipboard. +# Setting to "read" will only allow read access, and setting to "write" will only allow write access. +# Setting to "full" or "true" enables both; setting to "false" or "disabled" disables the access or device. +# The default device name is CLIP$, but can be changed with the "dos clipboard device name" setting below. +# dos clipboard device name: Set DOS device name (up to 8 characters) for bidirectional communications with the shared clipboard. +# If unset or invalid, the default name CLIP$ will be used (e.g. "TYPE CLIP$" shows the clipboard contents). +# It has no effect if "dos clipboard device enable" is disabled, and it is deactivated if the secure mode is enabled. +# dos clipboard api: If set, DOS APIs for communications with the Windows clipboard will be enabled for shared clipboard communications. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> badcommandhandler; hma allow reservation; special operation file prefix; drive z is remote; drive z convert fat; drive z expand path; drive z hide files; hidenonrepresentable; hma minimum allocation; dos sda size; hma free space; cpm compatibility mode; minimum dos initial private segment; minimum mcb segment; enable dummy device mcb; maximum environment block size on exec; additional environment block size on exec; enable a20 on windows init; zero memory on xms memory allocation; vcpi; unmask timer on disk io; zero int 67h if no ems; zero unused int 68h; emm386 startup active; zero memory on ems memory allocation; ems system handle memory size; ems system handle on even megabyte; umb start; umb end; kernel allocation in umb; keep umb on boot; keep private area on boot; private area in umb; autoa20fix; autoloadfix; startincon; int33 hide host cursor if interrupt subroutine; int33 hide host cursor when polling; int33 disable cell granularity; int 13 disk change detect; int 13 extensions; biosps2; int15 wait force unmask irq; int15 mouse callback does not preserve registers; filenamechar; collating and uppercase; con device use int 16h to detect keyboard input; zero memory on int 21h memory allocation; pipe temporary device +# +xms = true +xms handles = 0 +shell configuration as commands = false +hma = true +hard drive data rate limit = 0 +floppy drive data rate limit = 0 +ansi.sys = true +log console = false +share = true +file access tries = 3 +network redirector = true +minimum mcb free = 0 +ems = true +umb = true +quick reboot = false +ver = 7.1 +lfn = true +fat32setversion = auto +shellhigh = auto +automount = true +automountall = false +mountwarning = true +autofixwarning = false +startcmd = false +starttranspath = true +startwait = true +startquiet = false +vmware = true +int33 = true +keyboardlayout = auto +customcodepage = +dbcs = true +dos clipboard device enable = false +dos clipboard device name = CLIP$ +dos clipboard api = true + +[ipx] +# ipx: Enable ipx over UDP/IP emulation. +ipx = false + +[ne2000] +# ne2000: Enable NE2000 Ethernet emulation. Either pcap or slirp backend can be used, switchable via "backend" option. +# Settings for the pcap and slirp backends can be found in the [ethernet, pcap] and [ethernet, slirp] sections. +# Once properly set, load the NE2000 packet driver inside DOSBox-X with base address and interrupt specified below. +# nicbase: The base address of the NE2000 board. +# nicirq: The interrupt it uses. Note serial2 uses IRQ3 as default. +# macaddr: The MAC address the emulator will use for its network adapter. +# If you have multiple DOSBox-Xes running on the same network, +# this has to be changed for each. AC:DE:48 is an address range reserved for +# private use, so modify the last three number blocks, e.g. AC:DE:48:88:99:AB. +# backend: The backend (either pcap or slirp is supported) used for the NE2000 Ethernet emulation. +# If set to "auto", then "slirp" is selected when available, otherwise "pcap" is selected when available. +# NE2000 Ethernet emulation will be disabled if no backend is available (or the specified backend if unavailable). +# Possible values: pcap, slirp, auto, none. +ne2000 = true +nicbase = 300 +nicirq = 10 +macaddr = AC:DE:48:88:99:AA +backend = slirp + +[ethernet, pcap] +# realnic: Specifies which of your host network interfaces is used for pcap. +# Write 'list' here to see the list of devices from the Help +# menu ('List network interfaces') or from the Status Window. +# Then make your choice and put either the interface number +# (e.g. 2) or a part of your adapters name (e.g. VIA here). +# timeout: Specifies the read timeout for the device in milliseconds for the pcap backend, or the default value will be used. +realnic = list +timeout = default + +[ethernet, slirp] +# ipv4_network: The IPv4 network the guest and host services are on. +# ipv4_netmask: The netmask for the IPv4 network. +# ipv4_host: The address of the guest on the IPv4 network. +# ipv4_nameserver: The address of the nameserver service provided by the host on the IPv4 network. +# ipv4_dhcp_start: The start address used for DHCP by the host services on the IPv4 network. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> restricted; disable_host_loopback; mtu; mru; tcp_port_forwards; udp_port_forwards +# +ipv4_network = 10.0.2.0 +ipv4_netmask = 255.255.255.0 +ipv4_host = 10.0.2.2 +ipv4_nameserver = 10.0.2.3 +ipv4_dhcp_start = 10.0.2.15 + +[ide, primary] +# enable: Enable IDE interface +# pnp: List IDE device in ISA PnP BIOS enumeration +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> irq; io; altio; int13fakeio; int13fakev86io; enable pio32; ignore pio32; cd-rom spinup time; cd-rom spindown timeout; cd-rom insertion delay +# +enable = true +pnp = true + +[ide, secondary] +enable = true +pnp = true + +[ide, tertiary] +enable = false +pnp = true + +[ide, quaternary] +enable = false +pnp = true + +[ide, quinternary] +enable = false +pnp = true + +[ide, sexternary] +enable = false +pnp = true + +[ide, septernary] +enable = false +pnp = true + +[ide, octernary] +enable = false +pnp = true + +[fdc, primary] +# enable: Enable floppy controller interface +# pnp: List floppy controller in ISA PnP BIOS enumeration +# mode: Floppy controller mode. What the controller acts like. +# ps2 PS/2 mode (most common) +# ps2_model30 PS/2 model 30 +# at AT mode +# xt PC/XT mode +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> irq; io; dma; int13fakev86io; instant mode; auto-attach to int 13h; chip +# +enable = true +pnp = true +mode = ps2 + +[4dos] +rem = This section is the 4DOS.INI file, if you use 4DOS as the command shell + +[config] +# rem: Records comments (remarks). +# break: Sets or clears extended CTRL+C checking. +# Possible values: on, off. +# numlock: Sets the initial state of the NumLock key. +# Possible values: on, off. +# shell: Specifies the command shell (COMMAND.COM or 4DOS.COM). +# dos: Reports whether DOS occupies HMA and allocates UMB memory (if available). +# fcbs: Number of FCB handles available to DOS programs (1-255). +# files: Number of file handles available to DOS programs (8-255). +# country: Country code for date/time/decimal formats and optionally code page for TTF output and language files. +# lastdrive: The maximum drive letter (A-Z) that can be accessed by programs. +# Possible values: a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z. +rem = This section is DOS's CONFIG.SYS file, not all CONFIG.SYS options supported +break = off +numlock = +shell = +dos = high, umb +fcbs = 100 +files = 200 +country = +lastdrive = a +set path = Z:\;Z:\SYSTEM;Z:\BIN;Z:\DOS;Z:\4DOS;Z:\DEBUG;Z:\TEXTUTIL +set prompt = $P$G +set temp = +install = +installhigh = +device = +devicehigh = + +[autoexec] +# Lines in this section will be run at startup. +# You can put your MOUNT lines here. +config -set turbo=true +IMGMOUNT C .\HDD\WIN95.img -size 512,63,16,1023 -ide 1m +MOUNT O: .\guest_tools\runonce +if exist O:\RUNONCE.BAT call O:\RUNONCE.BAT +if exist O:\RUNONCE.BAT del O:\RUNONCE.BAT +MOUNT -u O: +IMGMOUNT E: .\guest_tools\emptycd.iso -t cdrom -ide 2m +REM MOUNT D: .\SHARED_DRIVE -ide 2s +IMGMOUNT A: .\guest_tools\emptyfdd.img -t floppy +REM BOOT C: diff --git a/installers/dosboxw95/guest_tools/alaunchr/alaunchr.cfg b/installers/dosboxw95/guest_tools/alaunchr/alaunchr.cfg new file mode 100644 index 0000000..804834d --- /dev/null +++ b/installers/dosboxw95/guest_tools/alaunchr/alaunchr.cfg @@ -0,0 +1,3 @@ +D: +launchit.cfg +SHUTDOWN \ No newline at end of file diff --git a/installers/dosboxw95/guest_tools/alaunchr/launchit.cfg b/installers/dosboxw95/guest_tools/alaunchr/launchit.cfg new file mode 100644 index 0000000..4c65af1 --- /dev/null +++ b/installers/dosboxw95/guest_tools/alaunchr/launchit.cfg @@ -0,0 +1 @@ +exampleapp.exe \ No newline at end of file diff --git a/installers/dosboxw95/guest_tools/alaunchr/readme.txt b/installers/dosboxw95/guest_tools/alaunchr/readme.txt new file mode 100644 index 0000000..e5928cc --- /dev/null +++ b/installers/dosboxw95/guest_tools/alaunchr/readme.txt @@ -0,0 +1,15 @@ +This application can be placed in Startup directory inside virtual/emulated machine. +It will check if a file launchit.cfg (or other pre-configured name) is located in D: (or other drive) and if yes, then it will launch an application specified in launchit.cfg file. It can also turn the computer off after execution is completed. + +Create config file for auto-launcher. +Place it next to launcher executable or in %WINDIR%\alaunchr.cfg + +Example contents: + +D: +launchit.cfg +SHUTDOWN\ + +D: is working directory +launchit.cfg is the name of file containing name of executable to launch (both located in working directory) +SHUTDOWN (optional) means the computer will turn off automatically after launched app is closed (only for Win 9x). \ No newline at end of file diff --git a/installers/dosboxw95/guest_tools/alaunchr/src/alaunchr.cpp b/installers/dosboxw95/guest_tools/alaunchr/src/alaunchr.cpp new file mode 100644 index 0000000..0858c13 --- /dev/null +++ b/installers/dosboxw95/guest_tools/alaunchr/src/alaunchr.cpp @@ -0,0 +1,435 @@ +#if defined(UNICODE) && !defined(_UNICODE) + #define _UNICODE +#elif defined(_UNICODE) && !defined(UNICODE) + #define UNICODE +#endif + +#include +#include +#include +#include +#include +#include + +#define IDT_TIMER1 1001 + +/* Declare Windows procedure */ +LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); + +/* Make the class name into a global variable */ +TCHAR szClassName[ ] = _T("AutoAppLauncher"); + +PROCESS_INFORMATION pi; + +bool shutdownOnEnd = false; +bool shutdownOnlyLegacyOS = true; // Shutdown only for Win9x and < XP + +bool pauseEnd = false; + +bool timerOn = false; + +DWORD dwVersion = 0; +DWORD dwMajorVersion = 0; +DWORD dwMinorVersion = 0; +DWORD dwBuild = 0; + + +std::string globalConfigFile = std::string(getenv("WINDIR")) + "\\alaunchr.cfg"; +std::string cfgFile = ""; +std::string startupPath = ""; + +std::string ReadNthLine(const std::string& filename, int N) +{ + std::ifstream in(filename.c_str()); + + std::string s; + //for performance + s.reserve(1024); + + //skip N lines + for(int i = 0; i < N; ++i) + std::getline(in, s); + + std::getline(in,s); + return s; +} + +BOOL FileExists(LPCTSTR szPath) +{ + DWORD dwAttrib = GetFileAttributes(szPath); + + return (dwAttrib != -1 && + !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)); +} + + +bool CheckOneInstance() +{ + + HANDLE m_hStartEvent = CreateEventA( NULL, FALSE, FALSE, "Global\\BALAUNCR" ); + + if(m_hStartEvent == NULL) + { + CloseHandle( m_hStartEvent ); + return false; + } + + + if ( GetLastError() == ERROR_ALREADY_EXISTS ) { + + CloseHandle( m_hStartEvent ); + m_hStartEvent = NULL; + // already exist + // send message from here to existing copy of the application + return false; + } + // the only instance, start in a usual way + return true; +} + +bool startup(LPSTR lpApplicationName, PROCESS_INFORMATION &pi) +{ + STARTUPINFO si; + //PROCESS_INFORMATION pi; + + ZeroMemory( &si, sizeof(si) ); + si.cb = sizeof(si); + ZeroMemory( &pi, sizeof(pi) ); + + // Start the child process. + if( !CreateProcessA( NULL, // No module name (use command line) + lpApplicationName, // Command line + NULL, // Process handle not inheritable + NULL, // Thread handle not inheritable + FALSE, // Set handle inheritance to FALSE + 0, // No creation flags + NULL, // Use parent's environment block + startupPath.c_str(), // Start in... + &si, // Pointer to STARTUPINFO structure + &pi ) // Pointer to PROCESS_INFORMATION structure + ) + { + // Failed + return false; + } + + // Wait until child process exits. + //WaitForSingleObject( pi.hProcess, INFINITE ); + + // Close process and thread handles. + //CloseHandle( pi.hProcess ); + //CloseHandle( pi.hThread ); + return true; +} + + +int WINAPI WinMain (HINSTANCE hThisInstance, + HINSTANCE hPrevInstance, + LPSTR lpszArgument, + int nCmdShow) +{ + + + + /* + // Kill older process if needed (when abort option is passed as an argument) + if ( strstr(lpszArgument, "abort") || strstr(lpszArgument, "ABORT")) + { + PostQuitMessage (0); + } + */ + + + // Don't proceed if there is more than one instance of app + if (!CheckOneInstance()) + { + + pauseEnd = true; + + int msgboxID = MessageBox( + NULL, + (LPCSTR) "Launcher is already running", + (LPCSTR)"Launcher already running", + MB_ICONWARNING | MB_OK + ); + + switch (msgboxID) + { + case IDOK: + + pauseEnd = false; + PostQuitMessage (0); // Quit if no success launching + break; + } + + + PostQuitMessage (0); + } + + // Get the Windows version. + dwVersion = GetVersion(); + dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion))); + dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion))); + + // Get the build number. + + if (dwVersion < 0x80000000) + dwBuild = (DWORD)(HIWORD(dwVersion)); + + + // Load global application config file + // First line = working drive/directory path (example: D: ) + startupPath = ReadNthLine(globalConfigFile,0); + + if (startupPath == "") + { + globalConfigFile = "alaunchr.cfg"; + startupPath = ReadNthLine(globalConfigFile,0); + } + + if (startupPath == "") + { + pauseEnd = true; + + int msgboxID = MessageBox( + NULL, + (LPCSTR) "This application can be used as auto-launcher for other applications (useful for auto-starting applications from VM shared drives).\n" + "Place it in startup directory to use it when Windows starts." + "\n\nCreate config file for auto-launcher.\nPlace it next to launcher executable or in %WINDIR%\\alaunchr.cfg.\n" + "Example contents:\n\nD:\n\launchit.cfg\nSHUTDOWN\n\nD: is working directory\n" + "launchit.cfg is the name of file containing name of executable to launch (both located in working directory)\n" + "SHUTDOWN (optional) means the computer will turn off automatically after launched app is closed (only for Win 9x).", + (LPCSTR)"Auto-launcher", + MB_ICONWARNING | MB_OK + ); + + switch (msgboxID) + { + case IDOK: + + pauseEnd = false; + PostQuitMessage (0); // Quit if no success launching + break; + } + + } + + + // Read app startup path from global config file + startupPath = ReadNthLine(globalConfigFile,0); + if (startupPath == "") PostQuitMessage (0); // Quit if it was not there + + // Read app config file name from global config file + cfgFile = ReadNthLine(globalConfigFile,1); + + if (cfgFile == "") PostQuitMessage (0); // Quit if it was not there + + cfgFile = startupPath + "\\" + cfgFile; + + // Exit if file is not found on drive + if (!FileExists(cfgFile.c_str())) + { + PostQuitMessage (0); + return 0; + } + + // Read shutdown setting in global configuration file + std::string shouldShutdown = ReadNthLine(globalConfigFile,2); + shouldShutdown.erase(std::remove_if(shouldShutdown.begin(), shouldShutdown.end(), ::isspace), shouldShutdown.end()); + if (shouldShutdown == "SHUTDOWN" || shouldShutdown == "shutdown") shutdownOnEnd = true; + else shutdownOnEnd = false; + + + + // Read app config file + std::string cmdLine = ReadNthLine(cfgFile,0); + if (cmdLine == "") PostQuitMessage (0); // Quit if command was not there + + + // Override shutdown setting in app configuration file + std::string arg = ReadNthLine(cfgFile,1); + arg.erase(std::remove_if(arg.begin(), arg.end(), ::isspace), arg.end()); + if (arg == "SHUTDOWN" || arg == "shutdown") shutdownOnEnd = true; + if (arg == "NOSHUTDOWN" || arg == "noshutdown") shutdownOnEnd = true; + + + + + HWND hwnd; /* This is the handle for our window */ + MSG messages; /* Here messages to the application are saved */ + WNDCLASSEX wincl; /* Data structure for the windowclass */ + + /* The Window structure */ + wincl.hInstance = hThisInstance; + wincl.lpszClassName = szClassName; + wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ + wincl.style = CS_DBLCLKS; /* Catch double-clicks */ + wincl.cbSize = sizeof (WNDCLASSEX); + + /* Use default icon and mouse-pointer */ + wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); + wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); + wincl.hCursor = LoadCursor (NULL, IDC_ARROW); + wincl.lpszMenuName = NULL; /* No menu */ + wincl.cbClsExtra = 0; /* No extra bytes after the window class */ + wincl.cbWndExtra = 0; /* structure or the window instance */ + /* Use Windows's default colour as the background of the window */ + wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; + + /* Register the window class, and if it fails quit the program */ + if (!RegisterClassEx (&wincl)) + return 0; + + /* The class is registered, let's create the program*/ + hwnd = CreateWindowEx ( + 0, /* Extended possibilites for variation */ + szClassName, /* Classname */ + _T("AutoAppLauncher"), /* Title Text */ + WS_OVERLAPPEDWINDOW, /* default window */ + CW_USEDEFAULT, /* Windows decides the position */ + CW_USEDEFAULT, /* where the window ends up on the screen */ + 200, /* The programs width */ + 200, /* and height in pixels */ + HWND_DESKTOP, /* The window is a child-window to desktop */ + NULL, /* No menu */ + hThisInstance, /* Program Instance handler */ + NULL /* No Window Creation data */ + ); + + /* Make the window visible on the screen */ + //ShowWindow (hwnd, nCmdShow); + + std::string cmdToLaunch = startupPath + "\\" + cmdLine; + + + bool forceShutdown = false; + + std::string cmd = cmdLine; + cmd.erase(std::remove_if(cmd.begin(), cmd.end(), ::isspace), cmd.end()); + if (cmd == "SHUTDOWN" || cmd == "shutdown") + { + shutdownOnEnd = false; + pauseEnd = true; + + if (shutdownOnlyLegacyOS) + { + if (dwMajorVersion >= 3 && dwMajorVersion <= 5) WinExec("C:\\WINDOWS\\RUNDLL32.EXE user.exe,ExitWindows",0); + } + else WinExec("C:\\WINDOWS\\RUNDLL32.EXE user.exe,ExitWindows",0); + PostQuitMessage(0); + + forceShutdown = true; + + } + else timerOn = true; + + + if (arg == "NOWORKINGDIR" || arg == "noworkingdir") + { + cmdToLaunch = cmdLine; + startupPath = "C:\\"; + } + + + if (!forceShutdown && cmdToLaunch != "" && !startup((char*) cmdToLaunch.c_str(), pi)) + { + + pauseEnd = true; + + int msgboxID = MessageBox( + NULL, + (LPCSTR) (std::string("Unable to execute file:\n") + cmdToLaunch).c_str(), + (LPCSTR)"Launcher error", + MB_ICONWARNING | MB_OK + ); + + switch (msgboxID) + { + case IDOK: + + pauseEnd = false; + PostQuitMessage (0); // Quit if no success launching + break; + } + + + } + + + + + + + + + +SetTimer(hwnd, // handle to main window + IDT_TIMER1, // timer identifier + 200, // interval in milliseconds + (TIMERPROC) NULL); // no timer callback + + + //PostQuitMessage (0); + + + /* Run the message loop. It will run until GetMessage() returns 0 */ + while (GetMessage (&messages, NULL, 0, 0)) + { + /* Translate virtual-key messages into character messages */ + TranslateMessage(&messages); + /* Send message to WindowProcedure */ + DispatchMessage(&messages); + } + + /* The program return-value is 0 - The value that PostQuitMessage() gave */ + return messages.wParam; +} + + +/* This function is called by the Windows function DispatchMessage() */ + +LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) /* handle the messages */ + { + case WM_DESTROY: + PostQuitMessage (0); /* send a WM_QUIT to the message queue */ + break; + + case WM_TIMER: + switch (wParam) + { + case IDT_TIMER1: + + if (timerOn) + { + // process the timer + // Check if launched application is still working + DWORD exitCode; + GetExitCodeProcess(pi.hProcess, &exitCode); + if (exitCode != STILL_ACTIVE && !pauseEnd) + { + if (shutdownOnEnd) + { + if (shutdownOnlyLegacyOS) + { + if (dwMajorVersion >= 3 && dwMajorVersion <= 5) WinExec("C:\\WINDOWS\\RUNDLL32.EXE user.exe,ExitWindows",0); + } + else WinExec("C:\\WINDOWS\\RUNDLL32.EXE user.exe,ExitWindows",0); + } + + PostQuitMessage(0); + } + } + + + return 0; + } + + + default: /* for messages that we don't deal with */ + return DefWindowProc (hwnd, message, wParam, lParam); + } + + return 0; +} diff --git a/installers/dosboxw95/guest_tools/emptycd.iso b/installers/dosboxw95/guest_tools/emptycd.iso new file mode 100644 index 0000000..4453269 Binary files /dev/null and b/installers/dosboxw95/guest_tools/emptycd.iso differ diff --git a/installers/dosboxw95/guest_tools/emptyfdd.IMG b/installers/dosboxw95/guest_tools/emptyfdd.IMG new file mode 100644 index 0000000..6151095 Binary files /dev/null and b/installers/dosboxw95/guest_tools/emptyfdd.IMG differ diff --git a/installers/dosboxw95/guest_tools/guest-scripts/1024_16bpp.bat b/installers/dosboxw95/guest_tools/guest-scripts/1024_16bpp.bat new file mode 100644 index 0000000..439bf8a --- /dev/null +++ b/installers/dosboxw95/guest_tools/guest-scripts/1024_16bpp.bat @@ -0,0 +1,18 @@ +@echo off +mkdir C:\WINDOWS\TEMP +echo REGEDIT4 > C:\WINDOWS\TEMP\set1024.reg +echo. >> C:\WINDOWS\TEMP\set1024.reg +echo [HKEY_LOCAL_MACHINE\Config\0001\Display\Settings\] >> C:\WINDOWS\TEMP\set1024.reg +echo "fonts.fon"="vgasys.fon" >> C:\WINDOWS\TEMP\set1024.reg +echo "fixedfon.fon"="vgafix.fon" >> C:\WINDOWS\TEMP\set1024.reg +echo "oemfonts.fon"="vgaoem.fon" >> C:\WINDOWS\TEMP\set1024.reg +echo "DPILogicalX"="96" >> C:\WINDOWS\TEMP\set1024.reg +echo "DPILogicalY"="96" >> C:\WINDOWS\TEMP\set1024.reg +echo "DPIPhysicalX"="96" >> C:\WINDOWS\TEMP\set1024.reg +echo "DPIPhysicalY"="96" >> C:\WINDOWS\TEMP\set1024.reg +echo "BitsPerPixel"="16" >> C:\WINDOWS\TEMP\set1024.reg +echo "Resolution"="1024,768" >> C:\WINDOWS\TEMP\set1024.reg +echo "DisplayFlags"="0" >> C:\WINDOWS\TEMP\set1024.reg + +C:\WINDOWS\REGEDIT.EXE /L:C:\WINDOWS\SYSTEM.DAT /R:C:\WINDOWS\USER.DAT C:\WINDOWS\TEMP\set1024.reg +del C:\WINDOWS\TEMP\set1024.reg \ No newline at end of file diff --git a/installers/dosboxw95/guest_tools/guest-scripts/640_16bpp.bat b/installers/dosboxw95/guest_tools/guest-scripts/640_16bpp.bat new file mode 100644 index 0000000..e1ac519 --- /dev/null +++ b/installers/dosboxw95/guest_tools/guest-scripts/640_16bpp.bat @@ -0,0 +1,18 @@ +@echo off +mkdir C:\WINDOWS\TEMP +echo REGEDIT4 > C:\WINDOWS\TEMP\set640.reg +echo. >> C:\WINDOWS\TEMP\set640.reg +echo [HKEY_LOCAL_MACHINE\Config\0001\Display\Settings\] >> C:\WINDOWS\TEMP\set640.reg +echo "fonts.fon"="vgasys.fon" >> C:\WINDOWS\TEMP\set640.reg +echo "fixedfon.fon"="vgafix.fon" >> C:\WINDOWS\TEMP\set640.reg +echo "oemfonts.fon"="vgaoem.fon" >> C:\WINDOWS\TEMP\set640.reg +echo "DPILogicalX"="96" >> C:\WINDOWS\TEMP\set640.reg +echo "DPILogicalY"="96" >> C:\WINDOWS\TEMP\set640.reg +echo "DPIPhysicalX"="96" >> C:\WINDOWS\TEMP\set640.reg +echo "DPIPhysicalY"="96" >> C:\WINDOWS\TEMP\set640.reg +echo "BitsPerPixel"="16" >> C:\WINDOWS\TEMP\set640.reg +echo "Resolution"="640,480" >> C:\WINDOWS\TEMP\set640.reg +echo "DisplayFlags"="0" >> C:\WINDOWS\TEMP\set640.reg + +C:\WINDOWS\REGEDIT.EXE /L:C:\WINDOWS\SYSTEM.DAT /R:C:\WINDOWS\USER.DAT C:\WINDOWS\TEMP\set640.reg +del C:\WINDOWS\TEMP\set640.reg \ No newline at end of file diff --git a/installers/dosboxw95/guest_tools/guest-scripts/800_16bpp.bat b/installers/dosboxw95/guest_tools/guest-scripts/800_16bpp.bat new file mode 100644 index 0000000..851b6af --- /dev/null +++ b/installers/dosboxw95/guest_tools/guest-scripts/800_16bpp.bat @@ -0,0 +1,18 @@ +@echo off +mkdir C:\WINDOWS\TEMP +echo REGEDIT4 > C:\WINDOWS\TEMP\set800.reg +echo. >> C:\WINDOWS\TEMP\set800.reg +echo [HKEY_LOCAL_MACHINE\Config\0001\Display\Settings\] >> C:\WINDOWS\TEMP\set800.reg +echo "fonts.fon"="vgasys.fon" >> C:\WINDOWS\TEMP\set800.reg +echo "fixedfon.fon"="vgafix.fon" >> C:\WINDOWS\TEMP\set800.reg +echo "oemfonts.fon"="vgaoem.fon" >> C:\WINDOWS\TEMP\set800.reg +echo "DPILogicalX"="96" >> C:\WINDOWS\TEMP\set800.reg +echo "DPILogicalY"="96" >> C:\WINDOWS\TEMP\set800.reg +echo "DPIPhysicalX"="96" >> C:\WINDOWS\TEMP\set800.reg +echo "DPIPhysicalY"="96" >> C:\WINDOWS\TEMP\set800.reg +echo "BitsPerPixel"="16" >> C:\WINDOWS\TEMP\set800.reg +echo "Resolution"="800,600" >> C:\WINDOWS\TEMP\set800.reg +echo "DisplayFlags"="0" >> C:\WINDOWS\TEMP\set800.reg + +C:\WINDOWS\REGEDIT.EXE /L:C:\WINDOWS\SYSTEM.DAT /R:C:\WINDOWS\USER.DAT C:\WINDOWS\TEMP\set800.reg +del C:\WINDOWS\TEMP\set800.reg \ No newline at end of file diff --git a/installers/dosboxw95/guest_tools/guest-scripts/mruclear.bat b/installers/dosboxw95/guest_tools/guest-scripts/mruclear.bat new file mode 100644 index 0000000..a85daae --- /dev/null +++ b/installers/dosboxw95/guest_tools/guest-scripts/mruclear.bat @@ -0,0 +1,12 @@ +@echo off +mkdir C:\WINDOWS\TEMP +echo REGEDIT4 > C:\WINDOWS\TEMP\mruclear.reg +echo. >> C:\WINDOWS\TEMP\mruclear.reg +echo [HKEY_CURRENT_USER\InstallLocationsMRU] >> C:\WINDOWS\TEMP\mruclear.reg +echo "a"="C:\\WIN95" >> C:\WINDOWS\TEMP\mruclear.reg +echo "MRUList"="abc" >> C:\WINDOWS\TEMP\mruclear.reg +echo "b"="C:\\DRIVERS" >> C:\WINDOWS\TEMP\mruclear.reg +echo "c"="A:\\" >> C:\WINDOWS\TEMP\mruclear.reg + +C:\WINDOWS\REGEDIT.EXE /L:C:\WINDOWS\SYSTEM.DAT /R:C:\WINDOWS\USER.DAT C:\WINDOWS\TEMP\mruclear.reg +del C:\WINDOWS\TEMP\mruclear.reg \ No newline at end of file diff --git a/installers/dosboxw95/guest_tools/guest-scripts/nostsnd.bat b/installers/dosboxw95/guest_tools/guest-scripts/nostsnd.bat new file mode 100644 index 0000000..7c7086e --- /dev/null +++ b/installers/dosboxw95/guest_tools/guest-scripts/nostsnd.bat @@ -0,0 +1,17 @@ +@echo off +mkdir C:\WINDOWS\TEMP +echo REGEDIT4 > C:\WINDOWS\TEMP\nostsnd.reg +echo. >> C:\WINDOWS\TEMP\nostsnd.reg +echo [HKEY_CURRENT_USER\AppEvents\Schemes\Apps\.Default\SystemStart\.Current] >> C:\WINDOWS\TEMP\nostsnd.reg +echo @="" >> C:\WINDOWS\TEMP\nostsnd.reg + +C:\WINDOWS\REGEDIT.EXE /L:C:\WINDOWS\SYSTEM.DAT /R:C:\WINDOWS\USER.DAT C:\WINDOWS\TEMP\nostsnd.reg + +echo REGEDIT4 > C:\WINDOWS\TEMP\nostsnd.reg +echo. >> C:\WINDOWS\TEMP\nostsnd.reg +echo [HKEY_CURRENT_USER\AppEvents\Schemes\Apps\.Default\SystemExit\.Current] >> C:\WINDOWS\TEMP\nostsnd.reg +echo @="" >> C:\WINDOWS\TEMP\nostsnd.reg + +C:\WINDOWS\REGEDIT.EXE /L:C:\WINDOWS\SYSTEM.DAT /R:C:\WINDOWS\USER.DAT C:\WINDOWS\TEMP\nostsnd.reg + +del C:\WINDOWS\TEMP\nostsnd.reg \ No newline at end of file diff --git a/installers/dosboxw95/guest_tools/guest-scripts/prodid0.bat b/installers/dosboxw95/guest_tools/guest-scripts/prodid0.bat new file mode 100644 index 0000000..edece57 --- /dev/null +++ b/installers/dosboxw95/guest_tools/guest-scripts/prodid0.bat @@ -0,0 +1,9 @@ +@echo off +mkdir C:\WINDOWS\TEMP +echo REGEDIT4 > C:\WINDOWS\TEMP\prodid.reg +echo. >> C:\WINDOWS\TEMP\prodid.reg +echo [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion] >> C:\WINDOWS\TEMP\prodid.reg +echo "ProductId"=- >> C:\WINDOWS\TEMP\prodid.reg + +C:\WINDOWS\REGEDIT.EXE /L:C:\WINDOWS\SYSTEM.DAT /R:C:\WINDOWS\USER.DAT C:\WINDOWS\TEMP\prodid.reg +del C:\WINDOWS\TEMP\prodid.reg \ No newline at end of file diff --git a/installers/dosboxw95/guest_tools/guest-scripts/prodtyp9.bat b/installers/dosboxw95/guest_tools/guest-scripts/prodtyp9.bat new file mode 100644 index 0000000..da5eb1e --- /dev/null +++ b/installers/dosboxw95/guest_tools/guest-scripts/prodtyp9.bat @@ -0,0 +1,9 @@ +@echo off +mkdir C:\WINDOWS\TEMP +echo REGEDIT4 > C:\WINDOWS\TEMP\prodtyp.reg +echo. >> C:\WINDOWS\TEMP\prodtyp.reg +echo [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion] >> C:\WINDOWS\TEMP\prodtyp.reg +echo "ProductType"="9" >> C:\WINDOWS\TEMP\prodtyp.reg + +C:\WINDOWS\REGEDIT.EXE /L:C:\WINDOWS\SYSTEM.DAT /R:C:\WINDOWS\USER.DAT C:\WINDOWS\TEMP\prodtyp.reg +del C:\WINDOWS\TEMP\prodtyp.reg \ No newline at end of file diff --git a/installers/dosboxw95/guest_tools/setmdrv/source/ini.h b/installers/dosboxw95/guest_tools/setmdrv/source/ini.h new file mode 100644 index 0000000..b35aeab --- /dev/null +++ b/installers/dosboxw95/guest_tools/setmdrv/source/ini.h @@ -0,0 +1,796 @@ +#ifndef HEADER_E122E90A1CD5AAAB +#define HEADER_E122E90A1CD5AAAB + +/* + * The MIT License (MIT) + * Copyright (c) 2018 Danijel Durakovic + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/////////////////////////////////////////////////////////////////////////////// +// +// /mINI/ v0.9.14 +// An INI file reader and writer for the modern age. +// +/////////////////////////////////////////////////////////////////////////////// +// +// A tiny utility library for manipulating INI files with a straightforward +// API and a minimal footprint. It conforms to the (somewhat) standard INI +// format - sections and keys are case insensitive and all leading and +// trailing whitespace is ignored. Comments are lines that begin with a +// semicolon. Trailing comments are allowed on section lines. +// +// Files are read on demand, upon which data is kept in memory and the file +// is closed. This utility supports lazy writing, which only writes changes +// and updates to a file and preserves custom formatting and comments. A lazy +// write invoked by a write() call will read the output file, find what +// changes have been made and update the file accordingly. If you only need to +// generate files, use generate() instead. Section and key order is preserved +// on read, write and insert. +// +/////////////////////////////////////////////////////////////////////////////// +// +// /* BASIC USAGE EXAMPLE: */ +// +// /* read from file */ +// mINI::INIFile file("myfile.ini"); +// mINI::INIStructure ini; +// file.read(ini); +// +// /* read value; gets a reference to actual value in the structure. +// if key or section don't exist, a new empty value will be created */ +// std::string& value = ini["section"]["key"]; +// +// /* read value safely; gets a copy of value in the structure. +// does not alter the structure */ +// std::string value = ini.get("section").get("key"); +// +// /* set or update values */ +// ini["section"]["key"] = "value"; +// +// /* set multiple values */ +// ini["section2"].set({ +// {"key1", "value1"}, +// {"key2", "value2"} +// }); +// +// /* write updates back to file, preserving comments and formatting */ +// file.write(ini); +// +// /* or generate a file (overwrites the original) */ +// file.generate(ini); +// +/////////////////////////////////////////////////////////////////////////////// +// +// Long live the INI file!!! +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef MINI_INI_H_ +#define MINI_INI_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace mINI +{ + namespace INIStringUtil + { + const char* const whitespaceDelimiters = " \t\n\r\f\v"; + inline void trim(std::string& str) + { + str.erase(str.find_last_not_of(whitespaceDelimiters) + 1); + str.erase(0, str.find_first_not_of(whitespaceDelimiters)); + } +#ifndef MINI_CASE_SENSITIVE + inline void toLower(std::string& str) + { + std::transform(str.begin(), str.end(), str.begin(), [](const char c) { + return static_cast(std::tolower(c)); + }); + } +#endif + inline void replace(std::string& str, std::string const& a, std::string const& b) + { + if (!a.empty()) + { + std::size_t pos = 0; + while ((pos = str.find(a, pos)) != std::string::npos) + { + str.replace(pos, a.size(), b); + pos += b.size(); + } + } + } + + +//#ifdef _WIN32 + const char* const endl = "\r\n"; +//#else +// const char* const endl = "\n"; +//#endif + } + + template + class INIMap + { + private: + using T_DataIndexMap = std::unordered_map; + using T_DataItem = std::pair; + using T_DataContainer = std::vector; + using T_MultiArgs = typename std::vector>; + + T_DataIndexMap dataIndexMap; + T_DataContainer data; + + inline std::size_t setEmpty(std::string& key) + { + std::size_t index = data.size(); + dataIndexMap[key] = index; + data.emplace_back(key, T()); + return index; + } + + public: + using const_iterator = typename T_DataContainer::const_iterator; + + INIMap() { } + + INIMap(INIMap const& other) + { + std::size_t data_size = other.data.size(); + for (std::size_t i = 0; i < data_size; ++i) + { + auto const& key = other.data[i].first; + auto const& obj = other.data[i].second; + data.emplace_back(key, obj); + } + dataIndexMap = T_DataIndexMap(other.dataIndexMap); + } + + T& operator[](std::string key) + { + INIStringUtil::trim(key); +#ifndef MINI_CASE_SENSITIVE + INIStringUtil::toLower(key); +#endif + auto it = dataIndexMap.find(key); + bool hasIt = (it != dataIndexMap.end()); + std::size_t index = (hasIt) ? it->second : setEmpty(key); + return data[index].second; + } + T get(std::string key) const + { + INIStringUtil::trim(key); +#ifndef MINI_CASE_SENSITIVE + INIStringUtil::toLower(key); +#endif + auto it = dataIndexMap.find(key); + if (it == dataIndexMap.end()) + { + return T(); + } + return T(data[it->second].second); + } + bool has(std::string key) const + { + INIStringUtil::trim(key); +#ifndef MINI_CASE_SENSITIVE + INIStringUtil::toLower(key); +#endif + return (dataIndexMap.count(key) == 1); + } + void set(std::string key, T obj) + { + INIStringUtil::trim(key); +#ifndef MINI_CASE_SENSITIVE + INIStringUtil::toLower(key); +#endif + auto it = dataIndexMap.find(key); + if (it != dataIndexMap.end()) + { + data[it->second].second = obj; + } + else + { + dataIndexMap[key] = data.size(); + data.emplace_back(key, obj); + } + } + void set(T_MultiArgs const& multiArgs) + { + for (auto const& it : multiArgs) + { + auto const& key = it.first; + auto const& obj = it.second; + set(key, obj); + } + } + bool remove(std::string key) + { + INIStringUtil::trim(key); +#ifndef MINI_CASE_SENSITIVE + INIStringUtil::toLower(key); +#endif + auto it = dataIndexMap.find(key); + if (it != dataIndexMap.end()) + { + std::size_t index = it->second; + data.erase(data.begin() + index); + dataIndexMap.erase(it); + for (auto& it2 : dataIndexMap) + { + auto& vi = it2.second; + if (vi > index) + { + vi--; + } + } + return true; + } + return false; + } + void clear() + { + data.clear(); + dataIndexMap.clear(); + } + std::size_t size() const + { + return data.size(); + } + const_iterator begin() const { return data.begin(); } + const_iterator end() const { return data.end(); } + }; + + using INIStructure = INIMap>; + + namespace INIParser + { + using T_ParseValues = std::pair; + + enum class PDataType : char + { + PDATA_NONE, + PDATA_COMMENT, + PDATA_SECTION, + PDATA_KEYVALUE, + PDATA_UNKNOWN + }; + + inline PDataType parseLine(std::string line, T_ParseValues& parseData) + { + parseData.first.clear(); + parseData.second.clear(); + INIStringUtil::trim(line); + if (line.empty()) + { + return PDataType::PDATA_NONE; + } + char firstCharacter = line[0]; + if (firstCharacter == ';') + { + return PDataType::PDATA_COMMENT; + } + if (firstCharacter == '[') + { + auto commentAt = line.find_first_of(';'); + if (commentAt != std::string::npos) + { + line = line.substr(0, commentAt); + } + auto closingBracketAt = line.find_last_of(']'); + if (closingBracketAt != std::string::npos) + { + auto section = line.substr(1, closingBracketAt - 1); + INIStringUtil::trim(section); + parseData.first = section; + return PDataType::PDATA_SECTION; + } + } + auto lineNorm = line; + INIStringUtil::replace(lineNorm, "\\=", " "); + auto equalsAt = lineNorm.find_first_of('='); + if (equalsAt != std::string::npos) + { + auto key = line.substr(0, equalsAt); + INIStringUtil::trim(key); + INIStringUtil::replace(key, "\\=", "="); + auto value = line.substr(equalsAt + 1); + INIStringUtil::trim(value); + parseData.first = key; + parseData.second = value; + return PDataType::PDATA_KEYVALUE; + } + return PDataType::PDATA_UNKNOWN; + } + } + + class INIReader + { + public: + using T_LineData = std::vector; + using T_LineDataPtr = std::shared_ptr; + + bool isBOM = false; + + private: + std::ifstream fileReadStream; + T_LineDataPtr lineData; + + T_LineData readFile() + { + fileReadStream.seekg(0, std::ios::end); + const std::size_t fileSize = static_cast(fileReadStream.tellg()); + fileReadStream.seekg(0, std::ios::beg); + if (fileSize >= 3) { + const char header[3] = { + static_cast(fileReadStream.get()), + static_cast(fileReadStream.get()), + static_cast(fileReadStream.get()) + }; + isBOM = ( + header[0] == static_cast(0xEF) && + header[1] == static_cast(0xBB) && + header[2] == static_cast(0xBF) + ); + } + else { + isBOM = false; + } + std::string fileContents; + fileContents.resize(fileSize); + fileReadStream.seekg(isBOM ? 3 : 0, std::ios::beg); + fileReadStream.read(&fileContents[0], fileSize); + fileReadStream.close(); + T_LineData output; + if (fileSize == 0) + { + return output; + } + std::string buffer; + buffer.reserve(50); + for (std::size_t i = 0; i < fileSize; ++i) + { + char& c = fileContents[i]; + if (c == '\n') + { + output.emplace_back(buffer); + buffer.clear(); + continue; + } + if (c != '\0' && c != '\r') + { + buffer += c; + } + } + output.emplace_back(buffer); + return output; + } + + public: + INIReader(std::string const& filename, bool keepLineData = false) + { + fileReadStream.open(filename, std::ios::in | std::ios::binary); + if (keepLineData) + { + lineData = std::make_shared(); + } + } + ~INIReader() { } + + bool operator>>(INIStructure& data) + { + if (!fileReadStream.is_open()) + { + return false; + } + T_LineData fileLines = readFile(); + std::string section; + bool inSection = false; + INIParser::T_ParseValues parseData; + for (auto const& line : fileLines) + { + auto parseResult = INIParser::parseLine(line, parseData); + if (parseResult == INIParser::PDataType::PDATA_SECTION) + { + inSection = true; + data[section = parseData.first]; + } + else if (inSection && parseResult == INIParser::PDataType::PDATA_KEYVALUE) + { + auto const& key = parseData.first; + auto const& value = parseData.second; + data[section][key] = value; + } + if (lineData && parseResult != INIParser::PDataType::PDATA_UNKNOWN) + { + if (parseResult == INIParser::PDataType::PDATA_KEYVALUE && !inSection) + { + continue; + } + lineData->emplace_back(line); + } + } + return true; + } + T_LineDataPtr getLines() + { + return lineData; + } + }; + + class INIGenerator + { + private: + std::ofstream fileWriteStream; + + public: + bool prettyPrint = false; + + INIGenerator(std::string const& filename) + { + fileWriteStream.open(filename, std::ios::out | std::ios::binary); + } + ~INIGenerator() { } + + bool operator<<(INIStructure const& data) + { + if (!fileWriteStream.is_open()) + { + return false; + } + if (!data.size()) + { + return true; + } + auto it = data.begin(); + for (;;) + { + auto const& section = it->first; + auto const& collection = it->second; + fileWriteStream + << "[" + << section + << "]"; + if (collection.size()) + { + fileWriteStream << INIStringUtil::endl; + auto it2 = collection.begin(); + for (;;) + { + auto key = it2->first; + INIStringUtil::replace(key, "=", "\\="); + auto value = it2->second; + INIStringUtil::trim(value); + fileWriteStream + << key + << ((prettyPrint) ? " = " : "=") + << value; + if (++it2 == collection.end()) + { + break; + } + fileWriteStream << INIStringUtil::endl; + } + } + if (++it == data.end()) + { + break; + } + fileWriteStream << INIStringUtil::endl; + if (prettyPrint) + { + fileWriteStream << INIStringUtil::endl; + } + } + return true; + } + }; + + class INIWriter + { + private: + using T_LineData = std::vector; + using T_LineDataPtr = std::shared_ptr; + + std::string filename; + + T_LineData getLazyOutput(T_LineDataPtr const& lineData, INIStructure& data, INIStructure& original) + { + T_LineData output; + INIParser::T_ParseValues parseData; + std::string sectionCurrent; + bool parsingSection = false; + bool continueToNextSection = false; + bool discardNextEmpty = false; + bool writeNewKeys = false; + std::size_t lastKeyLine = 0; + for (auto line = lineData->begin(); line != lineData->end(); ++line) + { + if (!writeNewKeys) + { + auto parseResult = INIParser::parseLine(*line, parseData); + if (parseResult == INIParser::PDataType::PDATA_SECTION) + { + if (parsingSection) + { + writeNewKeys = true; + parsingSection = false; + --line; + continue; + } + sectionCurrent = parseData.first; + if (data.has(sectionCurrent)) + { + parsingSection = true; + continueToNextSection = false; + discardNextEmpty = false; + output.emplace_back(*line); + lastKeyLine = output.size(); + } + else + { + continueToNextSection = true; + discardNextEmpty = true; + continue; + } + } + else if (parseResult == INIParser::PDataType::PDATA_KEYVALUE) + { + if (continueToNextSection) + { + continue; + } + if (data.has(sectionCurrent)) + { + auto& collection = data[sectionCurrent]; + auto const& key = parseData.first; + auto const& value = parseData.second; + if (collection.has(key)) + { + auto outputValue = collection[key]; + if (value == outputValue) + { + output.emplace_back(*line); + } + else + { + INIStringUtil::trim(outputValue); + auto lineNorm = *line; + INIStringUtil::replace(lineNorm, "\\=", " "); + auto equalsAt = lineNorm.find_first_of('='); + auto valueAt = lineNorm.find_first_not_of( + INIStringUtil::whitespaceDelimiters, + equalsAt + 1 + ); + std::string outputLine = line->substr(0, valueAt); + if (prettyPrint && equalsAt + 1 == valueAt) + { + outputLine += " "; + } + outputLine += outputValue; + output.emplace_back(outputLine); + } + lastKeyLine = output.size(); + } + } + } + else + { + if (discardNextEmpty && line->empty()) + { + discardNextEmpty = false; + } + else if (parseResult != INIParser::PDataType::PDATA_UNKNOWN) + { + output.emplace_back(*line); + } + } + } + if (writeNewKeys || std::next(line) == lineData->end()) + { + T_LineData linesToAdd; + if (data.has(sectionCurrent) && original.has(sectionCurrent)) + { + auto const& collection = data[sectionCurrent]; + auto const& collectionOriginal = original[sectionCurrent]; + for (auto const& it : collection) + { + auto key = it.first; + if (collectionOriginal.has(key)) + { + continue; + } + auto value = it.second; + INIStringUtil::replace(key, "=", "\\="); + INIStringUtil::trim(value); + linesToAdd.emplace_back( + key + ((prettyPrint) ? " = " : "=") + value + ); + } + } + if (!linesToAdd.empty()) + { + output.insert( + output.begin() + lastKeyLine, + linesToAdd.begin(), + linesToAdd.end() + ); + } + if (writeNewKeys) + { + writeNewKeys = false; + --line; + } + } + } + for (auto const& it : data) + { + auto const& section = it.first; + if (original.has(section)) + { + continue; + } + if (prettyPrint && output.size() > 0 && !output.back().empty()) + { + output.emplace_back(); + } + output.emplace_back("[" + section + "]"); + auto const& collection = it.second; + for (auto const& it2 : collection) + { + auto key = it2.first; + auto value = it2.second; + INIStringUtil::replace(key, "=", "\\="); + INIStringUtil::trim(value); + output.emplace_back( + key + ((prettyPrint) ? " = " : "=") + value + ); + } + } + return output; + } + + public: + bool prettyPrint = false; + + INIWriter(std::string const& filename) + : filename(filename) + { + } + ~INIWriter() { } + + bool operator<<(INIStructure& data) + { + struct stat buf; + bool fileExists = (stat(filename.c_str(), &buf) == 0); + if (!fileExists) + { + INIGenerator generator(filename); + generator.prettyPrint = prettyPrint; + return generator << data; + } + INIStructure originalData; + T_LineDataPtr lineData; + bool readSuccess = false; + bool fileIsBOM = false; + { + INIReader reader(filename, true); + if ((readSuccess = reader >> originalData)) + { + lineData = reader.getLines(); + fileIsBOM = reader.isBOM; + } + } + if (!readSuccess) + { + return false; + } + T_LineData output = getLazyOutput(lineData, data, originalData); + std::ofstream fileWriteStream(filename, std::ios::out | std::ios::binary); + if (fileWriteStream.is_open()) + { + if (fileIsBOM) { + const char utf8_BOM[3] = { + static_cast(0xEF), + static_cast(0xBB), + static_cast(0xBF) + }; + fileWriteStream.write(utf8_BOM, 3); + } + if (output.size()) + { + auto line = output.begin(); + for (;;) + { + fileWriteStream << *line; + if (++line == output.end()) + { + break; + } + fileWriteStream << INIStringUtil::endl; + } + } + return true; + } + return false; + } + }; + + class INIFile + { + private: + std::string filename; + + public: + INIFile(std::string const& filename) + : filename(filename) + { } + + ~INIFile() { } + + bool read(INIStructure& data) const + { + if (data.size()) + { + data.clear(); + } + if (filename.empty()) + { + return false; + } + INIReader reader(filename); + return reader >> data; + } + bool generate(INIStructure const& data, bool pretty = false) const + { + if (filename.empty()) + { + return false; + } + INIGenerator generator(filename); + generator.prettyPrint = pretty; + return generator << data; + } + bool write(INIStructure& data, bool pretty = false) const + { + if (filename.empty()) + { + return false; + } + INIWriter writer(filename); + writer.prettyPrint = pretty; + return writer << data; + } + }; +} + +#endif // MINI_INI_H_ +#endif // header guard + diff --git a/installers/dosboxw95/guest_tools/setmdrv/source/setmdrv.cpp b/installers/dosboxw95/guest_tools/setmdrv/source/setmdrv.cpp new file mode 100644 index 0000000..a86f96b --- /dev/null +++ b/installers/dosboxw95/guest_tools/setmdrv/source/setmdrv.cpp @@ -0,0 +1,80 @@ +#include +#include +#include +#include + +#include "ini.h" + +std::string iniPath = "C:\\WINDOWS\\SYSTEM.ini"; +bool quiet = true; + +int main(int argc, char **argv) +{ + + if (argc <= 1) + { + std::cerr << "Usage: dbox/ps2 [filename=C:\\WINDOWS\\SYSTEM.ini] " << std::endl; + return 1; + } + if (argc >= 2) + { + + if (argc == 3) iniPath = argv[2]; + std::string arg = argv[1]; + + // Read from INI file + mINI::INIFile file(iniPath); + mINI::INIStructure ini; + file.read(ini); + + // Check values + std::string value = ini.get("boot").get("mouse.drv"); + if (!quiet) std::cout << std::string("Current [boot]mouse.drv = ") + value << std::endl; + + value = ini.get("boot.description").get("mouse"); + if (!quiet) std::cout << std::string("Current [boot.description]mouse.drv = ") + value << std::endl; + + value = ini.get("386Enh").get("mouse"); + if (!quiet) std::cout << std::string("Current [386Enh]mouse = ") + value << std::endl; + + + if ( std::string(arg).find(std::string("dbox")) != std::string::npos ) + { + // Update values + ini["boot"]["mouse.drv"] = "dboxmpi.drv"; + ini["boot.description"]["mouse.drv"] = "DOSBox-X Mouse Pointer Integration"; + ini["386Enh"]["mouse"] = ""; + + if (!quiet) + { + std::cout << std::endl; + std::cout << "New [boot]mouse.drv = dboxmpi.drv" << std::endl; + std::cout << "New [boot.description]mouse.drv = DOSBox-X Mouse Pointer Integration" << std::endl; + std::cout << "New [386Enh]mouse = " << std::endl; + } + + file.write(ini); + } + + if ( std::string(arg).find(std::string("ps2")) != std::string::npos ) + { + // Update values + ini["boot"]["mouse.drv"] = "mouse.drv"; + ini["boot.description"]["mouse.drv"] = "Standard mouse"; + ini["386Enh"]["mouse"] = "*vmouse, msmouse.vxd"; + + if (!quiet) + { + std::cout << std::endl; + std::cout << "New [boot]mouse.drv = mouse.drv" << std::endl; + std::cout << "New [boot.description]mouse.drv = Standard mouse" << std::endl; + std::cout << "New [386Enh]mouse = *vmouse, msmouse.vxd" << std::endl; + } + + file.write(ini); + } + + } + + +} diff --git a/installers/dosboxw95/installers/WIN95/_PLACE_WIN95_FILES_HERE_ b/installers/dosboxw95/installers/WIN95/_PLACE_WIN95_FILES_HERE_ new file mode 100644 index 0000000..e69de29 diff --git a/installers/dosboxw95/installers/w95-inst-utils-cfgfiles.7z b/installers/dosboxw95/installers/w95-inst-utils-cfgfiles.7z new file mode 100644 index 0000000..330103d Binary files /dev/null and b/installers/dosboxw95/installers/w95-inst-utils-cfgfiles.7z differ diff --git a/installers/dosboxw95/w95launcher.bat b/installers/dosboxw95/w95launcher.bat new file mode 100644 index 0000000..d9667c3 --- /dev/null +++ b/installers/dosboxw95/w95launcher.bat @@ -0,0 +1,29 @@ +@echo off + +if exist "%~1" ( +echo Startup directory: %~dp1 +echo Executable name: %~nx1 +echo Adding launchit.cfg to startup directory... +echo %~nx1 > "%~dp1\launchit.cfg" + +if not [%2]==[] ( +if "%2"=="NOSHUTDOWN" echo Adding NOSHUTDOWN flag +if "%2"=="NOSHUTDOWN" echo NOSHUTDOWN >> "%~dp1\launchit.cfg" +) + +echo Executing in DOSBox-X Win95... +cd "%~dp0" +dosbox-x.exe -c "MOUNT D: '%~dp1' -ide 2s " -c "BOOT C: " +REM timeout /t 5 +REM del /Q "%~dp1\launchit.cfg" +) + +if not exist "%~1" ( +echo This scripts will run given executable in Windows 95 inside DOSBox-X. +echo. +echo Usage: +echo _startinwin95.bat "PathToExecutable.exe" +echo. +echo Note: a file "launchit.cfg" will be created in executable directory at launch time, it can be safely removed at any time. +echo Emulated machine also needs to have "alaucnhr.exe" installed in autostart directory. +) diff --git a/installers/dosboxw95/w95launcher_gdbargs.bat b/installers/dosboxw95/w95launcher_gdbargs.bat new file mode 100644 index 0000000..3af44c4 --- /dev/null +++ b/installers/dosboxw95/w95launcher_gdbargs.bat @@ -0,0 +1,40 @@ +@echo off + +REM this allows to use this launcher in place of GDB debugger (just to launch DOSBox-X instead of GDB) + +if not [%3]==[] ( +if "%3"=="-args" GOTO EXECUTE +GOTO END +) + +:EXECUTE + +if exist "%~4" ( +echo Startup directory: %~dp4 +echo Executable name: %~nx4 +echo Adding launchit.cfg to startup directory... +echo %~nx4 > "%~dp4\launchit.cfg" + +if not [%5]==[] ( +if "%5"=="NOSHUTDOWN" echo Adding NOSHUTDOWN flag +if "%5"=="NOSHUTDOWN" echo NOSHUTDOWN >> "%~dp4\launchit.cfg" +) + +echo Executing in DOSBox-X Win95... +cd "%~dp0" +dosbox-x.exe -c "MOUNT D: '%~dp4' -ide 2s " -c "BOOT C: " +REM timeout /t 5 +REM del /Q "%~dp1\launchit.cfg" +) + +if not exist "%~1" ( +echo This scripts will run given executable in Windows 95 inside DOSBox-X. +echo. +echo Usage: +echo _startinwin95.bat "PathToExecutable.exe" +echo. +echo Note: a file "launchit.cfg" will be created in executable directory at launch time, it can be safely removed at any time. +echo Emulated machine also needs to have "alaucnhr.exe" installed in autostart directory. +) + +:END \ No newline at end of file diff --git a/installers/dosboxx/dosboxx_install.bat b/installers/dosboxx/dosboxx_install.bat new file mode 100644 index 0000000..7fb723c --- /dev/null +++ b/installers/dosboxx/dosboxx_install.bat @@ -0,0 +1,38 @@ +@echo off +pushd "%~dp0" + + +pushd "%~dp0" +cd .. +cd .. +cd installers +SET DBOXIN=%CD% +cd 7-zip +SET ZPATH=%CD% +pushd "%~dp0" + +if not exist "%~dp0\dosbox-x.exe" ( + + +if not exist "%DBOXIN%\dosbox-x-mingw*. mapperfile_sdl1; mapperfile_sdl2; forcesquarecorner +# +fullscreen = false +fulldouble = false +fullresolution = desktop +windowresolution = 1200x900 +windowposition = +display = 0 +output = opengl +videodriver = +transparency = 0 +maximize = false +autolock = false +autolock_feedback = beep +middle_unlock = manual +clip_mouse_button = right +clip_key_modifier = shift +clip_paste_bios = default +clip_paste_speed = 30 +sensitivity = 100 +usesystemcursor = false +mouse_emulation = integration +mouse_wheel_key = -1 +waitonerror = true +priority = higher,normal +mapperfile = mapper-dosbox-x.map +usescancodes = auto +overscan = 0 +titlebar = +showbasic = true +showdetails = false +showmenu = true + +[log] +# logfile: file where the log messages will be saved to +# debuggerrun: The run mode when the DOSBox-X Debugger starts. +# Possible values: debugger, normal, watch. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> vga; vgagfx; vgamisc; int10; sblaster; dma_control; fpu; cpu; paging; fcb; files; ioctl; exec; dosmisc; pit; keyboard; pic; mouse; bios; gui; misc; io; pci; sst; int21; fileio +# +logfile = +debuggerrun = debugger + +[dosbox] +# language: Select a language file for DOSBox-X to use. Encoded with either UTF-8 or a DOS code page. +# You can set code page either in the language file or with "country" setting in [config] section. +# title: Additional text to place in the title bar of the window. +# fastbioslogo: If set, DOSBox-X will skip the BIOS screen by activating fast BIOS logo mode (without 1-second pause). +# startbanner: If set (default), DOSBox-X will display the welcome banner when it starts. +# bannercolortheme: You can specify a different background color theme for the welcome banner from the default one. +# Possible values: default, black, red, green, yellow, blue, magenta, cyan, white. +# dpi aware: Set this option (auto by default) to indicate to your OS that DOSBox-X is DPI aware. +# If it is not set, Windows Vista/7/8/10 and higher may upscale the DOSBox-X window +# on higher resolution monitors which is probably not what you want. +# Possible values: true, false, 1, 0, auto. +# quit warning: Set this option to indicate whether DOSBox-X should show a warning message when the user tries to close its window. +# If set to auto (default), DOSBox-X will warn if a DOS program, game or a guest system is currently running. +# If set to autofile, DOSBox-X will warn if there are open file handles or a guest system is currently running. +# Possible values: true, false, 1, 0, auto, autofile. +# working directory option: Select an option for DOSBox-X's working directory when it runs. +# autoprompt: DOSBox-X will auto-decide whether to prompt for a working directory. +# config: DOSBox-X will use the primary config file directory as the working directory. +# custom: Specify a working directory via the "working directory default" option. +# default: Similar to autoprompt, but DOSBox-X will ask whether to save the selected folder. +# force: Similar to "custom", while overriding -defaultdir command-line option if used. +# noprompt: DOSBox-X uses the current directory and never prompts for a working directory. +# program: DOSBox-X will use the DOSBox-X program directory as the working directory. +# prompt: DOSBox-X will always ask the user to select a working directory when it runs. +# userconfig: DOSBox-X will use its user configuration directory as the working directory. +# Possible values: autoprompt, config, custom, default, force, noprompt, program, prompt, userconfig. +# working directory default: The default directory to act as DOSBox-X's working directory. See also the setting "working directory option". +# For working directory option=prompt, the specified directory becomes the default directory for the folder selection. +# show advanced options: If set, the Configuration Tool will display all config options (including advanced ones) by default. +# resolve config path: If set to true, DOSBox-X will resolve options containing paths in the config file (except [autoexec] section). +# This includes environment variables (%VAR% [DOS/Windows] or ${VAR} [Linux/macOS] and tilde (~) in Linux/macOS. +# If set to dosvar, DOSBox-X forces to resolve DOS-style environment variables (%VAR%) in all platforms (and tilde). +# If set to tilde, DOSBox-X will only resolve tilde (~) in Linux/macOS but will not resolve environment variables. +# Possible values: true, false, dosvar, tilde, 1, 0. +# hostkey: By default, DOSBox-X uses the mapper-defined host key, which defaults to F11 on Windows and F12 on other platforms. +# You may alternatively specify a host key with this setting and bypass the host key as defined in the mapper. +# This can also be done from the menu ("Main" => "Select host key"). +# Possible values: ctrlalt, ctrlshift, altshift, mapper. +# mapper send key: Select the key the mapper SendKey function will send. +# Possible values: winlogo, winmenu, alttab, ctrlesc, ctrlbreak, ctrlaltdel. +# ime: Enables support for the system input methods (IME) for inputting characters in Windows and Linux builds. +# If set to auto, this feature is only enabled if DOSBox-X starts with a Chinese/Japanese/Korean code page. +# Possible values: true, false, 1, 0, auto. +# synchronize time: If set, DOSBox-X will try to automatically synchronize time with the host, unless you decide to change the date/time manually. +# machine: The type of machine DOSBox-X tries to emulate. +# Possible values: mda, cga, cga_mono, cga_rgb, cga_composite, cga_composite2, hercules, tandy, pcjr, pcjr_composite, pcjr_composite2, amstrad, ega, ega200, jega, mcga, vgaonly, svga_s3, svga_s386c928, svga_s3vision864, svga_s3vision868, svga_s3vision964, svga_s3vision968, svga_s3trio32, svga_s3trio64, svga_s3trio64v+, svga_s3virge, svga_s3virgevx, svga_et3000, svga_et4000, svga_paradise, vesa_nolfb, vesa_oldvbe, vesa_oldvbe10, pc98, pc9801, pc9821, fm_towns. +# captures: Directory where things like wave, midi, screenshot get captured. +# autosave: Enable the auto-save state feature. Specify a time interval in seconds, and optionally a save slot or start and end save slots. +# For example, "autosave=10 11-20" will set a 10-second time interval for auto-saving, and the save slots used will be between 11 and 20. +# You can additionally specify up to 9 programs for this feature, e.g. "autosave=10 11-20 EDIT:21-30 EDITOR:35" for "EDIT" and "EDITOR". +# Putting a minus sign (-) before the time interval causes the auto-saving function to not be activated at start. +# saveslot: Select the default save slot (1-100) to save/load states. +# savefile: Select the default save file to save/load states. If specified it will be used instead of the save slot. +# saveremark: If set, the save state feature will ask users to enter remarks when saving a state. +# forceloadstate: If set, DOSBox-X will load a saved state even if it finds there is a mismatch in the DOSBox-X version, machine type, program name and/or the memory size. +# a20: A20 gate emulation mode. +# The on/off/on_fake/off_fake options are intended for testing and debugging DOS development, +# or to emulate obscure hardware, or to work around potential extended memory problems with DOS programs. +# on_fake/off_fake are intended to test whether a program carries out a memory test to ensure the A20 +# gate is set as intended (as HIMEM.SYS does). If it goes by the gate bit alone, it WILL crash. +# This parameter is also changeable from the builtin A20GATE command. +# fast Emulate A20 gating by remapping the first 64KB @ 1MB boundary (fast, mainline DOSBox behavior) +# mask Emulate A20 gating by masking memory I/O address (accurate) +# off Lock A20 gate off (Software/OS cannot enable A20) +# on Lock A20 gate on (Software/OS cannot disable A20) +# off_fake Lock A20 gate off but allow bit to toggle (hope your DOS game tests the HMA!) +# on_fake Lock A20 gate on but allow bit to toggle +# memsize: Amount of memory DOSBox-X has in megabytes. +# This value is best left at its default to avoid problems with some games, +# although other games and applications may require a higher value. +# Programs that use 286 protected mode like Windows 3.0 in Standard Mode may crash with more than 15MB. +# nocachedir: If set, MOUNT commands will mount with -nocachedir (disable directory caching) by default. +# freesizecap: If set to "cap" (="true"), the value of MOUNT -freesize will apply only if the actual free size is greater than the specified value. +# If set to "relative", the value of MOUNT -freesize will change relative to the specified value. +# If set to "fixed" (="false"), the value of MOUNT -freesize will be a fixed one to be reported all the time. +# Possible values: true, false, fixed, relative, cap, 2, 1, 0. +# convertdrivefat: If set, DOSBox-X will auto-convert mounted non-FAT drives (such as local drives) to FAT format for use with guest systems. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> disable graphical splash; allow quit after warning; keyboard hook; weitek; bochs debug port e9; compresssaveparts; show recorded filename; skip encoding unchanged frames; capture chroma format; capture format; shell environment size; private area size; turn off a20 gate on boot; cbus bus clock; isa bus clock; pci bus clock; call binary on reset; unhandled irq handler; call binary on boot; ibm rom basic; rom bios allocation max; rom bios minimum size; irq delay ns; iodelay; iodelay16; iodelay32; acpi; acpi rsd ptr location; acpi sci irq; acpi iobase; acpi reserved size; memsizekb; dos mem limit; isa memory hole at 512kb; reboot delay; memalias; convert fat free space; convert fat timeout; leading colon write protect image; locking disk image mount; unmask keyboard on int 16 read; int16 keyboard polling undocumented cf behavior; allow port 92 reset; enable port 92; enable 1st dma controller; enable 2nd dma controller; allow dma address decrement; enable 128k capable 16-bit dma; enable dma extra page registers; dma page registers write-only; cascade interrupt never in service; cascade interrupt ignore in service; enable slave pic; enable pc nmi mask; allow more than 640kb base memory; enable pci bus +# +language = +title = +fastbioslogo = true +startbanner = false +bannercolortheme = default +dpi aware = 1 +quit warning = auto +working directory option = program +working directory default = +show advanced options = false +resolve config path = true +hostkey = mapper +mapper send key = ctrlaltdel +ime = auto +synchronize time = false +machine = svga_s3 +captures = capture +autosave = +saveslot = 1 +savefile = +saveremark = true +forceloadstate = false +a20 = mask +memsize = 64 +nocachedir = false +freesizecap = cap +convertdrivefat = true + +[render] +# frameskip: How many frames DOSBox-X skips before drawing one. +# aspect: Aspect ratio correction mode. Can be set to the following values: +# 'false' (default): +# 'direct3d'/opengl outputs: image is simply scaled to full window/fullscreen size, possibly resulting in disproportional image +# 'surface' output: it does no aspect ratio correction (default), resulting in disproportional images if VGA mode pixel ratio is not 4:3 +# 'true': +# 'direct3d'/opengl outputs: uses output driver functions to scale / pad image with black bars, correcting output to proportional 4:3 image +# In most cases image degradation should not be noticeable (it all depends on the video adapter and how much the image is upscaled). +# Should have none to negligible impact on performance, mostly being done in hardware +# For the pixel-perfect scaling (output=openglpp), it is recommended to enable this whenever the emulated display has an aspect ratio of 4:3 +# 'surface' output: inherits old DOSBox aspect ratio correction method (adjusting rendered image line count to correct output to 4:3 ratio) +# Due to source image manipulation this mode does not mix well with scalers, i.e. multiline scalers like hq2x/hq3x will work poorly +# Slightly degrades visual image quality. Has a tiny impact on performance +# When using xBRZ scaler with 'surface' output, aspect ratio correction is done by the scaler itself, so none of the above apply +# Possible values: false, true, 0, 1, yes, no, nearest, bilinear. +# aspect_ratio: Set the aspect ratio (e.g. 16:9) in the aspect ratio correction mode. 0:0 means the default ratio of 4:3, and -1:-1 means the original image ratio. +# char9: Allow 9-pixel wide text mode fonts instead of 8-pixel wide fonts. +# euro: Display Euro symbol instead of the specified ASCII character (33-255). +# For example, setting it to 128 allows Euro symbol to be displayed instead of C-cedilla. +# doublescan: If set, doublescanned output emits two scanlines for each source line, in the +# same manner as the actual VGA output (320x200 is rendered as 640x400 for example). +# If clear, doublescanned output is rendered at the native source resolution (320x200 as 320x200). +# This affects the raster PRIOR to the software or hardware scalers. Choose wisely. +# For pixel-perfect scaling (output=openglpp), it is recommended to turn this option off. +# scaler: Scaler used to enlarge/enhance low resolution modes. If 'forced' is appended, +# then the scaler will be used even if the result might not be desired. +# Appending 'prompt' will cause a confirmation message for forcing the scaler. +# To fit a scaler in the resolution used at full screen may require a border or side bars. +# To fill the screen entirely, depending on your hardware, a different scaler/fullresolution might work. +# Scalers should work with most output options, but they are ignored for openglpp and TrueType font outputs. +# Possible values: none, normal2x, normal3x, normal4x, normal5x, advmame2x, advmame3x, advinterp2x, advinterp3x, hq2x, hq3x, 2xsai, super2xsai, supereagle, tv2x, tv3x, rgb2x, rgb3x, scan2x, scan3x, gray, gray2x, hardware_none, hardware2x, hardware3x, hardware4x, hardware5x, xbrz, xbrz_bilinear. +# glshader: Path to GLSL shader source to use with OpenGL output ("none" to disable, or "default" for default shader). +# Can be either an absolute path, a file in the "glshaders" subdirectory of the DOSBox-X configuration directory, +# or one of the built-in shaders (e.g. "sharp" for the pixel-perfect scaling mode): +# advinterp2x, advinterp3x, advmame2x, advmame3x, rgb2x, rgb3x, scan2x, scan3x, tv2x, tv3x, sharp. +# pixelshader: Set Direct3D pixel shader program (effect file must be in Shaders subdirectory). If 'forced' is appended, +# then the pixel shader will be used even if the result might not be desired. +# autofit: Best fits image to window +# - Intended for output=direct3d, fullresolution=original, aspect=true +# monochrome_pal: Specify the color of monochrome display. +# Possible values: green, amber, gray, white +# Append 'bright' for a brighter look. +# Possible values: green, amber, gray, white. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> alt render; xbrz slice; xbrz fixed scale factor; xbrz max scale factor +# +frameskip = 0 +aspect = true +aspect_ratio = 0:0 +char9 = true +euro = -1 +doublescan = true +scaler = normal2x forced +glshader = none +pixelshader = none +autofit = true +monochrome_pal = green + +[pc98] +# pc-98 BIOS copyright string: If set, the PC-98 BIOS copyright string is placed at E800:0000. Enable this for software that detects PC-98 vs Epson. +# pc-98 fm board: In PC-98 mode, selects the FM music board to emulate. +# Possible values: auto, off, false, board14, board26k, board86, board86c. +# pc-98 enable 256-color: Allow 256-color graphics mode if set, disable if not set +# pc-98 enable 16-color: Allow 16-color graphics mode if set, disable if not set +# pc-98 enable grcg: Allow GRCG graphics functions if set, disable if not set +# pc-98 enable egc: Allow EGC graphics functions if set, disable if not set +# pc-98 bus mouse: Enable PC-98 bus mouse emulation. Disabling this option does not disable INT 33h emulation. +# pc-98 force ibm keyboard layout: Force to use a default keyboard layout like IBM US-English for PC-98 emulation. +# Will only work with apps and games using BIOS for keyboard. +# Possible values: true, false, 1, 0, auto. +# pc-98 try font rom: If enabled, DOSBox-X will first try to load FONT.ROM as generated by T98Tools for PC-98 emulation. +# pc-98 anex86 font: Specify an Anex86 compatible font to load as supported by the Anex86 emulator for PC-98 emulation. +# By default DOSBox-X tries to load ANEX86.BMP followed by FREECG98.BMP after trying to load FONT.ROM. +# If you specify a font here then it will be tried first, perhaps before FONT.ROM (see previous option). +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> pc-98 int 1b fdc timer wait; pc-98 pic init to read isr; pc-98 fm board irq; pc-98 fm board io port; pc-98 sound bios; pc-98 load sound bios rom file; pc-98 buffer page flip; pc-98 enable 256-color planar; pc-98 enable 188 user cg; pc-98 start gdc at 5mhz; pc-98 allow scanline effect; pc-98 video mode; pc-98 timer always cycles; pc-98 timer master frequency; pc-98 allow 4 display partition graphics; pc-98 show graphics layer on initialize +# +pc-98 BIOS copyright string = false +pc-98 fm board = auto +pc-98 enable 256-color = true +pc-98 enable 16-color = true +pc-98 enable grcg = true +pc-98 enable egc = true +pc-98 bus mouse = true +pc-98 force ibm keyboard layout = auto +pc-98 try font rom = true +pc-98 anex86 font = + +[dosv] +# dosv: Enable DOS/V emulation and specify which version to emulate. This option is intended for use with games or software +# originating from East Asia (China, Japan, Korea) that use the double byte character set (DBCS) encodings and DOS/V extensions +# to display Japanese (jp), Chinese (chs/cht/cn/tw), or Korean (ko) text. Note that enabling DOS/V replaces 80x25 text mode with +# a EGA/VGA graphics mode that emulates text mode to display the characters and may be incompatible with non-Asian software that +# assumes direct access to the text mode via segment 0xB800. For a general DOS environment with CJK support please disable DOS/V +# emulation and use TrueType font (TTF) output with a CJK code page (932, 936, 949, 950) and TTF font with CJK characters instead. +# Possible values: off, jp, ko, chs, cht, cn, tw. +# getsysfont: If enabled, DOSBox-X will try to get and use the system fonts on Windows and Linux platforms for the DOS/V emulation. +# If this cannot be done, then DOSBox-X will try to use the internal Japanese DOS/V font, or you can specify a different font. +# fontxsbcs: FONTX2 file used to rendering SBCS characters (8x19) in DOS/V or JEGA mode. If not specified, the default one will be used. +# Loading the ASC16 and ASCFONT.15 font files (from the UCDOS and ETen Chinese DOS systems) is also supported for the DOS/V mode. +# fontxsbcs16: FONTX2 file used to rendering SBCS characters (8x16) in DOS/V or JEGA mode. If not specified, the default one will be used. +# Loading the ASC16 and ASCFONT.15 font files (from the UCDOS and ETen Chinese DOS systems) is also supported for the DOS/V mode. +# fontxsbcs24: FONTX2 file used to rendering SBCS characters (12x24) in DOS/V mode (with V-text). If not specified, the default one will be used. +# Loading the ASC24 and ASCFONT.24? font files (the latter from the ETen Chinese DOS system) is also supported for the DOS/V mode. +# fontxdbcs: FONTX2 file used to rendering DBCS characters (16x16) in DOS/V or VGA/JEGA mode. If not specified, the default one will be used. +# Alternatively, you can load a BDF or PCF font file (16x16 or 15x15), such as the free bitmap fonts from WenQuanYi (https://wenq.org/). +# For Simplified Chinese DOS/V, loading the HZK16 font file (https://github.com/aguegu/BitmapFont/tree/master/font) is also supported. +# For Traditional Chinese DOS/V, loading the STDFONT.15 font file from the ETen Chinese DOS system is also supported. +# fontxdbcs14: FONTX2 file used to rendering DBCS characters (14x14) for Configuration Tool or EGA mode. If not specified, the default one will be used. +# Alternatively, you can load a BDF or PCF font file (14x14 or 15x15), such as the free bitmap fonts from WenQuanYi (https://wenq.org/). +# For Simplified Chinese DOS/V, loading the HZK14 font file (https://github.com/aguegu/BitmapFont/tree/master/font) is also supported. +# For Traditional Chinese DOS/V, loading the STDFONT.15 font file from the ETen Chinese DOS system is also supported. +# fontxdbcs24: FONTX2 file used to rendering DBCS characters (24x24) in DOS/V mode (with V-text and 24-pixel fonts enabled). +# For Simplified Chinese DOS/V, loading the HZK24? font file (https://github.com/aguegu/BitmapFont/tree/master/font) is also supported. +# For Traditional Chinese DOS/V, loading the STDFONT.24 font file from the ETen Chinese DOS system is also supported. +# showdbcsnodosv: Enables rendering of Chinese/Japanese/Korean characters for DBCS code pages in standard VGA and EGA machine types in non-DOS/V and non-TTF mode. +# DOS/V fonts will be used in such cases, which can be adjusted by the above config options (such as fontxdbcs, fontxdbcs14, and fontxdbcs24). +# Setting to "auto" enables Chinese/Japanese/Korean character rendering if a language file is loaded (or with "autodbcs" option set) in such cases. +# Possible values: true, false, 1, 0, auto. +# yen: Enables the Japanese yen symbol at 5ch if it is found at 7fh in a custom SBCS font for the Japanese DOS/V or JEGA emulation. +# fepcontrol: FEP control API for the DOS/V emulation. +# Possible values: ias, mskanji, both. +# vtext1: V-text screen mode 1 for the DOS/V emulation. Enter command "VTEXT 1" for this mode. Note that XGA/SXGA mode is only supported by the svga_s3trio and svga_et4000 machine types. +# Possible values: xga, xga24, sxga, sxga24, svga. +# vtext2: V-text screen mode 2 for the DOS/V emulation. Enter command "VTEXT 2" for this mode. Note that XGA/SXGA mode is only supported by the svga_s3trio and svga_et4000 machine types. +# Possible values: xga, xga24, sxga, sxga24, svga. +# use20pixelfont: Enables the 20 pixel font to be used instead of the 24 pixel system font for the Japanese DOS/V emulation (with V-text enabled). +# j3100: With the setting dosv=jp and a non-off value of this option, the Toshiba J-3100 machine will be emulated with DCGA support. +# Setting to "on" or "auto" starts J-3100 automatically, and with the setting "manual" you can enter J-3100 mode with DCGA command. +# Possible values: off, on, auto, manual, 0, 1, 2. +# j3100type: Specifies the Toshiba J-3100 machine type if J-3100 mode is enabled. The color palette will be changed with different machine types. +# Possible values: default, gt, sgt, gx, gl, sl, sgx, ss, gs, sx, sxb, sxw, sxp, ez, zs, zx. +# j3100colorscroll: Specifies that the color display can be used for scrolling, which is currently incompatible with for example the J-3100 version of the SimCity game. +# The VGA version of the Toshiba Windows 3.1 works fine with the "false" value of this setting, whereas its CGA/EGA version requires a "true" value for this. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> del; j3100backcolor; j3100textcolor +# +dosv = off +getsysfont = true +fontxsbcs = +fontxsbcs16 = +fontxsbcs24 = +fontxdbcs = +fontxdbcs14 = +fontxdbcs24 = +showdbcsnodosv = auto +yen = false +fepcontrol = both +vtext1 = svga +vtext2 = xga +use20pixelfont = false +j3100 = off +j3100type = default +j3100colorscroll = false + +[video] +# vmemsize: Amount of video memory in megabytes. +# The maximum resolution and color depth the svga_s3 will be able to display +# is determined by this value. +# -1: auto (vmemsizekb is ignored) +# 0: 512k (800x600 at 256 colors) if vmemsizekb=0 +# 1: 1024x768 at 256 colors or 800x600 at 64k colors +# 2: 1600x1200 at 256 colors or 1024x768 at 64k colors or 640x480 at 16M colors +# 4: 1600x1200 at 64k colors or 1024x768 at 16M colors +# 8: up to 1600x1200 at 16M colors +# For build engine games, use more memory than in the list above so it can +# use triple buffering and thus won't flicker. +# +# vmemsizekb: Amount of video memory in kilobytes, in addition to vmemsize. +# high intensity blinking: Set to false if you want to see high-intensity background colors instead of blinking foreground text. +# This option has no effect in PC-98 and some other video modes. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> vmemdelay; vbe window granularity; vbe window size; enable 8-bit dac; svga lfb base; pci vga; vga attribute controller mapping; vga bios use rom image; vga bios rom image; vga bios size override; video bios dont duplicate cga first half rom font; video bios always offer 14-pixel high rom font; video bios always offer 16-pixel high rom font; video bios enable cga second half rom font; forcerate; sierra ramdac; sierra ramdac lock 565; vga fill active memory; page flip debug line; vertical retrace poll debug line; cgasnow; vga 3da undefined bits; rom bios 8x8 CGA font; rom bios video parameter table; int 10h points at vga bios; unmask timer on int 10 setmode; vesa bank switching window mirroring; vesa bank switching window range check; vesa zero buffer on get information; vesa set display vsync; vesa lfb base scanline adjust; vesa map non-lfb modes to 128kb region; ega per scanline hpel; allow hpel effects; allow hretrace effects; hretrace effect weight; vesa modelist cap; vesa modelist width limit; vesa modelist height limit; vesa vbe put modelist in vesa information; vesa vbe 1.2 modes are 32bpp; allow low resolution vesa modes; allow explicit 24bpp vesa modes; allow high definition vesa modes; allow unusual vesa modes; allow 32bpp vesa modes; allow 24bpp vesa modes; allow 16bpp vesa modes; allow 15bpp vesa modes; allow 8bpp vesa modes; allow 4bpp vesa modes; allow 4bpp packed vesa modes; allow tty vesa modes; double-buffered line compare; ignore vblank wraparound; ignore extended memory bit; enable vga resize delay; resize only on vga active display width increase; vga palette update on full load; ignore odd-even mode in non-cga modes; ignore sequencer blanking +# +vmemsize = -1 +vmemsizekb = 0 +high intensity blinking = true + +[vsync] +# vsyncmode: Synchronize vsync timing to the host display. Requires calibration within DOSBox-X. +# Possible values: off, on, force, host. +# vsyncrate: Vsync rate used if vsync is enabled. Ignored if vsyncmode is set to host (win32). +# Possible values:. +vsyncmode = off +vsyncrate = 75 + +[cpu] +# core: CPU Core used in emulation. auto will switch to dynamic if available and appropriate. +# For the dynamic core, both dynamic_x86 and dynamic_rec are supported (dynamic_x86 is preferred). +# Windows 95 or other preemptive multitasking OSes will not work with the dynamic_rec core. +# Possible values: auto, dynamic, dynamic_x86, dynamic_nodhfpu, dynamic, dynamic_rec, normal, full, simple. +# fpu: Enable FPU emulation +# Possible values: true, false, 1, 0, auto, 8087, 287, 387. +# segment limits: Enforce checks for segment limits on 80286 and higher CPU types. +# cputype: CPU Type used in emulation. "auto" emulates a 486 which tolerates Pentium instructions. +# "experimental" enables newer instructions not normally found in the CPU types emulated by DOSBox-X, such as FISTTP. +# Possible values: auto, 8086, 8086_prefetch, 80186, 80186_prefetch, 286, 286_prefetch, 386, 386_prefetch, 486old, 486old_prefetch, 486, 486_prefetch, pentium, pentium_mmx, ppro_slow, pentium_ii, pentium_iii, experimental. +# cycles: Number of instructions DOSBox-X tries to emulate each millisecond. +# Setting this value too high results in sound dropouts and lags. +# Cycles can be set in 3 ways: +# 'auto' tries to guess what a game needs. +# It usually works, but can fail for certain games. +# 'fixed #number' will set a fixed number of cycles. This is what you usually +# need if 'auto' fails (Example: fixed 4000). +# 'max' will allocate as much cycles as your computer is able to +# handle. Recommended if better performance is desired. +# Possible values: auto, fixed, max. +# cycleup: Amount of cycles to decrease/increase with the mapped keyboard shortcut. +# cycledown: Setting it lower than 100 will be a percentage. +# turbo: Enables Turbo (Fast Forward) mode to speed up operations. +# apmbios: Emulate Advanced Power Management (APM) BIOS calls. +# integration device: Enable DOSBox-X's integration I/O device, a way for additional software to talk to DOSBox-X. It is currently experimental. +# This can for example be used to return DOSBox-X's current status and by the guest OS to match the mouse pointer position. +# isapnpbios: Emulate ISA Plug & Play BIOS. Enable if using DOSBox-X to run a PnP aware DOS program or if booting Windows 9x. +# Do not disable if Windows 9x is configured around PnP devices, you will likely confuse it. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> processor serial number; double fault; clear trap flag on unhandled int 1; reset on triple fault; always report double fault; always report triple fault; mask stack pointer for enter leave instructions; allow lmsw to exit protected mode; report fdiv bug; enable msr; enable cmpxchg8b; enable syscall; ignore undefined msr; interruptible rep string op; dynamic core cache block size; cycle emulation percentage adjust; stop turbo on key; stop turbo after second; use dynamic core with paging on; ignore opcode 63; apmbios pnp; apm power button event; apmbios version; apmbios allow realmode; apmbios allow 16-bit protected mode; apmbios allow 32-bit protected mode; integration device pnp; isapnpport; realbig16 +# +core = dynamic_x86 +fpu = true +segment limits = true +cputype = ppro_slow +cycles = max +cycleup = 10 +cycledown = 20 +turbo = false +turbo last second = 6 +apmbios = true +integration device = true +isapnpbios = true +stop turbo after second = 6 +stop turbo on key = true + +[keyboard] +# aux: Enable emulation of the 8042 auxiliary port. PS/2 mouse emulation requires this to be enabled. +# You should enable this if you will be running Windows ME or any other OS that does not use the BIOS to receive mouse events. +# allow output port reset: If set (default), allow the application to reset the CPU through the keyboard controller. +# This option is required to allow Windows ME to reboot properly, whereas Windows 9x and earlier +# will reboot without this option using INT 19h +# controllertype: Type of keyboard controller (and keyboard) attached. +# auto Automatically pick according to machine type +# at AT (PS/2) type keyboard +# xt IBM PC/XT type keyboard +# pcjr IBM PCjr type keyboard (only if machine=pcjr) +# pc98 PC-98 keyboard emulation (only if machine=pc98) +# Possible values: auto, at, xt, pcjr, pc98. +# auxdevice: Type of PS/2 mouse attached to the AUX port +# Possible values: none, 2button, 3button, intellimouse, intellimouse45. +aux = true +allow output port reset = true +controllertype = auto +auxdevice = intellimouse + +[ttf] +# font: Specifies a TrueType font to use for the TTF output. If not specified, the built-in TrueType font will be used. +# Either a font name or full font path can be specified. If file ends with the .TTF extension then the extension can be omitted. +# For a font name or relative path, directories such as the working directory and default system font directory will be searched. +# For example, setting it to "consola" or "consola.ttf" will use Consola font (included in Windows); similar for other TTF fonts. +# Additionally, OTF fonts (e.g. OratorStd.otf), .FON fonts (e.g. vgasys.fon), and .TTC fonts (e.g. msgothic.ttc) are also supported. +# To display Chinese/Japanese/Korean text in these code pages, a font with CJK characters is needed (e.g. GNU Unifont or Sarasa Gothic). +# fontbold: You can optionally specify a bold TrueType font for use with the TTF output that will render the bold text style. +# It requires a word processor be set with the wp option, and this actual bold font will be used for the bold style. +# For example, setting it to "consolab" or "consolab.ttf" will use the Consolab font; similar for other TTF fonts. +# fontital: You can optionally specify an italic TrueType font for use with the TTF output that will render the italic text style. +# It requires a word processor be set with the wp option, and this actual italic font will be used for the italic style. +# For example, setting it to "consolai" or "consolai.ttf" will use the Consolai font; similar for other TTF fonts. +# fontboit: You can optionally specify a bold italic TrueType font for use with the TTF output that will render the bold italic text style. +# It requires a word processor be set with the wp option, and this actual bold-italic font will be used for the bold-italic style. +# For example, setting it to "consolaz" or "consolaz.ttf" will use the Consolaz font; similar for other TTF fonts. +# colors: Specifies a color scheme to use for the TTF output by supply all 16 color values in RGB: (r,g,b) or hexadecimal as in HTML: #RRGGBB +# The original DOS colors (0-15): #000000 #0000aa #00aa00 #00aaaa #aa0000 #aa00aa #aa5500 #aaaaaa #555555 #5555ff #55ff55 #55ffff #ff5555 #ff55ff #ffff55 #ffffff +# gray scaled color scheme: (0,0,0) #0e0e0e (75,75,75) (89,89,89) (38,38,38) (52,52,52) #717171 #c0c0c0 #808080 (28,28,28) (150,150,150) (178,178,178) (76,76,76) (104,104,104) (226,226,226) (255,255,255) +# An optional leading "+" sign allows the preset color scheme to be used when switching from another output. +# outputswitch: Specifies the output that DOSBox-X should switch to from the TTF output when a graphical mode is requested, or auto for automatic selection. +# Possible values: auto, surface, opengl, openglnb, openglhq, openglpp, direct3d. +# winperc: Specifies the window percentage for the TTF output (100 = full screen). Ignored if the ptsize setting is specified. +# ptsize: Specifies the font point size for the TTF output. If specified (minimum: 9), it will override the winperc setting. +# lins: Specifies the number of rows on the screen for the TTF output (0 = default). +# cols: Specifies the number of columns on the screen for the TTF output (0 = default). +# righttoleft: If set, DOSBox-X will display text from right to left instead of left to right on the screen for the TTF output. +# This is especially useful for languages which use right-to-left scripts (such as Arabic and Hebrew). +# wp: You can specify a word processor for the TTF output and optionally also a version number for the word processor. +# Supported word processors are WP=WordPerfect, WS=WordStar, XY=XyWrite, FE=FastEdit, and an optional version number. +# For example, WP6 will set the word processor as WordPerfect 6, and XY4 will set the word processor as XyWrite 4. +# Word processor-specific features like on-screen text styles and 512-character font will be enabled based on this. +# bold: If set, DOSBox-X will display bold text in visually (requires a word processor be set) for the TTF output. +# This is done either with the actual bold font specified by the fontbold option, or by making it bold automatically. +# italic: If set, DOSBox-X will display italicized text visually (requires a word processor be set) for the TTF output. +# This is done either with the actual italic font specified by the fontital option, or by slanting the characters automatically. +# underline: If set, DOSBox-X will display underlined text visually (requires a word processor be set) for the TTF output. +# strikeout: If set, DOSBox-X will display strikeout text visually (requires a word processor be set) for the TTF output. +# printfont: If set, DOSBox-X will force to use the current TrueType font (set via font option) for printing in addition to displaying. +# autodbcs: If set, DOSBox-X enables Chinese/Japanese/Korean DBCS (double-byte) characters when these code pages are active by default. +# Only applicable when using a DBCS code page (932: Japanese, 936: Simplified Chinese; 949: Korean; 950: Traditional Chinese) +# This applies to both the display and printing of these characters (see the [printer] section for details of the latter). +# blinkc: If set to true, the cursor blinks for the TTF output; setting it to false will turn the blinking off. +# You can also change the blinking rate by setting an integer between 1 (fastest) and 7 (slowest), or 0 for no cursor. +# gbk: Enables the GBK extension (in addition to the standard GB2312 charset) for the Simplified Chinese TTF output or DOS/V emulation. +# chinasea: Enables the ChinaSea and Big5-2003 extension (in addition to the standard Big5-1984 charset) for the Traditional Chinese TTF output. +# A TTF/OTF font containing such characters (such as the included SarasaGothicFixed TTF font) is needed to correctly render ChinaSea characters. +# dosvfunc: If set, enables FEP control to function for Japanese DOS/V applications, and changes the blinking of character attributes to high brightness. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> wpbg; wpfg; char512; autoboxdraw; halfwidthkana; uao +# +font = +fontbold = +fontital = +fontboit = +colors = +outputswitch = auto +winperc = 60 +ptsize = 0 +lins = 0 +cols = 0 +righttoleft = false +wp = +bold = true +italic = true +underline = true +strikeout = false +printfont = true +autodbcs = true +blinkc = true +gbk = false +chinasea = false +dosvfunc = false + +[voodoo] +# voodoo_card: Enable support for the 3dfx Voodoo card. +# Possible values: false, software, opengl, auto. +# voodoo_maxmem: Specify whether to enable maximum memory size for the Voodoo card. +# If set (on by default), the memory size will be 12MB (4MB front buffer + 2x4MB texture units) +# Otherwise, the memory size will be the standard 4MB (2MB front buffer + 1x2MB texture unit) +# glide: Enable Glide emulation (Glide API passthrough to the host). +# Requires a Glide wrapper - glide2x.dll (Windows), libglide2x.so (Linux), or libglide2x.dylib (macOS). +# lfb: Enable LFB access for Glide. OpenGlide does not support locking aux buffer, please use _noaux modes. +# Possible values: full, full_noaux, read, read_noaux, write, write_noaux, none. +# splash: Show 3dfx splash screen for Glide emulation (Windows; requires 3dfxSpl2.dll). +voodoo_card = software +voodoo_maxmem = true +glide = false +lfb = full_noaux +splash = true + +[mixer] +# nosound: Enable silent mode, sound is still emulated though. +# sample accurate: Enable sample accurate mixing, at the expense of some emulation performance. Enable this option for DOS games and demos +# that require such accuracy for correct Tandy/OPL output including digitized speech. This option can also help eliminate +# minor errors in Gravis Ultrasound emulation that result in random echo/attenuation effects. +# swapstereo: Swaps the left and right stereo channels. +# rate: Mixer sample rate, setting any device's rate higher than this will probably lower their sound quality. +# blocksize: Mixer block size, larger blocks might help sound stuttering but sound will also be more lagged. +# Possible values: 1024, 2048, 4096, 8192, 512, 256. +# prebuffer: How many milliseconds of data to keep on top of the blocksize. +nosound = false +sample accurate = false +swapstereo = false +rate = 44100 +blocksize = 1024 +prebuffer = 25 + +[midi] +# mpu401: Type of MPU-401 to emulate. +# Possible values: intelligent, uart, none. +# mpubase: The IO address of the MPU-401. +# Set to 0 to use a default I/O address. +# 300h to 330h are for use with IBM PC mode. +# C0D0h to F8D0h (in steps of 800h) are for use with NEC PC-98 mode (MPU98). +# 80D2h through 80DEh are for use with NEC PC-98 Sound Blaster 16 MPU-401 emulation. +# If not assigned (0), 330h is the default for IBM PC and E0D0h is the default for PC-98. +# Possible values: 0, 300, 310, 320, 330, 332, 334, 336, 340, 360, c0d0, c8d0, d0d0, d8d0, e0d0, e8d0, f0d0, f8d0, 80d2, 80d4, 80d6, 80d8, 80da, 80dc, 80de. +# mididevice: Device that will receive the MIDI data from MPU-401. +# Possible values: default, win32, alsa, oss, coreaudio, coremidi, mt32, synth, fluidsynth, timidity, none. +# midiconfig: Special configuration options for the device driver. This is usually the id or part of the name of the device you want to use +# (find the id/name with mixer/listmidi). +# Or in the case of coreaudio or synth, you can specify a soundfont here. +# When using a Roland MT-32 rev. 0 as midi output device, some games may require a delay in order to prevent 'buffer overflow' issues. +# In that case, add 'delaysysex', for example: midiconfig=2 delaysysex +# See the README/Manual for more details. +# samplerate: Sample rate for MIDI synthesizer, if applicable. +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# mpuirq: MPU-401 IRQ. -1 to automatically choose. +# mt32.romdir: Name of the directory where MT-32 Control and PCM ROM files can be found. Emulation requires these files to work. +# Accepted file names are as follows: +# MT32_CONTROL.ROM or CM32L_CONTROL.ROM - control ROM file. +# MT32_PCM.ROM or CM32L_PCM.ROM - PCM ROM file. +# mt32.model: Model of the MT-32 synthesizer to use. +# Possible values: cm32l, mt32, auto. +# fluid.driver: Driver to use with Fluidsynth, not needed under Windows. Available drivers depend on what Fluidsynth was compiled with. +# Possible values: pulseaudio, alsa, oss, coreaudio, dsound, portaudio, sndman, jack, file, default. +# fluid.soundfont: Soundfont (.SF2 or .SF3) to use with Fluidsynth. One must be specified (e.g. GeneralUser_GS.sf2). +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> mt32.reverse.stereo; mt32.verbose; mt32.thread; mt32.chunk; mt32.prebuffer; mt32.partials; mt32.dac; mt32.analog; mt32.output.gain; mt32.reverb.mode; mt32.reverb.output.gain; mt32.reverb.time; mt32.reverb.level; mt32.rate; mt32.src.quality; mt32.niceampramp; fluid.samplerate; fluid.gain; fluid.polyphony; fluid.cores; fluid.periods; fluid.periodsize; fluid.reverb; fluid.chorus; fluid.reverb.roomsize; fluid.reverb.damping; fluid.reverb.width; fluid.reverb.level; fluid.chorus.number; fluid.chorus.level; fluid.chorus.speed; fluid.chorus.depth; fluid.chorus.type +# +mpu401 = intelligent +mpubase = 0 +mididevice = default +midiconfig = +samplerate = 44100 +mpuirq = -1 +mt32.romdir = +mt32.model = auto +fluid.driver = default +fluid.soundfont = + +[sblaster] +# sbtype: Type of Sound Blaster to emulate. 'gb' is Game Blaster. +# Possible values: sb1, sb2, sbpro1, sbpro2, sb16, sb16vibra, gb, ess688, reveal_sc400, none. +# sbbase: The IO address of the Sound Blaster. +# 220h to 2E0h are for use with IBM PC Sound Blaster emulation. +# D2h to DEh are for use with NEC PC-98 Sound Blaster 16 emulation. +# Possible values: 220, 240, 260, 280, 2a0, 2c0, 2e0, d2, d4, d6, d8, da, dc, de. +# irq: The IRQ number of the Sound Blaster (usually 5 or 7, depending on the sound card type and the game). +# Set to 0 for the default setting of the sound card, or set to -1 to start DOSBox-X with the IRQ unassigned. +# Possible values: 7, 5, 3, 9, 10, 11, 12, 0, -1. +# dma: The DMA number of the Sound Blaster. Set to -1 to start DOSBox-X with the DMA unassigned. +# Possible values: 1, 5, 0, 3, 6, 7, -1. +# hdma: The High DMA number of the Sound Blaster. Set to -1 to start DOSBox-X with the High DMA unassigned. +# Possible values: 1, 5, 0, 3, 6, 7, -1. +# enable speaker: Start the DOS virtual machine with the Sound Blaster speaker enabled. +# Sound Blaster Pro and older cards have a speaker disable/enable command. +# Normally the card boots up with the speaker disabled. If a DOS game or demo +# attempts to play without enabling the speaker, set this option to true to +# compensate. This setting has no meaning if emulating a Sound Blaster 16 card. +# sbmixer: Allow the Sound Blaster mixer to modify the DOSBox-X mixer. +# oplmode: Type of OPL emulation. On 'auto' the mode is determined by the 'sbtype' setting. +# All OPL modes are AdLib-compatible, except for 'cms' (set 'sbtype=none' with 'cms' for a Game Blaster). +# Possible values: auto, cms, opl2, dualopl2, opl3, opl3gold, none, hardware, hardwaregb. +# oplemu: Provider for the OPL emulation. 'compat' might provide better quality. +# 'nuked' is the most accurate (but the most CPU-intensive). See oplrate as well. +# Possible values: default, compat, fast, nuked, mame, opl2board, opl3duoboard, retrowave_opl3. +# oplrate: Sample rate of OPL music emulation. Use 49716 for highest quality (set the mixer rate accordingly). +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# oplport: Serial port of the OPL2 Audio Board when oplemu=opl2board, opl2mode will become 'opl2' automatically. +# retrowave_bus: Bus of the Retrowave series board (serial/spi). SPI is only supported on Linux. +# retrowave_port: Serial port of the Retrowave series board. +# hardwarebase: base address of the real hardware Sound Blaster: +# 210,220,230,240,250,260,280 +# goldplay: Enable goldplay emulation. +# blaster environment variable: Whether or not to set the BLASTER environment variable automatically at startup +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> mindma; irq hack; dsp command aliases; pic unmask irq; enable asp; disable filtering; dsp write buffer status must return 0x7f or 0xff; pre-set sbpro stereo; adlib force timer overflow on detect; retrowave_spi_cs; force dsp auto-init; force goldplay; goldplay stereo; dsp require interrupt acknowledge; dsp write busy delay; sample rate limits; instant direct dac; stereo control with sbpro only; dsp busy cycle rate; dsp busy cycle always; dsp busy cycle duty; io port aliasing +# +sbtype = sb16 +sbbase = 220 +irq = 7 +dma = 1 +hdma = 5 +enable speaker = false +sbmixer = true +oplmode = auto +oplemu = default +oplrate = 44100 +oplport = +retrowave_bus = serial +retrowave_port = +hardwarebase = 220 +goldplay = true +blaster environment variable = true + +[gus] +# gus: Enable the Gravis Ultrasound emulation. +# gusrate: Sample rate of Ultrasound emulation. +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# gusmemsize: Amount of RAM on the Gravis Ultrasound in KB. Set to -1 for default. +# gus master volume: Master Gravis Ultrasound GF1 volume, in decibels. Reducing the master volume can help with games or demoscene productions where the music is too loud and clipping. +# gusbase: The IO base address of the Gravis Ultrasound. +# Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300, 210, 230, 250. +# gusirq: The IRQ number of the Gravis Ultrasound. +# Possible values: 5, 3, 7, 9, 10, 11, 12. +# gusdma: The DMA channel of the Gravis Ultrasound. +# Possible values: 3, 0, 1, 5, 6, 7. +# gustype: Type of Gravis Ultrasound to emulate. +# classic Original Gravis Ultrasound chipset +# classic37 Original Gravis Ultrasound with ICS Mixer (rev 3.7) +# max Gravis Ultrasound MAX emulation (with CS4231 codec) +# interwave Gravis Ultrasound Plug & Play (interwave) +# Possible values: classic, classic37, max, interwave. +# ultradir: Path to Ultrasound directory. In this directory +# there should be a MIDI directory that contains +# the patch files for GUS playback. Patch sets used +# with Timidity should work fine. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> autoamp; unmask dma; ignore channel count while active; pic unmask irq; startup initialized; dma enable on dma control polling; clear dma tc irq if excess polling; force master irq enable; gus panning table; gus fixed render rate; irq hack +# +gus = false +gusrate = 44100 +gusmemsize = -1 +gus master volume = 0.00 +gusbase = 240 +gusirq = 5 +gusdma = 3 +gustype = classic +ultradir = C:\ULTRASND + +[innova] +# innova: Enable the Innovation SSI-2001 emulation. +# samplerate: Sample rate of Innovation SSI-2001 emulation +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# sidbase: SID base port (typically 280h). +# Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300. +# quality: Set SID emulation quality level (0 to 3). +# Possible values: 0, 1, 2, 3. +innova = false +samplerate = 22050 +sidbase = 280 +quality = 0 + +[speaker] +# pcspeaker: Enable PC-Speaker emulation. +# pcrate: Sample rate of the PC-Speaker sound generation. +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# tandy: Enable Tandy Sound System emulation. For 'auto', emulation is present only if machine is set to 'tandy'. +# Possible values: auto, on, off. +# tandyrate: Sample rate of the Tandy 3-Voice generation. +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# disney: Enable Disney Sound Source emulation. (Covox Voice Master and Speech Thing compatible). +# ps1audio: Enable PS1 audio emulation. +# Possible values: on, off. +# ps1audiorate: Sample rate of the PS1 audio emulation. +# Possible values: 49716, 48000, 44100, 32000, 22050, 16000, 11025, 8000. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> pcspeaker clock gate enable at startup; initial frequency +# +pcspeaker = true +pcrate = 65536 +tandy = auto +tandyrate = 44100 +disney = false +ps1audio = off +ps1audiorate = 22050 + +[joystick] +# joysticktype: Type of joystick to emulate: auto (default), +# none (disables joystick emulation), +# 2axis (supports two joysticks), +# 4axis (supports one joystick, first joystick used), +# 4axis_2 (supports one joystick, second joystick used), +# fcs (Thrustmaster), ch (CH Flightstick). +# auto chooses emulation depending on real joystick(s). +# (Remember to reset DOSBox-X's mapperfile if you saved it earlier) +# Possible values: auto, 2axis, 4axis, 4axis_2, fcs, ch, none. +# timed: enable timed intervals for axis. Experiment with this option, if your joystick drifts (away). +# autofire: continuously fires as long as you keep the button pressed. +# swap34: swap the 3rd and the 4th axis. can be useful for certain joysticks. +# buttonwrap: enable button wrapping at the number of emulated buttons. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> joy1deadzone1; joy1deadzone2; joy2deadzone1; joy1response1; joy1response2; joy2response1; joy1axis0; joy1axis1; joy1axis2; joy1axis3; joy1axis4; joy1axis5; joy1axis6; joy1axis7; joy2axis0; joy2axis1; joy2axis2; joy2axis3; joy2axis4; joy2axis5; joy2axis6; joy2axis7 +# +joysticktype = auto +timed = true +autofire = false +swap34 = false +buttonwrap = false + +[mapper] +# joy1deadzone0-: deadzone for joystick 1 axis 0- +# joy1deadzone0+: deadzone for joystick 1 axis 0+ +# joy1deadzone1-: deadzone for joystick 1 axis 1- +# joy1deadzone1+: deadzone for joystick 1 axis 1+ +# joy1deadzone2-: deadzone for joystick 1 axis 2- +# joy1deadzone2+: deadzone for joystick 1 axis 2+ +# joy1deadzone3-: deadzone for joystick 1 axis 3- +# joy1deadzone3+: deadzone for joystick 1 axis 3+ +# joy1deadzone4-: deadzone for joystick 1 axis 4- +# joy1deadzone4+: deadzone for joystick 1 axis 4+ +# joy1deadzone5-: deadzone for joystick 1 axis 5- +# joy1deadzone5+: deadzone for joystick 1 axis 5+ +# joy1deadzone6-: deadzone for joystick 1 axis 6- +# joy1deadzone6+: deadzone for joystick 1 axis 6+ +# joy1deadzone7-: deadzone for joystick 1 axis 7- +# joy1deadzone7+: deadzone for joystick 1 axis 7+ +# joy2deadzone0-: deadzone for joystick 2 axis 0- +# joy2deadzone0+: deadzone for joystick 2 axis 0+ +# joy2deadzone1-: deadzone for joystick 2 axis 1- +# joy2deadzone1+: deadzone for joystick 2 axis 1+ +# joy2deadzone2-: deadzone for joystick 2 axis 2- +# joy2deadzone2+: deadzone for joystick 2 axis 2+ +# joy2deadzone3-: deadzone for joystick 2 axis 3- +# joy2deadzone3+: deadzone for joystick 2 axis 3+ +# joy2deadzone4-: deadzone for joystick 2 axis 4- +# joy2deadzone4+: deadzone for joystick 2 axis 4+ +# joy2deadzone5-: deadzone for joystick 2 axis 5- +# joy2deadzone5+: deadzone for joystick 2 axis 5+ +# joy2deadzone6-: deadzone for joystick 2 axis 6- +# joy2deadzone6+: deadzone for joystick 2 axis 6+ +# joy2deadzone7-: deadzone for joystick 2 axis 7- +# joy2deadzone7+: deadzone for joystick 2 axis 7+ +joy1deadzone0- = 0.60 +joy1deadzone0+ = 0.60 +joy1deadzone1- = 0.60 +joy1deadzone1+ = 0.60 +joy1deadzone2- = 0.60 +joy1deadzone2+ = 0.60 +joy1deadzone3- = 0.60 +joy1deadzone3+ = 0.60 +joy1deadzone4- = 0.60 +joy1deadzone4+ = 0.60 +joy1deadzone5- = 0.60 +joy1deadzone5+ = 0.60 +joy1deadzone6- = 0.60 +joy1deadzone6+ = 0.60 +joy1deadzone7- = 0.60 +joy1deadzone7+ = 0.60 +joy2deadzone0- = 0.60 +joy2deadzone0+ = 0.60 +joy2deadzone1- = 0.60 +joy2deadzone1+ = 0.60 +joy2deadzone2- = 0.60 +joy2deadzone2+ = 0.60 +joy2deadzone3- = 0.60 +joy2deadzone3+ = 0.60 +joy2deadzone4- = 0.60 +joy2deadzone4+ = 0.60 +joy2deadzone5- = 0.60 +joy2deadzone5+ = 0.60 +joy2deadzone6- = 0.60 +joy2deadzone6+ = 0.60 +joy2deadzone7- = 0.60 +joy2deadzone7+ = 0.60 + +[serial] +# serial1: serial1-9 -- set type of device connected to the serial (COM) port. +# Can be disabled, dummy, file, modem, nullmodem, directserial. +# Additional parameters must be in the same line in the form of +# parameter:value. Parameter for all types is irq (optional). +# for file: specify an output file +# Additional parameters: +# timeout: = how long to wait before closing the file on inactivity (default:0), +# squote to use single quotes instead of double quotes for quoted program commands. +# shellhide to hide the command window when opening programs on the Windows platform. +# openwith:: start a program to open the output file. +# openerror:: start a program to open the output file if an error had occurred. +# Example: serial1=file file:output1.txt timeout:1000 openwith:notepad +# for directserial: realport (required), rxdelay (optional). +# (realport:COM1 realport:ttyS0). +# for modem: listenport (optional). +# for nullmodem: server, rxdelay, txdelay, telnet, usedtr, +# transparent, port, inhsocket, sock, nonlocal (all optional). +# connections are limited to localhost unless you specify nonlocal:1 +# "sock" parameter specifies the protocol to be used by both sides +# of the conection. 0 for TCP and 1 for ENet reliable UDP. +# Example: serial1=modem listenport:5000 sock:1 +# Note: COM1-4 are standard COM ports in DOS, whereas COM5-9 are extended COM ports. +# You can optionally specify base addresses and IRQs for them with base: and irq: options. +# Serial port settings can also be changed via the built-in SERIAL command. +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial2: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial3: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial4: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial5: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial6: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial7: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial8: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# serial9: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, serialmouse, directserial, log, file. +# phonebookfile: File used to map fake phone numbers to addresses. +serial1 = dummy +serial2 = disabled +serial3 = disabled +serial4 = disabled +serial5 = disabled +serial6 = disabled +serial7 = disabled +serial8 = disabled +serial9 = disabled +phonebookfile = phonebook-dosbox-x.txt + +[parallel] +# parallel1: parallel1-9 -- set type of device connected to the parallel (LPT) port. +# Can be: +# reallpt (direct parallel port passthrough), +# file (records data to a file or passes it to a device), +# printer (virtual dot-matrix printer, see [printer] section) +# disney (attach Disney Sound Source emulation to this port) +# Additional parameters must be in the same line in the form of +# parameter:value. +# for reallpt: +# Windows: +# realbase (the base address of your real parallel port). +# Default: 378 +# ecpbase (base address of the ECP registers, optional). +# Linux: realport (the parallel port device i.e. /dev/parport0). +# for file: +# dev: (i.e. dev:lpt1) to forward data to a device, +# or append: appends data to the specified file. +# Without the above parameters data is written to files in the capture dir. +# Additional parameters: +# timeout: = how long to wait before closing the file on inactivity (default:0 or 500), +# squote to use single quotes instead of double quotes for quoted program commands. +# shellhide to hide the command window when opening programs on the Windows platform. +# addFF to add a formfeed when closing, addLF to add a linefeed if the app doesn't. +# cp: to perform codepage translation, i.e. cp:437 +# openps:: start a program to open the file if the print output is detected to be PostScript. +# openpcl:: start a program to open the file if the print output is detected to be PCL. +# openwith:: start a program to open the file in all other conditions. +# openerror:: start a program to open the file if an error had occurred. +# Example: parallel1=file file:output1.prn timeout:1000 openpcl:pcl6 openps:gswin32c openwith:notepad +# for printer: +# printer still has its own configuration section above. +# Note: LPT1-3 are standard LPT ports in DOS, whereas LPT4-9 are extended LPT ports. +# You can optionally specify base addresses and IRQs for them with base: and irq: options. +# Parallel port settings can also be changed via the built-in PARALLEL command. +# parallel2: see parallel1 +# parallel3: see parallel1 +# parallel4: see parallel1 +# parallel5: see parallel1 +# parallel6: see parallel1 +# parallel7: see parallel1 +# parallel8: see parallel1 +# parallel9: see parallel1 +# dongle: Enable dongle +parallel1 = printer +parallel2 = disabled +parallel3 = disabled +parallel4 = disabled +parallel5 = disabled +parallel6 = disabled +parallel7 = disabled +parallel8 = disabled +parallel9 = disabled +dongle = false + +[printer] +# printer: Enable printer emulation. +# dpi: Resolution of printer (default 360). +# width: Width of paper in 1/10 inch (default 85 = 8.5''). +# height: Height of paper in 1/10 inch (default 110 = 11.0''). +# printoutput: Output method for finished pages: +# png : Creates PNG images (default) +# ps : Creates PostScript +# bmp : Creates BMP images (very huge files, not recommended) +# printer : Send to an actual printer in Windows (specify a printer, or Print dialog will appear) +# multipage: Adds all pages to one PostScript file or printer job until CTRL-F2 is pressed. +# device: Specify the Windows printer device to use. You can see the list of devices from the Help +# menu ('List printer devices') or the Status Window. Then make your choice and put either +# the printer device number (e.g. 2) or your printer name (e.g. Microsoft Print to PDF). +# Leaving it empty will show the Windows Print dialog (or '-' for showing once). +# docpath: The path (directory) where the output files are stored. +# fontpath: The path (directory) where the printer fonts (courier.ttf, ocra.ttf, roman.ttf, sansserif.ttf, script.ttf) are located. +# openwith: Start the specified program to open the output file. +# openerror: Start the specified program to open the output file if an error had occurred. +# printdbcs: Allows DOSBox-X to print Chinese/Japanese/Korean DBCS (double-byte) characters when these code pages are active. +# If set to auto (default), this is enabled only for the TrueType font (TTF) output with the DBCS support enabled. +# Only applicable when using a DBCS code page (932: Japanese, 936: Simplified Chinese; 949: Korean; 950: Traditional Chinese) +# Possible values: true, false, 1, 0, auto. +# shellhide: If set, the command window will be hidden for openwith/openerror options on the Windows platform. +# timeout: (in milliseconds) if nonzero: the time the page will be ejected automatically after when no more data arrives at the printer. +printer = true +dpi = 360 +width = 85 +height = 110 +printoutput = printer +multipage = false +device = - +docpath = . +fontpath = FONTS +openwith = +openerror = +printdbcs = auto +shellhide = false +timeout = 0 + +[dos] +# xms: Enable XMS support. +# xms handles: Number of XMS handles available for the DOS environment, or 0 to use a reasonable default +# shell configuration as commands: Allow entering dosbox-x.conf configuration parameters as shell commands to get and set settings. +# This is disabled by default to avoid conflicts between commands and executables. +# It is recommended to get and set dosbox-x.conf settings using the CONFIG command instead. +# Compatibility with DOSBox SVN can be improved by enabling this option. +# hma: Report through XMS that HMA exists (not necessarily available) +# hard drive data rate limit: Slow down (limit) hard disk throughput. This setting controls the limit in bytes/second. +# Set to 0 to disable the limit, or -1 (default) to use a reasonable limit. +# The disk I/O performance as in DOSBox SVN can be achieved by setting this to 0. +# floppy drive limit: Slow down (limit) floppy disk throughput. This setting controls the limit in bytes/second. +# Set to 0 to disable the limit, or -1 (default) to use a reasonable limit. +# The disk I/O performance as in DOSBox SVN can be achieved by setting this to 0. +# ansi.sys: If set (by default), ANSI.SYS emulation is on. If clear, ANSI.SYS is not emulated and will not appear to be installed. +# NOTE: This option has no effect in PC-98 mode where MS-DOS systems integrate ANSI.SYS into the DOS kernel. +# log console: If set, log DOS CON output to the log file. Setting to "quiet" will log DOS CON output only (no debugging output). +# Possible values: true, false, 1, 0, quiet. +# share: Reports SHARE.EXE as resident and provides functions such as file-locking and record-locking, although not all SHARE functions are emulated. +# file access tries: If a positive integer is set, DOSBox-X will try to read/write/lock files directly on mounted local drives for the specified number of times without caching before failing on Windows systems. +# For networked database applications (e.g. dBase, FoxPro, etc), it is strongly recommended to set this to e.g. 3 for correct operations. +# network redirector: Report DOS network redirector as resident. This will allow the host name to be returned unless the secure mode is enabled. +# You can also directly access UNC network paths in the form \\MACHINE\SHARE even if they are not mounted as drives on Windows systems. +# Set either "ipx=true" in [ipx] section or "ne2000=true" in [ne2000] section for a full network redirector environment. +# minimum mcb free: Minimum free segment value to leave free. At startup, the DOS kernel will allocate memory +# up to this point. This can be used to deal with EXEPACK issues or DOS programs that cannot +# be loaded too low in memory. If you want more free conventional memory to be reported, +# you can for example set its value to 1. +# ems: Enable EMS support. The default (=true) provides the best +# compatibility but certain applications may run better with +# other choices, or require EMS support to be disabled (=false) +# to work at all. +# Possible values: true, emsboard, emm386, false, 1, 0. +# umb: Enable UMB support. +# quick reboot: If set, the DOS restart call will reboot the emulated DOS (integrated DOS or guest DOS) instead of the virtual machine. +# +# ver: Set DOS version. Specify as major.minor format. A single number is treated as the major version (compatible with LFN support). Common settings are: +# auto (or unset) Pick a DOS kernel version automatically +# 3.3 MS-DOS 3.3 emulation (not tested!) +# 5.0 MS-DOS 5.0 emulation (recommended for DOS gaming) +# 6.22 MS-DOS 6.22 emulation +# 7.0 MS-DOS 7.0 (or Windows 95 pure DOS mode) emulation +# 7.1 MS-DOS 7.1 (or Windows 98 pure DOS mode) emulation +# Long filename (LFN) support will be enabled with a reported DOS version of 7.0 or higher with "lfn=auto" (default). +# Similarly, FAT32 disk images will be supported with a reported DOS version of 7.1 or higher. +# +# lfn: Enable long filename support. If set to auto (default), LFN support is enabled if the reported DOS version is at least 7.0. +# If set to autostart, the built-in VER command won't activate/deactivate LFN support according to the reported DOS version. +# Possible values: true, false, 1, 0, auto, autostart. +# fat32setversion: Whether DOSBox-X should automatically set the reported DOS version to 7.0/7.10 when it is less than 7.0/7.10 and mounting LBA/FAT32 disk images is requested. +# If set to "ask", a popup message will show up to ask whether DOSBox-X should automatically change the reported DOS version in order to mount the disk image. +# Possible values: ask, auto, manual. +# shellhigh: Load the DOSBox-X command shell into the upper memory when the UMB is available. +# If set to auto (default), it is enabled if the reported DOS version is at least 7.0. +# Possible values: true, false, 1, 0, auto. +# automount: Enable automatic drive mounting in Windows. +# automountall: Automatically mount all available Windows drives at start. +# Possible values: true, false, 1, 0, quiet. +# mountwarning: If set, a warning message will be displayed while trying to auto-mount your Windows host drives. +# autofixwarning: If set to true or both, DOSBox-X shows messages while trying to automatically fix the "Packed file is corrupt" error. +# If set to false or none, DOSBox-X will not show such messages on the screen when the error occurred. +# If set to "a20fix" or "loadfix", DOSBox-X will show the message for the a20fix or the loadfix only. +# Possible values: true, false, 1, 0, both, a20fix, loadfix, none. +# startcmd: Enable START command to start programs to run on the host system. On Windows host programs or commands may also be launched directly. +# starttranspath: Specify whether DOSBox-X should automatically translate all paths in the command-line to host system paths when starting programs to run on the host system. +# startwait: Specify whether DOSBox-X should wait for the host system applications after they are started. +# startquiet: If set, before launching host system applications to run on the host DOSBox-X will not show messages like "Now run it as a Windows application". +# vmware: Enable VMware interface emulation including guest mouse integration (when used along with e.g. VMware mouse driver for Windows 3.x). +# int33: Enable INT 33H for mouse support. +# keyboardlayout: Language code of the keyboard layout (or none). +# customcodepage: Set a custom code page for CHCP command and specify a SBCS code page file, following the standard SBCS code page format. +# Examples of SBCS code pages are available from the Unicode Consortium website: https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/ +# dbcs: Enable DBCS table and Chinese, Japanese, Korean support for the TrueType font (TTF) output. +# CAUTION: Some software will crash without the DBCS table, including the Open Watcom installer. +# dos clipboard device enable: If enabled, a DOS device will be added for bidirectional communications with the shared clipboard. +# Setting to "read" will only allow read access, and setting to "write" will only allow write access. +# Setting to "full" or "true" enables both; setting to "false" or "disabled" disables the access or device. +# The default device name is CLIP$, but can be changed with the "dos clipboard device name" setting below. +# dos clipboard device name: Set DOS device name (up to 8 characters) for bidirectional communications with the shared clipboard. +# If unset or invalid, the default name CLIP$ will be used (e.g. "TYPE CLIP$" shows the clipboard contents). +# It has no effect if "dos clipboard device enable" is disabled, and it is deactivated if the secure mode is enabled. +# dos clipboard api: If set, DOS APIs for communications with the Windows clipboard will be enabled for shared clipboard communications. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> badcommandhandler; hma allow reservation; special operation file prefix; drive z is remote; drive z convert fat; drive z expand path; drive z hide files; hidenonrepresentable; hma minimum allocation; dos sda size; hma free space; cpm compatibility mode; minimum dos initial private segment; minimum mcb segment; enable dummy device mcb; maximum environment block size on exec; additional environment block size on exec; enable a20 on windows init; zero memory on xms memory allocation; vcpi; unmask timer on disk io; zero int 67h if no ems; zero unused int 68h; emm386 startup active; zero memory on ems memory allocation; ems system handle memory size; ems system handle on even megabyte; umb start; umb end; kernel allocation in umb; keep umb on boot; keep private area on boot; private area in umb; autoa20fix; autoloadfix; startincon; int33 hide host cursor if interrupt subroutine; int33 hide host cursor when polling; int33 disable cell granularity; int 13 disk change detect; int 13 extensions; biosps2; int15 wait force unmask irq; int15 mouse callback does not preserve registers; filenamechar; collating and uppercase; con device use int 16h to detect keyboard input; zero memory on int 21h memory allocation; pipe temporary device +# +xms = true +xms handles = 0 +shell configuration as commands = false +hma = true +hard drive data rate limit = 0 +floppy drive data rate limit = 0 +ansi.sys = true +log console = false +share = true +file access tries = 3 +network redirector = true +minimum mcb free = 0 +ems = true +umb = true +quick reboot = false +ver = 7.1 +lfn = true +fat32setversion = auto +shellhigh = auto +automount = true +automountall = false +mountwarning = true +autofixwarning = false +startcmd = false +starttranspath = true +startwait = true +startquiet = false +vmware = true +int33 = true +keyboardlayout = auto +customcodepage = +dbcs = true +dos clipboard device enable = false +dos clipboard device name = CLIP$ +dos clipboard api = true + +[ipx] +# ipx: Enable ipx over UDP/IP emulation. +ipx = false + +[ne2000] +# ne2000: Enable NE2000 Ethernet emulation. Either pcap or slirp backend can be used, switchable via "backend" option. +# Settings for the pcap and slirp backends can be found in the [ethernet, pcap] and [ethernet, slirp] sections. +# Once properly set, load the NE2000 packet driver inside DOSBox-X with base address and interrupt specified below. +# nicbase: The base address of the NE2000 board. +# nicirq: The interrupt it uses. Note serial2 uses IRQ3 as default. +# macaddr: The MAC address the emulator will use for its network adapter. +# If you have multiple DOSBox-Xes running on the same network, +# this has to be changed for each. AC:DE:48 is an address range reserved for +# private use, so modify the last three number blocks, e.g. AC:DE:48:88:99:AB. +# backend: The backend (either pcap or slirp is supported) used for the NE2000 Ethernet emulation. +# If set to "auto", then "slirp" is selected when available, otherwise "pcap" is selected when available. +# NE2000 Ethernet emulation will be disabled if no backend is available (or the specified backend if unavailable). +# Possible values: pcap, slirp, auto, none. +ne2000 = true +nicbase = 300 +nicirq = 10 +macaddr = AC:DE:48:88:99:AA +backend = slirp + +[ethernet, pcap] +# realnic: Specifies which of your host network interfaces is used for pcap. +# Write 'list' here to see the list of devices from the Help +# menu ('List network interfaces') or from the Status Window. +# Then make your choice and put either the interface number +# (e.g. 2) or a part of your adapters name (e.g. VIA here). +# timeout: Specifies the read timeout for the device in milliseconds for the pcap backend, or the default value will be used. +realnic = list +timeout = default + +[ethernet, slirp] +# ipv4_network: The IPv4 network the guest and host services are on. +# ipv4_netmask: The netmask for the IPv4 network. +# ipv4_host: The address of the guest on the IPv4 network. +# ipv4_nameserver: The address of the nameserver service provided by the host on the IPv4 network. +# ipv4_dhcp_start: The start address used for DHCP by the host services on the IPv4 network. +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> restricted; disable_host_loopback; mtu; mru; tcp_port_forwards; udp_port_forwards +# +ipv4_network = 10.0.2.0 +ipv4_netmask = 255.255.255.0 +ipv4_host = 10.0.2.2 +ipv4_nameserver = 10.0.2.3 +ipv4_dhcp_start = 10.0.2.15 + +[ide, primary] +# enable: Enable IDE interface +# pnp: List IDE device in ISA PnP BIOS enumeration +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> irq; io; altio; int13fakeio; int13fakev86io; enable pio32; ignore pio32; cd-rom spinup time; cd-rom spindown timeout; cd-rom insertion delay +# +enable = true +pnp = true + +[ide, secondary] +enable = true +pnp = true + +[ide, tertiary] +enable = false +pnp = true + +[ide, quaternary] +enable = false +pnp = true + +[ide, quinternary] +enable = false +pnp = true + +[ide, sexternary] +enable = false +pnp = true + +[ide, septernary] +enable = false +pnp = true + +[ide, octernary] +enable = false +pnp = true + +[fdc, primary] +# enable: Enable floppy controller interface +# pnp: List floppy controller in ISA PnP BIOS enumeration +# mode: Floppy controller mode. What the controller acts like. +# ps2 PS/2 mode (most common) +# ps2_model30 PS/2 model 30 +# at AT mode +# xt PC/XT mode +# +# Advanced options (see full configuration reference file [dosbox-x.reference.full.conf] for more details): +# -> irq; io; dma; int13fakev86io; instant mode; auto-attach to int 13h; chip +# +enable = true +pnp = true +mode = ps2 + +[4dos] +rem = This section is the 4DOS.INI file, if you use 4DOS as the command shell + +[config] +# rem: Records comments (remarks). +# break: Sets or clears extended CTRL+C checking. +# Possible values: on, off. +# numlock: Sets the initial state of the NumLock key. +# Possible values: on, off. +# shell: Specifies the command shell (COMMAND.COM or 4DOS.COM). +# dos: Reports whether DOS occupies HMA and allocates UMB memory (if available). +# fcbs: Number of FCB handles available to DOS programs (1-255). +# files: Number of file handles available to DOS programs (8-255). +# country: Country code for date/time/decimal formats and optionally code page for TTF output and language files. +# lastdrive: The maximum drive letter (A-Z) that can be accessed by programs. +# Possible values: a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z. +rem = This section is DOS's CONFIG.SYS file, not all CONFIG.SYS options supported +break = off +numlock = +shell = +dos = high, umb +fcbs = 100 +files = 200 +country = +lastdrive = a +set path = Z:\;Z:\SYSTEM;Z:\BIN;Z:\DOS;Z:\4DOS;Z:\DEBUG;Z:\TEXTUTIL +set prompt = $P$G +set temp = +install = +installhigh = +device = +devicehigh = + +[autoexec] +# Lines in this section will be run at startup. +# You can put your MOUNT lines here. diff --git a/installers/patch_wx28_win32s/INFO_W32SPATCH.txt b/installers/patch_wx28_win32s/INFO_W32SPATCH.txt new file mode 100644 index 0000000..a25948a --- /dev/null +++ b/installers/patch_wx28_win32s/INFO_W32SPATCH.txt @@ -0,0 +1,9 @@ +wxWidgets 2.8.12 patched for Win32s/Win3.11 compatibility. +Changes: +- undefined HAVE_TRACKMOUSEEVENT in windows.cpp (was throwing assert - non critical - in Win 3.11) +- enabled MCI backend in wxMediaCtrl +- replaced slider95 with older slidermsw implementation, as slider95 was invisible in Win 3.11. Note: range control doesn't work now, even when running under newer systems. +- disabled antiflicker in wxNotebook, otherwise it wasn't visible in Windows 3.11 + +Remaining issues: +- wxStaticBitmap, or loading and displaying bitmaps from files in general doesn't seem to work under Win 3.11 (no image is displayed). However, loading bitmaps from resources does work fine. As a workaround, bitmaps can be loaded from files under Win 3.11 using WinG API (wing32.dll). \ No newline at end of file diff --git a/installers/patch_wx28_win32s/include/wx/msw/mediactrl.h b/installers/patch_wx28_win32s/include/wx/msw/mediactrl.h new file mode 100644 index 0000000..c47557b --- /dev/null +++ b/installers/patch_wx28_win32s/include/wx/msw/mediactrl.h @@ -0,0 +1,422 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/mediactrl.h +// Purpose: wxMediaCtrl class +// Author: Ryan Norton +// Modified by: +// Created: 11/07/04 +// RCS-ID: $Id: mediactrl.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) Ryan Norton +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// Definitions +// ============================================================================ + +// ---------------------------------------------------------------------------- +// Header guard +// ---------------------------------------------------------------------------- +#ifndef _WX_MEDIACTRL_H_ +#define _WX_MEDIACTRL_H_ + +// ---------------------------------------------------------------------------- +// Pre-compiled header stuff +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +// ---------------------------------------------------------------------------- +// Compilation guard +// ---------------------------------------------------------------------------- + +#if wxUSE_MEDIACTRL + +// ---------------------------------------------------------------------------- +// Includes +// ---------------------------------------------------------------------------- + +#include "wx/control.h" +#include "wx/uri.h" + +// ============================================================================ +// Declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// +// Enumerations +// +// ---------------------------------------------------------------------------- + +enum wxMediaState +{ + wxMEDIASTATE_STOPPED, + wxMEDIASTATE_PAUSED, + wxMEDIASTATE_PLAYING +}; + +enum wxMediaCtrlPlayerControls +{ + wxMEDIACTRLPLAYERCONTROLS_NONE = 0, + //Step controls like fastfoward, step one frame etc. + wxMEDIACTRLPLAYERCONTROLS_STEP = 1 << 0, + //Volume controls like the speaker icon, volume slider, etc. + wxMEDIACTRLPLAYERCONTROLS_VOLUME = 1 << 1, + wxMEDIACTRLPLAYERCONTROLS_DEFAULT = + wxMEDIACTRLPLAYERCONTROLS_STEP | + wxMEDIACTRLPLAYERCONTROLS_VOLUME +}; + +#define wxMEDIABACKEND_DIRECTSHOW wxT("wxAMMediaBackend") +#define wxMEDIABACKEND_MCI wxT("wxMCIMediaBackend") +#define wxMEDIABACKEND_QUICKTIME wxT("wxQTMediaBackend") +#define wxMEDIABACKEND_GSTREAMER wxT("wxGStreamerMediaBackend") +#define wxMEDIABACKEND_REALPLAYER wxT("wxRealPlayerMediaBackend") +#define wxMEDIABACKEND_WMP10 wxT("wxWMP10MediaBackend") + +// ---------------------------------------------------------------------------- +// +// wxMediaEvent +// +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_MEDIA wxMediaEvent : public wxNotifyEvent +{ +public: + // ------------------------------------------------------------------------ + // wxMediaEvent Constructor + // + // Normal constructor, much the same as wxNotifyEvent + // ------------------------------------------------------------------------ + wxMediaEvent(wxEventType commandType = wxEVT_NULL, int winid = 0) + : wxNotifyEvent(commandType, winid) + { } + + // ------------------------------------------------------------------------ + // wxMediaEvent Copy Constructor + // + // Normal copy constructor, much the same as wxNotifyEvent + // ------------------------------------------------------------------------ + wxMediaEvent(const wxMediaEvent &clone) + : wxNotifyEvent(clone) + { } + + // ------------------------------------------------------------------------ + // wxMediaEvent::Clone + // + // Allocates a copy of this object. + // Required for wxEvtHandler::AddPendingEvent + // ------------------------------------------------------------------------ + virtual wxEvent *Clone() const + { return new wxMediaEvent(*this); } + + + // Put this class on wxWidget's RTTI table + DECLARE_DYNAMIC_CLASS(wxMediaEvent) +}; + +// ---------------------------------------------------------------------------- +// +// wxMediaCtrl +// +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_MEDIA wxMediaCtrl : public wxControl +{ +public: + wxMediaCtrl() : m_imp(NULL), m_bLoaded(false) + { } + + wxMediaCtrl(wxWindow* parent, wxWindowID winid, + const wxString& fileName = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& szBackend = wxEmptyString, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxT("mediaCtrl")) + : m_imp(NULL), m_bLoaded(false) + { Create(parent, winid, fileName, pos, size, style, + szBackend, validator, name); } + + wxMediaCtrl(wxWindow* parent, wxWindowID winid, + const wxURI& location, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& szBackend = wxEmptyString, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxT("mediaCtrl")) + : m_imp(NULL), m_bLoaded(false) + { Create(parent, winid, location, pos, size, style, + szBackend, validator, name); } + + virtual ~wxMediaCtrl(); + + bool Create(wxWindow* parent, wxWindowID winid, + const wxString& fileName = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& szBackend = wxEmptyString, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxT("mediaCtrl")); + + bool Create(wxWindow* parent, wxWindowID winid, + const wxURI& location, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& szBackend = wxEmptyString, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxT("mediaCtrl")); + + bool DoCreate(wxClassInfo* instance, + wxWindow* parent, wxWindowID winid, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxT("mediaCtrl")); + + bool Play(); + bool Pause(); + bool Stop(); + + bool Load(const wxString& fileName); + + wxMediaState GetState(); + + wxFileOffset Seek(wxFileOffset where, wxSeekMode mode = wxFromStart); + wxFileOffset Tell(); //FIXME: This should be const + wxFileOffset Length(); //FIXME: This should be const + +#if wxABI_VERSION >= 20601 /* 2.6.1+ only */ + double GetPlaybackRate(); //All but MCI & GStreamer + bool SetPlaybackRate(double dRate); //All but MCI & GStreamer +#endif + +#if wxABI_VERSION >= 20602 /* 2.6.2+ only */ + bool Load(const wxURI& location); + bool Load(const wxURI& location, const wxURI& proxy); + + wxFileOffset GetDownloadProgress(); // DirectShow only + wxFileOffset GetDownloadTotal(); // DirectShow only + + double GetVolume(); + bool SetVolume(double dVolume); + + bool ShowPlayerControls( + wxMediaCtrlPlayerControls flags = wxMEDIACTRLPLAYERCONTROLS_DEFAULT); + + //helpers for the wxPython people + bool LoadURI(const wxString& fileName) + { return Load(wxURI(fileName)); } + bool LoadURIWithProxy(const wxString& fileName, const wxString& proxy) + { return Load(wxURI(fileName), wxURI(proxy)); } +#endif + +protected: + static wxClassInfo* NextBackend(); + + void OnMediaFinished(wxMediaEvent& evt); + virtual void DoMoveWindow(int x, int y, int w, int h); + wxSize DoGetBestSize() const; + + //FIXME: This is nasty... find a better way to work around + //inheritance issues +#if defined(__WXMAC__) + virtual void MacVisibilityChanged(); +#endif +#if defined(__WXMAC__) || defined(__WXCOCOA__) + friend class wxQTMediaBackend; +#endif + class wxMediaBackend* m_imp; + bool m_bLoaded; + + DECLARE_DYNAMIC_CLASS(wxMediaCtrl) +}; + +// ---------------------------------------------------------------------------- +// +// wxMediaBackend +// +// Derive from this and use standard wxWidgets RTTI +// (DECLARE_DYNAMIC_CLASS and IMPLEMENT_CLASS) to make a backend +// for wxMediaCtrl. Backends are searched alphabetically - +// the one with the earliest letter is tried first. +// +// Note that this is currently not API or ABI compatable - +// so statically link or make the client compile on-site. +// +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_MEDIA wxMediaBackend : public wxObject +{ +public: + wxMediaBackend() + { } + + virtual ~wxMediaBackend(); + + virtual bool CreateControl(wxControl* WXUNUSED(ctrl), + wxWindow* WXUNUSED(parent), + wxWindowID WXUNUSED(winid), + const wxPoint& WXUNUSED(pos), + const wxSize& WXUNUSED(size), + long WXUNUSED(style), + const wxValidator& WXUNUSED(validator), + const wxString& WXUNUSED(name)) + { return false; } + + virtual bool Play() + { return false; } + virtual bool Pause() + { return false; } + virtual bool Stop() + { return false; } + + virtual bool Load(const wxString& WXUNUSED(fileName)) + { return false; } + virtual bool Load(const wxURI& WXUNUSED(location)) + { return false; } + + virtual bool SetPosition(wxLongLong WXUNUSED(where)) + { return 0; } + virtual wxLongLong GetPosition() + { return 0; } + virtual wxLongLong GetDuration() + { return 0; } + + virtual void Move(int WXUNUSED(x), int WXUNUSED(y), + int WXUNUSED(w), int WXUNUSED(h)) + { } + virtual wxSize GetVideoSize() const + { return wxSize(0,0); } + + virtual double GetPlaybackRate() + { return 0.0; } + virtual bool SetPlaybackRate(double WXUNUSED(dRate)) + { return false; } + + virtual wxMediaState GetState() + { return wxMEDIASTATE_STOPPED; } + + virtual double GetVolume() + { return 0.0; } + virtual bool SetVolume(double WXUNUSED(dVolume)) + { return false; } + + virtual bool Load(const wxURI& WXUNUSED(location), + const wxURI& WXUNUSED(proxy)) + { return false; } + + virtual bool ShowPlayerControls( + wxMediaCtrlPlayerControls WXUNUSED(flags)) + { return false; } + virtual bool IsInterfaceShown() + { return false; } + + virtual wxLongLong GetDownloadProgress() + { return 0; } + virtual wxLongLong GetDownloadTotal() + { return 0; } + + virtual void MacVisibilityChanged() + { } + virtual void RESERVED9() {} + + DECLARE_DYNAMIC_CLASS(wxMediaBackend) +}; + + +//Event ID to give to our events +#define wxMEDIA_FINISHED_ID 13000 +#define wxMEDIA_STOP_ID 13001 + +//Define our event types - we need to call DEFINE_EVENT_TYPE(EVT) later +DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_FINISHED, wxMEDIA_FINISHED_ID) +DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_STOP, wxMEDIA_STOP_ID) + +//Function type(s) our events need +typedef void (wxEvtHandler::*wxMediaEventFunction)(wxMediaEvent&); + +#define wxMediaEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxMediaEventFunction, &func) + +//Macro for usage with message maps +#define EVT_MEDIA_FINISHED(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_FINISHED, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ), +#define EVT_MEDIA_STOP(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_STOP, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ), + +#if wxABI_VERSION >= 20602 /* 2.6.2+ only */ +# define wxMEDIA_LOADED_ID 13002 + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_LOADED, wxMEDIA_LOADED_ID) +# define EVT_MEDIA_LOADED(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_LOADED, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ), +#endif + +#if wxABI_VERSION >= 20603 /* 2.6.3+ only */ +# define wxMEDIA_STATECHANGED_ID 13003 +# define wxMEDIA_PLAY_ID 13004 +# define wxMEDIA_PAUSE_ID 13005 + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_STATECHANGED, wxMEDIA_STATECHANGED_ID) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_PLAY, wxMEDIA_PLAY_ID) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_PAUSE, wxMEDIA_PAUSE_ID) +# define EVT_MEDIA_STATECHANGED(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_STATECHANGED, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ), +# define EVT_MEDIA_PLAY(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_PLAY, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ), +# define EVT_MEDIA_PAUSE(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_PAUSE, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ), +#endif + +// ---------------------------------------------------------------------------- +// common backend base class used by many other backends +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_MEDIA wxMediaBackendCommonBase : public wxMediaBackend +{ +public: + // add a pending wxMediaEvent of the given type + void QueueEvent(wxEventType evtType); + + // notify that the movie playback is finished + void QueueFinishEvent() + { +#if wxABI_VERSION >= 20603 /* 2.6.3+ only */ + QueueEvent(wxEVT_MEDIA_STATECHANGED); +#endif + QueueEvent(wxEVT_MEDIA_FINISHED); + } + + // send the stop event and return true if it hasn't been vetoed + bool SendStopEvent(); + + // Queue pause event + void QueuePlayEvent(); + + // Queue pause event + void QueuePauseEvent(); + + // Queue stop event (no veto) + void QueueStopEvent(); + +protected: + // call this when the movie size has changed but not because it has just + // been loaded (in this case, call NotifyMovieLoaded() below) + void NotifyMovieSizeChanged(); + + // call this when the movie is fully loaded + void NotifyMovieLoaded(); + + + wxMediaCtrl *m_ctrl; // parent control +}; + +// ---------------------------------------------------------------------------- +// End compilation gaurd +// ---------------------------------------------------------------------------- +#endif // wxUSE_MEDIACTRL + +// ---------------------------------------------------------------------------- +// End header guard and header itself +// ---------------------------------------------------------------------------- +#endif // _WX_MEDIACTRL_H_ + + diff --git a/installers/patch_wx28_win32s/include/wx/msw/slider95.h b/installers/patch_wx28_win32s/include/wx/msw/slider95.h new file mode 100644 index 0000000..9969e64 --- /dev/null +++ b/installers/patch_wx28_win32s/include/wx/msw/slider95.h @@ -0,0 +1,242 @@ +#ifdef __BORLANDC__ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/slidrmsw.h +// Purpose: wxSlider class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: slidrmsw.h,v 1.12 2003/08/09 12:38:00 VS Exp $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _SLIDRMSW_H_ +#define _SLIDRMSW_H_ + +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) +#pragma interface "slidr95.h" +#endif + +// Slider +class WXDLLEXPORT wxSlider : public wxSliderBase +{ +public: + wxSlider(); + + wxSlider(wxWindow *parent, wxWindowID id, + int value, int minValue, int maxValue, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSL_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSliderNameStr) + { + Create(parent, id, value, minValue, maxValue, pos, size, style, validator, name); + } + + ~wxSlider(); + + bool Create(wxWindow *parent, wxWindowID id, + int value, int minValue, int maxValue, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSL_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSliderNameStr); + + virtual int GetValue() const; + virtual void SetValue(int); + + void GetSize(int *x, int *y) const; + void GetPosition(int *x, int *y) const; + + bool Show(bool show); + + void SetRange(int minValue, int maxValue); + + int GetMin() const { return m_rangeMin; } + int GetMax() const { return m_rangeMax; } + + // For trackbars only + void SetPageSize(int pageSize); + int GetPageSize() const; + void SetLineSize(int lineSize); + int GetLineSize() const; + + // these methods get/set the length of the slider pointer in pixels + virtual void SetThumbLength(int lenPixels); + virtual int GetThumbLength() const ; + + // IMPLEMENTATION + WXHWND GetStaticMin() const { return m_staticMin; } + WXHWND GetStaticMax() const { return m_staticMax; } + WXHWND GetEditValue() const { return m_staticValue; } + virtual bool ContainsHWND(WXHWND hWnd) const; + + void Command(wxCommandEvent& event); + /* + virtual WXHBRUSH OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor, + WXUINT message, WXWPARAM wParam, WXLPARAM lParam); + */ + virtual bool MSWOnScroll(int orientation, WXWORD wParam, + WXWORD pos, WXHWND control); + +protected: + WXHWND m_staticMin; + WXHWND m_staticMax; + WXHWND m_staticValue; + int m_rangeMin; + int m_rangeMax; + int m_pageSize; + int m_lineSize; + + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); + + DECLARE_DYNAMIC_CLASS(wxSlider) +}; + +#endif + // _SLIDRMSW_H_ +#endif + +#ifndef __BORLANDC__ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/slider95.h +// Purpose: wxSlider class, using the Win95 (and later) trackbar control +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: slider95.h 53135 2008-04-12 02:31:04Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SLIDER95_H_ +#define _WX_SLIDER95_H_ + +class WXDLLIMPEXP_FWD_CORE wxSubwindows; + +// Slider +class WXDLLEXPORT wxSlider : public wxSliderBase +{ +public: + wxSlider() { Init(); } + + wxSlider(wxWindow *parent, + wxWindowID id, + int value, + int minValue, + int maxValue, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSL_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSliderNameStr) + { + Init(); + + (void)Create(parent, id, value, minValue, maxValue, + pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + int value, + int minValue, int maxValue, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSL_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSliderNameStr); + + virtual ~wxSlider(); + + // slider methods + virtual int GetValue() const; + virtual void SetValue(int); + + void SetRange(int minValue, int maxValue); + + int GetMin() const { return m_rangeMin; } + int GetMax() const { return m_rangeMax; } + + // Win32-specific slider methods + void SetTickFreq(int n, int pos); + int GetTickFreq() const { return m_tickFreq; } + void SetPageSize(int pageSize); + int GetPageSize() const; + void ClearSel(); + void ClearTicks(); + void SetLineSize(int lineSize); + int GetLineSize() const; + int GetSelEnd() const; + int GetSelStart() const; + void SetSelection(int minPos, int maxPos); + void SetThumbLength(int len); + int GetThumbLength() const; + void SetTick(int tickPos); + + // implementation only from now on + WXHWND GetStaticMin() const; + WXHWND GetStaticMax() const; + WXHWND GetEditValue() const; + virtual bool ContainsHWND(WXHWND hWnd) const; + + // we should let background show through the slider (and its labels) + virtual bool HasTransparentBackground() { return true; } + + + void Command(wxCommandEvent& event); + virtual bool MSWOnScroll(int orientation, WXWORD wParam, + WXWORD pos, WXHWND control); + + virtual bool Show(bool show = true); + virtual bool Enable(bool show = true); + virtual bool SetFont(const wxFont& font); + + virtual WXDWORD MSWGetStyle(long flags, WXDWORD *exstyle = NULL) const; + +protected: + // common part of all ctors + void Init(); + + // format an integer value as string + static wxString Format(int n) { return wxString::Format(_T("%d"), n); } + + // get the boundig box for the slider and possible labels + wxRect GetBoundingBox() const; + + // get the height and, if the pointer is not NULL, width of our labels + int GetLabelsSize(int *width = NULL) const; + + + // overridden base class virtuals + virtual void DoGetPosition(int *x, int *y) const; + virtual void DoGetSize(int *width, int *height) const; + virtual void DoMoveWindow(int x, int y, int width, int height); + virtual wxSize DoGetBestSize() const; + + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + + // the labels windows, if any + wxSubwindows *m_labels; + + int m_rangeMin; + int m_rangeMax; + int m_pageSize; + int m_lineSize; + int m_tickFreq; + + // flag needed to detect whether we're getting THUMBRELEASE event because + // of dragging the thumb or scrolling the mouse wheel + bool m_isDragging; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxSlider) +}; + +#endif // _WX_SLIDER95_H_ + +#endif \ No newline at end of file diff --git a/installers/patch_wx28_win32s/src/common/mediactrlcmn.cpp b/installers/patch_wx28_win32s/src/common/mediactrlcmn.cpp new file mode 100644 index 0000000..281bcf7 --- /dev/null +++ b/installers/patch_wx28_win32s/src/common/mediactrlcmn.cpp @@ -0,0 +1,562 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/mediactrl.cpp +// Purpose: wxMediaCtrl common code +// Author: Ryan Norton +// Modified by: +// Created: 11/07/04 +// RCS-ID: $Id: mediactrlcmn.cpp 42816 2006-10-31 08:50:17Z RD $ +// Copyright: (c) Ryan Norton +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// TODO: Platform specific backend defaults? + +//=========================================================================== +// Definitions +//=========================================================================== + +//--------------------------------------------------------------------------- +// Pre-compiled header stuff +//--------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_MEDIACTRL + +#ifndef WX_PRECOMP + #include "wx/hash.h" +#endif + +//--------------------------------------------------------------------------- +// Includes +//--------------------------------------------------------------------------- +#include "wx/mediactrl.h" + +//=========================================================================== +// +// Implementation +// +//=========================================================================== + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// RTTI and Event implementations +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +IMPLEMENT_CLASS(wxMediaCtrl, wxControl) +DEFINE_EVENT_TYPE(wxEVT_MEDIA_STATECHANGED) +DEFINE_EVENT_TYPE(wxEVT_MEDIA_PLAY) +DEFINE_EVENT_TYPE(wxEVT_MEDIA_PAUSE) +IMPLEMENT_CLASS(wxMediaBackend, wxObject) +IMPLEMENT_DYNAMIC_CLASS(wxMediaEvent, wxEvent) +DEFINE_EVENT_TYPE(wxEVT_MEDIA_FINISHED) +DEFINE_EVENT_TYPE(wxEVT_MEDIA_LOADED) +DEFINE_EVENT_TYPE(wxEVT_MEDIA_STOP) + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// +// wxMediaCtrl +// +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//--------------------------------------------------------------------------- +// wxMediaBackend Destructor +// +// This is here because the DARWIN gcc compiler badly screwed up and +// needs the destructor implementation in the source +//--------------------------------------------------------------------------- +wxMediaBackend::~wxMediaBackend() +{ +} + +//--------------------------------------------------------------------------- +// wxMediaCtrl::Create (file version) +// wxMediaCtrl::Create (URL version) +// +// Searches for a backend that is installed on the system (backends +// starting with lower characters in the alphabet are given priority), +// and creates the control from it +// +// This searches by searching the global RTTI hashtable, class by class, +// attempting to call CreateControl on each one found that is a derivative +// of wxMediaBackend - if it succeeded Create returns true, otherwise +// it keeps iterating through the hashmap. +//--------------------------------------------------------------------------- +bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id, + const wxString& fileName, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& szBackend, + const wxValidator& validator, + const wxString& name) +{ + if(!szBackend.empty()) + { + wxClassInfo* pClassInfo = wxClassInfo::FindClass(szBackend); + + //if (!pClassInfo) wxMessageBox("No pClassinfo"); + + if(!pClassInfo || !DoCreate(pClassInfo, parent, id, + pos, size, style, validator, name)) + { + m_imp = NULL; + + return false; + } + + if (!fileName.empty()) + { + if (!Load(fileName)) + { + delete m_imp; + m_imp = NULL; + return false; + } + } + + SetInitialSize(size); + return true; + } + else + { + wxClassInfo::sm_classTable->BeginFind(); + + wxClassInfo* classInfo; + + while((classInfo = NextBackend()) != NULL) + { + if(!DoCreate(classInfo, parent, id, + pos, size, style, validator, name)) + continue; + + if (!fileName.empty()) + { + if (Load(fileName)) + { + SetInitialSize(size); + return true; + } + else + delete m_imp; + } + else + { + SetInitialSize(size); + return true; + } + } + + m_imp = NULL; + return false; + } +} + +bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id, + const wxURI& location, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& szBackend, + const wxValidator& validator, + const wxString& name) +{ + if(!szBackend.empty()) + { + wxClassInfo* pClassInfo = wxClassInfo::FindClass(szBackend); + if(!pClassInfo || !DoCreate(pClassInfo, parent, id, + pos, size, style, validator, name)) + { + m_imp = NULL; + return false; + } + + if (!Load(location)) + { + delete m_imp; + m_imp = NULL; + return false; + } + + SetInitialSize(size); + return true; + } + else + { + wxClassInfo::sm_classTable->BeginFind(); + + wxClassInfo* classInfo; + + while((classInfo = NextBackend()) != NULL) + { + if(!DoCreate(classInfo, parent, id, + pos, size, style, validator, name)) + continue; + + if (Load(location)) + { + SetInitialSize(size); + return true; + } + else + delete m_imp; + } + + m_imp = NULL; + return false; + } +} + +//--------------------------------------------------------------------------- +// wxMediaCtrl::DoCreate +// +// Attempts to create the control from a backend +//--------------------------------------------------------------------------- +bool wxMediaCtrl::DoCreate(wxClassInfo* classInfo, + wxWindow* parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name) +{ + m_imp = (wxMediaBackend*)classInfo->CreateObject(); + + if( m_imp->CreateControl(this, parent, id, pos, size, + style, validator, name) ) + { + return true; + } + + delete m_imp; + return false; +} + +//--------------------------------------------------------------------------- +// wxMediaCtrl::NextBackend (static) +// +// +// Search through the RTTI hashmap one at a +// time, attempting to create each derivative +// of wxMediaBackend +// +// +// STL isn't compatible with and will have a compilation error +// on a wxNode, however, wxHashTable::compatibility_iterator is +// incompatible with the old 2.4 stable version - but since +// we're in 2.5+ only we don't need to worry about the new version +//--------------------------------------------------------------------------- +wxClassInfo* wxMediaCtrl::NextBackend() +{ + wxHashTable::compatibility_iterator + node = wxClassInfo::sm_classTable->Next(); + while (node) + { + wxClassInfo* classInfo = (wxClassInfo *)node->GetData(); + if ( classInfo->IsKindOf(CLASSINFO(wxMediaBackend)) && + classInfo != CLASSINFO(wxMediaBackend) ) + { + return classInfo; + } + node = wxClassInfo::sm_classTable->Next(); + } + + // + // Nope - couldn't successfully find one... fail + // + return NULL; +} + + +//--------------------------------------------------------------------------- +// wxMediaCtrl Destructor +// +// Free up the backend if it exists +//--------------------------------------------------------------------------- +wxMediaCtrl::~wxMediaCtrl() +{ + if (m_imp) + delete m_imp; +} + +//--------------------------------------------------------------------------- +// wxMediaCtrl::Load (file version) +// wxMediaCtrl::Load (URL version) +// wxMediaCtrl::Load (URL & Proxy version) +// wxMediaCtrl::Load (wxInputStream version) +// +// Here we call load of the backend - keeping +// track of whether it was successful or not - which +// will determine which later method calls work +//--------------------------------------------------------------------------- +bool wxMediaCtrl::Load(const wxString& fileName) +{ + if(m_imp) + return (m_bLoaded = m_imp->Load(fileName)); + return false; +} + +bool wxMediaCtrl::Load(const wxURI& location) +{ + if(m_imp) + return (m_bLoaded = m_imp->Load(location)); + return false; +} + +bool wxMediaCtrl::Load(const wxURI& location, const wxURI& proxy) +{ + if(m_imp) + return (m_bLoaded = m_imp->Load(location, proxy)); + return false; +} + +//--------------------------------------------------------------------------- +// wxMediaCtrl::Play +// wxMediaCtrl::Pause +// wxMediaCtrl::Stop +// wxMediaCtrl::GetPlaybackRate +// wxMediaCtrl::SetPlaybackRate +// wxMediaCtrl::Seek --> SetPosition +// wxMediaCtrl::Tell --> GetPosition +// wxMediaCtrl::Length --> GetDuration +// wxMediaCtrl::GetState +// wxMediaCtrl::DoGetBestSize +// wxMediaCtrl::SetVolume +// wxMediaCtrl::GetVolume +// wxMediaCtrl::ShowInterface +// wxMediaCtrl::GetDownloadProgress +// wxMediaCtrl::GetDownloadTotal +// +// 1) Check to see whether the backend exists and is loading +// 2) Call the backend's version of the method, returning success +// if the backend's version succeeds +//--------------------------------------------------------------------------- +bool wxMediaCtrl::Play() +{ + if(m_imp && m_bLoaded) + return m_imp->Play(); + return 0; +} + +bool wxMediaCtrl::Pause() +{ + if(m_imp && m_bLoaded) + return m_imp->Pause(); + return 0; +} + +bool wxMediaCtrl::Stop() +{ + if(m_imp && m_bLoaded) + return m_imp->Stop(); + return 0; +} + +double wxMediaCtrl::GetPlaybackRate() +{ + if(m_imp && m_bLoaded) + return m_imp->GetPlaybackRate(); + return 0; +} + +bool wxMediaCtrl::SetPlaybackRate(double dRate) +{ + if(m_imp && m_bLoaded) + return m_imp->SetPlaybackRate(dRate); + return false; +} + +wxFileOffset wxMediaCtrl::Seek(wxFileOffset where, wxSeekMode mode) +{ + wxFileOffset offset; + + switch (mode) + { + case wxFromStart: + offset = where; + break; + case wxFromEnd: + offset = Length() - where; + break; +// case wxFromCurrent: + default: + offset = Tell() + where; + break; + } + + if(m_imp && m_bLoaded && m_imp->SetPosition(offset)) + return offset; + return wxInvalidOffset; +} + +wxFileOffset wxMediaCtrl::Tell() +{ + if(m_imp && m_bLoaded) + return (wxFileOffset) m_imp->GetPosition().ToLong(); + return wxInvalidOffset; +} + +wxFileOffset wxMediaCtrl::Length() +{ + if(m_imp && m_bLoaded) + return (wxFileOffset) m_imp->GetDuration().ToLong(); + return wxInvalidOffset; +} + +wxMediaState wxMediaCtrl::GetState() +{ + if(m_imp && m_bLoaded) + return m_imp->GetState(); + return wxMEDIASTATE_STOPPED; +} + +wxSize wxMediaCtrl::DoGetBestSize() const +{ + if(m_imp) + return m_imp->GetVideoSize(); + return wxSize(0,0); +} + +double wxMediaCtrl::GetVolume() +{ + if(m_imp && m_bLoaded) + return m_imp->GetVolume(); + return 0.0; +} + +bool wxMediaCtrl::SetVolume(double dVolume) +{ + if(m_imp && m_bLoaded) + return m_imp->SetVolume(dVolume); + return false; +} + +bool wxMediaCtrl::ShowPlayerControls(wxMediaCtrlPlayerControls flags) +{ + if(m_imp) + return m_imp->ShowPlayerControls(flags); + return false; +} + +wxFileOffset wxMediaCtrl::GetDownloadProgress() +{ + if(m_imp && m_bLoaded) + return (wxFileOffset) m_imp->GetDownloadProgress().ToLong(); + return wxInvalidOffset; +} + +wxFileOffset wxMediaCtrl::GetDownloadTotal() +{ + if(m_imp && m_bLoaded) + return (wxFileOffset) m_imp->GetDownloadTotal().ToLong(); + return wxInvalidOffset; +} + +//--------------------------------------------------------------------------- +// wxMediaCtrl::DoMoveWindow +// +// 1) Call parent's version so that our control's window moves where +// it's supposed to +// 2) If the backend exists and is loaded, move the video +// of the media to where our control's window is now located +//--------------------------------------------------------------------------- +void wxMediaCtrl::DoMoveWindow(int x, int y, int w, int h) +{ + wxControl::DoMoveWindow(x,y,w,h); + + if(m_imp) + m_imp->Move(x, y, w, h); +} + +//--------------------------------------------------------------------------- +// wxMediaCtrl::MacVisibilityChanged +//--------------------------------------------------------------------------- +#ifdef __WXMAC__ +void wxMediaCtrl::MacVisibilityChanged() +{ + wxControl::MacVisibilityChanged(); + + if(m_imp) + m_imp->MacVisibilityChanged(); +} +#endif + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// +// wxMediaBackendCommonBase +// +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +void wxMediaBackendCommonBase::NotifyMovieSizeChanged() +{ + // our best size changed after opening a new file + m_ctrl->InvalidateBestSize(); + m_ctrl->SetSize(m_ctrl->GetSize()); + + // if the parent of the control has a sizer ask it to refresh our size + wxWindow * const parent = m_ctrl->GetParent(); + if ( parent->GetSizer() ) + { + m_ctrl->GetParent()->Layout(); + m_ctrl->GetParent()->Refresh(); + m_ctrl->GetParent()->Update(); + } +} + +void wxMediaBackendCommonBase::NotifyMovieLoaded() +{ + NotifyMovieSizeChanged(); + + // notify about movie being fully loaded + QueueEvent(wxEVT_MEDIA_LOADED); +} + +bool wxMediaBackendCommonBase::SendStopEvent() +{ + wxMediaEvent theEvent(wxEVT_MEDIA_STOP, m_ctrl->GetId()); + + return !m_ctrl->ProcessEvent(theEvent) || theEvent.IsAllowed(); +} + +void wxMediaBackendCommonBase::QueueEvent(wxEventType evtType) +{ + wxMediaEvent theEvent(evtType, m_ctrl->GetId()); + m_ctrl->AddPendingEvent(theEvent); +} + +void wxMediaBackendCommonBase::QueuePlayEvent() +{ + QueueEvent(wxEVT_MEDIA_STATECHANGED); + QueueEvent(wxEVT_MEDIA_PLAY); +} + +void wxMediaBackendCommonBase::QueuePauseEvent() +{ + QueueEvent(wxEVT_MEDIA_STATECHANGED); + QueueEvent(wxEVT_MEDIA_PAUSE); +} + +void wxMediaBackendCommonBase::QueueStopEvent() +{ + QueueEvent(wxEVT_MEDIA_STATECHANGED); + QueueEvent(wxEVT_MEDIA_STOP); +} + + +// +// Force link default backends in - +// see http://wiki.wxwidgets.org/wiki.pl?RTTI +// +#include "wx/html/forcelnk.h" + +#ifdef __WXMSW__ // MSW has huge backends so we do it seperately +FORCE_LINK(wxmediabackend_am) +FORCE_LINK(wxmediabackend_wmp10) +#else +FORCE_LINK(basewxmediabackends) +#endif + +#endif //wxUSE_MEDIACTRL diff --git a/installers/patch_wx28_win32s/src/msw/mediactrl_am.cpp b/installers/patch_wx28_win32s/src/msw/mediactrl_am.cpp new file mode 100644 index 0000000..ff7556b --- /dev/null +++ b/installers/patch_wx28_win32s/src/msw/mediactrl_am.cpp @@ -0,0 +1,2899 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/msw/mediactrl_am.cpp +// Purpose: ActiveMovie/WMP6/PocketPC 2000 Media Backend for Windows +// +// ********************************** +// ** Update 30 aug 2022 by adalbert: +// Pasted MCI backend from mediactrl.cpp here, because generic mediactrl.cpp +// was ignored on MSW and MCI backend (which was in mediactrl.cpp) did not work... +// ********************************** +// +// Author: Ryan Norton +// Modified by: adalbert +// Created: 01/29/05 +// RCS-ID: $Id: mediactrl_am.cpp 49027 2007-10-03 22:36:29Z VZ $ +// Copyright: (c) Ryan Norton +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + + +// TODO: Actually test the CE IWMP.... +// TODO: Actually test HTTP proxies... + +//-----------------Introduction---------------------------------------------- +// This is the media backend for Windows Media Player 6 and ActiveMovie, +// as well as PocketPC 2000, Windows Media Player Mobile 7 and 8. +// +// We use a combination of the WMP 6 IMediaPlayer interface as well as the +// ActiveMovie interface IActiveMovie that even exists on Windows 3. For +// mobile systems we switch to IWMP for WMP mobile 7 and 8 and possibly +// earlier. We just use ifdefs for differentiating between IWMP and +// IActiveMovie/IMediaPlayer as the IWMP and IMediaPlayer are virtually +// identical with a few minor exceptions. +// +// For supporting HTTP proxies and such we query the media player +// interface (IActiveMovie/IWMP) for the INSPlay (NetShow) interface. +// +// The IMediaPlayer/IActiveMovie/IWMP are rather clean and straightforward +// interfaces that are fairly simplistic. +// +// Docs for IMediaPlayer are at +// http://msdn.microsoft.com/library/en-us/wmp6sdk/htm/microsoftwindowsmediaplayercontrolversion64sdk.asp +// +// Docs for IWMP are at +// http://msdn.microsoft.com/library/en-us/wcewmp/html/_wcesdk_asx_wmp_control_reference.asp + +//=========================================================================== +// DECLARATIONS +//=========================================================================== + +//--------------------------------------------------------------------------- +// Pre-compiled header stuff +//--------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// disable "cast truncates constant value" for VARIANT_BOOL values +// passed as parameters in VC6 +#ifdef _MSC_VER +#pragma warning (disable:4310) +#endif + +#if wxUSE_MEDIACTRL && wxUSE_ACTIVEX + +#include "wx/mediactrl.h" + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/dcclient.h" + #include "wx/timer.h" + #include "wx/math.h" // log10 & pow + #include "wx/stopwatch.h" +#endif + +#include "wx/msw/private.h" // user info and wndproc setting/getting +#include "wx/dynlib.h" + + +//--------------------------------------------------------------------------- +// Externals (somewhere in src/msw/app.cpp and src/msw/window.cpp) +//--------------------------------------------------------------------------- +extern "C" WXDLLIMPEXP_BASE HINSTANCE wxGetInstance(void); +#ifdef __WXWINCE__ +extern WXDLLIMPEXP_CORE wxChar *wxCanvasClassName; +#else +extern WXDLLIMPEXP_CORE const wxChar *wxCanvasClassName; +#endif + +LRESULT WXDLLIMPEXP_CORE APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, + WPARAM wParam, LPARAM lParam); + + +//--------------------------------------------------------------------------- +// wxActiveXContainer - includes all the COM-specific stuff we need +//--------------------------------------------------------------------------- +#include "wx/msw/ole/activex.h" + +// It may sound odd, but you can actually compile this with +// __WXWINCE__ enabled on non-CE windows +//#define __WXWINCE__ + +//--------------------------------------------------------------------------- +// IIDS - used by CoCreateInstance and IUnknown::QueryInterface +// +// [idl name] [idl decription] +// amcompat.idl Microsoft Active Movie Control (Ver 2.0) +// nscompat.idl Microsoft NetShow Player (Ver 1.0) +// msdxm.idl Windows Media Player (Ver 1.0) +// quartz.idl +// +// First, when I say I "from XXX.idl", I mean I go into the COM Browser +// ($Microsoft Visual Studio$/Common/Tools/OLEVIEW.EXE), open +// "type libraries", open a specific type library (for quartz for example its +// "ActiveMovie control type library (V1.0)"), save it as an .idl, compile the +// idl using the midl compiler that comes with visual studio +// ($Microsoft Visual Studio$/VC98/bin/midl.exe on VC6) with the /h argument +// to make it generate stubs (a .h & .c file), then clean up the generated +// interfaces I want with the STDMETHOD wrappers and then put them into +// mediactrl.cpp. +// +// According to the MSDN docs, IMediaPlayer requires Windows 98 SE +// or greater. NetShow is available on Windows 3.1 and I'm guessing +// IActiveMovie is too. IMediaPlayer is essentially the Windows Media +// Player 6.4 SDK. +// +// IWMP is from PlayerOCX.idl on PocketPC 2000, which uses CLSID_MediaPlayer +// as well as the main windows line. +// +// Some of these are not used but are kept here for future reference anyway +//--------------------------------------------------------------------------- +const IID IID_IActiveMovie = {0x05589FA2,0xC356,0x11CE,{0xBF,0x01,0x00,0xAA,0x00,0x55,0x59,0x5A}}; +const IID IID_IActiveMovie2 = {0xB6CD6554,0xE9CB,0x11D0,{0x82,0x1F,0x00,0xA0,0xC9,0x1F,0x9C,0xA0}}; +const IID IID_IActiveMovie3 = {0x265EC140,0xAE62,0x11D1,{0x85,0x00,0x00,0xA0,0xC9,0x1F,0x9C,0xA0}}; + +const IID IID_INSOPlay = {0x2179C5D1,0xEBFF,0x11CF,{0xB6,0xFD,0x00,0xAA,0x00,0xB4,0xE2,0x20}}; +const IID IID_INSPlay = {0xE7C4BE80,0x7960,0x11D0,{0xB7,0x27,0x00,0xAA,0x00,0xB4,0xE2,0x20}}; +const IID IID_INSPlay1 = {0x265EC141,0xAE62,0x11D1,{0x85,0x00,0x00,0xA0,0xC9,0x1F,0x9C,0xA0}}; + +const IID IID_IMediaPlayer = {0x22D6F311,0xB0F6,0x11D0,{0x94,0xAB,0x00,0x80,0xC7,0x4C,0x7E,0x95}}; +const IID IID_IMediaPlayer2 = {0x20D4F5E0,0x5475,0x11D2,{0x97,0x74,0x00,0x00,0xF8,0x08,0x55,0xE6}}; + + +#ifdef __WXWINCE__ +const IID IID_IWMP = {0x136B66EC,0xF30D,0x46A8,{0x88,0xDD,0xF2,0xD0,0x55,0x16,0x3E,0x49}}; +#endif + +const CLSID CLSID_ActiveMovie = {0x05589FA1,0xC356,0x11CE,{0xBF,0x01,0x00,0xAA,0x00,0x55,0x59,0x5A}}; +const CLSID CLSID_MediaPlayer = {0x22D6F312,0xB0F6,0x11D0,{0x94,0xAB,0x00,0x80,0xC7,0x4C,0x7E,0x95}}; +const CLSID CLSID_NSPlay = {0x2179C5D3,0xEBFF,0x11CF,{0xB6,0xFD,0x00,0xAA,0x00,0xB4,0xE2,0x20}}; + +const IID IID_IAMOpenProgress = {0x8E1C39A1, 0xDE53, 0x11CF,{0xAA, 0x63, 0x00, 0x80, 0xC7, 0x44, 0x52, 0x8D}}; + +// QUARTZ +const CLSID CLSID_FilgraphManager = {0xE436EBB3,0x524F,0x11CE,{0x9F,0x53,0x00,0x20,0xAF,0x0B,0xA7,0x70}}; +const IID IID_IMediaEvent = {0x56A868B6,0x0AD4,0x11CE,{0xB0,0x3A,0x00,0x20,0xAF,0x0B,0xA7,0x70}}; + +//?? QUARTZ Also? +const CLSID CLSID_VideoMixingRenderer9 ={0x51B4ABF3, 0x748F, 0x4E3B,{0xA2, 0x76, 0xC8, 0x28, 0x33, 0x0E, 0x92, 0x6A}}; +const IID IID_IVMRWindowlessControl9 = {0x8F537D09, 0xF85E, 0x4414,{0xB2, 0x3B, 0x50, 0x2E, 0x54, 0xC7, 0x99, 0x27}}; +const IID IID_IFilterGraph = {0x56A8689F, 0x0AD4, 0x11CE,{0xB0, 0x3A, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70}}; +const IID IID_IGraphBuilder = {0x56A868A9, 0x0AD4, 0x11CE,{0xB0, 0x3A, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70}}; +const IID IID_IVMRFilterConfig9 = {0x5A804648, 0x4F66, 0x4867,{0x9C, 0x43, 0x4F, 0x5C, 0x82, 0x2C, 0xF1, 0xB8}}; +const IID IID_IBaseFilter = {0x56A86895, 0x0AD4, 0x11CE,{0xB0, 0x3A, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70}}; + +//--------------------------------------------------------------------------- +// QUARTZ COM INTERFACES (dumped from quartz.idl from MSVC COM Browser) +//--------------------------------------------------------------------------- + +struct IAMOpenProgress : public IUnknown +{ + STDMETHOD(QueryProgress)(LONGLONG *pllTotal, LONGLONG *pllCurrent) PURE; + STDMETHOD(AbortOperation)(void) PURE; +}; + +struct IMediaEvent : public IDispatch +{ + STDMETHOD(GetEventHandle)(LONG_PTR *) PURE; + STDMETHOD(GetEvent)(long *, LONG_PTR *, LONG_PTR *, long) PURE; + STDMETHOD(WaitForCompletion)(long, long *) PURE; + STDMETHOD(CancelDefaultHandling)(long) PURE; + STDMETHOD(RestoreDefaultHandling)(long) PURE; + STDMETHOD(FreeEventParams)(long, LONG_PTR, LONG_PTR) PURE; +}; + +//--------------------------------------------------------------------------- +// ACTIVEMOVIE COM INTERFACES (dumped from amcompat.idl from MSVC COM Browser) +//--------------------------------------------------------------------------- + +enum ReadyStateConstants +{ + amvUninitialized = 0, + amvLoading = 1, + amvInteractive = 3, + amvComplete = 4 +}; + +enum StateConstants +{ + amvNotLoaded = -1, + amvStopped = 0, + amvPaused = 1, + amvRunning = 2 +}; + +enum DisplayModeConstants +{ + amvTime = 0, + amvFrames = 1 +}; + +enum WindowSizeConstants +{ + amvOriginalSize = 0, + amvDoubleOriginalSize = 1, + amvOneSixteenthScreen = 2, + amvOneFourthScreen = 3, + amvOneHalfScreen = 4 +}; + +enum AppearanceConstants +{ + amvFlat = 0, + amv3D = 1 +}; + +enum BorderStyleConstants +{ + amvNone = 0, + amvFixedSingle = 1 +}; + +struct IActiveMovie : public IDispatch +{ + STDMETHOD(AboutBox)( void) PURE; + STDMETHOD(Run)( void) PURE; + STDMETHOD(Pause)( void) PURE; + STDMETHOD(Stop)( void) PURE; + STDMETHOD(get_ImageSourceWidth)(long __RPC_FAR *pWidth) PURE; + STDMETHOD(get_ImageSourceHeight)(long __RPC_FAR *pHeight) PURE; + STDMETHOD(get_Author)(BSTR __RPC_FAR *pbstrAuthor) PURE; + STDMETHOD(get_Title)(BSTR __RPC_FAR *pbstrTitle) PURE; + STDMETHOD(get_Copyright)(BSTR __RPC_FAR *pbstrCopyright) PURE; + STDMETHOD(get_Description)(BSTR __RPC_FAR *pbstrDescription) PURE; + STDMETHOD(get_Rating)(BSTR __RPC_FAR *pbstrRating) PURE; + STDMETHOD(get_FileName)(BSTR __RPC_FAR *pbstrFileName) PURE; + STDMETHOD(put_FileName)(BSTR pbstrFileName) PURE; + STDMETHOD(get_Duration)(double __RPC_FAR *pValue) PURE; + STDMETHOD(get_CurrentPosition)(double __RPC_FAR *pValue) PURE; + STDMETHOD(put_CurrentPosition)(double pValue) PURE; + STDMETHOD(get_PlayCount)(long __RPC_FAR *pPlayCount) PURE; + STDMETHOD(put_PlayCount)(long pPlayCount) PURE; + STDMETHOD(get_SelectionStart)(double __RPC_FAR *pValue) PURE; + STDMETHOD(put_SelectionStart)(double pValue) PURE; + STDMETHOD(get_SelectionEnd)(double __RPC_FAR *pValue) PURE; + STDMETHOD(put_SelectionEnd)(double pValue) PURE; + STDMETHOD(get_CurrentState)(StateConstants __RPC_FAR *pState) PURE; + STDMETHOD(get_Rate)(double __RPC_FAR *pValue) PURE; + STDMETHOD(put_Rate)(double pValue) PURE; + STDMETHOD(get_Volume)(long __RPC_FAR *pValue) PURE; + STDMETHOD(put_Volume)(long pValue) PURE; + STDMETHOD(get_Balance)(long __RPC_FAR *pValue) PURE; + STDMETHOD(put_Balance)(long pValue) PURE; + STDMETHOD(get_EnableContextMenu)(VARIANT_BOOL __RPC_FAR *pEnable) PURE; + STDMETHOD(put_EnableContextMenu)(VARIANT_BOOL pEnable) PURE; + STDMETHOD(get_ShowDisplay)(VARIANT_BOOL __RPC_FAR *Show) PURE; + STDMETHOD(put_ShowDisplay)(VARIANT_BOOL Show) PURE; + STDMETHOD(get_ShowControls)(VARIANT_BOOL __RPC_FAR *Show) PURE; + STDMETHOD(put_ShowControls)(VARIANT_BOOL Show) PURE; + STDMETHOD(get_ShowPositionControls)(VARIANT_BOOL __RPC_FAR *Show) PURE; + STDMETHOD(put_ShowPositionControls)(VARIANT_BOOL Show) PURE; + STDMETHOD(get_ShowSelectionControls)(VARIANT_BOOL __RPC_FAR *Show) PURE; + STDMETHOD(put_ShowSelectionControls)(VARIANT_BOOL Show) PURE; + STDMETHOD(get_ShowTracker)(VARIANT_BOOL __RPC_FAR *Show) PURE; + STDMETHOD(put_ShowTracker)(VARIANT_BOOL Show) PURE; + STDMETHOD(get_EnablePositionControls)(VARIANT_BOOL __RPC_FAR *Enable) PURE; + STDMETHOD(put_EnablePositionControls)(VARIANT_BOOL Enable) PURE; + STDMETHOD(get_EnableSelectionControls)(VARIANT_BOOL __RPC_FAR *Enable) PURE; + STDMETHOD(put_EnableSelectionControls)(VARIANT_BOOL Enable) PURE; + STDMETHOD(get_EnableTracker)(VARIANT_BOOL __RPC_FAR *Enable) PURE; + STDMETHOD(put_EnableTracker)(VARIANT_BOOL Enable) PURE; + STDMETHOD(get_AllowHideDisplay)(VARIANT_BOOL __RPC_FAR *Show) PURE; + STDMETHOD(put_AllowHideDisplay)(VARIANT_BOOL Show) PURE; + STDMETHOD(get_AllowHideControls)(VARIANT_BOOL __RPC_FAR *Show) PURE; + STDMETHOD(put_AllowHideControls)(VARIANT_BOOL Show) PURE; + STDMETHOD(get_DisplayMode)(DisplayModeConstants __RPC_FAR *pValue) PURE; + STDMETHOD(put_DisplayMode)(DisplayModeConstants pValue) PURE; + STDMETHOD(get_AllowChangeDisplayMode)(VARIANT_BOOL __RPC_FAR *fAllow) PURE; + STDMETHOD(put_AllowChangeDisplayMode)(VARIANT_BOOL fAllow) PURE; + STDMETHOD(get_FilterGraph)(IUnknown __RPC_FAR *__RPC_FAR *ppFilterGraph) PURE; + STDMETHOD(put_FilterGraph)(IUnknown __RPC_FAR *ppFilterGraph) PURE; + STDMETHOD(get_FilterGraphDispatch)(IDispatch __RPC_FAR *__RPC_FAR *pDispatch) PURE; + STDMETHOD(get_DisplayForeColor)(unsigned long __RPC_FAR *ForeColor) PURE; + STDMETHOD(put_DisplayForeColor)(unsigned long ForeColor) PURE; + STDMETHOD(get_DisplayBackColor)(unsigned long __RPC_FAR *BackColor) PURE; + STDMETHOD(put_DisplayBackColor)(unsigned long BackColor) PURE; + STDMETHOD(get_MovieWindowSize)(WindowSizeConstants __RPC_FAR *WindowSize) PURE; + STDMETHOD(put_MovieWindowSize)(WindowSizeConstants WindowSize) PURE; + STDMETHOD(get_FullScreenMode)(VARIANT_BOOL __RPC_FAR *pEnable) PURE; + STDMETHOD(put_FullScreenMode)(VARIANT_BOOL pEnable) PURE; + STDMETHOD(get_AutoStart)(VARIANT_BOOL __RPC_FAR *pEnable) PURE; + STDMETHOD(put_AutoStart)(VARIANT_BOOL pEnable) PURE; + STDMETHOD(get_AutoRewind)(VARIANT_BOOL __RPC_FAR *pEnable) PURE; + STDMETHOD(put_AutoRewind)(VARIANT_BOOL pEnable) PURE; + STDMETHOD(get_hWnd)(long __RPC_FAR *hWnd) PURE; + STDMETHOD(get_Appearance)(AppearanceConstants __RPC_FAR *pAppearance) PURE; + STDMETHOD(put_Appearance)(AppearanceConstants pAppearance) PURE; + STDMETHOD(get_BorderStyle)(BorderStyleConstants __RPC_FAR *pBorderStyle) PURE; + STDMETHOD(put_BorderStyle)(BorderStyleConstants pBorderStyle) PURE; + STDMETHOD(get_Enabled)(VARIANT_BOOL __RPC_FAR *pEnabled) PURE; + STDMETHOD(put_Enabled)(VARIANT_BOOL pEnabled) PURE; + STDMETHOD(get_Info)(long __RPC_FAR *ppInfo) PURE; +}; + + + +struct IActiveMovie2 : public IActiveMovie +{ + STDMETHOD(IsSoundCardEnabled)(VARIANT_BOOL __RPC_FAR *pbSoundCard) PURE; + STDMETHOD(get_ReadyState)(ReadyStateConstants __RPC_FAR *pValue) PURE; +}; + +struct IActiveMovie3 : public IActiveMovie2 +{ + STDMETHOD(get_MediaPlayer)(IDispatch __RPC_FAR *__RPC_FAR *ppDispatch) PURE; +}; + + +//--------------------------------------------------------------------------- +// MEDIAPLAYER COM INTERFACES (dumped from msdxm.idl from MSVC COM Browser) +//--------------------------------------------------------------------------- + +enum MPPlayStateConstants +{ + mpStopped = 0, + mpPaused = 1, + mpPlaying = 2, + mpWaiting = 3, + mpScanForward = 4, + mpScanReverse = 5, + mpClosed = 6 +}; + +enum MPDisplaySizeConstants +{ + mpDefaultSize = 0, + mpHalfSize = 1, + mpDoubleSize = 2, + mpFullScreen = 3, + mpFitToSize = 4, + mpOneSixteenthScreen = 5, + mpOneFourthScreen = 6, + mpOneHalfScreen = 7 +}; + +enum MPReadyStateConstants +{ + mpReadyStateUninitialized = 0, + mpReadyStateLoading = 1, + mpReadyStateInteractive = 3, + mpReadyStateComplete = 4 +}; + +typedef unsigned long VB_OLE_COLOR; + +enum MPDisplayModeConstants +{ + mpTime = 0, + mpFrames = 1 +}; + +enum MPMoreInfoType +{ + mpShowURL = 0, + mpClipURL = 1, + mpBannerURL = 2 +}; + +enum MPMediaInfoType +{ + mpShowFilename = 0, + mpShowTitle = 1, + mpShowAuthor = 2, + mpShowCopyright = 3, + mpShowRating = 4, + mpShowDescription = 5, + mpShowLogoIcon = 6, + mpClipFilename = 7, + mpClipTitle = 8, + mpClipAuthor = 9, + mpClipCopyright = 10, + mpClipRating = 11, + mpClipDescription = 12, + mpClipLogoIcon = 13, + mpBannerImage = 14, + mpBannerMoreInfo = 15, + mpWatermark = 16 +}; + +enum DVDMenuIDConstants +{ + dvdMenu_Title = 2, + dvdMenu_Root = 3, + dvdMenu_Subpicture = 4, + dvdMenu_Audio = 5, + dvdMenu_Angle = 6, + dvdMenu_Chapter = 7 +}; + +enum MPShowDialogConstants +{ + mpShowDialogHelp = 0, + mpShowDialogStatistics = 1, + mpShowDialogOptions = 2, + mpShowDialogContextMenu = 3 +}; + + +struct IMediaPlayer : public IDispatch +{ + STDMETHOD(get_CurrentPosition)(double __RPC_FAR *pCurrentPosition) PURE; + STDMETHOD(put_CurrentPosition)(double pCurrentPosition) PURE; + STDMETHOD(get_Duration)(double __RPC_FAR *pDuration) PURE; + STDMETHOD(get_ImageSourceWidth)(long __RPC_FAR *pWidth) PURE; + STDMETHOD(get_ImageSourceHeight)(long __RPC_FAR *pHeight) PURE; + STDMETHOD(get_MarkerCount)(long __RPC_FAR *pMarkerCount) PURE; + STDMETHOD(get_CanScan)(VARIANT_BOOL __RPC_FAR *pCanScan) PURE; + STDMETHOD(get_CanSeek)(VARIANT_BOOL __RPC_FAR *pCanSeek) PURE; + STDMETHOD(get_CanSeekToMarkers)(VARIANT_BOOL __RPC_FAR *pCanSeekToMarkers) PURE; + STDMETHOD(get_CurrentMarker)(long __RPC_FAR *pCurrentMarker) PURE; + STDMETHOD(put_CurrentMarker)(long pCurrentMarker) PURE; + STDMETHOD(get_FileName)(BSTR __RPC_FAR *pbstrFileName) PURE; + STDMETHOD(put_FileName)(BSTR pbstrFileName) PURE; + STDMETHOD(get_SourceLink)(BSTR __RPC_FAR *pbstrSourceLink) PURE; + STDMETHOD(get_CreationDate)(DATE __RPC_FAR *pCreationDate) PURE; + STDMETHOD(get_ErrorCorrection)(BSTR __RPC_FAR *pbstrErrorCorrection) PURE; + STDMETHOD(get_Bandwidth)(long __RPC_FAR *pBandwidth) PURE; + STDMETHOD(get_SourceProtocol)(long __RPC_FAR *pSourceProtocol) PURE; + STDMETHOD(get_ReceivedPackets)(long __RPC_FAR *pReceivedPackets) PURE; + STDMETHOD(get_RecoveredPackets)(long __RPC_FAR *pRecoveredPackets) PURE; + STDMETHOD(get_LostPackets)(long __RPC_FAR *pLostPackets) PURE; + STDMETHOD(get_ReceptionQuality)(long __RPC_FAR *pReceptionQuality) PURE; + STDMETHOD(get_BufferingCount)(long __RPC_FAR *pBufferingCount) PURE; + STDMETHOD(get_IsBroadcast)(VARIANT_BOOL __RPC_FAR *pIsBroadcast) PURE; + STDMETHOD(get_BufferingProgress)(long __RPC_FAR *pBufferingProgress) PURE; + STDMETHOD(get_ChannelName)(BSTR __RPC_FAR *pbstrChannelName) PURE; + STDMETHOD(get_ChannelDescription)(BSTR __RPC_FAR *pbstrChannelDescription) PURE; + STDMETHOD(get_ChannelURL)(BSTR __RPC_FAR *pbstrChannelURL) PURE; + STDMETHOD(get_ContactAddress)(BSTR __RPC_FAR *pbstrContactAddress) PURE; + STDMETHOD(get_ContactPhone)(BSTR __RPC_FAR *pbstrContactPhone) PURE; + STDMETHOD(get_ContactEmail)(BSTR __RPC_FAR *pbstrContactEmail) PURE; + STDMETHOD(get_BufferingTime)(double __RPC_FAR *pBufferingTime) PURE; + STDMETHOD(put_BufferingTime)(double pBufferingTime) PURE; + STDMETHOD(get_AutoStart)(VARIANT_BOOL __RPC_FAR *pAutoStart) PURE; + STDMETHOD(put_AutoStart)(VARIANT_BOOL pAutoStart) PURE; + STDMETHOD(get_AutoRewind)(VARIANT_BOOL __RPC_FAR *pAutoRewind) PURE; + STDMETHOD(put_AutoRewind)(VARIANT_BOOL pAutoRewind) PURE; + STDMETHOD(get_Rate)(double __RPC_FAR *pRate) PURE; + STDMETHOD(put_Rate)(double pRate) PURE; + STDMETHOD(get_SendKeyboardEvents)(VARIANT_BOOL __RPC_FAR *pSendKeyboardEvents) PURE; + STDMETHOD(put_SendKeyboardEvents)(VARIANT_BOOL pSendKeyboardEvents) PURE; + STDMETHOD(get_SendMouseClickEvents)(VARIANT_BOOL __RPC_FAR *pSendMouseClickEvents) PURE; + STDMETHOD(put_SendMouseClickEvents)(VARIANT_BOOL pSendMouseClickEvents) PURE; + STDMETHOD(get_SendMouseMoveEvents)(VARIANT_BOOL __RPC_FAR *pSendMouseMoveEvents) PURE; + STDMETHOD(put_SendMouseMoveEvents)(VARIANT_BOOL pSendMouseMoveEvents) PURE; + STDMETHOD(get_PlayCount)(long __RPC_FAR *pPlayCount) PURE; + STDMETHOD(put_PlayCount)(long pPlayCount) PURE; + STDMETHOD(get_ClickToPlay)(VARIANT_BOOL __RPC_FAR *pClickToPlay) PURE; + STDMETHOD(put_ClickToPlay)(VARIANT_BOOL pClickToPlay) PURE; + STDMETHOD(get_AllowScan)(VARIANT_BOOL __RPC_FAR *pAllowScan) PURE; + STDMETHOD(put_AllowScan)(VARIANT_BOOL pAllowScan) PURE; + STDMETHOD(get_EnableContextMenu)(VARIANT_BOOL __RPC_FAR *pEnableContextMenu) PURE; + STDMETHOD(put_EnableContextMenu)(VARIANT_BOOL pEnableContextMenu) PURE; + STDMETHOD(get_CursorType)(long __RPC_FAR *pCursorType) PURE; + STDMETHOD(put_CursorType)(long pCursorType) PURE; + STDMETHOD(get_CodecCount)(long __RPC_FAR *pCodecCount) PURE; + STDMETHOD(get_AllowChangeDisplaySize)(VARIANT_BOOL __RPC_FAR *pAllowChangeDisplaySize) PURE; + STDMETHOD(put_AllowChangeDisplaySize)( VARIANT_BOOL pAllowChangeDisplaySize) PURE; + STDMETHOD(get_IsDurationValid)(VARIANT_BOOL __RPC_FAR *pIsDurationValid) PURE; + STDMETHOD(get_OpenState)(long __RPC_FAR *pOpenState) PURE; + STDMETHOD(get_SendOpenStateChangeEvents)(VARIANT_BOOL __RPC_FAR *pSendOpenStateChangeEvents) PURE; + STDMETHOD(put_SendOpenStateChangeEvents)(VARIANT_BOOL pSendOpenStateChangeEvents) PURE; + STDMETHOD(get_SendWarningEvents)( VARIANT_BOOL __RPC_FAR *pSendWarningEvents) PURE; + STDMETHOD(put_SendWarningEvents)(VARIANT_BOOL pSendWarningEvents) PURE; + STDMETHOD(get_SendErrorEvents)(VARIANT_BOOL __RPC_FAR *pSendErrorEvents) PURE; + STDMETHOD(put_SendErrorEvents)(VARIANT_BOOL pSendErrorEvents) PURE; + STDMETHOD(get_PlayState)(MPPlayStateConstants __RPC_FAR *pPlayState) PURE; + STDMETHOD(get_SendPlayStateChangeEvents)(VARIANT_BOOL __RPC_FAR *pSendPlayStateChangeEvents) PURE; + STDMETHOD(put_SendPlayStateChangeEvents)(VARIANT_BOOL pSendPlayStateChangeEvents) PURE; + STDMETHOD(get_DisplaySize)(MPDisplaySizeConstants __RPC_FAR *pDisplaySize) PURE; + STDMETHOD(put_DisplaySize)(MPDisplaySizeConstants pDisplaySize) PURE; + STDMETHOD(get_InvokeURLs)(VARIANT_BOOL __RPC_FAR *pInvokeURLs) PURE; + STDMETHOD(put_InvokeURLs)(VARIANT_BOOL pInvokeURLs) PURE; + STDMETHOD(get_BaseURL)(BSTR __RPC_FAR *pbstrBaseURL) PURE; + STDMETHOD(put_BaseURL)(BSTR pbstrBaseURL) PURE; + STDMETHOD(get_DefaultFrame)(BSTR __RPC_FAR *pbstrDefaultFrame) PURE; + STDMETHOD(put_DefaultFrame)(BSTR pbstrDefaultFrame) PURE; + STDMETHOD(get_HasError)(VARIANT_BOOL __RPC_FAR *pHasError) PURE; + STDMETHOD(get_ErrorDescription)(BSTR __RPC_FAR *pbstrErrorDescription) PURE; + STDMETHOD(get_ErrorCode)(long __RPC_FAR *pErrorCode) PURE; + STDMETHOD(get_AnimationAtStart)(VARIANT_BOOL __RPC_FAR *pAnimationAtStart) PURE; + STDMETHOD(put_AnimationAtStart)(VARIANT_BOOL pAnimationAtStart) PURE; + STDMETHOD(get_TransparentAtStart)( VARIANT_BOOL __RPC_FAR *pTransparentAtStart) PURE; + STDMETHOD(put_TransparentAtStart)(VARIANT_BOOL pTransparentAtStart) PURE; + STDMETHOD(get_Volume)(long __RPC_FAR *pVolume) PURE; + STDMETHOD(put_Volume)(long pVolume) PURE; + STDMETHOD(get_Balance)(long __RPC_FAR *pBalance) PURE; + STDMETHOD(put_Balance)(long pBalance) PURE; + STDMETHOD(get_ReadyState)(MPReadyStateConstants __RPC_FAR *pValue) PURE; + STDMETHOD(get_SelectionStart)(double __RPC_FAR *pValue) PURE; + STDMETHOD(put_SelectionStart)(double pValue) PURE; + STDMETHOD(get_SelectionEnd)(double __RPC_FAR *pValue) PURE; + STDMETHOD(put_SelectionEnd)(double pValue) PURE; + STDMETHOD(get_ShowDisplay)(VARIANT_BOOL __RPC_FAR *Show) PURE; + STDMETHOD(put_ShowDisplay)(VARIANT_BOOL Show) PURE; + STDMETHOD(get_ShowControls)(VARIANT_BOOL __RPC_FAR *Show) PURE; + STDMETHOD(put_ShowControls)(VARIANT_BOOL Show) PURE; + STDMETHOD(get_ShowPositionControls)(VARIANT_BOOL __RPC_FAR *Show) PURE; + STDMETHOD(put_ShowPositionControls)(VARIANT_BOOL Show) PURE; + STDMETHOD(get_ShowTracker)(VARIANT_BOOL __RPC_FAR *Show) PURE; + STDMETHOD(put_ShowTracker)(VARIANT_BOOL Show) PURE; + STDMETHOD(get_EnablePositionControls)(VARIANT_BOOL __RPC_FAR *Enable) PURE; + STDMETHOD(put_EnablePositionControls)(VARIANT_BOOL Enable) PURE; + STDMETHOD(get_EnableTracker)(VARIANT_BOOL __RPC_FAR *Enable) PURE; + STDMETHOD(put_EnableTracker)(VARIANT_BOOL Enable) PURE; + STDMETHOD(get_Enabled)(VARIANT_BOOL __RPC_FAR *pEnabled) PURE; + STDMETHOD(put_Enabled)(VARIANT_BOOL pEnabled) PURE; + STDMETHOD(get_DisplayForeColor)(VB_OLE_COLOR __RPC_FAR *ForeColor) PURE; + STDMETHOD(put_DisplayForeColor)(VB_OLE_COLOR ForeColor) PURE; + STDMETHOD(get_DisplayBackColor)(VB_OLE_COLOR __RPC_FAR *BackColor) PURE; + STDMETHOD(put_DisplayBackColor)(VB_OLE_COLOR BackColor) PURE; + STDMETHOD(get_DisplayMode)(MPDisplayModeConstants __RPC_FAR *pValue) PURE; + STDMETHOD(put_DisplayMode)(MPDisplayModeConstants pValue) PURE; + STDMETHOD(get_VideoBorder3D)(VARIANT_BOOL __RPC_FAR *pVideoBorderWidth) PURE; + STDMETHOD(put_VideoBorder3D)(VARIANT_BOOL pVideoBorderWidth) PURE; + STDMETHOD(get_VideoBorderWidth)(long __RPC_FAR *pVideoBorderWidth) PURE; + STDMETHOD(put_VideoBorderWidth)(long pVideoBorderWidth) PURE; + STDMETHOD(get_VideoBorderColor)(VB_OLE_COLOR __RPC_FAR *pVideoBorderWidth) PURE; + STDMETHOD(put_VideoBorderColor)(VB_OLE_COLOR pVideoBorderWidth) PURE; + STDMETHOD(get_ShowGotoBar)(VARIANT_BOOL __RPC_FAR *pbool) PURE; + STDMETHOD(put_ShowGotoBar)(VARIANT_BOOL pbool) PURE; + STDMETHOD(get_ShowStatusBar)(VARIANT_BOOL __RPC_FAR *pbool) PURE; + STDMETHOD(put_ShowStatusBar)(VARIANT_BOOL pbool) PURE; + STDMETHOD(get_ShowCaptioning)(VARIANT_BOOL __RPC_FAR *pbool) PURE; + STDMETHOD(put_ShowCaptioning)(VARIANT_BOOL pbool) PURE; + STDMETHOD(get_ShowAudioControls)(VARIANT_BOOL __RPC_FAR *pbool) PURE; + STDMETHOD(put_ShowAudioControls)(VARIANT_BOOL pbool) PURE; + STDMETHOD(get_CaptioningID)( BSTR __RPC_FAR *pstrText) PURE; + STDMETHOD(put_CaptioningID)(BSTR pstrText) PURE; + STDMETHOD(get_Mute)(VARIANT_BOOL __RPC_FAR *vbool) PURE; + STDMETHOD(put_Mute)(VARIANT_BOOL vbool) PURE; + STDMETHOD(get_CanPreview)(VARIANT_BOOL __RPC_FAR *pCanPreview) PURE; + STDMETHOD(get_PreviewMode)(VARIANT_BOOL __RPC_FAR *pPreviewMode) PURE; + STDMETHOD(put_PreviewMode)(VARIANT_BOOL pPreviewMode) PURE; + STDMETHOD(get_HasMultipleItems)(VARIANT_BOOL __RPC_FAR *pHasMuliItems) PURE; + STDMETHOD(get_Language)(long __RPC_FAR *pLanguage) PURE; + STDMETHOD(put_Language)(long pLanguage) PURE; + STDMETHOD(get_AudioStream)(long __RPC_FAR *pStream) PURE; + STDMETHOD(put_AudioStream)(long pStream) PURE; + STDMETHOD(get_SAMIStyle)(BSTR __RPC_FAR *pbstrStyle) PURE; + STDMETHOD(put_SAMIStyle)(BSTR pbstrStyle) PURE; + STDMETHOD(get_SAMILang)(BSTR __RPC_FAR *pbstrLang) PURE; + STDMETHOD(put_SAMILang)(BSTR pbstrLang) PURE; + STDMETHOD(get_SAMIFileName)(BSTR __RPC_FAR *pbstrFileName) PURE; + STDMETHOD(put_SAMIFileName)(BSTR pbstrFileName) PURE; + STDMETHOD(get_StreamCount)( long __RPC_FAR *pStreamCount) PURE; + STDMETHOD(get_ClientId)(BSTR __RPC_FAR *pbstrClientId) PURE; + STDMETHOD(get_ConnectionSpeed)(long __RPC_FAR *plConnectionSpeed) PURE; + STDMETHOD(get_AutoSize)(VARIANT_BOOL __RPC_FAR *pbool) PURE; + STDMETHOD(put_AutoSize)(VARIANT_BOOL pbool) PURE; + STDMETHOD(get_EnableFullScreenControls)(VARIANT_BOOL __RPC_FAR *pbVal) PURE; + STDMETHOD(put_EnableFullScreenControls)(VARIANT_BOOL pbVal) PURE; + STDMETHOD(get_ActiveMovie)(IDispatch __RPC_FAR *__RPC_FAR *ppdispatch) PURE; + STDMETHOD(get_NSPlay)(IDispatch __RPC_FAR *__RPC_FAR *ppdispatch) PURE; + STDMETHOD(get_WindowlessVideo)(VARIANT_BOOL __RPC_FAR *pbool) PURE; + STDMETHOD(put_WindowlessVideo)(VARIANT_BOOL pbool) PURE; + STDMETHOD(Play)(void) PURE; + STDMETHOD(Stop)(void) PURE; + STDMETHOD(Pause)(void) PURE; + STDMETHOD(GetMarkerTime)(long MarkerNum, + double __RPC_FAR *pMarkerTime) PURE; + STDMETHOD(GetMarkerName)(long MarkerNum, + BSTR __RPC_FAR *pbstrMarkerName) PURE; + STDMETHOD(AboutBox)(void) PURE; + STDMETHOD(GetCodecInstalled)(long CodecNum, + VARIANT_BOOL __RPC_FAR *pCodecInstalled) PURE; + STDMETHOD(GetCodecDescription)(long CodecNum, + BSTR __RPC_FAR *pbstrCodecDescription) PURE; + STDMETHOD(GetCodecURL)(long CodecNum, + BSTR __RPC_FAR *pbstrCodecURL) PURE; + STDMETHOD(GetMoreInfoURL)(MPMoreInfoType MoreInfoType, + BSTR __RPC_FAR *pbstrMoreInfoURL) PURE; + STDMETHOD(GetMediaInfoString)(MPMediaInfoType MediaInfoType, + BSTR __RPC_FAR *pbstrMediaInfo) PURE; + STDMETHOD(Cancel)(void) PURE; + STDMETHOD(Open)(BSTR bstrFileName) PURE; + STDMETHOD(IsSoundCardEnabled)(VARIANT_BOOL __RPC_FAR *pbSoundCard) PURE; + STDMETHOD(Next)(void) PURE; + STDMETHOD(Previous)(void) PURE; + STDMETHOD(StreamSelect)(long StreamNum) PURE; + STDMETHOD(FastForward)(void) PURE; + STDMETHOD(FastReverse)(void) PURE; + STDMETHOD(GetStreamName)(long StreamNum, + BSTR __RPC_FAR *pbstrStreamName) PURE; + STDMETHOD(GetStreamGroup)(long StreamNum, + long __RPC_FAR *pStreamGroup) PURE; + STDMETHOD(GetStreamSelected)(long StreamNum, VARIANT_BOOL __RPC_FAR *pStreamSelected) PURE; +}; + +struct IMediaPlayer2 : public IMediaPlayer +{ + STDMETHOD(get_DVD)(struct IMediaPlayerDvd __RPC_FAR *__RPC_FAR *ppdispatch) PURE; + STDMETHOD(GetMediaParameter)(long EntryNum, BSTR bstrParameterName, BSTR __RPC_FAR *pbstrParameterValue) PURE; + STDMETHOD(GetMediaParameterName(long EntryNum, long Index, BSTR __RPC_FAR *pbstrParameterName) PURE; + STDMETHOD(get_EntryCount)(long __RPC_FAR *pNumberEntries) PURE; + STDMETHOD(GetCurrentEntry)(long __RPC_FAR *pEntryNumber) PURE; + STDMETHOD(SetCurrentEntry)(long EntryNumber) PURE; + STDMETHOD(ShowDialog)(MPShowDialogConstants mpDialogIndex) PURE; +}; + +//--------------------------------------------------------------------------- +// NETSHOW COM INTERFACES (dumped from nscompat.idl from MSVC COM Browser) +//--------------------------------------------------------------------------- + +struct INSOPlay : public IDispatch +{ + STDMETHOD(get_ImageSourceWidth)(long __RPC_FAR *pWidth) PURE; + STDMETHOD(get_ImageSourceHeight)(long __RPC_FAR *pHeight) PURE; + STDMETHOD(get_Duration)(double __RPC_FAR *pDuration) PURE; + STDMETHOD(get_Author)(BSTR __RPC_FAR *pbstrAuthor) PURE; + STDMETHOD(get_Copyright)(BSTR __RPC_FAR *pbstrCopyright) PURE; + STDMETHOD(get_Description)(BSTR __RPC_FAR *pbstrDescription) PURE; + STDMETHOD(get_Rating)(BSTR __RPC_FAR *pbstrRating) PURE; + STDMETHOD(get_Title)(BSTR __RPC_FAR *pbstrTitle) PURE; + STDMETHOD(get_SourceLink)(BSTR __RPC_FAR *pbstrSourceLink) PURE; + STDMETHOD(get_MarkerCount)(long __RPC_FAR *pMarkerCount) PURE; + STDMETHOD(get_CanScan)(VARIANT_BOOL __RPC_FAR *pCanScan) PURE; + STDMETHOD(get_CanSeek)(VARIANT_BOOL __RPC_FAR *pCanSeek) PURE; + STDMETHOD(get_CanSeekToMarkers)(VARIANT_BOOL __RPC_FAR *pCanSeekToMarkers) PURE; + STDMETHOD(get_CreationDate)(DATE __RPC_FAR *pCreationDate) PURE; + STDMETHOD(get_Bandwidth)(long __RPC_FAR *pBandwidth) PURE; + STDMETHOD(get_ErrorCorrection)(BSTR __RPC_FAR *pbstrErrorCorrection) PURE; + STDMETHOD(get_AutoStart)(VARIANT_BOOL __RPC_FAR *pAutoStart) PURE; + STDMETHOD(put_AutoStart)(VARIANT_BOOL pAutoStart) PURE; + STDMETHOD(get_AutoRewind)(VARIANT_BOOL __RPC_FAR *pAutoRewind) PURE; + STDMETHOD(put_AutoRewind)(VARIANT_BOOL pAutoRewind) PURE; + STDMETHOD(get_AllowChangeControlType)(VARIANT_BOOL __RPC_FAR *pAllowChangeControlType) PURE; + STDMETHOD(put_AllowChangeControlType)(VARIANT_BOOL pAllowChangeControlType) PURE; + STDMETHOD(get_InvokeURLs)(VARIANT_BOOL __RPC_FAR *pInvokeURLs) PURE; + STDMETHOD(put_InvokeURLs)(VARIANT_BOOL pInvokeURLs) PURE; + STDMETHOD(get_EnableContextMenu)(VARIANT_BOOL __RPC_FAR *pEnableContextMenu) PURE; + STDMETHOD(put_EnableContextMenu)(VARIANT_BOOL pEnableContextMenu) PURE; + STDMETHOD(get_TransparentAtStart)(VARIANT_BOOL __RPC_FAR *pTransparentAtStart) PURE; + STDMETHOD(put_TransparentAtStart)(VARIANT_BOOL pTransparentAtStart) PURE; + STDMETHOD(get_TransparentOnStop)(VARIANT_BOOL __RPC_FAR *pTransparentOnStop) PURE; + STDMETHOD(put_TransparentOnStop)(VARIANT_BOOL pTransparentOnStop) PURE; + STDMETHOD(get_ClickToPlay)(VARIANT_BOOL __RPC_FAR *pClickToPlay) PURE; + STDMETHOD(put_ClickToPlay)(VARIANT_BOOL pClickToPlay) PURE; + STDMETHOD(get_FileName)(BSTR __RPC_FAR *pbstrFileName) PURE; + STDMETHOD(put_FileName)(BSTR pbstrFileName) PURE; + STDMETHOD(get_CurrentPosition)(double __RPC_FAR *pCurrentPosition) PURE; + STDMETHOD(put_CurrentPosition)(double pCurrentPosition) PURE; + STDMETHOD(get_Rate)(double __RPC_FAR *pRate) PURE; + STDMETHOD(put_Rate)(double pRate) PURE; + STDMETHOD(get_CurrentMarker)(long __RPC_FAR *pCurrentMarker) PURE; + STDMETHOD(put_CurrentMarker)(long pCurrentMarker) PURE; + STDMETHOD(get_PlayCount)(long __RPC_FAR *pPlayCount) PURE; + STDMETHOD(put_PlayCount)(long pPlayCount) PURE; + STDMETHOD(get_CurrentState)(long __RPC_FAR *pCurrentState) PURE; + STDMETHOD(get_DisplaySize)(long __RPC_FAR *pDisplaySize) PURE; + STDMETHOD(put_DisplaySize)(long pDisplaySize) PURE; + STDMETHOD(get_MainWindow)(long __RPC_FAR *pMainWindow) PURE; + STDMETHOD(get_ControlType)(long __RPC_FAR *pControlType) PURE; + STDMETHOD(put_ControlType)(long pControlType) PURE; + STDMETHOD(get_AllowScan)(VARIANT_BOOL __RPC_FAR *pAllowScan) PURE; + STDMETHOD(put_AllowScan)(VARIANT_BOOL pAllowScan) PURE; + STDMETHOD(get_SendKeyboardEvents)(VARIANT_BOOL __RPC_FAR *pSendKeyboardEvents) PURE; + STDMETHOD(put_SendKeyboardEvents)(VARIANT_BOOL pSendKeyboardEvents) PURE; + STDMETHOD(get_SendMouseClickEvents)(VARIANT_BOOL __RPC_FAR *pSendMouseClickEvents) PURE; + STDMETHOD(put_SendMouseClickEvents)(VARIANT_BOOL pSendMouseClickEvents) PURE; + STDMETHOD(get_SendMouseMoveEvents)(VARIANT_BOOL __RPC_FAR *pSendMouseMoveEvents) PURE; + STDMETHOD(put_SendMouseMoveEvents)(VARIANT_BOOL pSendMouseMoveEvents) PURE; + STDMETHOD(get_SendStateChangeEvents)(VARIANT_BOOL __RPC_FAR *pSendStateChangeEvents) PURE; + STDMETHOD(put_SendStateChangeEvents)(VARIANT_BOOL pSendStateChangeEvents) PURE; + STDMETHOD(get_ReceivedPackets)(long __RPC_FAR *pReceivedPackets) PURE; + STDMETHOD(get_RecoveredPackets)(long __RPC_FAR *pRecoveredPackets) PURE; + STDMETHOD(get_LostPackets)(long __RPC_FAR *pLostPackets) PURE; + STDMETHOD(get_ReceptionQuality)(long __RPC_FAR *pReceptionQuality) PURE; + STDMETHOD(get_BufferingCount)(long __RPC_FAR *pBufferingCount) PURE; + STDMETHOD(get_CursorType)(long __RPC_FAR *pCursorType) PURE; + STDMETHOD(put_CursorType)(long pCursorType) PURE; + STDMETHOD(get_AnimationAtStart)(VARIANT_BOOL __RPC_FAR *pAnimationAtStart) PURE; + STDMETHOD(put_AnimationAtStart)(VARIANT_BOOL pAnimationAtStart) PURE; + STDMETHOD(get_AnimationOnStop)(VARIANT_BOOL __RPC_FAR *pAnimationOnStop) PURE; + STDMETHOD(put_AnimationOnStop)(VARIANT_BOOL pAnimationOnStop) PURE; + STDMETHOD(Play)(void) PURE; + STDMETHOD(Pause)(void) PURE; + STDMETHOD(Stop)(void) PURE; + STDMETHOD(GetMarkerTime)(long MarkerNum, double __RPC_FAR *pMarkerTime) PURE; + STDMETHOD(GetMarkerName)(long MarkerNum, BSTR __RPC_FAR *pbstrMarkerName) PURE; +}; + +struct INSPlay : public INSOPlay +{ + STDMETHOD(get_ChannelName)(BSTR __RPC_FAR *pbstrChannelName) PURE; + STDMETHOD(get_ChannelDescription)(BSTR __RPC_FAR *pbstrChannelDescription) PURE; + STDMETHOD(get_ChannelURL)(BSTR __RPC_FAR *pbstrChannelURL) PURE; + STDMETHOD(get_ContactAddress)(BSTR __RPC_FAR *pbstrContactAddress) PURE; + STDMETHOD(get_ContactPhone)(BSTR __RPC_FAR *pbstrContactPhone) PURE; + STDMETHOD(get_ContactEmail)(BSTR __RPC_FAR *pbstrContactEmail) PURE; + STDMETHOD(get_AllowChangeDisplaySize)(VARIANT_BOOL __RPC_FAR *pAllowChangeDisplaySize) PURE; + STDMETHOD(put_AllowChangeDisplaySize)(VARIANT_BOOL pAllowChangeDisplaySize) PURE; + STDMETHOD(get_CodecCount)(long __RPC_FAR *pCodecCount) PURE; + STDMETHOD(get_IsBroadcast)(VARIANT_BOOL __RPC_FAR *pIsBroadcast) PURE; + STDMETHOD(get_IsDurationValid)(VARIANT_BOOL __RPC_FAR *pIsDurationValid) PURE; + STDMETHOD(get_SourceProtocol)(long __RPC_FAR *pSourceProtocol) PURE; + STDMETHOD(get_OpenState)(long __RPC_FAR *pOpenState) PURE; + STDMETHOD(get_SendOpenStateChangeEvents)(VARIANT_BOOL __RPC_FAR *pSendOpenStateChangeEvents) PURE; + STDMETHOD(put_SendOpenStateChangeEvents)(VARIANT_BOOL pSendOpenStateChangeEvents) PURE; + STDMETHOD(get_SendWarningEvents)(VARIANT_BOOL __RPC_FAR *pSendWarningEvents) PURE; + STDMETHOD(put_SendWarningEvents)(VARIANT_BOOL pSendWarningEvents) PURE; + STDMETHOD(get_SendErrorEvents)(VARIANT_BOOL __RPC_FAR *pSendErrorEvents) PURE; + STDMETHOD(put_SendErrorEvents)(VARIANT_BOOL pSendErrorEvents) PURE; + STDMETHOD(get_HasError)(VARIANT_BOOL __RPC_FAR *pHasError) PURE; + STDMETHOD(get_ErrorDescription)(BSTR __RPC_FAR *pbstrErrorDescription) PURE; + STDMETHOD(get_ErrorCode)(long __RPC_FAR *pErrorCode) PURE; + STDMETHOD(get_PlayState)(long __RPC_FAR *pPlayState) PURE; + STDMETHOD(get_SendPlayStateChangeEvents)(VARIANT_BOOL __RPC_FAR *pSendPlayStateChangeEvents) PURE; + STDMETHOD(put_SendPlayStateChangeEvents)(VARIANT_BOOL pSendPlayStateChangeEvents) PURE; + STDMETHOD(get_BufferingTime)(double __RPC_FAR *pBufferingTime) PURE; + STDMETHOD(put_BufferingTime)(double pBufferingTime) PURE; + STDMETHOD(get_UseFixedUDPPort)(VARIANT_BOOL __RPC_FAR *pUseFixedUDPPort) PURE; + STDMETHOD(put_UseFixedUDPPort)(VARIANT_BOOL pUseFixedUDPPort) PURE; + STDMETHOD(get_FixedUDPPort)(long __RPC_FAR *pFixedUDPPort) PURE; + STDMETHOD(put_FixedUDPPort)(long pFixedUDPPort) PURE; + STDMETHOD(get_UseHTTPProxy)(VARIANT_BOOL __RPC_FAR *pUseHTTPProxy) PURE; + STDMETHOD(put_UseHTTPProxy)(VARIANT_BOOL pUseHTTPProxy) PURE; + STDMETHOD(get_EnableAutoProxy)(VARIANT_BOOL __RPC_FAR *pEnableAutoProxy) PURE; + STDMETHOD(put_EnableAutoProxy)(VARIANT_BOOL pEnableAutoProxy) PURE; + STDMETHOD(get_HTTPProxyHost)(BSTR __RPC_FAR *pbstrHTTPProxyHost) PURE; + STDMETHOD(put_HTTPProxyHost)(BSTR pbstrHTTPProxyHost) PURE; + STDMETHOD(get_HTTPProxyPort)(long __RPC_FAR *pHTTPProxyPort) PURE; + STDMETHOD(put_HTTPProxyPort)(long pHTTPProxyPort) PURE; + STDMETHOD(get_EnableMulticast)(VARIANT_BOOL __RPC_FAR *pEnableMulticast) PURE; + STDMETHOD(put_EnableMulticast)(VARIANT_BOOL pEnableMulticast) PURE; + STDMETHOD(get_EnableUDP)(VARIANT_BOOL __RPC_FAR *pEnableUDP) PURE; + STDMETHOD(put_EnableUDP)(VARIANT_BOOL pEnableUDP) PURE; + STDMETHOD(get_EnableTCP)(VARIANT_BOOL __RPC_FAR *pEnableTCP) PURE; + STDMETHOD(put_EnableTCP)(VARIANT_BOOL pEnableTCP) PURE; + STDMETHOD(get_EnableHTTP)(VARIANT_BOOL __RPC_FAR *pEnableHTTP) PURE; + STDMETHOD(put_EnableHTTP)(VARIANT_BOOL pEnableHTTP) PURE; + STDMETHOD(get_BufferingProgress)(long __RPC_FAR *pBufferingProgress) PURE; + STDMETHOD(get_BaseURL)(BSTR __RPC_FAR *pbstrBaseURL) PURE; + STDMETHOD(put_BaseURL)(BSTR pbstrBaseURL) PURE; + STDMETHOD(get_DefaultFrame)(BSTR __RPC_FAR *pbstrDefaultFrame) PURE; + STDMETHOD(put_DefaultFrame)(BSTR pbstrDefaultFrame) PURE; + STDMETHOD(AboutBox))(void) PURE; + STDMETHOD(Cancel)(void) PURE; + STDMETHOD(GetCodecInstalled)(long CodecNum, VARIANT_BOOL __RPC_FAR *pCodecInstalled) PURE; + STDMETHOD(GetCodecDescription)(long CodecNum, BSTR __RPC_FAR *pbstrCodecDescription) PURE; + STDMETHOD(GetCodecURL)(long CodecNum, BSTR __RPC_FAR *pbstrCodecURL) PURE; + STDMETHOD(Open)(BSTR bstrFileName) PURE; +}; + + +struct INSPlay1 : public INSPlay +{ + STDMETHOD(get_MediaPlayer)(IDispatch __RPC_FAR *__RPC_FAR *ppdispatch) PURE; +}; + +//--------------------------------------------------------------------------- +// IWMP (PocketPC 2000) COM INTERFACES (dumped from PlayerOCX.idl) +//--------------------------------------------------------------------------- + +#ifdef __WXWINCE__ + +struct IWMP : public IDispatch +{ +public: + virtual /* [id][propput] */ HRESULT STDMETHODCALLTYPE put_AutoSize( + /* [in] */ VARIANT_BOOL vbool) = 0; + + virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_AutoSize( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbool) = 0; + + virtual /* [id][propput] */ HRESULT STDMETHODCALLTYPE put_BorderStyle( + /* [in] */ long style) = 0; + + virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_BorderStyle( + /* [retval][out] */ long __RPC_FAR *pstyle) = 0; + + virtual /* [id][propput] */ HRESULT STDMETHODCALLTYPE put_Enabled( + /* [in] */ VARIANT_BOOL vbool) = 0; + + virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_Enabled( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbool) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_FileName( + /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_FileName( + /* [in] */ BSTR newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Volume( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Volume( + /* [in] */ long newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Mute( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Mute( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_AutoStart( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_AutoStart( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_PlayCount( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_PlayCount( + /* [in] */ long newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ShowStatusBar( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ShowStatusBar( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ShowAudioControls( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ShowAudioControls( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ShowCaptioning( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ShowCaptioning( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ShowControls( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ShowControls( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ShowDisplay( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ShowDisplay( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ShowGotoBar( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ShowGotoBar( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ShowPositionControls( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ShowPositionControls( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ShowTracker( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ShowTracker( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Startup( void) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Shutdown( void) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Bandwidth( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_BaseURL( + /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_BaseURL( + /* [in] */ BSTR pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_BufferingCount( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_BufferingProgress( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_BufferingTime( + /* [retval][out] */ double __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CanSeek( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CanSeekToMarkers( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ChannelDescription( + /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ChannelName( + /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ChannelURL( + /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ClientID( + /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ConnectionSpeed( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ContactAddress( + /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ContactEmail( + /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ContactPhone( + /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CurrentMarker( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_CurrentMarker( + /* [in] */ long newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CurrentPosition( + /* [retval][out] */ double __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_CurrentPosition( + /* [in] */ double newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_DefaultFrame( + /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_DefaultFrame( + /* [in] */ BSTR newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Duration( + /* [retval][out] */ double __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_EntryCount( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ErrorCode( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ErrorDescription( + /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_HasError( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_HasMultipleItems( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ImageSourceHeight( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ImageSourceWidth( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_InvokeURLs( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_InvokeURLs( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_IsBroadcast( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_IsDurationValid( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_LostPackets( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MarkerCount( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_OpenState( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_PlayState( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_PreviewMode( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_PreviewMode( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ReadyState( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ReceivedPackets( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ReceptionQuality( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_RecoveredPackets( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SAMIFileName( + /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SAMIFileName( + /* [in] */ BSTR newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SAMILang( + /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SAMILang( + /* [in] */ BSTR newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SAMIStyle( + /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SAMIStyle( + /* [in] */ BSTR newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SelectionEnd( + /* [retval][out] */ double __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SelectionEnd( + /* [in] */ double newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SelectionStart( + /* [retval][out] */ double __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SelectionStart( + /* [in] */ double newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SendErrorEvents( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SendErrorEvents( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SendKeyboardEvents( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SendKeyboardEvents( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SendMouseClickEvents( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SendMouseClickEvents( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SendMouseMoveEvents( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SendMouseMoveEvents( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SendOpenStateChangeEvents( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SendOpenStateChangeEvents( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SendPlayStateChangeEvents( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SendPlayStateChangeEvents( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SendWarningEvents( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SendWarningEvents( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SourceLink( + /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE AboutBox( void) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Cancel( void) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetCodecDescription( + /* [in] */ long nCodec, + /* [retval][out] */ BSTR __RPC_FAR *pDescription) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetCodecInstalled( + /* [in] */ BSTR __RPC_FAR *pstrCodec, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pIsInstalled) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetCurrentEntry( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetMarkerName( + /* [in] */ long nMarker, + /* [retval][out] */ BSTR __RPC_FAR *pMarkerName) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetMarkerTime( + /* [in] */ long nMarker, + /* [retval][out] */ double __RPC_FAR *pMarkerTime) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetMediaInfoString( + /* [in] */ long MPMediaInfoType, + /* [retval][out] */ BSTR __RPC_FAR *pstrMediaInfo) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Next( void) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Open( + BSTR pstrClip) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Pause( void) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Play( void) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Previous( void) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Stop( void) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Rate( + /* [retval][out] */ double __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Rate( + /* [in] */ double newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_DisplaySize( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_DisplaySize( + /* [in] */ long newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SourceProtocol( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ErrorCorrection( + /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE FinalConstruct( void) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_AllowChangeDisplaySize( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_AllowChangeDisplaySize( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_AllowScan( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_AllowScan( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_AnimationAtStart( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_AnimationAtStart( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_AudioStream( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_AudioStream( + /* [in] */ long newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_AutoRewind( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_AutoRewind( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Balance( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Balance( + /* [in] */ long newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CanPreview( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CanScan( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CaptioningID( + /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ClickToPlay( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ClickToPlay( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CodecCount( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CreationDate( + /* [retval][out] */ DATE __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CursorType( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_CursorType( + /* [in] */ long newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_DisplayBackColor( + /* [retval][out] */ VB_OLE_COLOR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_DisplayBackColor( + /* [in] */ VB_OLE_COLOR newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_DisplayForeColor( + /* [retval][out] */ VB_OLE_COLOR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_DisplayForeColor( + /* [in] */ VB_OLE_COLOR newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_DisplayMode( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_DisplayMode( + /* [in] */ long newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_EnableContextMenu( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_EnableContextMenu( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_EnableFullScreenControls( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_EnableFullScreenControls( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_EnablePositionControls( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_EnablePositionControls( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_EnableTracker( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_EnableTracker( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Language( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_StreamCount( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_TransparentAtStart( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_TransparentAtStart( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_VideoBorder3D( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_VideoBorder3D( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_VideoBorderColor( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_VideoBorderColor( + /* [in] */ long newVal) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_VideoBorderWidth( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_VideoBorderWidth( + /* [in] */ long newVal) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE FastForward( void) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE FastReverse( void) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetCodecURL( + /* [retval][out] */ BSTR __RPC_FAR *pstrCodecURL) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetMediaParameter( + /* [in] */ long nParam, + BSTR szParameterName, + /* [retval][out] */ BSTR __RPC_FAR *pstrParameterValue) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetMediaParameterName( + /* [in] */ long nParam, + long nIndex, + /* [retval][out] */ BSTR __RPC_FAR *pstrParameterName) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetMoreInfoURL( + /* [retval][out] */ BSTR __RPC_FAR *pstrMoreInfoURL) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetStreamGroup( + /* [retval][out] */ BSTR __RPC_FAR *pstrStreamGroup) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetStreamName( + /* [retval][out] */ BSTR __RPC_FAR *pstrStreamName) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetStreamSelected( + /* [in] */ long nStream, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *fIsSelected) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IsSoundCardEnabled( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *fIsEnabled) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE SetCurrentEntry( + long nValue) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ShowDialog( + long nValue) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE StreamSelect( + long nSelect) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE OnWindowMessage( + UINT msg, + WPARAM wParam, + LPARAM lParam, + LRESULT __RPC_FAR *plResult) = 0; + +}; + + +#endif // CE + +//--------------------------------------------------------------------------- +// MISC COM INTERFACES +//--------------------------------------------------------------------------- +typedef enum _FilterState +{ + State_Stopped, + State_Paused, + State_Running +} FILTER_STATE; +typedef enum _PinDirection { + PINDIR_INPUT, + PINDIR_OUTPUT +} PIN_DIRECTION; + +typedef struct _FilterInfo { + WCHAR achName[128]; + struct IFilterGraph *pGraph; +} FILTER_INFO; + +typedef struct _PinInfo { + struct IBaseFilter *pFilter; + PIN_DIRECTION dir; + WCHAR achName[128]; +} PIN_INFO; + +struct IBaseFilter; +struct IPin; +struct IEnumFilters; +typedef struct _MediaType { + GUID majortype; + GUID subtype; + BOOL bFixedSizeSamples; + BOOL bTemporalCompression; + ULONG lSampleSize; + GUID formattype; + IUnknown *pUnk; + ULONG cbFormat; + BYTE *pbFormat; +} AM_MEDIA_TYPE; + +struct IFilterGraph : public IUnknown +{ + STDMETHOD(AddFilter)(IBaseFilter *, LPCWSTR) PURE; + STDMETHOD(RemoveFilter)(IBaseFilter *) PURE; + STDMETHOD(EnumFilters)(IEnumFilters **) PURE; + STDMETHOD(FindFilterByName)(LPCWSTR, IBaseFilter **) PURE; + STDMETHOD(ConnectDirect)(IPin *, IPin *, const AM_MEDIA_TYPE *) PURE; + STDMETHOD(Reconnect)(IPin *) PURE; + STDMETHOD(Disconnect)(IPin *) PURE; + STDMETHOD(SetDefaultSyncSource)() PURE; +}; + +struct IGraphBuilder : public IFilterGraph +{ + STDMETHOD(Connect)(IPin *, IPin *) PURE; + STDMETHOD(Render)(IPin *) PURE; + STDMETHOD(RenderFile)(LPCWSTR, LPCWSTR) PURE; + STDMETHOD(AddSourceFilter)(LPCWSTR, LPCWSTR, IBaseFilter **) PURE; + STDMETHOD(SetLogFile)(DWORD_PTR) PURE; + STDMETHOD(Abort)() PURE; + STDMETHOD(ShouldOperationContinue)() PURE; +}; + +struct IReferenceClock; +struct IEnumPins; +#define REFERENCE_TIME LONGLONG +struct IMediaFilter : public IPersist +{ + STDMETHOD(Stop)( void) PURE; + STDMETHOD(Pause)( void) PURE; + STDMETHOD(Run)(REFERENCE_TIME tStart) PURE; + STDMETHOD(GetState)(DWORD dwMilliSecsTimeout, + FILTER_STATE *State) PURE; + STDMETHOD(SetSyncSource)(IReferenceClock *pClock) PURE; + STDMETHOD(GetSyncSource)(IReferenceClock **pClock) PURE; +}; + +struct IBaseFilter : public IMediaFilter +{ + STDMETHOD(EnumPins)(IEnumPins **ppEnum) PURE; + STDMETHOD(FindPin)(LPCWSTR Id, IPin **ppPin) PURE; + STDMETHOD(QueryFilterInfo)(FILTER_INFO *pInfo) PURE; + STDMETHOD(JoinFilterGraph)(IFilterGraph *pGraph, LPCWSTR pName) PURE; + STDMETHOD(QueryVendorInfo)(LPWSTR *pVendorInfo) PURE; +}; + + + +//--------------------------------------------------------------------------- +// wxMCIMediaBackend +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// MCI Includes +//--------------------------------------------------------------------------- +#ifndef __WXWINCE__ +#include + +class WXDLLIMPEXP_MEDIA wxMCIMediaBackend : public wxMediaBackendCommonBase +{ +public: + wxMCIMediaBackend(); + virtual ~wxMCIMediaBackend(); + + virtual bool CreateControl(wxControl* ctrl, wxWindow* parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name); + + virtual bool Play(); + virtual bool Pause(); + virtual bool Stop(); + + virtual bool Load(const wxURI& location, + const wxURI& proxy) + { return wxMediaBackend::Load(location, proxy); } + + virtual bool Load(const wxString& fileName); + virtual bool Load(const wxURI& location); + + virtual wxMediaState GetState(); + + virtual bool SetPosition(wxLongLong where); + virtual wxLongLong GetPosition(); + virtual wxLongLong GetDuration(); + + virtual void Move(int x, int y, int w, int h); + wxSize GetVideoSize() const; + + virtual double GetPlaybackRate(); + virtual bool SetPlaybackRate(double dRate); + + virtual double GetVolume(); + virtual bool SetVolume(double); + + static LRESULT CALLBACK NotifyWndProc(HWND hWnd, UINT nMsg, + WPARAM wParam, LPARAM lParam); + + LRESULT CALLBACK OnNotifyWndProc(HWND hWnd, UINT nMsg, + WPARAM wParam, LPARAM lParam); + + MCIDEVICEID m_hDev; //Our MCI Device ID/Handler + HWND m_hNotifyWnd; //Window to use for MCI events + bool m_bVideo; //Whether or not we have video + + DECLARE_DYNAMIC_CLASS(wxMCIMediaBackend) +}; +#endif + + + +//--------------------------------------------------------------------------- +// wxMCIMediaBackend +//--------------------------------------------------------------------------- + +#ifndef __WXWINCE__ +IMPLEMENT_DYNAMIC_CLASS(wxMCIMediaBackend, wxMediaBackend) + +//--------------------------------------------------------------------------- +// Usual debugging macros for MCI returns +//--------------------------------------------------------------------------- + +#ifdef __WXDEBUG__ +#define wxMCIVERIFY(arg) \ +{ \ + DWORD nRet; \ + if ( (nRet = (arg)) != 0) \ + { \ + TCHAR sz[5000]; \ + mciGetErrorString(nRet, sz, 5000); \ + wxFAIL_MSG(wxString::Format(_T("MCI Error:%s"), sz)); \ + } \ +} +#else +#define wxMCIVERIFY(arg) (arg); +#endif + +//--------------------------------------------------------------------------- +// Simulation for +// +// Mingw and possibly other compilers don't have the digitalv.h header +// that is needed to have some essential features of mci work with +// windows - so we provide the declarations for the types we use here +//--------------------------------------------------------------------------- + +typedef struct +{ + DWORD_PTR dwCallback; +#ifdef MCI_USE_OFFEXT + POINT ptOffset; + POINT ptExtent; +#else + RECT rc; +#endif +} +MCI_DGV_RECT_PARMS; + +typedef struct +{ + DWORD_PTR dwCallback; + HWND hWnd; +#ifndef _WIN32 + WORD wReserved1; +#endif + UINT nCmdShow; +#ifndef _WIN32 + WORD wReserved2; +#endif + wxChar* lpstrText; +} +MCI_DGV_WINDOW_PARMS; + +typedef struct +{ + DWORD_PTR dwCallback; + DWORD dwTimeFormat; + DWORD dwAudio; + DWORD dwFileFormat; + DWORD dwSpeed; +} +MCI_DGV_SET_PARMS; + +typedef struct +{ + DWORD_PTR dwCallback; + DWORD dwItem; + DWORD dwValue; + DWORD dwOver; + wxChar* lpstrAlgorithm; + wxChar* lpstrQuality; +} +MCI_DGV_SETAUDIO_PARMS; + +//--------------------------------------------------------------------------- +// wxMCIMediaBackend Constructor +// +// Here we don't need to do much except say we don't have any video :) +//--------------------------------------------------------------------------- +wxMCIMediaBackend::wxMCIMediaBackend() : m_hNotifyWnd(NULL), m_bVideo(false) +{ +} + +//--------------------------------------------------------------------------- +// wxMCIMediaBackend Destructor +// +// We close the MCI device - note that there may not be an MCI device here, +// or it may fail - but we don't really care, since we're destructing +//--------------------------------------------------------------------------- +wxMCIMediaBackend::~wxMCIMediaBackend() +{ + if (m_hNotifyWnd) + { + mciSendCommand(m_hDev, MCI_CLOSE, 0, 0); + DestroyWindow(m_hNotifyWnd); + m_hNotifyWnd = NULL; + } +} + +//--------------------------------------------------------------------------- +// wxMCIMediaBackend::Create +// +// Here we just tell wxMediaCtrl that MCI does exist (which it does, on all +// msw systems, at least in some form dating back to win16 days) +//--------------------------------------------------------------------------- +bool wxMCIMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name) +{ + // Create window + // By default wxWindow(s) is created with a border - + // so we need to get rid of those, and create with + // wxCLIP_CHILDREN, so that if the driver/backend + // is a child window, it refereshes properly + if ( !ctrl->wxControl::Create(parent, id, pos, size, + (style & ~wxBORDER_MASK) | wxBORDER_NONE | wxCLIP_CHILDREN, + validator, name) ) + return false; + + m_ctrl = wxStaticCast(ctrl, wxMediaCtrl); + + return true; +} + +//--------------------------------------------------------------------------- +// wxMCIMediaBackend::Load (file version) +// +// Here we have MCI load a file and device, set the time format to our +// default (milliseconds), and set the video (if any) to play in the control +//--------------------------------------------------------------------------- +bool wxMCIMediaBackend::Load(const wxString& fileName) +{ + // if the user already called load close the previous MCI device + if (m_hNotifyWnd) + { + mciSendCommand(m_hDev, MCI_CLOSE, 0, 0); + DestroyWindow(m_hNotifyWnd); + m_hNotifyWnd = NULL; + } + + // Opens a file and has MCI select a device. Normally you'd put + // MCI_OPEN_TYPE in addition to MCI_OPEN_ELEMENT - however if you + // omit this it tells MCI to select the device instead. This is good + // because we have no reliable way of "enumerating" the devices in MCI + MCI_OPEN_PARMS openParms; + openParms.lpstrElementName = (wxChar*) fileName.c_str(); + + if (mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, + (DWORD)(LPVOID)&openParms) != 0) + { + return false; + } + + m_hDev = openParms.wDeviceID; + + // set the time format for the device to milliseconds + MCI_SET_PARMS setParms; + setParms.dwCallback = 0; + setParms.dwTimeFormat = MCI_FORMAT_MILLISECONDS; + + if (mciSendCommand(m_hDev, MCI_SET, MCI_SET_TIME_FORMAT, + (DWORD)(LPVOID)&setParms) != 0) + { + return false; + } + + // tell the MCI device to display the video in our wxMediaCtrl + MCI_DGV_WINDOW_PARMS windowParms; + windowParms.hWnd = (HWND)m_ctrl->GetHandle(); + + m_bVideo = (mciSendCommand(m_hDev, MCI_WINDOW, + 0x00010000L, // MCI_DGV_WINDOW_HWND + (DWORD)(LPVOID)&windowParms) == 0); + + // Create a hidden window and register to handle MCI events + // Note that wxCanvasClassName is already registered + // and used by all wxWindows and normal wxControls + m_hNotifyWnd = ::CreateWindow( + wxCanvasClassName, + NULL, + 0, 0, 0, 0, + 0, + (HWND) NULL, + (HMENU)NULL, + wxGetInstance(), + (LPVOID)NULL ); + + if (!m_hNotifyWnd) + { + wxLogSysError( wxT("Could not create hidden needed for ") + wxT("registering for MCI events!") ); + + return false; + } + + wxSetWindowProc(m_hNotifyWnd, wxMCIMediaBackend::NotifyWndProc); + wxSetWindowUserData(m_hNotifyWnd, this); + + NotifyMovieLoaded(); + + return true; +} + +//--------------------------------------------------------------------------- +// wxMCIMediaBackend::Load (URL version) +// +// MCI doesn't support URLs directly (?) +// +// TODO: Use wxURL/wxFileSystem and mmioInstallProc +//--------------------------------------------------------------------------- +bool wxMCIMediaBackend::Load(const wxURI& WXUNUSED(location)) +{ + return false; +} + +//--------------------------------------------------------------------------- +// wxMCIMediaBackend::Play +// +// Plays/Resumes the MCI device... a couple notes: +// 1) Certain drivers will crash and burn if we don't pass them an +// MCI_PLAY_PARMS, despite the documentation that says otherwise... +// 2) There is a MCI_RESUME command, but MCI_PLAY does the same thing +// and will resume from a stopped state also, so there's no need to +// call both, for example +//--------------------------------------------------------------------------- +bool wxMCIMediaBackend::Play() +{ + MCI_PLAY_PARMS playParms; + playParms.dwCallback = (DWORD)m_hNotifyWnd; + + bool bOK = (mciSendCommand(m_hDev, MCI_PLAY, MCI_NOTIFY, + (DWORD)(LPVOID)&playParms) == 0); + + if (bOK) + m_ctrl->Show(m_bVideo); + + return bOK; +} + +//--------------------------------------------------------------------------- +// wxMCIMediaBackend::Pause +// +// Pauses the MCI device - nothing special +//--------------------------------------------------------------------------- +bool wxMCIMediaBackend::Pause() +{ + return (mciSendCommand(m_hDev, MCI_PAUSE, MCI_WAIT, 0) == 0); +} + +//--------------------------------------------------------------------------- +// wxMCIMediaBackend::Stop +// +// Stops the MCI device & seeks to the beginning as wxMediaCtrl docs outline +//--------------------------------------------------------------------------- +bool wxMCIMediaBackend::Stop() +{ + return (mciSendCommand(m_hDev, MCI_STOP, MCI_WAIT, 0) == 0) && + (mciSendCommand(m_hDev, MCI_SEEK, MCI_SEEK_TO_START, 0) == 0); +} + +//--------------------------------------------------------------------------- +// wxMCIMediaBackend::GetState +// +// Here we get the state and convert it to a wxMediaState - +// since we use direct comparisons with MCI_MODE_PLAY and +// MCI_MODE_PAUSE, we don't care if the MCI_STATUS call +// fails or not +//--------------------------------------------------------------------------- +wxMediaState wxMCIMediaBackend::GetState() +{ + MCI_STATUS_PARMS statusParms; + statusParms.dwItem = MCI_STATUS_MODE; + + mciSendCommand(m_hDev, MCI_STATUS, MCI_STATUS_ITEM, + (DWORD)(LPVOID)&statusParms); + + if (statusParms.dwReturn == MCI_MODE_PAUSE) + return wxMEDIASTATE_PAUSED; + else if (statusParms.dwReturn == MCI_MODE_PLAY) + return wxMEDIASTATE_PLAYING; + else + return wxMEDIASTATE_STOPPED; +} + +//--------------------------------------------------------------------------- +// wxMCIMediaBackend::SetPosition +// +// Here we set the position of the device in the stream. +// Note that MCI actually stops the device after you seek it if the +// device is playing/paused, so we need to play the file after +// MCI seeks like normal APIs would +//--------------------------------------------------------------------------- +bool wxMCIMediaBackend::SetPosition(wxLongLong where) +{ + MCI_SEEK_PARMS seekParms; + seekParms.dwCallback = 0; + +#if wxUSE_LONGLONG_NATIVE && !wxUSE_LONGLONG_WX + seekParms.dwTo = (DWORD)where.GetValue(); +#else // wxUSE_LONGLONG_WX + // no way to return it in one piece + wxASSERT( where.GetHi() == 0 ); + seekParms.dwTo = (DWORD)where.GetLo(); +#endif + + // device was playing? + bool bReplay = GetState() == wxMEDIASTATE_PLAYING; + + if ( mciSendCommand(m_hDev, MCI_SEEK, MCI_TO, + (DWORD)(LPVOID)&seekParms) != 0) + { + return false; + } + + // If the device was playing, resume it + if (bReplay) + return Play(); + else + return true; +} + +//--------------------------------------------------------------------------- +// wxMCIMediaBackend::GetPosition +// +// Gets the position of the device in the stream using the current +// time format... nothing special here... +//--------------------------------------------------------------------------- +wxLongLong wxMCIMediaBackend::GetPosition() +{ + MCI_STATUS_PARMS statusParms; + statusParms.dwItem = MCI_STATUS_POSITION; + + if (mciSendCommand(m_hDev, MCI_STATUS, MCI_STATUS_ITEM, + (DWORD)(LPSTR)&statusParms) != 0) + { + return 0; + } + + return statusParms.dwReturn; +} + +//--------------------------------------------------------------------------- +// wxMCIMediaBackend::GetVolume +// +// Gets the volume of the current media via the MCI_DGV_STATUS_VOLUME +// message. Value ranges from 0 (minimum) to 1000 (maximum volume). +//--------------------------------------------------------------------------- +double wxMCIMediaBackend::GetVolume() +{ + MCI_STATUS_PARMS statusParms; + statusParms.dwCallback = 0; + statusParms.dwItem = 0x4019; // MCI_DGV_STATUS_VOLUME + + if (mciSendCommand(m_hDev, MCI_STATUS, MCI_STATUS_ITEM, + (DWORD)(LPSTR)&statusParms) != 0) + { + return 0; + } + + return ((double)statusParms.dwReturn) / 1000.0; +} + +//--------------------------------------------------------------------------- +// wxMCIMediaBackend::SetVolume +// +// Sets the volume of the current media via the MCI_DGV_SETAUDIO_VOLUME +// message. Value ranges from 0 (minimum) to 1000 (maximum volume). +//--------------------------------------------------------------------------- +bool wxMCIMediaBackend::SetVolume(double dVolume) +{ + MCI_DGV_SETAUDIO_PARMS audioParms; + audioParms.dwCallback = 0; + audioParms.dwItem = 0x4002; // MCI_DGV_SETAUDIO_VOLUME + audioParms.dwValue = (DWORD) (dVolume * 1000.0); + audioParms.dwOver = 0; + audioParms.lpstrAlgorithm = NULL; + audioParms.lpstrQuality = NULL; + + if (mciSendCommand(m_hDev, 0x0873, // MCI_SETAUDIO + // MCI_DGV_SETAUDIO + (_ITEM | _VALUE) + 0x00800000L | 0x01000000L, + (DWORD)(LPSTR)&audioParms) != 0) + { + return false; + } + + return true; +} + +//--------------------------------------------------------------------------- +// wxMCIMediaBackend::GetDuration +// +// Gets the duration of the stream... nothing special +//--------------------------------------------------------------------------- +wxLongLong wxMCIMediaBackend::GetDuration() +{ + MCI_STATUS_PARMS statusParms; + statusParms.dwItem = MCI_STATUS_LENGTH; + + if (mciSendCommand(m_hDev, MCI_STATUS, MCI_STATUS_ITEM, + (DWORD)(LPSTR)&statusParms) != 0) + { + return 0; + } + + return statusParms.dwReturn; +} + +//--------------------------------------------------------------------------- +// wxMCIMediaBackend::Move +// +// Moves the window to a location +//--------------------------------------------------------------------------- +void wxMCIMediaBackend::Move(int WXUNUSED(x), int WXUNUSED(y), int w, int h) +{ + if (m_hNotifyWnd && m_bVideo) + { + MCI_DGV_RECT_PARMS putParms; // ifdefed MCI_DGV_PUT_PARMS + memset(&putParms, 0, sizeof(MCI_DGV_RECT_PARMS)); + putParms.rc.bottom = h; + putParms.rc.right = w; + + // wxStackWalker will crash and burn here on assert + // and MCI doesn't like 0 and 0 for some reason (out of range) + // so just don't it in that case + if (w || h) + { + wxMCIVERIFY( mciSendCommand(m_hDev, MCI_PUT, + 0x00040000L, // MCI_DGV_PUT_DESTINATION + (DWORD)(LPSTR)&putParms) ); + } + } +} + +//--------------------------------------------------------------------------- +// wxMCIMediaBackend::GetVideoSize +// +// Gets the original size of the movie for sizers +//--------------------------------------------------------------------------- +wxSize wxMCIMediaBackend::GetVideoSize() const +{ + if (m_bVideo) + { + MCI_DGV_RECT_PARMS whereParms; // ifdefed MCI_DGV_WHERE_PARMS + + wxMCIVERIFY( mciSendCommand(m_hDev, MCI_WHERE, + 0x00020000L, // MCI_DGV_WHERE_SOURCE + (DWORD)(LPSTR)&whereParms) ); + + return wxSize(whereParms.rc.right, whereParms.rc.bottom); + } + + return wxSize(0, 0); +} + +//--------------------------------------------------------------------------- +// wxMCIMediaBackend::GetPlaybackRate +// +// TODO +//--------------------------------------------------------------------------- +double wxMCIMediaBackend::GetPlaybackRate() +{ + return 1.0; +} + +//--------------------------------------------------------------------------- +// wxMCIMediaBackend::SetPlaybackRate +// +// TODO +//--------------------------------------------------------------------------- +bool wxMCIMediaBackend::SetPlaybackRate(double WXUNUSED(dRate)) +{ +#if 0 + MCI_WAVE_SET_SAMPLESPERSEC + MCI_DGV_SET_PARMS setParms; + setParms.dwSpeed = (DWORD) (dRate * 1000.0); + + return (mciSendCommand(m_hDev, MCI_SET, + 0x00020000L, // MCI_DGV_SET_SPEED + (DWORD)(LPSTR)&setParms) == 0); +#endif + + return false; +} + +//--------------------------------------------------------------------------- +// [static] wxMCIMediaBackend::MSWWindowProc +// +// Here we process a message when MCI reaches the stopping point +// in the stream +//--------------------------------------------------------------------------- +LRESULT CALLBACK wxMCIMediaBackend::NotifyWndProc(HWND hWnd, UINT nMsg, + WPARAM wParam, + LPARAM lParam) +{ + wxMCIMediaBackend* backend = + (wxMCIMediaBackend*)wxGetWindowUserData(hWnd); + + return backend->OnNotifyWndProc(hWnd, nMsg, wParam, lParam); +} + +LRESULT CALLBACK wxMCIMediaBackend::OnNotifyWndProc(HWND hWnd, UINT nMsg, + WPARAM wParam, + LPARAM lParam) +{ + if (nMsg == MM_MCINOTIFY) + { + wxASSERT(lParam == (LPARAM) m_hDev); + if (wParam == MCI_NOTIFY_SUCCESSFUL && lParam == (LPARAM)m_hDev) + { + if ( SendStopEvent() ) + { + wxMCIVERIFY( mciSendCommand(m_hDev, MCI_SEEK, MCI_SEEK_TO_START, 0) ); + QueueFinishEvent(); + } + } + } + return DefWindowProc(hWnd, nMsg, wParam, lParam); +} +#endif // __WXWINCE__ + + + + +//--------------------------------------------------------------------------- +// +// wxAMMediaBackend +// +//--------------------------------------------------------------------------- + +typedef BOOL (WINAPI* LPAMGETERRORTEXT)(HRESULT, wxChar *, DWORD); + +class WXDLLIMPEXP_MEDIA wxAMMediaBackend : public wxMediaBackendCommonBase +{ +public: + wxAMMediaBackend(); + virtual ~wxAMMediaBackend(); + + virtual bool CreateControl(wxControl* ctrl, wxWindow* parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name); + + virtual bool Play(); + virtual bool Pause(); + virtual bool Stop(); + + virtual bool Load(const wxString& fileName); + virtual bool Load(const wxURI& location); + virtual bool Load(const wxURI& location, const wxURI& proxy); + + bool DoLoad(const wxString& location); + void FinishLoad(); + + virtual wxMediaState GetState(); + + virtual bool SetPosition(wxLongLong where); + virtual wxLongLong GetPosition(); + virtual wxLongLong GetDuration(); + + virtual void Move(int x, int y, int w, int h); + wxSize GetVideoSize() const; + + virtual double GetPlaybackRate(); + virtual bool SetPlaybackRate(double); + + virtual double GetVolume(); + virtual bool SetVolume(double); + + virtual bool ShowPlayerControls(wxMediaCtrlPlayerControls flags); + + void DoGetDownloadProgress(wxLongLong*, wxLongLong*); + virtual wxLongLong GetDownloadProgress() + { + wxLongLong progress, total; + DoGetDownloadProgress(&progress, &total); + return progress; + } + virtual wxLongLong GetDownloadTotal() + { + wxLongLong progress, total; + DoGetDownloadProgress(&progress, &total); + return total; + } + + wxActiveXContainer* m_pAX; // ActiveX host +#ifdef __WXWINCE__ + IWMP* m_pWMP; + + IWMP* GetMP() {return m_pWMP;} + IWMP* GetAM() {return m_pWMP;} +#else + IActiveMovie* m_pAM; + IMediaPlayer* m_pMP; + + IMediaPlayer* GetMP() {return m_pMP;} + IActiveMovie* GetAM() {return m_pAM;} +#endif + wxSize m_bestSize; // Cached size + +#ifdef __WXDEBUG__ // Stuff for getting useful debugging strings + wxDynamicLibrary m_dllQuartz; + LPAMGETERRORTEXT m_lpAMGetErrorText; + wxString GetErrorString(HRESULT hrdsv); +#endif // __WXDEBUG__ + + friend class wxAMMediaEvtHandler; + DECLARE_DYNAMIC_CLASS(wxAMMediaBackend) +}; + +class WXDLLIMPEXP_MEDIA wxAMMediaEvtHandler : public wxEvtHandler +{ +public: + wxAMMediaEvtHandler(wxAMMediaBackend *amb) : + m_amb(amb), m_bLoadEventSent(false) + { + m_amb->m_pAX->Connect(m_amb->m_pAX->GetId(), + wxEVT_ACTIVEX, + wxActiveXEventHandler(wxAMMediaEvtHandler::OnActiveX), + NULL, this + ); + } + + void OnActiveX(wxActiveXEvent& event); + +private: + wxAMMediaBackend *m_amb; + bool m_bLoadEventSent; // Whether or not FinishLoaded was already called + // prevents it being called multiple times + + DECLARE_NO_COPY_CLASS(wxAMMediaEvtHandler) +}; + +//=========================================================================== +// IMPLEMENTATION +//=========================================================================== + +//--------------------------------------------------------------------------- +// +// wxAMMediaBackend +// +//--------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxAMMediaBackend, wxMediaBackend) + +//--------------------------------------------------------------------------- +// Usual debugging macros +//--------------------------------------------------------------------------- +#ifdef __WXDEBUG__ +#define MAX_ERROR_TEXT_LEN 160 + +// Get the error string for Active Movie +wxString wxAMMediaBackend::GetErrorString(HRESULT hrdsv) +{ + wxChar szError[MAX_ERROR_TEXT_LEN]; + if( m_lpAMGetErrorText != NULL && + (*m_lpAMGetErrorText)(hrdsv, szError, MAX_ERROR_TEXT_LEN) == 0) + { + return wxString::Format(wxT("DirectShow error \"%s\" \n") + wxT("(numeric %X)\n") + wxT("occured"), + szError, (int)hrdsv); + } + else + { + return wxString::Format(wxT("Unknown error \n") + wxT("(numeric %X)\n") + wxT("occured"), + (int)hrdsv); + } +} + +#define wxAMFAIL(x) wxFAIL_MSG(GetErrorString(x)); +#define wxVERIFY(x) wxASSERT((x)) +#define wxAMLOG(x) wxLogDebug(GetErrorString(x)) +#else +#define wxAMVERIFY(x) (x) +#define wxVERIFY(x) (x) +#define wxAMLOG(x) +#define wxAMFAIL(x) +#endif + +//--------------------------------------------------------------------------- +// wxAMMediaBackend Constructor +//--------------------------------------------------------------------------- +wxAMMediaBackend::wxAMMediaBackend() + :m_pAX(NULL), +#ifdef __WXWINCE__ + m_pWMP(NULL), +#else + m_pAM(NULL), + m_pMP(NULL), +#endif + m_bestSize(wxDefaultSize) +{ +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend Destructor +//--------------------------------------------------------------------------- +wxAMMediaBackend::~wxAMMediaBackend() +{ + if(m_pAX) + { + m_pAX->DissociateHandle(); + delete m_pAX; +#ifndef __WXWINCE__ + m_pAM->Release(); +#endif + + if (GetMP()) + GetMP()->Release(); + + m_ctrl->PopEventHandler(true); + } +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend::CreateControl +//--------------------------------------------------------------------------- +bool wxAMMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name) +{ + // First get the AMGetErrorText procedure in debug + // mode for more meaningful messages +#ifdef __WXDEBUG__ + if ( m_dllQuartz.Load(_T("quartz.dll"), wxDL_VERBATIM) ) + { + m_lpAMGetErrorText = (LPAMGETERRORTEXT) + m_dllQuartz.GetSymbolAorW(wxT("AMGetErrorText")); + } +#endif // __WXDEBUG__ + + + +#ifdef __WXWINCE__ + CLSID clsid; + + // Try progids first - *.WMP is PocketPC and Mediaplayer.1 is CE.NET + // later versions support straight creation from CLSID + if (CLSIDFromProgID(L"WPCEOCX.WMP", &clsid) != S_OK && + CLSIDFromProgID(L"MediaPlayer.MediaPlayer.1", &clsid) != S_OK) + { + clsid = CLSID_MediaPlayer; + } + + // While the CLSID is the same as CLSID_MediaPlayer + // CE only supports the IWMP interface + if ( ::CoCreateInstance(clsid, NULL, + CLSCTX_INPROC_SERVER, + IID_IWMP, (void**)&m_pWMP) != 0 ) + { + return false; + } + +#else + // Now determine which (if any) media player interface is + // available - IMediaPlayer or IActiveMovie + if( ::CoCreateInstance(CLSID_MediaPlayer, NULL, + CLSCTX_INPROC_SERVER, + IID_IMediaPlayer, (void**)&m_pMP) != 0 ) + { + if( ::CoCreateInstance(CLSID_ActiveMovie, NULL, + CLSCTX_INPROC_SERVER, + IID_IActiveMovie, (void**)&m_pAM) != 0 ) + return false; + m_pAM->QueryInterface(IID_IMediaPlayer, (void**)&m_pMP); + } + else + { + m_pMP->QueryInterface(IID_IActiveMovie, (void**)&m_pAM); + } +#endif + + // + // Create window + // By default wxWindow(s) is created with a border - + // so we need to get rid of those + // + // Since we don't have a child window like most other + // backends, we don't need wxCLIP_CHILDREN + // + if ( !ctrl->wxControl::Create(parent, id, pos, size, + (style & ~wxBORDER_MASK) | wxBORDER_NONE, + validator, name) ) + return false; + + // + // Now create the ActiveX container along with the media player + // interface and query them + // + m_ctrl = wxStaticCast(ctrl, wxMediaCtrl); + m_pAX = new wxActiveXContainer(ctrl, +#ifdef __WXWINCE__ + IID_IWMP, m_pWMP +#else + m_pMP ? IID_IMediaPlayer : IID_IActiveMovie, m_pAM +#endif + ); + // Connect for events + m_ctrl->PushEventHandler(new wxAMMediaEvtHandler(this)); + + // + // Here we set up wx-specific stuff for the default + // settings wxMediaCtrl says it will stay to + // + if(GetMP()) + { + GetMP()->put_DisplaySize(mpFitToSize); +#ifndef __WXWINCE__ // Not in CE's IWMP + // TODO: Unsure what actual effect this has + // In DirectShow Windowless video results in less delay when + // dragging, for example - but this doesn't appear to really do anything + // in practice (it may be something different...)... + GetMP()->put_WindowlessVideo(VARIANT_TRUE); +#endif + + } +#ifndef __WXWINCE__ // Not in CE's IWMP + else + GetAM()->put_MovieWindowSize(amvDoubleOriginalSize); +#endif + + // by default true + GetAM()->put_AutoStart(VARIANT_FALSE); + // by default enabled + wxAMMediaBackend::ShowPlayerControls(wxMEDIACTRLPLAYERCONTROLS_NONE); + // by default with AM only 0.5 + wxAMMediaBackend::SetVolume(1.0); + + // don't erase the background of our control window so that resizing is a + // bit smoother + m_ctrl->SetBackgroundStyle(wxBG_STYLE_CUSTOM); + + // success + return true; +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend::Load (file version) +//--------------------------------------------------------------------------- +bool wxAMMediaBackend::Load(const wxString& fileName) +{ + return DoLoad(fileName); +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend::Load (URL Version) +//--------------------------------------------------------------------------- +bool wxAMMediaBackend::Load(const wxURI& location) +{ + // Turn off loading from a proxy as user + // may have set it previously + INSPlay* pPlay = NULL; + GetAM()->QueryInterface(IID_INSPlay, (void**) &pPlay); + if(pPlay) + { + pPlay->put_UseHTTPProxy(VARIANT_FALSE); + pPlay->Release(); + } + + return DoLoad(location.BuildURI()); +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend::Load (URL Version with Proxy) +//--------------------------------------------------------------------------- +bool wxAMMediaBackend::Load(const wxURI& location, const wxURI& proxy) +{ + // Set the proxy of the NETSHOW interface + INSPlay* pPlay = NULL; + GetAM()->QueryInterface(IID_INSPlay, (void**) &pPlay); + + if(pPlay) + { + pPlay->put_UseHTTPProxy(VARIANT_TRUE); + pPlay->put_HTTPProxyHost(wxBasicString(proxy.GetServer()).Get()); + pPlay->put_HTTPProxyPort(wxAtoi(proxy.GetPort())); + pPlay->Release(); + } + + return DoLoad(location.BuildURI()); +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend::DoLoad +// +// Called by all functions - this actually renders +// the file and sets up the filter graph +//--------------------------------------------------------------------------- +bool wxAMMediaBackend::DoLoad(const wxString& location) +{ + HRESULT hr; + + // Play the movie the normal way through the embedded + // WMP. Supposively Open is better in theory because + // the docs say its async and put_FileName is not - + // but in practice they both seem to be async anyway + if(GetMP()) + hr = GetMP()->Open( wxBasicString(location).Get() ); + else + hr = GetAM()->put_FileName( wxBasicString(location).Get() ); + + if(FAILED(hr)) + { + wxAMLOG(hr); + return false; + } + + m_bestSize = wxDefaultSize; + return true; +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend::FinishLoad +// +// Called when the media has finished loaded and is ready to play +// +// Here we get the original size of the video and +// send the loaded event to our watcher :). +//--------------------------------------------------------------------------- +void wxAMMediaBackend::FinishLoad() +{ + NotifyMovieLoaded(); +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend::ShowPlayerControls +//--------------------------------------------------------------------------- +bool wxAMMediaBackend::ShowPlayerControls(wxMediaCtrlPlayerControls flags) +{ + // Note that IMediaPlayer doesn't have a statusbar by + // default but IActiveMovie does - so lets try to keep + // the interface consistant + if(!flags) + { + GetAM()->put_Enabled(VARIANT_FALSE); + GetAM()->put_ShowControls(VARIANT_FALSE); + if(GetMP()) + GetMP()->put_ShowStatusBar(VARIANT_FALSE); + } + else + { + GetAM()->put_Enabled(VARIANT_TRUE); + GetAM()->put_ShowControls(VARIANT_TRUE); + + GetAM()->put_ShowPositionControls( + (flags & wxMEDIACTRLPLAYERCONTROLS_STEP) ? + VARIANT_TRUE : VARIANT_FALSE); + + if(GetMP()) + { + GetMP()->put_ShowStatusBar(VARIANT_TRUE); + GetMP()->put_ShowAudioControls( + (flags & wxMEDIACTRLPLAYERCONTROLS_VOLUME) ? + VARIANT_TRUE : VARIANT_FALSE); + } + } + + return true; +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend::Play +// +// Plays the stream. If it is non-seekable, it will restart it (implicit). +// +// Note that we use SUCCEEDED here because run/pause/stop tend to be overly +// picky and return warnings on pretty much every call +//--------------------------------------------------------------------------- +bool wxAMMediaBackend::Play() +{ + // Actually try to play the movie (will fail if not loaded completely) +#ifdef __WXWINCE__ + HRESULT hr = m_pWMP->Play(); +#else + HRESULT hr = GetAM()->Run(); +#endif + if(SUCCEEDED(hr)) + { + return true; + } + wxAMLOG(hr); + return false; +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend::Pause +// +// Pauses the stream. +//--------------------------------------------------------------------------- +bool wxAMMediaBackend::Pause() +{ + HRESULT hr = GetAM()->Pause(); + if(SUCCEEDED(hr)) + return true; + wxAMLOG(hr); + return false; +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend::Stop +// +// Stops the stream. +//--------------------------------------------------------------------------- +bool wxAMMediaBackend::Stop() +{ + HRESULT hr = GetAM()->Stop(); + if(SUCCEEDED(hr)) + { + // Seek to beginning + wxAMMediaBackend::SetPosition(0); + return true; + } + wxAMLOG(hr); + return false; +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend::SetPosition +// +// 1) Translates the current position's time to directshow time, +// which is in a scale of 1 second (in a double) +// 2) Sets the play position of the IActiveMovie interface - +// passing NULL as the stop position means to keep the old +// stop position +//--------------------------------------------------------------------------- +bool wxAMMediaBackend::SetPosition(wxLongLong where) +{ + HRESULT hr = GetAM()->put_CurrentPosition( + ((LONGLONG)where.GetValue()) / 1000.0 + ); + if(FAILED(hr)) + { + wxAMLOG(hr); + return false; + } + + return true; +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend::GetPosition +// +// 1) Obtains the current play and stop positions from IMediaSeeking +// 2) Returns the play position translated to our time base +//--------------------------------------------------------------------------- +wxLongLong wxAMMediaBackend::GetPosition() +{ + double outCur; + HRESULT hr = GetAM()->get_CurrentPosition(&outCur); + if(FAILED(hr)) + { + wxAMLOG(hr); + return 0; + } + + // h,m,s,milli - outCur is in 1 second (double) + outCur *= 1000; + wxLongLong ll; + ll.Assign(outCur); + + return ll; +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend::GetVolume +// +// Gets the volume through the IActiveMovie interface - +// value ranges from 0 (MAX volume) to -10000 (minimum volume). +// -100 per decibel (Logorithmic in 0.01db per step). +//--------------------------------------------------------------------------- +double wxAMMediaBackend::GetVolume() +{ + long lVolume; + HRESULT hr = GetAM()->get_Volume(&lVolume); + if(FAILED(hr)) + { + wxAMLOG(hr); + return 0.0; + } + + // Volume conversion from Greg Hazel + double dVolume = (double)lVolume / 100; + + // convert to 0 to 1 + dVolume = pow(10.0, dVolume/20.0); + // handle -INF + dVolume *= 1 + pow(10.0, -5.0); + dVolume -= pow(10.0, -5.0); + return dVolume; +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend::SetVolume +// +// Sets the volume through the IActiveMovie interface - +// value ranges from 0 (MAX volume) to -10000 (minimum volume). +// -100 per decibel (Logorithmic in 0.01db per step). +//--------------------------------------------------------------------------- +bool wxAMMediaBackend::SetVolume(double dVolume) +{ + // Volume conversion from Greg Hazel + long lVolume; + // handle -INF + dVolume *= 1 - pow(10.0, -5.0); + dVolume += pow(10.0, -5.0); + // convert to -100db to 0db + dVolume = 20 * log10(dVolume); + // scale to -10000 to 0 + lVolume = (long)(100 * dVolume); + + HRESULT hr = GetAM()->put_Volume( lVolume ); + if(FAILED(hr)) + { + wxAMLOG(hr); + return false; + } + return true; +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend::GetDuration +// +// 1) Obtains the duration of the media from IActiveMovie +// 2) Converts that value to our time base, and returns it +// +// NB: With VBR MP3 files the default DirectShow MP3 render does not +// read the Xing header correctly, resulting in skewed values for duration +// and seeking +//--------------------------------------------------------------------------- +wxLongLong wxAMMediaBackend::GetDuration() +{ + double outDuration; + HRESULT hr = GetAM()->get_Duration(&outDuration); + if(FAILED(hr)) + { + wxAMLOG(hr); + return 0; + } + + // h,m,s,milli - outDuration is in 1 second (double) + outDuration *= 1000; + wxLongLong ll; + ll.Assign(outDuration); + + return ll; +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend::GetState +// +// Returns the cached state +//--------------------------------------------------------------------------- +wxMediaState wxAMMediaBackend::GetState() +{ + StateConstants nState; +#ifdef __WXWINCE__ + HRESULT hr = m_pWMP->get_PlayState((long*)&nState); +#else + HRESULT hr = GetAM()->get_CurrentState(&nState); +#endif + if(FAILED(hr)) + { + wxAMLOG(hr); + return wxMEDIASTATE_STOPPED; + } + + return (wxMediaState)nState; +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend::GetPlaybackRate +// +// Pretty simple way of obtaining the playback rate from +// the IActiveMovie interface +//--------------------------------------------------------------------------- +double wxAMMediaBackend::GetPlaybackRate() +{ + double dRate; + HRESULT hr = GetAM()->get_Rate(&dRate); + if(FAILED(hr)) + { + wxAMLOG(hr); + return 0.0; + } + return dRate; +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend::SetPlaybackRate +// +// Sets the playback rate of the media - DirectShow is pretty good +// about this, actually +//--------------------------------------------------------------------------- +bool wxAMMediaBackend::SetPlaybackRate(double dRate) +{ + HRESULT hr = GetAM()->put_Rate(dRate); + if(FAILED(hr)) + { + wxAMLOG(hr); + return false; + } + + return true; +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend::GetDownloadXXX +// +// Queries for and gets the total size of the file and the current +// progress in downloading that file from the IAMOpenProgress +// interface from the media player interface's filter graph +//--------------------------------------------------------------------------- +void wxAMMediaBackend::DoGetDownloadProgress(wxLongLong* pLoadProgress, + wxLongLong* pLoadTotal) +{ +#ifndef __WXWINCE__ + LONGLONG loadTotal = 0, loadProgress = 0; + IUnknown* pFG; + IAMOpenProgress* pOP; + HRESULT hr; + hr = m_pAM->get_FilterGraph(&pFG); + if(SUCCEEDED(hr)) + { + hr = pFG->QueryInterface(IID_IAMOpenProgress, (void**)&pOP); + if(SUCCEEDED(hr)) + { + hr = pOP->QueryProgress(&loadTotal, &loadProgress); + pOP->Release(); + } + pFG->Release(); + } + + if(SUCCEEDED(hr)) + { + *pLoadProgress = loadProgress; + *pLoadTotal = loadTotal; + } + else +#endif + { + // When not loading from a URL QueryProgress will return + // E_NOINTERFACE or whatever + // wxAMFAIL(hr); + *pLoadProgress = 0; + *pLoadTotal = 0; + } +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend::GetVideoSize +// +// Obtains the cached original video size +//--------------------------------------------------------------------------- +wxSize wxAMMediaBackend::GetVideoSize() const +{ + if (m_bestSize == wxDefaultSize) + { + wxAMMediaBackend* self = wxConstCast(this, wxAMMediaBackend); + long w = 0; + long h = 0; + + self->GetAM()->get_ImageSourceWidth(&w); + self->GetAM()->get_ImageSourceHeight(&h); + + if (w != 0 && h != 0) + self->m_bestSize.Set(w, h); + else + return wxSize(0,0); + } + + return m_bestSize; +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend::Move +// +// We take care of this in our redrawing +//--------------------------------------------------------------------------- +void wxAMMediaBackend::Move(int WXUNUSED(x), int WXUNUSED(y), + int WXUNUSED(w), int WXUNUSED(h)) +{ +} + +//--------------------------------------------------------------------------- +// wxAMMediaBackend::OnActiveX +// +// Handle events sent from our activex control (IActiveMovie/IMediaPlayer). +// +// The weird numbers in the switch statement here are "dispatch ids" +// (the numbers in the id field like ( id(xxx) ) ) from amcompat.idl +// and msdxm.idl. +//--------------------------------------------------------------------------- +void wxAMMediaEvtHandler::OnActiveX(wxActiveXEvent& event) +{ + switch(event.GetDispatchId()) + { +#ifndef __WXWINCE__ + case 0x00000001: // statechange in IActiveMovie + case 0x00000bc4: // playstatechange in IMediaPlayer +#else + case 0x00000011: // 17 == playstatechange on IWMP +#endif + if(event.ParamCount() >= 2) + { + switch (event[1].GetInteger()) + { + case 0: // stopping + if( m_amb->wxAMMediaBackend::GetPosition() == + m_amb->wxAMMediaBackend::GetDuration() ) + { + if ( m_amb->SendStopEvent() ) + { + // Seek to beginning of movie + m_amb->wxAMMediaBackend::SetPosition(0); + + // send the event to our child + m_amb->QueueFinishEvent(); + } + } + else + { + m_amb->QueueStopEvent(); + } + break; + case 1: // pause + m_amb->QueuePauseEvent(); + break; + case 2: // play + m_amb->QueuePlayEvent(); + break; + default: + break; + } + } + else + event.Skip(); + break; + +#ifndef __WXWINCE__ + case 0x00000032: // opencomplete in IActiveMovie + if(!m_bLoadEventSent) + { + m_amb->FinishLoad(); + } + break; + + case 0xfffffd9f: // readystatechange in IActiveMovie2 and IMediaPlayer +#else + case 0x00000013: // 19 == readystatechange in IWMP +#endif + if(event.ParamCount() >= 1) + { + if(event[0].GetInteger() == 0) + { + m_bLoadEventSent = false; + } + // Originally this was >= 3 here but on 3 we can't get the + // size of the video (will error) - however on 4 + // it won't play on downloaded things until it is + // completely downloaded so we use the lesser of two evils... + else if(event[0].GetInteger() == 3 && + !m_bLoadEventSent) + { + m_bLoadEventSent = true; + m_amb->FinishLoad(); + } + } + else + event.Skip(); + break; + + default: + event.Skip(); + return; + } +} + +//--------------------------------------------------------------------------- +// End of wxAMMediaBackend +//--------------------------------------------------------------------------- + +// in source file that contains stuff you don't directly use +#include "wx/html/forcelnk.h" +FORCE_LINK_ME(wxmediabackend_am) + +#endif // wxUSE_MEDIACTRL && wxUSE_ACTIVEX diff --git a/installers/patch_wx28_win32s/src/msw/notebook.cpp b/installers/patch_wx28_win32s/src/msw/notebook.cpp new file mode 100644 index 0000000..57fe80e --- /dev/null +++ b/installers/patch_wx28_win32s/src/msw/notebook.cpp @@ -0,0 +1,1510 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/msw/notebook.cpp +// Purpose: implementation of wxNotebook +// Author: Vadim Zeitlin +// Modified by: +// Created: 11.06.98 +// RCS-ID: $Id: notebook.cpp 59897 2009-03-27 22:37:22Z VZ $ +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_NOTEBOOK + +#include "wx/notebook.h" + +#ifndef WX_PRECOMP + #include "wx/msw/wrapcctl.h" // include "properly" + #include "wx/string.h" + #include "wx/dc.h" + #include "wx/log.h" + #include "wx/event.h" + #include "wx/app.h" + #include "wx/dcclient.h" + #include "wx/dcmemory.h" + #include "wx/control.h" +#endif // WX_PRECOMP + +#include "wx/imaglist.h" +#include "wx/sysopt.h" + +#include "wx/msw/private.h" + +#include +#include "wx/msw/winundef.h" + +#if wxUSE_UXTHEME + #include "wx/msw/uxtheme.h" +#endif + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +// check that the page index is valid +#define IS_VALID_PAGE(nPage) ((nPage) < GetPageCount()) + +// you can set USE_NOTEBOOK_ANTIFLICKER to 0 for desktop Windows versions too +// to disable code whih results in flicker-less notebook redrawing at the +// expense of some extra GDI resource consumption +#ifdef __WXWINCE__ + // notebooks are never resized under CE anyhow + #define USE_NOTEBOOK_ANTIFLICKER 0 +#else + #if defined(WINVER) && WINVER >= 0x0500 + #define USE_NOTEBOOK_ANTIFLICKER 0 // was 1, hardcoded to 0, tried to use winver but doesn't seem to detect it? + #else + #define USE_NOTEBOOK_ANTIFLICKER 0 + #endif +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// This is a work-around for missing defines in gcc-2.95 headers +#ifndef TCS_RIGHT + #define TCS_RIGHT 0x0002 +#endif + +#ifndef TCS_VERTICAL + #define TCS_VERTICAL 0x0080 +#endif + +#ifndef TCS_BOTTOM + #define TCS_BOTTOM TCS_RIGHT +#endif + +// ---------------------------------------------------------------------------- +// global variables +// ---------------------------------------------------------------------------- + +#if USE_NOTEBOOK_ANTIFLICKER + +// the pointer to standard spin button wnd proc +static WXFARPROC gs_wndprocNotebookSpinBtn = (WXFARPROC)NULL; + +// the pointer to standard tab control wnd proc +static WXFARPROC gs_wndprocNotebook = (WXFARPROC)NULL; + +LRESULT APIENTRY _EXPORT wxNotebookWndProc(HWND hwnd, + UINT message, + WPARAM wParam, + LPARAM lParam); + +#endif // USE_NOTEBOOK_ANTIFLICKER + +// ---------------------------------------------------------------------------- +// global functions +// ---------------------------------------------------------------------------- + +static bool HasTroubleWithNonTopTabs() +{ + const int verComCtl32 = wxApp::GetComCtl32Version(); + + // 600 is XP, 616 is Vista -- and both have a problem with tabs not on top + // (but don't just test for >= 600 as Microsoft might decide to fix it in + // later versions, who knows...) + return verComCtl32 >= 600 && verComCtl32 <= 616; +} + +// ---------------------------------------------------------------------------- +// event table +// ---------------------------------------------------------------------------- + +#include "wx/listimpl.cpp" + +WX_DEFINE_LIST( wxNotebookPageInfoList ) + +DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING) + +BEGIN_EVENT_TABLE(wxNotebook, wxControl) + EVT_NOTEBOOK_PAGE_CHANGED(wxID_ANY, wxNotebook::OnSelChange) + EVT_SIZE(wxNotebook::OnSize) + EVT_NAVIGATION_KEY(wxNotebook::OnNavigationKey) + +#if USE_NOTEBOOK_ANTIFLICKER + EVT_ERASE_BACKGROUND(wxNotebook::OnEraseBackground) + EVT_PAINT(wxNotebook::OnPaint) +#endif // USE_NOTEBOOK_ANTIFLICKER +END_EVENT_TABLE() + +#if wxUSE_EXTENDED_RTTI +WX_DEFINE_FLAGS( wxNotebookStyle ) + +wxBEGIN_FLAGS( wxNotebookStyle ) + // new style border flags, we put them first to + // use them for streaming out + wxFLAGS_MEMBER(wxBORDER_SIMPLE) + wxFLAGS_MEMBER(wxBORDER_SUNKEN) + wxFLAGS_MEMBER(wxBORDER_DOUBLE) + wxFLAGS_MEMBER(wxBORDER_RAISED) + wxFLAGS_MEMBER(wxBORDER_STATIC) + wxFLAGS_MEMBER(wxBORDER_NONE) + + // old style border flags + wxFLAGS_MEMBER(wxSIMPLE_BORDER) + wxFLAGS_MEMBER(wxSUNKEN_BORDER) + wxFLAGS_MEMBER(wxDOUBLE_BORDER) + wxFLAGS_MEMBER(wxRAISED_BORDER) + wxFLAGS_MEMBER(wxSTATIC_BORDER) + wxFLAGS_MEMBER(wxBORDER) + + // standard window styles + wxFLAGS_MEMBER(wxTAB_TRAVERSAL) + wxFLAGS_MEMBER(wxCLIP_CHILDREN) + wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW) + wxFLAGS_MEMBER(wxWANTS_CHARS) + wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE) + wxFLAGS_MEMBER(wxALWAYS_SHOW_SB ) + wxFLAGS_MEMBER(wxVSCROLL) + wxFLAGS_MEMBER(wxHSCROLL) + + wxFLAGS_MEMBER(wxNB_FIXEDWIDTH) + wxFLAGS_MEMBER(wxBK_DEFAULT) + wxFLAGS_MEMBER(wxBK_TOP) + wxFLAGS_MEMBER(wxBK_LEFT) + wxFLAGS_MEMBER(wxBK_RIGHT) + wxFLAGS_MEMBER(wxBK_BOTTOM) + wxFLAGS_MEMBER(wxNB_NOPAGETHEME) + wxFLAGS_MEMBER(wxNB_FLAT) + +wxEND_FLAGS( wxNotebookStyle ) + +IMPLEMENT_DYNAMIC_CLASS_XTI(wxNotebook, wxBookCtrlBase,"wx/notebook.h") +IMPLEMENT_DYNAMIC_CLASS_XTI(wxNotebookPageInfo, wxObject , "wx/notebook.h" ) + +wxCOLLECTION_TYPE_INFO( wxNotebookPageInfo * , wxNotebookPageInfoList ) ; + +template<> void wxCollectionToVariantArray( wxNotebookPageInfoList const &theList, wxxVariantArray &value) +{ + wxListCollectionToVariantArray( theList , value ) ; +} + +wxBEGIN_PROPERTIES_TABLE(wxNotebook) + wxEVENT_PROPERTY( PageChanging , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING , wxNotebookEvent ) + wxEVENT_PROPERTY( PageChanged , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED , wxNotebookEvent ) + + wxPROPERTY_COLLECTION( PageInfos , wxNotebookPageInfoList , wxNotebookPageInfo* , AddPageInfo , GetPageInfos , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY_FLAGS( WindowStyle , wxNotebookStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style +wxEND_PROPERTIES_TABLE() + +wxBEGIN_HANDLERS_TABLE(wxNotebook) +wxEND_HANDLERS_TABLE() + +wxCONSTRUCTOR_5( wxNotebook , wxWindow* , Parent , wxWindowID , Id , wxPoint , Position , wxSize , Size , long , WindowStyle) + + +wxBEGIN_PROPERTIES_TABLE(wxNotebookPageInfo) + wxREADONLY_PROPERTY( Page , wxNotebookPage* , GetPage , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxREADONLY_PROPERTY( Text , wxString , GetText , wxString() , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxREADONLY_PROPERTY( Selected , bool , GetSelected , false, 0 /*flags*/ , wxT("Helpstring") , wxT("group") ) + wxREADONLY_PROPERTY( ImageId , int , GetImageId , -1 , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) +wxEND_PROPERTIES_TABLE() + +wxBEGIN_HANDLERS_TABLE(wxNotebookPageInfo) +wxEND_HANDLERS_TABLE() + +wxCONSTRUCTOR_4( wxNotebookPageInfo , wxNotebookPage* , Page , wxString , Text , bool , Selected , int , ImageId ) + +#else +IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxBookCtrlBase) +IMPLEMENT_DYNAMIC_CLASS(wxNotebookPageInfo, wxObject ) +#endif +IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxNotifyEvent) + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxNotebook construction +// ---------------------------------------------------------------------------- + +const wxNotebookPageInfoList& wxNotebook::GetPageInfos() const +{ + wxNotebookPageInfoList* list = const_cast< wxNotebookPageInfoList* >( &m_pageInfos ) ; + WX_CLEAR_LIST( wxNotebookPageInfoList , *list ) ; + for( size_t i = 0 ; i < GetPageCount() ; ++i ) + { + wxNotebookPageInfo *info = new wxNotebookPageInfo() ; + info->Create( const_cast(this)->GetPage(i) , GetPageText(i) , GetSelection() == int(i) , GetPageImage(i) ) ; + list->Append( info ) ; + } + return m_pageInfos ; +} + +// common part of all ctors +void wxNotebook::Init() +{ + m_imageList = NULL; + m_nSelection = wxNOT_FOUND; + +#if wxUSE_UXTHEME + m_hbrBackground = NULL; +#endif // wxUSE_UXTHEME + +#if USE_NOTEBOOK_ANTIFLICKER + m_hasSubclassedUpdown = false; +#endif // USE_NOTEBOOK_ANTIFLICKER +} + +// default for dynamic class +wxNotebook::wxNotebook() +{ + Init(); +} + +// the same arguments as for wxControl +wxNotebook::wxNotebook(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + Init(); + + Create(parent, id, pos, size, style, name); +} + +// Create() function +bool wxNotebook::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + if ( (style & wxBK_ALIGN_MASK) == wxBK_DEFAULT ) + { +#if defined(__POCKETPC__) + style |= wxBK_BOTTOM | wxNB_FLAT; +#else + style |= wxBK_TOP; +#endif + } + +#ifdef __WXWINCE__ + // Not sure why, but without this style, there is no border + // around the notebook tabs. + if (style & wxNB_FLAT) + style |= wxBORDER_SUNKEN; +#endif + +#if !wxUSE_UXTHEME + // ComCtl32 notebook tabs simply don't work unless they're on top if we + // have uxtheme, we can work around it later (after control creation), but + // if we have been compiled without uxtheme support, we have to clear those + // styles + if ( HasTroubleWithNonTopTabs() ) + { + style &= ~(wxBK_BOTTOM | wxBK_LEFT | wxBK_RIGHT); + } +#endif //wxUSE_UXTHEME + +#if defined(__WINE__) && wxUSE_UNICODE + LPCTSTR className = L"SysTabControl32"; +#else + LPCTSTR className = WC_TABCONTROL; +#endif + +#if USE_NOTEBOOK_ANTIFLICKER + // SysTabCtl32 class has natively CS_HREDRAW and CS_VREDRAW enabled and it + // causes horrible flicker when resizing notebook, so get rid of it by + // using a class without these styles (but otherwise identical to it) + if ( !HasFlag(wxFULL_REPAINT_ON_RESIZE) ) + { + static ClassRegistrar s_clsNotebook; + if ( !s_clsNotebook.IsInitialized() ) + { + // get a copy of standard class and modify it + WNDCLASS wc; + + if ( ::GetClassInfo(NULL, WC_TABCONTROL, &wc) ) + { + gs_wndprocNotebook = + wx_reinterpret_cast(WXFARPROC, wc.lpfnWndProc); + wc.lpszClassName = wxT("_wx_SysTabCtl32"); + wc.style &= ~(CS_HREDRAW | CS_VREDRAW); + wc.hInstance = wxGetInstance(); + wc.lpfnWndProc = wxNotebookWndProc; + s_clsNotebook.Register(wc); + } + else + { + wxLogLastError(_T("GetClassInfoEx(SysTabCtl32)")); + } + } + + // use our custom class if available but fall back to the standard + // notebook if we failed to register it + if ( s_clsNotebook.IsRegistered() ) + { + // it's ok to use c_str() here as the static s_clsNotebook object + // has sufficiently long lifetime + className = s_clsNotebook.GetName().c_str(); + } + } +#endif // USE_NOTEBOOK_ANTIFLICKER + + if ( !CreateControl(parent, id, pos, size, style | wxTAB_TRAVERSAL, + wxDefaultValidator, name) ) + return false; + + if ( !MSWCreateControl(className, wxEmptyString, pos, size) ) + return false; + +#if wxUSE_UXTHEME + if ( HasFlag(wxNB_NOPAGETHEME) || + wxSystemOptions::IsFalse(wxT("msw.notebook.themed-background")) ) + { + SetBackgroundColour(GetThemeBackgroundColour()); + } + else // use themed background by default + { + // create backing store + UpdateBgBrush(); + } + + // comctl32.dll 6.0 doesn't support non-top tabs with visual styles (the + // control is simply not rendered correctly), so we disable themes + // if possible, otherwise we simply clear the styles. + if ( HasTroubleWithNonTopTabs() && + (style & (wxBK_BOTTOM | wxBK_LEFT | wxBK_RIGHT)) ) + { + // check if we use themes at all -- if we don't, we're still okay + if ( wxUxThemeEngine::GetIfActive() ) + { + wxUxThemeEngine::GetIfActive()->SetWindowTheme(GetHwnd(), L"", L""); + + // correct the background color for the new non-themed control + SetBackgroundColour(GetThemeBackgroundColour()); + } + } +#endif // wxUSE_UXTHEME + + // Undocumented hack to get flat notebook style + // In fact, we should probably only do this in some + // curcumstances, i.e. if we know we will have a border + // at the bottom (the tab control doesn't draw it itself) +#if defined(__POCKETPC__) || defined(__SMARTPHONE__) + if (HasFlag(wxNB_FLAT)) + { + SendMessage(GetHwnd(), CCM_SETVERSION, COMCTL32_VERSION, 0); + if (!m_hasBgCol) + SetBackgroundColour(*wxWHITE); + } +#endif + return true; +} + +WXDWORD wxNotebook::MSWGetStyle(long style, WXDWORD *exstyle) const +{ + WXDWORD tabStyle = wxControl::MSWGetStyle(style, exstyle); + + tabStyle |= WS_TABSTOP | TCS_TABS; + + if ( style & wxNB_MULTILINE ) + tabStyle |= TCS_MULTILINE; + if ( style & wxNB_FIXEDWIDTH ) + tabStyle |= TCS_FIXEDWIDTH; + + if ( style & wxBK_BOTTOM ) + tabStyle |= TCS_RIGHT; + else if ( style & wxBK_LEFT ) + tabStyle |= TCS_VERTICAL; + else if ( style & wxBK_RIGHT ) + tabStyle |= TCS_VERTICAL | TCS_RIGHT; + + if ( exstyle ) + { + // note that we never want to have the default WS_EX_CLIENTEDGE style + // as it looks too ugly for the notebooks + *exstyle &= ~WS_EX_CLIENTEDGE; + } + + return tabStyle; +} + +wxNotebook::~wxNotebook() +{ +#if wxUSE_UXTHEME + if ( m_hbrBackground ) + ::DeleteObject((HBRUSH)m_hbrBackground); +#endif // wxUSE_UXTHEME +} + +// ---------------------------------------------------------------------------- +// wxNotebook accessors +// ---------------------------------------------------------------------------- + +size_t wxNotebook::GetPageCount() const +{ + // consistency check + wxASSERT( (int)m_pages.Count() == TabCtrl_GetItemCount(GetHwnd()) ); + + return m_pages.Count(); +} + +int wxNotebook::GetRowCount() const +{ + return TabCtrl_GetRowCount(GetHwnd()); +} + +int wxNotebook::SetSelection(size_t nPage) +{ + wxCHECK_MSG( IS_VALID_PAGE(nPage), wxNOT_FOUND, wxT("notebook page out of range") ); + + if ( m_nSelection == wxNOT_FOUND || nPage != (size_t)m_nSelection ) + { + if ( SendPageChangingEvent(nPage) ) + { + // program allows the page change + SendPageChangedEvent(m_nSelection, nPage); + + TabCtrl_SetCurSel(GetHwnd(), nPage); + } + } + + return m_nSelection; +} + +void wxNotebook::UpdateSelection(int selNew) +{ + if ( m_nSelection != wxNOT_FOUND ) + m_pages[m_nSelection]->Show(false); + + if ( selNew != wxNOT_FOUND ) + { + wxNotebookPage *pPage = m_pages[selNew]; + pPage->Show(true); + } + + // Changing the page should give the focus to it but, as per bug report + // http://sf.net/tracker/index.php?func=detail&aid=1150659&group_id=9863&atid=109863, + // we should not set the focus to it directly since it erroneously + // selects radio buttons and breaks keyboard handling for a notebook's + // scroll buttons. So give focus to the notebook and not the page. + + // but don't do this is the notebook is hidden + if ( ::IsWindowVisible(GetHwnd()) ) + SetFocus(); + + m_nSelection = selNew; +} + +int wxNotebook::ChangeSelection(size_t nPage) +{ + wxCHECK_MSG( IS_VALID_PAGE(nPage), wxNOT_FOUND, wxT("notebook page out of range") ); + + if ( m_nSelection == wxNOT_FOUND || nPage != (size_t)m_nSelection ) + { + TabCtrl_SetCurSel(GetHwnd(), nPage); + + UpdateSelection(nPage); + } + + return m_nSelection; +} + +bool wxNotebook::SetPageText(size_t nPage, const wxString& strText) +{ + wxCHECK_MSG( IS_VALID_PAGE(nPage), false, wxT("notebook page out of range") ); + + TC_ITEM tcItem; + tcItem.mask = TCIF_TEXT; + tcItem.pszText = (wxChar *)strText.c_str(); + + if ( !HasFlag(wxNB_MULTILINE) ) + return TabCtrl_SetItem(GetHwnd(), nPage, &tcItem) != 0; + + // multiline - we need to set new page size if a line is added or removed + int rows = GetRowCount(); + bool ret = TabCtrl_SetItem(GetHwnd(), nPage, &tcItem) != 0; + + if ( ret && rows != GetRowCount() ) + { + const wxRect r = GetPageSize(); + const size_t count = m_pages.Count(); + for ( size_t page = 0; page < count; page++ ) + m_pages[page]->SetSize(r); + } + + return ret; +} + +wxString wxNotebook::GetPageText(size_t nPage) const +{ + wxCHECK_MSG( IS_VALID_PAGE(nPage), wxEmptyString, wxT("notebook page out of range") ); + + wxChar buf[256]; + TC_ITEM tcItem; + tcItem.mask = TCIF_TEXT; + tcItem.pszText = buf; + tcItem.cchTextMax = WXSIZEOF(buf); + + wxString str; + if ( TabCtrl_GetItem(GetHwnd(), nPage, &tcItem) ) + str = tcItem.pszText; + + return str; +} + +int wxNotebook::GetPageImage(size_t nPage) const +{ + wxCHECK_MSG( IS_VALID_PAGE(nPage), wxNOT_FOUND, wxT("notebook page out of range") ); + + TC_ITEM tcItem; + tcItem.mask = TCIF_IMAGE; + + return TabCtrl_GetItem(GetHwnd(), nPage, &tcItem) ? tcItem.iImage + : wxNOT_FOUND; +} + +bool wxNotebook::SetPageImage(size_t nPage, int nImage) +{ + wxCHECK_MSG( IS_VALID_PAGE(nPage), false, wxT("notebook page out of range") ); + + TC_ITEM tcItem; + tcItem.mask = TCIF_IMAGE; + tcItem.iImage = nImage; + + return TabCtrl_SetItem(GetHwnd(), nPage, &tcItem) != 0; +} + +void wxNotebook::SetImageList(wxImageList* imageList) +{ + wxNotebookBase::SetImageList(imageList); + + if ( imageList ) + { + (void) TabCtrl_SetImageList(GetHwnd(), GetHimagelistOf(imageList)); + } +} + +// ---------------------------------------------------------------------------- +// wxNotebook size settings +// ---------------------------------------------------------------------------- + +wxRect wxNotebook::GetPageSize() const +{ + wxRect r; + + RECT rc; + ::GetClientRect(GetHwnd(), &rc); + + // This check is to work around a bug in TabCtrl_AdjustRect which will + // cause a crash on win2k or on XP with themes disabled if either + // wxNB_MULTILINE is used or tabs are placed on a side, if the rectangle + // is too small. + // + // The value of 20 is chosen arbitrarily but seems to work + if ( rc.right > 20 && rc.bottom > 20 ) + { + TabCtrl_AdjustRect(GetHwnd(), false, &rc); + + wxCopyRECTToRect(rc, r); + } + + return r; +} + +void wxNotebook::SetPageSize(const wxSize& size) +{ + // transform the page size into the notebook size + RECT rc; + rc.left = + rc.top = 0; + rc.right = size.x; + rc.bottom = size.y; + + TabCtrl_AdjustRect(GetHwnd(), true, &rc); + + // and now set it + SetSize(rc.right - rc.left, rc.bottom - rc.top); +} + +void wxNotebook::SetPadding(const wxSize& padding) +{ + TabCtrl_SetPadding(GetHwnd(), padding.x, padding.y); +} + +// Windows-only at present. Also, you must use the wxNB_FIXEDWIDTH +// style. +void wxNotebook::SetTabSize(const wxSize& sz) +{ + ::SendMessage(GetHwnd(), TCM_SETITEMSIZE, 0, MAKELPARAM(sz.x, sz.y)); +} + +wxSize wxNotebook::CalcSizeFromPage(const wxSize& sizePage) const +{ + // we can't use TabCtrl_AdjustRect here because it only works for wxNB_TOP + wxSize sizeTotal = sizePage; + + wxSize tabSize; + if ( GetPageCount() > 0 ) + { + RECT rect; + TabCtrl_GetItemRect(GetHwnd(), 0, &rect); + tabSize.x = rect.right - rect.left; + tabSize.y = rect.bottom - rect.top; + } + + const int rows = GetRowCount(); + + // add an extra margin in both directions + const int MARGIN = 8; + if ( IsVertical() ) + { + sizeTotal.x += MARGIN; + sizeTotal.y += tabSize.y * rows + MARGIN; + } + else // horizontal layout + { + sizeTotal.x += tabSize.x * rows + MARGIN; + sizeTotal.y += MARGIN; + } + + return sizeTotal; +} + +void wxNotebook::AdjustPageSize(wxNotebookPage *page) +{ + wxCHECK_RET( page, _T("NULL page in wxNotebook::AdjustPageSize") ); + + const wxRect r = GetPageSize(); + if ( !r.IsEmpty() ) + { + page->SetSize(r); + } +} + +// ---------------------------------------------------------------------------- +// wxNotebook operations +// ---------------------------------------------------------------------------- + +// remove one page from the notebook, without deleting +wxNotebookPage *wxNotebook::DoRemovePage(size_t nPage) +{ + wxNotebookPage *pageRemoved = wxNotebookBase::DoRemovePage(nPage); + if ( !pageRemoved ) + return NULL; + + TabCtrl_DeleteItem(GetHwnd(), nPage); + + if ( m_pages.IsEmpty() ) + { + // no selection any more, the notebook becamse empty + m_nSelection = wxNOT_FOUND; + } + else // notebook still not empty + { + int selNew = TabCtrl_GetCurSel(GetHwnd()); + if ( selNew != wxNOT_FOUND ) + { + // No selection change, just refresh the current selection. + // Because it could be that the slection index changed + // we need to update it. + // Note: this does not mean the selection it self changed. + m_nSelection = selNew; + m_pages[m_nSelection]->Refresh(); + } + else if (int(nPage) == m_nSelection) + { + // The selection was deleted. + + // Determine new selection. + if (m_nSelection == int(GetPageCount())) + selNew = m_nSelection - 1; + else + selNew = m_nSelection; + + // m_nSelection must be always valid so reset it before calling + // SetSelection() + m_nSelection = wxNOT_FOUND; + SetSelection(selNew); + } + else + { + wxFAIL; // Windows did not behave ok. + } + } + + return pageRemoved; +} + +// remove all pages +bool wxNotebook::DeleteAllPages() +{ + size_t nPageCount = GetPageCount(); + size_t nPage; + for ( nPage = 0; nPage < nPageCount; nPage++ ) + delete m_pages[nPage]; + + m_pages.Clear(); + + TabCtrl_DeleteAllItems(GetHwnd()); + + m_nSelection = wxNOT_FOUND; + + InvalidateBestSize(); + return true; +} + +// same as AddPage() but does it at given position +bool wxNotebook::InsertPage(size_t nPage, + wxNotebookPage *pPage, + const wxString& strText, + bool bSelect, + int imageId) +{ + wxCHECK_MSG( pPage != NULL, false, _T("NULL page in wxNotebook::InsertPage") ); + wxCHECK_MSG( IS_VALID_PAGE(nPage) || nPage == GetPageCount(), false, + _T("invalid index in wxNotebook::InsertPage") ); + + wxASSERT_MSG( pPage->GetParent() == this, + _T("notebook pages must have notebook as parent") ); + + // add a new tab to the control + // ---------------------------- + + // init all fields to 0 + TC_ITEM tcItem; + wxZeroMemory(tcItem); + + // set the image, if any + if ( imageId != -1 ) + { + tcItem.mask |= TCIF_IMAGE; + tcItem.iImage = imageId; + } + + // and the text + if ( !strText.empty() ) + { + tcItem.mask |= TCIF_TEXT; + tcItem.pszText = (wxChar *)strText.c_str(); // const_cast + } + + // hide the page: unless it is selected, it shouldn't be shown (and if it + // is selected it will be shown later) + HWND hwnd = GetWinHwnd(pPage); + SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_VISIBLE); + + // this updates internal flag too -- otherwise it would get out of sync + // with the real state + pPage->Show(false); + + + // fit the notebook page to the tab control's display area: this should be + // done before adding it to the notebook or TabCtrl_InsertItem() will + // change the notebooks size itself! + AdjustPageSize(pPage); + + // finally do insert it + if ( TabCtrl_InsertItem(GetHwnd(), nPage, &tcItem) == -1 ) + { + wxLogError(wxT("Can't create the notebook page '%s'."), strText.c_str()); + + return false; + } + + // need to update the bg brush when the first page is added + // so the first panel gets the correct themed background + if ( m_pages.empty() ) + { +#if wxUSE_UXTHEME + UpdateBgBrush(); +#endif // wxUSE_UXTHEME + } + + // succeeded: save the pointer to the page + m_pages.Insert(pPage, nPage); + + // we may need to adjust the size again if the notebook size changed: + // normally this only happens for the first page we add (the tabs which + // hadn't been there before are now shown) but for a multiline notebook it + // can happen for any page at all as a new row could have been started + if ( m_pages.GetCount() == 1 || HasFlag(wxNB_MULTILINE) ) + { + AdjustPageSize(pPage); + } + + // now deal with the selection + // --------------------------- + + // if the inserted page is before the selected one, we must update the + // index of the selected page + if ( int(nPage) <= m_nSelection ) + { + // one extra page added + m_nSelection++; + } + + // some page should be selected: either this one or the first one if there + // is still no selection + int selNew = wxNOT_FOUND; + if ( bSelect ) + selNew = nPage; + else if ( m_nSelection == wxNOT_FOUND ) + selNew = 0; + + if ( selNew != wxNOT_FOUND ) + SetSelection(selNew); + + InvalidateBestSize(); + + return true; +} + +int wxNotebook::HitTest(const wxPoint& pt, long *flags) const +{ + TC_HITTESTINFO hitTestInfo; + hitTestInfo.pt.x = pt.x; + hitTestInfo.pt.y = pt.y; + int item = TabCtrl_HitTest(GetHwnd(), &hitTestInfo); + + if ( flags ) + { + *flags = 0; + + if ((hitTestInfo.flags & TCHT_NOWHERE) == TCHT_NOWHERE) + *flags |= wxBK_HITTEST_NOWHERE; + if ((hitTestInfo.flags & TCHT_ONITEM) == TCHT_ONITEM) + *flags |= wxBK_HITTEST_ONITEM; + if ((hitTestInfo.flags & TCHT_ONITEMICON) == TCHT_ONITEMICON) + *flags |= wxBK_HITTEST_ONICON; + if ((hitTestInfo.flags & TCHT_ONITEMLABEL) == TCHT_ONITEMLABEL) + *flags |= wxBK_HITTEST_ONLABEL; + if ( item == wxNOT_FOUND && GetPageSize().Contains(pt) ) + *flags |= wxBK_HITTEST_ONPAGE; + } + + return item; +} + +// ---------------------------------------------------------------------------- +// flicker-less notebook redraw +// ---------------------------------------------------------------------------- + +#if USE_NOTEBOOK_ANTIFLICKER + +// wnd proc for the spin button +LRESULT APIENTRY _EXPORT wxNotebookSpinBtnWndProc(HWND hwnd, + UINT message, + WPARAM wParam, + LPARAM lParam) +{ + if ( message == WM_ERASEBKGND ) + return 0; + + return ::CallWindowProc(CASTWNDPROC gs_wndprocNotebookSpinBtn, + hwnd, message, wParam, lParam); +} + +LRESULT APIENTRY _EXPORT wxNotebookWndProc(HWND hwnd, + UINT message, + WPARAM wParam, + LPARAM lParam) +{ + return ::CallWindowProc(CASTWNDPROC gs_wndprocNotebook, + hwnd, message, wParam, lParam); +} + +void wxNotebook::OnEraseBackground(wxEraseEvent& WXUNUSED(event)) +{ + // do nothing here +} + +void wxNotebook::OnPaint(wxPaintEvent& WXUNUSED(event)) +{ + wxPaintDC dc(this); + wxMemoryDC memdc; + RECT rc; + ::GetClientRect(GetHwnd(), &rc); + wxBitmap bmp(rc.right, rc.bottom); + memdc.SelectObject(bmp); + + const wxLayoutDirection dir = dc.GetLayoutDirection(); + memdc.SetLayoutDirection(dir); + + // if there is no special brush just use the solid background colour +#if wxUSE_UXTHEME + HBRUSH hbr = (HBRUSH)m_hbrBackground; +#else + HBRUSH hbr = 0; +#endif + wxBrush brush; + if ( !hbr ) + { + brush = wxBrush(GetBackgroundColour()); + hbr = GetHbrushOf(brush); + } + + ::FillRect(GetHdcOf(memdc), &rc, hbr); + + MSWDefWindowProc(WM_PAINT, (WPARAM)memdc.GetHDC(), 0); + + // For some reason in RTL mode, source offset has to be -1, otherwise the + // right border (physical) remains unpainted. + const wxCoord ofs = dir == wxLayout_RightToLeft ? -1 : 0; + dc.Blit(ofs, 0, rc.right, rc.bottom, &memdc, ofs, 0); +} + +#endif // USE_NOTEBOOK_ANTIFLICKER + +// ---------------------------------------------------------------------------- +// wxNotebook callbacks +// ---------------------------------------------------------------------------- + +void wxNotebook::OnSize(wxSizeEvent& event) +{ + if ( GetPageCount() == 0 ) + { + // Prevents droppings on resize, but does cause some flicker + // when there are no pages. + Refresh(); + event.Skip(); + return; + } +#ifndef __WXWINCE__ + else + { + // Without this, we can sometimes get droppings at the edges + // of a notebook, for example a notebook in a splitter window. + // This needs to be reconciled with the RefreshRect calls + // at the end of this function, which weren't enough to prevent + // the droppings. + + wxSize sz = GetClientSize(); + + // Refresh right side + wxRect rect(sz.x-4, 0, 4, sz.y); + RefreshRect(rect); + + // Refresh bottom side + rect = wxRect(0, sz.y-4, sz.x, 4); + RefreshRect(rect); + + // Refresh left side + rect = wxRect(0, 0, 4, sz.y); + RefreshRect(rect); + } +#endif // !__WXWINCE__ + + // fit all the notebook pages to the tab control's display area + + RECT rc; + rc.left = rc.top = 0; + GetSize((int *)&rc.right, (int *)&rc.bottom); + + // save the total size, we'll use it below + int widthNbook = rc.right - rc.left, + heightNbook = rc.bottom - rc.top; + + // there seems to be a bug in the implementation of TabCtrl_AdjustRect(): it + // returns completely false values for multiline tab controls after the tabs + // are added but before getting the first WM_SIZE (off by ~50 pixels, see + // + // http://sf.net/tracker/index.php?func=detail&aid=645323&group_id=9863&atid=109863 + // + // and the only work around I could find was this ugly hack... without it + // simply toggling the "multiline" checkbox in the notebook sample resulted + // in a noticeable page displacement + if ( HasFlag(wxNB_MULTILINE) ) + { + // avoid an infinite recursion: we get another notification too! + static bool s_isInOnSize = false; + + if ( !s_isInOnSize ) + { + s_isInOnSize = true; + SendMessage(GetHwnd(), WM_SIZE, SIZE_RESTORED, + MAKELPARAM(rc.right, rc.bottom)); + s_isInOnSize = false; + } + + // The best size depends on the number of rows of tabs, which can + // change when the notepad is resized. + InvalidateBestSize(); + } + +#if wxUSE_UXTHEME + // background bitmap size has changed, update the brush using it too + UpdateBgBrush(); +#endif // wxUSE_UXTHEME + + TabCtrl_AdjustRect(GetHwnd(), false, &rc); + + int width = rc.right - rc.left, + height = rc.bottom - rc.top; + size_t nCount = m_pages.Count(); + for ( size_t nPage = 0; nPage < nCount; nPage++ ) { + wxNotebookPage *pPage = m_pages[nPage]; + pPage->SetSize(rc.left, rc.top, width, height); + } + + + // unless we had already repainted everything, we now need to refresh + if ( !HasFlag(wxFULL_REPAINT_ON_RESIZE) ) + { + // invalidate areas not covered by pages + RefreshRect(wxRect(0, 0, widthNbook, rc.top), false); + RefreshRect(wxRect(0, rc.top, rc.left, height), false); + RefreshRect(wxRect(0, rc.bottom, widthNbook, heightNbook - rc.bottom), + false); + RefreshRect(wxRect(rc.right, rc.top, widthNbook - rc.right, height), + false); + } + +#if USE_NOTEBOOK_ANTIFLICKER + // subclass the spin control used by the notebook to scroll pages to + // prevent it from flickering on resize + if ( !m_hasSubclassedUpdown ) + { + // iterate over all child windows to find spin button + for ( HWND child = ::GetWindow(GetHwnd(), GW_CHILD); + child; + child = ::GetWindow(child, GW_HWNDNEXT) ) + { + wxWindow *childWindow = wxFindWinFromHandle((WXHWND)child); + + // see if it exists, if no wxWindow found then assume it's the spin + // btn + if ( !childWindow ) + { + // subclass the spin button to override WM_ERASEBKGND + if ( !gs_wndprocNotebookSpinBtn ) + gs_wndprocNotebookSpinBtn = (WXFARPROC)wxGetWindowProc(child); + + wxSetWindowProc(child, wxNotebookSpinBtnWndProc); + m_hasSubclassedUpdown = true; + break; + } + } + } +#endif // USE_NOTEBOOK_ANTIFLICKER + + event.Skip(); +} + +void wxNotebook::OnSelChange(wxNotebookEvent& event) +{ + // is it our tab control? + if ( event.GetEventObject() == this ) + { + UpdateSelection(event.GetSelection()); + } + + // we want to give others a chance to process this message as well + event.Skip(); +} + +void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) +{ + if ( event.IsWindowChange() ) { + // change pages + AdvanceSelection(event.GetDirection()); + } + else { + // we get this event in 3 cases + // + // a) one of our pages might have generated it because the user TABbed + // out from it in which case we should propagate the event upwards and + // our parent will take care of setting the focus to prev/next sibling + // + // or + // + // b) the parent panel wants to give the focus to us so that we + // forward it to our selected page. We can't deal with this in + // OnSetFocus() because we don't know which direction the focus came + // from in this case and so can't choose between setting the focus to + // first or last panel child + // + // or + // + // c) we ourselves (see MSWTranslateMessage) generated the event + // + wxWindow * const parent = GetParent(); + + // the wxObject* casts are required to avoid MinGW GCC 2.95.3 ICE + const bool isFromParent = event.GetEventObject() == (wxObject*) parent; + const bool isFromSelf = event.GetEventObject() == (wxObject*) this; + + if ( isFromParent || isFromSelf ) + { + // no, it doesn't come from child, case (b) or (c): forward to a + // page but only if direction is backwards (TAB) or from ourselves, + if ( m_nSelection != wxNOT_FOUND && + (!event.GetDirection() || isFromSelf) ) + { + // so that the page knows that the event comes from it's parent + // and is being propagated downwards + event.SetEventObject(this); + + wxWindow *page = m_pages[m_nSelection]; + if ( !page->GetEventHandler()->ProcessEvent(event) ) + { + page->SetFocus(); + } + //else: page manages focus inside it itself + } + else // otherwise set the focus to the notebook itself + { + SetFocus(); + } + } + else + { + // it comes from our child, case (a), pass to the parent, but only + // if the direction is forwards. Otherwise set the focus to the + // notebook itself. The notebook is always the 'first' control of a + // page. + if ( !event.GetDirection() ) + { + SetFocus(); + } + else if ( parent ) + { + event.SetCurrentFocus(this); + parent->GetEventHandler()->ProcessEvent(event); + } + } + } +} + +#if wxUSE_UXTHEME + +bool wxNotebook::DoDrawBackground(WXHDC hDC, wxWindow *child) +{ + wxUxThemeHandle theme(child ? child : this, L"TAB"); + if ( !theme ) + return false; + + // get the notebook client rect (we're not interested in drawing tabs + // themselves) + wxRect r = GetPageSize(); + if ( r.IsEmpty() ) + return false; + + RECT rc; + wxCopyRectToRECT(r, rc); + + // map rect to the coords of the window we're drawing in + if ( child ) + ::MapWindowPoints(GetHwnd(), GetHwndOf(child), (POINT *)&rc, 2); + + // we have the content area (page size), but we need to draw all of the + // background for it to be aligned correctly + wxUxThemeEngine::Get()->GetThemeBackgroundExtent + ( + theme, + (HDC) hDC, + 9 /* TABP_PANE */, + 0, + &rc, + &rc + ); + wxUxThemeEngine::Get()->DrawThemeBackground + ( + theme, + (HDC) hDC, + 9 /* TABP_PANE */, + 0, + &rc, + NULL + ); + + return true; +} + +WXHBRUSH wxNotebook::QueryBgBitmap() +{ + wxRect r = GetPageSize(); + if ( r.IsEmpty() ) + return 0; + + WindowHDC hDC(GetHwnd()); + MemoryHDC hDCMem(hDC); + CompatibleBitmap hBmp(hDC, r.x + r.width, r.y + r.height); + + SelectInHDC selectBmp(hDCMem, hBmp); + + if ( !DoDrawBackground((WXHDC)(HDC)hDCMem) ) + return 0; + + return (WXHBRUSH)::CreatePatternBrush(hBmp); +} + +void wxNotebook::UpdateBgBrush() +{ + if ( m_hbrBackground ) + ::DeleteObject((HBRUSH)m_hbrBackground); + + if ( !m_hasBgCol && wxUxThemeEngine::GetIfActive() ) + { + m_hbrBackground = QueryBgBitmap(); + } + else // no themes or we've got user-defined solid colour + { + m_hbrBackground = NULL; + } +} + +WXHBRUSH wxNotebook::MSWGetBgBrushForChild(WXHDC hDC, WXHWND hWnd) +{ + if ( m_hbrBackground ) + { + // before drawing with the background brush, we need to position it + // correctly + RECT rc; + ::GetWindowRect((HWND)hWnd, &rc); + + ::MapWindowPoints(NULL, GetHwnd(), (POINT *)&rc, 1); + + if ( !::SetBrushOrgEx((HDC)hDC, -rc.left, -rc.top, NULL) ) + { + wxLogLastError(_T("SetBrushOrgEx(notebook bg brush)")); + } + + return m_hbrBackground; + } + + return wxNotebookBase::MSWGetBgBrushForChild(hDC, hWnd); +} + +bool wxNotebook::MSWPrintChild(WXHDC hDC, wxWindow *child) +{ + // solid background colour overrides themed background drawing + if ( !UseBgCol() && DoDrawBackground(hDC, child) ) + return true; + + // If we're using a solid colour (for example if we've switched off + // theming for this notebook), paint it + if (UseBgCol()) + { + wxRect r = GetPageSize(); + if ( r.IsEmpty() ) + return false; + + RECT rc; + wxCopyRectToRECT(r, rc); + + // map rect to the coords of the window we're drawing in + if ( child ) + ::MapWindowPoints(GetHwnd(), GetHwndOf(child), (POINT *)&rc, 2); + + wxBrush brush(GetBackgroundColour()); + HBRUSH hbr = GetHbrushOf(brush); + + ::FillRect((HDC) hDC, &rc, hbr); + + return true; + } + + return wxNotebookBase::MSWPrintChild(hDC, child); +} + +#endif // wxUSE_UXTHEME + +// Windows only: attempts to get colour for UX theme page background +wxColour wxNotebook::GetThemeBackgroundColour() const +{ +#if wxUSE_UXTHEME + if (wxUxThemeEngine::Get()) + { + wxUxThemeHandle hTheme((wxNotebook*) this, L"TAB"); + if (hTheme) + { + // This is total guesswork. + // See PlatformSDK\Include\Tmschema.h for values. + // JACS: can also use 9 (TABP_PANE) + COLORREF themeColor; + bool success = (S_OK == wxUxThemeEngine::Get()->GetThemeColor( + hTheme, + 10 /* TABP_BODY */, + 1 /* NORMAL */, + 3821 /* FILLCOLORHINT */, + &themeColor)); + if (!success) + return GetBackgroundColour(); + + /* + [DS] Workaround for WindowBlinds: + Some themes return a near black theme color using FILLCOLORHINT, + this makes notebook pages have an ugly black background and makes + text (usually black) unreadable. Retry again with FILLCOLOR. + + This workaround potentially breaks appearance of some themes, + but in practice it already fixes some themes. + */ + if (themeColor == 1) + { + wxUxThemeEngine::Get()->GetThemeColor( + hTheme, + 10 /* TABP_BODY */, + 1 /* NORMAL */, + 3802 /* FILLCOLOR */, + &themeColor); + } + + wxColour colour = wxRGBToColour(themeColor); + + // Under Vista, the tab background colour is reported incorrectly. + // So for the default theme at least, hard-code the colour to something + // that will blend in. + + static int s_AeroStatus = -1; + if (s_AeroStatus == -1) + { + WCHAR szwThemeFile[1024]; + WCHAR szwThemeColor[256]; + if (S_OK == wxUxThemeEngine::Get()->GetCurrentThemeName(szwThemeFile, 1024, szwThemeColor, 256, NULL, 0)) + { + wxString themeFile(szwThemeFile), themeColor(szwThemeColor); + if (themeFile.Find(wxT("Aero")) != -1 && themeColor == wxT("NormalColor")) + s_AeroStatus = 1; + else + s_AeroStatus = 0; + } + else + s_AeroStatus = 0; + } + + if (s_AeroStatus == 1) + colour = wxColour(255, 255, 255); + + return colour; + } + } +#endif // wxUSE_UXTHEME + + return GetBackgroundColour(); +} + +// ---------------------------------------------------------------------------- +// wxNotebook base class virtuals +// ---------------------------------------------------------------------------- + +#if wxUSE_CONSTRAINTS + +// override these 2 functions to do nothing: everything is done in OnSize + +void wxNotebook::SetConstraintSizes(bool WXUNUSED(recurse)) +{ + // don't set the sizes of the pages - their correct size is not yet known + wxControl::SetConstraintSizes(false); +} + +bool wxNotebook::DoPhase(int WXUNUSED(nPhase)) +{ + return true; +} + +#endif // wxUSE_CONSTRAINTS + +// ---------------------------------------------------------------------------- +// wxNotebook Windows message handlers +// ---------------------------------------------------------------------------- + +bool wxNotebook::MSWOnScroll(int orientation, WXWORD nSBCode, + WXWORD pos, WXHWND control) +{ + // don't generate EVT_SCROLLWIN events for the WM_SCROLLs coming from the + // up-down control + if ( control ) + return false; + + return wxNotebookBase::MSWOnScroll(orientation, nSBCode, pos, control); +} + +bool wxNotebook::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM* result) +{ + wxNotebookEvent event(wxEVT_NULL, m_windowId); + + NMHDR* hdr = (NMHDR *)lParam; + switch ( hdr->code ) { + case TCN_SELCHANGE: + event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED); + break; + + case TCN_SELCHANGING: + event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING); + break; + + default: + return wxControl::MSWOnNotify(idCtrl, lParam, result); + } + + event.SetSelection(TabCtrl_GetCurSel(GetHwnd())); + event.SetOldSelection(m_nSelection); + event.SetEventObject(this); + event.SetInt(idCtrl); + + bool processed = GetEventHandler()->ProcessEvent(event); + *result = !event.IsAllowed(); + return processed; +} + +#endif // wxUSE_NOTEBOOK + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/installers/patch_wx28_win32s/src/msw/ole/automtn.cpp b/installers/patch_wx28_win32s/src/msw/ole/automtn.cpp new file mode 100644 index 0000000..59c769c --- /dev/null +++ b/installers/patch_wx28_win32s/src/msw/ole/automtn.cpp @@ -0,0 +1,971 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/msw/ole/automtn.cpp +// Purpose: OLE automation utilities +// Author: Julian Smart +// Modified by: +// Created: 11/6/98 +// RCS-ID: $Id: automtn.cpp 66913 2011-02-16 21:40:07Z JS $ +// Copyright: (c) 1998, Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#if defined(__BORLANDC__) + #pragma hdrstop +#endif + +// With Borland C++, all samples crash if this is compiled in. +#if (defined(__BORLANDC__) && (__BORLANDC__ < 0x520)) || defined(__CYGWIN10__) + #undef wxUSE_OLE_AUTOMATION + #define wxUSE_OLE_AUTOMATION 0 +#endif + +#if wxUSE_OLE_AUTOMATION + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/math.h" +#endif + +#define _FORCENAMELESSUNION +#include "wx/msw/private.h" +#include "wx/msw/ole/oleutils.h" +#include "wx/msw/ole/automtn.h" + +#ifdef __WXWINCE__ +#include "wx/msw/wince/time.h" +#else +#include +#endif + +#include +#include + +#include +#define _huge + +#ifndef __WXWINCE__ +#include +#endif + +#include + +#if wxUSE_DATETIME +#include "wx/datetime.h" +#endif // wxUSE_TIMEDATE + +static void ClearVariant(VARIANTARG *pvarg) ; +static void ReleaseVariant(VARIANTARG *pvarg) ; +// static void ShowException(LPOLESTR szMember, HRESULT hr, EXCEPINFO *pexcep, unsigned int uiArgErr); + +/* + * wxAutomationObject + */ + +wxAutomationObject::wxAutomationObject(WXIDISPATCH* dispatchPtr) +{ + m_dispatchPtr = dispatchPtr; +} + +wxAutomationObject::~wxAutomationObject() +{ + if (m_dispatchPtr) + { + ((IDispatch*)m_dispatchPtr)->Release(); + m_dispatchPtr = NULL; + } +} + +#define INVOKEARG(i) (args ? args[i] : *(ptrArgs[i])) + +// For Put/Get, no named arguments are allowed. +bool wxAutomationObject::Invoke(const wxString& member, int action, + wxVariant& retValue, int noArgs, wxVariant args[], const wxVariant* ptrArgs[]) const +{ + if (!m_dispatchPtr) + return false; + + // nonConstMember is necessary because the wxString class doesn't have enough consts... + wxString nonConstMember(member); + + int ch = nonConstMember.Find('.'); + if (ch != -1) + { + // Use dot notation to get the next object + wxString member2(nonConstMember.Left((size_t) ch)); + wxString rest(nonConstMember.Right(nonConstMember.length() - ch - 1)); + wxAutomationObject obj; + if (!GetObject(obj, member2)) + return false; + return obj.Invoke(rest, action, retValue, noArgs, args, ptrArgs); + } + + VARIANTARG vReturn; + ClearVariant(& vReturn); + + VARIANTARG* vReturnPtr = & vReturn; + + // Find number of names args + int namedArgCount = 0; + int i; + for (i = 0; i < noArgs; i++) + if (!INVOKEARG(i).GetName().IsNull()) + { + namedArgCount ++; + } + + int namedArgStringCount = namedArgCount + 1; + BSTR* argNames = new BSTR[namedArgStringCount]; + argNames[0] = wxConvertStringToOle(member); + + // Note that arguments are specified in reverse order + // (all totally logical; hey, we're dealing with OLE here.) + + int j = 0; + for (i = 0; i < namedArgCount; i++) + { + if (!INVOKEARG(i).GetName().IsNull()) + { + argNames[(namedArgCount-j)] = wxConvertStringToOle(INVOKEARG(i).GetName()); + j ++; + } + } + + // + 1 for the member name, + 1 again in case we're a 'put' + DISPID* dispIds = new DISPID[namedArgCount + 2]; + + HRESULT hr; + DISPPARAMS dispparams; + unsigned int uiArgErr; + EXCEPINFO excep; + + // Get the IDs for the member and its arguments. GetIDsOfNames expects the + // member name as the first name, followed by argument names (if any). + hr = ((IDispatch*)m_dispatchPtr)->GetIDsOfNames(IID_NULL, argNames, + 1 + namedArgCount, LOCALE_SYSTEM_DEFAULT, dispIds); + if (FAILED(hr)) + { +// ShowException(szMember, hr, NULL, 0); + delete[] argNames; + delete[] dispIds; + return false; + } + + // if doing a property put(ref), we need to adjust the first argument to have a + // named arg of DISPID_PROPERTYPUT. + if (action & (DISPATCH_PROPERTYPUT | DISPATCH_PROPERTYPUTREF)) + { + namedArgCount = 1; + dispIds[1] = DISPID_PROPERTYPUT; + vReturnPtr = (VARIANTARG*) NULL; + } + + // Convert the wxVariants to VARIANTARGs + VARIANTARG* oleArgs = new VARIANTARG[noArgs]; + for (i = 0; i < noArgs; i++) + { + // Again, reverse args + if (!wxConvertVariantToOle(INVOKEARG((noArgs-1) - i), oleArgs[i])) + { + delete[] argNames; + delete[] dispIds; + delete[] oleArgs; + return false; + } + } + + dispparams.rgdispidNamedArgs = dispIds + 1; + dispparams.rgvarg = oleArgs; + dispparams.cArgs = noArgs; + dispparams.cNamedArgs = namedArgCount; + + excep.pfnDeferredFillIn = NULL; + + hr = ((IDispatch*)m_dispatchPtr)->Invoke(dispIds[0], IID_NULL, LOCALE_SYSTEM_DEFAULT, + (WORD)action, &dispparams, vReturnPtr, &excep, &uiArgErr); + + for (i = 0; i < namedArgStringCount; i++) + { + SysFreeString(argNames[i]); + } + delete[] argNames; + delete[] dispIds; + + for (i = 0; i < noArgs; i++) + ReleaseVariant(& oleArgs[i]) ; + delete[] oleArgs; + + if (FAILED(hr)) + { + // display the exception information if appropriate: +// ShowException((const char*) member, hr, &excep, uiArgErr); + + // free exception structure information + SysFreeString(excep.bstrSource); + SysFreeString(excep.bstrDescription); + SysFreeString(excep.bstrHelpFile); + + if (vReturnPtr) + ReleaseVariant(vReturnPtr); + return false; + } + else + { + if (vReturnPtr) + { + // Convert result to wxVariant form + wxConvertOleToVariant(vReturn, retValue); + // Mustn't release the dispatch pointer + if (vReturn.vt == VT_DISPATCH) + { + vReturn.pdispVal = (IDispatch*) NULL; + } + ReleaseVariant(& vReturn); + } + } + return true; +} + +// Invoke a member function +wxVariant wxAutomationObject::CallMethod(const wxString& member, int noArgs, wxVariant args[]) +{ + wxVariant retVariant; + if (!Invoke(member, DISPATCH_METHOD, retVariant, noArgs, args)) + { + retVariant.MakeNull(); + } + return retVariant; +} + +wxVariant wxAutomationObject::CallMethodArray(const wxString& member, int noArgs, const wxVariant **args) +{ + wxVariant retVariant; + if (!Invoke(member, DISPATCH_METHOD, retVariant, noArgs, NULL, args)) + { + retVariant.MakeNull(); + } + return retVariant; +} + +wxVariant wxAutomationObject::CallMethod(const wxString& member, + const wxVariant& arg1, const wxVariant& arg2, + const wxVariant& arg3, const wxVariant& arg4, + const wxVariant& arg5, const wxVariant& arg6) +{ + const wxVariant** args = new const wxVariant*[6]; + int i = 0; + if (!arg1.IsNull()) + { + args[i] = & arg1; + i ++; + } + if (!arg2.IsNull()) + { + args[i] = & arg2; + i ++; + } + if (!arg3.IsNull()) + { + args[i] = & arg3; + i ++; + } + if (!arg4.IsNull()) + { + args[i] = & arg4; + i ++; + } + if (!arg5.IsNull()) + { + args[i] = & arg5; + i ++; + } + if (!arg6.IsNull()) + { + args[i] = & arg6; + i ++; + } + wxVariant retVariant; + if (!Invoke(member, DISPATCH_METHOD, retVariant, i, NULL, args)) + { + retVariant.MakeNull(); + } + delete[] args; + return retVariant; +} + +// Get/Set property +wxVariant wxAutomationObject::GetPropertyArray(const wxString& property, int noArgs, const wxVariant **args) const +{ + wxVariant retVariant; + if (!Invoke(property, DISPATCH_PROPERTYGET, retVariant, noArgs, NULL, args)) + { + retVariant.MakeNull(); + } + return retVariant; +} +wxVariant wxAutomationObject::GetProperty(const wxString& property, int noArgs, wxVariant args[]) const +{ + wxVariant retVariant; + if (!Invoke(property, DISPATCH_PROPERTYGET, retVariant, noArgs, args)) + { + retVariant.MakeNull(); + } + return retVariant; +} + +wxVariant wxAutomationObject::GetProperty(const wxString& property, + const wxVariant& arg1, const wxVariant& arg2, + const wxVariant& arg3, const wxVariant& arg4, + const wxVariant& arg5, const wxVariant& arg6) +{ + const wxVariant** args = new const wxVariant*[6]; + int i = 0; + if (!arg1.IsNull()) + { + args[i] = & arg1; + i ++; + } + if (!arg2.IsNull()) + { + args[i] = & arg2; + i ++; + } + if (!arg3.IsNull()) + { + args[i] = & arg3; + i ++; + } + if (!arg4.IsNull()) + { + args[i] = & arg4; + i ++; + } + if (!arg5.IsNull()) + { + args[i] = & arg5; + i ++; + } + if (!arg6.IsNull()) + { + args[i] = & arg6; + i ++; + } + wxVariant retVariant; + if (!Invoke(property, DISPATCH_PROPERTYGET, retVariant, i, NULL, args)) + { + retVariant.MakeNull(); + } + delete[] args; + return retVariant; +} + +bool wxAutomationObject::PutProperty(const wxString& property, int noArgs, wxVariant args[]) +{ + wxVariant retVariant; + if (!Invoke(property, DISPATCH_PROPERTYPUT, retVariant, noArgs, args)) + { + return false; + } + return true; +} + +bool wxAutomationObject::PutPropertyArray(const wxString& property, int noArgs, const wxVariant **args) +{ + wxVariant retVariant; + if (!Invoke(property, DISPATCH_PROPERTYPUT, retVariant, noArgs, NULL, args)) + { + return false; + } + return true; +} + +bool wxAutomationObject::PutProperty(const wxString& property, + const wxVariant& arg1, const wxVariant& arg2, + const wxVariant& arg3, const wxVariant& arg4, + const wxVariant& arg5, const wxVariant& arg6) +{ + const wxVariant** args = new const wxVariant*[6]; + int i = 0; + if (!arg1.IsNull()) + { + args[i] = & arg1; + i ++; + } + if (!arg2.IsNull()) + { + args[i] = & arg2; + i ++; + } + if (!arg3.IsNull()) + { + args[i] = & arg3; + i ++; + } + if (!arg4.IsNull()) + { + args[i] = & arg4; + i ++; + } + if (!arg5.IsNull()) + { + args[i] = & arg5; + i ++; + } + if (!arg6.IsNull()) + { + args[i] = & arg6; + i ++; + } + wxVariant retVariant; + bool ret = Invoke(property, DISPATCH_PROPERTYPUT, retVariant, i, NULL, args); + delete[] args; + return ret; +} + + +// Uses DISPATCH_PROPERTYGET +// and returns a dispatch pointer. The calling code should call Release +// on the pointer, though this could be implicit by constructing an wxAutomationObject +// with it and letting the destructor call Release. +WXIDISPATCH* wxAutomationObject::GetDispatchProperty(const wxString& property, int noArgs, wxVariant args[]) const +{ + wxVariant retVariant; + if (Invoke(property, DISPATCH_PROPERTYGET, retVariant, noArgs, args)) + { + if (retVariant.GetType() == wxT("void*")) + { + return (WXIDISPATCH*) retVariant.GetVoidPtr(); + } + } + + return (WXIDISPATCH*) NULL; +} + +// Uses DISPATCH_PROPERTYGET +// and returns a dispatch pointer. The calling code should call Release +// on the pointer, though this could be implicit by constructing an wxAutomationObject +// with it and letting the destructor call Release. +WXIDISPATCH* wxAutomationObject::GetDispatchProperty(const wxString& property, int noArgs, const wxVariant **args) const +{ + wxVariant retVariant; + if (Invoke(property, DISPATCH_PROPERTYGET, retVariant, noArgs, NULL, args)) + { + if (retVariant.GetType() == wxT("void*")) + { + return (WXIDISPATCH*) retVariant.GetVoidPtr(); + } + } + + return (WXIDISPATCH*) NULL; +} + + +// A way of initialising another wxAutomationObject with a dispatch object +bool wxAutomationObject::GetObject(wxAutomationObject& obj, const wxString& property, int noArgs, wxVariant args[]) const +{ + WXIDISPATCH* dispatch = GetDispatchProperty(property, noArgs, args); + if (dispatch) + { + obj.SetDispatchPtr(dispatch); + return true; + } + else + return false; +} + +// A way of initialising another wxAutomationObject with a dispatch object +bool wxAutomationObject::GetObject(wxAutomationObject& obj, const wxString& property, int noArgs, const wxVariant **args) const +{ + WXIDISPATCH* dispatch = GetDispatchProperty(property, noArgs, args); + if (dispatch) + { + obj.SetDispatchPtr(dispatch); + return true; + } + else + return false; +} + +// Get a dispatch pointer from the current object associated +// with a class id +bool wxAutomationObject::GetInstance(const wxString& classId) const +{ + if (m_dispatchPtr) + return false; + + CLSID clsId; + IUnknown * pUnk = NULL; + + wxBasicString unicodeName(classId.mb_str()); + + if (FAILED(CLSIDFromProgID((BSTR) unicodeName, &clsId))) + { + wxLogWarning(wxT("Cannot obtain CLSID from ProgID")); + return false; + } + + if (FAILED(GetActiveObject(clsId, NULL, &pUnk))) + { + wxLogWarning(wxT("Cannot find an active object")); + return false; + } + + if (pUnk->QueryInterface(IID_IDispatch, (LPVOID*) &m_dispatchPtr) != S_OK) + { + wxLogWarning(wxT("Cannot find IDispatch interface")); + return false; + } + + return true; +} + +// Get a dispatch pointer from a new object associated +// with the given class id +bool wxAutomationObject::CreateInstance(const wxString& classId) const +{ + if (m_dispatchPtr) + return false; + + CLSID clsId; + + wxBasicString unicodeName(classId.mb_str()); + + if (FAILED(CLSIDFromProgID((BSTR) unicodeName, &clsId))) + { + wxLogWarning(wxT("Cannot obtain CLSID from ProgID")); + return false; + } + + // get the server IDispatch interface + // + // NB: using CLSCTX_INPROC_HANDLER results in failure when getting + // Automation interface for Microsoft Office applications so don't use + // CLSCTX_ALL which includes it + if (FAILED(CoCreateInstance(clsId, NULL, CLSCTX_SERVER, IID_IDispatch, + (void**)&m_dispatchPtr))) + { + wxLogWarning(wxT("Cannot start an instance of this class.")); + return false; + } + + return true; +} + + +WXDLLEXPORT bool wxConvertVariantToOle(const wxVariant& variant, VARIANTARG& oleVariant) +{ + ClearVariant(&oleVariant); + if (variant.IsNull()) + { + oleVariant.vt = VT_NULL; + return true; + } + + wxString type(variant.GetType()); + + + if (type == wxT("long")) + { + oleVariant.vt = VT_I4; + oleVariant.lVal = variant.GetLong() ; + } + // cVal not always present +#ifndef __GNUWIN32__ + else if (type == wxT("char")) + { + oleVariant.vt=VT_I1; // Signed Char + oleVariant.cVal=variant.GetChar(); + } +#endif + else if (type == wxT("double")) + { + oleVariant.vt = VT_R8; + oleVariant.dblVal = variant.GetDouble(); + } + else if (type == wxT("bool")) + { + oleVariant.vt = VT_BOOL; + // 'bool' required for VC++ 4 apparently +#if (defined(__VISUALC__) && (__VISUALC__ <= 1000)) + oleVariant.bool = variant.GetBool(); +#else + oleVariant.boolVal = variant.GetBool(); +#endif + } + else if (type == wxT("string")) + { + wxString str( variant.GetString() ); + oleVariant.vt = VT_BSTR; + oleVariant.bstrVal = wxConvertStringToOle(str); + } +#if wxUSE_DATETIME + else if (type == wxT("datetime")) + { + wxDateTime date( variant.GetDateTime() ); + oleVariant.vt = VT_DATE; + + // we ought to use SystemTimeToVariantTime() here but this code is + // untested and hence currently disabled, please let us know if it + // works for you and we'll enable it +#if 0 + const wxDateTime::Tm tm(date.GetTm()); + + SYSTEMTIME st; + st.wYear = (WXWORD)tm.year; + st.wMonth = (WXWORD)(tm.mon - wxDateTime::Jan + 1); + st.wDay = tm.mday; + + st.wDayOfWeek = 0; + st.wHour = tm.hour; + st.wMinute = tm.min; + st.wSecond = tm.sec; + st.wMilliseconds = tm.msec; + + SystemTimeToVariantTime(&st, &oleVariant.date); +#else + long dosDateTime = date.GetAsDOS(); + short dosDate = short((dosDateTime & 0xFFFF0000) >> 16); + short dosTime = short(dosDateTime & 0xFFFF); + + DosDateTimeToVariantTime(dosDate, dosTime, & oleVariant.date); +#endif + } +#endif + else if (type == wxT("void*")) + { + oleVariant.vt = VT_DISPATCH; + oleVariant.pdispVal = (IDispatch*) variant.GetVoidPtr(); + } + else if (type == wxT("list") || type == wxT("stringlist")) + { + oleVariant.vt = VT_VARIANT | VT_ARRAY; + + SAFEARRAY *psa; + SAFEARRAYBOUND saBound; + VARIANTARG *pvargBase; + VARIANTARG *pvarg; + int i, j; + + int iCount = variant.GetCount(); + + saBound.lLbound = 0; + saBound.cElements = iCount; + + psa = SafeArrayCreate(VT_VARIANT, 1, &saBound); + if (psa == NULL) + return false; + + SafeArrayAccessData(psa, (void**)&pvargBase); + + pvarg = pvargBase; + for (i = 0; i < iCount; i++) + { + // copy each string in the list of strings + wxVariant eachVariant(variant[i]); + if (!wxConvertVariantToOle(eachVariant, * pvarg)) + { + // memory failure: back out and free strings alloc'ed up to + // now, and then the array itself. + pvarg = pvargBase; + for (j = 0; j < i; j++) + { + SysFreeString(pvarg->bstrVal); + pvarg++; + } + SafeArrayDestroy(psa); + return false; + } + pvarg++; + } + + SafeArrayUnaccessData(psa); + + oleVariant.parray = psa; + } + else + { + oleVariant.vt = VT_NULL; + return false; + } + return true; +} + +#ifndef VT_TYPEMASK +#define VT_TYPEMASK 0xfff +#endif + +WXDLLEXPORT bool wxConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant) +{ + switch (oleVariant.vt & VT_TYPEMASK) + { + case VT_BSTR: + { + wxString str(wxConvertStringFromOle(oleVariant.bstrVal)); + variant = str; + break; + } + case VT_DATE: + { +/* +#if wxUSE_DATETIME + SYSTEMTIME st; + VariantTimeToSystemTime(oleVariant.date, &st); + + wxDateTime date; + date.Set(st.wDay, + (wxDateTime::Month)(wxDateTime::Jan + st.wMonth - 1), + st.wYear, + st.wHour, + st.wMinute, + st.wSecond); + variant = date; +#endif +*/ + break; + } + case VT_I4: + { + variant = (long) oleVariant.lVal; + break; + } + case VT_I2: + { + variant = (long) oleVariant.iVal; + break; + } + + case VT_BOOL: + { +#if (defined(_MSC_VER) && (_MSC_VER <= 1000) && !defined(__MWERKS__) ) //GC +#ifndef HAVE_BOOL // Can't use bool operator if no native bool type + variant = (long) (oleVariant.bool != 0); +#else + variant = (bool) (oleVariant.bool != 0); +#endif +#else +#ifndef HAVE_BOOL // Can't use bool operator if no native bool type + variant = (long) (oleVariant.boolVal != 0); +#else + variant = (bool) (oleVariant.boolVal != 0); +#endif +#endif + break; + } + case VT_R8: + { + variant = oleVariant.dblVal; + break; + } + case VT_VARIANT: + // case VT_ARRAY: // This is masked out by VT_TYPEMASK + { + variant.ClearList(); + + int cDims, cElements, i; + VARIANTARG* pvdata; + + // Iterate the dimensions: number of elements is x*y*z + for (cDims = 0, cElements = 1; + cDims < oleVariant.parray->cDims; cDims ++) + cElements *= oleVariant.parray->rgsabound[cDims].cElements; + + // Get a pointer to the data + HRESULT hr = SafeArrayAccessData(oleVariant.parray, (void HUGEP* FAR*) & pvdata); + if (hr != NOERROR) + return false; + // Iterate the data. + for (i = 0; i < cElements; i++) + { + VARIANTARG& oleElement = pvdata[i]; + wxVariant vElement; + if (!wxConvertOleToVariant(oleElement, vElement)) + return false; + + variant.Append(vElement); + } + SafeArrayUnaccessData(oleVariant.parray); + break; + } + case VT_DISPATCH: + { + variant = (void*) oleVariant.pdispVal; + break; + } + case VT_NULL: + { + variant.MakeNull(); + break; + } + case VT_EMPTY: + { + break; // Ignore Empty Variant, used only during destruction of objects + } + default: + { + wxLogError(wxT("wxAutomationObject::ConvertOleToVariant: Unknown variant value type")); + return false; + } + } + return true; +} + +/* + * ClearVariant + * + * Zeros a variant structure without regard to current contents + */ +static void ClearVariant(VARIANTARG *pvarg) +{ + pvarg->vt = VT_EMPTY; + pvarg->wReserved1 = 0; + pvarg->wReserved2 = 0; + pvarg->wReserved3 = 0; + pvarg->lVal = 0; +} + +/* + * ReleaseVariant + * + * Clears a particular variant structure and releases any external objects + * or memory contained in the variant. Supports the data types listed above. + */ +static void ReleaseVariant(VARIANTARG *pvarg) +{ + VARTYPE vt; + VARIANTARG _huge *pvargArray; + LONG lLBound, lUBound, l; + + vt = (VARTYPE)(pvarg->vt & 0xfff); // mask off flags + + // check if an array. If so, free its contents, then the array itself. + if (V_ISARRAY(pvarg)) + { + // variant arrays are all this routine currently knows about. Since a + // variant can contain anything (even other arrays), call ourselves + // recursively. + if (vt == VT_VARIANT) + { + SafeArrayGetLBound(pvarg->parray, 1, &lLBound); + SafeArrayGetUBound(pvarg->parray, 1, &lUBound); + + if (lUBound > lLBound) + { + lUBound -= lLBound; + + SafeArrayAccessData(pvarg->parray, (void**)&pvargArray); + + for (l = 0; l < lUBound; l++) + { + ReleaseVariant(pvargArray); + pvargArray++; + } + + SafeArrayUnaccessData(pvarg->parray); + } + } + else + { + wxLogWarning(wxT("ReleaseVariant: Array contains non-variant type")); + } + + // Free the array itself. + SafeArrayDestroy(pvarg->parray); + } + else + { + switch (vt) + { + case VT_DISPATCH: + if (pvarg->pdispVal) + pvarg->pdispVal->Release(); + break; + + case VT_BSTR: + SysFreeString(pvarg->bstrVal); + break; + + case VT_I2: + case VT_I4: + case VT_BOOL: + case VT_R8: + case VT_ERROR: // to avoid erroring on an error return from Excel + case VT_EMPTY: + case VT_DATE: + // no work for these types + break; + + default: + wxLogWarning(wxT("ReleaseVariant: Unknown type")); + break; + } + } + + ClearVariant(pvarg); +} + +#if 0 + +void ShowException(LPOLESTR szMember, HRESULT hr, EXCEPINFO *pexcep, unsigned int uiArgErr) +{ + TCHAR szBuf[512]; + + switch (GetScode(hr)) + { + case DISP_E_UNKNOWNNAME: + wsprintf(szBuf, L"%s: Unknown name or named argument.", szMember); + break; + + case DISP_E_BADPARAMCOUNT: + wsprintf(szBuf, L"%s: Incorrect number of arguments.", szMember); + break; + + case DISP_E_EXCEPTION: + wsprintf(szBuf, L"%s: Error %d: ", szMember, pexcep->wCode); + if (pexcep->bstrDescription != NULL) + lstrcat(szBuf, pexcep->bstrDescription); + else + lstrcat(szBuf, L"<>"); + break; + + case DISP_E_MEMBERNOTFOUND: + wsprintf(szBuf, L"%s: method or property not found.", szMember); + break; + + case DISP_E_OVERFLOW: + wsprintf(szBuf, L"%s: Overflow while coercing argument values.", szMember); + break; + + case DISP_E_NONAMEDARGS: + wsprintf(szBuf, L"%s: Object implementation does not support named arguments.", + szMember); + break; + + case DISP_E_UNKNOWNLCID: + wsprintf(szBuf, L"%s: The locale ID is unknown.", szMember); + break; + + case DISP_E_PARAMNOTOPTIONAL: + wsprintf(szBuf, L"%s: Missing a required parameter.", szMember); + break; + + case DISP_E_PARAMNOTFOUND: + wsprintf(szBuf, L"%s: Argument not found, argument %d.", szMember, uiArgErr); + break; + + case DISP_E_TYPEMISMATCH: + wsprintf(szBuf, L"%s: Type mismatch, argument %d.", szMember, uiArgErr); + break; + + default: + wsprintf(szBuf, L"%s: Unknown error occurred.", szMember); + break; + } + + wxLogWarning(szBuf); +} + +#endif + +#endif // wxUSE_OLE_AUTOMATION diff --git a/installers/patch_wx28_win32s/src/msw/slider95.cpp b/installers/patch_wx28_win32s/src/msw/slider95.cpp new file mode 100644 index 0000000..0c349d6 --- /dev/null +++ b/installers/patch_wx28_win32s/src/msw/slider95.cpp @@ -0,0 +1,1246 @@ +#ifdef __BORLANDC__ +///////////////////////////////////////////////////////////////////////////// +// Name: slidermsw.cpp +// Purpose: wxSlider +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: slidrmsw.cpp,v 1.28 2003/08/09 12:46:30 VS Exp $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) +#pragma implementation "slider95.h" +#endif + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#include +#endif + +#include "wx/utils.h" +#include "wx/brush.h" +#include "wx/msw/slider95.h" +#include "wx/msw/private.h" + +IMPLEMENT_DYNAMIC_CLASS(wxSlider, wxControl) + +// Slider +wxSlider::wxSlider() +{ + m_staticValue = 0; + m_staticMin = 0; + m_staticMax = 0; + m_pageSize = 1; + m_lineSize = 1; + m_rangeMax = 0; + m_rangeMin = 0; +} + +bool wxSlider::Create(wxWindow *parent, wxWindowID id, + int value, int minValue, int maxValue, + const wxPoint& pos, + const wxSize& size, long style, + const wxValidator& validator, + const wxString& name) +{ + if ( (style & wxBORDER_MASK) == wxBORDER_DEFAULT ) + style |= wxBORDER_NONE; + + SetName(name); +#if wxUSE_VALIDATORS + SetValidator(validator); +#endif // wxUSE_VALIDATORS + + if (parent) parent->AddChild(this); + SetBackgroundColour(parent->GetBackgroundColour()) ; + SetForegroundColour(parent->GetForegroundColour()) ; + + m_staticValue = 0; + m_staticMin = 0; + m_staticMax = 0; + m_pageSize = 1; + m_lineSize = 1; + m_windowStyle = style; + + if ( id == -1 ) + m_windowId = (int)NewControlId(); + else + m_windowId = id; + + int x = pos.x; + int y = pos.y; + int width = size.x; + int height = size.y; + + // non-Win95 implementation + + long msStyle = SS_CENTER; + + WXDWORD exStyle = 0; + msStyle |= MSWGetStyle(GetWindowStyle(), & exStyle) ; + + m_staticValue = (WXHWND) CreateWindowEx(exStyle, wxT("STATIC"), NULL, + msStyle, + 0, 0, 0, 0, (HWND) parent->GetHWND(), (HMENU)NewControlId(), + wxGetInstance(), NULL); + + // Now create min static control + wxString buf; + buf.Printf(wxT("%d"), minValue); + DWORD wstyle = STATIC_FLAGS; + if ( m_windowStyle & wxCLIP_SIBLINGS ) + wstyle |= WS_CLIPSIBLINGS; + m_staticMin = (WXHWND) CreateWindowEx(0, wxT("STATIC"), buf, + wstyle, + 0, 0, 0, 0, (HWND) parent->GetHWND(), (HMENU)NewControlId(), + wxGetInstance(), NULL); + + msStyle = 0; + if (m_windowStyle & wxSL_VERTICAL) + msStyle = SBS_VERT | WS_CHILD | WS_VISIBLE | WS_TABSTOP ; + else + msStyle = SBS_HORZ | WS_CHILD | WS_VISIBLE | WS_TABSTOP ; + + HWND scroll_bar = CreateWindowEx(exStyle, wxT("SCROLLBAR"), wxEmptyString, + msStyle, + 0, 0, 0, 0, (HWND) parent->GetHWND(), (HMENU)m_windowId, + wxGetInstance(), NULL); + + m_pageSize = (int)((maxValue-minValue)/10); + m_rangeMax = maxValue; + m_rangeMin = minValue; + + ::SetScrollRange(scroll_bar, SB_CTL, minValue, maxValue, FALSE); + ::SetScrollPos(scroll_bar, SB_CTL, value, FALSE); + ShowWindow(scroll_bar, SW_SHOW); + + m_hWnd = (WXHWND)scroll_bar; + + // Subclass again for purposes of dialog editing mode + SubclassWin(GetHWND()); + + // Finally, create max value static item + buf.Printf(wxT("%d"), maxValue); + wstyle = STATIC_FLAGS; + if ( m_windowStyle & wxCLIP_SIBLINGS ) + wstyle |= WS_CLIPSIBLINGS; + m_staticMax = (WXHWND) CreateWindowEx(0, wxT("STATIC"), buf, + wstyle, + 0, 0, 0, 0, (HWND) parent->GetHWND(), (HMENU)NewControlId(), + wxGetInstance(), NULL); + + SetFont(parent->GetFont()); + + if (GetFont().Ok()) + { +// GetFont()->RealizeResource(); + if (GetFont().GetResourceHandle()) + { + if ( m_staticMin ) + SendMessage((HWND)m_staticMin,WM_SETFONT, + (WPARAM)GetFont().GetResourceHandle(),0L); + if ( m_staticMax ) + SendMessage((HWND)m_staticMax,WM_SETFONT, + (WPARAM)GetFont().GetResourceHandle(),0L); + if (m_staticValue) + SendMessage((HWND)m_staticValue,WM_SETFONT, + (WPARAM)GetFont().GetResourceHandle(),0L); + } + } + + SetSize(x, y, width, height); + SetValue(value); + + return TRUE; +} + +bool wxSlider::MSWOnScroll(int WXUNUSED(orientation), WXWORD wParam, + WXWORD pos, WXHWND control) +{ + int position = ::GetScrollPos((HWND)control, SB_CTL); + + int nScrollInc; + wxEventType scrollEvent = wxEVT_NULL; + switch ( wParam ) + { + case SB_TOP: + nScrollInc = m_rangeMax - position; + scrollEvent = wxEVT_SCROLL_TOP; + break; + + case SB_BOTTOM: + nScrollInc = - position; + scrollEvent = wxEVT_SCROLL_BOTTOM; + break; + + case SB_LINEUP: + nScrollInc = - GetLineSize(); + scrollEvent = wxEVT_SCROLL_LINEUP; + break; + + case SB_LINEDOWN: + nScrollInc = GetLineSize(); + scrollEvent = wxEVT_SCROLL_LINEDOWN; + break; + + case SB_PAGEUP: + nScrollInc = -GetPageSize(); + scrollEvent = wxEVT_SCROLL_PAGEUP; + break; + + case SB_PAGEDOWN: + nScrollInc = GetPageSize(); + scrollEvent = wxEVT_SCROLL_PAGEDOWN; + break; + + case SB_THUMBTRACK: + case SB_THUMBPOSITION: +#ifdef __WIN32__ + nScrollInc = (signed short)pos - position; +#else + nScrollInc = pos - position; +#endif + scrollEvent = wxEVT_SCROLL_THUMBTRACK; + break; + + default: + nScrollInc = 0; + } + + if (nScrollInc == 0) + { + // no event... + return FALSE; + } + + int newPos = position + nScrollInc; + + if ( (newPos < GetMin()) || (newPos > GetMax()) ) + { + // out of range - but we did process it + return TRUE; + } + + SetValue(newPos); + + wxScrollEvent event(scrollEvent, m_windowId); + event.SetPosition(newPos); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent(event); + + wxCommandEvent cevent( wxEVT_COMMAND_SLIDER_UPDATED, GetId() ); + cevent.SetInt( newPos ); + cevent.SetEventObject( this ); + + return GetEventHandler()->ProcessEvent( cevent ); +} + +wxSlider::~wxSlider() +{ + if (m_staticMin) + DestroyWindow((HWND) m_staticMin); + if (m_staticMax) + DestroyWindow((HWND) m_staticMax); + if (m_staticValue) + DestroyWindow((HWND) m_staticValue); +} + +int wxSlider::GetValue() const +{ + return ::GetScrollPos(GetHwnd(), SB_CTL); +} + +void wxSlider::SetValue(int value) +{ + ::SetScrollPos(GetHwnd(), SB_CTL, value, TRUE); + if (m_staticValue) + { + wxString buf; + buf.Printf(wxT("%d"), value); + SetWindowText((HWND) m_staticValue, buf); + } +} + +void wxSlider::GetSize(int *width, int *height) const +{ + RECT rect; + rect.left = -1; rect.right = -1; rect.top = -1; rect.bottom = -1; + + wxFindMaxSize(GetHWND(), &rect); + + if (m_staticMin) + wxFindMaxSize(m_staticMin, &rect); + if (m_staticMax) + wxFindMaxSize(m_staticMax, &rect); + if (m_staticValue) + wxFindMaxSize(m_staticValue, &rect); + + *width = rect.right - rect.left; + *height = rect.bottom - rect.top; +} + +void wxSlider::GetPosition(int *x, int *y) const +{ + wxWindow *parent = GetParent(); + RECT rect; + rect.left = -1; rect.right = -1; rect.top = -1; rect.bottom = -1; + + wxFindMaxSize(GetHWND(), &rect); + + if (m_staticMin) + wxFindMaxSize(m_staticMin, &rect); + if (m_staticMax) + wxFindMaxSize(m_staticMax, &rect); + if (m_staticValue) + wxFindMaxSize(m_staticValue, &rect); + + // Since we now have the absolute screen coords, + // if there's a parent we must subtract its top left corner + POINT point; + point.x = rect.left; + point.y = rect.top; + if (parent) + ::ScreenToClient((HWND) parent->GetHWND(), &point); + + // We may be faking the client origin. + // So a window that's really at (0, 30) may appear + // (to wxWin apps) to be at (0, 0). + if (GetParent()) + { + wxPoint pt(GetParent()->GetClientAreaOrigin()); + point.x -= pt.x; + point.y -= pt.y; + } + *x = point.x; + *y = point.y; +} + +// TODO one day, make sense of all this horros and replace it with a readable +// DoGetBestSize() +void wxSlider::DoSetSize(int x, int y, int width, int height, int sizeFlags) +{ + int x1 = x; + int y1 = y; + int w1 = width; + int h1 = height; + + int currentX, currentY; + GetPosition(¤tX, ¤tY); + if (x == -1 && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) + x1 = currentX; + if (y == -1 && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) + y1 = currentY; + + AdjustForParentClientOrigin(x1, y1, sizeFlags); + + wxChar buf[300]; + + int x_offset = x; + int y_offset = y; + + int cx; // slider,min,max sizes + int cy; + int cyf; + + wxGetCharSize(GetHWND(), &cx, &cy, this->GetFont()); + + if ((m_windowStyle & wxSL_VERTICAL) != wxSL_VERTICAL) + { + if ( m_windowStyle & wxSL_LABELS ) + { + int min_len = 0; + + GetWindowText((HWND) m_staticMin, buf, 300); + GetTextExtent(buf, &min_len, &cyf,NULL,NULL, & this->GetFont()); + + int max_len = 0; + + GetWindowText((HWND) m_staticMax, buf, 300); + GetTextExtent(buf, &max_len, &cyf,NULL,NULL, & this->GetFont()); + if (m_staticValue) + { + int new_width = (int)(wxMax(min_len, max_len)); + int valueHeight = (int)cyf; +#ifdef __WIN32__ + // For some reason, under Win95, the text edit control has + // a lot of space before the first character + new_width += 3*cx; +#endif + MoveWindow((HWND) m_staticValue, x_offset, y_offset, new_width, valueHeight, TRUE); + x_offset += new_width + cx; + } + + MoveWindow((HWND) m_staticMin, x_offset, y_offset, (int)min_len, cy, TRUE); + x_offset += (int)(min_len + cx); + + int slider_length = (int)(w1 - x_offset - max_len - cx); + + int slider_height = cy; + + // Slider must have a minimum/default length/height + if (slider_length < 100) + slider_length = 100; + + MoveWindow(GetHwnd(), x_offset, y_offset, slider_length, slider_height, TRUE); + x_offset += slider_length + cx; + + MoveWindow((HWND) m_staticMax, x_offset, y_offset, (int)max_len, cy, TRUE); + } + else + { + // No labels + if ( w1 < 0 ) + w1 = 200; + if ( h1 < 0 ) + h1 = 20; + MoveWindow(GetHwnd(), x1, y1, w1, h1, TRUE); + } + } + else + { + if ( m_windowStyle & wxSL_LABELS ) + { + int min_len; + GetWindowText((HWND) m_staticMin, buf, 300); + GetTextExtent(buf, &min_len, &cyf,NULL,NULL,& this->GetFont()); + + int max_len; + GetWindowText((HWND) m_staticMax, buf, 300); + GetTextExtent(buf, &max_len, &cyf,NULL,NULL, & this->GetFont()); + + if (m_staticValue) + { + int new_width = (int)(wxMax(min_len, max_len)); + int valueHeight = (int)cyf; +/*** Suggested change by George Tasker - remove this block... +#ifdef __WIN32__ + // For some reason, under Win95, the text edit control has + // a lot of space before the first character + new_width += 3*cx; +#endif + ... and replace with following line: */ + new_width += cx; + + MoveWindow((HWND) m_staticValue, x_offset, y_offset, new_width, valueHeight, TRUE); + y_offset += valueHeight; + } + + MoveWindow((HWND) m_staticMin, x_offset, y_offset, (int)min_len, cy, TRUE); + y_offset += cy; + + int slider_length = (int)(h1 - y_offset - cy - cy); + + // Use character height as an estimate of slider width (yes, width) + int slider_width = cy; + + // Slider must have a minimum/default length + if (slider_length < 100) + slider_length = 100; + + MoveWindow(GetHwnd(), x_offset, y_offset, slider_width, slider_length, TRUE); + y_offset += slider_length; + + MoveWindow((HWND) m_staticMax, x_offset, y_offset, (int)max_len, cy, TRUE); + } + else + { + // No labels + if ( w1 < 0 ) + w1 = 20; + if ( h1 < 0 ) + h1 = 200; + MoveWindow(GetHwnd(), x1, y1, w1, h1, TRUE); + } + } +} + +void wxSlider::SetRange(int minValue, int maxValue) +{ + m_rangeMin = minValue; + m_rangeMax = maxValue; + + ::SetScrollRange(GetHwnd(), SB_CTL, m_rangeMin, m_rangeMax, TRUE); + wxChar buf[40]; + if ( m_staticMin ) + { + wxSprintf(buf, wxT("%d"), m_rangeMin); + SetWindowText((HWND) m_staticMin, buf); + } + + if ( m_staticMax ) + { + wxSprintf(buf, wxT("%d"), m_rangeMax); + SetWindowText((HWND) m_staticMax, buf); + } +} + +/* +WXHBRUSH wxSlider::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor, + WXUINT message, WXWPARAM wParam, WXLPARAM lParam) +{ + if ( nCtlColor == CTLCOLOR_SCROLLBAR ) + return 0; + + // Otherwise, it's a static + return wxControl::OnCtlColor(pDC, pWnd, nCtlColor, message, wParam, lParam); +} +*/ + +void wxSlider::SetPageSize(int pageSize) +{ + m_pageSize = pageSize; +} + +int wxSlider::GetPageSize() const +{ + return m_pageSize; +} + +void wxSlider::SetLineSize(int lineSize) +{ + m_lineSize = lineSize; +} + +int wxSlider::GetLineSize() const +{ + return m_lineSize; +} + +// Not yet implemented +void wxSlider::SetThumbLength(int WXUNUSED(lenPixels)) +{ +} + +// Not yet implemented +int wxSlider::GetThumbLength() const +{ + return 0; +} + +bool wxSlider::ContainsHWND(WXHWND hWnd) const +{ + return ( hWnd == GetStaticMin() || hWnd == GetStaticMax() || hWnd == GetEditValue() ); +} + +void wxSlider::Command (wxCommandEvent & event) +{ + SetValue (event.GetInt()); + ProcessCommand (event); +} + +bool wxSlider::Show(bool show) +{ + wxWindow::Show(show); + + int cshow; + if (show) + cshow = SW_SHOW; + else + cshow = SW_HIDE; + + if(m_staticValue) + ShowWindow((HWND) m_staticValue, (BOOL)cshow); + if(m_staticMin) + ShowWindow((HWND) m_staticMin, (BOOL)cshow); + if(m_staticMax) + ShowWindow((HWND) m_staticMax, (BOOL)cshow); + return TRUE; +} +#endif +#ifndef __BORLANDC__ +///////////////////////////////////////////////////////////////////////////// +// Name: src/msw/slider.cpp +// Purpose: wxSlider, using the Win95 (and later) trackbar control +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: slider95.cpp 41054 2006-09-07 19:01:45Z ABX $ +// Copyright: (c) Julian Smart 1998 +// Vadim Zeitlin 2004 +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_SLIDER + +#include "wx/slider.h" + +#ifndef WX_PRECOMP + #include "wx/msw/wrapcctl.h" // include "properly" + #include "wx/brush.h" +#endif + +#include "wx/msw/subwin.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// indices of labels in wxSlider::m_labels +enum +{ + SliderLabel_Min, + SliderLabel_Max, + SliderLabel_Value, + SliderLabel_Last +}; + +// the gap between the slider and the labels, in pixels +static const int HGAP = 5; + +// ---------------------------------------------------------------------------- +// XTI +// ---------------------------------------------------------------------------- + +#if wxUSE_EXTENDED_RTTI +WX_DEFINE_FLAGS( wxSliderStyle ) + +wxBEGIN_FLAGS( wxSliderStyle ) + // new style border flags, we put them first to + // use them for streaming out + wxFLAGS_MEMBER(wxBORDER_SIMPLE) + wxFLAGS_MEMBER(wxBORDER_SUNKEN) + wxFLAGS_MEMBER(wxBORDER_DOUBLE) + wxFLAGS_MEMBER(wxBORDER_RAISED) + wxFLAGS_MEMBER(wxBORDER_STATIC) + wxFLAGS_MEMBER(wxBORDER_NONE) + + // old style border flags + wxFLAGS_MEMBER(wxSIMPLE_BORDER) + wxFLAGS_MEMBER(wxSUNKEN_BORDER) + wxFLAGS_MEMBER(wxDOUBLE_BORDER) + wxFLAGS_MEMBER(wxRAISED_BORDER) + wxFLAGS_MEMBER(wxSTATIC_BORDER) + wxFLAGS_MEMBER(wxBORDER) + + // standard window styles + wxFLAGS_MEMBER(wxTAB_TRAVERSAL) + wxFLAGS_MEMBER(wxCLIP_CHILDREN) + wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW) + wxFLAGS_MEMBER(wxWANTS_CHARS) + wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE) + wxFLAGS_MEMBER(wxALWAYS_SHOW_SB ) + wxFLAGS_MEMBER(wxVSCROLL) + wxFLAGS_MEMBER(wxHSCROLL) + + wxFLAGS_MEMBER(wxSL_HORIZONTAL) + wxFLAGS_MEMBER(wxSL_VERTICAL) + wxFLAGS_MEMBER(wxSL_AUTOTICKS) + wxFLAGS_MEMBER(wxSL_LABELS) + wxFLAGS_MEMBER(wxSL_LEFT) + wxFLAGS_MEMBER(wxSL_TOP) + wxFLAGS_MEMBER(wxSL_RIGHT) + wxFLAGS_MEMBER(wxSL_BOTTOM) + wxFLAGS_MEMBER(wxSL_BOTH) + wxFLAGS_MEMBER(wxSL_SELRANGE) + wxFLAGS_MEMBER(wxSL_INVERSE) + +wxEND_FLAGS( wxSliderStyle ) + +IMPLEMENT_DYNAMIC_CLASS_XTI(wxSlider, wxControl,"wx/slider.h") + +wxBEGIN_PROPERTIES_TABLE(wxSlider) + wxEVENT_RANGE_PROPERTY( Scroll , wxEVT_SCROLL_TOP , wxEVT_SCROLL_CHANGED , wxScrollEvent ) + wxEVENT_PROPERTY( Updated , wxEVT_COMMAND_SLIDER_UPDATED , wxCommandEvent ) + + wxPROPERTY( Value , int , SetValue, GetValue , 0, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY( Minimum , int , SetMin, GetMin, 0 , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY( Maximum , int , SetMax, GetMax, 0 , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY( PageSize , int , SetPageSize, GetLineSize, 1 , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY( LineSize , int , SetLineSize, GetLineSize, 1 , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY( ThumbLength , int , SetThumbLength, GetThumbLength, 1 , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY_FLAGS( WindowStyle , wxSliderStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style +wxEND_PROPERTIES_TABLE() + +wxBEGIN_HANDLERS_TABLE(wxSlider) +wxEND_HANDLERS_TABLE() + +wxCONSTRUCTOR_8( wxSlider , wxWindow* , Parent , wxWindowID , Id , int , Value , int , Minimum , int , Maximum , wxPoint , Position , wxSize , Size , long , WindowStyle ) +#else +IMPLEMENT_DYNAMIC_CLASS(wxSlider, wxControl) +#endif + +// ============================================================================ +// wxSlider implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// construction +// ---------------------------------------------------------------------------- + +void wxSlider::Init() +{ + m_labels = NULL; + + m_pageSize = 1; + m_lineSize = 1; + m_rangeMax = 0; + m_rangeMin = 0; + m_tickFreq = 0; + + m_isDragging = false; +} + +bool +wxSlider::Create(wxWindow *parent, + wxWindowID id, + int value, + int minValue, + int maxValue, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name) +{ + // our styles are redundant: wxSL_LEFT/RIGHT imply wxSL_VERTICAL and + // wxSL_TOP/BOTTOM imply wxSL_HORIZONTAL, but for backwards compatibility + // reasons we can't really change it, instead try to infer the orientation + // from the flags given to us here + switch ( style & (wxSL_LEFT | wxSL_RIGHT | wxSL_TOP | wxSL_BOTTOM) ) + { + case wxSL_LEFT: + case wxSL_RIGHT: + style |= wxSL_VERTICAL; + break; + + case wxSL_TOP: + case wxSL_BOTTOM: + style |= wxSL_HORIZONTAL; + break; + + case 0: + // no specific direction, do we have at least the orientation? + if ( !(style & (wxSL_HORIZONTAL | wxSL_VERTICAL)) ) + { + // no, choose default + style |= wxSL_BOTTOM | wxSL_HORIZONTAL; + } + }; + + wxASSERT_MSG( !(style & wxSL_VERTICAL) || !(style & wxSL_HORIZONTAL), + _T("incompatible slider direction and orientation") ); + + + // initialize everything + if ( !CreateControl(parent, id, pos, size, style, validator, name) ) + return false; + + // ensure that we have correct values for GetLabelsSize() + m_rangeMin = minValue; + m_rangeMax = maxValue; + + // create the labels first, so that our DoGetBestSize() could take them + // into account + // + // note that we could simply create 3 wxStaticTexts here but it could + // result in some observable side effects at wx level (e.g. the parent of + // wxSlider would have 3 more children than expected) and so we prefer not + // to do it like this + if ( m_windowStyle & wxSL_LABELS ) + { + m_labels = new wxSubwindows(SliderLabel_Last); + + HWND hwndParent = GetHwndOf(parent); + for ( size_t n = 0; n < SliderLabel_Last; n++ ) + { + (*m_labels)[n] = ::CreateWindow + ( + wxT("STATIC"), + NULL, + WS_CHILD | WS_VISIBLE | SS_CENTER, + 0, 0, 0, 0, + hwndParent, + (HMENU)NewControlId(), + wxGetInstance(), + NULL + ); + } + + m_labels->SetFont(GetFont()); + } + + // now create the main control too + if ( !MSWCreateControl(TRACKBAR_CLASS, wxEmptyString, pos, size) ) + return false; + + // and initialize everything + SetRange(minValue, maxValue); + SetValue(value); + SetPageSize((maxValue - minValue)/10); + + // we need to position the labels correctly if we have them and if + // SetSize() hadn't been called before (when best size was determined by + // MSWCreateControl()) as in this case they haven't been put in place yet + if ( m_labels && size.x != wxDefaultCoord && size.y != wxDefaultCoord ) + { + SetSize(size); + } + + return true; +} + +WXDWORD wxSlider::MSWGetStyle(long style, WXDWORD *exstyle) const +{ + WXDWORD msStyle = wxControl::MSWGetStyle(style, exstyle); + + // TBS_HORZ, TBS_RIGHT and TBS_BOTTOM are 0 but do include them for clarity + msStyle |= style & wxSL_VERTICAL ? TBS_VERT : TBS_HORZ; + + if ( style & wxSL_BOTH ) + { + // this fully specifies the style combined with TBS_VERT/HORZ above + msStyle |= TBS_BOTH; + } + else // choose one direction + { + if ( style & wxSL_LEFT ) + msStyle |= TBS_LEFT; + else if ( style & wxSL_RIGHT ) + msStyle |= TBS_RIGHT; + else if ( style & wxSL_TOP ) + msStyle |= TBS_TOP; + else if ( style & wxSL_BOTTOM ) + msStyle |= TBS_BOTTOM; + } + + if ( style & wxSL_AUTOTICKS ) + msStyle |= TBS_AUTOTICKS; + else + msStyle |= TBS_NOTICKS; + + if ( style & wxSL_SELRANGE ) + msStyle |= TBS_ENABLESELRANGE; + + return msStyle; +} + +wxSlider::~wxSlider() +{ + delete m_labels; +} + +// ---------------------------------------------------------------------------- +// event handling +// ---------------------------------------------------------------------------- + +bool wxSlider::MSWOnScroll(int WXUNUSED(orientation), + WXWORD wParam, + WXWORD WXUNUSED(pos), + WXHWND control) +{ + wxEventType scrollEvent; + switch ( wParam ) + { + case SB_TOP: + scrollEvent = wxEVT_SCROLL_TOP; + break; + + case SB_BOTTOM: + scrollEvent = wxEVT_SCROLL_BOTTOM; + break; + + case SB_LINEUP: + scrollEvent = wxEVT_SCROLL_LINEUP; + break; + + case SB_LINEDOWN: + scrollEvent = wxEVT_SCROLL_LINEDOWN; + break; + + case SB_PAGEUP: + scrollEvent = wxEVT_SCROLL_PAGEUP; + break; + + case SB_PAGEDOWN: + scrollEvent = wxEVT_SCROLL_PAGEDOWN; + break; + + case SB_THUMBTRACK: + scrollEvent = wxEVT_SCROLL_THUMBTRACK; + m_isDragging = true; + break; + + case SB_THUMBPOSITION: + if ( m_isDragging ) + { + scrollEvent = wxEVT_SCROLL_THUMBRELEASE; + m_isDragging = false; + } + else + { + // this seems to only happen when the mouse wheel is used: in + // this case, as it might be unexpected to get THUMBRELEASE + // without preceding THUMBTRACKs, we don't generate it at all + // but generate CHANGED event because the control itself does + // not send us SB_ENDSCROLL for whatever reason when mouse + // wheel is used + scrollEvent = wxEVT_SCROLL_CHANGED; + } + break; + + case SB_ENDSCROLL: + scrollEvent = wxEVT_SCROLL_CHANGED; + break; + + default: + // unknown scroll event? + return false; + } + + int newPos = ValueInvertOrNot((int) ::SendMessage((HWND) control, TBM_GETPOS, 0, 0)); + if ( (newPos < GetMin()) || (newPos > GetMax()) ) + { + // out of range - but we did process it + return true; + } + + SetValue(newPos); + + wxScrollEvent event(scrollEvent, m_windowId); + event.SetPosition(newPos); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent(event); + + wxCommandEvent cevent( wxEVT_COMMAND_SLIDER_UPDATED, GetId() ); + cevent.SetInt( newPos ); + cevent.SetEventObject( this ); + + return GetEventHandler()->ProcessEvent( cevent ); +} + +void wxSlider::Command (wxCommandEvent & event) +{ + SetValue (event.GetInt()); + ProcessCommand (event); +} + +// ---------------------------------------------------------------------------- +// geometry stuff +// ---------------------------------------------------------------------------- + +wxRect wxSlider::GetBoundingBox() const +{ + // take care not to call our own functions which would call us recursively + int x, y, w, h; + wxSliderBase::DoGetPosition(&x, &y); + wxSliderBase::DoGetSize(&w, &h); + + wxRect rect(x, y, w, h); + if ( m_labels ) + { + wxRect lrect = m_labels->GetBoundingBox(); + GetParent()->ScreenToClient(&lrect.x, &lrect.y); + rect.Union(lrect); + } + + return rect; +} + +void wxSlider::DoGetSize(int *width, int *height) const +{ + wxRect rect = GetBoundingBox(); + + if ( width ) + *width = rect.width; + if ( height ) + *height = rect.height; +} + +void wxSlider::DoGetPosition(int *x, int *y) const +{ + wxRect rect = GetBoundingBox(); + + if ( x ) + *x = rect.x; + if ( y ) + *y = rect.y; +} + +int wxSlider::GetLabelsSize(int *width) const +{ + int cy; + + if ( width ) + { + // find the max label width + int wLabelMin, wLabelMax; + GetTextExtent(Format(m_rangeMin), &wLabelMin, &cy); + GetTextExtent(Format(m_rangeMax), &wLabelMax, &cy); + + *width = wxMax(wLabelMin, wLabelMax); + } + else + { + cy = GetCharHeight(); + } + + return EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy); +} + +void wxSlider::DoMoveWindow(int x, int y, int width, int height) +{ + // all complications below are because we need to position the labels, + // without them everything is easy + if ( !m_labels ) + { + wxSliderBase::DoMoveWindow(x, y, width, height); + return; + } + + // be careful to position the slider itself after moving the labels as + // otherwise our GetBoundingBox(), which is called from WM_SIZE handler, + // would return a wrong result and wrong size would be cached internally + if ( HasFlag(wxSL_VERTICAL) ) + { + int wLabel; + int hLabel = GetLabelsSize(&wLabel); + + int xLabel = HasFlag(wxSL_LEFT) ? x + width - wLabel : x; + + // position all labels: min at the top, value in the middle and max at + // the bottom + DoMoveSibling((HWND)(*m_labels)[SliderLabel_Min], + xLabel, y, wLabel, hLabel); + + DoMoveSibling((HWND)(*m_labels)[SliderLabel_Value], + xLabel, y + (height - hLabel)/2, wLabel, hLabel); + + DoMoveSibling((HWND)(*m_labels)[SliderLabel_Max], + xLabel, y + height - hLabel, wLabel, hLabel); + + // position the slider itself along the left/right edge + wxSliderBase::DoMoveWindow(HasFlag(wxSL_LEFT) ? x : x + wLabel + HGAP, + y + hLabel/2, + width - wLabel - HGAP, + height - hLabel); + } + else // horizontal + { + int wLabel; + int hLabel = GetLabelsSize(&wLabel); + + int yLabel = HasFlag(wxSL_TOP) ? y + height - hLabel : y; + + // position all labels: min on the left, value in the middle and max to + // the right + DoMoveSibling((HWND)(*m_labels)[SliderLabel_Min], + x, yLabel, wLabel, hLabel); + + DoMoveSibling((HWND)(*m_labels)[SliderLabel_Value], + x + (width - wLabel)/2, yLabel, wLabel, hLabel); + + DoMoveSibling((HWND)(*m_labels)[SliderLabel_Max], + x + width - wLabel, yLabel, wLabel, hLabel); + + // position the slider itself along the top/bottom edge + wxSliderBase::DoMoveWindow(x, + HasFlag(wxSL_TOP) ? y : y + hLabel, + width, + height - hLabel); + } +} + +wxSize wxSlider::DoGetBestSize() const +{ + // these values are arbitrary + static const int length = 100; + static const int thumb = 24; + static const int ticks = 8; + + int *width; + wxSize size; + if ( HasFlag(wxSL_VERTICAL) ) + { + size.x = thumb; + size.y = length; + width = &size.x; + + if ( m_labels ) + { + int wLabel; + int hLabel = GetLabelsSize(&wLabel); + + // account for the labels + size.x += HGAP + wLabel; + + // labels are indented relative to the slider itself + size.y += hLabel; + } + } + else // horizontal + { + size.x = length; + size.y = thumb; + width = &size.y; + + if ( m_labels ) + { + // labels add extra height + size.y += GetLabelsSize(); + } + } + + // need extra space to show ticks + if ( HasFlag(wxSL_TICKS) ) + { + *width += ticks; + + // and maybe twice as much if we show them on both sides + if ( HasFlag(wxSL_BOTH) ) + *width += ticks; + } + + return size; +} + +// ---------------------------------------------------------------------------- +// slider-specific methods +// ---------------------------------------------------------------------------- + +int wxSlider::GetValue() const +{ + return ValueInvertOrNot(::SendMessage(GetHwnd(), TBM_GETPOS, 0, 0)); +} + +void wxSlider::SetValue(int value) +{ + ::SendMessage(GetHwnd(), TBM_SETPOS, (WPARAM)TRUE, (LPARAM)ValueInvertOrNot(value)); + + if ( m_labels ) + { + ::SetWindowText((*m_labels)[SliderLabel_Value], Format(value)); + } +} + +void wxSlider::SetRange(int minValue, int maxValue) +{ + m_rangeMin = minValue; + m_rangeMax = maxValue; + + ::SendMessage(GetHwnd(), TBM_SETRANGEMIN, TRUE, m_rangeMin); + ::SendMessage(GetHwnd(), TBM_SETRANGEMAX, TRUE, m_rangeMax); + + if ( m_labels ) + { + ::SetWindowText((*m_labels)[SliderLabel_Min], Format(ValueInvertOrNot(m_rangeMin))); + ::SetWindowText((*m_labels)[SliderLabel_Max], Format(ValueInvertOrNot(m_rangeMax))); + } +} + +void wxSlider::SetTickFreq(int n, int pos) +{ + m_tickFreq = n; + ::SendMessage( GetHwnd(), TBM_SETTICFREQ, (WPARAM) n, (LPARAM) pos ); +} + +void wxSlider::SetPageSize(int pageSize) +{ + ::SendMessage( GetHwnd(), TBM_SETPAGESIZE, (WPARAM) 0, (LPARAM) pageSize ); + m_pageSize = pageSize; +} + +int wxSlider::GetPageSize() const +{ + return m_pageSize; +} + +void wxSlider::ClearSel() +{ + ::SendMessage(GetHwnd(), TBM_CLEARSEL, (WPARAM) TRUE, (LPARAM) 0); +} + +void wxSlider::ClearTicks() +{ + ::SendMessage(GetHwnd(), TBM_CLEARTICS, (WPARAM) TRUE, (LPARAM) 0); +} + +void wxSlider::SetLineSize(int lineSize) +{ + m_lineSize = lineSize; + ::SendMessage(GetHwnd(), TBM_SETLINESIZE, (WPARAM) 0, (LPARAM) lineSize); +} + +int wxSlider::GetLineSize() const +{ + return (int)::SendMessage(GetHwnd(), TBM_GETLINESIZE, 0, 0); +} + +int wxSlider::GetSelEnd() const +{ + return (int)::SendMessage(GetHwnd(), TBM_GETSELEND, 0, 0); +} + +int wxSlider::GetSelStart() const +{ + return (int)::SendMessage(GetHwnd(), TBM_GETSELSTART, 0, 0); +} + +void wxSlider::SetSelection(int minPos, int maxPos) +{ + ::SendMessage(GetHwnd(), TBM_SETSEL, + (WPARAM) TRUE /* redraw */, + (LPARAM) MAKELONG( minPos, maxPos) ); +} + +void wxSlider::SetThumbLength(int len) +{ + ::SendMessage(GetHwnd(), TBM_SETTHUMBLENGTH, (WPARAM) len, (LPARAM) 0); +} + +int wxSlider::GetThumbLength() const +{ + return (int)::SendMessage( GetHwnd(), TBM_GETTHUMBLENGTH, 0, 0); +} + +void wxSlider::SetTick(int tickPos) +{ + ::SendMessage( GetHwnd(), TBM_SETTIC, (WPARAM) 0, (LPARAM) tickPos ); +} + +// ---------------------------------------------------------------------------- +// composite control methods +// ---------------------------------------------------------------------------- + +WXHWND wxSlider::GetStaticMin() const +{ + return m_labels ? (WXHWND)(*m_labels)[SliderLabel_Min] : NULL; +} + +WXHWND wxSlider::GetStaticMax() const +{ + return m_labels ? (WXHWND)(*m_labels)[SliderLabel_Max] : NULL; +} + +WXHWND wxSlider::GetEditValue() const +{ + return m_labels ? (WXHWND)(*m_labels)[SliderLabel_Value] : NULL; +} + +WX_FORWARD_STD_METHODS_TO_SUBWINDOWS(wxSlider, wxSliderBase, m_labels) + +#endif // wxUSE_SLIDER + +#endif \ No newline at end of file diff --git a/installers/patch_wx28_win32s/src/msw/window.cpp b/installers/patch_wx28_win32s/src/msw/window.cpp new file mode 100644 index 0000000..c3df4f7 --- /dev/null +++ b/installers/patch_wx28_win32s/src/msw/window.cpp @@ -0,0 +1,6961 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/msw/window.cpp +// Purpose: wxWindowMSW +// Author: Julian Smart +// Modified by: VZ on 13.05.99: no more Default(), MSWOnXXX() reorganisation +// Created: 04/01/98 +// RCS-ID: $Id: window.cpp 66914 2011-02-16 21:44:15Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// =========================================================================== +// declarations +// =========================================================================== + +// --------------------------------------------------------------------------- +// headers +// --------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/window.h" + +#ifndef WX_PRECOMP + #include "wx/msw/wrapwin.h" + #include "wx/msw/wrapcctl.h" // include "properly" + #include "wx/msw/missing.h" + #include "wx/accel.h" + #include "wx/menu.h" + #include "wx/dc.h" + #include "wx/dcclient.h" + #include "wx/dcmemory.h" + #include "wx/utils.h" + #include "wx/app.h" + #include "wx/layout.h" + #include "wx/dialog.h" + #include "wx/frame.h" + #include "wx/listbox.h" + #include "wx/button.h" + #include "wx/msgdlg.h" + #include "wx/settings.h" + #include "wx/statbox.h" + #include "wx/sizer.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/textctrl.h" + #include "wx/menuitem.h" + #include "wx/module.h" +#endif + +#if wxUSE_OWNER_DRAWN && !defined(__WXUNIVERSAL__) + #include "wx/ownerdrw.h" +#endif + +#include "wx/evtloop.h" +#include "wx/power.h" +#include "wx/sysopt.h" + +#if wxUSE_DRAG_AND_DROP + #include "wx/dnd.h" +#endif + +#if wxUSE_ACCESSIBILITY + #include "wx/access.h" + #include + #include + #ifndef WM_GETOBJECT + #define WM_GETOBJECT 0x003D + #endif + #ifndef OBJID_CLIENT + #define OBJID_CLIENT 0xFFFFFFFC + #endif +#endif + +#include "wx/msw/private.h" + +#if wxUSE_TOOLTIPS + #include "wx/tooltip.h" +#endif + +#if wxUSE_CARET + #include "wx/caret.h" +#endif // wxUSE_CARET + +#if wxUSE_SPINCTRL + #include "wx/spinctrl.h" +#endif // wxUSE_SPINCTRL + +#include "wx/notebook.h" +#include "wx/listctrl.h" +#include "wx/dynlib.h" + +#include + +#if (!defined(__GNUWIN32_OLD__) && !defined(__WXMICROWIN__) /* && !defined(__WXWINCE__) */ ) || defined(__CYGWIN10__) + #include + #include +#endif + +#ifdef __WIN32__ + #include +#endif + +#if !defined __WXWINCE__ && !defined NEED_PBT_H + #include +#endif + +#if defined(__WXWINCE__) + #include "wx/msw/wince/missing.h" +#ifdef __POCKETPC__ + #include + #include + #include + #include +#endif +#endif + +#if wxUSE_UXTHEME + #include "wx/msw/uxtheme.h" + #define EP_EDITTEXT 1 + #define ETS_NORMAL 1 + #define ETS_HOT 2 + #define ETS_SELECTED 3 + #define ETS_DISABLED 4 + #define ETS_FOCUSED 5 + #define ETS_READONLY 6 + #define ETS_ASSIST 7 +#endif + +#if defined(TME_LEAVE) && defined(WM_MOUSELEAVE) && wxUSE_DYNLIB_CLASS + #if defined(WINVER) && WINVER >= 0x0500 + //#define HAVE_TRACKMOUSEEVENT // permanently commented out, tried to use winver but doesn't seem to detect it? + #endif +#endif // everything needed for TrackMouseEvent() + +// if this is set to 1, we use deferred window sizing to reduce flicker when +// resizing complicated window hierarchies, but this can in theory result in +// different behaviour than the old code so we keep the possibility to use it +// by setting this to 0 (in the future this should be removed completely) +#ifdef __WXWINCE__ +#define USE_DEFERRED_SIZING 0 +#else +#define USE_DEFERRED_SIZING 1 +#endif + +// set this to 1 to filter out duplicate mouse events, e.g. mouse move events +// when mouse position didnd't change +#ifdef __WXWINCE__ + #define wxUSE_MOUSEEVENT_HACK 0 +#else + #define wxUSE_MOUSEEVENT_HACK 1 +#endif + +// --------------------------------------------------------------------------- +// global variables +// --------------------------------------------------------------------------- + +#if wxUSE_MENUS_NATIVE +wxMenu *wxCurrentPopupMenu = NULL; +#endif // wxUSE_MENUS_NATIVE + +#ifdef __WXWINCE__ +extern wxChar *wxCanvasClassName; +#else +extern const wxChar *wxCanvasClassName; +#endif + +// true if we had already created the std colour map, used by +// wxGetStdColourMap() and wxWindow::OnSysColourChanged() (FIXME-MT) +static bool gs_hasStdCmap = false; + +// last mouse event information we need to filter out the duplicates +#if wxUSE_MOUSEEVENT_HACK +static struct MouseEventInfoDummy +{ + // mouse position (in screen coordinates) + wxPoint pos; + + // last mouse event type + wxEventType type; +} gs_lastMouseEvent; +#endif // wxUSE_MOUSEEVENT_HACK + +// --------------------------------------------------------------------------- +// private functions +// --------------------------------------------------------------------------- + +// the window proc for all our windows +LRESULT WXDLLEXPORT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, + WPARAM wParam, LPARAM lParam); + + +#ifdef __WXDEBUG__ + const wxChar *wxGetMessageName(int message); +#endif //__WXDEBUG__ + +void wxRemoveHandleAssociation(wxWindowMSW *win); +extern void wxAssociateWinWithHandle(HWND hWnd, wxWindowMSW *win); +wxWindow *wxFindWinFromHandle(WXHWND hWnd); + +// get the text metrics for the current font +static TEXTMETRIC wxGetTextMetrics(const wxWindowMSW *win); + +#ifdef __WXWINCE__ +// find the window for the mouse event at the specified position +static wxWindowMSW *FindWindowForMouseEvent(wxWindowMSW *win, int *x, int *y); +#endif // __WXWINCE__ + +// wrapper around BringWindowToTop() API +static inline void wxBringWindowToTop(HWND hwnd) +{ +#ifdef __WXMICROWIN__ + // It seems that MicroWindows brings the _parent_ of the window to the top, + // which can be the wrong one. + + // activate (set focus to) specified window + ::SetFocus(hwnd); +#endif + + // raise top level parent to top of z order + if (!::SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE)) + { + wxLogLastError(_T("SetWindowPos")); + } +} + +#ifndef __WXWINCE__ + +// ensure that all our parent windows have WS_EX_CONTROLPARENT style +static void EnsureParentHasControlParentStyle(wxWindow *parent) +{ + /* + If we have WS_EX_CONTROLPARENT flag we absolutely *must* set it for our + parent as well as otherwise several Win32 functions using + GetNextDlgTabItem() to iterate over all controls such as + IsDialogMessage() or DefDlgProc() would enter an infinite loop: indeed, + all of them iterate over all the controls starting from the currently + focused one and stop iterating when they get back to the focus but + unless all parents have WS_EX_CONTROLPARENT bit set, they would never + get back to the initial (focused) window: as we do have this style, + GetNextDlgTabItem() will leave this window and continue in its parent, + but if the parent doesn't have it, it wouldn't recurse inside it later + on and so wouldn't have a chance of getting back to this window either. + */ + while ( parent && !parent->IsTopLevel() ) + { + LONG exStyle = ::GetWindowLong(GetHwndOf(parent), GWL_EXSTYLE); + if ( !(exStyle & WS_EX_CONTROLPARENT) ) + { + // force the parent to have this style + ::SetWindowLong(GetHwndOf(parent), GWL_EXSTYLE, + exStyle | WS_EX_CONTROLPARENT); + } + + parent = parent->GetParent(); + } +} + +#endif // !__WXWINCE__ + +#ifdef __WXWINCE__ +// On Windows CE, GetCursorPos can return an error, so use this function +// instead +bool GetCursorPosWinCE(POINT* pt) +{ + if (!GetCursorPos(pt)) + { + DWORD pos = GetMessagePos(); + pt->x = LOWORD(pos); + pt->y = HIWORD(pos); + } + return true; +} +#endif + +static wxBorder TranslateBorder(wxBorder border) +{ + if ( border == wxBORDER_THEME ) + { +#if defined(__POCKETPC__) || defined(__SMARTPHONE__) + return wxBORDER_SIMPLE; +#elif wxUSE_UXTHEME + if (wxUxThemeEngine::GetIfActive()) + return wxBORDER_THEME; +#endif + return wxBORDER_SUNKEN; + } + + return border; +} + +// --------------------------------------------------------------------------- +// event tables +// --------------------------------------------------------------------------- + +// in wxUniv/MSW this class is abstract because it doesn't have DoPopupMenu() +// method +#ifdef __WXUNIVERSAL__ + IMPLEMENT_ABSTRACT_CLASS(wxWindowMSW, wxWindowBase) +#else // __WXMSW__ +#if wxUSE_EXTENDED_RTTI + +// windows that are created from a parent window during its Create method, eg. spin controls in a calendar controls +// must never been streamed out separately otherwise chaos occurs. Right now easiest is to test for negative ids, as +// windows with negative ids never can be recreated anyway + +bool wxWindowStreamingCallback( const wxObject *object, wxWriter * , wxPersister * , wxxVariantArray & ) +{ + const wxWindow * win = dynamic_cast(object) ; + if ( win && win->GetId() < 0 ) + return false ; + return true ; +} + +IMPLEMENT_DYNAMIC_CLASS_XTI_CALLBACK(wxWindow, wxWindowBase,"wx/window.h", wxWindowStreamingCallback) + +// make wxWindowList known before the property is used + +wxCOLLECTION_TYPE_INFO( wxWindow* , wxWindowList ) ; + +template<> void wxCollectionToVariantArray( wxWindowList const &theList, wxxVariantArray &value) +{ + wxListCollectionToVariantArray( theList , value ) ; +} + +WX_DEFINE_FLAGS( wxWindowStyle ) + +wxBEGIN_FLAGS( wxWindowStyle ) + // new style border flags, we put them first to + // use them for streaming out + + wxFLAGS_MEMBER(wxBORDER_SIMPLE) + wxFLAGS_MEMBER(wxBORDER_SUNKEN) + wxFLAGS_MEMBER(wxBORDER_DOUBLE) + wxFLAGS_MEMBER(wxBORDER_RAISED) + wxFLAGS_MEMBER(wxBORDER_STATIC) + wxFLAGS_MEMBER(wxBORDER_NONE) + + // old style border flags + wxFLAGS_MEMBER(wxSIMPLE_BORDER) + wxFLAGS_MEMBER(wxSUNKEN_BORDER) + wxFLAGS_MEMBER(wxDOUBLE_BORDER) + wxFLAGS_MEMBER(wxRAISED_BORDER) + wxFLAGS_MEMBER(wxSTATIC_BORDER) + wxFLAGS_MEMBER(wxBORDER) + + // standard window styles + wxFLAGS_MEMBER(wxTAB_TRAVERSAL) + wxFLAGS_MEMBER(wxCLIP_CHILDREN) + wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW) + wxFLAGS_MEMBER(wxWANTS_CHARS) + wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE) + wxFLAGS_MEMBER(wxALWAYS_SHOW_SB ) + wxFLAGS_MEMBER(wxVSCROLL) + wxFLAGS_MEMBER(wxHSCROLL) + +wxEND_FLAGS( wxWindowStyle ) + +wxBEGIN_PROPERTIES_TABLE(wxWindow) + wxEVENT_PROPERTY( Close , wxEVT_CLOSE_WINDOW , wxCloseEvent) + wxEVENT_PROPERTY( Create , wxEVT_CREATE , wxWindowCreateEvent ) + wxEVENT_PROPERTY( Destroy , wxEVT_DESTROY , wxWindowDestroyEvent ) + // Always constructor Properties first + + wxREADONLY_PROPERTY( Parent,wxWindow*, GetParent, EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY( Id,wxWindowID, SetId, GetId, -1 /*wxID_ANY*/ , 0 /*flags*/ , wxT("Helpstring") , wxT("group") ) + wxPROPERTY( Position,wxPoint, SetPosition , GetPosition, wxDefaultPosition , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // pos + wxPROPERTY( Size,wxSize, SetSize, GetSize, wxDefaultSize , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // size + wxPROPERTY( WindowStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style + + // Then all relations of the object graph + + wxREADONLY_PROPERTY_COLLECTION( Children , wxWindowList , wxWindowBase* , GetWindowChildren , wxPROP_OBJECT_GRAPH /*flags*/ , wxT("Helpstring") , wxT("group")) + + // and finally all other properties + + wxPROPERTY( ExtraStyle , long , SetExtraStyle , GetExtraStyle , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // extstyle + wxPROPERTY( BackgroundColour , wxColour , SetBackgroundColour , GetBackgroundColour , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // bg + wxPROPERTY( ForegroundColour , wxColour , SetForegroundColour , GetForegroundColour , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // fg + wxPROPERTY( Enabled , bool , Enable , IsEnabled , wxxVariant((bool)true) , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY( Shown , bool , Show , IsShown , wxxVariant((bool)true) , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) +#if 0 + // possible property candidates (not in xrc) or not valid in all subclasses + wxPROPERTY( Title,wxString, SetTitle, GetTitle, wxEmptyString ) + wxPROPERTY( Font , wxFont , SetFont , GetWindowFont , ) + wxPROPERTY( Label,wxString, SetLabel, GetLabel, wxEmptyString ) + // MaxHeight, Width , MinHeight , Width + // TODO switch label to control and title to toplevels + + wxPROPERTY( ThemeEnabled , bool , SetThemeEnabled , GetThemeEnabled , ) + //wxPROPERTY( Cursor , wxCursor , SetCursor , GetCursor , ) + // wxPROPERTY( ToolTip , wxString , SetToolTip , GetToolTipText , ) + wxPROPERTY( AutoLayout , bool , SetAutoLayout , GetAutoLayout , ) + + + +#endif +wxEND_PROPERTIES_TABLE() + +wxBEGIN_HANDLERS_TABLE(wxWindow) +wxEND_HANDLERS_TABLE() + +wxCONSTRUCTOR_DUMMY(wxWindow) + +#else + IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxWindowBase) +#endif +#endif // __WXUNIVERSAL__/__WXMSW__ + +BEGIN_EVENT_TABLE(wxWindowMSW, wxWindowBase) + EVT_SYS_COLOUR_CHANGED(wxWindowMSW::OnSysColourChanged) + EVT_ERASE_BACKGROUND(wxWindowMSW::OnEraseBackground) +#ifdef __WXWINCE__ + EVT_INIT_DIALOG(wxWindowMSW::OnInitDialog) +#endif +END_EVENT_TABLE() + +// =========================================================================== +// implementation +// =========================================================================== + +// --------------------------------------------------------------------------- +// wxWindow utility functions +// --------------------------------------------------------------------------- + +// Find an item given the MS Windows id +wxWindow *wxWindowMSW::FindItem(long id) const +{ +#if wxUSE_CONTROLS + wxControl *item = wxDynamicCastThis(wxControl); + if ( item ) + { + // is it us or one of our "internal" children? + if ( item->GetId() == id +#ifndef __WXUNIVERSAL__ + || (item->GetSubcontrols().Index(id) != wxNOT_FOUND) +#endif // __WXUNIVERSAL__ + ) + { + return item; + } + } +#endif // wxUSE_CONTROLS + + wxWindowList::compatibility_iterator current = GetChildren().GetFirst(); + while (current) + { + wxWindow *childWin = current->GetData(); + + wxWindow *wnd = childWin->FindItem(id); + if ( wnd ) + return wnd; + + current = current->GetNext(); + } + + return NULL; +} + +// Find an item given the MS Windows handle +wxWindow *wxWindowMSW::FindItemByHWND(WXHWND hWnd, bool controlOnly) const +{ + wxWindowList::compatibility_iterator current = GetChildren().GetFirst(); + while (current) + { + wxWindow *parent = current->GetData(); + + // Do a recursive search. + wxWindow *wnd = parent->FindItemByHWND(hWnd); + if ( wnd ) + return wnd; + + if ( !controlOnly +#if wxUSE_CONTROLS + || parent->IsKindOf(CLASSINFO(wxControl)) +#endif // wxUSE_CONTROLS + ) + { + wxWindow *item = current->GetData(); + if ( item->GetHWND() == hWnd ) + return item; + else + { + if ( item->ContainsHWND(hWnd) ) + return item; + } + } + + current = current->GetNext(); + } + return NULL; +} + +// Default command handler +bool wxWindowMSW::MSWCommand(WXUINT WXUNUSED(param), WXWORD WXUNUSED(id)) +{ + return false; +} + +// ---------------------------------------------------------------------------- +// constructors and such +// ---------------------------------------------------------------------------- + +void wxWindowMSW::Init() +{ + // MSW specific + m_isBeingDeleted = false; + m_oldWndProc = NULL; + m_mouseInWindow = false; + m_lastKeydownProcessed = false; + + m_childrenDisabled = NULL; + m_frozenness = 0; + + m_hWnd = 0; + m_hDWP = 0; + + m_xThumbSize = 0; + m_yThumbSize = 0; + + m_pendingPosition = wxDefaultPosition; + m_pendingSize = wxDefaultSize; + +#ifdef __POCKETPC__ + m_contextMenuEnabled = false; +#endif +} + +// Destructor +wxWindowMSW::~wxWindowMSW() +{ + m_isBeingDeleted = true; + +#ifndef __WXUNIVERSAL__ + // VS: make sure there's no wxFrame with last focus set to us: + for ( wxWindow *win = GetParent(); win; win = win->GetParent() ) + { + wxTopLevelWindow *frame = wxDynamicCast(win, wxTopLevelWindow); + if ( frame ) + { + if ( frame->GetLastFocus() == this ) + { + frame->SetLastFocus(NULL); + } + + // apparently sometimes we can end up with our grand parent + // pointing to us as well: this is surely a bug in focus handling + // code but it's not clear where it happens so for now just try to + // fix it here by not breaking out of the loop + //break; + } + } +#endif // __WXUNIVERSAL__ + + // VS: destroy children first and _then_ detach *this from its parent. + // If we did it the other way around, children wouldn't be able + // find their parent frame (see above). + DestroyChildren(); + + if ( m_hWnd ) + { + // VZ: test temp removed to understand what really happens here + //if (::IsWindow(GetHwnd())) + { + if ( !::DestroyWindow(GetHwnd()) ) + wxLogLastError(wxT("DestroyWindow")); + } + + // remove hWnd <-> wxWindow association + wxRemoveHandleAssociation(this); + } + + delete m_childrenDisabled; + +} + +// real construction (Init() must have been called before!) +bool wxWindowMSW::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + wxCHECK_MSG( parent, false, wxT("can't create wxWindow without parent") ); + + if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) ) + return false; + + parent->AddChild(this); + + WXDWORD exstyle; + DWORD msflags = MSWGetCreateWindowFlags(&exstyle); + +#ifdef __WXUNIVERSAL__ + // no borders, we draw them ourselves + exstyle &= ~(WS_EX_DLGMODALFRAME | + WS_EX_STATICEDGE | + WS_EX_CLIENTEDGE | + WS_EX_WINDOWEDGE); + msflags &= ~WS_BORDER; +#endif // wxUniversal + + if ( IsShown() ) + { + msflags |= WS_VISIBLE; + } + + if ( !MSWCreate(wxCanvasClassName, NULL, pos, size, msflags, exstyle) ) + return false; + + InheritAttributes(); + + return true; +} + +// --------------------------------------------------------------------------- +// basic operations +// --------------------------------------------------------------------------- + +void wxWindowMSW::SetFocus() +{ + HWND hWnd = GetHwnd(); + wxCHECK_RET( hWnd, _T("can't set focus to invalid window") ); + +#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) + ::SetLastError(0); +#endif + + if ( !::SetFocus(hWnd) ) + { +#if defined(__WXDEBUG__) && !defined(__WXMICROWIN__) + // was there really an error? + DWORD dwRes = ::GetLastError(); + if ( dwRes ) + { + HWND hwndFocus = ::GetFocus(); + if ( hwndFocus != hWnd ) + { + wxLogApiError(_T("SetFocus"), dwRes); + } + } +#endif // Debug + } +} + +void wxWindowMSW::SetFocusFromKbd() +{ + // when the focus is given to the control with DLGC_HASSETSEL style from + // keyboard its contents should be entirely selected: this is what + // ::IsDialogMessage() does and so we should do it as well to provide the + // same LNF as the native programs + if ( ::SendMessage(GetHwnd(), WM_GETDLGCODE, 0, 0) & DLGC_HASSETSEL ) + { + ::SendMessage(GetHwnd(), EM_SETSEL, 0, -1); + } + + // do this after (maybe) setting the selection as like this when + // wxEVT_SET_FOCUS handler is called, the selection would have been already + // set correctly -- this may be important + wxWindowBase::SetFocusFromKbd(); +} + +// Get the window with the focus +wxWindow *wxWindowBase::DoFindFocus() +{ + HWND hWnd = ::GetFocus(); + if ( hWnd ) + { + return wxGetWindowFromHWND((WXHWND)hWnd); + } + + return NULL; +} + +bool wxWindowMSW::Enable(bool enable) +{ + if ( !wxWindowBase::Enable(enable) ) + return false; + + HWND hWnd = GetHwnd(); + if ( hWnd ) + ::EnableWindow(hWnd, (BOOL)enable); + + // the logic below doesn't apply to the top level windows -- otherwise + // showing a modal dialog would result in total greying out (and ungreying + // out later) of everything which would be really ugly + if ( IsTopLevel() ) + return true; + + // when the parent is disabled, all of its children should be disabled as + // well but when it is enabled back, only those of the children which + // hadn't been already disabled in the beginning should be enabled again, + // so we have to keep the list of those children + for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + wxWindow *child = node->GetData(); + if ( child->IsTopLevel() ) + { + // the logic below doesn't apply to top level children + continue; + } + + if ( enable ) + { + // re-enable the child unless it had been disabled before us + if ( !m_childrenDisabled || !m_childrenDisabled->Find(child) ) + child->Enable(); + } + else // we're being disabled + { + if ( child->IsEnabled() ) + { + // disable it as children shouldn't stay enabled while the + // parent is not + child->Disable(); + } + else // child already disabled, remember it + { + // have we created the list of disabled children already? + if ( !m_childrenDisabled ) + m_childrenDisabled = new wxWindowList; + + m_childrenDisabled->Append(child); + } + } + } + + if ( enable && m_childrenDisabled ) + { + // we don't need this list any more, don't keep unused memory + delete m_childrenDisabled; + m_childrenDisabled = NULL; + } + + return true; +} + +bool wxWindowMSW::Show(bool show) +{ + if ( !wxWindowBase::Show(show) ) + return false; + + HWND hWnd = GetHwnd(); + + // we could be called before the underlying window is created (this is + // actually useful to prevent it from being initially shown), e.g. + // + // wxFoo *foo = new wxFoo; + // foo->Hide(); + // foo->Create(parent, ...); + // + // should work without errors + if ( hWnd ) + { + ::ShowWindow(hWnd, show ? SW_SHOW : SW_HIDE); + } + + return true; +} + +// Raise the window to the top of the Z order +void wxWindowMSW::Raise() +{ + wxBringWindowToTop(GetHwnd()); +} + +// Lower the window to the bottom of the Z order +void wxWindowMSW::Lower() +{ + ::SetWindowPos(GetHwnd(), HWND_BOTTOM, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); +} + +void wxWindowMSW::DoCaptureMouse() +{ + HWND hWnd = GetHwnd(); + if ( hWnd ) + { + ::SetCapture(hWnd); + } +} + +void wxWindowMSW::DoReleaseMouse() +{ + if ( !::ReleaseCapture() ) + { + wxLogLastError(_T("ReleaseCapture")); + } +} + +/* static */ wxWindow *wxWindowBase::GetCapture() +{ + HWND hwnd = ::GetCapture(); + return hwnd ? wxFindWinFromHandle((WXHWND)hwnd) : (wxWindow *)NULL; +} + +bool wxWindowMSW::SetFont(const wxFont& font) +{ + if ( !wxWindowBase::SetFont(font) ) + { + // nothing to do + return false; + } + + HWND hWnd = GetHwnd(); + if ( hWnd != 0 ) + { + // note the use of GetFont() instead of m_font: our own font could have + // just been reset and in this case we need to change the font used by + // the native window to the default for this class, i.e. exactly what + // GetFont() returns + WXHANDLE hFont = GetFont().GetResourceHandle(); + + wxASSERT_MSG( hFont, wxT("should have valid font") ); + + ::SendMessage(hWnd, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0)); + } + + return true; +} +bool wxWindowMSW::SetCursor(const wxCursor& cursor) +{ + if ( !wxWindowBase::SetCursor(cursor) ) + { + // no change + return false; + } + + // don't "overwrite" busy cursor + if ( m_cursor.Ok() && !wxIsBusy() ) + { + // normally we should change the cursor only if it's over this window + // but we should do it always if we capture the mouse currently + bool set = HasCapture(); + if ( !set ) + { + HWND hWnd = GetHwnd(); + + POINT point; +#ifdef __WXWINCE__ + ::GetCursorPosWinCE(&point); +#else + ::GetCursorPos(&point); +#endif + + RECT rect = wxGetWindowRect(hWnd); + + set = ::PtInRect(&rect, point) != 0; + } + + if ( set ) + { + ::SetCursor(GetHcursorOf(m_cursor)); + } + //else: will be set later when the mouse enters this window + } + + return true; +} + +void wxWindowMSW::WarpPointer(int x, int y) +{ + ClientToScreen(&x, &y); + + if ( !::SetCursorPos(x, y) ) + { + wxLogLastError(_T("SetCursorPos")); + } +} + +void wxWindowMSW::MSWUpdateUIState(int action, int state) +{ + // WM_CHANGEUISTATE only appeared in Windows 2000 so it can do us no good + // to use it on older systems -- and could possibly do some harm + static int s_needToUpdate = -1; + if ( s_needToUpdate == -1 ) + { + int verMaj, verMin; + s_needToUpdate = wxGetOsVersion(&verMaj, &verMin) == wxOS_WINDOWS_NT && + verMaj >= 5; + } + + if ( s_needToUpdate ) + { + // we send WM_CHANGEUISTATE so if nothing needs changing then the system + // won't send WM_UPDATEUISTATE + ::SendMessage(GetHwnd(), WM_CHANGEUISTATE, MAKEWPARAM(action, state), 0); + } +} + +// --------------------------------------------------------------------------- +// scrolling stuff +// --------------------------------------------------------------------------- + +inline int GetScrollPosition(HWND hWnd, int wOrient) +{ +#ifdef __WXMICROWIN__ + return ::GetScrollPosWX(hWnd, wOrient); +#else + WinStruct scrollInfo; + scrollInfo.cbSize = sizeof(SCROLLINFO); + scrollInfo.fMask = SIF_POS; + ::GetScrollInfo(hWnd, wOrient, &scrollInfo ); + + return scrollInfo.nPos; + +#endif +} + +int wxWindowMSW::GetScrollPos(int orient) const +{ + HWND hWnd = GetHwnd(); + wxCHECK_MSG( hWnd, 0, _T("no HWND in GetScrollPos") ); + + return GetScrollPosition(hWnd, orient == wxHORIZONTAL ? SB_HORZ : SB_VERT); +} + +// This now returns the whole range, not just the number +// of positions that we can scroll. +int wxWindowMSW::GetScrollRange(int orient) const +{ + int maxPos; + HWND hWnd = GetHwnd(); + if ( !hWnd ) + return 0; +#if 0 + ::GetScrollRange(hWnd, orient == wxHORIZONTAL ? SB_HORZ : SB_VERT, + &minPos, &maxPos); +#endif + WinStruct scrollInfo; + scrollInfo.fMask = SIF_RANGE; + if ( !::GetScrollInfo(hWnd, + orient == wxHORIZONTAL ? SB_HORZ : SB_VERT, + &scrollInfo) ) + { + // Most of the time this is not really an error, since the return + // value can also be zero when there is no scrollbar yet. + // wxLogLastError(_T("GetScrollInfo")); + } + maxPos = scrollInfo.nMax; + + // undo "range - 1" done in SetScrollbar() + return maxPos + 1; +} + +int wxWindowMSW::GetScrollThumb(int orient) const +{ + return orient == wxHORIZONTAL ? m_xThumbSize : m_yThumbSize; +} + +void wxWindowMSW::SetScrollPos(int orient, int pos, bool refresh) +{ + HWND hWnd = GetHwnd(); + wxCHECK_RET( hWnd, _T("SetScrollPos: no HWND") ); + + WinStruct info; + info.nPage = 0; + info.nMin = 0; + info.nPos = pos; + info.fMask = SIF_POS; + if ( HasFlag(wxALWAYS_SHOW_SB) ) + { + // disable scrollbar instead of removing it then + info.fMask |= SIF_DISABLENOSCROLL; + } + + ::SetScrollInfo(hWnd, orient == wxHORIZONTAL ? SB_HORZ : SB_VERT, + &info, refresh); +} + +// New function that will replace some of the above. +void wxWindowMSW::SetScrollbar(int orient, + int pos, + int pageSize, + int range, + bool refresh) +{ + WinStruct info; + info.nPage = pageSize; + info.nMin = 0; // range is nMax - nMin + 1 + info.nMax = range - 1; // as both nMax and nMax are inclusive + info.nPos = pos; + info.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; + if ( HasFlag(wxALWAYS_SHOW_SB) ) + { + // disable scrollbar instead of removing it then + info.fMask |= SIF_DISABLENOSCROLL; + } + + HWND hWnd = GetHwnd(); + if ( hWnd ) + { + // We have to set the variables here to make them valid in events + // triggered by ::SetScrollInfo() + *(orient == wxHORIZONTAL ? &m_xThumbSize : &m_yThumbSize) = pageSize; + + ::SetScrollInfo(hWnd, orient == wxHORIZONTAL ? SB_HORZ : SB_VERT, + &info, refresh); + } +} + +void wxWindowMSW::ScrollWindow(int dx, int dy, const wxRect *prect) +{ + RECT rect; + RECT *pr; + if ( prect ) + { + rect.left = prect->x; + rect.top = prect->y; + rect.right = prect->x + prect->width; + rect.bottom = prect->y + prect->height; + pr = ▭ + } + else + { + pr = NULL; + + } + +#ifdef __WXWINCE__ + // FIXME: is this the exact equivalent of the line below? + ::ScrollWindowEx(GetHwnd(), dx, dy, pr, pr, 0, 0, SW_SCROLLCHILDREN|SW_ERASE|SW_INVALIDATE); +#else + ::ScrollWindow(GetHwnd(), dx, dy, pr, pr); +#endif +} + +static bool ScrollVertically(HWND hwnd, int kind, int count) +{ + int posStart = GetScrollPosition(hwnd, SB_VERT); + + int pos = posStart; + for ( int n = 0; n < count; n++ ) + { + ::SendMessage(hwnd, WM_VSCROLL, kind, 0); + + int posNew = GetScrollPosition(hwnd, SB_VERT); + if ( posNew == pos ) + { + // don't bother to continue, we're already at top/bottom + break; + } + + pos = posNew; + } + + return pos != posStart; +} + +bool wxWindowMSW::ScrollLines(int lines) +{ + bool down = lines > 0; + + return ScrollVertically(GetHwnd(), + down ? SB_LINEDOWN : SB_LINEUP, + down ? lines : -lines); +} + +bool wxWindowMSW::ScrollPages(int pages) +{ + bool down = pages > 0; + + return ScrollVertically(GetHwnd(), + down ? SB_PAGEDOWN : SB_PAGEUP, + down ? pages : -pages); +} + +// ---------------------------------------------------------------------------- +// RTL support +// ---------------------------------------------------------------------------- + +void wxWindowMSW::SetLayoutDirection(wxLayoutDirection dir) +{ +#ifdef __WXWINCE__ + wxUnusedVar(dir); +#else + const HWND hwnd = GetHwnd(); + wxCHECK_RET( hwnd, _T("layout direction must be set after window creation") ); + + LONG styleOld = ::GetWindowLong(hwnd, GWL_EXSTYLE); + + LONG styleNew = styleOld; + switch ( dir ) + { + case wxLayout_LeftToRight: + styleNew &= ~WS_EX_LAYOUTRTL; + break; + + case wxLayout_RightToLeft: + styleNew |= WS_EX_LAYOUTRTL; + break; + + default: + wxFAIL_MSG(_T("unsupported layout direction")); + break; + } + + if ( styleNew != styleOld ) + { + ::SetWindowLong(hwnd, GWL_EXSTYLE, styleNew); + } +#endif +} + +wxLayoutDirection wxWindowMSW::GetLayoutDirection() const +{ +#ifdef __WXWINCE__ + return wxLayout_Default; +#else + const HWND hwnd = GetHwnd(); + wxCHECK_MSG( hwnd, wxLayout_Default, _T("invalid window") ); + + return ::GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_LAYOUTRTL + ? wxLayout_RightToLeft + : wxLayout_LeftToRight; +#endif +} + +wxCoord +wxWindowMSW::AdjustForLayoutDirection(wxCoord x, + wxCoord WXUNUSED(width), + wxCoord WXUNUSED(widthTotal)) const +{ + // Win32 mirrors the coordinates of RTL windows automatically, so don't + // redo it ourselves + return x; +} + +// --------------------------------------------------------------------------- +// subclassing +// --------------------------------------------------------------------------- + +void wxWindowMSW::SubclassWin(WXHWND hWnd) +{ + wxASSERT_MSG( !m_oldWndProc, wxT("subclassing window twice?") ); + + HWND hwnd = (HWND)hWnd; + wxCHECK_RET( ::IsWindow(hwnd), wxT("invalid HWND in SubclassWin") ); + + wxAssociateWinWithHandle(hwnd, this); + + m_oldWndProc = (WXFARPROC)wxGetWindowProc((HWND)hWnd); + + // we don't need to subclass the window of our own class (in the Windows + // sense of the word) + if ( !wxCheckWindowWndProc(hWnd, (WXFARPROC)wxWndProc) ) + { + wxSetWindowProc(hwnd, wxWndProc); + } + else + { + // don't bother restoring it either: this also makes it easy to + // implement IsOfStandardClass() method which returns true for the + // standard controls and false for the wxWidgets own windows as it can + // simply check m_oldWndProc + m_oldWndProc = NULL; + } + + // we're officially created now, send the event + wxWindowCreateEvent event((wxWindow *)this); + (void)GetEventHandler()->ProcessEvent(event); +} + +void wxWindowMSW::UnsubclassWin() +{ + wxRemoveHandleAssociation(this); + + // Restore old Window proc + HWND hwnd = GetHwnd(); + if ( hwnd ) + { + SetHWND(0); + + wxCHECK_RET( ::IsWindow(hwnd), wxT("invalid HWND in UnsubclassWin") ); + + if ( m_oldWndProc ) + { + if ( !wxCheckWindowWndProc((WXHWND)hwnd, m_oldWndProc) ) + { + wxSetWindowProc(hwnd, (WNDPROC)m_oldWndProc); + } + + m_oldWndProc = NULL; + } + } +} + +void wxWindowMSW::AssociateHandle(WXWidget handle) +{ + if ( m_hWnd ) + { + if ( !::DestroyWindow(GetHwnd()) ) + wxLogLastError(wxT("DestroyWindow")); + } + + WXHWND wxhwnd = (WXHWND)handle; + + SetHWND(wxhwnd); + SubclassWin(wxhwnd); +} + +void wxWindowMSW::DissociateHandle() +{ + // this also calls SetHWND(0) for us + UnsubclassWin(); +} + + +bool wxCheckWindowWndProc(WXHWND hWnd, + WXFARPROC WXUNUSED(wndProc)) +{ +// TODO: This list of window class names should be factored out so they can be +// managed in one place and then accessed from here and other places, such as +// wxApp::RegisterWindowClasses() and wxApp::UnregisterWindowClasses() + +#ifdef __WXWINCE__ + extern wxChar *wxCanvasClassName; + extern wxChar *wxCanvasClassNameNR; +#else + extern const wxChar *wxCanvasClassName; + extern const wxChar *wxCanvasClassNameNR; +#endif + extern const wxChar *wxMDIFrameClassName; + extern const wxChar *wxMDIFrameClassNameNoRedraw; + extern const wxChar *wxMDIChildFrameClassName; + extern const wxChar *wxMDIChildFrameClassNameNoRedraw; + wxString str(wxGetWindowClass(hWnd)); + if (str == wxCanvasClassName || + str == wxCanvasClassNameNR || +#if wxUSE_GLCANVAS + str == _T("wxGLCanvasClass") || + str == _T("wxGLCanvasClassNR") || +#endif // wxUSE_GLCANVAS + str == wxMDIFrameClassName || + str == wxMDIFrameClassNameNoRedraw || + str == wxMDIChildFrameClassName || + str == wxMDIChildFrameClassNameNoRedraw || + str == _T("wxTLWHiddenParent")) + return true; // Effectively means don't subclass + else + return false; +} + +// ---------------------------------------------------------------------------- +// Style handling +// ---------------------------------------------------------------------------- + +void wxWindowMSW::SetWindowStyleFlag(long flags) +{ + long flagsOld = GetWindowStyleFlag(); + if ( flags == flagsOld ) + return; + + // update the internal variable + wxWindowBase::SetWindowStyleFlag(flags); + + // and the real window flags + MSWUpdateStyle(flagsOld, GetExtraStyle()); +} + +void wxWindowMSW::SetExtraStyle(long exflags) +{ + long exflagsOld = GetExtraStyle(); + if ( exflags == exflagsOld ) + return; + + // update the internal variable + wxWindowBase::SetExtraStyle(exflags); + + // and the real window flags + MSWUpdateStyle(GetWindowStyleFlag(), exflagsOld); +} + +void wxWindowMSW::MSWUpdateStyle(long flagsOld, long exflagsOld) +{ + // now update the Windows style as well if needed - and if the window had + // been already created + if ( !GetHwnd() ) + return; + + // we may need to call SetWindowPos() when we change some styles + bool callSWP = false; + + WXDWORD exstyle; + long style = MSWGetStyle(GetWindowStyleFlag(), &exstyle); + + // this is quite a horrible hack but we need it because MSWGetStyle() + // doesn't take exflags as parameter but uses GetExtraStyle() internally + // and so we have to modify the window exflags temporarily to get the + // correct exstyleOld + long exflagsNew = GetExtraStyle(); + wxWindowBase::SetExtraStyle(exflagsOld); + + WXDWORD exstyleOld; + long styleOld = MSWGetStyle(flagsOld, &exstyleOld); + + wxWindowBase::SetExtraStyle(exflagsNew); + + + if ( style != styleOld ) + { + // some flags (e.g. WS_VISIBLE or WS_DISABLED) should not be changed by + // this function so instead of simply setting the style to the new + // value we clear the bits which were set in styleOld but are set in + // the new one and set the ones which were not set before + long styleReal = ::GetWindowLong(GetHwnd(), GWL_STYLE); + styleReal &= ~styleOld; + styleReal |= style; + + ::SetWindowLong(GetHwnd(), GWL_STYLE, styleReal); + + // we need to call SetWindowPos() if any of the styles affecting the + // frame appearance have changed + callSWP = ((styleOld ^ style ) & (WS_BORDER | + WS_THICKFRAME | + WS_CAPTION | + WS_DLGFRAME | + WS_MAXIMIZEBOX | + WS_MINIMIZEBOX | + WS_SYSMENU) ) != 0; + } + + // and the extended style + long exstyleReal = ::GetWindowLong(GetHwnd(), GWL_EXSTYLE); + + if ( exstyle != exstyleOld ) + { + exstyleReal &= ~exstyleOld; + exstyleReal |= exstyle; + + ::SetWindowLong(GetHwnd(), GWL_EXSTYLE, exstyleReal); + + // ex style changes don't take effect without calling SetWindowPos + callSWP = true; + } + + if ( callSWP ) + { + // we must call SetWindowPos() to flush the cached extended style and + // also to make the change to wxSTAY_ON_TOP style take effect: just + // setting the style simply doesn't work + if ( !::SetWindowPos(GetHwnd(), + exstyleReal & WS_EX_TOPMOST ? HWND_TOPMOST + : HWND_NOTOPMOST, + 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED) ) + { + wxLogLastError(_T("SetWindowPos")); + } + } +} + +WXDWORD wxWindowMSW::MSWGetStyle(long flags, WXDWORD *exstyle) const +{ + // translate common wxWidgets styles to Windows ones + + // most of windows are child ones, those which are not (such as + // wxTopLevelWindow) should remove WS_CHILD in their MSWGetStyle() + WXDWORD style = WS_CHILD; + + // using this flag results in very significant reduction in flicker, + // especially with controls inside the static boxes (as the interior of the + // box is not redrawn twice), but sometimes results in redraw problems, so + // optionally allow the old code to continue to use it provided a special + // system option is turned on + if ( !wxSystemOptions::GetOptionInt(wxT("msw.window.no-clip-children")) + || (flags & wxCLIP_CHILDREN) ) + style |= WS_CLIPCHILDREN; + + // it doesn't seem useful to use WS_CLIPSIBLINGS here as we officially + // don't support overlapping windows and it only makes sense for them and, + // presumably, gives the system some extra work (to manage more clipping + // regions), so avoid it alltogether + + + if ( flags & wxVSCROLL ) + style |= WS_VSCROLL; + + if ( flags & wxHSCROLL ) + style |= WS_HSCROLL; + + const wxBorder border = TranslateBorder(GetBorder(flags)); + + // WS_BORDER is only required for wxBORDER_SIMPLE + if ( border == wxBORDER_SIMPLE ) + style |= WS_BORDER; + + // now deal with ext style if the caller wants it + if ( exstyle ) + { + *exstyle = 0; + +#ifndef __WXWINCE__ + if ( flags & wxTRANSPARENT_WINDOW ) + *exstyle |= WS_EX_TRANSPARENT; +#endif + + switch ( border ) + { + default: + case wxBORDER_DEFAULT: + wxFAIL_MSG( _T("unknown border style") ); + // fall through + + case wxBORDER_NONE: + case wxBORDER_SIMPLE: + case wxBORDER_THEME: + break; + + case wxBORDER_STATIC: + *exstyle |= WS_EX_STATICEDGE; + break; + + case wxBORDER_RAISED: + *exstyle |= WS_EX_DLGMODALFRAME; + break; + + case wxBORDER_SUNKEN: + *exstyle |= WS_EX_CLIENTEDGE; + style &= ~WS_BORDER; + break; + +// case wxBORDER_DOUBLE: +// *exstyle |= WS_EX_DLGMODALFRAME; +// break; + } + + // wxUniv doesn't use Windows dialog navigation functions at all +#if !defined(__WXUNIVERSAL__) && !defined(__WXWINCE__) + // to make the dialog navigation work with the nested panels we must + // use this style (top level windows such as dialogs don't need it) + if ( (flags & wxTAB_TRAVERSAL) && !IsTopLevel() ) + { + *exstyle |= WS_EX_CONTROLPARENT; + } +#endif // __WXUNIVERSAL__ + } + + return style; +} + +// Helper for getting an appropriate theme style for the application. Unnecessary in +// 2.9 and above. +wxBorder wxWindowMSW::GetThemedBorderStyle() const +{ + return TranslateBorder(wxBORDER_THEME); +} + +// Setup background and foreground colours correctly +void wxWindowMSW::SetupColours() +{ + if ( GetParent() ) + SetBackgroundColour(GetParent()->GetBackgroundColour()); +} + +bool wxWindowMSW::IsMouseInWindow() const +{ + // get the mouse position + POINT pt; +#ifdef __WXWINCE__ + ::GetCursorPosWinCE(&pt); +#else + ::GetCursorPos(&pt); +#endif + + // find the window which currently has the cursor and go up the window + // chain until we find this window - or exhaust it + HWND hwnd = ::WindowFromPoint(pt); + while ( hwnd && (hwnd != GetHwnd()) ) + hwnd = ::GetParent(hwnd); + + return hwnd != NULL; +} + +void wxWindowMSW::OnInternalIdle() +{ +#ifndef HAVE_TRACKMOUSEEVENT + // Check if we need to send a LEAVE event + if ( m_mouseInWindow ) + { + // note that we should generate the leave event whether the window has + // or doesn't have mouse capture + if ( !IsMouseInWindow() ) + { + GenerateMouseLeave(); + } + } +#endif // !HAVE_TRACKMOUSEEVENT + + if (wxUpdateUIEvent::CanUpdate(this) && IsShownOnScreen()) + UpdateWindowUI(wxUPDATE_UI_FROMIDLE); +} + +// Set this window to be the child of 'parent'. +bool wxWindowMSW::Reparent(wxWindowBase *parent) +{ + if ( !wxWindowBase::Reparent(parent) ) + return false; + + HWND hWndChild = GetHwnd(); + HWND hWndParent = GetParent() ? GetWinHwnd(GetParent()) : (HWND)0; + + ::SetParent(hWndChild, hWndParent); + +#ifndef __WXWINCE__ + if ( ::GetWindowLong(hWndChild, GWL_EXSTYLE) & WS_EX_CONTROLPARENT ) + { + EnsureParentHasControlParentStyle(GetParent()); + } +#endif // !__WXWINCE__ + + return true; +} + +static inline void SendSetRedraw(HWND hwnd, bool on) +{ +#ifndef __WXMICROWIN__ + ::SendMessage(hwnd, WM_SETREDRAW, (WPARAM)on, 0); +#endif +} + +void wxWindowMSW::Freeze() +{ + if ( !m_frozenness++ ) + { + if ( IsShown() ) + { + if ( IsTopLevel() ) + { + // If this is a TLW, then freeze it's non-TLW children + // instead. This is needed because on Windows a frozen TLW + // lets window paint and mouse events pass through to other + // Windows below this one in z-order. + for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + wxWindow *child = node->GetData(); + if ( child->IsTopLevel() ) + continue; + else + child->Freeze(); + } + } + else // This is not a TLW, so just freeze it. + { + SendSetRedraw(GetHwnd(), false); + } + } + } +} + +void wxWindowMSW::Thaw() +{ + wxASSERT_MSG( m_frozenness > 0, _T("Thaw() without matching Freeze()") ); + + if ( --m_frozenness == 0 ) + { + if ( IsShown() ) + { + if ( IsTopLevel() ) + { + // If this is a TLW, then Thaw it's non-TLW children + // instead. See Freeze. + for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + wxWindow *child = node->GetData(); + if ( child->IsTopLevel() ) + continue; + else + { + // in case the child was added while the TLW was + // frozen, it won't be frozen now so avoid the Thaw. + if ( child->IsFrozen() ) + child->Thaw(); + } + } + } + else // This is not a TLW, so just thaw it. + { + SendSetRedraw(GetHwnd(), true); + } + + // we need to refresh everything or otherwise the invalidated area + // is not going to be repainted + Refresh(); + } + } +} + +void wxWindowMSW::Refresh(bool eraseBack, const wxRect *rect) +{ + HWND hWnd = GetHwnd(); + if ( hWnd ) + { + RECT mswRect; + const RECT *pRect; + if ( rect ) + { + mswRect.left = rect->x; + mswRect.top = rect->y; + mswRect.right = rect->x + rect->width; + mswRect.bottom = rect->y + rect->height; + + pRect = &mswRect; + } + else + { + pRect = NULL; + } + + // RedrawWindow not available on SmartPhone or eVC++ 3 +#if !defined(__SMARTPHONE__) && !(defined(_WIN32_WCE) && _WIN32_WCE < 400) + UINT flags = RDW_INVALIDATE | RDW_ALLCHILDREN; + if ( eraseBack ) + flags |= RDW_ERASE; + + ::RedrawWindow(hWnd, pRect, NULL, flags); +#else + ::InvalidateRect(hWnd, pRect, eraseBack); +#endif + } +} + +void wxWindowMSW::Update() +{ + if ( !::UpdateWindow(GetHwnd()) ) + { + wxLogLastError(_T("UpdateWindow")); + } + +#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) + // just calling UpdateWindow() is not enough, what we did in our WM_PAINT + // handler needs to be really drawn right now + (void)::GdiFlush(); +#endif // __WIN32__ +} + +// --------------------------------------------------------------------------- +// drag and drop +// --------------------------------------------------------------------------- + +#if wxUSE_DRAG_AND_DROP || !defined(__WXWINCE__) + +#if wxUSE_STATBOX + +// we need to lower the sibling static boxes so controls contained within can be +// a drop target +static void AdjustStaticBoxZOrder(wxWindow *parent) +{ + // no sibling static boxes if we have no parent (ie TLW) + if ( !parent ) + return; + + for ( wxWindowList::compatibility_iterator node = parent->GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + wxStaticBox *statbox = wxDynamicCast(node->GetData(), wxStaticBox); + if ( statbox ) + { + ::SetWindowPos(GetHwndOf(statbox), HWND_BOTTOM, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + } + } +} + +#else // !wxUSE_STATBOX + +static inline void AdjustStaticBoxZOrder(wxWindow * WXUNUSED(parent)) +{ +} + +#endif // wxUSE_STATBOX/!wxUSE_STATBOX + +#endif // drag and drop is used + +#if wxUSE_DRAG_AND_DROP +void wxWindowMSW::SetDropTarget(wxDropTarget *pDropTarget) +{ + if ( m_dropTarget != 0 ) { + m_dropTarget->Revoke(m_hWnd); + delete m_dropTarget; + } + + m_dropTarget = pDropTarget; + if ( m_dropTarget != 0 ) + { + AdjustStaticBoxZOrder(GetParent()); + m_dropTarget->Register(m_hWnd); + } +} +#endif // wxUSE_DRAG_AND_DROP + +// old-style file manager drag&drop support: we retain the old-style +// DragAcceptFiles in parallel with SetDropTarget. +void wxWindowMSW::DragAcceptFiles(bool WXUNUSED_IN_WINCE(accept)) +{ +#ifndef __WXWINCE__ + HWND hWnd = GetHwnd(); + if ( hWnd ) + { + AdjustStaticBoxZOrder(GetParent()); + ::DragAcceptFiles(hWnd, (BOOL)accept); + } +#endif +} + +// ---------------------------------------------------------------------------- +// tooltips +// ---------------------------------------------------------------------------- + +#if wxUSE_TOOLTIPS + +void wxWindowMSW::DoSetToolTip(wxToolTip *tooltip) +{ + wxWindowBase::DoSetToolTip(tooltip); + + if ( m_tooltip ) + m_tooltip->SetWindow((wxWindow *)this); +} + +#endif // wxUSE_TOOLTIPS + +// --------------------------------------------------------------------------- +// moving and resizing +// --------------------------------------------------------------------------- + +bool wxWindowMSW::IsSizeDeferred() const +{ +#if USE_DEFERRED_SIZING + if ( m_pendingPosition != wxDefaultPosition || + m_pendingSize != wxDefaultSize ) + return true; +#endif // USE_DEFERRED_SIZING + + return false; +} + +// Get total size +void wxWindowMSW::DoGetSize(int *x, int *y) const +{ +#if USE_DEFERRED_SIZING + // if SetSize() had been called at wx level but not realized at Windows + // level yet (i.e. EndDeferWindowPos() not called), we still should return + // the new and not the old position to the other wx code + if ( m_pendingSize != wxDefaultSize ) + { + if ( x ) + *x = m_pendingSize.x; + if ( y ) + *y = m_pendingSize.y; + } + else // use current size +#endif // USE_DEFERRED_SIZING + { + RECT rect = wxGetWindowRect(GetHwnd()); + + if ( x ) + *x = rect.right - rect.left; + if ( y ) + *y = rect.bottom - rect.top; + } +} + +// Get size *available for subwindows* i.e. excluding menu bar etc. +void wxWindowMSW::DoGetClientSize(int *x, int *y) const +{ +#if USE_DEFERRED_SIZING + if ( m_pendingSize != wxDefaultSize ) + { + // we need to calculate the client size corresponding to pending size + RECT rect; + rect.left = m_pendingPosition.x; + rect.top = m_pendingPosition.y; + rect.right = rect.left + m_pendingSize.x; + rect.bottom = rect.top + m_pendingSize.y; + + ::SendMessage(GetHwnd(), WM_NCCALCSIZE, FALSE, (LPARAM)&rect); + + if ( x ) + *x = rect.right - rect.left; + if ( y ) + *y = rect.bottom - rect.top; + } + else +#endif // USE_DEFERRED_SIZING + { + RECT rect = wxGetClientRect(GetHwnd()); + + if ( x ) + *x = rect.right; + if ( y ) + *y = rect.bottom; + } +} + +void wxWindowMSW::DoGetPosition(int *x, int *y) const +{ + wxWindow * const parent = GetParent(); + + wxPoint pos; + if ( m_pendingPosition != wxDefaultPosition ) + { + pos = m_pendingPosition; + } + else // use current position + { + RECT rect = wxGetWindowRect(GetHwnd()); + + POINT point; + point.x = rect.left; + point.y = rect.top; + + // we do the adjustments with respect to the parent only for the "real" + // children, not for the dialogs/frames + if ( !IsTopLevel() ) + { + if ( wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft ) + { + // In RTL mode, we want the logical left x-coordinate, + // which would be the physical right x-coordinate. + point.x = rect.right; + } + + // Since we now have the absolute screen coords, if there's a + // parent we must subtract its top left corner + if ( parent ) + { + ::ScreenToClient(GetHwndOf(parent), &point); + } + } + + pos.x = point.x; + pos.y = point.y; + } + + // we also must adjust by the client area offset: a control which is just + // under a toolbar could be at (0, 30) in Windows but at (0, 0) in wx + if ( parent && !IsTopLevel() ) + { + const wxPoint pt(parent->GetClientAreaOrigin()); + pos.x -= pt.x; + pos.y -= pt.y; + } + + if ( x ) + *x = pos.x; + if ( y ) + *y = pos.y; +} + +void wxWindowMSW::DoScreenToClient(int *x, int *y) const +{ + POINT pt; + if ( x ) + pt.x = *x; + if ( y ) + pt.y = *y; + + ::ScreenToClient(GetHwnd(), &pt); + + if ( x ) + *x = pt.x; + if ( y ) + *y = pt.y; +} + +void wxWindowMSW::DoClientToScreen(int *x, int *y) const +{ + POINT pt; + if ( x ) + pt.x = *x; + if ( y ) + pt.y = *y; + + ::ClientToScreen(GetHwnd(), &pt); + + if ( x ) + *x = pt.x; + if ( y ) + *y = pt.y; +} + +bool +wxWindowMSW::DoMoveSibling(WXHWND hwnd, int x, int y, int width, int height) +{ +#if USE_DEFERRED_SIZING + // if our parent had prepared a defer window handle for us, use it (unless + // we are a top level window) + wxWindowMSW * const parent = IsTopLevel() ? NULL : GetParent(); + + HDWP hdwp = parent ? (HDWP)parent->m_hDWP : NULL; + if ( hdwp ) + { + hdwp = ::DeferWindowPos(hdwp, (HWND)hwnd, NULL, x, y, width, height, + SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE); + if ( !hdwp ) + { + wxLogLastError(_T("DeferWindowPos")); + } + } + + if ( parent ) + { + // hdwp must be updated as it may have been changed + parent->m_hDWP = (WXHANDLE)hdwp; + } + + if ( hdwp ) + { + // did deferred move, remember new coordinates of the window as they're + // different from what Windows would return for it + return true; + } + + // otherwise (or if deferring failed) move the window in place immediately +#endif // USE_DEFERRED_SIZING + if ( !::MoveWindow((HWND)hwnd, x, y, width, height, IsShown()) ) + { + wxLogLastError(wxT("MoveWindow")); + } + + // if USE_DEFERRED_SIZING, indicates that we didn't use deferred move, + // ignored otherwise + return false; +} + +void wxWindowMSW::DoMoveWindow(int x, int y, int width, int height) +{ + // TODO: is this consistent with other platforms? + // Still, negative width or height shouldn't be allowed + if (width < 0) + width = 0; + if (height < 0) + height = 0; + + if ( DoMoveSibling(m_hWnd, x, y, width, height) ) + { +#if USE_DEFERRED_SIZING + m_pendingPosition = wxPoint(x, y); + m_pendingSize = wxSize(width, height); + } + else // window was moved immediately, without deferring it + { + m_pendingPosition = wxDefaultPosition; + m_pendingSize = wxDefaultSize; +#endif // USE_DEFERRED_SIZING + } +} + +// set the size of the window: if the dimensions are positive, just use them, +// but if any of them is equal to -1, it means that we must find the value for +// it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in +// which case -1 is a valid value for x and y) +// +// If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate +// the width/height to best suit our contents, otherwise we reuse the current +// width/height +void wxWindowMSW::DoSetSize(int x, int y, int width, int height, int sizeFlags) +{ + // get the current size and position... + int currentX, currentY; + int currentW, currentH; + + GetPosition(¤tX, ¤tY); + GetSize(¤tW, ¤tH); + + // ... and don't do anything (avoiding flicker) if it's already ok unless + // we're forced to resize the window + if ( x == currentX && y == currentY && + width == currentW && height == currentH && + !(sizeFlags & wxSIZE_FORCE) ) + { + return; + } + + if ( x == wxDefaultCoord && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) ) + x = currentX; + if ( y == wxDefaultCoord && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) ) + y = currentY; + + AdjustForParentClientOrigin(x, y, sizeFlags); + + wxSize size = wxDefaultSize; + if ( width == wxDefaultCoord ) + { + if ( sizeFlags & wxSIZE_AUTO_WIDTH ) + { + size = DoGetBestSize(); + width = size.x; + } + else + { + // just take the current one + width = currentW; + } + } + + if ( height == wxDefaultCoord ) + { + if ( sizeFlags & wxSIZE_AUTO_HEIGHT ) + { + if ( size.x == wxDefaultCoord ) + { + size = DoGetBestSize(); + } + //else: already called DoGetBestSize() above + + height = size.y; + } + else + { + // just take the current one + height = currentH; + } + } + + DoMoveWindow(x, y, width, height); +} + +void wxWindowMSW::DoSetClientSize(int width, int height) +{ + // setting the client size is less obvious than it could have been + // because in the result of changing the total size the window scrollbar + // may [dis]appear and/or its menubar may [un]wrap (and AdjustWindowRect() + // doesn't take neither into account) and so the client size will not be + // correct as the difference between the total and client size changes -- + // so we keep changing it until we get it right + // + // normally this loop shouldn't take more than 3 iterations (usually 1 but + // if scrollbars [dis]appear as the result of the first call, then 2 and it + // may become 3 if the window had 0 size originally and so we didn't + // calculate the scrollbar correction correctly during the first iteration) + // but just to be on the safe side we check for it instead of making it an + // "infinite" loop (i.e. leaving break inside as the only way to get out) + for ( int i = 0; i < 4; i++ ) + { + RECT rectClient; + ::GetClientRect(GetHwnd(), &rectClient); + + // if the size is already ok, stop here (NB: rectClient.left = top = 0) + if ( (rectClient.right == width || width == wxDefaultCoord) && + (rectClient.bottom == height || height == wxDefaultCoord) ) + { + break; + } + + // Find the difference between the entire window (title bar and all) + // and the client area; add this to the new client size to move the + // window + RECT rectWin; + ::GetWindowRect(GetHwnd(), &rectWin); + + const int widthWin = rectWin.right - rectWin.left, + heightWin = rectWin.bottom - rectWin.top; + + // MoveWindow positions the child windows relative to the parent, so + // adjust if necessary + if ( !IsTopLevel() ) + { + wxWindow *parent = GetParent(); + if ( parent ) + { + ::ScreenToClient(GetHwndOf(parent), (POINT *)&rectWin); + } + } + + // don't call DoMoveWindow() because we want to move window immediately + // and not defer it here as otherwise the value returned by + // GetClient/WindowRect() wouldn't change as the window wouldn't be + // really resized + if ( !::MoveWindow(GetHwnd(), + rectWin.left, + rectWin.top, + width + widthWin - rectClient.right, + height + heightWin - rectClient.bottom, + TRUE) ) + { + wxLogLastError(_T("MoveWindow")); + } + } +} + +// --------------------------------------------------------------------------- +// text metrics +// --------------------------------------------------------------------------- + +int wxWindowMSW::GetCharHeight() const +{ + return wxGetTextMetrics(this).tmHeight; +} + +int wxWindowMSW::GetCharWidth() const +{ + // +1 is needed because Windows apparently adds it when calculating the + // dialog units size in pixels +#if wxDIALOG_UNIT_COMPATIBILITY + return wxGetTextMetrics(this).tmAveCharWidth; +#else + return wxGetTextMetrics(this).tmAveCharWidth + 1; +#endif +} + +void wxWindowMSW::GetTextExtent(const wxString& string, + int *x, int *y, + int *descent, int *externalLeading, + const wxFont *theFont) const +{ + wxASSERT_MSG( !theFont || theFont->Ok(), + _T("invalid font in GetTextExtent()") ); + + wxFont fontToUse; + if (theFont) + fontToUse = *theFont; + else + fontToUse = GetFont(); + + WindowHDC hdc(GetHwnd()); + SelectInHDC selectFont(hdc, GetHfontOf(fontToUse)); + + SIZE sizeRect; + TEXTMETRIC tm; + ::GetTextExtentPoint32(hdc, string, string.length(), &sizeRect); + GetTextMetrics(hdc, &tm); + + if ( x ) + *x = sizeRect.cx; + if ( y ) + *y = sizeRect.cy; + if ( descent ) + *descent = tm.tmDescent; + if ( externalLeading ) + *externalLeading = tm.tmExternalLeading; +} + +// --------------------------------------------------------------------------- +// popup menu +// --------------------------------------------------------------------------- + +#if wxUSE_MENUS_NATIVE + +// yield for WM_COMMAND events only, i.e. process all WM_COMMANDs in the queue +// immediately, without waiting for the next event loop iteration +// +// NB: this function should probably be made public later as it can almost +// surely replace wxYield() elsewhere as well +static void wxYieldForCommandsOnly() +{ + // peek all WM_COMMANDs (it will always return WM_QUIT too but we don't + // want to process it here) + MSG msg; + while ( ::PeekMessage(&msg, (HWND)0, WM_COMMAND, WM_COMMAND, PM_REMOVE) ) + { + if ( msg.message == WM_QUIT ) + { + // if we retrieved a WM_QUIT, insert back into the message queue. + ::PostQuitMessage(0); + break; + } + + // luckily (as we don't have access to wxEventLoopImpl method from here + // anyhow...) we don't need to pre process WM_COMMANDs so dispatch it + // immediately + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } +} + +bool wxWindowMSW::DoPopupMenu(wxMenu *menu, int x, int y) +{ + menu->SetInvokingWindow(this); + menu->UpdateUI(); + + if ( x == wxDefaultCoord && y == wxDefaultCoord ) + { + wxPoint mouse = ScreenToClient(wxGetMousePosition()); + x = mouse.x; y = mouse.y; + } + + HWND hWnd = GetHwnd(); + HMENU hMenu = GetHmenuOf(menu); + POINT point; + point.x = x; + point.y = y; + ::ClientToScreen(hWnd, &point); + wxCurrentPopupMenu = menu; +#if defined(__WXWINCE__) + static const UINT flags = 0; +#else // !__WXWINCE__ + UINT flags = TPM_RIGHTBUTTON; + // NT4 doesn't support TPM_RECURSE and simply doesn't show the menu at all + // when it's use, I'm not sure about Win95/98 but prefer to err on the safe + // side and not to use it there neither -- modify the test if it does work + // on these systems + if ( wxGetWinVersion() >= wxWinVersion_5 ) + { + // using TPM_RECURSE allows us to show a popup menu while another menu + // is opened which can be useful and is supported by the other + // platforms, so allow it under Windows too + flags |= TPM_RECURSE; + } +#endif // __WXWINCE__/!__WXWINCE__ + + ::TrackPopupMenu(hMenu, flags, point.x, point.y, 0, hWnd, NULL); + + // we need to do it right now as otherwise the events are never going to be + // sent to wxCurrentPopupMenu from HandleCommand() + // + // note that even eliminating (ugly) wxCurrentPopupMenu global wouldn't + // help and we'd still need wxYieldForCommandsOnly() as the menu may be + // destroyed as soon as we return (it can be a local variable in the caller + // for example) and so we do need to process the event immediately + wxYieldForCommandsOnly(); + + wxCurrentPopupMenu = NULL; + + menu->SetInvokingWindow(NULL); + + return true; +} + +#endif // wxUSE_MENUS_NATIVE + +// =========================================================================== +// pre/post message processing +// =========================================================================== + +WXLRESULT wxWindowMSW::MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) +{ + if ( m_oldWndProc ) + return ::CallWindowProc(CASTWNDPROC m_oldWndProc, GetHwnd(), (UINT) nMsg, (WPARAM) wParam, (LPARAM) lParam); + else + return ::DefWindowProc(GetHwnd(), nMsg, wParam, lParam); +} + +bool wxWindowMSW::MSWProcessMessage(WXMSG* pMsg) +{ + // wxUniversal implements tab traversal itself +#ifndef __WXUNIVERSAL__ + if ( m_hWnd != 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL) ) + { + // intercept dialog navigation keys + MSG *msg = (MSG *)pMsg; + + // here we try to do all the job which ::IsDialogMessage() usually does + // internally + if ( msg->message == WM_KEYDOWN ) + { + bool bCtrlDown = wxIsCtrlDown(); + bool bShiftDown = wxIsShiftDown(); + + // WM_GETDLGCODE: ask the control if it wants the key for itself, + // don't process it if it's the case (except for Ctrl-Tab/Enter + // combinations which are always processed) + LONG lDlgCode = ::SendMessage(msg->hwnd, WM_GETDLGCODE, 0, 0); + + // surprizingly, DLGC_WANTALLKEYS bit mask doesn't contain the + // DLGC_WANTTAB nor DLGC_WANTARROWS bits although, logically, + // it, of course, implies them + if ( lDlgCode & DLGC_WANTALLKEYS ) + { + lDlgCode |= DLGC_WANTTAB | DLGC_WANTARROWS; + } + + bool bForward = true, + bWindowChange = false, + bFromTab = false; + + // should we process this message specially? + bool bProcess = true; + switch ( msg->wParam ) + { + case VK_TAB: + if ( (lDlgCode & DLGC_WANTTAB) && !bCtrlDown ) + { + // let the control have the TAB + bProcess = false; + } + else // use it for navigation + { + // Ctrl-Tab cycles thru notebook pages + bWindowChange = bCtrlDown; + bForward = !bShiftDown; + bFromTab = true; + } + break; + + case VK_UP: + case VK_LEFT: + if ( (lDlgCode & DLGC_WANTARROWS) || bCtrlDown ) + bProcess = false; + else + bForward = false; + break; + + case VK_DOWN: + case VK_RIGHT: + if ( (lDlgCode & DLGC_WANTARROWS) || bCtrlDown ) + bProcess = false; + break; + + case VK_PRIOR: + bForward = false; + // fall through + + case VK_NEXT: + // we treat PageUp/Dn as arrows because chances are that + // a control which needs arrows also needs them for + // navigation (e.g. wxTextCtrl, wxListCtrl, ...) + if ( (lDlgCode & DLGC_WANTARROWS) && !bCtrlDown ) + bProcess = false; + else // OTOH Ctrl-PageUp/Dn works as [Shift-]Ctrl-Tab + bWindowChange = true; + break; + + case VK_RETURN: + { + if ( (lDlgCode & DLGC_WANTMESSAGE) && !bCtrlDown ) + { + // control wants to process Enter itself, don't + // call IsDialogMessage() which would consume it + return false; + } + +#if wxUSE_BUTTON + // currently active button should get enter press even + // if there is a default button elsewhere so check if + // this window is a button first + wxWindow *btn = NULL; + if ( lDlgCode & DLGC_DEFPUSHBUTTON ) + { + // let IsDialogMessage() handle this for all + // buttons except the owner-drawn ones which it + // just seems to ignore + long style = ::GetWindowLong(msg->hwnd, GWL_STYLE); + if ( (style & BS_OWNERDRAW) == BS_OWNERDRAW ) + { + // emulate the button click + btn = wxFindWinFromHandle((WXHWND)msg->hwnd); + } + + bProcess = false; + } + else // not a button itself, do we have default button? + { + wxTopLevelWindow * + tlw = wxDynamicCast(wxGetTopLevelParent(this), + wxTopLevelWindow); + if ( tlw ) + { + btn = wxDynamicCast(tlw->GetDefaultItem(), + wxButton); + } + } + + if ( btn && btn->IsEnabled() ) + { + btn->MSWCommand(BN_CLICKED, 0 /* unused */); + return true; + } + +#endif // wxUSE_BUTTON + +#ifdef __WXWINCE__ + // map Enter presses into button presses on PDAs + wxJoystickEvent event(wxEVT_JOY_BUTTON_DOWN); + event.SetEventObject(this); + if ( GetEventHandler()->ProcessEvent(event) ) + return true; +#endif // __WXWINCE__ + } + break; + + default: + bProcess = false; + } + + if ( bProcess ) + { + wxNavigationKeyEvent event; + event.SetDirection(bForward); + event.SetWindowChange(bWindowChange); + event.SetFromTab(bFromTab); + event.SetEventObject(this); + + if ( GetEventHandler()->ProcessEvent(event) ) + { + // as we don't call IsDialogMessage(), which would take of + // this by default, we need to manually send this message + // so that controls can change their UI state if needed + MSWUpdateUIState(UIS_CLEAR, UISF_HIDEFOCUS); + + return true; + } + } + } + + if ( ::IsDialogMessage(GetHwnd(), msg) ) + { + // IsDialogMessage() did something... + return true; + } + } +#endif // __WXUNIVERSAL__ + +#if wxUSE_TOOLTIPS + if ( m_tooltip ) + { + // relay mouse move events to the tooltip control + MSG *msg = (MSG *)pMsg; + if ( msg->message == WM_MOUSEMOVE ) + wxToolTip::RelayEvent(pMsg); + } +#endif // wxUSE_TOOLTIPS + + return false; +} + +bool wxWindowMSW::MSWTranslateMessage(WXMSG* pMsg) +{ +#if wxUSE_ACCEL && !defined(__WXUNIVERSAL__) + return m_acceleratorTable.Translate(this, pMsg); +#else + (void) pMsg; + return false; +#endif // wxUSE_ACCEL +} + +bool wxWindowMSW::MSWShouldPreProcessMessage(WXMSG* msg) +{ + // all tests below have to deal with various bugs/misfeatures of + // IsDialogMessage(): we have to prevent it from being called from our + // MSWProcessMessage() in some situations + + // don't let IsDialogMessage() get VK_ESCAPE as it _always_ eats the + // message even when there is no cancel button and when the message is + // needed by the control itself: in particular, it prevents the tree in + // place edit control from being closed with Escape in a dialog + if ( msg->message == WM_KEYDOWN && msg->wParam == VK_ESCAPE ) + { + return false; + } + + // ::IsDialogMessage() is broken and may sometimes hang the application by + // going into an infinite loop when it tries to find the control to give + // focus to when Alt- is pressed, so we try to detect [some of] the + // situations when this may happen and not call it then + if ( msg->message != WM_SYSCHAR ) + return true; + + // assume we can call it by default + bool canSafelyCallIsDlgMsg = true; + + HWND hwndFocus = ::GetFocus(); + + // if the currently focused window itself has WS_EX_CONTROLPARENT style, + // ::IsDialogMessage() will also enter an infinite loop, because it will + // recursively check the child windows but not the window itself and so if + // none of the children accepts focus it loops forever (as it only stops + // when it gets back to the window it started from) + // + // while it is very unusual that a window with WS_EX_CONTROLPARENT + // style has the focus, it can happen. One such possibility is if + // all windows are either toplevel, wxDialog, wxPanel or static + // controls and no window can actually accept keyboard input. +#if !defined(__WXWINCE__) + if ( ::GetWindowLong(hwndFocus, GWL_EXSTYLE) & WS_EX_CONTROLPARENT ) + { + // pessimistic by default + canSafelyCallIsDlgMsg = false; + for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + wxWindow * const win = node->GetData(); + if ( win->AcceptsFocus() && + !(::GetWindowLong(GetHwndOf(win), GWL_EXSTYLE) & + WS_EX_CONTROLPARENT) ) + { + // it shouldn't hang... + canSafelyCallIsDlgMsg = true; + + break; + } + } + } +#endif // !__WXWINCE__ + + if ( canSafelyCallIsDlgMsg ) + { + // ::IsDialogMessage() can enter in an infinite loop when the + // currently focused window is disabled or hidden and its + // parent has WS_EX_CONTROLPARENT style, so don't call it in + // this case + while ( hwndFocus ) + { + if ( !::IsWindowEnabled(hwndFocus) || + !::IsWindowVisible(hwndFocus) ) + { + // it would enter an infinite loop if we do this! + canSafelyCallIsDlgMsg = false; + + break; + } + + if ( !(::GetWindowLong(hwndFocus, GWL_STYLE) & WS_CHILD) ) + { + // it's a top level window, don't go further -- e.g. even + // if the parent of a dialog is disabled, this doesn't + // break navigation inside the dialog + break; + } + + hwndFocus = ::GetParent(hwndFocus); + } + } + + return canSafelyCallIsDlgMsg; +} + +// --------------------------------------------------------------------------- +// message params unpackers +// --------------------------------------------------------------------------- + +void wxWindowMSW::UnpackCommand(WXWPARAM wParam, WXLPARAM lParam, + WORD *id, WXHWND *hwnd, WORD *cmd) +{ + *id = LOWORD(wParam); + *hwnd = (WXHWND)lParam; + *cmd = HIWORD(wParam); +} + +void wxWindowMSW::UnpackActivate(WXWPARAM wParam, WXLPARAM lParam, + WXWORD *state, WXWORD *minimized, WXHWND *hwnd) +{ + *state = LOWORD(wParam); + *minimized = HIWORD(wParam); + *hwnd = (WXHWND)lParam; +} + +void wxWindowMSW::UnpackScroll(WXWPARAM wParam, WXLPARAM lParam, + WXWORD *code, WXWORD *pos, WXHWND *hwnd) +{ + *code = LOWORD(wParam); + *pos = HIWORD(wParam); + *hwnd = (WXHWND)lParam; +} + +void wxWindowMSW::UnpackCtlColor(WXWPARAM wParam, WXLPARAM lParam, + WXHDC *hdc, WXHWND *hwnd) +{ + *hwnd = (WXHWND)lParam; + *hdc = (WXHDC)wParam; +} + +void wxWindowMSW::UnpackMenuSelect(WXWPARAM wParam, WXLPARAM lParam, + WXWORD *item, WXWORD *flags, WXHMENU *hmenu) +{ + *item = (WXWORD)wParam; + *flags = HIWORD(wParam); + *hmenu = (WXHMENU)lParam; +} + +// --------------------------------------------------------------------------- +// Main wxWidgets window proc and the window proc for wxWindow +// --------------------------------------------------------------------------- + +// Hook for new window just as it's being created, when the window isn't yet +// associated with the handle +static wxWindowMSW *gs_winBeingCreated = NULL; + +// implementation of wxWindowCreationHook class: it just sets gs_winBeingCreated to the +// window being created and insures that it's always unset back later +wxWindowCreationHook::wxWindowCreationHook(wxWindowMSW *winBeingCreated) +{ + gs_winBeingCreated = winBeingCreated; +} + +wxWindowCreationHook::~wxWindowCreationHook() +{ + gs_winBeingCreated = NULL; +} + +// Main window proc +LRESULT WXDLLEXPORT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + // trace all messages - useful for the debugging +#ifdef __WXDEBUG__ + wxLogTrace(wxTraceMessages, + wxT("Processing %s(hWnd=%08lx, wParam=%8lx, lParam=%8lx)"), + wxGetMessageName(message), (long)hWnd, (long)wParam, lParam); +#endif // __WXDEBUG__ + + wxWindowMSW *wnd = wxFindWinFromHandle((WXHWND) hWnd); + + // when we get the first message for the HWND we just created, we associate + // it with wxWindow stored in gs_winBeingCreated + if ( !wnd && gs_winBeingCreated ) + { + wxAssociateWinWithHandle(hWnd, gs_winBeingCreated); + wnd = gs_winBeingCreated; + gs_winBeingCreated = NULL; + wnd->SetHWND((WXHWND)hWnd); + } + + LRESULT rc; + + if ( wnd && wxEventLoop::AllowProcessing(wnd) ) + rc = wnd->MSWWindowProc(message, wParam, lParam); + else + rc = ::DefWindowProc(hWnd, message, wParam, lParam); + + return rc; +} + +WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) +{ + // did we process the message? + bool processed = false; + + // the return value + union + { + bool allow; + WXLRESULT result; + WXHBRUSH hBrush; + } rc; + + // for most messages we should return 0 when we do process the message + rc.result = 0; + + switch ( message ) + { + case WM_CREATE: + { + bool mayCreate; + processed = HandleCreate((WXLPCREATESTRUCT)lParam, &mayCreate); + if ( processed ) + { + // return 0 to allow window creation + rc.result = mayCreate ? 0 : -1; + } + } + break; + + case WM_DESTROY: + // never set processed to true and *always* pass WM_DESTROY to + // DefWindowProc() as Windows may do some internal cleanup when + // processing it and failing to pass the message along may cause + // memory and resource leaks! + (void)HandleDestroy(); + break; + + case WM_SIZE: + processed = HandleSize(LOWORD(lParam), HIWORD(lParam), wParam); + break; + + case WM_MOVE: + processed = HandleMove(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); + break; + +#if !defined(__WXWINCE__) + case WM_MOVING: + { + LPRECT pRect = (LPRECT)lParam; + wxRect rc; + rc.SetLeft(pRect->left); + rc.SetTop(pRect->top); + rc.SetRight(pRect->right); + rc.SetBottom(pRect->bottom); + processed = HandleMoving(rc); + if (processed) { + pRect->left = rc.GetLeft(); + pRect->top = rc.GetTop(); + pRect->right = rc.GetRight(); + pRect->bottom = rc.GetBottom(); + } + } + break; + + case WM_SIZING: + { + LPRECT pRect = (LPRECT)lParam; + wxRect rc; + rc.SetLeft(pRect->left); + rc.SetTop(pRect->top); + rc.SetRight(pRect->right); + rc.SetBottom(pRect->bottom); + processed = HandleSizing(rc); + if (processed) { + pRect->left = rc.GetLeft(); + pRect->top = rc.GetTop(); + pRect->right = rc.GetRight(); + pRect->bottom = rc.GetBottom(); + } + } + break; +#endif // !__WXWINCE__ + +#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) + case WM_ACTIVATEAPP: + // This implicitly sends a wxEVT_ACTIVATE_APP event + wxTheApp->SetActive(wParam != 0, FindFocus()); + break; +#endif + + case WM_ACTIVATE: + { + WXWORD state, minimized; + WXHWND hwnd; + UnpackActivate(wParam, lParam, &state, &minimized, &hwnd); + + processed = HandleActivate(state, minimized != 0, (WXHWND)hwnd); + } + break; + + case WM_SETFOCUS: + processed = HandleSetFocus((WXHWND)(HWND)wParam); + break; + + case WM_KILLFOCUS: + processed = HandleKillFocus((WXHWND)(HWND)wParam); + break; + + case WM_PRINTCLIENT: + processed = HandlePrintClient((WXHDC)wParam); + break; + + case WM_PAINT: + if ( wParam ) + { + wxPaintDCEx dc((wxWindow *)this, (WXHDC)wParam); + + processed = HandlePaint(); + } + else // no DC given + { + processed = HandlePaint(); + } + break; + + case WM_CLOSE: +#ifdef __WXUNIVERSAL__ + // Universal uses its own wxFrame/wxDialog, so we don't receive + // close events unless we have this. + Close(); +#endif // __WXUNIVERSAL__ + + // don't let the DefWindowProc() destroy our window - we'll do it + // ourselves in ~wxWindow + processed = true; + rc.result = TRUE; + break; + + case WM_SHOWWINDOW: + processed = HandleShow(wParam != 0, (int)lParam); + break; + + case WM_MOUSEMOVE: + processed = HandleMouseMove(GET_X_LPARAM(lParam), + GET_Y_LPARAM(lParam), + wParam); + break; + +#ifdef HAVE_TRACKMOUSEEVENT + case WM_MOUSELEAVE: + // filter out excess WM_MOUSELEAVE events sent after PopupMenu() + // (on XP at least) + if ( m_mouseInWindow ) + { + GenerateMouseLeave(); + } + + // always pass processed back as false, this allows the window + // manager to process the message too. This is needed to + // ensure windows XP themes work properly as the mouse moves + // over widgets like buttons. So don't set processed to true here. + break; +#endif // HAVE_TRACKMOUSEEVENT + +#if wxUSE_MOUSEWHEEL + case WM_MOUSEWHEEL: + processed = HandleMouseWheel(wParam, lParam); + break; +#endif + + case WM_LBUTTONDOWN: + case WM_LBUTTONUP: + case WM_LBUTTONDBLCLK: + case WM_RBUTTONDOWN: + case WM_RBUTTONUP: + case WM_RBUTTONDBLCLK: + case WM_MBUTTONDOWN: + case WM_MBUTTONUP: + case WM_MBUTTONDBLCLK: + { +#ifdef __WXMICROWIN__ + // MicroWindows seems to ignore the fact that a window is + // disabled. So catch mouse events and throw them away if + // necessary. + wxWindowMSW* win = this; + for ( ;; ) + { + if (!win->IsEnabled()) + { + processed = true; + break; + } + + win = win->GetParent(); + if ( !win || win->IsTopLevel() ) + break; + } + + if ( processed ) + break; + +#endif // __WXMICROWIN__ + int x = GET_X_LPARAM(lParam), + y = GET_Y_LPARAM(lParam); + +#ifdef __WXWINCE__ + // redirect the event to a static control if necessary by + // finding one under mouse because under CE the static controls + // don't generate mouse events (even with SS_NOTIFY) + wxWindowMSW *win; + if ( GetCapture() == this ) + { + // but don't do it if the mouse is captured by this window + // because then it should really get this event itself + win = this; + } + else + { + win = FindWindowForMouseEvent(this, &x, &y); + + // this should never happen + wxCHECK_MSG( win, 0, + _T("FindWindowForMouseEvent() returned NULL") ); + } +#ifdef __POCKETPC__ + if (IsContextMenuEnabled() && message == WM_LBUTTONDOWN) + { + SHRGINFO shrgi = {0}; + + shrgi.cbSize = sizeof(SHRGINFO); + shrgi.hwndClient = (HWND) GetHWND(); + shrgi.ptDown.x = x; + shrgi.ptDown.y = y; + + shrgi.dwFlags = SHRG_RETURNCMD; + // shrgi.dwFlags = SHRG_NOTIFYPARENT; + + if (GN_CONTEXTMENU == ::SHRecognizeGesture(&shrgi)) + { + wxPoint pt(x, y); + pt = ClientToScreen(pt); + + wxContextMenuEvent evtCtx(wxEVT_CONTEXT_MENU, GetId(), pt); + + evtCtx.SetEventObject(this); + if (GetEventHandler()->ProcessEvent(evtCtx)) + { + processed = true; + return true; + } + } + } +#endif + +#else // !__WXWINCE__ + wxWindowMSW *win = this; +#endif // __WXWINCE__/!__WXWINCE__ + + processed = win->HandleMouseEvent(message, x, y, wParam); + + // if the app didn't eat the event, handle it in the default + // way, that is by giving this window the focus + if ( !processed ) + { + // for the standard classes their WndProc sets the focus to + // them anyhow and doing it from here results in some weird + // problems, so don't do it for them (unnecessary anyhow) + if ( !win->IsOfStandardClass() ) + { + if ( message == WM_LBUTTONDOWN && win->AcceptsFocus() ) + win->SetFocus(); + } + } + } + break; + +#ifdef MM_JOY1MOVE + case MM_JOY1MOVE: + case MM_JOY2MOVE: + case MM_JOY1ZMOVE: + case MM_JOY2ZMOVE: + case MM_JOY1BUTTONDOWN: + case MM_JOY2BUTTONDOWN: + case MM_JOY1BUTTONUP: + case MM_JOY2BUTTONUP: + processed = HandleJoystickEvent(message, + GET_X_LPARAM(lParam), + GET_Y_LPARAM(lParam), + wParam); + break; +#endif // __WXMICROWIN__ + + case WM_COMMAND: + { + WORD id, cmd; + WXHWND hwnd; + UnpackCommand(wParam, lParam, &id, &hwnd, &cmd); + + processed = HandleCommand(id, cmd, hwnd); + } + break; + + case WM_NOTIFY: + processed = HandleNotify((int)wParam, lParam, &rc.result); + break; + + // we only need to reply to WM_NOTIFYFORMAT manually when using MSLU, + // otherwise DefWindowProc() does it perfectly fine for us, but MSLU + // apparently doesn't always behave properly and needs some help +#if wxUSE_UNICODE_MSLU && defined(NF_QUERY) + case WM_NOTIFYFORMAT: + if ( lParam == NF_QUERY ) + { + processed = true; + rc.result = NFR_UNICODE; + } + break; +#endif // wxUSE_UNICODE_MSLU + + // for these messages we must return true if process the message +#ifdef WM_DRAWITEM + case WM_DRAWITEM: + case WM_MEASUREITEM: + { + int idCtrl = (UINT)wParam; + if ( message == WM_DRAWITEM ) + { + processed = MSWOnDrawItem(idCtrl, + (WXDRAWITEMSTRUCT *)lParam); + } + else + { + processed = MSWOnMeasureItem(idCtrl, + (WXMEASUREITEMSTRUCT *)lParam); + } + + if ( processed ) + rc.result = TRUE; + } + break; +#endif // defined(WM_DRAWITEM) + + case WM_GETDLGCODE: + if ( !IsOfStandardClass() || HasFlag(wxWANTS_CHARS) ) + { + // we always want to get the char events + rc.result = DLGC_WANTCHARS; + + if ( HasFlag(wxWANTS_CHARS) ) + { + // in fact, we want everything + rc.result |= DLGC_WANTARROWS | + DLGC_WANTTAB | + DLGC_WANTALLKEYS; + } + + processed = true; + } + //else: get the dlg code from the DefWindowProc() + break; + + case WM_SYSKEYDOWN: + case WM_KEYDOWN: + // If this has been processed by an event handler, return 0 now + // (we've handled it). + m_lastKeydownProcessed = HandleKeyDown((WORD) wParam, lParam); + if ( m_lastKeydownProcessed ) + { + processed = true; + } + + if ( !processed ) + { + switch ( wParam ) + { + // we consider these messages "not interesting" to OnChar, so + // just don't do anything more with them + case VK_SHIFT: + case VK_CONTROL: + case VK_MENU: + case VK_CAPITAL: + case VK_NUMLOCK: + case VK_SCROLL: + processed = true; + break; + + // avoid duplicate messages to OnChar for these ASCII keys: + // they will be translated by TranslateMessage() and received + // in WM_CHAR + case VK_ESCAPE: + case VK_SPACE: + case VK_RETURN: + case VK_BACK: + case VK_TAB: + case VK_ADD: + case VK_SUBTRACT: + case VK_MULTIPLY: + case VK_DIVIDE: + case VK_DECIMAL: + case VK_NUMPAD0: + case VK_NUMPAD1: + case VK_NUMPAD2: + case VK_NUMPAD3: + case VK_NUMPAD4: + case VK_NUMPAD5: + case VK_NUMPAD6: + case VK_NUMPAD7: + case VK_NUMPAD8: + case VK_NUMPAD9: + case VK_OEM_1: + case VK_OEM_2: + case VK_OEM_3: + case VK_OEM_4: + case VK_OEM_5: + case VK_OEM_6: + case VK_OEM_7: + case VK_OEM_PLUS: + case VK_OEM_COMMA: + case VK_OEM_MINUS: + case VK_OEM_PERIOD: + // but set processed to false, not true to still pass them + // to the control's default window proc - otherwise + // built-in keyboard handling won't work + processed = false; + break; + +#ifdef VK_APPS + // special case of VK_APPS: treat it the same as right mouse + // click because both usually pop up a context menu + case VK_APPS: + processed = HandleMouseEvent(WM_RBUTTONDOWN, -1, -1, 0); + break; +#endif // VK_APPS + + default: + // do generate a CHAR event + processed = HandleChar((WORD)wParam, lParam); + } + } + if (message == WM_SYSKEYDOWN) // Let Windows still handle the SYSKEYs + processed = false; + break; + + case WM_SYSKEYUP: + case WM_KEYUP: +#ifdef VK_APPS + // special case of VK_APPS: treat it the same as right mouse button + if ( wParam == VK_APPS ) + { + processed = HandleMouseEvent(WM_RBUTTONUP, -1, -1, 0); + } + else +#endif // VK_APPS + { + processed = HandleKeyUp((WORD) wParam, lParam); + } + break; + + case WM_SYSCHAR: + case WM_CHAR: // Always an ASCII character + if ( m_lastKeydownProcessed ) + { + // The key was handled in the EVT_KEY_DOWN and handling + // a key in an EVT_KEY_DOWN handler is meant, by + // design, to prevent EVT_CHARs from happening + m_lastKeydownProcessed = false; + processed = true; + } + else + { + processed = HandleChar((WORD)wParam, lParam, true); + } + break; + +#if wxUSE_HOTKEY + case WM_HOTKEY: + processed = HandleHotKey((WORD)wParam, lParam); + break; +#endif // wxUSE_HOTKEY + + case WM_HSCROLL: + case WM_VSCROLL: + { + WXWORD code, pos; + WXHWND hwnd; + UnpackScroll(wParam, lParam, &code, &pos, &hwnd); + + processed = MSWOnScroll(message == WM_HSCROLL ? wxHORIZONTAL + : wxVERTICAL, + code, pos, hwnd); + } + break; + + // CTLCOLOR messages are sent by children to query the parent for their + // colors +#ifndef __WXMICROWIN__ + case WM_CTLCOLORMSGBOX: + case WM_CTLCOLOREDIT: + case WM_CTLCOLORLISTBOX: + case WM_CTLCOLORBTN: + case WM_CTLCOLORDLG: + case WM_CTLCOLORSCROLLBAR: + case WM_CTLCOLORSTATIC: + { + WXHDC hdc; + WXHWND hwnd; + UnpackCtlColor(wParam, lParam, &hdc, &hwnd); + + processed = HandleCtlColor(&rc.hBrush, (WXHDC)hdc, (WXHWND)hwnd); + } + break; +#endif // !__WXMICROWIN__ + + case WM_SYSCOLORCHANGE: + // the return value for this message is ignored + processed = HandleSysColorChange(); + break; + +#if !defined(__WXWINCE__) + case WM_DISPLAYCHANGE: + processed = HandleDisplayChange(); + break; +#endif + + case WM_PALETTECHANGED: + processed = HandlePaletteChanged((WXHWND) (HWND) wParam); + break; + + case WM_CAPTURECHANGED: + processed = HandleCaptureChanged((WXHWND) (HWND) lParam); + break; + + case WM_SETTINGCHANGE: + processed = HandleSettingChange(wParam, lParam); + break; + + case WM_QUERYNEWPALETTE: + processed = HandleQueryNewPalette(); + break; + + case WM_ERASEBKGND: + processed = HandleEraseBkgnd((WXHDC)(HDC)wParam); + if ( processed ) + { + // we processed the message, i.e. erased the background + rc.result = TRUE; + } + break; + +#if !defined(__WXWINCE__) + case WM_DROPFILES: + processed = HandleDropFiles(wParam); + break; +#endif + + case WM_INITDIALOG: + processed = HandleInitDialog((WXHWND)(HWND)wParam); + + if ( processed ) + { + // we never set focus from here + rc.result = FALSE; + } + break; + +#if !defined(__WXWINCE__) + case WM_QUERYENDSESSION: + processed = HandleQueryEndSession(lParam, &rc.allow); + break; + + case WM_ENDSESSION: + processed = HandleEndSession(wParam != 0, lParam); + break; + + case WM_GETMINMAXINFO: + processed = HandleGetMinMaxInfo((MINMAXINFO*)lParam); + break; +#endif + + case WM_SETCURSOR: + processed = HandleSetCursor((WXHWND)(HWND)wParam, + LOWORD(lParam), // hit test + HIWORD(lParam)); // mouse msg + + if ( processed ) + { + // returning TRUE stops the DefWindowProc() from further + // processing this message - exactly what we need because we've + // just set the cursor. + rc.result = TRUE; + } + break; + +#if wxUSE_ACCESSIBILITY + case WM_GETOBJECT: + { + //WPARAM dwFlags = (WPARAM) (DWORD) wParam; + LPARAM dwObjId = (LPARAM) (DWORD) lParam; + + if (dwObjId == (LPARAM)OBJID_CLIENT && GetOrCreateAccessible()) + { + return LresultFromObject(IID_IAccessible, wParam, (IUnknown*) GetAccessible()->GetIAccessible()); + } + break; + } +#endif + +#if defined(WM_HELP) + case WM_HELP: + { + // by default, WM_HELP is propagated by DefWindowProc() upwards + // to the window parent but as we do it ourselves already + // (wxHelpEvent is derived from wxCommandEvent), we don't want + // to get the other events if we process this message at all + processed = true; + + // WM_HELP doesn't use lParam under CE +#ifndef __WXWINCE__ + HELPINFO* info = (HELPINFO*) lParam; + if ( info->iContextType == HELPINFO_WINDOW ) + { +#endif // !__WXWINCE__ + wxHelpEvent helpEvent + ( + wxEVT_HELP, + GetId(), +#ifdef __WXWINCE__ + wxGetMousePosition() // what else? +#else + wxPoint(info->MousePos.x, info->MousePos.y) +#endif + ); + + helpEvent.SetEventObject(this); + GetEventHandler()->ProcessEvent(helpEvent); +#ifndef __WXWINCE__ + } + else if ( info->iContextType == HELPINFO_MENUITEM ) + { + wxHelpEvent helpEvent(wxEVT_HELP, info->iCtrlId); + helpEvent.SetEventObject(this); + GetEventHandler()->ProcessEvent(helpEvent); + + } + else // unknown help event? + { + processed = false; + } +#endif // !__WXWINCE__ + } + break; +#endif // WM_HELP + +#if !defined(__WXWINCE__) + case WM_CONTEXTMENU: + { + // we don't convert from screen to client coordinates as + // the event may be handled by a parent window + wxPoint pt(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); + + wxContextMenuEvent evtCtx(wxEVT_CONTEXT_MENU, GetId(), pt); + + // we could have got an event from our child, reflect it back + // to it if this is the case + wxWindowMSW *win = NULL; + if ( (WXHWND)wParam != m_hWnd ) + { + win = FindItemByHWND((WXHWND)wParam); + } + + if ( !win ) + win = this; + + evtCtx.SetEventObject(win); + processed = win->GetEventHandler()->ProcessEvent(evtCtx); + } + break; +#endif + + case WM_MENUCHAR: + // we're only interested in our own menus, not MF_SYSMENU + if ( HIWORD(wParam) == MF_POPUP ) + { + // handle menu chars for ownerdrawn menu items + int i = HandleMenuChar(toupper(LOWORD(wParam)), lParam); + if ( i != wxNOT_FOUND ) + { + rc.result = MAKELRESULT(i, MNC_EXECUTE); + processed = true; + } + } + break; + +#ifndef __WXWINCE__ + case WM_POWERBROADCAST: + { + bool vetoed; + processed = HandlePower(wParam, lParam, &vetoed); + rc.result = processed && vetoed ? BROADCAST_QUERY_DENY : TRUE; + } + break; +#endif // __WXWINCE__ + +#if wxUSE_UXTHEME + // If we want the default themed border then we need to draw it ourselves + case WM_NCCALCSIZE: + { + wxUxThemeEngine* theme = wxUxThemeEngine::GetIfActive(); + if (theme && TranslateBorder(GetBorder()) == wxBORDER_THEME) + { + // first ask the widget to calculate the border size + rc.result = MSWDefWindowProc(message, wParam, lParam); + processed = true; + + // now alter the client size making room for drawing a themed border + NCCALCSIZE_PARAMS *csparam = NULL; + RECT rect; + if (wParam) + { + csparam = (NCCALCSIZE_PARAMS*)lParam; + rect = csparam->rgrc[0]; + } + else + { + rect = *((RECT*)lParam); + } + wxUxThemeHandle hTheme((const wxWindow*) this, L"EDIT"); + RECT rcClient = { 0, 0, 0, 0 }; + wxClientDC dc((wxWindow*) this); + + if (theme->GetThemeBackgroundContentRect( + hTheme, GetHdcOf(dc), EP_EDITTEXT, ETS_NORMAL, + &rect, &rcClient) == S_OK) + { + InflateRect(&rcClient, -1, -1); + if (wParam) + csparam->rgrc[0] = rcClient; + else + *((RECT*)lParam) = rcClient; + // WVR_REDRAW triggers a bug whereby child windows are moved up and left, + // so don't use. + //rc.result = WVR_REDRAW; + } + } + } + break; + + case WM_NCPAINT: + { + wxUxThemeEngine* theme = wxUxThemeEngine::GetIfActive(); + if (theme && TranslateBorder(GetBorder()) == wxBORDER_THEME) + { + // first ask the widget to paint its non-client area, such as scrollbars, etc. + rc.result = MSWDefWindowProc(message, wParam, lParam); + processed = true; + + wxUxThemeHandle hTheme((const wxWindow*) this, L"EDIT"); + wxWindowDC dc((wxWindow*) this); + + // Clip the DC so that you only draw on the non-client area + RECT rcBorder; + wxCopyRectToRECT(GetSize(), rcBorder); + + RECT rcClient; + theme->GetThemeBackgroundContentRect( + hTheme, GetHdcOf(dc), EP_EDITTEXT, ETS_NORMAL, &rcBorder, &rcClient); + InflateRect(&rcClient, -1, -1); + + ::ExcludeClipRect(GetHdcOf(dc), rcClient.left, rcClient.top, + rcClient.right, rcClient.bottom); + + // Make sure the background is in a proper state + if (theme->IsThemeBackgroundPartiallyTransparent(hTheme, EP_EDITTEXT, ETS_NORMAL)) + { + theme->DrawThemeParentBackground(GetHwnd(), GetHdcOf(dc), &rcBorder); + } + + // Draw the border + int nState; + if ( !IsEnabled() ) + nState = ETS_DISABLED; + // should we check this? + //else if ( ::GetWindowLong(GetHwnd(), GWL_STYLE) & ES_READONLY) + // nState = ETS_READONLY; + else + nState = ETS_NORMAL; + theme->DrawThemeBackground(hTheme, GetHdcOf(dc), EP_EDITTEXT, nState, &rcBorder, NULL); + } + } + break; + +#endif // wxUSE_UXTHEME + + } + + if ( !processed ) + { +#ifdef __WXDEBUG__ + wxLogTrace(wxTraceMessages, wxT("Forwarding %s to DefWindowProc."), + wxGetMessageName(message)); +#endif // __WXDEBUG__ + rc.result = MSWDefWindowProc(message, wParam, lParam); + } + + return rc.result; +} + +// ---------------------------------------------------------------------------- +// wxWindow <-> HWND map +// ---------------------------------------------------------------------------- + +wxWinHashTable *wxWinHandleHash = NULL; + +wxWindow *wxFindWinFromHandle(WXHWND hWnd) +{ + return (wxWindow*)wxWinHandleHash->Get((long)hWnd); +} + +void wxAssociateWinWithHandle(HWND hWnd, wxWindowMSW *win) +{ + // adding NULL hWnd is (first) surely a result of an error and + // (secondly) breaks menu command processing + wxCHECK_RET( hWnd != (HWND)NULL, + wxT("attempt to add a NULL hWnd to window list ignored") ); + + wxWindow *oldWin = wxFindWinFromHandle((WXHWND) hWnd); +#ifdef __WXDEBUG__ + if ( oldWin && (oldWin != win) ) + { + wxLogDebug(wxT("HWND %X already associated with another window (%s)"), + (int) hWnd, win->GetClassInfo()->GetClassName()); + } + else +#endif // __WXDEBUG__ + if (!oldWin) + { + wxWinHandleHash->Put((long)hWnd, (wxWindow *)win); + } +} + +void wxRemoveHandleAssociation(wxWindowMSW *win) +{ + wxWinHandleHash->Delete((long)win->GetHWND()); +} + +// ---------------------------------------------------------------------------- +// various MSW speciic class dependent functions +// ---------------------------------------------------------------------------- + +// Default destroyer - override if you destroy it in some other way +// (e.g. with MDI child windows) +void wxWindowMSW::MSWDestroyWindow() +{ +} + +bool wxWindowMSW::MSWGetCreateWindowCoords(const wxPoint& pos, + const wxSize& size, + int& x, int& y, + int& w, int& h) const +{ + // yes, those are just some arbitrary hardcoded numbers + static const int DEFAULT_Y = 200; + + bool nonDefault = false; + + if ( pos.x == wxDefaultCoord ) + { + // if x is set to CW_USEDEFAULT, y parameter is ignored anyhow so we + // can just as well set it to CW_USEDEFAULT as well + x = + y = CW_USEDEFAULT; + } + else + { + // OTOH, if x is not set to CW_USEDEFAULT, y shouldn't be set to it + // neither because it is not handled as a special value by Windows then + // and so we have to choose some default value for it + x = pos.x; + y = pos.y == wxDefaultCoord ? DEFAULT_Y : pos.y; + + nonDefault = true; + } + + /* + NB: there used to be some code here which set the initial size of the + window to the client size of the parent if no explicit size was + specified. This was wrong because wxWidgets programs often assume + that they get a WM_SIZE (EVT_SIZE) upon creation, however this broke + it. To see why, you should understand that Windows sends WM_SIZE from + inside ::CreateWindow() anyhow. However, ::CreateWindow() is called + from some base class ctor and so this WM_SIZE is not processed in the + real class' OnSize() (because it's not fully constructed yet and the + event goes to some base class OnSize() instead). So the WM_SIZE we + rely on is the one sent when the parent frame resizes its children + but here is the problem: if the child already has just the right + size, nothing will happen as both wxWidgets and Windows check for + this and ignore any attempts to change the window size to the size it + already has - so no WM_SIZE would be sent. + */ + + + // we don't use CW_USEDEFAULT here for several reasons: + // + // 1. it results in huge frames on modern screens (1000*800 is not + // uncommon on my 1280*1024 screen) which is way too big for a half + // empty frame of most of wxWidgets samples for example) + // + // 2. it is buggy for frames with wxFRAME_TOOL_WINDOW style for which + // the default is for whatever reason 8*8 which breaks client <-> + // window size calculations (it would be nice if it didn't, but it + // does and the simplest way to fix it seemed to change the broken + // default size anyhow) + // + // 3. there is just no advantage in doing it: with x and y it is + // possible that [future versions of] Windows position the new top + // level window in some smart way which we can't do, but we can + // guess a reasonably good size for a new window just as well + // ourselves + + // However, on PocketPC devices, we must use the default + // size if possible. +#ifdef _WIN32_WCE + if (size.x == wxDefaultCoord) + w = CW_USEDEFAULT; + else + w = size.x; + if (size.y == wxDefaultCoord) + h = CW_USEDEFAULT; + else + h = size.y; +#else + if ( size.x == wxDefaultCoord || size.y == wxDefaultCoord) + { + nonDefault = true; + } + w = WidthDefault(size.x); + h = HeightDefault(size.y); +#endif + + AdjustForParentClientOrigin(x, y); + + return nonDefault; +} + +WXHWND wxWindowMSW::MSWGetParent() const +{ + return m_parent ? m_parent->GetHWND() : WXHWND(NULL); +} + +bool wxWindowMSW::MSWCreate(const wxChar *wclass, + const wxChar *title, + const wxPoint& pos, + const wxSize& size, + WXDWORD style, + WXDWORD extendedStyle) +{ + // check a common bug in the user code: if the window is created with a + // non-default ctor and Create() is called too, we'd create 2 HWND for a + // single wxWindow object and this results in all sorts of trouble, + // especially for wxTLWs + wxCHECK_MSG( !m_hWnd, true, wxT("window can't be recreated") ); + + // this can happen if this function is called using the return value of + // wxApp::GetRegisteredClassName() which failed + wxCHECK_MSG( wclass, false, wxT("failed to register window class?") ); + + // choose the position/size for the new window + int x, y, w, h; + (void)MSWGetCreateWindowCoords(pos, size, x, y, w, h); + + // controlId is menu handle for the top level windows, so set it to 0 + // unless we're creating a child window + int controlId = style & WS_CHILD ? GetId() : 0; + + // for each class "Foo" we have we also have "FooNR" ("no repaint") class + // which is the same but without CS_[HV]REDRAW class styles so using it + // ensures that the window is not fully repainted on each resize + wxString className(wclass); + if ( !HasFlag(wxFULL_REPAINT_ON_RESIZE) ) + { + className += wxT("NR"); + } + + // do create the window + wxWindowCreationHook hook(this); + + m_hWnd = (WXHWND)::CreateWindowEx + ( + extendedStyle, + className, + title ? title : m_windowName.c_str(), + style, + x, y, w, h, + (HWND)MSWGetParent(), + (HMENU)controlId, + wxGetInstance(), + NULL // no extra data + ); + + if ( !m_hWnd ) + { + wxLogSysError(_("Can't create window of class %s"), className.c_str()); + + return false; + } + + SubclassWin(m_hWnd); + + return true; +} + +// =========================================================================== +// MSW message handlers +// =========================================================================== + +// --------------------------------------------------------------------------- +// WM_NOTIFY +// --------------------------------------------------------------------------- + +bool wxWindowMSW::HandleNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) +{ +#ifndef __WXMICROWIN__ + LPNMHDR hdr = (LPNMHDR)lParam; + HWND hWnd = hdr->hwndFrom; + wxWindow *win = wxFindWinFromHandle((WXHWND)hWnd); + + // if the control is one of our windows, let it handle the message itself + if ( win ) + { + return win->MSWOnNotify(idCtrl, lParam, result); + } + + // VZ: why did we do it? normally this is unnecessary and, besides, it + // breaks the message processing for the toolbars because the tooltip + // notifications were being forwarded to the toolbar child controls + // (if it had any) before being passed to the toolbar itself, so in my + // example the tooltip for the combobox was always shown instead of the + // correct button tooltips +#if 0 + // try all our children + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + while ( node ) + { + wxWindow *child = node->GetData(); + if ( child->MSWOnNotify(idCtrl, lParam, result) ) + { + return true; + } + + node = node->GetNext(); + } +#endif // 0 + + // by default, handle it ourselves + return MSWOnNotify(idCtrl, lParam, result); +#else // __WXMICROWIN__ + return false; +#endif +} + +#if wxUSE_TOOLTIPS + +bool wxWindowMSW::HandleTooltipNotify(WXUINT code, + WXLPARAM lParam, + const wxString& ttip) +{ + // I don't know why it happens, but the versions of comctl32.dll starting + // from 4.70 sometimes send TTN_NEEDTEXTW even to ANSI programs (normally, + // this message is supposed to be sent to Unicode programs only) -- hence + // we need to handle it as well, otherwise no tooltips will be shown in + // this case +#ifndef __WXWINCE__ + if ( !(code == (WXUINT) TTN_NEEDTEXTA || code == (WXUINT) TTN_NEEDTEXTW) + || ttip.empty() ) + { + // not a tooltip message or no tooltip to show anyhow + return false; + } +#endif + + LPTOOLTIPTEXT ttText = (LPTOOLTIPTEXT)lParam; + + // We don't want to use the szText buffer because it has a limit of 80 + // bytes and this is not enough, especially for Unicode build where it + // limits the tooltip string length to only 40 characters + // + // The best would be, of course, to not impose any length limitations at + // all but then the buffer would have to be dynamic and someone would have + // to free it and we don't have the tooltip owner object here any more, so + // for now use our own static buffer with a higher fixed max length. + // + // Note that using a static buffer should not be a problem as only a single + // tooltip can be shown at the same time anyhow. +#if !wxUSE_UNICODE + if ( code == (WXUINT) TTN_NEEDTEXTW ) + { + // We need to convert tooltip from multi byte to Unicode on the fly. + static wchar_t buf[513]; + + // Truncate tooltip length if needed as otherwise we might not have + // enough space for it in the buffer and MultiByteToWideChar() would + // return an error + size_t tipLength = wxMin(ttip.length(), WXSIZEOF(buf) - 1); + + // Convert to WideChar without adding the NULL character. The NULL + // character is added afterwards (this is more efficient). + int len = ::MultiByteToWideChar + ( + CP_ACP, + 0, // no flags + ttip, + tipLength, + buf, + WXSIZEOF(buf) - 1 + ); + + if ( !len ) + { + wxLogLastError(_T("MultiByteToWideChar()")); + } + + buf[len] = L'\0'; + ttText->lpszText = (LPSTR) buf; + } + else // TTN_NEEDTEXTA +#endif // !wxUSE_UNICODE + { + // we get here if we got TTN_NEEDTEXTA (only happens in ANSI build) or + // if we got TTN_NEEDTEXTW in Unicode build: in this case we just have + // to copy the string we have into the buffer + static wxChar buf[513]; + wxStrncpy(buf, ttip.c_str(), WXSIZEOF(buf) - 1); + buf[WXSIZEOF(buf) - 1] = _T('\0'); + ttText->lpszText = buf; + } + + return true; +} + +#endif // wxUSE_TOOLTIPS + +bool wxWindowMSW::MSWOnNotify(int WXUNUSED(idCtrl), + WXLPARAM lParam, + WXLPARAM* WXUNUSED(result)) +{ +#if wxUSE_TOOLTIPS + if ( m_tooltip ) + { + NMHDR* hdr = (NMHDR *)lParam; + if ( HandleTooltipNotify(hdr->code, lParam, m_tooltip->GetTip())) + { + // processed + return true; + } + } +#else + wxUnusedVar(lParam); +#endif // wxUSE_TOOLTIPS + + return false; +} + +// --------------------------------------------------------------------------- +// end session messages +// --------------------------------------------------------------------------- + +bool wxWindowMSW::HandleQueryEndSession(long logOff, bool *mayEnd) +{ +#ifdef ENDSESSION_LOGOFF + wxCloseEvent event(wxEVT_QUERY_END_SESSION, wxID_ANY); + event.SetEventObject(wxTheApp); + event.SetCanVeto(true); + event.SetLoggingOff(logOff == (long)ENDSESSION_LOGOFF); + + bool rc = wxTheApp->ProcessEvent(event); + + if ( rc ) + { + // we may end only if the app didn't veto session closing (double + // negation...) + *mayEnd = !event.GetVeto(); + } + + return rc; +#else + wxUnusedVar(logOff); + wxUnusedVar(mayEnd); + return false; +#endif +} + +bool wxWindowMSW::HandleEndSession(bool endSession, long logOff) +{ +#ifdef ENDSESSION_LOGOFF + // do nothing if the session isn't ending + if ( !endSession ) + return false; + + // only send once + if ( (this != wxTheApp->GetTopWindow()) ) + return false; + + wxCloseEvent event(wxEVT_END_SESSION, wxID_ANY); + event.SetEventObject(wxTheApp); + event.SetCanVeto(false); + event.SetLoggingOff((logOff & ENDSESSION_LOGOFF) != 0); + + return wxTheApp->ProcessEvent(event); +#else + wxUnusedVar(endSession); + wxUnusedVar(logOff); + return false; +#endif +} + +// --------------------------------------------------------------------------- +// window creation/destruction +// --------------------------------------------------------------------------- + +bool wxWindowMSW::HandleCreate(WXLPCREATESTRUCT WXUNUSED_IN_WINCE(cs), + bool *mayCreate) +{ + // VZ: why is this commented out for WinCE? If it doesn't support + // WS_EX_CONTROLPARENT at all it should be somehow handled globally, + // not with multiple #ifdef's! +#ifndef __WXWINCE__ + if ( ((CREATESTRUCT *)cs)->dwExStyle & WS_EX_CONTROLPARENT ) + EnsureParentHasControlParentStyle(GetParent()); +#endif // !__WXWINCE__ + + *mayCreate = true; + + return true; +} + +bool wxWindowMSW::HandleDestroy() +{ + SendDestroyEvent(); + + // delete our drop target if we've got one +#if wxUSE_DRAG_AND_DROP + if ( m_dropTarget != NULL ) + { + m_dropTarget->Revoke(m_hWnd); + + delete m_dropTarget; + m_dropTarget = NULL; + } +#endif // wxUSE_DRAG_AND_DROP + + // WM_DESTROY handled + return true; +} + +// --------------------------------------------------------------------------- +// activation/focus +// --------------------------------------------------------------------------- + +bool wxWindowMSW::HandleActivate(int state, + bool WXUNUSED(minimized), + WXHWND WXUNUSED(activate)) +{ + wxActivateEvent event(wxEVT_ACTIVATE, + (state == WA_ACTIVE) || (state == WA_CLICKACTIVE), + m_windowId); + event.SetEventObject(this); + + return GetEventHandler()->ProcessEvent(event); +} + +bool wxWindowMSW::HandleSetFocus(WXHWND hwnd) +{ + // Strangly enough, some controls get set focus events when they are being + // deleted, even if they already had focus before. + if ( m_isBeingDeleted ) + { + return false; + } + + // notify the parent keeping track of focus for the kbd navigation + // purposes that we got it + wxChildFocusEvent eventFocus((wxWindow *)this); + (void)GetEventHandler()->ProcessEvent(eventFocus); + +#if wxUSE_CARET + // Deal with caret + if ( m_caret ) + { + m_caret->OnSetFocus(); + } +#endif // wxUSE_CARET + +#if wxUSE_TEXTCTRL + // If it's a wxTextCtrl don't send the event as it will be done + // after the control gets to process it from EN_FOCUS handler + if ( wxDynamicCastThis(wxTextCtrl) ) + { + return false; + } +#endif // wxUSE_TEXTCTRL + + wxFocusEvent event(wxEVT_SET_FOCUS, m_windowId); + event.SetEventObject(this); + + // wxFindWinFromHandle() may return NULL, it is ok + event.SetWindow(wxFindWinFromHandle(hwnd)); + + return GetEventHandler()->ProcessEvent(event); +} + +bool wxWindowMSW::HandleKillFocus(WXHWND hwnd) +{ +#if wxUSE_CARET + // Deal with caret + if ( m_caret ) + { + m_caret->OnKillFocus(); + } +#endif // wxUSE_CARET + +#if wxUSE_TEXTCTRL + // If it's a wxTextCtrl don't send the event as it will be done + // after the control gets to process it. + wxTextCtrl *ctrl = wxDynamicCastThis(wxTextCtrl); + if ( ctrl ) + { + return false; + } +#endif + + // Don't send the event when in the process of being deleted. This can + // only cause problems if the event handler tries to access the object. + if ( m_isBeingDeleted ) + { + return false; + } + + wxFocusEvent event(wxEVT_KILL_FOCUS, m_windowId); + event.SetEventObject(this); + + // wxFindWinFromHandle() may return NULL, it is ok + event.SetWindow(wxFindWinFromHandle(hwnd)); + + return GetEventHandler()->ProcessEvent(event); +} + +// --------------------------------------------------------------------------- +// labels +// --------------------------------------------------------------------------- + +void wxWindowMSW::SetLabel( const wxString& label) +{ + SetWindowText(GetHwnd(), label.c_str()); +} + +wxString wxWindowMSW::GetLabel() const +{ + return wxGetWindowText(GetHWND()); +} + +// --------------------------------------------------------------------------- +// miscellaneous +// --------------------------------------------------------------------------- + +bool wxWindowMSW::HandleShow(bool show, int WXUNUSED(status)) +{ + wxShowEvent event(GetId(), show); + event.SetEventObject(this); + + return GetEventHandler()->ProcessEvent(event); +} + +bool wxWindowMSW::HandleInitDialog(WXHWND WXUNUSED(hWndFocus)) +{ + wxInitDialogEvent event(GetId()); + event.SetEventObject(this); + + return GetEventHandler()->ProcessEvent(event); +} + +bool wxWindowMSW::HandleDropFiles(WXWPARAM wParam) +{ +#if defined (__WXMICROWIN__) || defined(__WXWINCE__) + wxUnusedVar(wParam); + return false; +#else // __WXMICROWIN__ + HDROP hFilesInfo = (HDROP) wParam; + + // Get the total number of files dropped + UINT gwFilesDropped = ::DragQueryFile + ( + (HDROP)hFilesInfo, + (UINT)-1, + (LPTSTR)0, + (UINT)0 + ); + + wxString *files = new wxString[gwFilesDropped]; + for ( UINT wIndex = 0; wIndex < gwFilesDropped; wIndex++ ) + { + // first get the needed buffer length (+1 for terminating NUL) + size_t len = ::DragQueryFile(hFilesInfo, wIndex, NULL, 0) + 1; + + // and now get the file name + ::DragQueryFile(hFilesInfo, wIndex, + wxStringBuffer(files[wIndex], len), len); + } + + wxDropFilesEvent event(wxEVT_DROP_FILES, gwFilesDropped, files); + event.SetEventObject(this); + + POINT dropPoint; + DragQueryPoint(hFilesInfo, (LPPOINT) &dropPoint); + event.m_pos.x = dropPoint.x; + event.m_pos.y = dropPoint.y; + + DragFinish(hFilesInfo); + + return GetEventHandler()->ProcessEvent(event); +#endif +} + + +bool wxWindowMSW::HandleSetCursor(WXHWND WXUNUSED(hWnd), + short nHitTest, + int WXUNUSED(mouseMsg)) +{ +#ifndef __WXMICROWIN__ + // the logic is as follows: + // -1. don't set cursor for non client area, including but not limited to + // the title bar, scrollbars, &c + // 0. allow the user to override default behaviour by using EVT_SET_CURSOR + // 1. if we have the cursor set it unless wxIsBusy() + // 2. if we're a top level window, set some cursor anyhow + // 3. if wxIsBusy(), set the busy cursor, otherwise the global one + + if ( nHitTest != HTCLIENT ) + { + return false; + } + + HCURSOR hcursor = 0; + + // first ask the user code - it may wish to set the cursor in some very + // specific way (for example, depending on the current position) + POINT pt; +#ifdef __WXWINCE__ + if ( !::GetCursorPosWinCE(&pt)) +#else + if ( !::GetCursorPos(&pt) ) +#endif + { + wxLogLastError(wxT("GetCursorPos")); + } + + int x = pt.x, + y = pt.y; + ScreenToClient(&x, &y); + wxSetCursorEvent event(x, y); + event.SetId(GetId()); + event.SetEventObject(this); + + bool processedEvtSetCursor = GetEventHandler()->ProcessEvent(event); + if ( processedEvtSetCursor && event.HasCursor() ) + { + hcursor = GetHcursorOf(event.GetCursor()); + } + + if ( !hcursor ) + { + bool isBusy = wxIsBusy(); + + // the test for processedEvtSetCursor is here to prevent using m_cursor + // if the user code caught EVT_SET_CURSOR() and returned nothing from + // it - this is a way to say that our cursor shouldn't be used for this + // point + if ( !processedEvtSetCursor && m_cursor.Ok() ) + { + hcursor = GetHcursorOf(m_cursor); + } + + if ( !GetParent() ) + { + if ( isBusy ) + { + hcursor = wxGetCurrentBusyCursor(); + } + else if ( !hcursor ) + { + const wxCursor *cursor = wxGetGlobalCursor(); + if ( cursor && cursor->Ok() ) + { + hcursor = GetHcursorOf(*cursor); + } + } + } + } + + if ( hcursor ) + { +// wxLogDebug("HandleSetCursor: Setting cursor %ld", (long) hcursor); + + ::SetCursor(hcursor); + + // cursor set, stop here + return true; + } +#endif // __WXMICROWIN__ + + // pass up the window chain + return false; +} + +bool wxWindowMSW::HandlePower(WXWPARAM WXUNUSED_IN_WINCE(wParam), + WXLPARAM WXUNUSED(lParam), + bool *WXUNUSED_IN_WINCE(vetoed)) +{ +#ifdef __WXWINCE__ + // FIXME + return false; +#else + wxEventType evtType; + switch ( wParam ) + { + case PBT_APMQUERYSUSPEND: + evtType = wxEVT_POWER_SUSPENDING; + break; + + case PBT_APMQUERYSUSPENDFAILED: + evtType = wxEVT_POWER_SUSPEND_CANCEL; + break; + + case PBT_APMSUSPEND: + evtType = wxEVT_POWER_SUSPENDED; + break; + + case PBT_APMRESUMESUSPEND: +#ifdef PBT_APMRESUMEAUTOMATIC + case PBT_APMRESUMEAUTOMATIC: +#endif + evtType = wxEVT_POWER_RESUME; + break; + + default: + wxLogDebug(_T("Unknown WM_POWERBROADCAST(%d) event"), wParam); + // fall through + + // these messages are currently not mapped to wx events + case PBT_APMQUERYSTANDBY: + case PBT_APMQUERYSTANDBYFAILED: + case PBT_APMSTANDBY: + case PBT_APMRESUMESTANDBY: + case PBT_APMBATTERYLOW: + case PBT_APMPOWERSTATUSCHANGE: + case PBT_APMOEMEVENT: + case PBT_APMRESUMECRITICAL: + evtType = wxEVT_NULL; + break; + } + + // don't handle unknown messages + if ( evtType == wxEVT_NULL ) + return false; + + // TODO: notify about PBTF_APMRESUMEFROMFAILURE in case of resume events? + + wxPowerEvent event(evtType); + if ( !GetEventHandler()->ProcessEvent(event) ) + return false; + + *vetoed = event.IsVetoed(); + + return true; +#endif +} + +bool wxWindowMSW::IsDoubleBuffered() const +{ + const wxWindowMSW *wnd = this; + do { + long style = ::GetWindowLong(GetHwndOf(wnd), GWL_EXSTYLE); + if ( (style & WS_EX_COMPOSITED) != 0 ) + return true; + wnd = wnd->GetParent(); + } while ( wnd && !wnd->IsTopLevel() ); + + return false; +} + +void wxWindowMSW::SetDoubleBuffered(bool on) +{ + // Get the current extended style bits + long exstyle = ::GetWindowLong(GetHwnd(), GWL_EXSTYLE); + + // Twiddle the bit as needed + if ( on ) + exstyle |= WS_EX_COMPOSITED; + else + exstyle &= ~WS_EX_COMPOSITED; + + // put it back + ::SetWindowLong(GetHwnd(), GWL_EXSTYLE, exstyle); +} + +// --------------------------------------------------------------------------- +// owner drawn stuff +// --------------------------------------------------------------------------- + +#if (wxUSE_OWNER_DRAWN && wxUSE_MENUS_NATIVE) || \ + (wxUSE_CONTROLS && !defined(__WXUNIVERSAL__)) + #define WXUNUSED_UNLESS_ODRAWN(param) param +#else + #define WXUNUSED_UNLESS_ODRAWN(param) +#endif + +bool +wxWindowMSW::MSWOnDrawItem(int WXUNUSED_UNLESS_ODRAWN(id), + WXDRAWITEMSTRUCT * WXUNUSED_UNLESS_ODRAWN(itemStruct)) +{ +#if wxUSE_OWNER_DRAWN + +#if wxUSE_MENUS_NATIVE + // is it a menu item? + DRAWITEMSTRUCT *pDrawStruct = (DRAWITEMSTRUCT *)itemStruct; + if ( id == 0 && pDrawStruct->CtlType == ODT_MENU ) + { + wxMenuItem *pMenuItem = (wxMenuItem *)(pDrawStruct->itemData); + + // see comment before the same test in MSWOnMeasureItem() below + if ( !pMenuItem ) + return false; + + wxCHECK_MSG( wxDynamicCast(pMenuItem, wxMenuItem), + false, _T("MSWOnDrawItem: bad wxMenuItem pointer") ); + + // prepare to call OnDrawItem(): notice using of wxDCTemp to prevent + // the DC from being released + wxDCTemp dc((WXHDC)pDrawStruct->hDC); + wxRect rect(pDrawStruct->rcItem.left, pDrawStruct->rcItem.top, + pDrawStruct->rcItem.right - pDrawStruct->rcItem.left, + pDrawStruct->rcItem.bottom - pDrawStruct->rcItem.top); + + return pMenuItem->OnDrawItem + ( + dc, + rect, + (wxOwnerDrawn::wxODAction)pDrawStruct->itemAction, + (wxOwnerDrawn::wxODStatus)pDrawStruct->itemState + ); + } +#endif // wxUSE_MENUS_NATIVE + +#endif // USE_OWNER_DRAWN + +#if wxUSE_CONTROLS && !defined(__WXUNIVERSAL__) + +#if wxUSE_OWNER_DRAWN + wxControl *item = wxDynamicCast(FindItem(id), wxControl); +#else // !wxUSE_OWNER_DRAWN + // we may still have owner-drawn buttons internally because we have to make + // them owner-drawn to support colour change + wxControl *item = +# if wxUSE_BUTTON + wxDynamicCast(FindItem(id), wxButton) +# else + NULL +# endif + ; +#endif // USE_OWNER_DRAWN + + if ( item ) + { + return item->MSWOnDraw(itemStruct); + } + +#endif // wxUSE_CONTROLS + + return false; +} + +bool +wxWindowMSW::MSWOnMeasureItem(int id, WXMEASUREITEMSTRUCT *itemStruct) +{ +#if wxUSE_OWNER_DRAWN && wxUSE_MENUS_NATIVE + // is it a menu item? + MEASUREITEMSTRUCT *pMeasureStruct = (MEASUREITEMSTRUCT *)itemStruct; + if ( id == 0 && pMeasureStruct->CtlType == ODT_MENU ) + { + wxMenuItem *pMenuItem = (wxMenuItem *)(pMeasureStruct->itemData); + + // according to Carsten Fuchs the pointer may be NULL under XP if an + // MDI child frame is initially maximized, see this for more info: + // http://article.gmane.org/gmane.comp.lib.wxwidgets.general/27745 + // + // so silently ignore it instead of asserting + if ( !pMenuItem ) + return false; + + wxCHECK_MSG( wxDynamicCast(pMenuItem, wxMenuItem), + false, _T("MSWOnMeasureItem: bad wxMenuItem pointer") ); + + size_t w, h; + bool rc = pMenuItem->OnMeasureItem(&w, &h); + + pMeasureStruct->itemWidth = w; + pMeasureStruct->itemHeight = h; + + return rc; + } + + wxControl *item = wxDynamicCast(FindItem(id), wxControl); + if ( item ) + { + return item->MSWOnMeasure(itemStruct); + } +#else + wxUnusedVar(id); + wxUnusedVar(itemStruct); +#endif // wxUSE_OWNER_DRAWN && wxUSE_MENUS_NATIVE + + return false; +} + +// --------------------------------------------------------------------------- +// colours and palettes +// --------------------------------------------------------------------------- + +bool wxWindowMSW::HandleSysColorChange() +{ + wxSysColourChangedEvent event; + event.SetEventObject(this); + + (void)GetEventHandler()->ProcessEvent(event); + + // always let the system carry on the default processing to allow the + // native controls to react to the colours update + return false; +} + +bool wxWindowMSW::HandleDisplayChange() +{ + wxDisplayChangedEvent event; + event.SetEventObject(this); + + return GetEventHandler()->ProcessEvent(event); +} + +#ifndef __WXMICROWIN__ + +bool wxWindowMSW::HandleCtlColor(WXHBRUSH *brush, WXHDC hDC, WXHWND hWnd) +{ +#if !wxUSE_CONTROLS || defined(__WXUNIVERSAL__) + wxUnusedVar(hDC); + wxUnusedVar(hWnd); +#else + wxControl *item = wxDynamicCast(FindItemByHWND(hWnd, true), wxControl); + + if ( item ) + *brush = item->MSWControlColor(hDC, hWnd); + else +#endif // wxUSE_CONTROLS + *brush = NULL; + + return *brush != NULL; +} + +#endif // __WXMICROWIN__ + +bool wxWindowMSW::HandlePaletteChanged(WXHWND hWndPalChange) +{ +#if wxUSE_PALETTE + // same as below except we don't respond to our own messages + if ( hWndPalChange != GetHWND() ) + { + // check to see if we our our parents have a custom palette + wxWindowMSW *win = this; + while ( win && !win->HasCustomPalette() ) + { + win = win->GetParent(); + } + + if ( win && win->HasCustomPalette() ) + { + // realize the palette to see whether redrawing is needed + HDC hdc = ::GetDC((HWND) hWndPalChange); + win->m_palette.SetHPALETTE((WXHPALETTE) + ::SelectPalette(hdc, GetHpaletteOf(win->m_palette), FALSE)); + + int result = ::RealizePalette(hdc); + + // restore the palette (before releasing the DC) + win->m_palette.SetHPALETTE((WXHPALETTE) + ::SelectPalette(hdc, GetHpaletteOf(win->m_palette), FALSE)); + ::RealizePalette(hdc); + ::ReleaseDC((HWND) hWndPalChange, hdc); + + // now check for the need to redraw + if (result > 0) + ::InvalidateRect((HWND) hWndPalChange, NULL, TRUE); + } + + } +#endif // wxUSE_PALETTE + + wxPaletteChangedEvent event(GetId()); + event.SetEventObject(this); + event.SetChangedWindow(wxFindWinFromHandle(hWndPalChange)); + + return GetEventHandler()->ProcessEvent(event); +} + +bool wxWindowMSW::HandleCaptureChanged(WXHWND hWndGainedCapture) +{ + // notify windows on the capture stack about lost capture + // (see http://sourceforge.net/tracker/index.php?func=detail&aid=1153662&group_id=9863&atid=109863): + wxWindowBase::NotifyCaptureLost(); + + wxWindow *win = wxFindWinFromHandle(hWndGainedCapture); + wxMouseCaptureChangedEvent event(GetId(), win); + event.SetEventObject(this); + return GetEventHandler()->ProcessEvent(event); +} + +bool wxWindowMSW::HandleSettingChange(WXWPARAM wParam, WXLPARAM lParam) +{ + // despite MSDN saying "(This message cannot be sent directly to a window.)" + // we need to send this to child windows (it is only sent to top-level + // windows) so {list,tree}ctrls can adjust their font size if necessary + // this is exactly how explorer does it to enable the font size changes + + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + while ( node ) + { + // top-level windows already get this message from the system + wxWindow *win = node->GetData(); + if ( !win->IsTopLevel() ) + { + ::SendMessage(GetHwndOf(win), WM_SETTINGCHANGE, wParam, lParam); + } + + node = node->GetNext(); + } + + // let the system handle it + return false; +} + +bool wxWindowMSW::HandleQueryNewPalette() +{ + +#if wxUSE_PALETTE + // check to see if we our our parents have a custom palette + wxWindowMSW *win = this; + while (!win->HasCustomPalette() && win->GetParent()) win = win->GetParent(); + if (win->HasCustomPalette()) { + /* realize the palette to see whether redrawing is needed */ + HDC hdc = ::GetDC((HWND) GetHWND()); + win->m_palette.SetHPALETTE( (WXHPALETTE) + ::SelectPalette(hdc, (HPALETTE) win->m_palette.GetHPALETTE(), FALSE) ); + + int result = ::RealizePalette(hdc); + /* restore the palette (before releasing the DC) */ + win->m_palette.SetHPALETTE( (WXHPALETTE) + ::SelectPalette(hdc, (HPALETTE) win->m_palette.GetHPALETTE(), TRUE) ); + ::RealizePalette(hdc); + ::ReleaseDC((HWND) GetHWND(), hdc); + /* now check for the need to redraw */ + if (result > 0) + ::InvalidateRect((HWND) GetHWND(), NULL, TRUE); + } +#endif // wxUSE_PALETTE + + wxQueryNewPaletteEvent event(GetId()); + event.SetEventObject(this); + + return GetEventHandler()->ProcessEvent(event) && event.GetPaletteRealized(); +} + +// Responds to colour changes: passes event on to children. +void wxWindowMSW::OnSysColourChanged(wxSysColourChangedEvent& WXUNUSED(event)) +{ + // the top level window also reset the standard colour map as it might have + // changed (there is no need to do it for the non top level windows as we + // only have to do it once) + if ( IsTopLevel() ) + { + // FIXME-MT + gs_hasStdCmap = false; + } + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + while ( node ) + { + // Only propagate to non-top-level windows because Windows already + // sends this event to all top-level ones + wxWindow *win = node->GetData(); + if ( !win->IsTopLevel() ) + { + // we need to send the real WM_SYSCOLORCHANGE and not just trigger + // EVT_SYS_COLOUR_CHANGED call because the latter wouldn't work for + // the standard controls + ::SendMessage(GetHwndOf(win), WM_SYSCOLORCHANGE, 0, 0); + } + + node = node->GetNext(); + } +} + +extern wxCOLORMAP *wxGetStdColourMap() +{ + static COLORREF s_stdColours[wxSTD_COL_MAX]; + static wxCOLORMAP s_cmap[wxSTD_COL_MAX]; + + if ( !gs_hasStdCmap ) + { + static bool s_coloursInit = false; + + if ( !s_coloursInit ) + { + // When a bitmap is loaded, the RGB values can change (apparently + // because Windows adjusts them to care for the old programs always + // using 0xc0c0c0 while the transparent colour for the new Windows + // versions is different). But we do this adjustment ourselves so + // we want to avoid Windows' "help" and for this we need to have a + // reference bitmap which can tell us what the RGB values change + // to. + wxLogNull logNo; // suppress error if we couldn't load the bitmap + wxBitmap stdColourBitmap(_T("wxBITMAP_STD_COLOURS")); + if ( stdColourBitmap.Ok() ) + { + // the pixels in the bitmap must correspond to wxSTD_COL_XXX! + wxASSERT_MSG( stdColourBitmap.GetWidth() == wxSTD_COL_MAX, + _T("forgot to update wxBITMAP_STD_COLOURS!") ); + + wxMemoryDC memDC; + memDC.SelectObject(stdColourBitmap); + + wxColour colour; + for ( size_t i = 0; i < WXSIZEOF(s_stdColours); i++ ) + { + memDC.GetPixel(i, 0, &colour); + s_stdColours[i] = wxColourToRGB(colour); + } + } + else // wxBITMAP_STD_COLOURS couldn't be loaded + { + s_stdColours[0] = RGB(000,000,000); // black + s_stdColours[1] = RGB(128,128,128); // dark grey + s_stdColours[2] = RGB(192,192,192); // light grey + s_stdColours[3] = RGB(255,255,255); // white + //s_stdColours[4] = RGB(000,000,255); // blue + //s_stdColours[5] = RGB(255,000,255); // magenta + } + + s_coloursInit = true; + } + + gs_hasStdCmap = true; + + // create the colour map +#define INIT_CMAP_ENTRY(col) \ + s_cmap[wxSTD_COL_##col].from = s_stdColours[wxSTD_COL_##col]; \ + s_cmap[wxSTD_COL_##col].to = ::GetSysColor(COLOR_##col) + + INIT_CMAP_ENTRY(BTNTEXT); + INIT_CMAP_ENTRY(BTNSHADOW); + INIT_CMAP_ENTRY(BTNFACE); + INIT_CMAP_ENTRY(BTNHIGHLIGHT); + +#undef INIT_CMAP_ENTRY + } + + return s_cmap; +} + +// --------------------------------------------------------------------------- +// painting +// --------------------------------------------------------------------------- + +bool wxWindowMSW::HandlePaint() +{ + HRGN hRegion = ::CreateRectRgn(0, 0, 0, 0); // Dummy call to get a handle + if ( !hRegion ) + wxLogLastError(wxT("CreateRectRgn")); + if ( ::GetUpdateRgn(GetHwnd(), hRegion, FALSE) == ERROR ) + wxLogLastError(wxT("GetUpdateRgn")); + + m_updateRegion = wxRegion((WXHRGN) hRegion); + + wxPaintEvent event(m_windowId); + event.SetEventObject(this); + + bool processed = GetEventHandler()->ProcessEvent(event); + + // note that we must generate NC event after the normal one as otherwise + // BeginPaint() will happily overwrite our decorations with the background + // colour + wxNcPaintEvent eventNc(m_windowId); + eventNc.SetEventObject(this); + GetEventHandler()->ProcessEvent(eventNc); + + // don't keep an HRGN we don't need any longer (GetUpdateRegion() can only + // be called from inside the event handlers called above) + m_updateRegion.Clear(); + + return processed; +} + +// Can be called from an application's OnPaint handler +void wxWindowMSW::OnPaint(wxPaintEvent& event) +{ +#ifdef __WXUNIVERSAL__ + event.Skip(); +#else + HDC hDC = (HDC) wxPaintDC::FindDCInCache((wxWindow*) event.GetEventObject()); + if (hDC != 0) + { + MSWDefWindowProc(WM_PAINT, (WPARAM) hDC, 0); + } +#endif +} + +bool wxWindowMSW::HandleEraseBkgnd(WXHDC hdc) +{ + wxDCTemp dc(hdc, GetClientSize()); + + dc.SetHDC(hdc); + dc.SetWindow((wxWindow *)this); + + wxEraseEvent event(m_windowId, &dc); + event.SetEventObject(this); + bool rc = GetEventHandler()->ProcessEvent(event); + + // must be called manually as ~wxDC doesn't do anything for wxDCTemp + dc.SelectOldObjects(hdc); + + return rc; +} + +void wxWindowMSW::OnEraseBackground(wxEraseEvent& event) +{ + // standard non top level controls (i.e. except the dialogs) always erase + // their background themselves in HandleCtlColor() or have some control- + // specific ways to set the colours (common controls) + if ( IsOfStandardClass() && !IsTopLevel() ) + { + event.Skip(); + return; + } + + if ( GetBackgroundStyle() == wxBG_STYLE_CUSTOM ) + { + // don't skip the event here, custom background means that the app + // is drawing it itself in its OnPaint(), so don't draw it at all + // now to avoid flicker + return; + } + + + // do default background painting + if ( !DoEraseBackground(GetHdcOf(*event.GetDC())) ) + { + // let the system paint the background + event.Skip(); + } +} + +bool wxWindowMSW::DoEraseBackground(WXHDC hDC) +{ + HBRUSH hbr = (HBRUSH)MSWGetBgBrush(hDC); + if ( !hbr ) + return false; + + wxFillRect(GetHwnd(), (HDC)hDC, hbr); + + return true; +} + +WXHBRUSH +wxWindowMSW::MSWGetBgBrushForChild(WXHDC WXUNUSED(hDC), WXHWND hWnd) +{ + if ( m_hasBgCol ) + { + // our background colour applies to: + // 1. this window itself, always + // 2. all children unless the colour is "not inheritable" + // 3. even if it is not inheritable, our immediate transparent + // children should still inherit it -- but not any transparent + // children because it would look wrong if a child of non + // transparent child would show our bg colour when the child itself + // does not + wxWindow *win = wxFindWinFromHandle(hWnd); + if ( win == this || + m_inheritBgCol || + (win && win->HasTransparentBackground() && + win->GetParent() == this) ) + { + // draw children with the same colour as the parent + wxBrush * + brush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour()); + + return (WXHBRUSH)GetHbrushOf(*brush); + } + } + + return 0; +} + +WXHBRUSH wxWindowMSW::MSWGetBgBrush(WXHDC hDC, WXHWND hWndToPaint) +{ + if ( !hWndToPaint ) + hWndToPaint = GetHWND(); + + for ( wxWindowMSW *win = this; win; win = win->GetParent() ) + { + WXHBRUSH hBrush = win->MSWGetBgBrushForChild(hDC, hWndToPaint); + if ( hBrush ) + return hBrush; + + // background is not inherited beyond top level windows + if ( win->IsTopLevel() ) + break; + } + + return 0; +} + +bool wxWindowMSW::HandlePrintClient(WXHDC hDC) +{ + // we receive this message when DrawThemeParentBackground() is + // called from def window proc of several controls under XP and we + // must draw properly themed background here + // + // note that naively I'd expect filling the client rect with the + // brush returned by MSWGetBgBrush() work -- but for some reason it + // doesn't and we have to call parents MSWPrintChild() which is + // supposed to call DrawThemeBackground() with appropriate params + // + // also note that in this case lParam == PRF_CLIENT but we're + // clearly expected to paint the background and nothing else! + + if ( IsTopLevel() || InheritsBackgroundColour() ) + return false; + + // sometimes we don't want the parent to handle it at all, instead + // return whatever value this window wants + if ( !MSWShouldPropagatePrintChild() ) + return MSWPrintChild(hDC, (wxWindow *)this); + + for ( wxWindow *win = GetParent(); win; win = win->GetParent() ) + { + if ( win->MSWPrintChild(hDC, (wxWindow *)this) ) + return true; + + if ( win->IsTopLevel() || win->InheritsBackgroundColour() ) + break; + } + + return false; +} + +// --------------------------------------------------------------------------- +// moving and resizing +// --------------------------------------------------------------------------- + +bool wxWindowMSW::HandleMinimize() +{ + wxIconizeEvent event(m_windowId); + event.SetEventObject(this); + + return GetEventHandler()->ProcessEvent(event); +} + +bool wxWindowMSW::HandleMaximize() +{ + wxMaximizeEvent event(m_windowId); + event.SetEventObject(this); + + return GetEventHandler()->ProcessEvent(event); +} + +bool wxWindowMSW::HandleMove(int x, int y) +{ + wxPoint point(x,y); + wxMoveEvent event(point, m_windowId); + event.SetEventObject(this); + + return GetEventHandler()->ProcessEvent(event); +} + +bool wxWindowMSW::HandleMoving(wxRect& rect) +{ + wxMoveEvent event(rect, m_windowId); + event.SetEventObject(this); + + bool rc = GetEventHandler()->ProcessEvent(event); + if (rc) + rect = event.GetRect(); + return rc; +} + +bool wxWindowMSW::HandleSize(int WXUNUSED(w), int WXUNUSED(h), WXUINT wParam) +{ +#if USE_DEFERRED_SIZING + // when we resize this window, its children are probably going to be + // repositioned as well, prepare to use DeferWindowPos() for them + int numChildren = 0; + for ( HWND child = ::GetWindow(GetHwndOf(this), GW_CHILD); + child; + child = ::GetWindow(child, GW_HWNDNEXT) ) + { + numChildren ++; + } + + // Protect against valid m_hDWP being overwritten + bool useDefer = false; + + if ( numChildren > 1 ) + { + if (!m_hDWP) + { + m_hDWP = (WXHANDLE)::BeginDeferWindowPos(numChildren); + if ( !m_hDWP ) + { + wxLogLastError(_T("BeginDeferWindowPos")); + } + if (m_hDWP) + useDefer = true; + } + } +#endif // USE_DEFERRED_SIZING + + // update this window size + bool processed = false; + switch ( wParam ) + { + default: + wxFAIL_MSG( _T("unexpected WM_SIZE parameter") ); + // fall through nevertheless + + case SIZE_MAXHIDE: + case SIZE_MAXSHOW: + // we're not interested in these messages at all + break; + + case SIZE_MINIMIZED: + processed = HandleMinimize(); + break; + + case SIZE_MAXIMIZED: + /* processed = */ HandleMaximize(); + // fall through to send a normal size event as well + + case SIZE_RESTORED: + // don't use w and h parameters as they specify the client size + // while according to the docs EVT_SIZE handler is supposed to + // receive the total size + wxSizeEvent event(GetSize(), m_windowId); + event.SetEventObject(this); + + processed = GetEventHandler()->ProcessEvent(event); + } + +#if USE_DEFERRED_SIZING + // and finally change the positions of all child windows at once + if ( useDefer && m_hDWP ) + { + // reset m_hDWP to NULL so that child windows don't try to use our + // m_hDWP after we call EndDeferWindowPos() on it (this shouldn't + // happen anyhow normally but who knows what weird flow of control we + // may have depending on what the users EVT_SIZE handler does...) + HDWP hDWP = (HDWP)m_hDWP; + m_hDWP = NULL; + + // do put all child controls in place at once + if ( !::EndDeferWindowPos(hDWP) ) + { + wxLogLastError(_T("EndDeferWindowPos")); + } + + // Reset our children's pending pos/size values. + for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + wxWindowMSW *child = node->GetData(); + child->m_pendingPosition = wxDefaultPosition; + child->m_pendingSize = wxDefaultSize; + } + } +#endif // USE_DEFERRED_SIZING + + return processed; +} + +bool wxWindowMSW::HandleSizing(wxRect& rect) +{ + wxSizeEvent event(rect, m_windowId); + event.SetEventObject(this); + + bool rc = GetEventHandler()->ProcessEvent(event); + if (rc) + rect = event.GetRect(); + return rc; +} + +bool wxWindowMSW::HandleGetMinMaxInfo(void *WXUNUSED_IN_WINCE(mmInfo)) +{ +#ifdef __WXWINCE__ + return false; +#else + MINMAXINFO *info = (MINMAXINFO *)mmInfo; + + bool rc = false; + + int minWidth = GetMinWidth(), + minHeight = GetMinHeight(), + maxWidth = GetMaxWidth(), + maxHeight = GetMaxHeight(); + + if ( minWidth != wxDefaultCoord ) + { + info->ptMinTrackSize.x = minWidth; + rc = true; + } + + if ( minHeight != wxDefaultCoord ) + { + info->ptMinTrackSize.y = minHeight; + rc = true; + } + + if ( maxWidth != wxDefaultCoord ) + { + info->ptMaxTrackSize.x = maxWidth; + rc = true; + } + + if ( maxHeight != wxDefaultCoord ) + { + info->ptMaxTrackSize.y = maxHeight; + rc = true; + } + + return rc; +#endif +} + +// --------------------------------------------------------------------------- +// command messages +// --------------------------------------------------------------------------- + +bool wxWindowMSW::HandleCommand(WXWORD id, WXWORD cmd, WXHWND control) +{ +#if wxUSE_MENUS_NATIVE + if ( !cmd && wxCurrentPopupMenu ) + { + wxMenu *popupMenu = wxCurrentPopupMenu; + wxCurrentPopupMenu = NULL; + + return popupMenu->MSWCommand(cmd, id); + } +#endif // wxUSE_MENUS_NATIVE + + wxWindow *win = NULL; + + // first try to find it from HWND - this works even with the broken + // programs using the same ids for different controls + if ( control ) + { + win = wxFindWinFromHandle(control); + } + + // try the id + if ( !win ) + { + // must cast to a signed type before comparing with other ids! + win = FindItem((signed short)id); + } + + if ( win ) + { + return win->MSWCommand(cmd, id); + } + + // the messages sent from the in-place edit control used by the treectrl + // for label editing have id == 0, but they should _not_ be treated as menu + // messages (they are EN_XXX ones, in fact) so don't translate anything + // coming from a control to wxEVT_COMMAND_MENU_SELECTED + if ( !control ) + { + // If no child window, it may be an accelerator, e.g. for a popup menu + // command + + wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED); + event.SetEventObject(this); + event.SetId(id); + event.SetInt(id); + + return GetEventHandler()->ProcessEvent(event); + } + else + { +#if wxUSE_SPINCTRL && !defined(__WXUNIVERSAL__) + // the text ctrl which is logically part of wxSpinCtrl sends WM_COMMAND + // notifications to its parent which we want to reflect back to + // wxSpinCtrl + wxSpinCtrl *spin = wxSpinCtrl::GetSpinForTextCtrl(control); + if ( spin && spin->ProcessTextCommand(cmd, id) ) + return true; +#endif // wxUSE_SPINCTRL + +#if wxUSE_CHOICE && defined(__SMARTPHONE__) + // the listbox ctrl which is logically part of wxChoice sends WM_COMMAND + // notifications to its parent which we want to reflect back to + // wxChoice + wxChoice *choice = wxChoice::GetChoiceForListBox(control); + if ( choice && choice->MSWCommand(cmd, id) ) + return true; +#endif + } + + return false; +} + +// --------------------------------------------------------------------------- +// mouse events +// --------------------------------------------------------------------------- + +void wxWindowMSW::InitMouseEvent(wxMouseEvent& event, + int x, int y, + WXUINT flags) +{ + // our client coords are not quite the same as Windows ones + wxPoint pt = GetClientAreaOrigin(); + event.m_x = x - pt.x; + event.m_y = y - pt.y; + + event.m_shiftDown = (flags & MK_SHIFT) != 0; + event.m_controlDown = (flags & MK_CONTROL) != 0; + event.m_leftDown = (flags & MK_LBUTTON) != 0; + event.m_middleDown = (flags & MK_MBUTTON) != 0; + event.m_rightDown = (flags & MK_RBUTTON) != 0; + event.m_altDown = ::GetKeyState(VK_MENU) < 0; + +#ifndef __WXWINCE__ + event.SetTimestamp(::GetMessageTime()); +#endif + + event.SetEventObject(this); + event.SetId(GetId()); + +#if wxUSE_MOUSEEVENT_HACK + gs_lastMouseEvent.pos = ClientToScreen(wxPoint(x, y)); + gs_lastMouseEvent.type = event.GetEventType(); +#endif // wxUSE_MOUSEEVENT_HACK +} + +#ifdef __WXWINCE__ +// Windows doesn't send the mouse events to the static controls (which are +// transparent in the sense that their WM_NCHITTEST handler returns +// HTTRANSPARENT) at all but we want all controls to receive the mouse events +// and so we manually check if we don't have a child window under mouse and if +// we do, send the event to it instead of the window Windows had sent WM_XXX +// to. +// +// Notice that this is not done for the mouse move events because this could +// (would?) be too slow, but only for clicks which means that the static texts +// still don't get move, enter nor leave events. +static wxWindowMSW *FindWindowForMouseEvent(wxWindowMSW *win, int *x, int *y) +{ + wxCHECK_MSG( x && y, win, _T("NULL pointer in FindWindowForMouseEvent") ); + + // first try to find a non transparent child: this allows us to send events + // to a static text which is inside a static box, for example + POINT pt = { *x, *y }; + HWND hwnd = GetHwndOf(win), + hwndUnderMouse; + +#ifdef __WXWINCE__ + hwndUnderMouse = ::ChildWindowFromPoint + ( + hwnd, + pt + ); +#else + hwndUnderMouse = ::ChildWindowFromPointEx + ( + hwnd, + pt, + CWP_SKIPINVISIBLE | + CWP_SKIPDISABLED | + CWP_SKIPTRANSPARENT + ); +#endif + + if ( !hwndUnderMouse || hwndUnderMouse == hwnd ) + { + // now try any child window at all + hwndUnderMouse = ::ChildWindowFromPoint(hwnd, pt); + } + + // check that we have a child window which is susceptible to receive mouse + // events: for this it must be shown and enabled + if ( hwndUnderMouse && + hwndUnderMouse != hwnd && + ::IsWindowVisible(hwndUnderMouse) && + ::IsWindowEnabled(hwndUnderMouse) ) + { + wxWindow *winUnderMouse = wxFindWinFromHandle((WXHWND)hwndUnderMouse); + if ( winUnderMouse ) + { + // translate the mouse coords to the other window coords + win->ClientToScreen(x, y); + winUnderMouse->ScreenToClient(x, y); + + win = winUnderMouse; + } + } + + return win; +} +#endif // __WXWINCE__ + +bool wxWindowMSW::HandleMouseEvent(WXUINT msg, int x, int y, WXUINT flags) +{ + // the mouse events take consecutive IDs from WM_MOUSEFIRST to + // WM_MOUSELAST, so it's enough to subtract WM_MOUSEMOVE == WM_MOUSEFIRST + // from the message id and take the value in the table to get wxWin event + // id + static const wxEventType eventsMouse[] = + { + wxEVT_MOTION, + wxEVT_LEFT_DOWN, + wxEVT_LEFT_UP, + wxEVT_LEFT_DCLICK, + wxEVT_RIGHT_DOWN, + wxEVT_RIGHT_UP, + wxEVT_RIGHT_DCLICK, + wxEVT_MIDDLE_DOWN, + wxEVT_MIDDLE_UP, + wxEVT_MIDDLE_DCLICK + }; + + wxMouseEvent event(eventsMouse[msg - WM_MOUSEMOVE]); + InitMouseEvent(event, x, y, flags); + + return GetEventHandler()->ProcessEvent(event); +} + +bool wxWindowMSW::HandleMouseMove(int x, int y, WXUINT flags) +{ + if ( !m_mouseInWindow ) + { + // it would be wrong to assume that just because we get a mouse move + // event that the mouse is inside the window: although this is usually + // true, it is not if we had captured the mouse, so we need to check + // the mouse coordinates here + if ( !HasCapture() || IsMouseInWindow() ) + { + // Generate an ENTER event + m_mouseInWindow = true; + +#ifdef HAVE_TRACKMOUSEEVENT + typedef BOOL (WINAPI *_TrackMouseEvent_t)(LPTRACKMOUSEEVENT); +#ifdef __WXWINCE__ + static const _TrackMouseEvent_t + s_pfn_TrackMouseEvent = _TrackMouseEvent; +#else // !__WXWINCE__ + static _TrackMouseEvent_t s_pfn_TrackMouseEvent; + static bool s_initDone = false; + if ( !s_initDone ) + { + // see comment in wxApp::GetComCtl32Version() explaining the + // use of wxLoadedDLL + wxLoadedDLL dllComCtl32(_T("comctl32.dll")); + if ( dllComCtl32.IsLoaded() ) + { + s_pfn_TrackMouseEvent = (_TrackMouseEvent_t) + dllComCtl32.GetSymbol(_T("_TrackMouseEvent")); + } + + s_initDone = true; + } + + if ( s_pfn_TrackMouseEvent ) +#endif // __WXWINCE__/!__WXWINCE__ + { + WinStruct trackinfo; + + trackinfo.dwFlags = TME_LEAVE; + trackinfo.hwndTrack = GetHwnd(); + + (*s_pfn_TrackMouseEvent)(&trackinfo); + } +#endif // HAVE_TRACKMOUSEEVENT + + wxMouseEvent event(wxEVT_ENTER_WINDOW); + InitMouseEvent(event, x, y, flags); + + (void)GetEventHandler()->ProcessEvent(event); + } + } +#ifdef HAVE_TRACKMOUSEEVENT + else // mouse not in window + { + // Check if we need to send a LEAVE event + // Windows doesn't send WM_MOUSELEAVE if the mouse has been captured so + // send it here if we are using native mouse leave tracking + if ( HasCapture() && !IsMouseInWindow() ) + { + GenerateMouseLeave(); + } + } +#endif // HAVE_TRACKMOUSEEVENT + +#if wxUSE_MOUSEEVENT_HACK + // Windows often generates mouse events even if mouse position hasn't + // changed (http://article.gmane.org/gmane.comp.lib.wxwidgets.devel/66576) + // + // Filter this out as it can result in unexpected behaviour compared to + // other platforms + if ( gs_lastMouseEvent.type == wxEVT_RIGHT_DOWN || + gs_lastMouseEvent.type == wxEVT_LEFT_DOWN || + gs_lastMouseEvent.type == wxEVT_MIDDLE_DOWN || + gs_lastMouseEvent.type == wxEVT_MOTION ) + { + if ( ClientToScreen(wxPoint(x, y)) == gs_lastMouseEvent.pos ) + { + gs_lastMouseEvent.type = wxEVT_MOTION; + + return false; + } + } +#endif // wxUSE_MOUSEEVENT_HACK + + return HandleMouseEvent(WM_MOUSEMOVE, x, y, flags); +} + + +bool wxWindowMSW::HandleMouseWheel(WXWPARAM wParam, WXLPARAM lParam) +{ +#if wxUSE_MOUSEWHEEL + // notice that WM_MOUSEWHEEL position is in screen coords (as it's + // forwarded up to the parent by DefWindowProc()) and not in the client + // ones as all the other messages, translate them to the client coords for + // consistency + const wxPoint + pt = ScreenToClient(wxPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); + wxMouseEvent event(wxEVT_MOUSEWHEEL); + InitMouseEvent(event, pt.x, pt.y, LOWORD(wParam)); + event.m_wheelRotation = (short)HIWORD(wParam); + event.m_wheelDelta = WHEEL_DELTA; + + static int s_linesPerRotation = -1; + if ( s_linesPerRotation == -1 ) + { + if ( !::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, + &s_linesPerRotation, 0)) + { + // this is not supposed to happen + wxLogLastError(_T("SystemParametersInfo(GETWHEELSCROLLLINES)")); + + // the default is 3, so use it if SystemParametersInfo() failed + s_linesPerRotation = 3; + } + } + + event.m_linesPerAction = s_linesPerRotation; + return GetEventHandler()->ProcessEvent(event); + +#else // !wxUSE_MOUSEWHEEL + wxUnusedVar(wParam); + wxUnusedVar(lParam); + + return false; +#endif // wxUSE_MOUSEWHEEL/!wxUSE_MOUSEWHEEL +} + +void wxWindowMSW::GenerateMouseLeave() +{ + m_mouseInWindow = false; + + int state = 0; + if ( wxIsShiftDown() ) + state |= MK_SHIFT; + if ( wxIsCtrlDown() ) + state |= MK_CONTROL; + + // Only the high-order bit should be tested + if ( GetKeyState( VK_LBUTTON ) & (1<<15) ) + state |= MK_LBUTTON; + if ( GetKeyState( VK_MBUTTON ) & (1<<15) ) + state |= MK_MBUTTON; + if ( GetKeyState( VK_RBUTTON ) & (1<<15) ) + state |= MK_RBUTTON; + + POINT pt; +#ifdef __WXWINCE__ + if ( !::GetCursorPosWinCE(&pt) ) +#else + if ( !::GetCursorPos(&pt) ) +#endif + { + wxLogLastError(_T("GetCursorPos")); + } + + // we need to have client coordinates here for symmetry with + // wxEVT_ENTER_WINDOW + RECT rect = wxGetWindowRect(GetHwnd()); + pt.x -= rect.left; + pt.y -= rect.top; + + wxMouseEvent event(wxEVT_LEAVE_WINDOW); + InitMouseEvent(event, pt.x, pt.y, state); + + (void)GetEventHandler()->ProcessEvent(event); +} + +// --------------------------------------------------------------------------- +// keyboard handling +// --------------------------------------------------------------------------- + +// create the key event of the given type for the given key - used by +// HandleChar and HandleKeyDown/Up +wxKeyEvent wxWindowMSW::CreateKeyEvent(wxEventType evType, + int id, + WXLPARAM lParam, + WXWPARAM wParam) const +{ + wxKeyEvent event(evType); + event.SetId(GetId()); + event.m_shiftDown = wxIsShiftDown(); + event.m_controlDown = wxIsCtrlDown(); + event.m_altDown = (HIWORD(lParam) & KF_ALTDOWN) == KF_ALTDOWN; + + event.SetEventObject((wxWindow *)this); // const_cast + event.m_keyCode = id; +#if wxUSE_UNICODE + event.m_uniChar = (wxChar) wParam; +#endif + event.m_rawCode = (wxUint32) wParam; + event.m_rawFlags = (wxUint32) lParam; +#ifndef __WXWINCE__ + event.SetTimestamp(::GetMessageTime()); +#endif + + // translate the position to client coords + POINT pt; +#ifdef __WXWINCE__ + GetCursorPosWinCE(&pt); +#else + GetCursorPos(&pt); +#endif + RECT rect; + GetWindowRect(GetHwnd(),&rect); + pt.x -= rect.left; + pt.y -= rect.top; + + event.m_x = pt.x; + event.m_y = pt.y; + + return event; +} + +// isASCII is true only when we're called from WM_CHAR handler and not from +// WM_KEYDOWN one +bool wxWindowMSW::HandleChar(WXWPARAM wParam, WXLPARAM lParam, bool isASCII) +{ + int id; + if ( isASCII ) + { + id = wParam; + } + else // we're called from WM_KEYDOWN + { + // don't pass lParam to wxCharCodeMSWToWX() here because we don't want + // to get numpad key codes: CHAR events should use the logical keys + // such as WXK_HOME instead of WXK_NUMPAD_HOME which is for KEY events + id = wxCharCodeMSWToWX(wParam); + if ( id == 0 ) + { + // it's ASCII and will be processed here only when called from + // WM_CHAR (i.e. when isASCII = true), don't process it now + return false; + } + } + + wxKeyEvent event(CreateKeyEvent(wxEVT_CHAR, id, lParam, wParam)); + + // the alphanumeric keys produced by pressing AltGr+something on European + // keyboards have both Ctrl and Alt modifiers which may confuse the user + // code as, normally, keys with Ctrl and/or Alt don't result in anything + // alphanumeric, so pretend that there are no modifiers at all (the + // KEY_DOWN event would still have the correct modifiers if they're really + // needed) + if ( event.m_controlDown && event.m_altDown && + (id >= 32 && id < 256) ) + { + event.m_controlDown = + event.m_altDown = false; + } + + return GetEventHandler()->ProcessEvent(event); +} + +bool wxWindowMSW::HandleKeyDown(WXWPARAM wParam, WXLPARAM lParam) +{ + int id = wxCharCodeMSWToWX(wParam, lParam); + + if ( !id ) + { + // normal ASCII char + id = wParam; + } + + wxKeyEvent event(CreateKeyEvent(wxEVT_KEY_DOWN, id, lParam, wParam)); + return GetEventHandler()->ProcessEvent(event); +} + +bool wxWindowMSW::HandleKeyUp(WXWPARAM wParam, WXLPARAM lParam) +{ + int id = wxCharCodeMSWToWX(wParam, lParam); + + if ( !id ) + { + // normal ASCII char + id = wParam; + } + + wxKeyEvent event(CreateKeyEvent(wxEVT_KEY_UP, id, lParam, wParam)); + return GetEventHandler()->ProcessEvent(event); +} + +int wxWindowMSW::HandleMenuChar(int WXUNUSED_IN_WINCE(chAccel), + WXLPARAM WXUNUSED_IN_WINCE(lParam)) +{ + // FIXME: implement GetMenuItemCount for WinCE, possibly + // in terms of GetMenuItemInfo +#ifndef __WXWINCE__ + const HMENU hmenu = (HMENU)lParam; + + MENUITEMINFO mii; + wxZeroMemory(mii); + mii.cbSize = sizeof(MENUITEMINFO); + + // we could use MIIM_FTYPE here as we only need to know if the item is + // ownerdrawn or not and not dwTypeData which MIIM_TYPE also returns, but + // MIIM_FTYPE is not supported under Win95 + mii.fMask = MIIM_TYPE | MIIM_DATA; + + // find if we have this letter in any owner drawn item + const int count = ::GetMenuItemCount(hmenu); + for ( int i = 0; i < count; i++ ) + { + // previous loop iteration could modify it, reset it back before + // calling GetMenuItemInfo() to prevent it from overflowing dwTypeData + mii.cch = 0; + + if ( ::GetMenuItemInfo(hmenu, i, TRUE, &mii) ) + { + if ( mii.fType == MFT_OWNERDRAW ) + { + // dwItemData member of the MENUITEMINFO is a + // pointer to the associated wxMenuItem -- see the + // menu creation code + wxMenuItem *item = (wxMenuItem*)mii.dwItemData; + + const wxChar *p = wxStrchr(item->GetText(), _T('&')); + while ( p++ ) + { + if ( *p == _T('&') ) + { + // this is not the accel char, find the real one + p = wxStrchr(p + 1, _T('&')); + } + else // got the accel char + { + // FIXME-UNICODE: this comparison doesn't risk to work + // for non ASCII accelerator characters I'm afraid, but + // what can we do? + if ( (wchar_t)wxToupper(*p) == (wchar_t)chAccel ) + { + return i; + } + else + { + // this one doesn't match + break; + } + } + } + } + } + else // failed to get the menu text? + { + // it's not fatal, so don't show error, but still log it + wxLogLastError(_T("GetMenuItemInfo")); + } + } +#endif + return wxNOT_FOUND; +} + +bool wxWindowMSW::HandleClipboardEvent( WXUINT nMsg ) +{ + const wxEventType type = ( nMsg == WM_CUT ) ? wxEVT_COMMAND_TEXT_CUT : + ( nMsg == WM_COPY ) ? wxEVT_COMMAND_TEXT_COPY : + /*( nMsg == WM_PASTE ) ? */ wxEVT_COMMAND_TEXT_PASTE; + wxClipboardTextEvent evt(type, GetId()); + + evt.SetEventObject(this); + + return GetEventHandler()->ProcessEvent(evt); +} + +// --------------------------------------------------------------------------- +// joystick +// --------------------------------------------------------------------------- + +bool wxWindowMSW::HandleJoystickEvent(WXUINT msg, int x, int y, WXUINT flags) +{ +#ifdef JOY_BUTTON1 + int change = 0; + if ( flags & JOY_BUTTON1CHG ) + change = wxJOY_BUTTON1; + if ( flags & JOY_BUTTON2CHG ) + change = wxJOY_BUTTON2; + if ( flags & JOY_BUTTON3CHG ) + change = wxJOY_BUTTON3; + if ( flags & JOY_BUTTON4CHG ) + change = wxJOY_BUTTON4; + + int buttons = 0; + if ( flags & JOY_BUTTON1 ) + buttons |= wxJOY_BUTTON1; + if ( flags & JOY_BUTTON2 ) + buttons |= wxJOY_BUTTON2; + if ( flags & JOY_BUTTON3 ) + buttons |= wxJOY_BUTTON3; + if ( flags & JOY_BUTTON4 ) + buttons |= wxJOY_BUTTON4; + + // the event ids aren't consecutive so we can't use table based lookup + int joystick; + wxEventType eventType; + switch ( msg ) + { + case MM_JOY1MOVE: + joystick = 1; + eventType = wxEVT_JOY_MOVE; + break; + + case MM_JOY2MOVE: + joystick = 2; + eventType = wxEVT_JOY_MOVE; + break; + + case MM_JOY1ZMOVE: + joystick = 1; + eventType = wxEVT_JOY_ZMOVE; + break; + + case MM_JOY2ZMOVE: + joystick = 2; + eventType = wxEVT_JOY_ZMOVE; + break; + + case MM_JOY1BUTTONDOWN: + joystick = 1; + eventType = wxEVT_JOY_BUTTON_DOWN; + break; + + case MM_JOY2BUTTONDOWN: + joystick = 2; + eventType = wxEVT_JOY_BUTTON_DOWN; + break; + + case MM_JOY1BUTTONUP: + joystick = 1; + eventType = wxEVT_JOY_BUTTON_UP; + break; + + case MM_JOY2BUTTONUP: + joystick = 2; + eventType = wxEVT_JOY_BUTTON_UP; + break; + + default: + wxFAIL_MSG(wxT("no such joystick event")); + + return false; + } + + wxJoystickEvent event(eventType, buttons, joystick, change); + event.SetPosition(wxPoint(x, y)); + event.SetEventObject(this); + + return GetEventHandler()->ProcessEvent(event); +#else + wxUnusedVar(msg); + wxUnusedVar(x); + wxUnusedVar(y); + wxUnusedVar(flags); + return false; +#endif +} + +// --------------------------------------------------------------------------- +// scrolling +// --------------------------------------------------------------------------- + +bool wxWindowMSW::MSWOnScroll(int orientation, WXWORD wParam, + WXWORD pos, WXHWND control) +{ + if ( control && control != m_hWnd ) // Prevent infinite recursion + { + wxWindow *child = wxFindWinFromHandle(control); + if ( child ) + return child->MSWOnScroll(orientation, wParam, pos, control); + } + + wxScrollWinEvent event; + event.SetPosition(pos); + event.SetOrientation(orientation); + event.SetEventObject(this); + + switch ( wParam ) + { + case SB_TOP: + event.SetEventType(wxEVT_SCROLLWIN_TOP); + break; + + case SB_BOTTOM: + event.SetEventType(wxEVT_SCROLLWIN_BOTTOM); + break; + + case SB_LINEUP: + event.SetEventType(wxEVT_SCROLLWIN_LINEUP); + break; + + case SB_LINEDOWN: + event.SetEventType(wxEVT_SCROLLWIN_LINEDOWN); + break; + + case SB_PAGEUP: + event.SetEventType(wxEVT_SCROLLWIN_PAGEUP); + break; + + case SB_PAGEDOWN: + event.SetEventType(wxEVT_SCROLLWIN_PAGEDOWN); + break; + + case SB_THUMBPOSITION: + case SB_THUMBTRACK: + // under Win32, the scrollbar range and position are 32 bit integers, + // but WM_[HV]SCROLL only carry the low 16 bits of them, so we must + // explicitly query the scrollbar for the correct position (this must + // be done only for these two SB_ events as they are the only one + // carrying the scrollbar position) + { + WinStruct scrollInfo; + scrollInfo.fMask = SIF_TRACKPOS; + + if ( !::GetScrollInfo(GetHwnd(), + orientation == wxHORIZONTAL ? SB_HORZ + : SB_VERT, + &scrollInfo) ) + { + // Not necessarily an error, if there are no scrollbars yet. + // wxLogLastError(_T("GetScrollInfo")); + } + + event.SetPosition(scrollInfo.nTrackPos); + } + + event.SetEventType( wParam == SB_THUMBPOSITION + ? wxEVT_SCROLLWIN_THUMBRELEASE + : wxEVT_SCROLLWIN_THUMBTRACK ); + break; + + default: + return false; + } + + return GetEventHandler()->ProcessEvent(event); +} + +// =========================================================================== +// global functions +// =========================================================================== + +void wxGetCharSize(WXHWND wnd, int *x, int *y, const wxFont& the_font) +{ + TEXTMETRIC tm; + HDC dc = ::GetDC((HWND) wnd); + HFONT was = 0; + + // the_font.UseResource(); + // the_font.RealizeResource(); + HFONT fnt = (HFONT)the_font.GetResourceHandle(); // const_cast + if ( fnt ) + was = (HFONT) SelectObject(dc,fnt); + + GetTextMetrics(dc, &tm); + if ( fnt && was ) + { + SelectObject(dc,was); + } + ReleaseDC((HWND)wnd, dc); + + if ( x ) + *x = tm.tmAveCharWidth; + if ( y ) + *y = tm.tmHeight + tm.tmExternalLeading; + + // the_font.ReleaseResource(); +} + +// use the "extended" bit (24) of lParam to distinguish extended keys +// from normal keys as the same key is sent +static inline +int ChooseNormalOrExtended(int lParam, int keyNormal, int keyExtended) +{ + // except that if lParam is 0, it means we don't have real lParam from + // WM_KEYDOWN but are just translating just a VK constant (e.g. done from + // msw/treectrl.cpp when processing TVN_KEYDOWN) -- then assume this is a + // non-numpad (hence extended) key as this is a more common case + return !lParam || (lParam & (1 << 24)) ? keyExtended : keyNormal; +} + +// this array contains the Windows virtual key codes which map one to one to +// WXK_xxx constants and is used in wxCharCodeMSWToWX/WXToMSW() below +// +// note that keys having a normal and numpad version (e.g. WXK_HOME and +// WXK_NUMPAD_HOME) are not included in this table as the mapping is not 1-to-1 +static const struct wxKeyMapping +{ + int vk; + wxKeyCode wxk; +} gs_specialKeys[] = +{ + { VK_CANCEL, WXK_CANCEL }, + { VK_BACK, WXK_BACK }, + { VK_TAB, WXK_TAB }, + { VK_CLEAR, WXK_CLEAR }, + { VK_SHIFT, WXK_SHIFT }, + { VK_CONTROL, WXK_CONTROL }, + { VK_MENU , WXK_ALT }, + { VK_PAUSE, WXK_PAUSE }, + { VK_CAPITAL, WXK_CAPITAL }, + { VK_SPACE, WXK_SPACE }, + { VK_ESCAPE, WXK_ESCAPE }, + { VK_SELECT, WXK_SELECT }, + { VK_PRINT, WXK_PRINT }, + { VK_EXECUTE, WXK_EXECUTE }, + { VK_SNAPSHOT, WXK_SNAPSHOT }, + { VK_HELP, WXK_HELP }, + + { VK_NUMPAD0, WXK_NUMPAD0 }, + { VK_NUMPAD1, WXK_NUMPAD1 }, + { VK_NUMPAD2, WXK_NUMPAD2 }, + { VK_NUMPAD3, WXK_NUMPAD3 }, + { VK_NUMPAD4, WXK_NUMPAD4 }, + { VK_NUMPAD5, WXK_NUMPAD5 }, + { VK_NUMPAD6, WXK_NUMPAD6 }, + { VK_NUMPAD7, WXK_NUMPAD7 }, + { VK_NUMPAD8, WXK_NUMPAD8 }, + { VK_NUMPAD9, WXK_NUMPAD9 }, + { VK_MULTIPLY, WXK_NUMPAD_MULTIPLY }, + { VK_ADD, WXK_NUMPAD_ADD }, + { VK_SUBTRACT, WXK_NUMPAD_SUBTRACT }, + { VK_DECIMAL, WXK_NUMPAD_DECIMAL }, + { VK_DIVIDE, WXK_NUMPAD_DIVIDE }, + + { VK_F1, WXK_F1 }, + { VK_F2, WXK_F2 }, + { VK_F3, WXK_F3 }, + { VK_F4, WXK_F4 }, + { VK_F5, WXK_F5 }, + { VK_F6, WXK_F6 }, + { VK_F7, WXK_F7 }, + { VK_F8, WXK_F8 }, + { VK_F9, WXK_F9 }, + { VK_F10, WXK_F10 }, + { VK_F11, WXK_F11 }, + { VK_F12, WXK_F12 }, + { VK_F13, WXK_F13 }, + { VK_F14, WXK_F14 }, + { VK_F15, WXK_F15 }, + { VK_F16, WXK_F16 }, + { VK_F17, WXK_F17 }, + { VK_F18, WXK_F18 }, + { VK_F19, WXK_F19 }, + { VK_F20, WXK_F20 }, + { VK_F21, WXK_F21 }, + { VK_F22, WXK_F22 }, + { VK_F23, WXK_F23 }, + { VK_F24, WXK_F24 }, + + { VK_NUMLOCK, WXK_NUMLOCK }, + { VK_SCROLL, WXK_SCROLL }, + +#ifdef VK_APPS + { VK_LWIN, WXK_WINDOWS_LEFT }, + { VK_RWIN, WXK_WINDOWS_RIGHT }, + { VK_APPS, WXK_WINDOWS_MENU }, +#endif // VK_APPS defined +}; + +// Returns 0 if was a normal ASCII value, not a special key. This indicates that +// the key should be ignored by WM_KEYDOWN and processed by WM_CHAR instead. +int wxCharCodeMSWToWX(int vk, WXLPARAM lParam) +{ + // check the table first + for ( size_t n = 0; n < WXSIZEOF(gs_specialKeys); n++ ) + { + if ( gs_specialKeys[n].vk == vk ) + return gs_specialKeys[n].wxk; + } + + // keys requiring special handling + int wxk; + switch ( vk ) + { + // the mapping for these keys may be incorrect on non-US keyboards so + // maybe we shouldn't map them to ASCII values at all + case VK_OEM_1: wxk = ';'; break; + case VK_OEM_PLUS: wxk = '+'; break; + case VK_OEM_COMMA: wxk = ','; break; + case VK_OEM_MINUS: wxk = '-'; break; + case VK_OEM_PERIOD: wxk = '.'; break; + case VK_OEM_2: wxk = '/'; break; + case VK_OEM_3: wxk = '~'; break; + case VK_OEM_4: wxk = '['; break; + case VK_OEM_5: wxk = '\\'; break; + case VK_OEM_6: wxk = ']'; break; + case VK_OEM_7: wxk = '\''; break; + + // handle extended keys + case VK_PRIOR: + wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_PAGEUP, WXK_PAGEUP); + break; + + case VK_NEXT: + wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_PAGEDOWN, WXK_PAGEDOWN); + break; + + case VK_END: + wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_END, WXK_END); + break; + + case VK_HOME: + wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_HOME, WXK_HOME); + break; + + case VK_LEFT: + wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_LEFT, WXK_LEFT); + break; + + case VK_UP: + wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_UP, WXK_UP); + break; + + case VK_RIGHT: + wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_RIGHT, WXK_RIGHT); + break; + + case VK_DOWN: + wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_DOWN, WXK_DOWN); + break; + + case VK_INSERT: + wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_INSERT, WXK_INSERT); + break; + + case VK_DELETE: + wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_DELETE, WXK_DELETE); + break; + + case VK_RETURN: + // don't use ChooseNormalOrExtended() here as the keys are reversed + // here: numpad enter is the extended one + wxk = lParam && (lParam & (1 << 24)) ? WXK_NUMPAD_ENTER : WXK_RETURN; + break; + + default: + wxk = 0; + } + + return wxk; +} + +WXWORD wxCharCodeWXToMSW(int wxk, bool *isVirtual) +{ + if ( isVirtual ) + *isVirtual = true; + + // check the table first + for ( size_t n = 0; n < WXSIZEOF(gs_specialKeys); n++ ) + { + if ( gs_specialKeys[n].wxk == wxk ) + return gs_specialKeys[n].vk; + } + + // and then check for special keys not included in the table + WXWORD vk; + switch ( wxk ) + { + case WXK_PAGEUP: + case WXK_NUMPAD_PAGEUP: + vk = VK_PRIOR; + break; + + case WXK_PAGEDOWN: + case WXK_NUMPAD_PAGEDOWN: + vk = VK_NEXT; + break; + + case WXK_END: + case WXK_NUMPAD_END: + vk = VK_END; + break; + + case WXK_HOME: + case WXK_NUMPAD_HOME: + vk = VK_HOME; + break; + + case WXK_LEFT: + case WXK_NUMPAD_LEFT: + vk = VK_LEFT; + break; + + case WXK_UP: + case WXK_NUMPAD_UP: + vk = VK_UP; + break; + + case WXK_RIGHT: + case WXK_NUMPAD_RIGHT: + vk = VK_RIGHT; + break; + + case WXK_DOWN: + case WXK_NUMPAD_DOWN: + vk = VK_DOWN; + break; + + case WXK_INSERT: + case WXK_NUMPAD_INSERT: + vk = VK_INSERT; + break; + + case WXK_DELETE: + case WXK_NUMPAD_DELETE: + vk = VK_DELETE; + break; + + default: +#ifndef __WXWINCE__ + // check to see if its one of the OEM key codes. + BYTE vks = LOBYTE(VkKeyScan(wxk)); + if ( vks != 0xff ) + { + vk = vks; + } + else +#endif + { + if ( isVirtual ) + *isVirtual = false; + vk = (WXWORD)wxk; + } + } + + return vk; +} + +#ifndef SM_SWAPBUTTON + #define SM_SWAPBUTTON 23 +#endif + +// small helper for wxGetKeyState() and wxGetMouseState() +static inline bool wxIsKeyDown(WXWORD vk) +{ + switch (vk) + { + case VK_LBUTTON: + if (GetSystemMetrics(SM_SWAPBUTTON)) vk = VK_RBUTTON; + break; + case VK_RBUTTON: + if (GetSystemMetrics(SM_SWAPBUTTON)) vk = VK_LBUTTON; + break; + } + // the low order bit indicates whether the key was pressed since the last + // call and the high order one indicates whether it is down right now and + // we only want that one + return (GetAsyncKeyState(vk) & (1<<15)) != 0; +} + +bool wxGetKeyState(wxKeyCode key) +{ + // although this does work under Windows, it is not supported under other + // platforms so don't allow it, you must use wxGetMouseState() instead + wxASSERT_MSG( key != VK_LBUTTON && + key != VK_RBUTTON && + key != VK_MBUTTON, + wxT("can't use wxGetKeyState() for mouse buttons") ); + + const WXWORD vk = wxCharCodeWXToMSW(key); + + // if the requested key is a LED key, return true if the led is pressed + if ( key == WXK_NUMLOCK || key == WXK_CAPITAL || key == WXK_SCROLL ) + { + // low order bit means LED is highlighted and high order one means the + // key is down; for compatibility with the other ports return true if + // either one is set + return GetKeyState(vk) != 0; + + } + else // normal key + { + return wxIsKeyDown(vk); + } +} + + +wxMouseState wxGetMouseState() +{ + wxMouseState ms; + POINT pt; + GetCursorPos( &pt ); + + ms.SetX(pt.x); + ms.SetY(pt.y); + ms.SetLeftDown(wxIsKeyDown(VK_LBUTTON)); + ms.SetMiddleDown(wxIsKeyDown(VK_MBUTTON)); + ms.SetRightDown(wxIsKeyDown(VK_RBUTTON)); + + ms.SetControlDown(wxIsKeyDown(VK_CONTROL)); + ms.SetShiftDown(wxIsKeyDown(VK_SHIFT)); + ms.SetAltDown(wxIsKeyDown(VK_MENU)); +// ms.SetMetaDown(); + + return ms; +} + + +wxWindow *wxGetActiveWindow() +{ + HWND hWnd = GetActiveWindow(); + if ( hWnd != 0 ) + { + return wxFindWinFromHandle((WXHWND) hWnd); + } + return NULL; +} + +extern wxWindow *wxGetWindowFromHWND(WXHWND hWnd) +{ + HWND hwnd = (HWND)hWnd; + + // For a radiobutton, we get the radiobox from GWL_USERDATA (which is set + // by code in msw/radiobox.cpp), for all the others we just search up the + // window hierarchy + wxWindow *win = (wxWindow *)NULL; + if ( hwnd ) + { + win = wxFindWinFromHandle((WXHWND)hwnd); + if ( !win ) + { +#if wxUSE_RADIOBOX + // native radiobuttons return DLGC_RADIOBUTTON here and for any + // wxWindow class which overrides WM_GETDLGCODE processing to + // do it as well, win would be already non NULL + if ( ::SendMessage(hwnd, WM_GETDLGCODE, 0, 0) & DLGC_RADIOBUTTON ) + { + win = (wxWindow *)wxGetWindowUserData(hwnd); + } + //else: it's a wxRadioButton, not a radiobutton from wxRadioBox +#endif // wxUSE_RADIOBOX + + // spin control text buddy window should be mapped to spin ctrl + // itself so try it too +#if wxUSE_SPINCTRL && !defined(__WXUNIVERSAL__) + if ( !win ) + { + win = wxSpinCtrl::GetSpinForTextCtrl((WXHWND)hwnd); + } +#endif // wxUSE_SPINCTRL + } + } + + while ( hwnd && !win ) + { + // this is a really ugly hack needed to avoid mistakenly returning the + // parent frame wxWindow for the find/replace modeless dialog HWND - + // this, in turn, is needed to call IsDialogMessage() from + // wxApp::ProcessMessage() as for this we must return NULL from here + // + // FIXME: this is clearly not the best way to do it but I think we'll + // need to change HWND <-> wxWindow code more heavily than I can + // do it now to fix it +#ifndef __WXMICROWIN__ + if ( ::GetWindow(hwnd, GW_OWNER) ) + { + // it's a dialog box, don't go upwards + break; + } +#endif + + hwnd = ::GetParent(hwnd); + win = wxFindWinFromHandle((WXHWND)hwnd); + } + + return win; +} + +#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) + +// Windows keyboard hook. Allows interception of e.g. F1, ESCAPE +// in active frames and dialogs, regardless of where the focus is. +static HHOOK wxTheKeyboardHook = 0; + +int APIENTRY +wxKeyboardHook(int nCode, WORD wParam, DWORD lParam) +{ + DWORD hiWord = HIWORD(lParam); + if ( nCode != HC_NOREMOVE && ((hiWord & KF_UP) == 0) ) + { + int id = wxCharCodeMSWToWX(wParam, lParam); + if ( id != 0 ) + { + wxKeyEvent event(wxEVT_CHAR_HOOK); + if ( (HIWORD(lParam) & KF_ALTDOWN) == KF_ALTDOWN ) + event.m_altDown = true; + + event.SetEventObject(NULL); + event.m_keyCode = id; + event.m_shiftDown = wxIsShiftDown(); + event.m_controlDown = wxIsCtrlDown(); +#ifndef __WXWINCE__ + event.SetTimestamp(::GetMessageTime()); +#endif + wxWindow *win = wxGetActiveWindow(); + wxEvtHandler *handler; + if ( win ) + { + handler = win->GetEventHandler(); + event.SetId(win->GetId()); + } + else + { + handler = wxTheApp; + event.SetId(wxID_ANY); + } + + if ( handler && handler->ProcessEvent(event) ) + { + // processed + return 1; + } + } + } + + return (int)CallNextHookEx(wxTheKeyboardHook, nCode, wParam, lParam); +} + +void wxSetKeyboardHook(bool doIt) +{ + if ( doIt ) + { + wxTheKeyboardHook = ::SetWindowsHookEx + ( + WH_KEYBOARD, + (HOOKPROC)wxKeyboardHook, + NULL, // must be NULL for process hook + ::GetCurrentThreadId() + ); + if ( !wxTheKeyboardHook ) + { + wxLogLastError(_T("SetWindowsHookEx(wxKeyboardHook)")); + } + } + else // uninstall + { + if ( wxTheKeyboardHook ) + ::UnhookWindowsHookEx(wxTheKeyboardHook); + } +} + +#endif // !__WXMICROWIN__ + +#ifdef __WXDEBUG__ +const wxChar *wxGetMessageName(int message) +{ + switch ( message ) + { + case 0x0000: return wxT("WM_NULL"); + case 0x0001: return wxT("WM_CREATE"); + case 0x0002: return wxT("WM_DESTROY"); + case 0x0003: return wxT("WM_MOVE"); + case 0x0005: return wxT("WM_SIZE"); + case 0x0006: return wxT("WM_ACTIVATE"); + case 0x0007: return wxT("WM_SETFOCUS"); + case 0x0008: return wxT("WM_KILLFOCUS"); + case 0x000A: return wxT("WM_ENABLE"); + case 0x000B: return wxT("WM_SETREDRAW"); + case 0x000C: return wxT("WM_SETTEXT"); + case 0x000D: return wxT("WM_GETTEXT"); + case 0x000E: return wxT("WM_GETTEXTLENGTH"); + case 0x000F: return wxT("WM_PAINT"); + case 0x0010: return wxT("WM_CLOSE"); + case 0x0011: return wxT("WM_QUERYENDSESSION"); + case 0x0012: return wxT("WM_QUIT"); + case 0x0013: return wxT("WM_QUERYOPEN"); + case 0x0014: return wxT("WM_ERASEBKGND"); + case 0x0015: return wxT("WM_SYSCOLORCHANGE"); + case 0x0016: return wxT("WM_ENDSESSION"); + case 0x0017: return wxT("WM_SYSTEMERROR"); + case 0x0018: return wxT("WM_SHOWWINDOW"); + case 0x0019: return wxT("WM_CTLCOLOR"); + case 0x001A: return wxT("WM_WININICHANGE"); + case 0x001B: return wxT("WM_DEVMODECHANGE"); + case 0x001C: return wxT("WM_ACTIVATEAPP"); + case 0x001D: return wxT("WM_FONTCHANGE"); + case 0x001E: return wxT("WM_TIMECHANGE"); + case 0x001F: return wxT("WM_CANCELMODE"); + case 0x0020: return wxT("WM_SETCURSOR"); + case 0x0021: return wxT("WM_MOUSEACTIVATE"); + case 0x0022: return wxT("WM_CHILDACTIVATE"); + case 0x0023: return wxT("WM_QUEUESYNC"); + case 0x0024: return wxT("WM_GETMINMAXINFO"); + case 0x0026: return wxT("WM_PAINTICON"); + case 0x0027: return wxT("WM_ICONERASEBKGND"); + case 0x0028: return wxT("WM_NEXTDLGCTL"); + case 0x002A: return wxT("WM_SPOOLERSTATUS"); + case 0x002B: return wxT("WM_DRAWITEM"); + case 0x002C: return wxT("WM_MEASUREITEM"); + case 0x002D: return wxT("WM_DELETEITEM"); + case 0x002E: return wxT("WM_VKEYTOITEM"); + case 0x002F: return wxT("WM_CHARTOITEM"); + case 0x0030: return wxT("WM_SETFONT"); + case 0x0031: return wxT("WM_GETFONT"); + case 0x0037: return wxT("WM_QUERYDRAGICON"); + case 0x0039: return wxT("WM_COMPAREITEM"); + case 0x0041: return wxT("WM_COMPACTING"); + case 0x0044: return wxT("WM_COMMNOTIFY"); + case 0x0046: return wxT("WM_WINDOWPOSCHANGING"); + case 0x0047: return wxT("WM_WINDOWPOSCHANGED"); + case 0x0048: return wxT("WM_POWER"); + + case 0x004A: return wxT("WM_COPYDATA"); + case 0x004B: return wxT("WM_CANCELJOURNAL"); + case 0x004E: return wxT("WM_NOTIFY"); + case 0x0050: return wxT("WM_INPUTLANGCHANGEREQUEST"); + case 0x0051: return wxT("WM_INPUTLANGCHANGE"); + case 0x0052: return wxT("WM_TCARD"); + case 0x0053: return wxT("WM_HELP"); + case 0x0054: return wxT("WM_USERCHANGED"); + case 0x0055: return wxT("WM_NOTIFYFORMAT"); + case 0x007B: return wxT("WM_CONTEXTMENU"); + case 0x007C: return wxT("WM_STYLECHANGING"); + case 0x007D: return wxT("WM_STYLECHANGED"); + case 0x007E: return wxT("WM_DISPLAYCHANGE"); + case 0x007F: return wxT("WM_GETICON"); + case 0x0080: return wxT("WM_SETICON"); + + case 0x0081: return wxT("WM_NCCREATE"); + case 0x0082: return wxT("WM_NCDESTROY"); + case 0x0083: return wxT("WM_NCCALCSIZE"); + case 0x0084: return wxT("WM_NCHITTEST"); + case 0x0085: return wxT("WM_NCPAINT"); + case 0x0086: return wxT("WM_NCACTIVATE"); + case 0x0087: return wxT("WM_GETDLGCODE"); + case 0x00A0: return wxT("WM_NCMOUSEMOVE"); + case 0x00A1: return wxT("WM_NCLBUTTONDOWN"); + case 0x00A2: return wxT("WM_NCLBUTTONUP"); + case 0x00A3: return wxT("WM_NCLBUTTONDBLCLK"); + case 0x00A4: return wxT("WM_NCRBUTTONDOWN"); + case 0x00A5: return wxT("WM_NCRBUTTONUP"); + case 0x00A6: return wxT("WM_NCRBUTTONDBLCLK"); + case 0x00A7: return wxT("WM_NCMBUTTONDOWN"); + case 0x00A8: return wxT("WM_NCMBUTTONUP"); + case 0x00A9: return wxT("WM_NCMBUTTONDBLCLK"); + case 0x0100: return wxT("WM_KEYDOWN"); + case 0x0101: return wxT("WM_KEYUP"); + case 0x0102: return wxT("WM_CHAR"); + case 0x0103: return wxT("WM_DEADCHAR"); + case 0x0104: return wxT("WM_SYSKEYDOWN"); + case 0x0105: return wxT("WM_SYSKEYUP"); + case 0x0106: return wxT("WM_SYSCHAR"); + case 0x0107: return wxT("WM_SYSDEADCHAR"); + case 0x0108: return wxT("WM_KEYLAST"); + + case 0x010D: return wxT("WM_IME_STARTCOMPOSITION"); + case 0x010E: return wxT("WM_IME_ENDCOMPOSITION"); + case 0x010F: return wxT("WM_IME_COMPOSITION"); + + case 0x0110: return wxT("WM_INITDIALOG"); + case 0x0111: return wxT("WM_COMMAND"); + case 0x0112: return wxT("WM_SYSCOMMAND"); + case 0x0113: return wxT("WM_TIMER"); + case 0x0114: return wxT("WM_HSCROLL"); + case 0x0115: return wxT("WM_VSCROLL"); + case 0x0116: return wxT("WM_INITMENU"); + case 0x0117: return wxT("WM_INITMENUPOPUP"); + case 0x011F: return wxT("WM_MENUSELECT"); + case 0x0120: return wxT("WM_MENUCHAR"); + case 0x0121: return wxT("WM_ENTERIDLE"); + + case 0x0127: return wxT("WM_CHANGEUISTATE"); + case 0x0128: return wxT("WM_UPDATEUISTATE"); + case 0x0129: return wxT("WM_QUERYUISTATE"); + + case 0x0132: return wxT("WM_CTLCOLORMSGBOX"); + case 0x0133: return wxT("WM_CTLCOLOREDIT"); + case 0x0134: return wxT("WM_CTLCOLORLISTBOX"); + case 0x0135: return wxT("WM_CTLCOLORBTN"); + case 0x0136: return wxT("WM_CTLCOLORDLG"); + case 0x0137: return wxT("WM_CTLCOLORSCROLLBAR"); + case 0x0138: return wxT("WM_CTLCOLORSTATIC"); + + case 0x01E1: return wxT("MN_GETHMENU"); + + case 0x0200: return wxT("WM_MOUSEMOVE"); + case 0x0201: return wxT("WM_LBUTTONDOWN"); + case 0x0202: return wxT("WM_LBUTTONUP"); + case 0x0203: return wxT("WM_LBUTTONDBLCLK"); + case 0x0204: return wxT("WM_RBUTTONDOWN"); + case 0x0205: return wxT("WM_RBUTTONUP"); + case 0x0206: return wxT("WM_RBUTTONDBLCLK"); + case 0x0207: return wxT("WM_MBUTTONDOWN"); + case 0x0208: return wxT("WM_MBUTTONUP"); + case 0x0209: return wxT("WM_MBUTTONDBLCLK"); + case 0x020A: return wxT("WM_MOUSEWHEEL"); + case 0x0210: return wxT("WM_PARENTNOTIFY"); + case 0x0211: return wxT("WM_ENTERMENULOOP"); + case 0x0212: return wxT("WM_EXITMENULOOP"); + + case 0x0213: return wxT("WM_NEXTMENU"); + case 0x0214: return wxT("WM_SIZING"); + case 0x0215: return wxT("WM_CAPTURECHANGED"); + case 0x0216: return wxT("WM_MOVING"); + case 0x0218: return wxT("WM_POWERBROADCAST"); + case 0x0219: return wxT("WM_DEVICECHANGE"); + + case 0x0220: return wxT("WM_MDICREATE"); + case 0x0221: return wxT("WM_MDIDESTROY"); + case 0x0222: return wxT("WM_MDIACTIVATE"); + case 0x0223: return wxT("WM_MDIRESTORE"); + case 0x0224: return wxT("WM_MDINEXT"); + case 0x0225: return wxT("WM_MDIMAXIMIZE"); + case 0x0226: return wxT("WM_MDITILE"); + case 0x0227: return wxT("WM_MDICASCADE"); + case 0x0228: return wxT("WM_MDIICONARRANGE"); + case 0x0229: return wxT("WM_MDIGETACTIVE"); + case 0x0230: return wxT("WM_MDISETMENU"); + case 0x0233: return wxT("WM_DROPFILES"); + + case 0x0281: return wxT("WM_IME_SETCONTEXT"); + case 0x0282: return wxT("WM_IME_NOTIFY"); + case 0x0283: return wxT("WM_IME_CONTROL"); + case 0x0284: return wxT("WM_IME_COMPOSITIONFULL"); + case 0x0285: return wxT("WM_IME_SELECT"); + case 0x0286: return wxT("WM_IME_CHAR"); + case 0x0290: return wxT("WM_IME_KEYDOWN"); + case 0x0291: return wxT("WM_IME_KEYUP"); + + case 0x0300: return wxT("WM_CUT"); + case 0x0301: return wxT("WM_COPY"); + case 0x0302: return wxT("WM_PASTE"); + case 0x0303: return wxT("WM_CLEAR"); + case 0x0304: return wxT("WM_UNDO"); + case 0x0305: return wxT("WM_RENDERFORMAT"); + case 0x0306: return wxT("WM_RENDERALLFORMATS"); + case 0x0307: return wxT("WM_DESTROYCLIPBOARD"); + case 0x0308: return wxT("WM_DRAWCLIPBOARD"); + case 0x0309: return wxT("WM_PAINTCLIPBOARD"); + case 0x030A: return wxT("WM_VSCROLLCLIPBOARD"); + case 0x030B: return wxT("WM_SIZECLIPBOARD"); + case 0x030C: return wxT("WM_ASKCBFORMATNAME"); + case 0x030D: return wxT("WM_CHANGECBCHAIN"); + case 0x030E: return wxT("WM_HSCROLLCLIPBOARD"); + case 0x030F: return wxT("WM_QUERYNEWPALETTE"); + case 0x0310: return wxT("WM_PALETTEISCHANGING"); + case 0x0311: return wxT("WM_PALETTECHANGED"); +#if wxUSE_HOTKEY + case 0x0312: return wxT("WM_HOTKEY"); +#endif + + // common controls messages - although they're not strictly speaking + // standard, it's nice to decode them nevertheless + + // listview + case 0x1000 + 0: return wxT("LVM_GETBKCOLOR"); + case 0x1000 + 1: return wxT("LVM_SETBKCOLOR"); + case 0x1000 + 2: return wxT("LVM_GETIMAGELIST"); + case 0x1000 + 3: return wxT("LVM_SETIMAGELIST"); + case 0x1000 + 4: return wxT("LVM_GETITEMCOUNT"); + case 0x1000 + 5: return wxT("LVM_GETITEMA"); + case 0x1000 + 75: return wxT("LVM_GETITEMW"); + case 0x1000 + 6: return wxT("LVM_SETITEMA"); + case 0x1000 + 76: return wxT("LVM_SETITEMW"); + case 0x1000 + 7: return wxT("LVM_INSERTITEMA"); + case 0x1000 + 77: return wxT("LVM_INSERTITEMW"); + case 0x1000 + 8: return wxT("LVM_DELETEITEM"); + case 0x1000 + 9: return wxT("LVM_DELETEALLITEMS"); + case 0x1000 + 10: return wxT("LVM_GETCALLBACKMASK"); + case 0x1000 + 11: return wxT("LVM_SETCALLBACKMASK"); + case 0x1000 + 12: return wxT("LVM_GETNEXTITEM"); + case 0x1000 + 13: return wxT("LVM_FINDITEMA"); + case 0x1000 + 83: return wxT("LVM_FINDITEMW"); + case 0x1000 + 14: return wxT("LVM_GETITEMRECT"); + case 0x1000 + 15: return wxT("LVM_SETITEMPOSITION"); + case 0x1000 + 16: return wxT("LVM_GETITEMPOSITION"); + case 0x1000 + 17: return wxT("LVM_GETSTRINGWIDTHA"); + case 0x1000 + 87: return wxT("LVM_GETSTRINGWIDTHW"); + case 0x1000 + 18: return wxT("LVM_HITTEST"); + case 0x1000 + 19: return wxT("LVM_ENSUREVISIBLE"); + case 0x1000 + 20: return wxT("LVM_SCROLL"); + case 0x1000 + 21: return wxT("LVM_REDRAWITEMS"); + case 0x1000 + 22: return wxT("LVM_ARRANGE"); + case 0x1000 + 23: return wxT("LVM_EDITLABELA"); + case 0x1000 + 118: return wxT("LVM_EDITLABELW"); + case 0x1000 + 24: return wxT("LVM_GETEDITCONTROL"); + case 0x1000 + 25: return wxT("LVM_GETCOLUMNA"); + case 0x1000 + 95: return wxT("LVM_GETCOLUMNW"); + case 0x1000 + 26: return wxT("LVM_SETCOLUMNA"); + case 0x1000 + 96: return wxT("LVM_SETCOLUMNW"); + case 0x1000 + 27: return wxT("LVM_INSERTCOLUMNA"); + case 0x1000 + 97: return wxT("LVM_INSERTCOLUMNW"); + case 0x1000 + 28: return wxT("LVM_DELETECOLUMN"); + case 0x1000 + 29: return wxT("LVM_GETCOLUMNWIDTH"); + case 0x1000 + 30: return wxT("LVM_SETCOLUMNWIDTH"); + case 0x1000 + 31: return wxT("LVM_GETHEADER"); + case 0x1000 + 33: return wxT("LVM_CREATEDRAGIMAGE"); + case 0x1000 + 34: return wxT("LVM_GETVIEWRECT"); + case 0x1000 + 35: return wxT("LVM_GETTEXTCOLOR"); + case 0x1000 + 36: return wxT("LVM_SETTEXTCOLOR"); + case 0x1000 + 37: return wxT("LVM_GETTEXTBKCOLOR"); + case 0x1000 + 38: return wxT("LVM_SETTEXTBKCOLOR"); + case 0x1000 + 39: return wxT("LVM_GETTOPINDEX"); + case 0x1000 + 40: return wxT("LVM_GETCOUNTPERPAGE"); + case 0x1000 + 41: return wxT("LVM_GETORIGIN"); + case 0x1000 + 42: return wxT("LVM_UPDATE"); + case 0x1000 + 43: return wxT("LVM_SETITEMSTATE"); + case 0x1000 + 44: return wxT("LVM_GETITEMSTATE"); + case 0x1000 + 45: return wxT("LVM_GETITEMTEXTA"); + case 0x1000 + 115: return wxT("LVM_GETITEMTEXTW"); + case 0x1000 + 46: return wxT("LVM_SETITEMTEXTA"); + case 0x1000 + 116: return wxT("LVM_SETITEMTEXTW"); + case 0x1000 + 47: return wxT("LVM_SETITEMCOUNT"); + case 0x1000 + 48: return wxT("LVM_SORTITEMS"); + case 0x1000 + 49: return wxT("LVM_SETITEMPOSITION32"); + case 0x1000 + 50: return wxT("LVM_GETSELECTEDCOUNT"); + case 0x1000 + 51: return wxT("LVM_GETITEMSPACING"); + case 0x1000 + 52: return wxT("LVM_GETISEARCHSTRINGA"); + case 0x1000 + 117: return wxT("LVM_GETISEARCHSTRINGW"); + case 0x1000 + 53: return wxT("LVM_SETICONSPACING"); + case 0x1000 + 54: return wxT("LVM_SETEXTENDEDLISTVIEWSTYLE"); + case 0x1000 + 55: return wxT("LVM_GETEXTENDEDLISTVIEWSTYLE"); + case 0x1000 + 56: return wxT("LVM_GETSUBITEMRECT"); + case 0x1000 + 57: return wxT("LVM_SUBITEMHITTEST"); + case 0x1000 + 58: return wxT("LVM_SETCOLUMNORDERARRAY"); + case 0x1000 + 59: return wxT("LVM_GETCOLUMNORDERARRAY"); + case 0x1000 + 60: return wxT("LVM_SETHOTITEM"); + case 0x1000 + 61: return wxT("LVM_GETHOTITEM"); + case 0x1000 + 62: return wxT("LVM_SETHOTCURSOR"); + case 0x1000 + 63: return wxT("LVM_GETHOTCURSOR"); + case 0x1000 + 64: return wxT("LVM_APPROXIMATEVIEWRECT"); + case 0x1000 + 65: return wxT("LVM_SETWORKAREA"); + + // tree view + case 0x1100 + 0: return wxT("TVM_INSERTITEMA"); + case 0x1100 + 50: return wxT("TVM_INSERTITEMW"); + case 0x1100 + 1: return wxT("TVM_DELETEITEM"); + case 0x1100 + 2: return wxT("TVM_EXPAND"); + case 0x1100 + 4: return wxT("TVM_GETITEMRECT"); + case 0x1100 + 5: return wxT("TVM_GETCOUNT"); + case 0x1100 + 6: return wxT("TVM_GETINDENT"); + case 0x1100 + 7: return wxT("TVM_SETINDENT"); + case 0x1100 + 8: return wxT("TVM_GETIMAGELIST"); + case 0x1100 + 9: return wxT("TVM_SETIMAGELIST"); + case 0x1100 + 10: return wxT("TVM_GETNEXTITEM"); + case 0x1100 + 11: return wxT("TVM_SELECTITEM"); + case 0x1100 + 12: return wxT("TVM_GETITEMA"); + case 0x1100 + 62: return wxT("TVM_GETITEMW"); + case 0x1100 + 13: return wxT("TVM_SETITEMA"); + case 0x1100 + 63: return wxT("TVM_SETITEMW"); + case 0x1100 + 14: return wxT("TVM_EDITLABELA"); + case 0x1100 + 65: return wxT("TVM_EDITLABELW"); + case 0x1100 + 15: return wxT("TVM_GETEDITCONTROL"); + case 0x1100 + 16: return wxT("TVM_GETVISIBLECOUNT"); + case 0x1100 + 17: return wxT("TVM_HITTEST"); + case 0x1100 + 18: return wxT("TVM_CREATEDRAGIMAGE"); + case 0x1100 + 19: return wxT("TVM_SORTCHILDREN"); + case 0x1100 + 20: return wxT("TVM_ENSUREVISIBLE"); + case 0x1100 + 21: return wxT("TVM_SORTCHILDRENCB"); + case 0x1100 + 22: return wxT("TVM_ENDEDITLABELNOW"); + case 0x1100 + 23: return wxT("TVM_GETISEARCHSTRINGA"); + case 0x1100 + 64: return wxT("TVM_GETISEARCHSTRINGW"); + case 0x1100 + 24: return wxT("TVM_SETTOOLTIPS"); + case 0x1100 + 25: return wxT("TVM_GETTOOLTIPS"); + + // header + case 0x1200 + 0: return wxT("HDM_GETITEMCOUNT"); + case 0x1200 + 1: return wxT("HDM_INSERTITEMA"); + case 0x1200 + 10: return wxT("HDM_INSERTITEMW"); + case 0x1200 + 2: return wxT("HDM_DELETEITEM"); + case 0x1200 + 3: return wxT("HDM_GETITEMA"); + case 0x1200 + 11: return wxT("HDM_GETITEMW"); + case 0x1200 + 4: return wxT("HDM_SETITEMA"); + case 0x1200 + 12: return wxT("HDM_SETITEMW"); + case 0x1200 + 5: return wxT("HDM_LAYOUT"); + case 0x1200 + 6: return wxT("HDM_HITTEST"); + case 0x1200 + 7: return wxT("HDM_GETITEMRECT"); + case 0x1200 + 8: return wxT("HDM_SETIMAGELIST"); + case 0x1200 + 9: return wxT("HDM_GETIMAGELIST"); + case 0x1200 + 15: return wxT("HDM_ORDERTOINDEX"); + case 0x1200 + 16: return wxT("HDM_CREATEDRAGIMAGE"); + case 0x1200 + 17: return wxT("HDM_GETORDERARRAY"); + case 0x1200 + 18: return wxT("HDM_SETORDERARRAY"); + case 0x1200 + 19: return wxT("HDM_SETHOTDIVIDER"); + + // tab control + case 0x1300 + 2: return wxT("TCM_GETIMAGELIST"); + case 0x1300 + 3: return wxT("TCM_SETIMAGELIST"); + case 0x1300 + 4: return wxT("TCM_GETITEMCOUNT"); + case 0x1300 + 5: return wxT("TCM_GETITEMA"); + case 0x1300 + 60: return wxT("TCM_GETITEMW"); + case 0x1300 + 6: return wxT("TCM_SETITEMA"); + case 0x1300 + 61: return wxT("TCM_SETITEMW"); + case 0x1300 + 7: return wxT("TCM_INSERTITEMA"); + case 0x1300 + 62: return wxT("TCM_INSERTITEMW"); + case 0x1300 + 8: return wxT("TCM_DELETEITEM"); + case 0x1300 + 9: return wxT("TCM_DELETEALLITEMS"); + case 0x1300 + 10: return wxT("TCM_GETITEMRECT"); + case 0x1300 + 11: return wxT("TCM_GETCURSEL"); + case 0x1300 + 12: return wxT("TCM_SETCURSEL"); + case 0x1300 + 13: return wxT("TCM_HITTEST"); + case 0x1300 + 14: return wxT("TCM_SETITEMEXTRA"); + case 0x1300 + 40: return wxT("TCM_ADJUSTRECT"); + case 0x1300 + 41: return wxT("TCM_SETITEMSIZE"); + case 0x1300 + 42: return wxT("TCM_REMOVEIMAGE"); + case 0x1300 + 43: return wxT("TCM_SETPADDING"); + case 0x1300 + 44: return wxT("TCM_GETROWCOUNT"); + case 0x1300 + 45: return wxT("TCM_GETTOOLTIPS"); + case 0x1300 + 46: return wxT("TCM_SETTOOLTIPS"); + case 0x1300 + 47: return wxT("TCM_GETCURFOCUS"); + case 0x1300 + 48: return wxT("TCM_SETCURFOCUS"); + case 0x1300 + 49: return wxT("TCM_SETMINTABWIDTH"); + case 0x1300 + 50: return wxT("TCM_DESELECTALL"); + + // toolbar + case WM_USER+1: return wxT("TB_ENABLEBUTTON"); + case WM_USER+2: return wxT("TB_CHECKBUTTON"); + case WM_USER+3: return wxT("TB_PRESSBUTTON"); + case WM_USER+4: return wxT("TB_HIDEBUTTON"); + case WM_USER+5: return wxT("TB_INDETERMINATE"); + case WM_USER+9: return wxT("TB_ISBUTTONENABLED"); + case WM_USER+10: return wxT("TB_ISBUTTONCHECKED"); + case WM_USER+11: return wxT("TB_ISBUTTONPRESSED"); + case WM_USER+12: return wxT("TB_ISBUTTONHIDDEN"); + case WM_USER+13: return wxT("TB_ISBUTTONINDETERMINATE"); + case WM_USER+17: return wxT("TB_SETSTATE"); + case WM_USER+18: return wxT("TB_GETSTATE"); + case WM_USER+19: return wxT("TB_ADDBITMAP"); + case WM_USER+20: return wxT("TB_ADDBUTTONS"); + case WM_USER+21: return wxT("TB_INSERTBUTTON"); + case WM_USER+22: return wxT("TB_DELETEBUTTON"); + case WM_USER+23: return wxT("TB_GETBUTTON"); + case WM_USER+24: return wxT("TB_BUTTONCOUNT"); + case WM_USER+25: return wxT("TB_COMMANDTOINDEX"); + case WM_USER+26: return wxT("TB_SAVERESTOREA"); + case WM_USER+76: return wxT("TB_SAVERESTOREW"); + case WM_USER+27: return wxT("TB_CUSTOMIZE"); + case WM_USER+28: return wxT("TB_ADDSTRINGA"); + case WM_USER+77: return wxT("TB_ADDSTRINGW"); + case WM_USER+29: return wxT("TB_GETITEMRECT"); + case WM_USER+30: return wxT("TB_BUTTONSTRUCTSIZE"); + case WM_USER+31: return wxT("TB_SETBUTTONSIZE"); + case WM_USER+32: return wxT("TB_SETBITMAPSIZE"); + case WM_USER+33: return wxT("TB_AUTOSIZE"); + case WM_USER+35: return wxT("TB_GETTOOLTIPS"); + case WM_USER+36: return wxT("TB_SETTOOLTIPS"); + case WM_USER+37: return wxT("TB_SETPARENT"); + case WM_USER+39: return wxT("TB_SETROWS"); + case WM_USER+40: return wxT("TB_GETROWS"); + case WM_USER+42: return wxT("TB_SETCMDID"); + case WM_USER+43: return wxT("TB_CHANGEBITMAP"); + case WM_USER+44: return wxT("TB_GETBITMAP"); + case WM_USER+45: return wxT("TB_GETBUTTONTEXTA"); + case WM_USER+75: return wxT("TB_GETBUTTONTEXTW"); + case WM_USER+46: return wxT("TB_REPLACEBITMAP"); + case WM_USER+47: return wxT("TB_SETINDENT"); + case WM_USER+48: return wxT("TB_SETIMAGELIST"); + case WM_USER+49: return wxT("TB_GETIMAGELIST"); + case WM_USER+50: return wxT("TB_LOADIMAGES"); + case WM_USER+51: return wxT("TB_GETRECT"); + case WM_USER+52: return wxT("TB_SETHOTIMAGELIST"); + case WM_USER+53: return wxT("TB_GETHOTIMAGELIST"); + case WM_USER+54: return wxT("TB_SETDISABLEDIMAGELIST"); + case WM_USER+55: return wxT("TB_GETDISABLEDIMAGELIST"); + case WM_USER+56: return wxT("TB_SETSTYLE"); + case WM_USER+57: return wxT("TB_GETSTYLE"); + case WM_USER+58: return wxT("TB_GETBUTTONSIZE"); + case WM_USER+59: return wxT("TB_SETBUTTONWIDTH"); + case WM_USER+60: return wxT("TB_SETMAXTEXTROWS"); + case WM_USER+61: return wxT("TB_GETTEXTROWS"); + case WM_USER+41: return wxT("TB_GETBITMAPFLAGS"); + + default: + static wxString s_szBuf; + s_szBuf.Printf(wxT(""), message); + return s_szBuf.c_str(); + } +} +#endif //__WXDEBUG__ + +static TEXTMETRIC wxGetTextMetrics(const wxWindowMSW *win) +{ + // prepare the DC + TEXTMETRIC tm; + HWND hwnd = GetHwndOf(win); + HDC hdc = ::GetDC(hwnd); + +#if !wxDIALOG_UNIT_COMPATIBILITY + // and select the current font into it + HFONT hfont = GetHfontOf(win->GetFont()); + if ( hfont ) + { + hfont = (HFONT)::SelectObject(hdc, hfont); + } +#endif + + // finally retrieve the text metrics from it + GetTextMetrics(hdc, &tm); + +#if !wxDIALOG_UNIT_COMPATIBILITY + // and clean up + if ( hfont ) + { + (void)::SelectObject(hdc, hfont); + } +#endif + + ::ReleaseDC(hwnd, hdc); + + return tm; +} + +// Find the wxWindow at the current mouse position, returning the mouse +// position. +wxWindow* wxFindWindowAtPointer(wxPoint& pt) +{ + pt = wxGetMousePosition(); + return wxFindWindowAtPoint(pt); +} + +wxWindow* wxFindWindowAtPoint(const wxPoint& pt) +{ + POINT pt2; + pt2.x = pt.x; + pt2.y = pt.y; + + HWND hWnd = ::WindowFromPoint(pt2); + + return wxGetWindowFromHWND((WXHWND)hWnd); +} + +// Get the current mouse position. +wxPoint wxGetMousePosition() +{ + POINT pt; +#ifdef __WXWINCE__ + GetCursorPosWinCE(&pt); +#else + GetCursorPos( & pt ); +#endif + + return wxPoint(pt.x, pt.y); +} + +#if wxUSE_HOTKEY + +#if defined(__SMARTPHONE__) || defined(__POCKETPC__) +static void WinCEUnregisterHotKey(int modifiers, int id) +{ + // Register hotkeys for the hardware buttons + HINSTANCE hCoreDll; + typedef BOOL (WINAPI *UnregisterFunc1Proc)(UINT, UINT); + + UnregisterFunc1Proc procUnregisterFunc; + hCoreDll = LoadLibrary(_T("coredll.dll")); + if (hCoreDll) + { + procUnregisterFunc = (UnregisterFunc1Proc)GetProcAddress(hCoreDll, _T("UnregisterFunc1")); + if (procUnregisterFunc) + procUnregisterFunc(modifiers, id); + FreeLibrary(hCoreDll); + } +} +#endif + +bool wxWindowMSW::RegisterHotKey(int hotkeyId, int modifiers, int keycode) +{ + UINT win_modifiers=0; + if ( modifiers & wxMOD_ALT ) + win_modifiers |= MOD_ALT; + if ( modifiers & wxMOD_SHIFT ) + win_modifiers |= MOD_SHIFT; + if ( modifiers & wxMOD_CONTROL ) + win_modifiers |= MOD_CONTROL; + if ( modifiers & wxMOD_WIN ) + win_modifiers |= MOD_WIN; + +#if defined(__SMARTPHONE__) || defined(__POCKETPC__) + // Required for PPC and Smartphone hardware buttons + if (keycode >= WXK_SPECIAL1 && keycode <= WXK_SPECIAL20) + WinCEUnregisterHotKey(win_modifiers, hotkeyId); +#endif + + if ( !::RegisterHotKey(GetHwnd(), hotkeyId, win_modifiers, keycode) ) + { + wxLogLastError(_T("RegisterHotKey")); + + return false; + } + + return true; +} + +bool wxWindowMSW::UnregisterHotKey(int hotkeyId) +{ +#if defined(__SMARTPHONE__) || defined(__POCKETPC__) + WinCEUnregisterHotKey(MOD_WIN, hotkeyId); +#endif + + if ( !::UnregisterHotKey(GetHwnd(), hotkeyId) ) + { + wxLogLastError(_T("UnregisterHotKey")); + + return false; + } + + return true; +} + +#if wxUSE_ACCEL + +bool wxWindowMSW::HandleHotKey(WXWPARAM wParam, WXLPARAM lParam) +{ + int hotkeyId = wParam; + int virtualKey = HIWORD(lParam); + int win_modifiers = LOWORD(lParam); + + wxKeyEvent event(CreateKeyEvent(wxEVT_HOTKEY, virtualKey, wParam, lParam)); + event.SetId(hotkeyId); + event.m_shiftDown = (win_modifiers & MOD_SHIFT) != 0; + event.m_controlDown = (win_modifiers & MOD_CONTROL) != 0; + event.m_altDown = (win_modifiers & MOD_ALT) != 0; + event.m_metaDown = (win_modifiers & MOD_WIN) != 0; + + return GetEventHandler()->ProcessEvent(event); +} + +#endif // wxUSE_ACCEL + +#endif // wxUSE_HOTKEY + +// Not tested under WinCE +#ifndef __WXWINCE__ + +// this class installs a message hook which really wakes up our idle processing +// each time a WM_NULL is received (wxWakeUpIdle does this), even if we're +// sitting inside a local modal loop (e.g. a menu is opened or scrollbar is +// being dragged or even inside ::MessageBox()) and so don't control message +// dispatching otherwise +class wxIdleWakeUpModule : public wxModule +{ +public: + virtual bool OnInit() + { + ms_hMsgHookProc = ::SetWindowsHookEx + ( + WH_GETMESSAGE, + &wxIdleWakeUpModule::MsgHookProc, + NULL, + GetCurrentThreadId() + ); + + if ( !ms_hMsgHookProc ) + { + wxLogLastError(_T("SetWindowsHookEx(WH_GETMESSAGE)")); + + return false; + } + + return true; + } + + virtual void OnExit() + { + ::UnhookWindowsHookEx(wxIdleWakeUpModule::ms_hMsgHookProc); + } + + static LRESULT CALLBACK MsgHookProc(int nCode, WPARAM wParam, LPARAM lParam) + { + MSG *msg = (MSG*)lParam; + + // only process the message if it is actually going to be removed from + // the message queue, this prevents that the same event from being + // processed multiple times if now someone just called PeekMessage() + if ( msg->message == WM_NULL && wParam == PM_REMOVE ) + { + wxTheApp->ProcessPendingEvents(); + } + + return CallNextHookEx(ms_hMsgHookProc, nCode, wParam, lParam); + } + +private: + static HHOOK ms_hMsgHookProc; + + DECLARE_DYNAMIC_CLASS(wxIdleWakeUpModule) +}; + +HHOOK wxIdleWakeUpModule::ms_hMsgHookProc = 0; + +IMPLEMENT_DYNAMIC_CLASS(wxIdleWakeUpModule, wxModule) + +#endif // __WXWINCE__ + +#ifdef __WXWINCE__ + +#if wxUSE_STATBOX +static void wxAdjustZOrder(wxWindow* parent) +{ + if (parent->IsKindOf(CLASSINFO(wxStaticBox))) + { + // Set the z-order correctly + SetWindowPos((HWND) parent->GetHWND(), HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE); + } + + wxWindowList::compatibility_iterator current = parent->GetChildren().GetFirst(); + while (current) + { + wxWindow *childWin = current->GetData(); + wxAdjustZOrder(childWin); + current = current->GetNext(); + } +} +#endif + +// We need to adjust the z-order of static boxes in WinCE, to +// make 'contained' controls visible +void wxWindowMSW::OnInitDialog( wxInitDialogEvent& event ) +{ +#if wxUSE_STATBOX + wxAdjustZOrder(this); +#endif + + event.Skip(); +} +#endif + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/installers/patch_wx305_9x/MODIFICATIONS_wx3.0.5.txt b/installers/patch_wx305_9x/MODIFICATIONS_wx3.0.5.txt new file mode 100644 index 0000000..aac0058 --- /dev/null +++ b/installers/patch_wx305_9x/MODIFICATIONS_wx3.0.5.txt @@ -0,0 +1,40 @@ +Based on wxWidgets Stable Release: 3.0.5 (April 27th, 2020) +https://www.wxwidgets.org/downloads/ +https://github.com/wxWidgets/wxWidgets/releases/download/v3.0.5/wxWidgets-3.0.5.zip + +Modifications to compile it for WINVER=0x0400: + + +***** Added in .\src\msw\window.cpp (line 3526): ***** +// Trying to make compatible with Win 9x +#ifndef WM_UNINITMENUPOPUP + #define WM_UNINITMENUPOPUP 0x0125 +#endif +****************************************************** + + +***** Modified .\src\msw\checklst.cpp (line 161): ***** +#if (WINVER >= 0x0500) // Disable in builds for old Win9x versions + // checkmarks should not be mirrored in RTL layout + DWORD oldLayout = impl->GetLayoutDirection() == wxLayout_RightToLeft ? LAYOUT_RTL : 0; + if ( oldLayout & LAYOUT_RTL ) + ::SetLayout(hdc, oldLayout | LAYOUT_BITMAPORIENTATIONPRESERVED); + wxDrawStateBitmap(hdc, hBmpCheck, x, y, uState); + if ( oldLayout & LAYOUT_RTL ) + ::SetLayout(hdc, oldLayout); +#endif +******************************************************* + + +***** Modified .\src\msw\utils.cpp (after line 1170): ***** +***** added (WINVER >= 0x0500) check for OSVERSIONINFOEX wxGetWindowsVersionInfo() +***** code to be used only for newer Windows versions builds +***** For 9x versions used code from 3.0.0 ***** https://github.com/wxWidgets/wxWidgets/blob/v3.0.0/src/msw/utils.cpp +******************************************************* + + +***** Modified .\src\msw\toplevel.cpp (line 1545): ***** +#if (WINVER >= 0x0500) // Disable message in builds for old Win9x versions (doesn't fix it but hides the error...) + wxASSERT_MSG( m_menuDepth > 0, wxS("No open menus?") ); +#endif +******************************************************* diff --git a/installers/patch_wx305_9x/src/msw/checklst.cpp b/installers/patch_wx305_9x/src/msw/checklst.cpp new file mode 100644 index 0000000..56ac6d2 --- /dev/null +++ b/installers/patch_wx305_9x/src/msw/checklst.cpp @@ -0,0 +1,443 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/msw/checklst.cpp +// Purpose: implementation of wxCheckListBox class +// Author: Vadim Zeitlin +// Modified by: +// Created: 16.11.97 +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_CHECKLISTBOX && wxUSE_OWNER_DRAWN + +#include "wx/checklst.h" + +#ifndef WX_PRECOMP + #include "wx/msw/wrapcctl.h" + #include "wx/object.h" + #include "wx/colour.h" + #include "wx/font.h" + #include "wx/bitmap.h" + #include "wx/window.h" + #include "wx/listbox.h" + #include "wx/dcmemory.h" + #include "wx/settings.h" + #include "wx/log.h" +#endif + +#include "wx/ownerdrw.h" + +#include + +#include "wx/renderer.h" +#include "wx/msw/private.h" +#include "wx/msw/dc.h" + +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +// get item (converted to right type) +#define GetItem(n) ((wxCheckListBoxItem *)(GetItem(n))) + +namespace +{ + // space around check mark bitmap in pixels + static const int CHECKMARK_EXTRA_SPACE = 1; + + // space between check bitmap and text label + static const int CHECKMARK_LABEL_SPACE = 2; + +} // anonymous namespace + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// declaration and implementation of wxCheckListBoxItem class +// ---------------------------------------------------------------------------- + +class wxCheckListBoxItem : public wxOwnerDrawn +{ +public: + // ctor + wxCheckListBoxItem(wxCheckListBox *parent); + + // drawing functions + virtual bool OnDrawItem(wxDC& dc, const wxRect& rc, wxODAction act, wxODStatus stat); + + // simple accessors and operations + wxCheckListBox *GetParent() const + { return m_parent; } + + int GetIndex() const + { return m_parent->GetItemIndex(const_cast(this)); } + + wxString GetName() const + { return m_parent->GetString(GetIndex()); } + + + bool IsChecked() const + { return m_checked; } + + void Check(bool bCheck) + { m_checked = bCheck; } + + void Toggle() + { Check(!IsChecked()); } + +private: + wxCheckListBox *m_parent; + bool m_checked; + + wxDECLARE_NO_COPY_CLASS(wxCheckListBoxItem); +}; + +wxCheckListBoxItem::wxCheckListBoxItem(wxCheckListBox *parent) +{ + m_parent = parent; + m_checked = false; + + wxSize size = wxRendererNative::Get().GetCheckBoxSize(parent); + size.x += 2 * CHECKMARK_EXTRA_SPACE + CHECKMARK_LABEL_SPACE; + + SetMarginWidth(size.GetWidth()); + SetBackgroundColour(parent->GetBackgroundColour()); +} + +bool wxCheckListBoxItem::OnDrawItem(wxDC& dc, const wxRect& rc, + wxODAction act, wxODStatus stat) +{ + // first draw the label + if ( !wxOwnerDrawn::OnDrawItem(dc, rc, act, stat) ) + return false; + + // now draw the check mark part + wxMSWDCImpl *impl = (wxMSWDCImpl*) dc.GetImpl(); + HDC hdc = GetHdcOf(*impl); + + wxSize size = wxRendererNative::Get().GetCheckBoxSize(GetParent()); + + // first create bitmap in a memory DC + MemoryHDC hdcMem(hdc); + CompatibleBitmap hBmpCheck(hdc, size.GetWidth(), size.GetHeight()); + + // then draw a check mark into it + { + SelectInHDC selBmp(hdcMem, hBmpCheck); + + int flags = wxCONTROL_FLAT; + if ( IsChecked() ) + flags |= wxCONTROL_CHECKED; + + wxDCTemp dcMem(hdcMem); + wxRendererNative::Get().DrawCheckBox(GetParent(), dcMem, wxRect(size), flags); + } // select hBmpCheck out of hdcMem + + // finally draw bitmap to screen + + // position of check mark bitmap + int x = rc.GetX() + CHECKMARK_EXTRA_SPACE; + int y = rc.GetY() + (rc.GetHeight() - size.GetHeight()) / 2; + + UINT uState = stat & wxOwnerDrawn::wxODSelected ? wxDSB_SELECTED : wxDSB_NORMAL; + +#if (WINVER >= 0x0500) // Disable in builds for old Win9x versions + // checkmarks should not be mirrored in RTL layout + DWORD oldLayout = impl->GetLayoutDirection() == wxLayout_RightToLeft ? LAYOUT_RTL : 0; + if ( oldLayout & LAYOUT_RTL ) + ::SetLayout(hdc, oldLayout | LAYOUT_BITMAPORIENTATIONPRESERVED); + wxDrawStateBitmap(hdc, hBmpCheck, x, y, uState); + if ( oldLayout & LAYOUT_RTL ) + ::SetLayout(hdc, oldLayout); +#endif + + return true; +} + +// ---------------------------------------------------------------------------- +// implementation of wxCheckListBox class +// ---------------------------------------------------------------------------- + +// define event table +// ------------------ +BEGIN_EVENT_TABLE(wxCheckListBox, wxListBox) + EVT_KEY_DOWN(wxCheckListBox::OnKeyDown) + EVT_LEFT_DOWN(wxCheckListBox::OnLeftClick) +END_EVENT_TABLE() + +// control creation +// ---------------- + +// def ctor: use Create() to really create the control +wxCheckListBox::wxCheckListBox() +{ +} + +// ctor which creates the associated control +wxCheckListBox::wxCheckListBox(wxWindow *parent, wxWindowID id, + const wxPoint& pos, const wxSize& size, + int nStrings, const wxString choices[], + long style, const wxValidator& val, + const wxString& name) +{ + Create(parent, id, pos, size, nStrings, choices, style, val, name); +} + +wxCheckListBox::wxCheckListBox(wxWindow *parent, wxWindowID id, + const wxPoint& pos, const wxSize& size, + const wxArrayString& choices, + long style, const wxValidator& val, + const wxString& name) +{ + Create(parent, id, pos, size, choices, style, val, name); +} + +bool wxCheckListBox::Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, const wxSize& size, + int n, const wxString choices[], + long style, + const wxValidator& validator, const wxString& name) +{ + return wxListBox::Create(parent, id, pos, size, n, choices, + style | wxLB_OWNERDRAW, validator, name); +} + +bool wxCheckListBox::Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, const wxSize& size, + const wxArrayString& choices, + long style, + const wxValidator& validator, const wxString& name) +{ + return wxListBox::Create(parent, id, pos, size, choices, + style | wxLB_OWNERDRAW, validator, name); +} + +// create/retrieve item +// -------------------- + +// create a check list box item +wxOwnerDrawn *wxCheckListBox::CreateLboxItem(size_t WXUNUSED(n)) +{ + wxCheckListBoxItem *pItem = new wxCheckListBoxItem(this); + return pItem; +} + +// return item size +// ---------------- +bool wxCheckListBox::MSWOnMeasure(WXMEASUREITEMSTRUCT *item) +{ + if ( wxListBox::MSWOnMeasure(item) ) + { + MEASUREITEMSTRUCT *pStruct = (MEASUREITEMSTRUCT *)item; + + wxSize size = wxRendererNative::Get().GetCheckBoxSize(this); + size.x += 2 * CHECKMARK_EXTRA_SPACE; + size.y += 2 * CHECKMARK_EXTRA_SPACE; + + // add place for the check mark + pStruct->itemWidth += size.GetWidth(); + + if ( pStruct->itemHeight < static_cast(size.GetHeight()) ) + pStruct->itemHeight = size.GetHeight(); + + return true; + } + + return false; + } + +// check items +// ----------- + +bool wxCheckListBox::IsChecked(unsigned int uiIndex) const +{ + wxCHECK_MSG( IsValid(uiIndex), false, wxT("bad wxCheckListBox index") ); + + return GetItem(uiIndex)->IsChecked(); +} + +void wxCheckListBox::Check(unsigned int uiIndex, bool bCheck) +{ + wxCHECK_RET( IsValid(uiIndex), wxT("bad wxCheckListBox index") ); + + GetItem(uiIndex)->Check(bCheck); + RefreshItem(uiIndex); +} + +void wxCheckListBox::Toggle(unsigned int uiIndex) +{ + wxCHECK_RET( IsValid(uiIndex), wxT("bad wxCheckListBox index") ); + + GetItem(uiIndex)->Toggle(); + RefreshItem(uiIndex); +} + +// process events +// -------------- + +void wxCheckListBox::OnKeyDown(wxKeyEvent& event) +{ + // what do we do? + enum + { + NONE, + TOGGLE, + SET, + CLEAR + } oper; + + switch ( event.GetKeyCode() ) + { + case WXK_SPACE: + oper = TOGGLE; + break; + + case WXK_NUMPAD_ADD: + case '+': + oper = SET; + break; + + case WXK_NUMPAD_SUBTRACT: + case '-': + oper = CLEAR; + break; + + default: + oper = NONE; + } + + if ( oper != NONE ) + { + wxArrayInt selections; + int count = 0; + if ( HasMultipleSelection() ) + { + count = GetSelections(selections); + } + else + { + int sel = GetSelection(); + if (sel != -1) + { + count = 1; + selections.Add(sel); + } + } + + for ( int i = 0; i < count; i++ ) + { + int nItem = selections[i]; + + switch ( oper ) + { + case TOGGLE: + Toggle(nItem); + break; + + case SET: + case CLEAR: + Check(nItem, oper == SET); + break; + + default: + wxFAIL_MSG( wxT("what should this key do?") ); + } + + // we should send an event as this has been done by the user and + // not by the program + SendEvent(nItem); + } + } + else // nothing to do + { + event.Skip(); + } +} + +void wxCheckListBox::OnLeftClick(wxMouseEvent& event) +{ + // clicking on the item selects it, clicking on the checkmark toggles + + int nItem = HitTest(event.GetX(), event.GetY()); + + if ( nItem != wxNOT_FOUND ) + { + wxRect rect; + GetItemRect(nItem, rect); + + // convert item rect to check mark rect + wxSize size = wxRendererNative::Get().GetCheckBoxSize(this); + rect.x += CHECKMARK_EXTRA_SPACE; + rect.y += (rect.GetHeight() - size.GetHeight()) / 2; + rect.SetSize(size); + + if ( rect.Contains(event.GetX(), event.GetY()) ) + { + // people expect to get "kill focus" event for the currently + // focused control before getting events from the other controls + // and, equally importantly, they may prevent the focus change from + // taking place at all (e.g. because the old control contents is + // invalid and needs to be corrected) in which case we shouldn't + // generate this event at all + SetFocus(); + if ( FindFocus() == this ) + { + Toggle(nItem); + SendEvent(nItem); + + // scroll one item down if the item is the last one + // and isn't visible at all + int h; + GetClientSize(NULL, &h); + if ( rect.GetBottom() > h ) + ScrollLines(1); + } + } + else + { + // implement default behaviour: clicking on the item selects it + event.Skip(); + } + } + else + { + // implement default behaviour on click outside of client zone + event.Skip(); + } +} + +wxSize wxCheckListBox::DoGetBestClientSize() const +{ + wxSize best = wxListBox::DoGetBestClientSize(); + + // add room for the checkbox + wxSize size = wxRendererNative::Get().GetCheckBoxSize(const_cast(this)); + size.x += 2 * CHECKMARK_EXTRA_SPACE; + size.y += 2 * CHECKMARK_EXTRA_SPACE; + + best.x += size.GetWidth(); + if ( best.y < size.GetHeight() ) + best.y = size.GetHeight(); + + CacheBestSize(best); + return best; +} + +#endif // wxUSE_CHECKLISTBOX diff --git a/installers/patch_wx305_9x/src/msw/toplevel.cpp b/installers/patch_wx305_9x/src/msw/toplevel.cpp new file mode 100644 index 0000000..cbdc6a5 --- /dev/null +++ b/installers/patch_wx305_9x/src/msw/toplevel.cpp @@ -0,0 +1,1715 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/msw/toplevel.cpp +// Purpose: implements wxTopLevelWindow for MSW +// Author: Vadim Zeitlin +// Modified by: +// Created: 24.09.01 +// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/toplevel.h" + +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/dialog.h" + #include "wx/string.h" + #include "wx/log.h" + #include "wx/intl.h" + #include "wx/frame.h" + #include "wx/menu.h" + #include "wx/containr.h" // wxSetFocusToChild() + #include "wx/module.h" +#endif //WX_PRECOMP + +#include "wx/dynlib.h" + +#include "wx/msw/private.h" +#if defined(__WXWINCE__) && !defined(__HANDHELDPC__) + #include + #include + // Standard SDK doesn't have aygshell.dll: see include/wx/msw/wince/libraries.h + #if _WIN32_WCE < 400 || !defined(__WINCE_STANDARDSDK__) + #include + #endif +#endif + +#include "wx/msw/winundef.h" +#include "wx/msw/missing.h" + +#include "wx/display.h" + +#ifndef ICON_BIG + #define ICON_BIG 1 +#endif + +#ifndef ICON_SMALL + #define ICON_SMALL 0 +#endif + +// FIXME-VC6: Only VC6 doesn't have this in its standard headers so this +// could be removed once support for it is dropped. +#ifndef WM_UNINITMENUPOPUP + #define WM_UNINITMENUPOPUP 0x0125 +#endif + +// ---------------------------------------------------------------------------- +// globals +// ---------------------------------------------------------------------------- + +#if wxUSE_MENUS || wxUSE_MENUS_NATIVE + extern wxMenu *wxCurrentPopupMenu; +#endif // wxUSE_MENUS || wxUSE_MENUS_NATIVE + + +// ---------------------------------------------------------------------------- +// stubs for missing functions under MicroWindows +// ---------------------------------------------------------------------------- + +#ifdef __WXMICROWIN__ + +// static inline bool IsIconic(HWND WXUNUSED(hwnd)) { return false; } +static inline bool IsZoomed(HWND WXUNUSED(hwnd)) { return false; } + +#endif // __WXMICROWIN__ + +// NB: wxDlgProc must be defined here and not in dialog.cpp because the latter +// is not included by wxUniv build which does need wxDlgProc +LONG APIENTRY _EXPORT +wxDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); + +// ---------------------------------------------------------------------------- +// wxTLWHiddenParentModule: used to manage the hidden parent window (we need a +// module to ensure that the window is always deleted) +// ---------------------------------------------------------------------------- + +class wxTLWHiddenParentModule : public wxModule +{ +public: + // module init/finalize + virtual bool OnInit(); + virtual void OnExit(); + + // get the hidden window (creates on demand) + static HWND GetHWND(); + +private: + // the HWND of the hidden parent + static HWND ms_hwnd; + + // the class used to create it + static const wxChar *ms_className; + + DECLARE_DYNAMIC_CLASS(wxTLWHiddenParentModule) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxTLWHiddenParentModule, wxModule) + +// ============================================================================ +// wxTopLevelWindowMSW implementation +// ============================================================================ + +BEGIN_EVENT_TABLE(wxTopLevelWindowMSW, wxTopLevelWindowBase) + EVT_ACTIVATE(wxTopLevelWindowMSW::OnActivate) +END_EVENT_TABLE() + +// ---------------------------------------------------------------------------- +// wxTopLevelWindowMSW creation +// ---------------------------------------------------------------------------- + +void wxTopLevelWindowMSW::Init() +{ + m_iconized = + m_maximizeOnShow = false; + + // Data to save/restore when calling ShowFullScreen + m_fsStyle = 0; + m_fsOldWindowStyle = 0; + m_fsIsMaximized = false; + m_fsIsShowing = false; + + m_winLastFocused = NULL; + +#if defined(__SMARTPHONE__) && defined(__WXWINCE__) + m_MenuBarHWND = 0; +#endif + +#if defined(__SMARTPHONE__) || defined(__POCKETPC__) + SHACTIVATEINFO* info = new SHACTIVATEINFO; + wxZeroMemory(*info); + info->cbSize = sizeof(SHACTIVATEINFO); + + m_activateInfo = (void*) info; +#endif + + m_menuSystem = NULL; + m_menuDepth = 0; +} + +WXDWORD wxTopLevelWindowMSW::MSWGetStyle(long style, WXDWORD *exflags) const +{ + // let the base class deal with the common styles but fix the ones which + // don't make sense for us (we also deal with the borders ourselves) + WXDWORD msflags = wxWindow::MSWGetStyle + ( + (style & ~wxBORDER_MASK) | wxBORDER_NONE, exflags + ) & ~WS_CHILD & ~WS_VISIBLE; + + // For some reason, WS_VISIBLE needs to be defined on creation for + // SmartPhone 2003. The title can fail to be displayed otherwise. +#if defined(__SMARTPHONE__) || (defined(__WXWINCE__) && _WIN32_WCE < 400) + msflags |= WS_VISIBLE; + ((wxTopLevelWindowMSW*)this)->wxWindowBase::Show(true); +#endif + + // first select the kind of window being created + // + // note that if we don't set WS_POPUP, Windows assumes WS_OVERLAPPED and + // creates a window with both caption and border, hence we need to use + // WS_POPUP in a few cases just to avoid having caption/border which we + // don't want + + // border and caption styles + if ( ( style & wxRESIZE_BORDER ) && !IsAlwaysMaximized()) + msflags |= WS_THICKFRAME; + else if ( exflags && ((style & wxBORDER_DOUBLE) || (style & wxBORDER_RAISED)) ) + *exflags |= WS_EX_DLGMODALFRAME; + else if ( !(style & wxBORDER_NONE) ) + msflags |= WS_BORDER; +#ifndef __POCKETPC__ + else + msflags |= WS_POPUP; +#endif + + // normally we consider that all windows without a caption must be popups, + // but CE is an exception: there windows normally do not have the caption + // but shouldn't be made popups as popups can't have menus and don't look + // like normal windows anyhow + + // TODO: Smartphone appears to like wxCAPTION, but we should check that + // we need it. +#if defined(__SMARTPHONE__) || !defined(__WXWINCE__) + if ( style & wxCAPTION ) + msflags |= WS_CAPTION; +#ifndef __WXWINCE__ + else + msflags |= WS_POPUP; +#endif // !__WXWINCE__ +#endif + + // next translate the individual flags + + // WS_EX_CONTEXTHELP is incompatible with WS_MINIMIZEBOX and WS_MAXIMIZEBOX + // and is ignored if we specify both of them, but chances are that if we + // use wxWS_EX_CONTEXTHELP, we really do want to have the context help + // button while wxMINIMIZE/wxMAXIMIZE are included by default, so the help + // takes precedence + if ( !(GetExtraStyle() & wxWS_EX_CONTEXTHELP) ) + { + if ( style & wxMINIMIZE_BOX ) + msflags |= WS_MINIMIZEBOX; + if ( style & wxMAXIMIZE_BOX ) + msflags |= WS_MAXIMIZEBOX; + } + +#ifndef __WXWINCE__ + // notice that if wxCLOSE_BOX is specified we need to use WS_SYSMENU too as + // otherwise the close box doesn't appear + if ( style & (wxSYSTEM_MENU | wxCLOSE_BOX) ) + msflags |= WS_SYSMENU; +#endif // !__WXWINCE__ + + // NB: under CE these 2 styles are not supported currently, we should + // call Minimize()/Maximize() "manually" if we want to support them + if ( style & wxMINIMIZE ) + msflags |= WS_MINIMIZE; + + if ( style & wxMAXIMIZE ) + msflags |= WS_MAXIMIZE; + + // Keep this here because it saves recoding this function in wxTinyFrame + if ( style & wxTINY_CAPTION ) + msflags |= WS_CAPTION; + + if ( exflags ) + { + // there is no taskbar under CE, so omit all this +#if !defined(__WXWINCE__) + if ( !(GetExtraStyle() & wxTOPLEVEL_EX_DIALOG) ) + { + if ( style & wxFRAME_TOOL_WINDOW ) + { + // create the palette-like window + *exflags |= WS_EX_TOOLWINDOW; + + // tool windows shouldn't appear on the taskbar (as documented) + style |= wxFRAME_NO_TASKBAR; + } + + // We have to solve 2 different problems here: + // + // 1. frames with wxFRAME_NO_TASKBAR flag shouldn't appear in the + // taskbar even if they don't have a parent + // + // 2. frames without this style should appear in the taskbar even + // if they're owned (Windows only puts non owned windows into + // the taskbar normally) + // + // The second one is solved here by using WS_EX_APPWINDOW flag, the + // first one is dealt with in our MSWGetParent() method + // implementation + if ( !(style & wxFRAME_NO_TASKBAR) && GetParent() ) + { + // need to force the frame to appear in the taskbar + *exflags |= WS_EX_APPWINDOW; + } + //else: nothing to do [here] + } + + if ( GetExtraStyle() & wxWS_EX_CONTEXTHELP ) + *exflags |= WS_EX_CONTEXTHELP; +#endif // !__WXWINCE__ + + if ( style & wxSTAY_ON_TOP ) + *exflags |= WS_EX_TOPMOST; + } + + return msflags; +} + +WXHWND wxTopLevelWindowMSW::MSWGetParent() const +{ + // for the frames without wxFRAME_FLOAT_ON_PARENT style we should use NULL + // parent HWND or it would be always on top of its parent which is not what + // we usually want (in fact, we only want it for frames with the + // wxFRAME_FLOAT_ON_PARENT flag) + HWND hwndParent = NULL; + if ( HasFlag(wxFRAME_FLOAT_ON_PARENT) ) + { + const wxWindow *parent = GetParent(); + + if ( !parent ) + { + // this flag doesn't make sense then and will be ignored + wxFAIL_MSG( wxT("wxFRAME_FLOAT_ON_PARENT but no parent?") ); + } + else + { + hwndParent = GetHwndOf(parent); + } + } + //else: don't float on parent, must not be owned + + // now deal with the 2nd taskbar-related problem (see comments above in + // MSWGetStyle()) + if ( HasFlag(wxFRAME_NO_TASKBAR) && !hwndParent ) + { + // use hidden parent + hwndParent = wxTLWHiddenParentModule::GetHWND(); + } + + return (WXHWND)hwndParent; +} + +#if defined(__SMARTPHONE__) || defined(__POCKETPC__) +bool wxTopLevelWindowMSW::HandleSettingChange(WXWPARAM wParam, WXLPARAM lParam) +{ + SHACTIVATEINFO *info = (SHACTIVATEINFO*) m_activateInfo; + if ( info ) + { + SHHandleWMSettingChange(GetHwnd(), wParam, lParam, info); + } + + return wxWindowMSW::HandleSettingChange(wParam, lParam); +} +#endif + +WXLRESULT wxTopLevelWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) +{ + WXLRESULT rc = 0; + bool processed = false; + + switch ( message ) + { +#if defined(__SMARTPHONE__) || defined(__POCKETPC__) + case WM_ACTIVATE: + { + SHACTIVATEINFO* info = (SHACTIVATEINFO*) m_activateInfo; + if (info) + { + DWORD flags = 0; + if (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG) flags = SHA_INPUTDIALOG; + SHHandleWMActivate(GetHwnd(), wParam, lParam, info, flags); + } + + // This implicitly sends a wxEVT_ACTIVATE_APP event + if (wxTheApp) + wxTheApp->SetActive(wParam != 0, FindFocus()); + + break; + } + case WM_HIBERNATE: + { + if (wxTheApp) + { + wxActivateEvent event(wxEVT_HIBERNATE, true, wxID_ANY); + event.SetEventObject(wxTheApp); + processed = wxTheApp->ProcessEvent(event); + } + break; + } +#endif // __SMARTPHONE__ || __POCKETPC__ + + case WM_SYSCOMMAND: + { + // From MSDN: + // + // ... the four low-order bits of the wParam parameter are + // used internally by the system. To obtain the correct + // result when testing the value of wParam, an application + // must combine the value 0xFFF0 with the wParam value by + // using the bitwise AND operator. + unsigned id = wParam & 0xfff0; + + // Preserve the focus when minimizing/restoring the window: we + // need to do it manually as DefWindowProc() doesn't appear to + // do this for us for some reason (perhaps because we don't use + // WM_NEXTDLGCTL for setting focus?). Moreover, our code in + // OnActivate() doesn't work in this case as we receive the + // deactivation event too late when the window is being + // minimized and the focus is already NULL by then. Similarly, + // we receive the activation event too early and restoring + // focus in it fails because the window is still minimized. So + // we need to do it here. + if ( id == SC_MINIMIZE ) + { + // For minimization, it's simple enough: just save the + // focus as usual. The important thing is that we're not + // minimized yet, so this works correctly. + DoSaveLastFocus(); + } + else if ( id == SC_RESTORE ) + { + // For restoring, it's trickier as DefWindowProc() sets + // focus to the window itself. So run it first and restore + // our saved focus only afterwards. + processed = true; + rc = wxTopLevelWindowBase::MSWWindowProc(message, + wParam, lParam); + + DoRestoreLastFocus(); + } + +#ifndef __WXUNIVERSAL__ + // We need to generate events for the custom items added to the + // system menu if it had been created (and presumably modified). + // As SC_SIZE is the first of the system-defined commands, we + // only do this for the custom commands before it and leave + // SC_SIZE and everything after it to DefWindowProc(). + if ( m_menuSystem && id < SC_SIZE ) + { + if ( m_menuSystem->MSWCommand(0 /* unused anyhow */, id) ) + processed = true; + } +#endif // #ifndef __WXUNIVERSAL__ + } + break; + +#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) +#if wxUSE_MENUS + case WM_INITMENUPOPUP: + processed = HandleMenuPopup(wxEVT_MENU_OPEN, (WXHMENU)wParam); + break; + + case WM_MENUSELECT: + { + WXWORD item, flags; + WXHMENU hmenu; + UnpackMenuSelect(wParam, lParam, &item, &flags, &hmenu); + + processed = HandleMenuSelect(item, flags, hmenu); + } + break; + + case WM_EXITMENULOOP: + // Under Windows 98 and 2000 and later we're going to get + // WM_UNINITMENUPOPUP which will be used to generate this event + // with more information (notably the menu that was closed) so we + // only need this one under old Windows systems where the newer + // event is never sent. + if ( wxGetWinVersion() < wxWinVersion_98 ) + processed = HandleExitMenuLoop(wParam); + break; + + case WM_UNINITMENUPOPUP: + processed = HandleMenuPopup(wxEVT_MENU_CLOSE, (WXHMENU)wParam); + break; +#endif // wxUSE_MENUS +#endif // !__WXMICROWIN__ + } + + if ( !processed ) + rc = wxTopLevelWindowBase::MSWWindowProc(message, wParam, lParam); + + return rc; +} + +bool wxTopLevelWindowMSW::CreateDialog(const void *dlgTemplate, + const wxString& title, + const wxPoint& pos, + const wxSize& size) +{ +#ifdef __WXMICROWIN__ + // no dialogs support under MicroWin yet + return CreateFrame(title, pos, size); +#else // !__WXMICROWIN__ + // static cast is valid as we're only ever called for dialogs + wxWindow * const + parent = static_cast(this)->GetParentForModalDialog(); + + m_hWnd = (WXHWND)::CreateDialogIndirect + ( + wxGetInstance(), + (DLGTEMPLATE*)dlgTemplate, + parent ? GetHwndOf(parent) : NULL, + (DLGPROC)wxDlgProc + ); + + if ( !m_hWnd ) + { + wxFAIL_MSG(wxT("Failed to create dialog. Incorrect DLGTEMPLATE?")); + + wxLogSysError(wxT("Can't create dialog using memory template")); + + return false; + } + +#if !defined(__WXWINCE__) + // For some reason, the system menu is activated when we use the + // WS_EX_CONTEXTHELP style, so let's set a reasonable icon + if ( HasExtraStyle(wxWS_EX_CONTEXTHELP) ) + { + wxFrame *winTop = wxDynamicCast(wxTheApp->GetTopWindow(), wxFrame); + if ( winTop ) + { + wxIcon icon = winTop->GetIcon(); + if ( icon.IsOk() ) + { + ::SendMessage(GetHwnd(), WM_SETICON, + (WPARAM)TRUE, + (LPARAM)GetHiconOf(icon)); + } + } + } +#endif // !__WXWINCE__ + + if ( !title.empty() ) + { + ::SetWindowText(GetHwnd(), title.t_str()); + } + + SubclassWin(m_hWnd); + +#if !defined(__WXWINCE__) || defined(__WINCE_STANDARDSDK__) + // move the dialog to its initial position without forcing repainting + int x, y, w, h; + (void)MSWGetCreateWindowCoords(pos, size, x, y, w, h); + + if ( x == (int)CW_USEDEFAULT ) + { + // Let the system position the window, just set its size. + ::SetWindowPos(GetHwnd(), 0, + 0, 0, w, h, + SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); + } + else // Move the window to the desired location and set its size too. + { + if ( !::MoveWindow(GetHwnd(), x, y, w, h, FALSE) ) + { + wxLogLastError(wxT("MoveWindow")); + } + } +#endif // !__WXWINCE__ + +#ifdef __SMARTPHONE__ + // Work around title non-display glitch + Show(false); +#endif + + return true; +#endif // __WXMICROWIN__/!__WXMICROWIN__ +} + +bool wxTopLevelWindowMSW::CreateFrame(const wxString& title, + const wxPoint& pos, + const wxSize& size) +{ + WXDWORD exflags; + WXDWORD flags = MSWGetCreateWindowFlags(&exflags); + + const wxSize sz = IsAlwaysMaximized() ? wxDefaultSize : size; + +#ifndef __WXWINCE__ + if ( wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft ) + exflags |= WS_EX_LAYOUTRTL; +#endif + + return MSWCreate(MSWGetRegisteredClassName(), + title.t_str(), pos, sz, flags, exflags); +} + +bool wxTopLevelWindowMSW::Create(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + wxSize sizeReal = size; + if ( !sizeReal.IsFullySpecified() ) + { + sizeReal.SetDefaults(GetDefaultSize()); + } + + // notice that we should append this window to wxTopLevelWindows list + // before calling CreateBase() as it behaves differently for TLW and + // non-TLW windows + wxTopLevelWindows.Append(this); + + bool ret = CreateBase(parent, id, pos, sizeReal, style, name); + if ( !ret ) + return false; + + if ( parent ) + parent->AddChild(this); + + if ( GetExtraStyle() & wxTOPLEVEL_EX_DIALOG ) + { + // we have different dialog templates to allows creation of dialogs + // with & without captions under MSWindows, resizable or not (but a + // resizable dialog always has caption - otherwise it would look too + // strange) + + // we need 3 additional WORDs for dialog menu, class and title (as we + // don't use DS_SETFONT we don't need the fourth WORD for the font) + static const int dlgsize = sizeof(DLGTEMPLATE) + (sizeof(WORD) * 3); + DLGTEMPLATE *dlgTemplate = (DLGTEMPLATE *)malloc(dlgsize); + memset(dlgTemplate, 0, dlgsize); + + // these values are arbitrary, they won't be used normally anyhow + const LONG baseUnits = ::GetDialogBaseUnits(); + dlgTemplate->x = 34; + dlgTemplate->y = 22; + dlgTemplate->cx = ::MulDiv(sizeReal.x, 4, LOWORD(baseUnits)); + dlgTemplate->cy = ::MulDiv(sizeReal.y, 8, HIWORD(baseUnits)); + + // reuse the code in MSWGetStyle() but correct the results slightly for + // the dialog + // + // NB: we need a temporary variable as we can't pass pointer to + // dwExtendedStyle directly, it's not aligned correctly for 64 bit + // architectures + WXDWORD dwExtendedStyle; + dlgTemplate->style = MSWGetStyle(style, &dwExtendedStyle); + dlgTemplate->dwExtendedStyle = dwExtendedStyle; + + // all dialogs are popups + dlgTemplate->style |= WS_POPUP; + +#ifndef __WXWINCE__ + if ( wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft ) + { + dlgTemplate->dwExtendedStyle |= WS_EX_LAYOUTRTL; + } + + // force 3D-look if necessary, it looks impossibly ugly otherwise + if ( style & (wxRESIZE_BORDER | wxCAPTION) ) + dlgTemplate->style |= DS_MODALFRAME; +#endif + + ret = CreateDialog(dlgTemplate, title, pos, sizeReal); + free(dlgTemplate); + } + else // !dialog + { + ret = CreateFrame(title, pos, sizeReal); + } + +#ifndef __WXWINCE__ + if ( ret && !(GetWindowStyleFlag() & wxCLOSE_BOX) ) + { + EnableCloseButton(false); + } +#endif + + // for standard dialogs the dialog manager generates WM_CHANGEUISTATE + // itself but for custom windows we have to do it ourselves in order to + // make the keyboard indicators (such as underlines for accelerators and + // focus rectangles) work under Win2k+ + if ( ret ) + { + MSWUpdateUIState(UIS_INITIALIZE); + } + + // Note: if we include PocketPC in this test, dialogs can fail to show up, + // for example the text entry dialog in the dialogs sample. Problem with Maximise()? +#if defined(__WXWINCE__) && (defined(__SMARTPHONE__) || defined(__WINCE_STANDARDSDK__)) + if ( ( style & wxMAXIMIZE ) || IsAlwaysMaximized() ) + { + this->Maximize(); + } +#endif + +#if defined(__SMARTPHONE__) && defined(__WXWINCE__) + SetRightMenu(); // to nothing for initialization +#endif + + return ret; +} + +wxTopLevelWindowMSW::~wxTopLevelWindowMSW() +{ + delete m_menuSystem; + + SendDestroyEvent(); + +#if defined(__SMARTPHONE__) || defined(__POCKETPC__) + SHACTIVATEINFO* info = (SHACTIVATEINFO*) m_activateInfo; + delete info; + m_activateInfo = NULL; +#endif + + // after destroying an owned window, Windows activates the next top level + // window in Z order but it may be different from our owner (to reproduce + // this simply Alt-TAB to another application and back before closing the + // owned frame) whereas we always want to yield activation to our parent + if ( HasFlag(wxFRAME_FLOAT_ON_PARENT) ) + { + wxWindow *parent = GetParent(); + if ( parent ) + { + ::BringWindowToTop(GetHwndOf(parent)); + } + } +} + +// ---------------------------------------------------------------------------- +// wxTopLevelWindowMSW showing +// ---------------------------------------------------------------------------- + +void wxTopLevelWindowMSW::DoShowWindow(int nShowCmd) +{ + ::ShowWindow(GetHwnd(), nShowCmd); + + // Hiding the window doesn't change its iconized state. + if ( nShowCmd != SW_HIDE ) + { + // Otherwise restoring, maximizing or showing the window normally also + // makes it not iconized and only minimizing it does make it iconized. + m_iconized = nShowCmd == SW_MINIMIZE; + } +} + +void wxTopLevelWindowMSW::ShowWithoutActivating() +{ + if ( !wxWindowBase::Show(true) ) + return; + + DoShowWindow(SW_SHOWNA); +} + +bool wxTopLevelWindowMSW::Show(bool show) +{ + // don't use wxWindow version as we want to call DoShowWindow() ourselves + if ( !wxWindowBase::Show(show) ) + return false; + + int nShowCmd; + if ( show ) + { + if ( m_maximizeOnShow ) + { + // show and maximize + nShowCmd = SW_MAXIMIZE; + + // This is necessary, or no window appears +#if defined( __WINCE_STANDARDSDK__) || defined(__SMARTPHONE__) + DoShowWindow(SW_SHOW); +#endif + + m_maximizeOnShow = false; + } + else if ( m_iconized ) + { + // We were iconized while we were hidden, so now we need to show + // the window in iconized state. + nShowCmd = SW_MINIMIZE; + } + else if ( ::IsIconic(GetHwnd()) ) + { + // We were restored while we were hidden, so now we need to show + // the window in its normal state. + // + // As below, don't activate some kinds of windows. + if ( HasFlag(wxFRAME_TOOL_WINDOW) || !IsEnabled() ) + nShowCmd = SW_SHOWNOACTIVATE; + else + nShowCmd = SW_RESTORE; + } + else // just show + { + // we shouldn't use SW_SHOW which also activates the window for + // tool frames (as they shouldn't steal focus from the main window) + // nor for the currently disabled windows as they would be enabled + // as a side effect + if ( HasFlag(wxFRAME_TOOL_WINDOW) || !IsEnabled() ) + nShowCmd = SW_SHOWNA; + else + nShowCmd = SW_SHOW; + } + } + else // hide + { + nShowCmd = SW_HIDE; + } + +#if wxUSE_DEFERRED_SIZING + // we only set pending size if we're maximized before being shown, now that + // we're shown we don't need it any more (it is reset in size event handler + // for child windows but we have to do it ourselves for this parent window) + // + // make sure to reset it before actually showing the window as this will + // generate WM_SIZE events and we want to use the correct client size from + // them, not the size returned by WM_NCCALCSIZE in DoGetClientSize() which + // turns out to be wrong for maximized windows (see #11762) + m_pendingSize = wxDefaultSize; +#endif // wxUSE_DEFERRED_SIZING + + DoShowWindow(nShowCmd); + +#if defined(__WXWINCE__) && (_WIN32_WCE >= 400 && !defined(__POCKETPC__) && !defined(__SMARTPHONE__)) + // Addornments have to be added when the frame is the correct size + wxFrame* frame = wxDynamicCast(this, wxFrame); + if (frame && frame->GetMenuBar()) + frame->GetMenuBar()->AddAdornments(GetWindowStyleFlag()); +#endif + + return true; +} + +void wxTopLevelWindowMSW::Raise() +{ + ::SetForegroundWindow(GetHwnd()); +} + +// ---------------------------------------------------------------------------- +// wxTopLevelWindowMSW maximize/minimize +// ---------------------------------------------------------------------------- + +void wxTopLevelWindowMSW::Maximize(bool maximize) +{ + if ( IsShown() ) + { + // just maximize it directly + DoShowWindow(maximize ? SW_MAXIMIZE : SW_RESTORE); + } + else // hidden + { + // we can't maximize the hidden frame because it shows it as well, + // so just remember that we should do it later in this case + m_maximizeOnShow = maximize; + +#if wxUSE_DEFERRED_SIZING + // after calling Maximize() the client code expects to get the frame + // "real" size and doesn't want to know that, because of implementation + // details, the frame isn't really maximized yet but will be only once + // it's shown, so return our size as it will be then in this case + if ( maximize ) + { + // we must only change pending size here, and not call SetSize() + // because otherwise Windows would think that this (full screen) + // size is the natural size for the frame and so would use it when + // the user clicks on "restore" title bar button instead of the + // correct initial frame size + // + // NB: unfortunately we don't know which display we're on yet so we + // have to use the default one + m_pendingSize = wxGetClientDisplayRect().GetSize(); + } + //else: can't do anything in this case, we don't have the old size +#endif // wxUSE_DEFERRED_SIZING + } +} + +bool wxTopLevelWindowMSW::IsMaximized() const +{ + return IsAlwaysMaximized() || +#if !defined(__SMARTPHONE__) && !defined(__POCKETPC__) && !defined(__WINCE_STANDARDSDK__) + + (::IsZoomed(GetHwnd()) != 0) || +#endif + m_maximizeOnShow; +} + +void wxTopLevelWindowMSW::Iconize(bool iconize) +{ + if ( iconize == m_iconized ) + { + // Do nothing, in particular don't restore non-iconized windows when + // Iconize(false) is called as this would wrongly un-maximize them. + return; + } + + if ( IsShown() ) + { + // change the window state immediately + DoShowWindow(iconize ? SW_MINIMIZE : SW_RESTORE); + } + else // hidden + { + // iconizing the window shouldn't show it so just update the internal + // state (otherwise it's done by DoShowWindow() itself) + m_iconized = iconize; + } +} + +bool wxTopLevelWindowMSW::IsIconized() const +{ +#ifdef __WXWINCE__ + return false; +#else + if ( !IsShown() ) + return m_iconized; + + // don't use m_iconized, it may be briefly out of sync with the real state + // as it's only modified when we receive a WM_SIZE and we could be called + // from an event handler from one of the messages we receive before it, + // such as WM_MOVE + return ::IsIconic(GetHwnd()) != 0; +#endif +} + +void wxTopLevelWindowMSW::Restore() +{ + DoShowWindow(SW_RESTORE); +} + +void wxTopLevelWindowMSW::SetLayoutDirection(wxLayoutDirection dir) +{ + if ( dir == wxLayout_Default ) + dir = wxTheApp->GetLayoutDirection(); + + if ( dir != wxLayout_Default ) + wxTopLevelWindowBase::SetLayoutDirection(dir); +} + +// ---------------------------------------------------------------------------- +// wxTopLevelWindowMSW geometry +// ---------------------------------------------------------------------------- + +#ifndef __WXWINCE__ + +void wxTopLevelWindowMSW::DoGetPosition(int *x, int *y) const +{ + if ( IsIconized() ) + { + WINDOWPLACEMENT wp; + wp.length = sizeof(WINDOWPLACEMENT); + if ( ::GetWindowPlacement(GetHwnd(), &wp) ) + { + RECT& rc = wp.rcNormalPosition; + + // the position returned by GetWindowPlacement() is in workspace + // coordinates except for windows with WS_EX_TOOLWINDOW style + if ( !HasFlag(wxFRAME_TOOL_WINDOW) ) + { + // we must use the correct display for the translation as the + // task bar might be shown on one display but not the other one + int n = wxDisplay::GetFromWindow(this); + wxDisplay dpy(n == wxNOT_FOUND ? 0 : n); + const wxPoint ptOfs = dpy.GetClientArea().GetPosition() - + dpy.GetGeometry().GetPosition(); + + rc.left += ptOfs.x; + rc.top += ptOfs.y; + } + + if ( x ) + *x = rc.left; + if ( y ) + *y = rc.top; + + return; + } + + wxLogLastError(wxT("GetWindowPlacement")); + } + //else: normal case + + wxTopLevelWindowBase::DoGetPosition(x, y); +} + +void wxTopLevelWindowMSW::DoGetSize(int *width, int *height) const +{ + if ( IsIconized() ) + { + WINDOWPLACEMENT wp; + wp.length = sizeof(WINDOWPLACEMENT); + if ( ::GetWindowPlacement(GetHwnd(), &wp) ) + { + const RECT& rc = wp.rcNormalPosition; + + if ( width ) + *width = rc.right - rc.left; + if ( height ) + *height = rc.bottom - rc.top; + + return; + } + + wxLogLastError(wxT("GetWindowPlacement")); + } + //else: normal case + + wxTopLevelWindowBase::DoGetSize(width, height); +} + +#endif // __WXWINCE__ + +void +wxTopLevelWindowMSW::MSWGetCreateWindowCoords(const wxPoint& pos, + const wxSize& size, + int& x, int& y, + int& w, int& h) const +{ + // let the system position the window if no explicit position was specified + if ( pos.x == wxDefaultCoord ) + { + // if x is set to CW_USEDEFAULT, y parameter is ignored anyhow so we + // can just as well set it to CW_USEDEFAULT as well + x = + y = CW_USEDEFAULT; + } + else + { + // OTOH, if x is not set to CW_USEDEFAULT, y shouldn't be set to it + // neither because it is not handled as a special value by Windows then + // and so we have to choose some default value for it, even if a + // completely arbitrary one + static const int DEFAULT_Y = 200; + + x = pos.x; + y = pos.y == wxDefaultCoord ? DEFAULT_Y : pos.y; + } + + if ( size.x == wxDefaultCoord || size.y == wxDefaultCoord ) + { + // We don't use CW_USEDEFAULT here for several reasons: + // + // 1. It results in huge frames on modern screens (1000*800 is not + // uncommon on my 1280*1024 screen) which is way too big for a half + // empty frame of most of wxWidgets samples for example) + // + // 2. It is buggy for frames with wxFRAME_TOOL_WINDOW style for which + // the default is for whatever reason 8*8 which breaks client <-> + // window size calculations (it would be nice if it didn't, but it + // does and the simplest way to fix it seemed to change the broken + // default size anyhow) + // + // 3. There is just no advantage in doing it: with x and y it is + // possible that [future versions of] Windows position the new top + // level window in some smart way which we can't do, but we can + // guess a reasonably good size for a new window just as well + // ourselves + // + // The only exception is for the Windows CE platform where the system + // does know better than we how should the windows be sized +#ifdef _WIN32_WCE + w = + h = CW_USEDEFAULT; +#else // !_WIN32_WCE + wxSize sizeReal = size; + sizeReal.SetDefaults(GetDefaultSize()); + + w = sizeReal.x; + h = sizeReal.y; +#endif // _WIN32_WCE/!_WIN32_WCE + } + else + { + w = size.x; + h = size.y; + } +} + +// ---------------------------------------------------------------------------- +// wxTopLevelWindowMSW fullscreen +// ---------------------------------------------------------------------------- + +bool wxTopLevelWindowMSW::ShowFullScreen(bool show, long style) +{ + if ( show == IsFullScreen() ) + { + // nothing to do + return true; + } + + m_fsIsShowing = show; + + if ( show ) + { + m_fsStyle = style; + + // zap the frame borders + + // save the 'normal' window style + m_fsOldWindowStyle = GetWindowLong(GetHwnd(), GWL_STYLE); + + // save the old position, width & height, maximize state + m_fsOldSize = GetRect(); + m_fsIsMaximized = IsMaximized(); + + // decide which window style flags to turn off + LONG newStyle = m_fsOldWindowStyle; + LONG offFlags = 0; + + if (style & wxFULLSCREEN_NOBORDER) + { + offFlags |= WS_BORDER; +#ifndef __WXWINCE__ + offFlags |= WS_THICKFRAME; +#endif + } + if (style & wxFULLSCREEN_NOCAPTION) + offFlags |= WS_CAPTION | WS_SYSMENU; + + newStyle &= ~offFlags; + + // Full screen windows should logically be popups as they don't have + // decorations (and are definitely not children) and while not using + // this style doesn't seem to make any difference for most windows, it + // breaks wxGLCanvas in some cases, see #15434, so just always use it. + newStyle |= WS_POPUP; + + // change our window style to be compatible with full-screen mode + ::SetWindowLong(GetHwnd(), GWL_STYLE, newStyle); + + wxRect rect; +#if wxUSE_DISPLAY + // resize to the size of the display containing us + int dpy = wxDisplay::GetFromWindow(this); + if ( dpy != wxNOT_FOUND ) + { + rect = wxDisplay(dpy).GetGeometry(); + } + else // fall back to the main desktop +#endif // wxUSE_DISPLAY + { + // resize to the size of the desktop + wxCopyRECTToRect(wxGetWindowRect(::GetDesktopWindow()), rect); +#ifdef __WXWINCE__ + // FIXME: size of the bottom menu (toolbar) + // should be taken in account + rect.height += rect.y; + rect.y = 0; +#endif + } + + SetSize(rect); + + // now flush the window style cache and actually go full-screen + long flags = SWP_FRAMECHANGED; + + // showing the frame full screen should also show it if it's still + // hidden + if ( !IsShown() ) + { + // don't call wxWindow version to avoid flicker from calling + // ::ShowWindow() -- we're going to show the window at the correct + // location directly below -- but do call the wxWindowBase version + // to sync the internal m_isShown flag + wxWindowBase::Show(); + + flags |= SWP_SHOWWINDOW; + } + + SetWindowPos(GetHwnd(), HWND_TOP, + rect.x, rect.y, rect.width, rect.height, + flags); + +#if !defined(__HANDHELDPC__) && (defined(__WXWINCE__) && (_WIN32_WCE < 400)) + ::SHFullScreen(GetHwnd(), SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON); +#endif + + // finally send an event allowing the window to relayout itself &c + wxSizeEvent event(rect.GetSize(), GetId()); + event.SetEventObject(this); + HandleWindowEvent(event); + } + else // stop showing full screen + { +#if !defined(__HANDHELDPC__) && (defined(__WXWINCE__) && (_WIN32_WCE < 400)) + ::SHFullScreen(GetHwnd(), SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON); +#endif + Maximize(m_fsIsMaximized); + SetWindowLong(GetHwnd(),GWL_STYLE, m_fsOldWindowStyle); + SetWindowPos(GetHwnd(),HWND_TOP,m_fsOldSize.x, m_fsOldSize.y, + m_fsOldSize.width, m_fsOldSize.height, SWP_FRAMECHANGED); + } + + return true; +} + +// ---------------------------------------------------------------------------- +// wxTopLevelWindowMSW misc +// ---------------------------------------------------------------------------- + +void wxTopLevelWindowMSW::SetTitle( const wxString& title) +{ + SetLabel(title); +} + +wxString wxTopLevelWindowMSW::GetTitle() const +{ + return GetLabel(); +} + +bool wxTopLevelWindowMSW::DoSelectAndSetIcon(const wxIconBundle& icons, + int smX, + int smY, + int i) +{ + const wxSize size(::GetSystemMetrics(smX), ::GetSystemMetrics(smY)); + + wxIcon icon = icons.GetIcon(size, wxIconBundle::FALLBACK_NEAREST_LARGER); + + if ( !icon.IsOk() ) + return false; + + ::SendMessage(GetHwnd(), WM_SETICON, i, (LPARAM)GetHiconOf(icon)); + return true; +} + +void wxTopLevelWindowMSW::SetIcons(const wxIconBundle& icons) +{ + wxTopLevelWindowBase::SetIcons(icons); + + if ( icons.IsEmpty() ) + { + // FIXME: SetIcons(wxNullIconBundle) should unset existing icons, + // but we currently don't do that + wxASSERT_MSG( m_icons.IsEmpty(), "unsetting icons doesn't work" ); + return; + } + + DoSelectAndSetIcon(icons, SM_CXSMICON, SM_CYSMICON, ICON_SMALL); + DoSelectAndSetIcon(icons, SM_CXICON, SM_CYICON, ICON_BIG); +} + +bool wxTopLevelWindowMSW::EnableCloseButton(bool enable) +{ +#if !defined(__WXMICROWIN__) + // get system (a.k.a. window) menu + HMENU hmenu = GetSystemMenu(GetHwnd(), FALSE /* get it */); + if ( !hmenu ) + { + // no system menu at all -- ok if we want to remove the close button + // anyhow, but bad if we want to show it + return !enable; + } + + // enabling/disabling the close item from it also automatically + // disables/enables the close title bar button + if ( ::EnableMenuItem(hmenu, SC_CLOSE, + MF_BYCOMMAND | + (enable ? MF_ENABLED : MF_GRAYED)) == -1 ) + { + wxLogLastError(wxT("EnableMenuItem(SC_CLOSE)")); + + return false; + } +#ifndef __WXWINCE__ + // update appearance immediately + if ( !::DrawMenuBar(GetHwnd()) ) + { + wxLogLastError(wxT("DrawMenuBar")); + } +#endif +#endif // !__WXMICROWIN__ + + return true; +} + +void wxTopLevelWindowMSW::RequestUserAttention(int flags) +{ + // check if we can use FlashWindowEx(): unfortunately a simple test for + // FLASHW_STOP doesn't work because MSVC6 headers do #define it but don't + // provide FlashWindowEx() declaration, so try to detect whether we have + // real headers for WINVER 0x0500 by checking for existence of a symbol not + // declated in MSVC6 header +#if defined(FLASHW_STOP) && defined(VK_XBUTTON1) && wxUSE_DYNLIB_CLASS + // available in the headers, check if it is supported by the system + typedef BOOL (WINAPI *FlashWindowEx_t)(FLASHWINFO *pfwi); + static FlashWindowEx_t s_pfnFlashWindowEx = NULL; + if ( !s_pfnFlashWindowEx ) + { + wxDynamicLibrary dllUser32(wxT("user32.dll")); + s_pfnFlashWindowEx = (FlashWindowEx_t) + dllUser32.GetSymbol(wxT("FlashWindowEx")); + + // we can safely unload user32.dll here, it's going to remain loaded as + // long as the program is running anyhow + } + + if ( s_pfnFlashWindowEx ) + { + WinStruct fwi; + fwi.hwnd = GetHwnd(); + fwi.dwFlags = FLASHW_ALL; + if ( flags & wxUSER_ATTENTION_INFO ) + { + // just flash a few times + fwi.uCount = 3; + } + else // wxUSER_ATTENTION_ERROR + { + // flash until the user notices it + fwi.dwFlags |= FLASHW_TIMERNOFG; + } + + s_pfnFlashWindowEx(&fwi); + } + else // FlashWindowEx() not available +#endif // FlashWindowEx() defined + { + wxUnusedVar(flags); +#ifndef __WXWINCE__ + ::FlashWindow(GetHwnd(), TRUE); +#endif // __WXWINCE__ + } +} + +wxMenu *wxTopLevelWindowMSW::MSWGetSystemMenu() const +{ +#ifndef __WXUNIVERSAL__ + if ( !m_menuSystem ) + { + HMENU hmenu = ::GetSystemMenu(GetHwnd(), FALSE); + if ( !hmenu ) + { + wxLogLastError(wxT("GetSystemMenu()")); + return NULL; + } + + wxTopLevelWindowMSW * const + self = const_cast(this); + + self->m_menuSystem = wxMenu::MSWNewFromHMENU(hmenu); + + // We need to somehow associate this menu with this window to ensure + // that we get events from it. A natural idea would be to pretend that + // it's attached to our menu bar but this wouldn't work if we don't + // have any menu bar which is a common case for applications using + // custom items in the system menu (they mostly do it exactly because + // they don't have any other menus). + // + // So reuse the invoking window pointer instead, this is not exactly + // correct but doesn't seem to have any serious drawbacks. + m_menuSystem->SetInvokingWindow(self); + } +#endif // #ifndef __WXUNIVERSAL__ + + return m_menuSystem; +} + +// ---------------------------------------------------------------------------- +// Transparency support +// --------------------------------------------------------------------------- + +bool wxTopLevelWindowMSW::SetTransparent(wxByte alpha) +{ +#if wxUSE_DYNLIB_CLASS + typedef DWORD (WINAPI *PSETLAYEREDWINDOWATTR)(HWND, DWORD, BYTE, DWORD); + static PSETLAYEREDWINDOWATTR + pSetLayeredWindowAttributes = (PSETLAYEREDWINDOWATTR)-1; + + if ( pSetLayeredWindowAttributes == (PSETLAYEREDWINDOWATTR)-1 ) + { + wxDynamicLibrary dllUser32(wxT("user32.dll")); + + // use RawGetSymbol() and not GetSymbol() to avoid error messages under + // Windows 95: there is nothing the user can do about this anyhow + pSetLayeredWindowAttributes = (PSETLAYEREDWINDOWATTR) + dllUser32.RawGetSymbol(wxT("SetLayeredWindowAttributes")); + + // it's ok to destroy dllUser32 here, we link statically to user32.dll + // anyhow so it won't be unloaded + } + + if ( !pSetLayeredWindowAttributes ) + return false; +#endif // wxUSE_DYNLIB_CLASS + + LONG exstyle = GetWindowLong(GetHwnd(), GWL_EXSTYLE); + + // if setting alpha to fully opaque then turn off the layered style + if (alpha == 255) + { + SetWindowLong(GetHwnd(), GWL_EXSTYLE, exstyle & ~WS_EX_LAYERED); + Refresh(); + return true; + } + +#if wxUSE_DYNLIB_CLASS + // Otherwise, set the layered style if needed and set the alpha value + if ((exstyle & WS_EX_LAYERED) == 0 ) + SetWindowLong(GetHwnd(), GWL_EXSTYLE, exstyle | WS_EX_LAYERED); + + if ( pSetLayeredWindowAttributes(GetHwnd(), 0, (BYTE)alpha, LWA_ALPHA) ) + return true; +#endif // wxUSE_DYNLIB_CLASS + + return false; +} + +bool wxTopLevelWindowMSW::CanSetTransparent() +{ + // The API is available on win2k and above + + static int os_type = -1; + static int ver_major = -1; + + if (os_type == -1) + os_type = ::wxGetOsVersion(&ver_major); + + return (os_type == wxOS_WINDOWS_NT && ver_major >= 5); +} + +void wxTopLevelWindowMSW::DoFreeze() +{ + // do nothing: freezing toplevel window causes paint and mouse events + // to go through it any TLWs under it, so the best we can do is to freeze + // all children -- and wxWindowBase::Freeze() does that +} + +void wxTopLevelWindowMSW::DoThaw() +{ + // intentionally empty -- see DoFreeze() +} + + +// ---------------------------------------------------------------------------- +// wxTopLevelWindow event handling +// ---------------------------------------------------------------------------- + +void wxTopLevelWindowMSW::DoSaveLastFocus() +{ + if ( m_iconized ) + return; + + // remember the last focused child if it is our child + m_winLastFocused = FindFocus(); + + if ( m_winLastFocused ) + { + // and don't remember it if it's a child from some other frame + if ( wxGetTopLevelParent(m_winLastFocused) != this ) + { + m_winLastFocused = NULL; + } + } +} + +void wxTopLevelWindowMSW::DoRestoreLastFocus() +{ + wxWindow *parent = m_winLastFocused ? m_winLastFocused->GetParent() + : NULL; + if ( !parent ) + { + parent = this; + } + + wxSetFocusToChild(parent, &m_winLastFocused); +} + +void wxTopLevelWindowMSW::OnActivate(wxActivateEvent& event) +{ + if ( event.GetActive() ) + { + // We get WM_ACTIVATE before being restored from iconized state, so we + // can be still iconized here. In this case, avoid restoring the focus + // as it doesn't work anyhow and we will do when we're really restored. + if ( m_iconized ) + { + event.Skip(); + return; + } + + // restore focus to the child which was last focused unless we already + // have it + wxLogTrace(wxT("focus"), wxT("wxTLW %p activated."), m_hWnd); + + wxWindow *winFocus = FindFocus(); + if ( !winFocus || wxGetTopLevelParent(winFocus) != this ) + DoRestoreLastFocus(); + } + else // deactivating + { + DoSaveLastFocus(); + + wxLogTrace(wxT("focus"), + wxT("wxTLW %p deactivated, last focused: %p."), + m_hWnd, + m_winLastFocused ? GetHwndOf(m_winLastFocused) : NULL); + + event.Skip(); + } +} + +#if wxUSE_MENUS + +bool +wxTopLevelWindowMSW::HandleMenuSelect(WXWORD nItem, WXWORD flags, WXHMENU hMenu) +{ + // Ignore the special messages generated when the menu is closed (this is + // the only case when the flags are set to -1), in particular don't clear + // the help string in the status bar when this happens as it had just been + // restored by the base class code. + if ( !hMenu && flags == 0xffff ) + return false; + + // Unfortunately we also need to ignore another message which is sent after + // closing the currently active submenu of the menu bar by pressing Escape: + // in this case we get WM_UNINITMENUPOPUP, from which we generate + // wxEVT_MENU_CLOSE, and _then_ we get WM_MENUSELECT for the top level menu + // from which we overwrite the help string just restored by OnMenuClose() + // handler in wxFrameBase. To prevent this from happening we discard these + // messages but only in the case it's really the top level menu as we still + // need to clear the help string when a submenu is selected in a menu. + if ( flags == (MF_POPUP | MF_HILITE) && !m_menuDepth ) + return false; + + // sign extend to int from unsigned short we get from Windows + int item = (signed short)nItem; + + // WM_MENUSELECT is generated for both normal items and menus, including + // the top level menus of the menu bar, which can't be represented using + // any valid identifier in wxMenuEvent so use an otherwise unused value for + // them + if ( flags & (MF_POPUP | MF_SEPARATOR) ) + item = wxID_NONE; + + wxMenuEvent event(wxEVT_MENU_HIGHLIGHT, item); + event.SetEventObject(this); + + if ( HandleWindowEvent(event) ) + return true; + + // by default, i.e. if the event wasn't handled above, clear the status bar + // text when an item which can't have any associated help string in wx API + // is selected + if ( item == wxID_NONE ) + DoGiveHelp(wxEmptyString, true); + + return false; +} + +bool +wxTopLevelWindowMSW::DoSendMenuOpenCloseEvent(wxEventType evtType, wxMenu* menu, bool popup) +{ + // Update the menu depth when dealing with the top level menus. + if ( !popup ) + { + if ( evtType == wxEVT_MENU_OPEN ) + { + m_menuDepth++; + } + else if ( evtType == wxEVT_MENU_CLOSE ) + { +#if (WINVER >= 0x0500) // Disable message in builds for old Win9x versions (doesn't fix it but hides the error...) + wxASSERT_MSG( m_menuDepth > 0, wxS("No open menus?") ); +#endif + m_menuDepth--; + } + else + { + wxFAIL_MSG( wxS("Unexpected menu event type") ); + } + } + + wxMenuEvent event(evtType, popup ? wxID_ANY : 0, menu); + event.SetEventObject(menu); + + return HandleWindowEvent(event); +} + +bool wxTopLevelWindowMSW::HandleExitMenuLoop(WXWORD isPopup) +{ + return DoSendMenuOpenCloseEvent(wxEVT_MENU_CLOSE, + isPopup ? wxCurrentPopupMenu : NULL, + isPopup != 0); +} + +bool wxTopLevelWindowMSW::HandleMenuPopup(wxEventType evtType, WXHMENU hMenu) +{ + bool isPopup = false; + wxMenu* menu = NULL; + if ( wxCurrentPopupMenu && wxCurrentPopupMenu->GetHMenu() == hMenu ) + { + menu = wxCurrentPopupMenu; + isPopup = true; + } + else + { + menu = MSWFindMenuFromHMENU(hMenu); + } + + + return DoSendMenuOpenCloseEvent(evtType, menu, isPopup); +} + +wxMenu* wxTopLevelWindowMSW::MSWFindMenuFromHMENU(WXHMENU WXUNUSED(hMenu)) +{ + // We don't have any menus at this level. + return NULL; +} + +#endif // wxUSE_MENUS + + + +// the DialogProc for all wxWidgets dialogs +LONG APIENTRY _EXPORT +wxDlgProc(HWND hDlg, + UINT message, + WPARAM WXUNUSED(wParam), + LPARAM WXUNUSED(lParam)) +{ + switch ( message ) + { + case WM_INITDIALOG: + { + // under CE, add a "Ok" button in the dialog title bar and make it full + // screen + // + // TODO: find the window for this HWND, and take into account + // wxMAXIMIZE and wxCLOSE_BOX. For now, assume both are present. + // + // Standard SDK doesn't have aygshell.dll: see + // include/wx/msw/wince/libraries.h +#if defined(__WXWINCE__) && !defined(__WINCE_STANDARDSDK__) && !defined(__HANDHELDPC__) + SHINITDLGINFO shidi; + shidi.dwMask = SHIDIM_FLAGS; + shidi.dwFlags = SHIDIF_SIZEDLG // take account of the SIP or menubar +#ifndef __SMARTPHONE__ + | SHIDIF_DONEBUTTON +#endif + ; + shidi.hDlg = hDlg; + SHInitDialog( &shidi ); +#else // no SHInitDialog() + wxUnusedVar(hDlg); +#endif + // for WM_INITDIALOG, returning TRUE tells system to set focus to + // the first control in the dialog box, but as we set the focus + // ourselves, we return FALSE for it as well + return FALSE; + } + } + + // for almost all messages, returning FALSE means that we didn't process + // the message + return FALSE; +} + +// ============================================================================ +// wxTLWHiddenParentModule implementation +// ============================================================================ + +HWND wxTLWHiddenParentModule::ms_hwnd = NULL; + +const wxChar *wxTLWHiddenParentModule::ms_className = NULL; + +bool wxTLWHiddenParentModule::OnInit() +{ + ms_hwnd = NULL; + ms_className = NULL; + + return true; +} + +void wxTLWHiddenParentModule::OnExit() +{ + if ( ms_hwnd ) + { + if ( !::DestroyWindow(ms_hwnd) ) + { + wxLogLastError(wxT("DestroyWindow(hidden TLW parent)")); + } + + ms_hwnd = NULL; + } + + if ( ms_className ) + { + if ( !::UnregisterClass(ms_className, wxGetInstance()) ) + { + wxLogLastError(wxT("UnregisterClass(\"wxTLWHiddenParent\")")); + } + + ms_className = NULL; + } +} + +/* static */ +HWND wxTLWHiddenParentModule::GetHWND() +{ + if ( !ms_hwnd ) + { + if ( !ms_className ) + { + static const wxChar *HIDDEN_PARENT_CLASS = wxT("wxTLWHiddenParent"); + + WNDCLASS wndclass; + wxZeroMemory(wndclass); + + wndclass.lpfnWndProc = DefWindowProc; + wndclass.hInstance = wxGetInstance(); + wndclass.lpszClassName = HIDDEN_PARENT_CLASS; + + if ( !::RegisterClass(&wndclass) ) + { + wxLogLastError(wxT("RegisterClass(\"wxTLWHiddenParent\")")); + } + else + { + ms_className = HIDDEN_PARENT_CLASS; + } + } + + ms_hwnd = ::CreateWindow(ms_className, wxEmptyString, 0, 0, 0, 0, 0, NULL, + (HMENU)NULL, wxGetInstance(), NULL); + if ( !ms_hwnd ) + { + wxLogLastError(wxT("CreateWindow(hidden TLW parent)")); + } + } + + return ms_hwnd; +} diff --git a/installers/patch_wx305_9x/src/msw/utils.cpp b/installers/patch_wx305_9x/src/msw/utils.cpp new file mode 100644 index 0000000..0610186 --- /dev/null +++ b/installers/patch_wx305_9x/src/msw/utils.cpp @@ -0,0 +1,1765 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/msw/utils.cpp +// Purpose: Various utilities +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/utils.h" + #include "wx/app.h" + #include "wx/intl.h" + #include "wx/log.h" +#endif //WX_PRECOMP + +#include "wx/msw/registry.h" +#include "wx/apptrait.h" +#include "wx/dynlib.h" +#include "wx/dynload.h" +#include "wx/scopeguard.h" +#include "wx/filename.h" + +#include "wx/confbase.h" // for wxExpandEnvVars() + +#include "wx/msw/private.h" // includes +#include "wx/msw/private/hiddenwin.h" +#include "wx/msw/missing.h" // for CHARSET_HANGUL + +#if defined(__CYGWIN__) + //CYGWIN gives annoying warning about runtime stuff if we don't do this +# define USE_SYS_TYPES_FD_SET +# include +#endif + +// Doesn't work with Cygwin at present +#if wxUSE_SOCKETS && (defined(__GNUWIN32_OLD__) || defined(__WXWINCE__) || defined(__CYGWIN32__)) + // apparently we need to include winsock.h to get WSADATA and other stuff + // used in wxGetFullHostName() with the old mingw32 versions + #include +#endif + +#if !defined(__GNUWIN32__) && !defined(__WXMICROWIN__) && !defined(__WXWINCE__) + #include + + #include +#endif //GNUWIN32 + +#if defined(__CYGWIN__) + #include + #include + #include // for cygwin_conv_path() + // and cygwin_conv_to_full_win32_path() + #include +#endif //GNUWIN32 + +#ifdef __BORLANDC__ // Please someone tell me which version of Borland needs + // this (3.1 I believe) and how to test for it. + // If this works for Borland 4.0 as well, then no worries. + #include +#endif + +// VZ: there is some code using NetXXX() functions to get the full user name: +// I don't think it's a good idea because they don't work under Win95 and +// seem to return the same as wxGetUserId() under NT. If you really want +// to use them, just #define USE_NET_API +#undef USE_NET_API + +#ifdef USE_NET_API + #include +#endif // USE_NET_API + +#if defined(__WIN32__) && !defined(__WXMICROWIN__) && !defined(__WXWINCE__) + #ifndef __UNIX__ + #include + #endif + + #ifndef __GNUWIN32__ + #include + #endif +#endif + +#ifndef __WATCOMC__ + #if !(defined(_MSC_VER) && (_MSC_VER > 800)) + #include + #endif +#endif + +// For wxKillAllChildren +#include + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// In the WIN.INI file +#if (!defined(USE_NET_API) && !defined(__WXWINCE__)) || defined(__WXMICROWIN__) +static const wxChar WX_SECTION[] = wxT("wxWindows"); +#endif + +#if (!defined(USE_NET_API) && !defined(__WXWINCE__)) +static const wxChar eUSERNAME[] = wxT("UserName"); +#endif + +WXDLLIMPEXP_DATA_BASE(const wxChar *) wxUserResourceStr = wxT("TEXT"); + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// get host name and related +// ---------------------------------------------------------------------------- + +// Get hostname only (without domain name) +bool wxGetHostName(wxChar *buf, int maxSize) +{ +#if defined(__WXWINCE__) + // GetComputerName() is not supported but the name seems to be stored in + // this location in the registry, at least for PPC2003 and WM5 + wxString hostName; + wxRegKey regKey(wxRegKey::HKLM, wxT("Ident")); + if ( !regKey.HasValue(wxT("Name")) || + !regKey.QueryValue(wxT("Name"), hostName) ) + return false; + + wxStrlcpy(buf, hostName.t_str(), maxSize); +#else // !__WXWINCE__ + DWORD nSize = maxSize; + if ( !::GetComputerName(buf, &nSize) ) + { + wxLogLastError(wxT("GetComputerName")); + + return false; + } +#endif // __WXWINCE__/!__WXWINCE__ + + return true; +} + +// get full hostname (with domain name if possible) +bool wxGetFullHostName(wxChar *buf, int maxSize) +{ +#if !defined( __WXMICROWIN__) && wxUSE_DYNLIB_CLASS && wxUSE_SOCKETS + // TODO should use GetComputerNameEx() when available + + // we don't want to always link with Winsock DLL as we might not use it at + // all, so load it dynamically here if needed (and don't complain if it is + // missing, we handle this) + wxLogNull noLog; + + wxDynamicLibrary dllWinsock(wxT("ws2_32.dll"), wxDL_VERBATIM); + if ( dllWinsock.IsLoaded() ) + { + typedef int (PASCAL *WSAStartup_t)(WORD, WSADATA *); + typedef int (PASCAL *gethostname_t)(char *, int); + typedef hostent* (PASCAL *gethostbyname_t)(const char *); + typedef hostent* (PASCAL *gethostbyaddr_t)(const char *, int , int); + typedef int (PASCAL *WSACleanup_t)(void); + + #define LOAD_WINSOCK_FUNC(func) \ + func ## _t \ + pfn ## func = (func ## _t)dllWinsock.GetSymbol(wxT(#func)) + + LOAD_WINSOCK_FUNC(WSAStartup); + + WSADATA wsa; + if ( pfnWSAStartup && pfnWSAStartup(MAKEWORD(1, 1), &wsa) == 0 ) + { + LOAD_WINSOCK_FUNC(gethostname); + + wxString host; + if ( pfngethostname ) + { + char bufA[256]; + if ( pfngethostname(bufA, WXSIZEOF(bufA)) == 0 ) + { + // gethostname() won't usually include the DNS domain name, + // for this we need to work a bit more + if ( !strchr(bufA, '.') ) + { + LOAD_WINSOCK_FUNC(gethostbyname); + + struct hostent *pHostEnt = pfngethostbyname + ? pfngethostbyname(bufA) + : NULL; + + if ( pHostEnt ) + { + // Windows will use DNS internally now + LOAD_WINSOCK_FUNC(gethostbyaddr); + + pHostEnt = pfngethostbyaddr + ? pfngethostbyaddr(pHostEnt->h_addr, + 4, AF_INET) + : NULL; + } + + if ( pHostEnt ) + { + host = wxString::FromAscii(pHostEnt->h_name); + } + } + } + } + + LOAD_WINSOCK_FUNC(WSACleanup); + if ( pfnWSACleanup ) + pfnWSACleanup(); + + + if ( !host.empty() ) + { + wxStrlcpy(buf, host.c_str(), maxSize); + + return true; + } + } + } +#endif // !__WXMICROWIN__ + + return wxGetHostName(buf, maxSize); +} + +// Get user ID e.g. jacs +bool wxGetUserId(wxChar *WXUNUSED_IN_WINCE(buf), + int WXUNUSED_IN_WINCE(maxSize)) +{ +#if defined(__WXWINCE__) + // TODO-CE + return false; +#else + DWORD nSize = maxSize; + if ( ::GetUserName(buf, &nSize) == 0 ) + { + // actually, it does happen on Win9x if the user didn't log on + DWORD res = ::GetEnvironmentVariable(wxT("username"), buf, maxSize); + if ( res == 0 ) + { + // not found + return false; + } + } + + return true; +#endif +} + +// Get user name e.g. Julian Smart +bool wxGetUserName(wxChar *buf, int maxSize) +{ + wxCHECK_MSG( buf && ( maxSize > 0 ), false, + wxT("empty buffer in wxGetUserName") ); +#if defined(__WXWINCE__) && wxUSE_REGKEY + wxLogNull noLog; + wxRegKey key(wxRegKey::HKCU, wxT("ControlPanel\\Owner")); + if(!key.Open(wxRegKey::Read)) + return false; + wxString name; + if(!key.QueryValue(wxT("Owner"),name)) + return false; + wxStrlcpy(buf, name.c_str(), maxSize); + return true; +#elif defined(USE_NET_API) + CHAR szUserName[256]; + if ( !wxGetUserId(szUserName, WXSIZEOF(szUserName)) ) + return false; + + // TODO how to get the domain name? + CHAR *szDomain = ""; + + // the code is based on the MSDN example (also see KB article Q119670) + WCHAR wszUserName[256]; // Unicode user name + WCHAR wszDomain[256]; + LPBYTE ComputerName; + + USER_INFO_2 *ui2; // User structure + + // Convert ANSI user name and domain to Unicode + MultiByteToWideChar( CP_ACP, 0, szUserName, strlen(szUserName)+1, + wszUserName, WXSIZEOF(wszUserName) ); + MultiByteToWideChar( CP_ACP, 0, szDomain, strlen(szDomain)+1, + wszDomain, WXSIZEOF(wszDomain) ); + + // Get the computer name of a DC for the domain. + if ( NetGetDCName( NULL, wszDomain, &ComputerName ) != NERR_Success ) + { + wxLogError(wxT("Cannot find domain controller")); + + goto error; + } + + // Look up the user on the DC + NET_API_STATUS status = NetUserGetInfo( (LPWSTR)ComputerName, + (LPWSTR)&wszUserName, + 2, // level - we want USER_INFO_2 + (LPBYTE *) &ui2 ); + switch ( status ) + { + case NERR_Success: + // ok + break; + + case NERR_InvalidComputer: + wxLogError(wxT("Invalid domain controller name.")); + + goto error; + + case NERR_UserNotFound: + wxLogError(wxT("Invalid user name '%s'."), szUserName); + + goto error; + + default: + wxLogSysError(wxT("Can't get information about user")); + + goto error; + } + + // Convert the Unicode full name to ANSI + WideCharToMultiByte( CP_ACP, 0, ui2->usri2_full_name, -1, + buf, maxSize, NULL, NULL ); + + return true; + +error: + wxLogError(wxT("Couldn't look up full user name.")); + + return false; +#else // !USE_NET_API + // Could use NIS, MS-Mail or other site specific programs + // Use wxWidgets configuration data + bool ok = GetProfileString(WX_SECTION, eUSERNAME, wxEmptyString, buf, maxSize - 1) != 0; + if ( !ok ) + { + ok = wxGetUserId(buf, maxSize); + } + + if ( !ok ) + { + wxStrlcpy(buf, wxT("Unknown User"), maxSize); + } + + return true; +#endif // Win32/16 +} + +const wxChar* wxGetHomeDir(wxString *pstr) +{ + wxString& strDir = *pstr; + + // first branch is for Cygwin +#if defined(__UNIX__) && !defined(__WINE__) + const wxChar *szHome = wxGetenv(wxT("HOME")); + if ( szHome == NULL ) { + // we're homeless... + wxLogWarning(_("can't find user's HOME, using current directory.")); + strDir = wxT("."); + } + else + strDir = szHome; + + // add a trailing slash if needed + if ( strDir.Last() != wxT('/') ) + strDir << wxT('/'); + + #ifdef __CYGWIN__ + // Cygwin returns unix type path but that does not work well + static wxChar windowsPath[MAX_PATH]; + #if CYGWIN_VERSION_DLL_MAJOR >= 1007 + cygwin_conv_path(CCP_POSIX_TO_WIN_W, strDir, windowsPath, MAX_PATH); + #else + cygwin_conv_to_full_win32_path(strDir, windowsPath); + #endif + strDir = windowsPath; + #endif +#elif defined(__WXWINCE__) + strDir = wxT("\\"); +#else + strDir.clear(); + + // If we have a valid HOME directory, as is used on many machines that + // have unix utilities on them, we should use that. + const wxChar *szHome = wxGetenv(wxT("HOME")); + + if ( szHome != NULL ) + { + strDir = szHome; + } + else // no HOME, try HOMEDRIVE/PATH + { + szHome = wxGetenv(wxT("HOMEDRIVE")); + if ( szHome != NULL ) + strDir << szHome; + szHome = wxGetenv(wxT("HOMEPATH")); + + if ( szHome != NULL ) + { + strDir << szHome; + + // the idea is that under NT these variables have default values + // of "%systemdrive%:" and "\\". As we don't want to create our + // config files in the root directory of the system drive, we will + // create it in our program's dir. However, if the user took care + // to set HOMEPATH to something other than "\\", we suppose that he + // knows what he is doing and use the supplied value. + if ( wxStrcmp(szHome, wxT("\\")) == 0 ) + strDir.clear(); + } + } + + if ( strDir.empty() ) + { + // If we have a valid USERPROFILE directory, as is the case in + // Windows NT, 2000 and XP, we should use that as our home directory. + szHome = wxGetenv(wxT("USERPROFILE")); + + if ( szHome != NULL ) + strDir = szHome; + } + + if ( !strDir.empty() ) + { + // sometimes the value of HOME may be "%USERPROFILE%", so reexpand the + // value once again, it shouldn't hurt anyhow + strDir = wxExpandEnvVars(strDir); + } + else // fall back to the program directory + { + // extract the directory component of the program file name + wxFileName::SplitPath(wxGetFullModuleName(), &strDir, NULL, NULL); + } +#endif // UNIX/Win + + return strDir.c_str(); +} + +wxString wxGetUserHome(const wxString& user) +{ + wxString home; + + if ( user.empty() || user == wxGetUserId() ) + wxGetHomeDir(&home); + + return home; +} + +bool wxGetDiskSpace(const wxString& WXUNUSED_IN_WINCE(path), + wxDiskspaceSize_t *WXUNUSED_IN_WINCE(pTotal), + wxDiskspaceSize_t *WXUNUSED_IN_WINCE(pFree)) +{ +#ifdef __WXWINCE__ + // TODO-CE + return false; +#else + if ( path.empty() ) + return false; + +// old w32api don't have ULARGE_INTEGER +#if defined(__WIN32__) && \ + (!defined(__GNUWIN32__) || wxCHECK_W32API_VERSION( 0, 3 )) + // GetDiskFreeSpaceEx() is not available under original Win95, check for + // it + typedef BOOL (WINAPI *GetDiskFreeSpaceEx_t)(LPCTSTR, + PULARGE_INTEGER, + PULARGE_INTEGER, + PULARGE_INTEGER); + + GetDiskFreeSpaceEx_t + pGetDiskFreeSpaceEx = (GetDiskFreeSpaceEx_t)::GetProcAddress + ( + ::GetModuleHandle(wxT("kernel32.dll")), +#if wxUSE_UNICODE + "GetDiskFreeSpaceExW" +#else + "GetDiskFreeSpaceExA" +#endif + ); + + if ( pGetDiskFreeSpaceEx ) + { + ULARGE_INTEGER bytesFree, bytesTotal; + + // may pass the path as is, GetDiskFreeSpaceEx() is smart enough + if ( !pGetDiskFreeSpaceEx(path.t_str(), + &bytesFree, + &bytesTotal, + NULL) ) + { + wxLogLastError(wxT("GetDiskFreeSpaceEx")); + + return false; + } + + // ULARGE_INTEGER is a union of a 64 bit value and a struct containing + // two 32 bit fields which may be or may be not named - try to make it + // compile in all cases +#if defined(__BORLANDC__) && !defined(_ANONYMOUS_STRUCT) + #define UL(ul) ul.u +#else // anon union + #define UL(ul) ul +#endif + if ( pTotal ) + { +#if wxUSE_LONGLONG + *pTotal = wxDiskspaceSize_t(UL(bytesTotal).HighPart, UL(bytesTotal).LowPart); +#else + *pTotal = wxDiskspaceSize_t(UL(bytesTotal).LowPart); +#endif + } + + if ( pFree ) + { +#if wxUSE_LONGLONG + *pFree = wxLongLong(UL(bytesFree).HighPart, UL(bytesFree).LowPart); +#else + *pFree = wxDiskspaceSize_t(UL(bytesFree).LowPart); +#endif + } + } + else +#endif // Win32 + { + // there's a problem with drives larger than 2GB, GetDiskFreeSpaceEx() + // should be used instead - but if it's not available, fall back on + // GetDiskFreeSpace() nevertheless... + + DWORD lSectorsPerCluster, + lBytesPerSector, + lNumberOfFreeClusters, + lTotalNumberOfClusters; + + // FIXME: this is wrong, we should extract the root drive from path + // instead, but this is the job for wxFileName... + if ( !::GetDiskFreeSpace(path.t_str(), + &lSectorsPerCluster, + &lBytesPerSector, + &lNumberOfFreeClusters, + &lTotalNumberOfClusters) ) + { + wxLogLastError(wxT("GetDiskFreeSpace")); + + return false; + } + + wxDiskspaceSize_t lBytesPerCluster = (wxDiskspaceSize_t) lSectorsPerCluster; + lBytesPerCluster *= lBytesPerSector; + + if ( pTotal ) + { + *pTotal = lBytesPerCluster; + *pTotal *= lTotalNumberOfClusters; + } + + if ( pFree ) + { + *pFree = lBytesPerCluster; + *pFree *= lNumberOfFreeClusters; + } + } + + return true; +#endif + // __WXWINCE__ +} + +// ---------------------------------------------------------------------------- +// env vars +// ---------------------------------------------------------------------------- + +bool wxGetEnv(const wxString& WXUNUSED_IN_WINCE(var), + wxString *WXUNUSED_IN_WINCE(value)) +{ +#ifdef __WXWINCE__ + // no environment variables under CE + return false; +#else // Win32 + // first get the size of the buffer + DWORD dwRet = ::GetEnvironmentVariable(var.t_str(), NULL, 0); + if ( !dwRet ) + { + // this means that there is no such variable + return false; + } + + if ( value ) + { + (void)::GetEnvironmentVariable(var.t_str(), + wxStringBuffer(*value, dwRet), + dwRet); + } + + return true; +#endif // WinCE/32 +} + +bool wxDoSetEnv(const wxString& var, const wxChar *value) +{ +#ifdef __WXWINCE__ + // no environment variables under CE + wxUnusedVar(var); + wxUnusedVar(value); + return false; +#else // !__WXWINCE__ + // update the CRT environment if possible as people expect getenv() to also + // work and it is not affected by Win32 SetEnvironmentVariable() call (OTOH + // the CRT does use Win32 call to update the process environment block so + // there is no need to call it) + // + // TODO: add checks for the other compilers (and update wxSetEnv() + // documentation in interface/wx/utils.h accordingly) +#if defined(__VISUALC__) || defined(__MINGW32__) + // notice that Microsoft _putenv() has different semantics from POSIX + // function with almost the same name: in particular it makes a copy of the + // string instead of using it as part of environment so we can safely call + // it here without going through all the troubles with wxSetEnvModule as in + // src/unix/utilsunx.cpp + wxString envstr = var; + envstr += '='; + if ( value ) + envstr += value; + if ( _tputenv(envstr.t_str()) != 0 ) + return false; +#else // other compiler + if ( !::SetEnvironmentVariable(var.t_str(), value) ) + { + wxLogLastError(wxT("SetEnvironmentVariable")); + + return false; + } +#endif // compiler + + return true; +#endif // __WXWINCE__/!__WXWINCE__ +} + +bool wxSetEnv(const wxString& variable, const wxString& value) +{ + return wxDoSetEnv(variable, value.t_str()); +} + +bool wxUnsetEnv(const wxString& variable) +{ + return wxDoSetEnv(variable, NULL); +} + +// ---------------------------------------------------------------------------- +// process management +// ---------------------------------------------------------------------------- + +// structure used to pass parameters from wxKill() to wxEnumFindByPidProc() +struct wxFindByPidParams +{ + wxFindByPidParams() { hwnd = 0; pid = 0; } + + // the HWND used to return the result + HWND hwnd; + + // the PID we're looking from + DWORD pid; + + wxDECLARE_NO_COPY_CLASS(wxFindByPidParams); +}; + +// wxKill helper: EnumWindows() callback which is used to find the first (top +// level) window belonging to the given process +BOOL CALLBACK wxEnumFindByPidProc(HWND hwnd, LPARAM lParam) +{ + DWORD pid; + (void)::GetWindowThreadProcessId(hwnd, &pid); + + wxFindByPidParams *params = (wxFindByPidParams *)lParam; + if ( pid == params->pid ) + { + // remember the window we found + params->hwnd = hwnd; + + // return FALSE to stop the enumeration + return FALSE; + } + + // continue enumeration + return TRUE; +} + +int wxKillAllChildren(long pid, wxSignal sig, wxKillError *krc); + +int wxKill(long pid, wxSignal sig, wxKillError *krc, int flags) +{ + if (flags & wxKILL_CHILDREN) + wxKillAllChildren(pid, sig, krc); + + // get the process handle to operate on + DWORD dwAccess = PROCESS_QUERY_INFORMATION | SYNCHRONIZE; + if ( sig == wxSIGKILL ) + dwAccess |= PROCESS_TERMINATE; + + HANDLE hProcess = ::OpenProcess(dwAccess, FALSE, (DWORD)pid); + if ( hProcess == NULL ) + { + if ( krc ) + { + // recognize wxKILL_ACCESS_DENIED as special because this doesn't + // mean that the process doesn't exist and this is important for + // wxProcess::Exists() + *krc = ::GetLastError() == ERROR_ACCESS_DENIED + ? wxKILL_ACCESS_DENIED + : wxKILL_NO_PROCESS; + } + + return -1; + } + + wxON_BLOCK_EXIT1(::CloseHandle, hProcess); + + // Default timeout for waiting for the process termination after killing + // it. It should be long enough to allow the process to terminate even on a + // busy system but short enough to avoid blocking the main thread for too + // long. + DWORD waitTimeout = 500; // ms + + bool ok = true; + switch ( sig ) + { + case wxSIGKILL: + // kill the process forcefully returning -1 as error code + if ( !::TerminateProcess(hProcess, (UINT)-1) ) + { + wxLogSysError(_("Failed to kill process %d"), pid); + + if ( krc ) + { + // this is not supposed to happen if we could open the + // process + *krc = wxKILL_ERROR; + } + + ok = false; + } + break; + + case wxSIGNONE: + // Opening the process handle may succeed for a process even if it + // doesn't run any more (typically because open handles to it still + // exist elsewhere, possibly in this process itself if we're + // killing a child process) so we still need check if it hasn't + // terminated yet but, unlike when killing it, we don't need to + // wait for any time at all. + waitTimeout = 0; + break; + + default: + // any other signal means "terminate" + { + wxFindByPidParams params; + params.pid = (DWORD)pid; + + // EnumWindows() has nice semantics: it returns 0 if it found + // something or if an error occurred and non zero if it + // enumerated all the window + if ( !::EnumWindows(wxEnumFindByPidProc, (LPARAM)¶ms) ) + { + // did we find any window? + if ( params.hwnd ) + { + // tell the app to close + // + // NB: this is the harshest way, the app won't have an + // opportunity to save any files, for example, but + // this is probably what we want here. If not we + // can also use SendMesageTimeout(WM_CLOSE) + if ( !::PostMessage(params.hwnd, WM_QUIT, 0, 0) ) + { + wxLogLastError(wxT("PostMessage(WM_QUIT)")); + } + } + else // it was an error then + { + wxLogLastError(wxT("EnumWindows")); + + ok = false; + } + } + else // no windows for this PID + { + if ( krc ) + *krc = wxKILL_ERROR; + + ok = false; + } + } + } + + // the return code + if ( ok ) + { + // as we wait for a short time, we can use just WaitForSingleObject() + // and not MsgWaitForMultipleObjects() + switch ( ::WaitForSingleObject(hProcess, waitTimeout) ) + { + case WAIT_OBJECT_0: + // Process terminated: normally this indicates that we + // successfully killed it but when testing for the process + // existence, this means failure. + if ( sig == wxSIGNONE ) + { + if ( krc ) + *krc = wxKILL_NO_PROCESS; + + ok = false; + } + break; + + default: + wxFAIL_MSG( wxT("unexpected WaitForSingleObject() return") ); + // fall through + + case WAIT_FAILED: + wxLogLastError(wxT("WaitForSingleObject")); + // fall through + + case WAIT_TIMEOUT: + // Process didn't terminate: normally this is a failure but not + // when we're just testing for its existence. + if ( sig != wxSIGNONE ) + { + if ( krc ) + *krc = wxKILL_ERROR; + + ok = false; + } + break; + } + } + + + // the return code is the same as from Unix kill(): 0 if killed + // successfully or -1 on error + if ( !ok ) + return -1; + + if ( krc ) + *krc = wxKILL_OK; + + return 0; +} + +typedef HANDLE (WINAPI *CreateToolhelp32Snapshot_t)(DWORD,DWORD); +typedef BOOL (WINAPI *Process32_t)(HANDLE,LPPROCESSENTRY32); + +CreateToolhelp32Snapshot_t lpfCreateToolhelp32Snapshot; +Process32_t lpfProcess32First, lpfProcess32Next; + +static void InitToolHelp32() +{ + static bool s_initToolHelpDone = false; + + if (s_initToolHelpDone) + return; + + s_initToolHelpDone = true; + + lpfCreateToolhelp32Snapshot = NULL; + lpfProcess32First = NULL; + lpfProcess32Next = NULL; + +#if wxUSE_DYNLIB_CLASS + + wxDynamicLibrary dllKernel(wxT("kernel32.dll"), wxDL_VERBATIM); + + // Get procedure addresses. + // We are linking to these functions of Kernel32 + // explicitly, because otherwise a module using + // this code would fail to load under Windows NT, + // which does not have the Toolhelp32 + // functions in the Kernel 32. + lpfCreateToolhelp32Snapshot = + (CreateToolhelp32Snapshot_t)dllKernel.RawGetSymbol(wxT("CreateToolhelp32Snapshot")); + + lpfProcess32First = + (Process32_t)dllKernel.RawGetSymbol(wxT("Process32First")); + + lpfProcess32Next = + (Process32_t)dllKernel.RawGetSymbol(wxT("Process32Next")); + +#endif // wxUSE_DYNLIB_CLASS +} + +// By John Skiff +int wxKillAllChildren(long pid, wxSignal sig, wxKillError *krc) +{ + InitToolHelp32(); + + if (krc) + *krc = wxKILL_OK; + + // If not implemented for this platform (e.g. NT 4.0), silently ignore + if (!lpfCreateToolhelp32Snapshot || !lpfProcess32First || !lpfProcess32Next) + return 0; + + // Take a snapshot of all processes in the system. + HANDLE hProcessSnap = lpfCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (hProcessSnap == INVALID_HANDLE_VALUE) { + if (krc) + *krc = wxKILL_ERROR; + return -1; + } + + //Fill in the size of the structure before using it. + PROCESSENTRY32 pe; + wxZeroMemory(pe); + pe.dwSize = sizeof(PROCESSENTRY32); + + // Walk the snapshot of the processes, and for each process, + // kill it if its parent is pid. + if (!lpfProcess32First(hProcessSnap, &pe)) { + // Can't get first process. + if (krc) + *krc = wxKILL_ERROR; + CloseHandle (hProcessSnap); + return -1; + } + + do { + if (pe.th32ParentProcessID == (DWORD) pid) { + if (wxKill(pe.th32ProcessID, sig, krc)) + return -1; + } + } while (lpfProcess32Next (hProcessSnap, &pe)); + + + return 0; +} + +// Execute a program in an Interactive Shell +bool wxShell(const wxString& command) +{ + wxString cmd; + +#ifdef __WXWINCE__ + cmd = command; +#else + wxChar *shell = wxGetenv(wxT("COMSPEC")); + if ( !shell ) + shell = (wxChar*) wxT("\\COMMAND.COM"); + + if ( !command ) + { + // just the shell + cmd = shell; + } + else + { + // pass the command to execute to the command processor + cmd.Printf(wxT("%s /c %s"), shell, command.c_str()); + } +#endif + + return wxExecute(cmd, wxEXEC_SYNC) == 0; +} + +// Shutdown or reboot the PC +bool wxShutdown(int WXUNUSED_IN_WINCE(flags)) +{ +#ifdef __WXWINCE__ + // TODO-CE + return false; +#elif defined(__WIN32__) + bool bOK = true; + + if ( wxGetOsVersion(NULL, NULL) == wxOS_WINDOWS_NT ) // if is NT or 2K + { + // Get a token for this process. + HANDLE hToken; + bOK = ::OpenProcessToken(GetCurrentProcess(), + TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, + &hToken) != 0; + if ( bOK ) + { + TOKEN_PRIVILEGES tkp; + + // Get the LUID for the shutdown privilege. + bOK = ::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, + &tkp.Privileges[0].Luid) != 0; + + if ( bOK ) + { + tkp.PrivilegeCount = 1; // one privilege to set + tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + + // Get the shutdown privilege for this process. + ::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, + (PTOKEN_PRIVILEGES)NULL, 0); + + // Cannot test the return value of AdjustTokenPrivileges. + bOK = ::GetLastError() == ERROR_SUCCESS; + } + + ::CloseHandle(hToken); + } + } + + if ( bOK ) + { + UINT wFlags = 0; + if ( flags & wxSHUTDOWN_FORCE ) + { + wFlags = EWX_FORCE; + flags &= ~wxSHUTDOWN_FORCE; + } + + switch ( flags ) + { + case wxSHUTDOWN_POWEROFF: + wFlags |= EWX_POWEROFF; + break; + + case wxSHUTDOWN_REBOOT: + wFlags |= EWX_REBOOT; + break; + + case wxSHUTDOWN_LOGOFF: + wFlags |= EWX_LOGOFF; + break; + + default: + wxFAIL_MSG( wxT("unknown wxShutdown() flag") ); + return false; + } + + bOK = ::ExitWindowsEx(wFlags, 0) != 0; + } + + return bOK; +#endif // WinCE/!WinCE +} + +// ---------------------------------------------------------------------------- +// misc +// ---------------------------------------------------------------------------- + +// Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX) +wxMemorySize wxGetFreeMemory() +{ +#if defined(__WIN64__) + MEMORYSTATUSEX memStatex; + memStatex.dwLength = sizeof (memStatex); + ::GlobalMemoryStatusEx (&memStatex); + return (wxMemorySize)memStatex.ullAvailPhys; +#else /* if defined(__WIN32__) */ + MEMORYSTATUS memStatus; + memStatus.dwLength = sizeof(MEMORYSTATUS); + ::GlobalMemoryStatus(&memStatus); + return (wxMemorySize)memStatus.dwAvailPhys; +#endif +} + +unsigned long wxGetProcessId() +{ + return ::GetCurrentProcessId(); +} + +bool wxIsDebuggerRunning() +{ +#if wxUSE_DYNLIB_CLASS + // IsDebuggerPresent() is not available under Win95, so load it dynamically + wxDynamicLibrary dll(wxT("kernel32.dll"), wxDL_VERBATIM); + + typedef BOOL (WINAPI *IsDebuggerPresent_t)(); + if ( !dll.HasSymbol(wxT("IsDebuggerPresent")) ) + { + // no way to know, assume no + return false; + } + + return (*(IsDebuggerPresent_t)dll.GetSymbol(wxT("IsDebuggerPresent")))() != 0; +#else + return false; +#endif +} + +// ---------------------------------------------------------------------------- +// working with MSW resources +// ---------------------------------------------------------------------------- + +bool +wxLoadUserResource(const void **outData, + size_t *outLen, + const wxString& resourceName, + const wxChar* resourceType, + WXHINSTANCE instance) +{ + wxCHECK_MSG( outData && outLen, false, "output pointers can't be NULL" ); + + HRSRC hResource = ::FindResource(instance, + resourceName.t_str(), + resourceType); + if ( !hResource ) + return false; + + HGLOBAL hData = ::LoadResource(instance, hResource); + if ( !hData ) + { + wxLogSysError(_("Failed to load resource \"%s\"."), resourceName); + return false; + } + + *outData = ::LockResource(hData); + if ( !*outData ) + { + wxLogSysError(_("Failed to lock resource \"%s\"."), resourceName); + return false; + } + + *outLen = ::SizeofResource(instance, hResource); + + // Notice that we do not need to call neither UnlockResource() (which is + // obsolete in Win32) nor GlobalFree() (resources are freed on process + // termination only) + + return true; +} + +char * +wxLoadUserResource(const wxString& resourceName, + const wxChar* resourceType, + int* pLen, + WXHINSTANCE instance) +{ + const void *data; + size_t len; + if ( !wxLoadUserResource(&data, &len, resourceName, resourceType, instance) ) + return NULL; + + char *s = new char[len + 1]; + memcpy(s, data, len); + s[len] = '\0'; // NUL-terminate in case the resource itself wasn't + + if (pLen) + *pLen = len; + + return s; +} + +// ---------------------------------------------------------------------------- +// OS version +// ---------------------------------------------------------------------------- + +// check if we're running under a server or workstation Windows system: it +// returns true or false with obvious meaning as well as -1 if the system type +// couldn't be determined +// +// this function is currently private but we may want to expose it later if +// it's really useful +namespace +{ + +int wxIsWindowsServer() +{ +#ifdef VER_NT_WORKSTATION + OSVERSIONINFOEX info; + wxZeroMemory(info); + + info.dwOSVersionInfoSize = sizeof(info); + if ( ::GetVersionEx(reinterpret_cast(&info)) ) + { + switch ( info.wProductType ) + { + case VER_NT_WORKSTATION: + return false; + + case VER_NT_SERVER: + case VER_NT_DOMAIN_CONTROLLER: + return true; + } + } +#endif // VER_NT_WORKSTATION + + return -1; +} + +} // anonymous namespace + +wxString wxGetOsDescription() +{ + wxString str; + + OSVERSIONINFO info; + wxZeroMemory(info); + + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + if ( ::GetVersionEx(&info) ) + { + switch ( info.dwPlatformId ) + { +#ifdef VER_PLATFORM_WIN32_CE + case VER_PLATFORM_WIN32_CE: + str.Printf(_("Windows CE (%d.%d)"), + info.dwMajorVersion, + info.dwMinorVersion); + break; +#endif + case VER_PLATFORM_WIN32s: + str = _("Win32s on Windows 3.1"); + break; + + case VER_PLATFORM_WIN32_WINDOWS: + switch (info.dwMinorVersion) + { + case 0: + if ( info.szCSDVersion[1] == 'B' || + info.szCSDVersion[1] == 'C' ) + { + str = _("Windows 95 OSR2"); + } + else + { + str = _("Windows 95"); + } + break; + case 10: + if ( info.szCSDVersion[1] == 'B' || + info.szCSDVersion[1] == 'C' ) + { + str = _("Windows 98 SE"); + } + else + { + str = _("Windows 98"); + } + break; + case 90: + str = _("Windows ME"); + break; + default: + str.Printf(_("Windows 9x (%d.%d)"), + info.dwMajorVersion, + info.dwMinorVersion); + break; + } + if ( !wxIsEmpty(info.szCSDVersion) ) + { + str << wxT(" (") << info.szCSDVersion << wxT(')'); + } + break; + + case VER_PLATFORM_WIN32_NT: + switch ( info.dwMajorVersion ) + { + case 5: + switch ( info.dwMinorVersion ) + { + case 0: + str = _("Windows 2000"); + break; + + case 2: + // we can't distinguish between XP 64 and 2003 + // as they both are 5.2, so examine the product + // type to resolve this ambiguity + if ( wxIsWindowsServer() == 1 ) + { + str = _("Windows Server 2003"); + break; + } + //else: must be XP, fall through + + case 1: + str = _("Windows XP"); + break; + } + break; + + case 6: + switch ( info.dwMinorVersion ) + { + case 0: + str = wxIsWindowsServer() == 1 + ? _("Windows Server 2008") + : _("Windows Vista"); + break; + + case 1: + str = wxIsWindowsServer() == 1 + ? _("Windows Server 2008 R2") + : _("Windows 7"); + break; + } + break; + } + + if ( str.empty() ) + { + str.Printf(_("Windows NT %lu.%lu"), + info.dwMajorVersion, + info.dwMinorVersion); + } + + str << wxT(" (") + << wxString::Format(_("build %lu"), info.dwBuildNumber); + if ( !wxIsEmpty(info.szCSDVersion) ) + { + str << wxT(", ") << info.szCSDVersion; + } + str << wxT(')'); + + if ( wxIsPlatform64Bit() ) + str << _(", 64-bit edition"); + break; + } + } + else + { + wxFAIL_MSG( wxT("GetVersionEx() failed") ); // should never happen + } + + return str; +} + +bool wxIsPlatform64Bit() +{ +#if defined(_WIN64) + return true; // 64-bit programs run only on Win64 +#elif wxUSE_DYNLIB_CLASS // Win32 + // 32-bit programs run on both 32-bit and 64-bit Windows so check + typedef BOOL (WINAPI *IsWow64Process_t)(HANDLE, BOOL *); + + wxDynamicLibrary dllKernel32(wxT("kernel32.dll")); + IsWow64Process_t pfnIsWow64Process = + (IsWow64Process_t)dllKernel32.RawGetSymbol(wxT("IsWow64Process")); + + BOOL wow64 = FALSE; + if ( pfnIsWow64Process ) + { + pfnIsWow64Process(::GetCurrentProcess(), &wow64); + } + //else: running under a system without Win64 support + + return wow64 != FALSE; +#else + return false; +#endif // Win64/Win32 +} + +wxOperatingSystemId wxGetOsVersion(int *verMaj, int *verMin) +{ + static struct + { + // this may be false, true or -1 if we tried to initialize but failed + int initialized; + + wxOperatingSystemId os; + + int verMaj, + verMin; + } s_version; + + // query the OS info only once as it's not supposed to change + if ( !s_version.initialized ) + { + OSVERSIONINFO info; + wxZeroMemory(info); + info.dwOSVersionInfoSize = sizeof(info); + if ( ::GetVersionEx(&info) ) + { + s_version.initialized = true; + +#if defined(__WXWINCE__) + s_version.os = wxOS_WINDOWS_CE; +#elif defined(__WXMICROWIN__) + s_version.os = wxOS_WINDOWS_MICRO; +#else // "normal" desktop Windows system, use run-time detection + switch ( info.dwPlatformId ) + { + case VER_PLATFORM_WIN32_NT: + s_version.os = wxOS_WINDOWS_NT; + break; + + case VER_PLATFORM_WIN32_WINDOWS: + s_version.os = wxOS_WINDOWS_9X; + break; + } +#endif // Windows versions + + s_version.verMaj = info.dwMajorVersion; + s_version.verMin = info.dwMinorVersion; + } + else // GetVersionEx() failed + { + s_version.initialized = -1; + } + } + + if ( s_version.initialized == 1 ) + { + if ( verMaj ) + *verMaj = s_version.verMaj; + if ( verMin ) + *verMin = s_version.verMin; + } + + // this works even if we were not initialized successfully as the initial + // values of this field is 0 which is wxOS_UNKNOWN and exactly what we need + return s_version.os; +} + +wxWinVersion wxGetWinVersion() +{ + int verMaj, + verMin; + switch ( wxGetOsVersion(&verMaj, &verMin) ) + { + case wxOS_WINDOWS_9X: + if ( verMaj == 4 ) + { + switch ( verMin ) + { + case 0: + return wxWinVersion_95; + + case 10: + return wxWinVersion_98; + + case 90: + return wxWinVersion_ME; + } + } + break; + + case wxOS_WINDOWS_NT: + switch ( verMaj ) + { + case 3: + return wxWinVersion_NT3; + + case 4: + return wxWinVersion_NT4; + + case 5: + switch ( verMin ) + { + case 0: + return wxWinVersion_2000; + + case 1: + return wxWinVersion_XP; + + case 2: + return wxWinVersion_2003; + } + break; + + case 6: + return wxWinVersion_NT6; + } + break; + + default: + // Do nothing just to silence GCC warning + break; + } + + return wxWinVersion_Unknown; +} + +// ---------------------------------------------------------------------------- +// sleep functions +// ---------------------------------------------------------------------------- + +void wxMilliSleep(unsigned long milliseconds) +{ + ::Sleep(milliseconds); +} + +void wxMicroSleep(unsigned long microseconds) +{ + wxMilliSleep(microseconds/1000); +} + +void wxSleep(int nSecs) +{ + wxMilliSleep(1000*nSecs); +} + +// ---------------------------------------------------------------------------- +// font encoding <-> Win32 codepage conversion functions +// ---------------------------------------------------------------------------- + +extern WXDLLIMPEXP_BASE long wxEncodingToCharset(wxFontEncoding encoding) +{ + switch ( encoding ) + { + // although this function is supposed to return an exact match, do do + // some mappings here for the most common case of "standard" encoding + case wxFONTENCODING_SYSTEM: + return DEFAULT_CHARSET; + + case wxFONTENCODING_ISO8859_1: + case wxFONTENCODING_ISO8859_15: + case wxFONTENCODING_CP1252: + return ANSI_CHARSET; + +#if !defined(__WXMICROWIN__) + // The following four fonts are multi-byte charsets + case wxFONTENCODING_CP932: + return SHIFTJIS_CHARSET; + + case wxFONTENCODING_CP936: + return GB2312_CHARSET; + +#ifndef __WXWINCE__ + case wxFONTENCODING_CP949: + return HANGUL_CHARSET; +#endif + + case wxFONTENCODING_CP950: + return CHINESEBIG5_CHARSET; + + // The rest are single byte encodings + case wxFONTENCODING_CP1250: + return EASTEUROPE_CHARSET; + + case wxFONTENCODING_CP1251: + return RUSSIAN_CHARSET; + + case wxFONTENCODING_CP1253: + return GREEK_CHARSET; + + case wxFONTENCODING_CP1254: + return TURKISH_CHARSET; + + case wxFONTENCODING_CP1255: + return HEBREW_CHARSET; + + case wxFONTENCODING_CP1256: + return ARABIC_CHARSET; + + case wxFONTENCODING_CP1257: + return BALTIC_CHARSET; + + case wxFONTENCODING_CP874: + return THAI_CHARSET; +#endif // !__WXMICROWIN__ + + case wxFONTENCODING_CP437: + return OEM_CHARSET; + + default: + // no way to translate this encoding into a Windows charset + return -1; + } +} + +// we have 2 versions of wxCharsetToCodepage(): the old one which directly +// looks up the vlaues in the registry and the new one which is more +// politically correct and has more chances to work on other Windows versions +// as well but the old version is still needed for !wxUSE_FONTMAP case +#if wxUSE_FONTMAP + +#include "wx/fontmap.h" + +extern WXDLLIMPEXP_BASE long wxEncodingToCodepage(wxFontEncoding encoding) +{ + // There don't seem to be symbolic names for + // these under Windows so I just copied the + // values from MSDN. + + unsigned int ret; + + switch (encoding) + { + case wxFONTENCODING_ISO8859_1: ret = 28591; break; + case wxFONTENCODING_ISO8859_2: ret = 28592; break; + case wxFONTENCODING_ISO8859_3: ret = 28593; break; + case wxFONTENCODING_ISO8859_4: ret = 28594; break; + case wxFONTENCODING_ISO8859_5: ret = 28595; break; + case wxFONTENCODING_ISO8859_6: ret = 28596; break; + case wxFONTENCODING_ISO8859_7: ret = 28597; break; + case wxFONTENCODING_ISO8859_8: ret = 28598; break; + case wxFONTENCODING_ISO8859_9: ret = 28599; break; + case wxFONTENCODING_ISO8859_10: ret = 28600; break; + case wxFONTENCODING_ISO8859_11: ret = 874; break; + // case wxFONTENCODING_ISO8859_12, // doesn't exist currently, but put it + case wxFONTENCODING_ISO8859_13: ret = 28603; break; + // case wxFONTENCODING_ISO8859_14: ret = 28604; break; // no correspondence on Windows + case wxFONTENCODING_ISO8859_15: ret = 28605; break; + + case wxFONTENCODING_KOI8: ret = 20866; break; + case wxFONTENCODING_KOI8_U: ret = 21866; break; + + case wxFONTENCODING_CP437: ret = 437; break; + case wxFONTENCODING_CP850: ret = 850; break; + case wxFONTENCODING_CP852: ret = 852; break; + case wxFONTENCODING_CP855: ret = 855; break; + case wxFONTENCODING_CP866: ret = 866; break; + case wxFONTENCODING_CP874: ret = 874; break; + case wxFONTENCODING_CP932: ret = 932; break; + case wxFONTENCODING_CP936: ret = 936; break; + case wxFONTENCODING_CP949: ret = 949; break; + case wxFONTENCODING_CP950: ret = 950; break; + case wxFONTENCODING_CP1250: ret = 1250; break; + case wxFONTENCODING_CP1251: ret = 1251; break; + case wxFONTENCODING_CP1252: ret = 1252; break; + case wxFONTENCODING_CP1253: ret = 1253; break; + case wxFONTENCODING_CP1254: ret = 1254; break; + case wxFONTENCODING_CP1255: ret = 1255; break; + case wxFONTENCODING_CP1256: ret = 1256; break; + case wxFONTENCODING_CP1257: ret = 1257; break; + + case wxFONTENCODING_EUC_JP: ret = 20932; break; + + case wxFONTENCODING_MACROMAN: ret = 10000; break; + case wxFONTENCODING_MACJAPANESE: ret = 10001; break; + case wxFONTENCODING_MACCHINESETRAD: ret = 10002; break; + case wxFONTENCODING_MACKOREAN: ret = 10003; break; + case wxFONTENCODING_MACARABIC: ret = 10004; break; + case wxFONTENCODING_MACHEBREW: ret = 10005; break; + case wxFONTENCODING_MACGREEK: ret = 10006; break; + case wxFONTENCODING_MACCYRILLIC: ret = 10007; break; + case wxFONTENCODING_MACTHAI: ret = 10021; break; + case wxFONTENCODING_MACCHINESESIMP: ret = 10008; break; + case wxFONTENCODING_MACCENTRALEUR: ret = 10029; break; + case wxFONTENCODING_MACCROATIAN: ret = 10082; break; + case wxFONTENCODING_MACICELANDIC: ret = 10079; break; + case wxFONTENCODING_MACROMANIAN: ret = 10009; break; + + case wxFONTENCODING_ISO2022_JP: ret = 50222; break; + + case wxFONTENCODING_UTF7: ret = 65000; break; + case wxFONTENCODING_UTF8: ret = 65001; break; + + default: return -1; + } + + if (::IsValidCodePage(ret) == 0) + return -1; + + CPINFO info; + if (::GetCPInfo(ret, &info) == 0) + return -1; + + return (long) ret; +} + +extern long wxCharsetToCodepage(const char *name) +{ + // first get the font encoding for this charset + if ( !name ) + return -1; + + wxFontEncoding enc = wxFontMapperBase::Get()->CharsetToEncoding(name, false); + if ( enc == wxFONTENCODING_SYSTEM ) + return -1; + + // the use the helper function + return wxEncodingToCodepage(enc); +} + +#else // !wxUSE_FONTMAP + +#include "wx/msw/registry.h" + +// this should work if Internet Exploiter is installed +extern long wxCharsetToCodepage(const char *name) +{ + if (!name) + return GetACP(); + + long CP = -1; + +#if wxUSE_REGKEY + wxString path(wxT("MIME\\Database\\Charset\\")); + wxString cn(name); + + // follow the alias loop + for ( ;; ) + { + wxRegKey key(wxRegKey::HKCR, path + cn); + + if (!key.Exists()) + break; + + // two cases: either there's an AliasForCharset string, + // or there are Codepage and InternetEncoding dwords. + // The InternetEncoding gives us the actual encoding, + // the Codepage just says which Windows character set to + // use when displaying the data. + if (key.HasValue(wxT("InternetEncoding")) && + key.QueryValue(wxT("InternetEncoding"), &CP)) + break; + + // no encoding, see if it's an alias + if (!key.HasValue(wxT("AliasForCharset")) || + !key.QueryValue(wxT("AliasForCharset"), cn)) + break; + } +#endif // wxUSE_REGKEY + + return CP; +} + +#endif // wxUSE_FONTMAP/!wxUSE_FONTMAP + +extern "C" WXDLLIMPEXP_BASE HWND +wxCreateHiddenWindow(LPCTSTR *pclassname, LPCTSTR classname, WNDPROC wndproc) +{ + wxCHECK_MSG( classname && pclassname && wndproc, NULL, + wxT("NULL parameter in wxCreateHiddenWindow") ); + + // register the class fi we need to first + if ( *pclassname == NULL ) + { + WNDCLASS wndclass; + wxZeroMemory(wndclass); + + wndclass.lpfnWndProc = wndproc; + wndclass.hInstance = wxGetInstance(); + wndclass.lpszClassName = classname; + + if ( !::RegisterClass(&wndclass) ) + { + wxLogLastError(wxT("RegisterClass() in wxCreateHiddenWindow")); + + return NULL; + } + + *pclassname = classname; + } + + // next create the window + HWND hwnd = ::CreateWindow + ( + *pclassname, + NULL, + 0, 0, 0, 0, + 0, + (HWND) NULL, + (HMENU)NULL, + wxGetInstance(), + (LPVOID) NULL + ); + + if ( !hwnd ) + { + wxLogLastError(wxT("CreateWindow() in wxCreateHiddenWindow")); + } + + return hwnd; +} diff --git a/installers/patch_wx305_9x/src/msw/window.cpp b/installers/patch_wx305_9x/src/msw/window.cpp new file mode 100644 index 0000000..a1bed46 --- /dev/null +++ b/installers/patch_wx305_9x/src/msw/window.cpp @@ -0,0 +1,7551 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/msw/window.cpp +// Purpose: wxWindowMSW +// Author: Julian Smart +// Modified by: VZ on 13.05.99: no more Default(), MSWOnXXX() reorganisation +// Created: 04/01/98 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// =========================================================================== +// declarations +// =========================================================================== + +// --------------------------------------------------------------------------- +// headers +// --------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/window.h" + +#ifndef WX_PRECOMP + #include "wx/msw/wrapwin.h" + #include "wx/msw/wrapcctl.h" // include "properly" + #include "wx/msw/missing.h" + #include "wx/accel.h" + #include "wx/menu.h" + #include "wx/dc.h" + #include "wx/dcclient.h" + #include "wx/dcmemory.h" + #include "wx/dialog.h" + #include "wx/utils.h" + #include "wx/app.h" + #include "wx/layout.h" + #include "wx/dialog.h" + #include "wx/frame.h" + #include "wx/listbox.h" + #include "wx/button.h" + #include "wx/msgdlg.h" + #include "wx/settings.h" + #include "wx/statbox.h" + #include "wx/sizer.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/textctrl.h" + #include "wx/menuitem.h" + #include "wx/module.h" +#endif + +#if wxUSE_OWNER_DRAWN && !defined(__WXUNIVERSAL__) + #include "wx/ownerdrw.h" +#endif + +#include "wx/hashmap.h" +#include "wx/evtloop.h" +#include "wx/power.h" +#include "wx/scopeguard.h" +#include "wx/sysopt.h" + +#if wxUSE_DRAG_AND_DROP + #include "wx/dnd.h" +#endif + +#if wxUSE_ACCESSIBILITY + #include "wx/access.h" + #include + #include + #ifndef WM_GETOBJECT + #define WM_GETOBJECT 0x003D + #endif + #ifndef OBJID_CLIENT + #define OBJID_CLIENT 0xFFFFFFFC + #endif +#endif + +#include "wx/msw/private.h" +#include "wx/msw/private/keyboard.h" +#include "wx/msw/dcclient.h" +#include "wx/private/textmeasure.h" + +#if wxUSE_TOOLTIPS + #include "wx/tooltip.h" +#endif + +#if wxUSE_CARET + #include "wx/caret.h" +#endif // wxUSE_CARET + +#if wxUSE_RADIOBOX + #include "wx/radiobox.h" +#endif // wxUSE_RADIOBOX + +#if wxUSE_SPINCTRL + #include "wx/spinctrl.h" +#endif // wxUSE_SPINCTRL + +#include "wx/notebook.h" +#include "wx/listctrl.h" +#include "wx/dynlib.h" + +#include + +#if (!defined(__GNUWIN32_OLD__) && !defined(__WXMICROWIN__) /* && !defined(__WXWINCE__) */ ) || defined(__CYGWIN10__) + #include + #include +#endif + +#ifdef __WIN32__ + #include +#endif + +#if defined(__WXWINCE__) + #include "wx/msw/wince/missing.h" +#ifdef __POCKETPC__ + #include + #include + #include + #include +#endif +#endif + +#if wxUSE_UXTHEME + #include "wx/msw/uxtheme.h" + #define EP_EDITTEXT 1 + #define ETS_NORMAL 1 + #define ETS_HOT 2 + #define ETS_SELECTED 3 + #define ETS_DISABLED 4 + #define ETS_FOCUSED 5 + #define ETS_READONLY 6 + #define ETS_ASSIST 7 +#endif + +// define the constants used by AnimateWindow() if our SDK doesn't have them +#ifndef AW_CENTER + #define AW_HOR_POSITIVE 0x00000001 + #define AW_HOR_NEGATIVE 0x00000002 + #define AW_VER_POSITIVE 0x00000004 + #define AW_VER_NEGATIVE 0x00000008 + #define AW_CENTER 0x00000010 + #define AW_HIDE 0x00010000 + #define AW_ACTIVATE 0x00020000 + #define AW_SLIDE 0x00040000 + #define AW_BLEND 0x00080000 +#endif + +#if defined(TME_LEAVE) && defined(WM_MOUSELEAVE) && wxUSE_DYNLIB_CLASS + #define HAVE_TRACKMOUSEEVENT +#endif // everything needed for TrackMouseEvent() + +// set this to 1 to filter out duplicate mouse events, e.g. mouse move events +// when mouse position didnd't change +#ifdef __WXWINCE__ + #define wxUSE_MOUSEEVENT_HACK 0 +#else + #define wxUSE_MOUSEEVENT_HACK 1 +#endif + +// not all compilers/platforms have X button related declarations (notably +// Windows CE doesn't, and probably some old SDKs don't neither) +#ifdef WM_XBUTTONDOWN + #define wxHAS_XBUTTON +#endif + +#ifndef MAPVK_VK_TO_CHAR + #define MAPVK_VK_TO_CHAR 2 +#endif + +// --------------------------------------------------------------------------- +// global variables +// --------------------------------------------------------------------------- + +#if wxUSE_MENUS_NATIVE +extern wxMenu *wxCurrentPopupMenu; +#endif + +#if wxUSE_UXTHEME +// This is a hack used by the owner-drawn wxButton implementation to ensure +// that the brush used for erasing its background is correctly aligned with the +// control. +wxWindowMSW *wxWindowBeingErased = NULL; +#endif // wxUSE_UXTHEME + +namespace +{ + +// true if we had already created the std colour map, used by +// wxGetStdColourMap() and wxWindow::OnSysColourChanged() (FIXME-MT) +bool gs_hasStdCmap = false; + +// last mouse event information we need to filter out the duplicates +#if wxUSE_MOUSEEVENT_HACK +struct MouseEventInfoDummy +{ + // mouse position (in screen coordinates) + wxPoint pos; + + // last mouse event type + wxEventType type; +} gs_lastMouseEvent; +#endif // wxUSE_MOUSEEVENT_HACK + +// hash containing the registered handlers for the custom messages +WX_DECLARE_HASH_MAP(int, wxWindow::MSWMessageHandler, + wxIntegerHash, wxIntegerEqual, + MSWMessageHandlers); + +MSWMessageHandlers gs_messageHandlers; + +// hash containing all our windows, it uses HWND keys and wxWindow* values +WX_DECLARE_HASH_MAP(HWND, wxWindow *, + wxPointerHash, wxPointerEqual, + WindowHandles); + +WindowHandles gs_windowHandles; + +#ifdef wxHAS_MSW_BACKGROUND_ERASE_HOOK + +// temporary override for WM_ERASEBKGND processing: we don't store this in +// wxWindow itself as we don't need it during most of the time so don't +// increase the size of all window objects unnecessarily +WX_DECLARE_HASH_MAP(wxWindow *, wxWindow *, + wxPointerHash, wxPointerEqual, + EraseBgHooks); + +EraseBgHooks gs_eraseBgHooks; + +#endif // wxHAS_MSW_BACKGROUND_ERASE_HOOK + +// If this variable is strictly positive, EVT_CHAR_HOOK is not generated for +// Escape key presses as it can't be intercepted because it's needed by some +// currently shown window, e.g. IME entry. +// +// This is currently global as we allow using UI from the main thread only +// anyhow but could be replaced with a thread-specific value in the future if +// needed. +int gs_modalEntryWindowCount = 0; + +// Indicates whether we are currently processing WM_CAPTURECHANGED message. +bool gs_insideCaptureChanged = false; + +} // anonymous namespace + +// --------------------------------------------------------------------------- +// private functions +// --------------------------------------------------------------------------- + +// the window proc for all our windows +LRESULT WXDLLEXPORT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, + WPARAM wParam, LPARAM lParam); + + +#if wxDEBUG_LEVEL >= 2 + const wxChar *wxGetMessageName(int message); +#endif // wxDEBUG_LEVEL >= 2 + +void wxRemoveHandleAssociation(wxWindowMSW *win); +extern void wxAssociateWinWithHandle(HWND hWnd, wxWindowMSW *win); + +// get the text metrics for the current font +static TEXTMETRIC wxGetTextMetrics(const wxWindowMSW *win); + +#ifdef __WXWINCE__ +// find the window for the mouse event at the specified position +static wxWindowMSW *FindWindowForMouseEvent(wxWindowMSW *win, int *x, int *y); +#endif // __WXWINCE__ + +// wrapper around BringWindowToTop() API +static inline void wxBringWindowToTop(HWND hwnd) +{ +#ifdef __WXMICROWIN__ + // It seems that MicroWindows brings the _parent_ of the window to the top, + // which can be the wrong one. + + // activate (set focus to) specified window + ::SetFocus(hwnd); +#endif + + // raise top level parent to top of z order + if (!::SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE)) + { + wxLogLastError(wxT("SetWindowPos")); + } +} + +#ifndef __WXWINCE__ + +// ensure that all our parent windows have WS_EX_CONTROLPARENT style +static void EnsureParentHasControlParentStyle(wxWindow *parent) +{ + /* + If we have WS_EX_CONTROLPARENT flag we absolutely *must* set it for our + parent as well as otherwise several Win32 functions using + GetNextDlgTabItem() to iterate over all controls such as + IsDialogMessage() or DefDlgProc() would enter an infinite loop: indeed, + all of them iterate over all the controls starting from the currently + focused one and stop iterating when they get back to the focus but + unless all parents have WS_EX_CONTROLPARENT bit set, they would never + get back to the initial (focused) window: as we do have this style, + GetNextDlgTabItem() will leave this window and continue in its parent, + but if the parent doesn't have it, it wouldn't recurse inside it later + on and so wouldn't have a chance of getting back to this window either. + */ + while ( parent && !parent->IsTopLevel() ) + { + LONG exStyle = wxGetWindowExStyle(parent); + if ( !(exStyle & WS_EX_CONTROLPARENT) ) + { + // force the parent to have this style + wxSetWindowExStyle(parent, exStyle | WS_EX_CONTROLPARENT); + } + + parent = parent->GetParent(); + } +} + +#endif // !__WXWINCE__ + +// GetCursorPos can return an error, so use this function +// instead. +// Error originally observed with WinCE, but later using Remote Desktop +// to connect to XP. +void wxGetCursorPosMSW(POINT* pt) +{ + if (!GetCursorPos(pt)) + { +#ifdef __WXWINCE__ + wxLogLastError(wxT("GetCursorPos")); +#endif + DWORD pos = GetMessagePos(); + // the coordinates may be negative in multi-monitor systems + pt->x = GET_X_LPARAM(pos); + pt->y = GET_Y_LPARAM(pos); + } +} + +// --------------------------------------------------------------------------- +// event tables +// --------------------------------------------------------------------------- + +// in wxUniv/MSW this class is abstract because it doesn't have DoPopupMenu() +// method +#ifdef __WXUNIVERSAL__ + IMPLEMENT_ABSTRACT_CLASS(wxWindowMSW, wxWindowBase) +#endif // __WXUNIVERSAL__ + +BEGIN_EVENT_TABLE(wxWindowMSW, wxWindowBase) + EVT_SYS_COLOUR_CHANGED(wxWindowMSW::OnSysColourChanged) +#ifdef __WXWINCE__ + EVT_INIT_DIALOG(wxWindowMSW::OnInitDialog) +#endif +END_EVENT_TABLE() + +// =========================================================================== +// implementation +// =========================================================================== + +// --------------------------------------------------------------------------- +// wxWindow utility functions +// --------------------------------------------------------------------------- + +// Find an item given the MS Windows id +wxWindow *wxWindowMSW::FindItem(long id, WXHWND hWnd) const +{ + // First check for the control itself and its Windows-level children which + // are mapped to the same wxWindow at wx level. + wxWindow *wnd = MSWFindItem(id, hWnd); + if ( wnd ) + return wnd; + + // Then check wx level children. + wxWindowList::compatibility_iterator current = GetChildren().GetFirst(); + while (current) + { + wxWindow *childWin = current->GetData(); + + wnd = childWin->FindItem(id, hWnd); + if ( wnd ) + return wnd; + + current = current->GetNext(); + } + + return NULL; +} + +// Find an item given the MS Windows handle +wxWindow *wxWindowMSW::FindItemByHWND(WXHWND hWnd, bool controlOnly) const +{ + wxWindowList::compatibility_iterator current = GetChildren().GetFirst(); + while (current) + { + wxWindow *parent = current->GetData(); + + // Do a recursive search. + wxWindow *wnd = parent->FindItemByHWND(hWnd); + if ( wnd ) + return wnd; + + if ( !controlOnly +#if wxUSE_CONTROLS + || wxDynamicCast(parent, wxControl) +#endif // wxUSE_CONTROLS + ) + { + wxWindow *item = current->GetData(); + if ( item->GetHWND() == hWnd ) + return item; + else + { + if ( item->ContainsHWND(hWnd) ) + return item; + } + } + + current = current->GetNext(); + } + return NULL; +} + +// Default command handler +bool wxWindowMSW::MSWCommand(WXUINT WXUNUSED(param), WXWORD WXUNUSED(id)) +{ + return false; +} + +// ---------------------------------------------------------------------------- +// constructors and such +// ---------------------------------------------------------------------------- + +void wxWindowMSW::Init() +{ + // MSW specific + m_oldWndProc = NULL; + m_mouseInWindow = false; + m_lastKeydownProcessed = false; + + m_hWnd = 0; + + m_xThumbSize = 0; + m_yThumbSize = 0; + +#if wxUSE_DEFERRED_SIZING + m_hDWP = 0; + m_pendingPosition = wxDefaultPosition; + m_pendingSize = wxDefaultSize; +#endif // wxUSE_DEFERRED_SIZING + +#ifdef __POCKETPC__ + m_contextMenuEnabled = false; +#endif +} + +// Destructor +wxWindowMSW::~wxWindowMSW() +{ + SendDestroyEvent(); + +#ifndef __WXUNIVERSAL__ + // VS: make sure there's no wxFrame with last focus set to us: + for ( wxWindow *win = GetParent(); win; win = win->GetParent() ) + { + wxTopLevelWindow *frame = wxDynamicCast(win, wxTopLevelWindow); + if ( frame ) + { + if ( frame->GetLastFocus() == this ) + { + frame->SetLastFocus(NULL); + } + + // apparently sometimes we can end up with our grand parent + // pointing to us as well: this is surely a bug in focus handling + // code but it's not clear where it happens so for now just try to + // fix it here by not breaking out of the loop + //break; + } + } +#endif // __WXUNIVERSAL__ + + // VS: destroy children first and _then_ detach *this from its parent. + // If we did it the other way around, children wouldn't be able + // find their parent frame (see above). + DestroyChildren(); + + if ( m_hWnd ) + { + // VZ: test temp removed to understand what really happens here + //if (::IsWindow(GetHwnd())) + { + if ( !::DestroyWindow(GetHwnd()) ) + { + wxLogLastError(wxT("DestroyWindow")); + } + } + + // remove hWnd <-> wxWindow association + wxRemoveHandleAssociation(this); + } + +} + +/* static */ +const wxChar *wxWindowMSW::MSWGetRegisteredClassName() +{ + return wxApp::GetRegisteredClassName(wxT("wxWindow"), COLOR_BTNFACE); +} + +// real construction (Init() must have been called before!) +bool wxWindowMSW::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + wxCHECK_MSG( parent, false, wxT("can't create wxWindow without parent") ); + + if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) ) + return false; + + parent->AddChild(this); + + WXDWORD exstyle; + DWORD msflags = MSWGetCreateWindowFlags(&exstyle); + +#ifdef __WXUNIVERSAL__ + // no borders, we draw them ourselves + exstyle &= ~(WS_EX_DLGMODALFRAME | + WS_EX_STATICEDGE | + WS_EX_CLIENTEDGE | + WS_EX_WINDOWEDGE); + msflags &= ~WS_BORDER; +#endif // wxUniversal + + if ( IsShown() ) + { + msflags |= WS_VISIBLE; + } + + if ( !MSWCreate(MSWGetRegisteredClassName(), + NULL, pos, size, msflags, exstyle) ) + return false; + + InheritAttributes(); + + return true; +} + +// --------------------------------------------------------------------------- +// basic operations +// --------------------------------------------------------------------------- + +void wxWindowMSW::SetFocus() +{ + HWND hWnd = GetHwnd(); + wxCHECK_RET( hWnd, wxT("can't set focus to invalid window") ); + +#if !defined(__WXWINCE__) + ::SetLastError(0); +#endif + + if ( !::SetFocus(hWnd) ) + { + // was there really an error? + DWORD dwRes = ::GetLastError(); + if ( dwRes ) + { + HWND hwndFocus = ::GetFocus(); + if ( hwndFocus != hWnd ) + { + wxLogApiError(wxT("SetFocus"), dwRes); + } + } + } +} + +void wxWindowMSW::SetFocusFromKbd() +{ + // when the focus is given to the control with DLGC_HASSETSEL style from + // keyboard its contents should be entirely selected: this is what + // ::IsDialogMessage() does and so we should do it as well to provide the + // same LNF as the native programs + if ( ::SendMessage(GetHwnd(), WM_GETDLGCODE, 0, 0) & DLGC_HASSETSEL ) + { + ::SendMessage(GetHwnd(), EM_SETSEL, 0, -1); + } + + // do this after (maybe) setting the selection as like this when + // wxEVT_SET_FOCUS handler is called, the selection would have been already + // set correctly -- this may be important + wxWindowBase::SetFocusFromKbd(); +} + +// Get the window with the focus +wxWindow *wxWindowBase::DoFindFocus() +{ + HWND hWnd = ::GetFocus(); + if ( hWnd ) + { + return wxGetWindowFromHWND((WXHWND)hWnd); + } + + return NULL; +} + +void wxWindowMSW::DoEnable( bool enable ) +{ + MSWEnableHWND(GetHwnd(), enable); +} + +bool wxWindowMSW::MSWEnableHWND(WXHWND hWnd, bool enable) +{ + if ( !hWnd ) + return false; + + // If disabling focused control, we move focus to the next one, as if the + // user pressed Tab. That's because we can't keep focus on a disabled + // control, Tab-navigation would stop working then. + if ( !enable && ::GetFocus() == hWnd ) + Navigate(); + + return ::EnableWindow(hWnd, (BOOL)enable) != 0; +} + +bool wxWindowMSW::Show(bool show) +{ + if ( !wxWindowBase::Show(show) ) + return false; + + HWND hWnd = GetHwnd(); + + // we could be called before the underlying window is created (this is + // actually useful to prevent it from being initially shown), e.g. + // + // wxFoo *foo = new wxFoo; + // foo->Hide(); + // foo->Create(parent, ...); + // + // should work without errors + if ( hWnd ) + { + ::ShowWindow(hWnd, show ? SW_SHOW : SW_HIDE); + } + + if ( IsFrozen() ) + { + // DoFreeze/DoThaw don't do anything if the window is not shown, so + // we have to call them from here now + if ( show ) + DoFreeze(); + else + DoThaw(); + } + + return true; +} + +bool +wxWindowMSW::MSWShowWithEffect(bool show, + wxShowEffect effect, + unsigned timeout) +{ +#if wxUSE_DYNLIB_CLASS + if ( effect == wxSHOW_EFFECT_NONE || + (GetParent() && !GetParent()->IsShownOnScreen()) ) + return Show(show); + + if ( !wxWindowBase::Show(show) ) + return false; + + typedef BOOL (WINAPI *AnimateWindow_t)(HWND, DWORD, DWORD); + + static AnimateWindow_t s_pfnAnimateWindow = NULL; + static bool s_initDone = false; + if ( !s_initDone ) + { + wxDynamicLibrary dllUser32(wxT("user32.dll"), wxDL_VERBATIM | wxDL_QUIET); + wxDL_INIT_FUNC(s_pfn, AnimateWindow, dllUser32); + + s_initDone = true; + + // notice that it's ok to unload user32.dll here as it won't be really + // unloaded, being still in use because we link to it statically too + } + + if ( !s_pfnAnimateWindow ) + return Show(show); + + // Show() has a side effect of sending a WM_SIZE to the window, which helps + // ensuring that it's laid out correctly, but AnimateWindow() doesn't do + // this so send the event ourselves + SendSizeEvent(); + + // prepare to use AnimateWindow() + + if ( !timeout ) + timeout = 200; // this is the default animation timeout, per MSDN + + DWORD dwFlags = show ? 0 : AW_HIDE; + + switch ( effect ) + { + case wxSHOW_EFFECT_ROLL_TO_LEFT: + dwFlags |= AW_HOR_NEGATIVE; + break; + + case wxSHOW_EFFECT_ROLL_TO_RIGHT: + dwFlags |= AW_HOR_POSITIVE; + break; + + case wxSHOW_EFFECT_ROLL_TO_TOP: + dwFlags |= AW_VER_NEGATIVE; + break; + + case wxSHOW_EFFECT_ROLL_TO_BOTTOM: + dwFlags |= AW_VER_POSITIVE; + break; + + case wxSHOW_EFFECT_SLIDE_TO_LEFT: + dwFlags |= AW_SLIDE | AW_HOR_NEGATIVE; + break; + + case wxSHOW_EFFECT_SLIDE_TO_RIGHT: + dwFlags |= AW_SLIDE | AW_HOR_POSITIVE; + break; + + case wxSHOW_EFFECT_SLIDE_TO_TOP: + dwFlags |= AW_SLIDE | AW_VER_NEGATIVE; + break; + + case wxSHOW_EFFECT_SLIDE_TO_BOTTOM: + dwFlags |= AW_SLIDE | AW_VER_POSITIVE; + break; + + case wxSHOW_EFFECT_BLEND: + dwFlags |= AW_BLEND; + break; + + case wxSHOW_EFFECT_EXPAND: + dwFlags |= AW_CENTER; + break; + + + case wxSHOW_EFFECT_MAX: + wxFAIL_MSG( wxT("invalid window show effect") ); + return false; + + default: + wxFAIL_MSG( wxT("unknown window show effect") ); + return false; + } + + if ( !(*s_pfnAnimateWindow)(GetHwnd(), timeout, dwFlags) ) + { + wxLogLastError(wxT("AnimateWindow")); + + return false; + } + + return true; +#else // wxUSE_DYNLIB_CLASS + return Show(show); +#endif +} + +// Raise the window to the top of the Z order +void wxWindowMSW::Raise() +{ + wxBringWindowToTop(GetHwnd()); +} + +// Lower the window to the bottom of the Z order +void wxWindowMSW::Lower() +{ + ::SetWindowPos(GetHwnd(), HWND_BOTTOM, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); +} + +void wxWindowMSW::DoCaptureMouse() +{ + HWND hWnd = GetHwnd(); + if ( hWnd ) + { + ::SetCapture(hWnd); + } +} + +void wxWindowMSW::DoReleaseMouse() +{ + if ( !::ReleaseCapture() ) + { + wxLogLastError(wxT("ReleaseCapture")); + } +} + +/* static */ wxWindow *wxWindowBase::GetCapture() +{ + // When we receive WM_CAPTURECHANGED message, ::GetCapture() still returns + // the HWND that is losing the mouse capture. But as we must not release + // the capture for it (it's going to happen anyhow), pretend that there is + // no capture any more. + if ( gs_insideCaptureChanged ) + return NULL; + + HWND hwnd = ::GetCapture(); + return hwnd ? wxFindWinFromHandle(hwnd) : NULL; +} + +bool wxWindowMSW::SetFont(const wxFont& font) +{ + if ( !wxWindowBase::SetFont(font) ) + { + // nothing to do + return false; + } + + HWND hWnd = GetHwnd(); + if ( hWnd != 0 ) + { + // note the use of GetFont() instead of m_font: our own font could have + // just been reset and in this case we need to change the font used by + // the native window to the default for this class, i.e. exactly what + // GetFont() returns + WXHANDLE hFont = GetFont().GetResourceHandle(); + + wxASSERT_MSG( hFont, wxT("should have valid font") ); + + ::SendMessage(hWnd, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0)); + } + + return true; +} + +bool wxWindowMSW::SetCursor(const wxCursor& cursor) +{ + if ( !wxWindowBase::SetCursor(cursor) ) + { + // no change + return false; + } + + // don't "overwrite" busy cursor + if ( wxIsBusy() ) + return true; + + if ( m_cursor.IsOk() ) + { + // normally we should change the cursor only if it's over this window + // but we should do it always if we capture the mouse currently + bool set = HasCapture(); + if ( !set ) + { + HWND hWnd = GetHwnd(); + + POINT point; + ::wxGetCursorPosMSW(&point); + + RECT rect = wxGetWindowRect(hWnd); + + set = ::PtInRect(&rect, point) != 0; + } + + if ( set ) + { + ::SetCursor(GetHcursorOf(m_cursor)); + } + //else: will be set later when the mouse enters this window + } + else // Invalid cursor: this means reset to the default one. + { + // To revert to the correct cursor we need to find the window currently + // under the cursor and ask it to set its cursor itself as only it + // knows what it is. + POINT pt; + wxGetCursorPosMSW(&pt); + + const wxWindowMSW* win = wxFindWindowAtPoint(wxPoint(pt.x, pt.y)); + if ( !win ) + win = this; + + ::SendMessage(GetHwndOf(win), WM_SETCURSOR, + (WPARAM)GetHwndOf(win), + MAKELPARAM(HTCLIENT, WM_MOUSEMOVE)); + } + + return true; +} + +void wxWindowMSW::WarpPointer(int x, int y) +{ + ClientToScreen(&x, &y); + + if ( !::SetCursorPos(x, y) ) + { + wxLogLastError(wxT("SetCursorPos")); + } +} + +void wxWindowMSW::MSWUpdateUIState(int action, int state) +{ + // WM_CHANGEUISTATE only appeared in Windows 2000 so it can do us no good + // to use it on older systems -- and could possibly do some harm + static int s_needToUpdate = -1; + if ( s_needToUpdate == -1 ) + { + int verMaj, verMin; + s_needToUpdate = wxGetOsVersion(&verMaj, &verMin) == wxOS_WINDOWS_NT && + verMaj >= 5; + } + + if ( s_needToUpdate ) + { + // we send WM_CHANGEUISTATE so if nothing needs changing then the system + // won't send WM_UPDATEUISTATE + ::SendMessage(GetHwnd(), WM_CHANGEUISTATE, MAKEWPARAM(action, state), 0); + } +} + +// --------------------------------------------------------------------------- +// scrolling stuff +// --------------------------------------------------------------------------- + +namespace +{ + +inline int GetScrollPosition(HWND hWnd, int wOrient) +{ +#ifdef __WXMICROWIN__ + return ::GetScrollPosWX(hWnd, wOrient); +#else + WinStruct scrollInfo; + scrollInfo.cbSize = sizeof(SCROLLINFO); + scrollInfo.fMask = SIF_POS; + ::GetScrollInfo(hWnd, wOrient, &scrollInfo ); + + return scrollInfo.nPos; + +#endif +} + +inline UINT WXOrientToSB(int orient) +{ + return orient == wxHORIZONTAL ? SB_HORZ : SB_VERT; +} + +} // anonymous namespace + +int wxWindowMSW::GetScrollPos(int orient) const +{ + HWND hWnd = GetHwnd(); + wxCHECK_MSG( hWnd, 0, wxT("no HWND in GetScrollPos") ); + + return GetScrollPosition(hWnd, WXOrientToSB(orient)); +} + +// This now returns the whole range, not just the number +// of positions that we can scroll. +int wxWindowMSW::GetScrollRange(int orient) const +{ + int maxPos; + HWND hWnd = GetHwnd(); + if ( !hWnd ) + return 0; + WinStruct scrollInfo; + scrollInfo.fMask = SIF_RANGE; + if ( !::GetScrollInfo(hWnd, WXOrientToSB(orient), &scrollInfo) ) + { + // Most of the time this is not really an error, since the return + // value can also be zero when there is no scrollbar yet. + // wxLogLastError(wxT("GetScrollInfo")); + } + maxPos = scrollInfo.nMax; + + // undo "range - 1" done in SetScrollbar() + return maxPos + 1; +} + +int wxWindowMSW::GetScrollThumb(int orient) const +{ + return orient == wxHORIZONTAL ? m_xThumbSize : m_yThumbSize; +} + +void wxWindowMSW::SetScrollPos(int orient, int pos, bool refresh) +{ + HWND hWnd = GetHwnd(); + wxCHECK_RET( hWnd, wxT("SetScrollPos: no HWND") ); + + WinStruct info; + info.nPage = 0; + info.nMin = 0; + info.nPos = pos; + info.fMask = SIF_POS; + if ( HasFlag(wxALWAYS_SHOW_SB) ) + { + // disable scrollbar instead of removing it then + info.fMask |= SIF_DISABLENOSCROLL; + } + + ::SetScrollInfo(hWnd, WXOrientToSB(orient), &info, refresh); +} + +// New function that will replace some of the above. +void wxWindowMSW::SetScrollbar(int orient, + int pos, + int pageSize, + int range, + bool refresh) +{ + // We have to set the variables here to make them valid in events + // triggered by ::SetScrollInfo() + *(orient == wxHORIZONTAL ? &m_xThumbSize : &m_yThumbSize) = pageSize; + + HWND hwnd = GetHwnd(); + if ( !hwnd ) + return; + + WinStruct info; + if ( range != -1 ) + { + info.nPage = pageSize; + info.nMin = 0; // range is nMax - nMin + 1 + info.nMax = range - 1; // as both nMax and nMax are inclusive + info.nPos = pos; + + // We normally also reenable scrollbar in case it had been previously + // disabled by specifying SIF_DISABLENOSCROLL below but we should only + // do this if it has valid range, otherwise it would be enabled but not + // do anything. + if ( range >= pageSize ) + { + ::EnableScrollBar(hwnd, WXOrientToSB(orient), ESB_ENABLE_BOTH); + } + } + //else: leave all the fields to be 0 + + info.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; + if ( HasFlag(wxALWAYS_SHOW_SB) || range == -1 ) + { + // disable scrollbar instead of removing it then + info.fMask |= SIF_DISABLENOSCROLL; + } + + ::SetScrollInfo(hwnd, WXOrientToSB(orient), &info, refresh); +} + +void wxWindowMSW::ScrollWindow(int dx, int dy, const wxRect *prect) +{ + RECT rect; + RECT *pr; + if ( prect ) + { + wxCopyRectToRECT(*prect, rect); + pr = ▭ + } + else + { + pr = NULL; + + } + +#ifdef __WXWINCE__ + // FIXME: is this the exact equivalent of the line below? + ::ScrollWindowEx(GetHwnd(), dx, dy, pr, pr, 0, 0, SW_SCROLLCHILDREN|SW_ERASE|SW_INVALIDATE); +#else + ::ScrollWindow(GetHwnd(), dx, dy, pr, pr); +#endif +} + +static bool ScrollVertically(HWND hwnd, int kind, int count) +{ + int posStart = GetScrollPosition(hwnd, SB_VERT); + + int pos = posStart; + for ( int n = 0; n < count; n++ ) + { + ::SendMessage(hwnd, WM_VSCROLL, kind, 0); + + int posNew = GetScrollPosition(hwnd, SB_VERT); + if ( posNew == pos ) + { + // don't bother to continue, we're already at top/bottom + break; + } + + pos = posNew; + } + + return pos != posStart; +} + +bool wxWindowMSW::ScrollLines(int lines) +{ + bool down = lines > 0; + + return ScrollVertically(GetHwnd(), + down ? SB_LINEDOWN : SB_LINEUP, + down ? lines : -lines); +} + +bool wxWindowMSW::ScrollPages(int pages) +{ + bool down = pages > 0; + + return ScrollVertically(GetHwnd(), + down ? SB_PAGEDOWN : SB_PAGEUP, + down ? pages : -pages); +} + +// ---------------------------------------------------------------------------- +// RTL support +// ---------------------------------------------------------------------------- + +void wxWindowMSW::SetLayoutDirection(wxLayoutDirection dir) +{ +#ifdef __WXWINCE__ + wxUnusedVar(dir); +#else + wxCHECK_RET( GetHwnd(), + wxT("layout direction must be set after window creation") ); + + LONG styleOld = wxGetWindowExStyle(this); + + LONG styleNew = styleOld; + switch ( dir ) + { + case wxLayout_LeftToRight: + styleNew &= ~WS_EX_LAYOUTRTL; + break; + + case wxLayout_RightToLeft: + styleNew |= WS_EX_LAYOUTRTL; + break; + + default: + wxFAIL_MSG(wxT("unsupported layout direction")); + break; + } + + if ( styleNew != styleOld ) + { + wxSetWindowExStyle(this, styleNew); + + // Update layout: whether we have children or are drawing something, we + // need to redo it with the new layout. + SendSizeEvent(); + Refresh(); + } +#endif +} + +wxLayoutDirection wxWindowMSW::GetLayoutDirection() const +{ +#ifdef __WXWINCE__ + return wxLayout_Default; +#else + wxCHECK_MSG( GetHwnd(), wxLayout_Default, wxT("invalid window") ); + + return wxHasWindowExStyle(this, WS_EX_LAYOUTRTL) ? wxLayout_RightToLeft + : wxLayout_LeftToRight; +#endif +} + +wxCoord +wxWindowMSW::AdjustForLayoutDirection(wxCoord x, + wxCoord WXUNUSED(width), + wxCoord WXUNUSED(widthTotal)) const +{ + // Win32 mirrors the coordinates of RTL windows automatically, so don't + // redo it ourselves + return x; +} + +// --------------------------------------------------------------------------- +// subclassing +// --------------------------------------------------------------------------- + +void wxWindowMSW::SubclassWin(WXHWND hWnd) +{ + wxASSERT_MSG( !m_oldWndProc, wxT("subclassing window twice?") ); + + HWND hwnd = (HWND)hWnd; + wxCHECK_RET( ::IsWindow(hwnd), wxT("invalid HWND in SubclassWin") ); + + SetHWND(hWnd); + + wxAssociateWinWithHandle(hwnd, this); + + m_oldWndProc = (WXFARPROC)wxGetWindowProc((HWND)hWnd); + + // we don't need to subclass the window of our own class (in the Windows + // sense of the word) + if ( !wxCheckWindowWndProc(hWnd, (WXFARPROC)wxWndProc) ) + { + wxSetWindowProc(hwnd, wxWndProc); + + // If the window didn't use our window proc during its creation, the + // code in HandleCreate() hasn't been executed, so do it here. + if ( wxHasWindowExStyle(this, WS_EX_CONTROLPARENT) ) + EnsureParentHasControlParentStyle(GetParent()); + } + else + { + // don't bother restoring it either: this also makes it easy to + // implement IsOfStandardClass() method which returns true for the + // standard controls and false for the wxWidgets own windows as it can + // simply check m_oldWndProc + m_oldWndProc = NULL; + } + + // we're officially created now, send the event + wxWindowCreateEvent event((wxWindow *)this); + (void)HandleWindowEvent(event); +} + +void wxWindowMSW::UnsubclassWin() +{ + wxRemoveHandleAssociation(this); + + // Restore old Window proc + HWND hwnd = GetHwnd(); + if ( hwnd ) + { + SetHWND(0); + + wxCHECK_RET( ::IsWindow(hwnd), wxT("invalid HWND in UnsubclassWin") ); + + if ( m_oldWndProc ) + { + if ( !wxCheckWindowWndProc((WXHWND)hwnd, m_oldWndProc) ) + { + wxSetWindowProc(hwnd, (WNDPROC)m_oldWndProc); + } + + m_oldWndProc = NULL; + } + } +} + +void wxWindowMSW::AssociateHandle(WXWidget handle) +{ + if ( m_hWnd ) + { + if ( !::DestroyWindow(GetHwnd()) ) + { + wxLogLastError(wxT("DestroyWindow")); + } + } + + WXHWND wxhwnd = (WXHWND)handle; + + // this also calls SetHWND(wxhwnd) + SubclassWin(wxhwnd); +} + +void wxWindowMSW::DissociateHandle() +{ + // this also calls SetHWND(0) for us + UnsubclassWin(); +} + + +bool wxCheckWindowWndProc(WXHWND hWnd, + WXFARPROC WXUNUSED(wndProc)) +{ + const wxString str(wxGetWindowClass(hWnd)); + + // TODO: get rid of wxTLWHiddenParent special case (currently it's not + // registered by wxApp but using ad hoc code in msw/toplevel.cpp); + // there is also a hidden window class used by sockets &c + return wxApp::IsRegisteredClassName(str) || str == wxT("wxTLWHiddenParent"); +} + +// ---------------------------------------------------------------------------- +// Style handling +// ---------------------------------------------------------------------------- + +void wxWindowMSW::SetWindowStyleFlag(long flags) +{ + long flagsOld = GetWindowStyleFlag(); + if ( flags == flagsOld ) + return; + + // update the internal variable + wxWindowBase::SetWindowStyleFlag(flags); + + // and the real window flags + MSWUpdateStyle(flagsOld, GetExtraStyle()); +} + +void wxWindowMSW::SetExtraStyle(long exflags) +{ + long exflagsOld = GetExtraStyle(); + if ( exflags == exflagsOld ) + return; + + // update the internal variable + wxWindowBase::SetExtraStyle(exflags); + + // and the real window flags + MSWUpdateStyle(GetWindowStyleFlag(), exflagsOld); +} + +void wxWindowMSW::MSWUpdateStyle(long flagsOld, long exflagsOld) +{ + // now update the Windows style as well if needed - and if the window had + // been already created + if ( !GetHwnd() ) + return; + + // we may need to call SetWindowPos() when we change some styles + bool callSWP = false; + + WXDWORD exstyle; + long style = MSWGetStyle(GetWindowStyleFlag(), &exstyle); + + // this is quite a horrible hack but we need it because MSWGetStyle() + // doesn't take exflags as parameter but uses GetExtraStyle() internally + // and so we have to modify the window exflags temporarily to get the + // correct exstyleOld + long exflagsNew = GetExtraStyle(); + wxWindowBase::SetExtraStyle(exflagsOld); + + WXDWORD exstyleOld; + long styleOld = MSWGetStyle(flagsOld, &exstyleOld); + + wxWindowBase::SetExtraStyle(exflagsNew); + + + if ( style != styleOld ) + { + // some flags (e.g. WS_VISIBLE or WS_DISABLED) should not be changed by + // this function so instead of simply setting the style to the new + // value we clear the bits which were set in styleOld but are set in + // the new one and set the ones which were not set before + long styleReal = ::GetWindowLong(GetHwnd(), GWL_STYLE); + styleReal &= ~styleOld; + styleReal |= style; + + ::SetWindowLong(GetHwnd(), GWL_STYLE, styleReal); + + // we need to call SetWindowPos() if any of the styles affecting the + // frame appearance have changed + callSWP = ((styleOld ^ style ) & (WS_BORDER | + WS_THICKFRAME | + WS_CAPTION | + WS_DLGFRAME | + WS_MAXIMIZEBOX | + WS_MINIMIZEBOX | + WS_SYSMENU) ) != 0; + } + + // and the extended style + long exstyleReal = wxGetWindowExStyle(this); + + if ( exstyle != exstyleOld ) + { + exstyleReal &= ~exstyleOld; + exstyleReal |= exstyle; + + wxSetWindowExStyle(this, exstyleReal); + + // ex style changes don't take effect without calling SetWindowPos + callSWP = true; + } + + if ( callSWP ) + { + // we must call SetWindowPos() to flush the cached extended style and + // also to make the change to wxSTAY_ON_TOP style take effect: just + // setting the style simply doesn't work + if ( !::SetWindowPos(GetHwnd(), + exstyleReal & WS_EX_TOPMOST ? HWND_TOPMOST + : HWND_NOTOPMOST, + 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | + SWP_FRAMECHANGED) ) + { + wxLogLastError(wxT("SetWindowPos")); + } + } +} + +wxBorder wxWindowMSW::GetDefaultBorderForControl() const +{ + return wxBORDER_THEME; +} + +wxBorder wxWindowMSW::GetDefaultBorder() const +{ + return wxWindowBase::GetDefaultBorder(); +} + +// Translate wxBORDER_THEME (and other border styles if necessary) to the value +// that makes most sense for this Windows environment +wxBorder wxWindowMSW::TranslateBorder(wxBorder border) const +{ +#if defined(__POCKETPC__) || defined(__SMARTPHONE__) + if (border == wxBORDER_THEME || border == wxBORDER_SUNKEN || border == wxBORDER_SIMPLE) + return wxBORDER_SIMPLE; + else + return wxBORDER_NONE; +#else +#if wxUSE_UXTHEME + if (border == wxBORDER_THEME) + { + if (CanApplyThemeBorder()) + { + wxUxThemeEngine* theme = wxUxThemeEngine::GetIfActive(); + if (theme) + return wxBORDER_THEME; + } + return wxBORDER_SUNKEN; + } +#endif + return border; +#endif +} + + +WXDWORD wxWindowMSW::MSWGetStyle(long flags, WXDWORD *exstyle) const +{ + // translate common wxWidgets styles to Windows ones + + // most of windows are child ones, those which are not (such as + // wxTopLevelWindow) should remove WS_CHILD in their MSWGetStyle() + WXDWORD style = WS_CHILD; + + // using this flag results in very significant reduction in flicker, + // especially with controls inside the static boxes (as the interior of the + // box is not redrawn twice), but sometimes results in redraw problems, so + // optionally allow the old code to continue to use it provided a special + // system option is turned on + if ( !wxSystemOptions::GetOptionInt(wxT("msw.window.no-clip-children")) + || (flags & wxCLIP_CHILDREN) ) + style |= WS_CLIPCHILDREN; + + // it doesn't seem useful to use WS_CLIPSIBLINGS here as we officially + // don't support overlapping windows and it only makes sense for them and, + // presumably, gives the system some extra work (to manage more clipping + // regions), so avoid it altogether + + + if ( flags & wxVSCROLL ) + style |= WS_VSCROLL; + + if ( flags & wxHSCROLL ) + style |= WS_HSCROLL; + + const wxBorder border = TranslateBorder(GetBorder(flags)); + + // After translation, border is now optimized for the specific version of Windows + // and theme engine presence. + + // WS_BORDER is only required for wxBORDER_SIMPLE + if ( border == wxBORDER_SIMPLE ) + style |= WS_BORDER; + + // now deal with ext style if the caller wants it + if ( exstyle ) + { + *exstyle = 0; + +#ifndef __WXWINCE__ + if ( flags & wxTRANSPARENT_WINDOW ) + *exstyle |= WS_EX_TRANSPARENT; +#endif + + switch ( border ) + { + default: + case wxBORDER_DEFAULT: + wxFAIL_MSG( wxT("unknown border style") ); + // fall through + + case wxBORDER_NONE: + case wxBORDER_SIMPLE: + case wxBORDER_THEME: + break; + + case wxBORDER_STATIC: + *exstyle |= WS_EX_STATICEDGE; + break; + + case wxBORDER_RAISED: + *exstyle |= WS_EX_DLGMODALFRAME; + break; + + case wxBORDER_SUNKEN: + *exstyle |= WS_EX_CLIENTEDGE; + style &= ~WS_BORDER; + break; + +// case wxBORDER_DOUBLE: +// *exstyle |= WS_EX_DLGMODALFRAME; +// break; + } + + // wxUniv doesn't use Windows dialog navigation functions at all +#if !defined(__WXUNIVERSAL__) && !defined(__WXWINCE__) + // to make the dialog navigation work with the nested panels we must + // use this style (top level windows such as dialogs don't need it) + if ( (flags & wxTAB_TRAVERSAL) && !IsTopLevel() ) + { + *exstyle |= WS_EX_CONTROLPARENT; + } +#endif // __WXUNIVERSAL__ + } + + return style; +} + +// Setup background and foreground colours correctly +void wxWindowMSW::SetupColours() +{ + if ( GetParent() ) + SetBackgroundColour(GetParent()->GetBackgroundColour()); +} + +bool wxWindowMSW::IsMouseInWindow() const +{ + // get the mouse position + POINT pt; + wxGetCursorPosMSW(&pt); + + // find the window which currently has the cursor and go up the window + // chain until we find this window - or exhaust it + HWND hwnd = ::WindowFromPoint(pt); + while ( hwnd && (hwnd != GetHwnd()) ) + hwnd = ::GetParent(hwnd); + + return hwnd != NULL; +} + +void wxWindowMSW::OnInternalIdle() +{ +#ifndef HAVE_TRACKMOUSEEVENT + // Check if we need to send a LEAVE event + if ( m_mouseInWindow ) + { + // note that we should generate the leave event whether the window has + // or doesn't have mouse capture + if ( !IsMouseInWindow() ) + { + GenerateMouseLeave(); + } + } +#endif // !HAVE_TRACKMOUSEEVENT + + wxWindowBase::OnInternalIdle(); +} + +// Set this window to be the child of 'parent'. +bool wxWindowMSW::Reparent(wxWindowBase *parent) +{ + if ( !wxWindowBase::Reparent(parent) ) + return false; + + HWND hWndChild = GetHwnd(); + HWND hWndParent = GetParent() ? GetWinHwnd(GetParent()) : (HWND)0; + + ::SetParent(hWndChild, hWndParent); + +#ifndef __WXWINCE__ + if ( wxHasWindowExStyle(this, WS_EX_CONTROLPARENT) ) + { + EnsureParentHasControlParentStyle(GetParent()); + } +#endif // !__WXWINCE__ + + return true; +} + +static inline void SendSetRedraw(HWND hwnd, bool on) +{ +#ifndef __WXMICROWIN__ + ::SendMessage(hwnd, WM_SETREDRAW, (WPARAM)on, 0); +#endif +} + +void wxWindowMSW::DoFreeze() +{ + if ( !IsShown() ) + return; // no point in freezing hidden window + + SendSetRedraw(GetHwnd(), false); +} + +void wxWindowMSW::DoThaw() +{ + if ( !IsShown() ) + return; // hidden windows aren't frozen by DoFreeze + + SendSetRedraw(GetHwnd(), true); + + // we need to refresh everything or otherwise the invalidated area + // is not going to be repainted + Refresh(); +} + +void wxWindowMSW::Refresh(bool eraseBack, const wxRect *rect) +{ + HWND hWnd = GetHwnd(); + if ( hWnd ) + { + RECT mswRect; + const RECT *pRect; + if ( rect ) + { + wxCopyRectToRECT(*rect, mswRect); + pRect = &mswRect; + } + else + { + pRect = NULL; + } + + // RedrawWindow not available on SmartPhone or eVC++ 3 +#if !defined(__SMARTPHONE__) && !(defined(_WIN32_WCE) && _WIN32_WCE < 400) + UINT flags = RDW_INVALIDATE | RDW_ALLCHILDREN; + if ( eraseBack ) + flags |= RDW_ERASE; + + ::RedrawWindow(hWnd, pRect, NULL, flags); +#else + ::InvalidateRect(hWnd, pRect, eraseBack); +#endif + } +} + +void wxWindowMSW::Update() +{ + if ( !::UpdateWindow(GetHwnd()) ) + { + wxLogLastError(wxT("UpdateWindow")); + } + +#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) + // just calling UpdateWindow() is not enough, what we did in our WM_PAINT + // handler needs to be really drawn right now + (void)::GdiFlush(); +#endif // __WIN32__ +} + +// --------------------------------------------------------------------------- +// drag and drop +// --------------------------------------------------------------------------- + +#if wxUSE_DRAG_AND_DROP || !defined(__WXWINCE__) + +#if wxUSE_STATBOX + +// we need to lower the sibling static boxes so controls contained within can be +// a drop target +static void AdjustStaticBoxZOrder(wxWindow *parent) +{ + // no sibling static boxes if we have no parent (ie TLW) + if ( !parent ) + return; + + for ( wxWindowList::compatibility_iterator node = parent->GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + wxStaticBox *statbox = wxDynamicCast(node->GetData(), wxStaticBox); + if ( statbox ) + { + ::SetWindowPos(GetHwndOf(statbox), HWND_BOTTOM, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + } + } +} + +#else // !wxUSE_STATBOX + +static inline void AdjustStaticBoxZOrder(wxWindow * WXUNUSED(parent)) +{ +} + +#endif // wxUSE_STATBOX/!wxUSE_STATBOX + +#endif // drag and drop is used + +#if wxUSE_DRAG_AND_DROP +void wxWindowMSW::SetDropTarget(wxDropTarget *pDropTarget) +{ + if ( m_dropTarget != 0 ) { + m_dropTarget->Revoke(m_hWnd); + delete m_dropTarget; + } + + m_dropTarget = pDropTarget; + if ( m_dropTarget != 0 ) + { + AdjustStaticBoxZOrder(GetParent()); + m_dropTarget->Register(m_hWnd); + } +} + +// old-style file manager drag&drop support: we retain the old-style +// DragAcceptFiles in parallel with SetDropTarget. +void wxWindowMSW::DragAcceptFiles(bool WXUNUSED_IN_WINCE(accept)) +{ +#ifndef __WXWINCE__ + HWND hWnd = GetHwnd(); + if ( hWnd ) + { + AdjustStaticBoxZOrder(GetParent()); + ::DragAcceptFiles(hWnd, (BOOL)accept); + } +#endif +} +#endif // wxUSE_DRAG_AND_DROP + +// ---------------------------------------------------------------------------- +// tooltips +// ---------------------------------------------------------------------------- + +#if wxUSE_TOOLTIPS + +void wxWindowMSW::DoSetToolTip(wxToolTip *tooltip) +{ + wxWindowBase::DoSetToolTip(tooltip); + + if ( m_tooltip ) + m_tooltip->SetWindow((wxWindow *)this); +} + +#endif // wxUSE_TOOLTIPS + +// --------------------------------------------------------------------------- +// moving and resizing +// --------------------------------------------------------------------------- + +bool wxWindowMSW::IsSizeDeferred() const +{ +#if wxUSE_DEFERRED_SIZING + if ( m_pendingPosition != wxDefaultPosition || + m_pendingSize != wxDefaultSize ) + return true; +#endif // wxUSE_DEFERRED_SIZING + + return false; +} + +// Get total size +void wxWindowMSW::DoGetSize(int *x, int *y) const +{ +#if wxUSE_DEFERRED_SIZING + // if SetSize() had been called at wx level but not realized at Windows + // level yet (i.e. EndDeferWindowPos() not called), we still should return + // the new and not the old position to the other wx code + if ( m_pendingSize != wxDefaultSize ) + { + if ( x ) + *x = m_pendingSize.x; + if ( y ) + *y = m_pendingSize.y; + } + else // use current size +#endif // wxUSE_DEFERRED_SIZING + { + RECT rect = wxGetWindowRect(GetHwnd()); + + if ( x ) + *x = rect.right - rect.left; + if ( y ) + *y = rect.bottom - rect.top; + } +} + +// Get size *available for subwindows* i.e. excluding menu bar etc. +void wxWindowMSW::DoGetClientSize(int *x, int *y) const +{ +#if wxUSE_DEFERRED_SIZING + if ( m_pendingSize != wxDefaultSize ) + { + // we need to calculate the client size corresponding to pending size + // + // FIXME: Unfortunately this doesn't work correctly for the maximized + // top level windows, the returned values are too small (e.g. + // under Windows 7 on a 1600*1200 screen with task bar on the + // right the pending size for a maximized window is 1538*1200 + // and WM_NCCALCSIZE returns 1528*1172 even though the correct + // client size of such window is 1538*1182). No idea how to fix + // it though, setting WS_MAXIMIZE in GWL_STYLE before calling + // WM_NCCALCSIZE doesn't help and AdjustWindowRectEx() doesn't + // work in this direction neither. So we just have to live with + // the slightly wrong results and relayout the window when it + // gets finally shown in its maximized state (see #11762). + RECT rect; + rect.left = m_pendingPosition.x; + rect.top = m_pendingPosition.y; + rect.right = rect.left + m_pendingSize.x; + rect.bottom = rect.top + m_pendingSize.y; + + ::SendMessage(GetHwnd(), WM_NCCALCSIZE, FALSE, (LPARAM)&rect); + + if ( x ) + *x = rect.right - rect.left; + if ( y ) + *y = rect.bottom - rect.top; + } + else +#endif // wxUSE_DEFERRED_SIZING + { + RECT rect = wxGetClientRect(GetHwnd()); + + if ( x ) + *x = rect.right; + if ( y ) + *y = rect.bottom; + } + + // The size of the client window can't be negative but ::GetClientRect() + // can return negative size for an extremely small (1x1) window with + // borders so ensure that we correct it here as having negative sizes is + // completely unexpected. + if ( x && *x < 0 ) + *x = 0; + if ( y && *y < 0 ) + *y = 0; +} + +void wxWindowMSW::DoGetPosition(int *x, int *y) const +{ + wxWindow * const parent = GetParent(); + + wxPoint pos; +#if wxUSE_DEFERRED_SIZING + if ( m_pendingPosition != wxDefaultPosition ) + { + pos = m_pendingPosition; + } + else // use current position +#endif // wxUSE_DEFERRED_SIZING + { + RECT rect = wxGetWindowRect(GetHwnd()); + + // we do the adjustments with respect to the parent only for the "real" + // children, not for the dialogs/frames + if ( !IsTopLevel() ) + { + // In RTL mode, we want the logical left x-coordinate, + // which would be the physical right x-coordinate. + ::MapWindowPoints(NULL, parent ? GetHwndOf(parent) : HWND_DESKTOP, + (LPPOINT)&rect, 2); + } + + pos.x = rect.left; + pos.y = rect.top; + } + + // we also must adjust by the client area offset: a control which is just + // under a toolbar could be at (0, 30) in Windows but at (0, 0) in wx + if ( parent && !IsTopLevel() ) + { + const wxPoint pt(parent->GetClientAreaOrigin()); + pos.x -= pt.x; + pos.y -= pt.y; + } + + if ( x ) + *x = pos.x; + if ( y ) + *y = pos.y; +} + +void wxWindowMSW::DoScreenToClient(int *x, int *y) const +{ + POINT pt; + if ( x ) + pt.x = *x; + if ( y ) + pt.y = *y; + + ::ScreenToClient(GetHwnd(), &pt); + + if ( x ) + *x = pt.x; + if ( y ) + *y = pt.y; +} + +void wxWindowMSW::DoClientToScreen(int *x, int *y) const +{ + POINT pt; + if ( x ) + pt.x = *x; + if ( y ) + pt.y = *y; + + ::ClientToScreen(GetHwnd(), &pt); + + if ( x ) + *x = pt.x; + if ( y ) + *y = pt.y; +} + +bool +wxWindowMSW::DoMoveSibling(WXHWND hwnd, int x, int y, int width, int height) +{ +#if wxUSE_DEFERRED_SIZING + // if our parent had prepared a defer window handle for us, use it (unless + // we are a top level window) + wxWindowMSW * const parent = IsTopLevel() ? NULL : GetParent(); + + HDWP hdwp = parent ? (HDWP)parent->m_hDWP : NULL; + if ( hdwp ) + { + hdwp = ::DeferWindowPos(hdwp, (HWND)hwnd, NULL, x, y, width, height, + SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE); + if ( !hdwp ) + { + wxLogLastError(wxT("DeferWindowPos")); + } + } + + if ( parent ) + { + // hdwp must be updated as it may have been changed + parent->m_hDWP = (WXHANDLE)hdwp; + } + + if ( hdwp ) + { + // did deferred move, remember new coordinates of the window as they're + // different from what Windows would return for it + return true; + } + + // otherwise (or if deferring failed) move the window in place immediately +#endif // wxUSE_DEFERRED_SIZING + + // toplevel window's coordinates are mirrored if the TLW is a child of another + // RTL window and changing width without moving the position would enlarge the + // window in the wrong direction, so we need to adjust for it + if ( IsTopLevel() ) + { + // note that this may be different from GetParent() for wxDialogs + HWND tlwParent = ::GetParent((HWND)hwnd); + if ( tlwParent && (::GetWindowLong(tlwParent, GWL_EXSTYLE) & WS_EX_LAYOUTRTL) != 0 ) + { + RECT old; + ::GetWindowRect((HWND) hwnd, &old); + if ( old.left == x && old.right - old.left != width ) + { + x -= width - (old.right - old.left); + } + // else: not a simple resize + } + } + + if ( !::MoveWindow((HWND)hwnd, x, y, width, height, IsShown()) ) + { + wxLogLastError(wxT("MoveWindow")); + } + + // if wxUSE_DEFERRED_SIZING, indicates that we didn't use deferred move, + // ignored otherwise + return false; +} + +void wxWindowMSW::DoMoveWindow(int x, int y, int width, int height) +{ + // TODO: is this consistent with other platforms? + // Still, negative width or height shouldn't be allowed + if (width < 0) + width = 0; + if (height < 0) + height = 0; + + if ( DoMoveSibling(m_hWnd, x, y, width, height) ) + { +#if wxUSE_DEFERRED_SIZING + m_pendingPosition = wxPoint(x, y); + m_pendingSize = wxSize(width, height); + } + else // window was moved immediately, without deferring it + { + m_pendingPosition = wxDefaultPosition; + m_pendingSize = wxDefaultSize; +#endif // wxUSE_DEFERRED_SIZING + } +} + +// set the size of the window: if the dimensions are positive, just use them, +// but if any of them is equal to -1, it means that we must find the value for +// it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in +// which case -1 is a valid value for x and y) +// +// If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate +// the width/height to best suit our contents, otherwise we reuse the current +// width/height +void wxWindowMSW::DoSetSize(int x, int y, int width, int height, int sizeFlags) +{ + // get the current size and position... + int currentX, currentY; + int currentW, currentH; + + GetPosition(¤tX, ¤tY); + GetSize(¤tW, ¤tH); + + // ... and don't do anything (avoiding flicker) if it's already ok unless + // we're forced to resize the window + if ( x == currentX && y == currentY && + width == currentW && height == currentH && + !(sizeFlags & wxSIZE_FORCE) ) + { + if (sizeFlags & wxSIZE_FORCE_EVENT) + { + wxSizeEvent event( wxSize(width,height), GetId() ); + event.SetEventObject( this ); + HandleWindowEvent( event ); + } + return; + } + + if ( x == wxDefaultCoord && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) ) + x = currentX; + if ( y == wxDefaultCoord && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) ) + y = currentY; + + AdjustForParentClientOrigin(x, y, sizeFlags); + + wxSize size = wxDefaultSize; + if ( width == wxDefaultCoord ) + { + if ( sizeFlags & wxSIZE_AUTO_WIDTH ) + { + size = GetBestSize(); + width = size.x; + } + else + { + // just take the current one + width = currentW; + } + } + + if ( height == wxDefaultCoord ) + { + if ( sizeFlags & wxSIZE_AUTO_HEIGHT ) + { + if ( size.x == wxDefaultCoord ) + { + size = GetBestSize(); + } + //else: already called GetBestSize() above + + height = size.y; + } + else + { + // just take the current one + height = currentH; + } + } + + DoMoveWindow(x, y, width, height); +} + +void wxWindowMSW::DoSetClientSize(int width, int height) +{ + // setting the client size is less obvious than it could have been + // because in the result of changing the total size the window scrollbar + // may [dis]appear and/or its menubar may [un]wrap (and AdjustWindowRect() + // doesn't take neither into account) and so the client size will not be + // correct as the difference between the total and client size changes -- + // so we keep changing it until we get it right + // + // normally this loop shouldn't take more than 3 iterations (usually 1 but + // if scrollbars [dis]appear as the result of the first call, then 2 and it + // may become 3 if the window had 0 size originally and so we didn't + // calculate the scrollbar correction correctly during the first iteration) + // but just to be on the safe side we check for it instead of making it an + // "infinite" loop (i.e. leaving break inside as the only way to get out) + for ( int i = 0; i < 4; i++ ) + { + RECT rectClient; + ::GetClientRect(GetHwnd(), &rectClient); + + // if the size is already ok, stop here (NB: rectClient.left = top = 0) + if ( (rectClient.right == width || width == wxDefaultCoord) && + (rectClient.bottom == height || height == wxDefaultCoord) ) + { + break; + } + + // Find the difference between the entire window (title bar and all) + // and the client area; add this to the new client size to move the + // window + RECT rectWin; + ::GetWindowRect(GetHwnd(), &rectWin); + + const int widthWin = rectWin.right - rectWin.left, + heightWin = rectWin.bottom - rectWin.top; + + if ( IsTopLevel() ) + { + // toplevel window's coordinates are mirrored if the TLW is a child of another + // RTL window and changing width without moving the position would enlarge the + // window in the wrong direction, so we need to adjust for it + + // note that this may be different from GetParent() for wxDialogs + HWND tlwParent = ::GetParent(GetHwnd()); + if ( tlwParent && (::GetWindowLong(tlwParent, GWL_EXSTYLE) & WS_EX_LAYOUTRTL) != 0 ) + { + const int diffWidth = width - (rectClient.right - rectClient.left); + rectWin.left -= diffWidth; + rectWin.right -= diffWidth; + } + } + else + { + // MoveWindow positions the child windows relative to the parent, so + // adjust if necessary + wxWindow *parent = GetParent(); + if ( parent ) + { + ::ScreenToClient(GetHwndOf(parent), (POINT *)&rectWin); + } + } + + // don't call DoMoveWindow() because we want to move window immediately + // and not defer it here as otherwise the value returned by + // GetClient/WindowRect() wouldn't change as the window wouldn't be + // really resized + if ( !::MoveWindow(GetHwnd(), + rectWin.left, + rectWin.top, + width + widthWin - rectClient.right, + height + heightWin - rectClient.bottom, + TRUE) ) + { + wxLogLastError(wxT("MoveWindow")); + } + } +} + +wxSize wxWindowMSW::DoGetBorderSize() const +{ + wxCoord border; + switch ( GetBorder() ) + { + case wxBORDER_STATIC: + case wxBORDER_SIMPLE: + border = 1; + break; + + case wxBORDER_SUNKEN: + case wxBORDER_THEME: + border = 2; + break; + + case wxBORDER_RAISED: + border = 3; + break; + + default: + wxFAIL_MSG( wxT("unknown border style") ); + // fall through + + case wxBORDER_NONE: + border = 0; + } + + return 2*wxSize(border, border); +} + +// --------------------------------------------------------------------------- +// text metrics +// --------------------------------------------------------------------------- + +int wxWindowMSW::GetCharHeight() const +{ + return wxGetTextMetrics(this).tmHeight; +} + +int wxWindowMSW::GetCharWidth() const +{ + // +1 is needed because Windows apparently adds it when calculating the + // dialog units size in pixels +#if wxDIALOG_UNIT_COMPATIBILITY + return wxGetTextMetrics(this).tmAveCharWidth; +#else + return wxGetTextMetrics(this).tmAveCharWidth + 1; +#endif +} + +void wxWindowMSW::DoGetTextExtent(const wxString& string, + int *x, int *y, + int *descent, + int *externalLeading, + const wxFont *fontToUse) const +{ + // ensure we work with a valid font + wxFont font; + if ( !fontToUse || !fontToUse->IsOk() ) + font = GetFont(); + else + font = *fontToUse; + + wxCHECK_RET( font.IsOk(), wxT("invalid font in GetTextExtent()") ); + + const wxWindow* win = static_cast(this); + wxTextMeasure txm(win, &font); + txm.GetTextExtent(string, x, y, descent, externalLeading); +} + +// --------------------------------------------------------------------------- +// popup menu +// --------------------------------------------------------------------------- + +#if wxUSE_MENUS_NATIVE + +// yield for WM_COMMAND events only, i.e. process all WM_COMMANDs in the queue +// immediately, without waiting for the next event loop iteration +// +// NB: this function should probably be made public later as it can almost +// surely replace wxYield() elsewhere as well +static void wxYieldForCommandsOnly() +{ + // peek all WM_COMMANDs (it will always return WM_QUIT too but we don't + // want to process it here) + MSG msg; + while ( ::PeekMessage(&msg, (HWND)0, WM_COMMAND, WM_COMMAND, PM_REMOVE) ) + { + if ( msg.message == WM_QUIT ) + { + // if we retrieved a WM_QUIT, insert back into the message queue. + ::PostQuitMessage(0); + break; + } + + // luckily (as we don't have access to wxEventLoopImpl method from here + // anyhow...) we don't need to pre process WM_COMMANDs so dispatch it + // immediately + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } +} + +bool wxWindowMSW::DoPopupMenu(wxMenu *menu, int x, int y) +{ + menu->UpdateUI(); + + wxPoint pt; + if ( x == wxDefaultCoord && y == wxDefaultCoord ) + { + pt = wxGetMousePosition(); + } + else + { + pt = ClientToScreen(wxPoint(x, y)); + } + +#if defined(__WXWINCE__) + static const UINT flags = 0; +#else // !__WXWINCE__ + UINT flags = TPM_RIGHTBUTTON; + // NT4 doesn't support TPM_RECURSE and simply doesn't show the menu at all + // when it's use, I'm not sure about Win95/98 but prefer to err on the safe + // side and not to use it there neither -- modify the test if it does work + // on these systems + if ( wxGetWinVersion() >= wxWinVersion_5 ) + { + // using TPM_RECURSE allows us to show a popup menu while another menu + // is opened which can be useful and is supported by the other + // platforms, so allow it under Windows too + flags |= TPM_RECURSE; + } +#endif // __WXWINCE__/!__WXWINCE__ + + ::TrackPopupMenu(GetHmenuOf(menu), flags, pt.x, pt.y, 0, GetHwnd(), NULL); + + // we need to do it right now as otherwise the events are never going to be + // sent to wxCurrentPopupMenu from HandleCommand() + // + // note that even eliminating (ugly) wxCurrentPopupMenu global wouldn't + // help and we'd still need wxYieldForCommandsOnly() as the menu may be + // destroyed as soon as we return (it can be a local variable in the caller + // for example) and so we do need to process the event immediately + wxYieldForCommandsOnly(); + + return true; +} + +#endif // wxUSE_MENUS_NATIVE + +// =========================================================================== +// pre/post message processing +// =========================================================================== + +WXLRESULT wxWindowMSW::MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) +{ + WXLRESULT rc; + if ( m_oldWndProc ) + rc = ::CallWindowProc(CASTWNDPROC m_oldWndProc, GetHwnd(), (UINT) nMsg, (WPARAM) wParam, (LPARAM) lParam); + else + rc = ::DefWindowProc(GetHwnd(), nMsg, wParam, lParam); + + // Special hack used by wxTextEntry auto-completion only: this event is + // sent after the normal keyboard processing so that its handler could use + // the updated contents of the text control, after taking the key that was + // pressed into account. + if ( nMsg == WM_CHAR ) + { + wxKeyEvent event(CreateCharEvent(wxEVT_AFTER_CHAR, wParam, lParam)); + HandleWindowEvent(event); + } + + return rc; +} + +bool wxWindowMSW::MSWProcessMessage(WXMSG* pMsg) +{ + // wxUniversal implements tab traversal itself +#ifndef __WXUNIVERSAL__ + // Notice that we check for both wxTAB_TRAVERSAL and WS_EX_CONTROLPARENT + // being set here. While normally the latter should always be set if the + // former is, doing it like this also works if there is ever a bug that + // results in wxTAB_TRAVERSAL being set but not WS_EX_CONTROLPARENT as we + // must not call IsDialogMessage() then, it would simply hang (see #15458). + if ( m_hWnd && + HasFlag(wxTAB_TRAVERSAL) && + (wxGetWindowExStyle(this) & WS_EX_CONTROLPARENT) ) + { + // intercept dialog navigation keys + MSG *msg = (MSG *)pMsg; + + // here we try to do all the job which ::IsDialogMessage() usually does + // internally + if ( msg->message == WM_KEYDOWN ) + { + bool bCtrlDown = wxIsCtrlDown(); + bool bShiftDown = wxIsShiftDown(); + + // WM_GETDLGCODE: ask the control if it wants the key for itself, + // don't process it if it's the case (except for Ctrl-Tab/Enter + // combinations which are always processed) + LONG lDlgCode = ::SendMessage(msg->hwnd, WM_GETDLGCODE, 0, 0); + + // surprisingly, DLGC_WANTALLKEYS bit mask doesn't contain the + // DLGC_WANTTAB nor DLGC_WANTARROWS bits although, logically, + // it, of course, implies them + if ( lDlgCode & DLGC_WANTALLKEYS ) + { + lDlgCode |= DLGC_WANTTAB | DLGC_WANTARROWS; + } + + bool bForward = true, + bWindowChange = false, + bFromTab = false; + + // should we process this message specially? + bool bProcess = true; + switch ( msg->wParam ) + { + case VK_TAB: + if ( (lDlgCode & DLGC_WANTTAB) && !bCtrlDown ) + { + // let the control have the TAB + bProcess = false; + } + else // use it for navigation + { + // Ctrl-Tab cycles thru notebook pages + bWindowChange = bCtrlDown; + bForward = !bShiftDown; + bFromTab = true; + } + break; + + case VK_UP: + case VK_LEFT: + if ( (lDlgCode & DLGC_WANTARROWS) || bCtrlDown ) + bProcess = false; + else + bForward = false; + break; + + case VK_DOWN: + case VK_RIGHT: + if ( (lDlgCode & DLGC_WANTARROWS) || bCtrlDown ) + bProcess = false; + break; + + case VK_PRIOR: + bForward = false; + // fall through + + case VK_NEXT: + // we treat PageUp/Dn as arrows because chances are that + // a control which needs arrows also needs them for + // navigation (e.g. wxTextCtrl, wxListCtrl, ...) + if ( (lDlgCode & DLGC_WANTARROWS) && !bCtrlDown ) + bProcess = false; + else // OTOH Ctrl-PageUp/Dn works as [Shift-]Ctrl-Tab + bWindowChange = true; + break; + + case VK_RETURN: + { +#if wxUSE_BUTTON + // currently active button should get enter press even + // if there is a default button elsewhere so check if + // this window is a button first + wxWindow *btn = NULL; + if ( lDlgCode & DLGC_DEFPUSHBUTTON ) + { + // let IsDialogMessage() handle this for all + // buttons except the owner-drawn ones which it + // just seems to ignore + long style = ::GetWindowLong(msg->hwnd, GWL_STYLE); + if ( (style & BS_OWNERDRAW) == BS_OWNERDRAW ) + { + // emulate the button click + btn = wxFindWinFromHandle(msg->hwnd); + } + } + else // not a button itself, do we have default button? + { + // check if this window or any of its ancestors + // wants the message for itself (we always reserve + // Ctrl-Enter for dialog navigation though) + wxWindow *win = this; + if ( !bCtrlDown ) + { + // this will contain the dialog code of this + // window and all of its parent windows in turn + LONG lDlgCode2 = lDlgCode; + + while ( win ) + { + if ( lDlgCode2 & DLGC_WANTMESSAGE ) + { + // as it wants to process Enter itself, + // don't call IsDialogMessage() which + // would consume it + return false; + } + + // don't propagate keyboard messages beyond + // the first top level window parent + if ( win->IsTopLevel() ) + break; + + win = win->GetParent(); + + lDlgCode2 = ::SendMessage + ( + GetHwndOf(win), + WM_GETDLGCODE, + 0, + 0 + ); + } + } + else // bCtrlDown + { + win = wxGetTopLevelParent(win); + } + + wxTopLevelWindow * const + tlw = wxDynamicCast(win, wxTopLevelWindow); + if ( tlw ) + { + btn = wxDynamicCast(tlw->GetDefaultItem(), + wxButton); + } + } + + if ( btn && btn->IsEnabled() && btn->IsShownOnScreen() ) + { + btn->MSWCommand(BN_CLICKED, 0 /* unused */); + return true; + } + + // This "Return" key press won't be actually used for + // navigation so don't generate wxNavigationKeyEvent + // for it but still pass it to IsDialogMessage() as it + // may handle it in some other way (e.g. by playing the + // default error sound). + bProcess = false; + +#endif // wxUSE_BUTTON + +#ifdef __WXWINCE__ + // map Enter presses into button presses on PDAs + wxJoystickEvent event(wxEVT_JOY_BUTTON_DOWN); + event.SetEventObject(this); + if ( HandleWindowEvent(event) ) + return true; +#endif // __WXWINCE__ + } + break; + + default: + bProcess = false; + } + + if ( bProcess ) + { + wxNavigationKeyEvent event; + event.SetDirection(bForward); + event.SetWindowChange(bWindowChange); + event.SetFromTab(bFromTab); + event.SetEventObject(this); + + if ( HandleWindowEvent(event) ) + { + // as we don't call IsDialogMessage(), which would take of + // this by default, we need to manually send this message + // so that controls can change their UI state if needed + MSWUpdateUIState(UIS_CLEAR, UISF_HIDEFOCUS); + + return true; + } + } + } + + if ( MSWSafeIsDialogMessage(msg) ) + { + // IsDialogMessage() did something... + return true; + } + } +#endif // __WXUNIVERSAL__ + +#if wxUSE_TOOLTIPS + if ( m_tooltip ) + { + // relay mouse move events to the tooltip control + MSG *msg = (MSG *)pMsg; + if ( msg->message == WM_MOUSEMOVE ) + wxToolTip::RelayEvent(pMsg); + } +#endif // wxUSE_TOOLTIPS + + return false; +} + +bool wxWindowMSW::MSWTranslateMessage(WXMSG* pMsg) +{ +#if wxUSE_ACCEL && !defined(__WXUNIVERSAL__) + return m_acceleratorTable.Translate(this, pMsg); +#else + (void) pMsg; + return false; +#endif // wxUSE_ACCEL +} + +bool wxWindowMSW::MSWShouldPreProcessMessage(WXMSG* WXUNUSED(msg)) +{ + // We don't have any reason to not preprocess messages at this level. + return true; +} + +#ifndef __WXUNIVERSAL__ + +bool wxWindowMSW::MSWSafeIsDialogMessage(WXMSG* msg) +{ + // don't let IsDialogMessage() get VK_ESCAPE as it _always_ eats the + // message even when there is no cancel button and when the message is + // needed by the control itself: in particular, it prevents the tree in + // place edit control from being closed with Escape in a dialog + if ( msg->message == WM_KEYDOWN && msg->wParam == VK_ESCAPE ) + { + return false; + } + + // ::IsDialogMessage() is broken and may sometimes hang the application by + // going into an infinite loop when it tries to find the control to give + // focus to when Alt- is pressed, so we try to detect [some of] the + // situations when this may happen and not call it then + if ( msg->message == WM_SYSCHAR ) + { + HWND hwndFocus = ::GetFocus(); + + // if the currently focused window itself has WS_EX_CONTROLPARENT style, + // ::IsDialogMessage() will also enter an infinite loop, because it will + // recursively check the child windows but not the window itself and so if + // none of the children accepts focus it loops forever (as it only stops + // when it gets back to the window it started from) + // + // while it is very unusual that a window with WS_EX_CONTROLPARENT + // style has the focus, it can happen. One such possibility is if + // all windows are either toplevel, wxDialog, wxPanel or static + // controls and no window can actually accept keyboard input. +#if !defined(__WXWINCE__) + if ( ::GetWindowLong(hwndFocus, GWL_EXSTYLE) & WS_EX_CONTROLPARENT ) + { + // pessimistic by default + bool canSafelyCallIsDlgMsg = false; + for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + wxWindow * const win = node->GetData(); + if ( win->CanAcceptFocus() && + !wxHasWindowExStyle(win, WS_EX_CONTROLPARENT) ) + { + // it shouldn't hang... + canSafelyCallIsDlgMsg = true; + + break; + } + } + + if ( !canSafelyCallIsDlgMsg ) + return false; + } +#endif // !__WXWINCE__ + + // ::IsDialogMessage() can enter in an infinite loop when the + // currently focused window is disabled or hidden and its + // parent has WS_EX_CONTROLPARENT style, so don't call it in + // this case + while ( hwndFocus ) + { + if ( !::IsWindowEnabled(hwndFocus) || + !::IsWindowVisible(hwndFocus) ) + { + // it would enter an infinite loop if we do this! + return false; + } + + if ( !(::GetWindowLong(hwndFocus, GWL_STYLE) & WS_CHILD) ) + { + // it's a top level window, don't go further -- e.g. even + // if the parent of a dialog is disabled, this doesn't + // break navigation inside the dialog + break; + } + + hwndFocus = ::GetParent(hwndFocus); + } + } + + return ::IsDialogMessage(GetHwnd(), msg) != 0; +} + +#endif // __WXUNIVERSAL__ + +// --------------------------------------------------------------------------- +// message params unpackers +// --------------------------------------------------------------------------- + +void wxWindowMSW::UnpackCommand(WXWPARAM wParam, WXLPARAM lParam, + WORD *id, WXHWND *hwnd, WORD *cmd) +{ + *id = LOWORD(wParam); + *hwnd = (WXHWND)lParam; + *cmd = HIWORD(wParam); +} + +void wxWindowMSW::UnpackActivate(WXWPARAM wParam, WXLPARAM lParam, + WXWORD *state, WXWORD *minimized, WXHWND *hwnd) +{ + *state = LOWORD(wParam); + *minimized = HIWORD(wParam); + *hwnd = (WXHWND)lParam; +} + +void wxWindowMSW::UnpackScroll(WXWPARAM wParam, WXLPARAM lParam, + WXWORD *code, WXWORD *pos, WXHWND *hwnd) +{ + *code = LOWORD(wParam); + *pos = HIWORD(wParam); + *hwnd = (WXHWND)lParam; +} + +void wxWindowMSW::UnpackCtlColor(WXWPARAM wParam, WXLPARAM lParam, + WXHDC *hdc, WXHWND *hwnd) +{ + *hwnd = (WXHWND)lParam; + *hdc = (WXHDC)wParam; +} + +void wxWindowMSW::UnpackMenuSelect(WXWPARAM wParam, WXLPARAM lParam, + WXWORD *item, WXWORD *flags, WXHMENU *hmenu) +{ + *item = (WXWORD)wParam; + *flags = HIWORD(wParam); + *hmenu = (WXHMENU)lParam; +} + +// --------------------------------------------------------------------------- +// Main wxWidgets window proc and the window proc for wxWindow +// --------------------------------------------------------------------------- + +// Hook for new window just as it's being created, when the window isn't yet +// associated with the handle +static wxWindowMSW *gs_winBeingCreated = NULL; + +// implementation of wxWindowCreationHook class: it just sets gs_winBeingCreated to the +// window being created and insures that it's always unset back later +wxWindowCreationHook::wxWindowCreationHook(wxWindowMSW *winBeingCreated) +{ + gs_winBeingCreated = winBeingCreated; +} + +wxWindowCreationHook::~wxWindowCreationHook() +{ + gs_winBeingCreated = NULL; +} + +// Main window proc +LRESULT WXDLLEXPORT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + // trace all messages: useful for the debugging but noticeably slows down + // the code so don't do it by default +#if wxDEBUG_LEVEL >= 2 + // notice that we cast wParam and lParam to long to avoid mismatch with + // format specifiers in 64 bit builds where they are both int64 quantities + // + // casting like this loses information, of course, but it shouldn't matter + // much for this diagnostic code and it keeps the code simple + wxLogTrace("winmsg", + wxT("Processing %s(hWnd=%p, wParam=%08lx, lParam=%08lx)"), + wxGetMessageName(message), hWnd, (long)wParam, (long)lParam); +#endif // wxDEBUG_LEVEL >= 2 + + wxWindowMSW *wnd = wxFindWinFromHandle(hWnd); + + // when we get the first message for the HWND we just created, we associate + // it with wxWindow stored in gs_winBeingCreated + if ( !wnd && gs_winBeingCreated ) + { + wxAssociateWinWithHandle(hWnd, gs_winBeingCreated); + wnd = gs_winBeingCreated; + gs_winBeingCreated = NULL; + wnd->SetHWND((WXHWND)hWnd); + } + + LRESULT rc; + + if ( wnd && wxGUIEventLoop::AllowProcessing(wnd) ) + rc = wnd->MSWWindowProc(message, wParam, lParam); + else + rc = ::DefWindowProc(hWnd, message, wParam, lParam); + + return rc; +} + +bool +wxWindowMSW::MSWHandleMessage(WXLRESULT *result, + WXUINT message, + WXWPARAM wParam, + WXLPARAM lParam) +{ + // did we process the message? + bool processed = false; + + // the return value + union + { + bool allow; + WXLRESULT result; + WXHBRUSH hBrush; + } rc; + + // for most messages we should return 0 when we do process the message + rc.result = 0; + + switch ( message ) + { + case WM_CREATE: + { + bool mayCreate; + processed = HandleCreate((WXLPCREATESTRUCT)lParam, &mayCreate); + if ( processed ) + { + // return 0 to allow window creation + rc.result = mayCreate ? 0 : -1; + } + } + break; + + case WM_DESTROY: + // never set processed to true and *always* pass WM_DESTROY to + // DefWindowProc() as Windows may do some internal cleanup when + // processing it and failing to pass the message along may cause + // memory and resource leaks! + (void)HandleDestroy(); + break; + + case WM_SIZE: + processed = HandleSize(LOWORD(lParam), HIWORD(lParam), wParam); + break; + + case WM_MOVE: + processed = HandleMove(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); + break; + +#if !defined(__WXWINCE__) + case WM_MOVING: + { + LPRECT pRect = (LPRECT)lParam; + wxRect rect; + rect.SetLeft(pRect->left); + rect.SetTop(pRect->top); + rect.SetRight(pRect->right); + rect.SetBottom(pRect->bottom); + processed = HandleMoving(rect); + if (processed) { + pRect->left = rect.GetLeft(); + pRect->top = rect.GetTop(); + pRect->right = rect.GetRight(); + pRect->bottom = rect.GetBottom(); + } + } + break; + + case WM_ENTERSIZEMOVE: + { + processed = HandleEnterSizeMove(); + } + break; + + case WM_EXITSIZEMOVE: + { + processed = HandleExitSizeMove(); + } + break; + + case WM_SIZING: + { + LPRECT pRect = (LPRECT)lParam; + wxRect rect; + rect.SetLeft(pRect->left); + rect.SetTop(pRect->top); + rect.SetRight(pRect->right); + rect.SetBottom(pRect->bottom); + processed = HandleSizing(rect); + if (processed) { + pRect->left = rect.GetLeft(); + pRect->top = rect.GetTop(); + pRect->right = rect.GetRight(); + pRect->bottom = rect.GetBottom(); + } + } + break; +#endif // !__WXWINCE__ + +#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) + case WM_ACTIVATEAPP: + // This implicitly sends a wxEVT_ACTIVATE_APP event + wxTheApp->SetActive(wParam != 0, FindFocus()); + break; +#endif + + case WM_ACTIVATE: + { + WXWORD state, minimized; + WXHWND hwnd; + UnpackActivate(wParam, lParam, &state, &minimized, &hwnd); + + processed = HandleActivate(state, minimized != 0, (WXHWND)hwnd); + } + break; + + case WM_SETFOCUS: + processed = HandleSetFocus((WXHWND)wParam); + break; + + case WM_KILLFOCUS: + processed = HandleKillFocus((WXHWND)wParam); + break; + + case WM_PRINTCLIENT: + processed = HandlePrintClient((WXHDC)wParam); + break; + + case WM_PAINT: + if ( wParam ) + { + wxPaintDCEx dc((wxWindow *)this, (WXHDC)wParam); + + processed = HandlePaint(); + } + else // no DC given + { + processed = HandlePaint(); + } + break; + + case WM_CLOSE: +#ifdef __WXUNIVERSAL__ + // Universal uses its own wxFrame/wxDialog, so we don't receive + // close events unless we have this. + Close(); +#endif // __WXUNIVERSAL__ + + // don't let the DefWindowProc() destroy our window - we'll do it + // ourselves in ~wxWindow + processed = true; + rc.result = TRUE; + break; + + case WM_SHOWWINDOW: + processed = HandleShow(wParam != 0, (int)lParam); + break; + + case WM_MOUSEMOVE: + processed = HandleMouseMove(GET_X_LPARAM(lParam), + GET_Y_LPARAM(lParam), + wParam); + break; + +#ifdef HAVE_TRACKMOUSEEVENT + case WM_MOUSELEAVE: + // filter out excess WM_MOUSELEAVE events sent after PopupMenu() + // (on XP at least) + if ( m_mouseInWindow ) + { + GenerateMouseLeave(); + } + + // always pass processed back as false, this allows the window + // manager to process the message too. This is needed to + // ensure windows XP themes work properly as the mouse moves + // over widgets like buttons. So don't set processed to true here. + break; +#endif // HAVE_TRACKMOUSEEVENT + +#if wxUSE_MOUSEWHEEL + case WM_MOUSEWHEEL: + processed = HandleMouseWheel(wxMOUSE_WHEEL_VERTICAL, wParam, lParam); + break; + + case WM_MOUSEHWHEEL: + processed = HandleMouseWheel(wxMOUSE_WHEEL_HORIZONTAL, wParam, lParam); + break; +#endif // wxUSE_MOUSEWHEEL + + case WM_LBUTTONDOWN: + case WM_LBUTTONUP: + case WM_LBUTTONDBLCLK: + case WM_RBUTTONDOWN: + case WM_RBUTTONUP: + case WM_RBUTTONDBLCLK: + case WM_MBUTTONDOWN: + case WM_MBUTTONUP: + case WM_MBUTTONDBLCLK: +#ifdef wxHAS_XBUTTON + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: + case WM_XBUTTONDBLCLK: +#endif // wxHAS_XBUTTON + { +#ifdef __WXMICROWIN__ + // MicroWindows seems to ignore the fact that a window is + // disabled. So catch mouse events and throw them away if + // necessary. + wxWindowMSW* win = this; + for ( ;; ) + { + if (!win->IsEnabled()) + { + processed = true; + break; + } + + win = win->GetParent(); + if ( !win || win->IsTopLevel() ) + break; + } + + if ( processed ) + break; + +#endif // __WXMICROWIN__ + int x = GET_X_LPARAM(lParam), + y = GET_Y_LPARAM(lParam); + +#ifdef __WXWINCE__ + // redirect the event to a static control if necessary by + // finding one under mouse because under CE the static controls + // don't generate mouse events (even with SS_NOTIFY) + wxWindowMSW *win; + if ( GetCapture() == this ) + { + // but don't do it if the mouse is captured by this window + // because then it should really get this event itself + win = this; + } + else + { + win = FindWindowForMouseEvent(this, &x, &y); + + // this should never happen + wxCHECK_MSG( win, 0, + wxT("FindWindowForMouseEvent() returned NULL") ); + } +#ifdef __POCKETPC__ + if (IsContextMenuEnabled() && message == WM_LBUTTONDOWN) + { + SHRGINFO shrgi = {0}; + + shrgi.cbSize = sizeof(SHRGINFO); + shrgi.hwndClient = (HWND) GetHWND(); + shrgi.ptDown.x = x; + shrgi.ptDown.y = y; + + shrgi.dwFlags = SHRG_RETURNCMD; + // shrgi.dwFlags = SHRG_NOTIFYPARENT; + + if (GN_CONTEXTMENU == ::SHRecognizeGesture(&shrgi)) + { + wxPoint pt(x, y); + pt = ClientToScreen(pt); + + wxContextMenuEvent evtCtx(wxEVT_CONTEXT_MENU, GetId(), pt); + + evtCtx.SetEventObject(this); + if (HandleWindowEvent(evtCtx)) + { + processed = true; + return true; + } + } + } +#endif + +#else // !__WXWINCE__ + wxWindowMSW *win = this; +#endif // __WXWINCE__/!__WXWINCE__ + + processed = win->HandleMouseEvent(message, x, y, wParam); + + // if the app didn't eat the event, handle it in the default + // way, that is by giving this window the focus + if ( !processed ) + { + // for the standard classes their WndProc sets the focus to + // them anyhow and doing it from here results in some weird + // problems, so don't do it for them (unnecessary anyhow) + if ( !win->IsOfStandardClass() ) + { + if ( message == WM_LBUTTONDOWN && win->IsFocusable() ) + win->SetFocus(); + } + } + } + break; + +#ifdef MM_JOY1MOVE + case MM_JOY1MOVE: + case MM_JOY2MOVE: + case MM_JOY1ZMOVE: + case MM_JOY2ZMOVE: + case MM_JOY1BUTTONDOWN: + case MM_JOY2BUTTONDOWN: + case MM_JOY1BUTTONUP: + case MM_JOY2BUTTONUP: + processed = HandleJoystickEvent(message, + LOWORD(lParam), + HIWORD(lParam), + wParam); + break; +#endif // __WXMICROWIN__ + + case WM_COMMAND: + { + WORD id, cmd; + WXHWND hwnd; + UnpackCommand(wParam, lParam, &id, &hwnd, &cmd); + + processed = HandleCommand(id, cmd, hwnd); + } + break; + + case WM_NOTIFY: + processed = HandleNotify((int)wParam, lParam, &rc.result); + break; + + // we only need to reply to WM_NOTIFYFORMAT manually when using MSLU, + // otherwise DefWindowProc() does it perfectly fine for us, but MSLU + // apparently doesn't always behave properly and needs some help +#if wxUSE_UNICODE_MSLU && defined(NF_QUERY) + case WM_NOTIFYFORMAT: + if ( lParam == NF_QUERY ) + { + processed = true; + rc.result = NFR_UNICODE; + } + break; +#endif // wxUSE_UNICODE_MSLU + + // for these messages we must return true if process the message +#ifdef WM_DRAWITEM + case WM_DRAWITEM: + processed = MSWOnDrawItem(wParam, (WXDRAWITEMSTRUCT *)lParam); + if ( processed ) + rc.result = TRUE; + break; + + case WM_MEASUREITEM: + processed = MSWOnMeasureItem(wParam, (WXMEASUREITEMSTRUCT *)lParam); + if ( processed ) + rc.result = TRUE; + break; +#endif // defined(WM_DRAWITEM) + + case WM_GETDLGCODE: + if ( !IsOfStandardClass() || HasFlag(wxWANTS_CHARS) ) + { + // we always want to get the char events + rc.result = DLGC_WANTCHARS; + + if ( HasFlag(wxWANTS_CHARS) ) + { + // in fact, we want everything + rc.result |= DLGC_WANTARROWS | + DLGC_WANTTAB | + DLGC_WANTALLKEYS; + } + + processed = true; + } + //else: get the dlg code from the DefWindowProc() + break; + + case WM_SYSKEYDOWN: + case WM_KEYDOWN: + // Generate the key down event in any case. + m_lastKeydownProcessed = HandleKeyDown((WORD) wParam, lParam); + if ( m_lastKeydownProcessed ) + { + // If it was processed by an event handler, we stop here, + // notably we intentionally don't generate char event then. + processed = true; + } + else // key down event not handled + { + // Examine the event to decide whether we need to generate a + // char event for it ourselves or let Windows do it. Window + // mostly only does it for the keys which produce printable + // characters (although there are exceptions, e.g. VK_ESCAPE or + // VK_BACK (but not VK_DELETE)) while we do it for all keys + // except the modifier ones (the wisdom of this is debatable + // but by now this decision is enshrined forever due to + // backwards compatibility). + switch ( wParam ) + { + // No wxEVT_CHAR events are generated for these keys at all. + case VK_SHIFT: + case VK_CONTROL: + case VK_MENU: + case VK_CAPITAL: + case VK_NUMLOCK: + case VK_SCROLL: + + // Windows will send us WM_CHAR for these ones so we'll + // generate wxEVT_CHAR for them later when we get it. + case VK_ESCAPE: + case VK_SPACE: + case VK_RETURN: + case VK_BACK: + case VK_TAB: + case VK_ADD: + case VK_SUBTRACT: + case VK_MULTIPLY: + case VK_DIVIDE: + case VK_DECIMAL: + case VK_NUMPAD0: + case VK_NUMPAD1: + case VK_NUMPAD2: + case VK_NUMPAD3: + case VK_NUMPAD4: + case VK_NUMPAD5: + case VK_NUMPAD6: + case VK_NUMPAD7: + case VK_NUMPAD8: + case VK_NUMPAD9: + case VK_OEM_1: + case VK_OEM_2: + case VK_OEM_3: + case VK_OEM_4: + case VK_OEM_5: + case VK_OEM_6: + case VK_OEM_7: + case VK_OEM_102: + case VK_OEM_PLUS: + case VK_OEM_COMMA: + case VK_OEM_MINUS: + case VK_OEM_PERIOD: + break; + +#ifdef VK_APPS + // special case of VK_APPS: treat it the same as right mouse + // click because both usually pop up a context menu + case VK_APPS: + processed = HandleMouseEvent(WM_RBUTTONDOWN, -1, -1, 0); + break; +#endif // VK_APPS + + default: + if ( (wParam >= '0' && wParam <= '9') || + (wParam >= 'A' && wParam <= 'Z') ) + { + // We'll get WM_CHAR for those later too. + break; + } + + // But for the rest we won't get WM_CHAR later so we do + // need to generate the event right now. + wxKeyEvent event(wxEVT_CHAR); + InitAnyKeyEvent(event, wParam, lParam); + + // Set the "extended" bit in lParam because we want to + // generate CHAR events with WXK_HOME and not + // WXK_NUMPAD_HOME even if the "Home" key on numpad was + // pressed. + event.m_keyCode = wxMSWKeyboard::VKToWX + ( + wParam, + lParam | (KF_EXTENDED << 16) + ); + + // Don't produce events without any valid character + // code (even if this shouldn't normally happen...). + if ( event.m_keyCode != WXK_NONE ) + processed = HandleWindowEvent(event); + } + } + if (message == WM_SYSKEYDOWN) // Let Windows still handle the SYSKEYs + processed = false; + break; + + case WM_SYSKEYUP: + case WM_KEYUP: +#ifdef VK_APPS + // special case of VK_APPS: treat it the same as right mouse button + if ( wParam == VK_APPS ) + { + processed = HandleMouseEvent(WM_RBUTTONUP, -1, -1, 0); + } + else +#endif // VK_APPS + { + processed = HandleKeyUp((WORD) wParam, lParam); + } + break; + + case WM_SYSCHAR: + case WM_CHAR: // Always an ASCII character + if ( m_lastKeydownProcessed ) + { + // The key was handled in the EVT_KEY_DOWN and handling + // a key in an EVT_KEY_DOWN handler is meant, by + // design, to prevent EVT_CHARs from happening + m_lastKeydownProcessed = false; + processed = true; + } + else + { + processed = HandleChar((WORD)wParam, lParam); + } + break; + + case WM_IME_STARTCOMPOSITION: + // IME popup needs Escape as it should undo the changes in its + // entry window instead of e.g. closing the dialog for which the + // IME is used (and losing all the changes in the IME window). + gs_modalEntryWindowCount++; + break; + + case WM_IME_ENDCOMPOSITION: + gs_modalEntryWindowCount--; + break; + +#if wxUSE_HOTKEY + case WM_HOTKEY: + processed = HandleHotKey(wParam, lParam); + break; +#endif // wxUSE_HOTKEY + + case WM_CUT: + case WM_COPY: + case WM_PASTE: + processed = HandleClipboardEvent(message); + break; + + case WM_HSCROLL: + case WM_VSCROLL: + { + WXWORD code, pos; + WXHWND hwnd; + UnpackScroll(wParam, lParam, &code, &pos, &hwnd); + + processed = MSWOnScroll(message == WM_HSCROLL ? wxHORIZONTAL + : wxVERTICAL, + code, pos, hwnd); + } + break; + + // CTLCOLOR messages are sent by children to query the parent for their + // colors +#ifndef __WXMICROWIN__ + case WM_CTLCOLORMSGBOX: + case WM_CTLCOLOREDIT: + case WM_CTLCOLORLISTBOX: + case WM_CTLCOLORBTN: + case WM_CTLCOLORDLG: + case WM_CTLCOLORSCROLLBAR: + case WM_CTLCOLORSTATIC: + { + WXHDC hdc; + WXHWND hwnd; + UnpackCtlColor(wParam, lParam, &hdc, &hwnd); + + processed = HandleCtlColor(&rc.hBrush, (WXHDC)hdc, (WXHWND)hwnd); + } + break; +#endif // !__WXMICROWIN__ + + case WM_SYSCOLORCHANGE: + // the return value for this message is ignored + processed = HandleSysColorChange(); + break; + +#if !defined(__WXWINCE__) + case WM_DISPLAYCHANGE: + processed = HandleDisplayChange(); + break; +#endif + + case WM_PALETTECHANGED: + processed = HandlePaletteChanged((WXHWND)wParam); + break; + + case WM_CAPTURECHANGED: + processed = HandleCaptureChanged((WXHWND)lParam); + break; + + case WM_SETTINGCHANGE: + processed = HandleSettingChange(wParam, lParam); + break; + + case WM_QUERYNEWPALETTE: + processed = HandleQueryNewPalette(); + break; + + case WM_ERASEBKGND: + { +#ifdef wxHAS_MSW_BACKGROUND_ERASE_HOOK + // check if an override was configured for this window + EraseBgHooks::const_iterator it = gs_eraseBgHooks.find(this); + if ( it != gs_eraseBgHooks.end() ) + processed = it->second->MSWEraseBgHook((WXHDC)wParam); + else +#endif // wxHAS_MSW_BACKGROUND_ERASE_HOOK + processed = HandleEraseBkgnd((WXHDC)wParam); + } + + if ( processed ) + { + // we processed the message, i.e. erased the background + rc.result = TRUE; + } + break; + +#if !defined(__WXWINCE__) + case WM_DROPFILES: + processed = HandleDropFiles(wParam); + break; +#endif + + case WM_INITDIALOG: + processed = HandleInitDialog((WXHWND)wParam); + + if ( processed ) + { + // we never set focus from here + rc.result = FALSE; + } + break; + +#if !defined(__WXWINCE__) + case WM_QUERYENDSESSION: + processed = HandleQueryEndSession(lParam, &rc.allow); + break; + + case WM_ENDSESSION: + processed = HandleEndSession(wParam != 0, lParam); + break; + + case WM_GETMINMAXINFO: + processed = HandleGetMinMaxInfo((MINMAXINFO*)lParam); + break; +#endif + + case WM_SETCURSOR: + processed = HandleSetCursor((WXHWND)wParam, + LOWORD(lParam), // hit test + HIWORD(lParam)); // mouse msg + + if ( processed ) + { + // returning TRUE stops the DefWindowProc() from further + // processing this message - exactly what we need because we've + // just set the cursor. + rc.result = TRUE; + } + break; + +#if wxUSE_ACCESSIBILITY + case WM_GETOBJECT: + { + //WPARAM dwFlags = (WPARAM) (DWORD) wParam; + LPARAM dwObjId = (LPARAM) (DWORD) lParam; + + if (dwObjId == (LPARAM)OBJID_CLIENT && GetOrCreateAccessible()) + { + processed = true; + rc.result = LresultFromObject(IID_IAccessible, wParam, (IUnknown*) GetAccessible()->GetIAccessible()); + } + break; + } +#endif + +#if defined(WM_HELP) + case WM_HELP: + { + // by default, WM_HELP is propagated by DefWindowProc() upwards + // to the window parent but as we do it ourselves already + // (wxHelpEvent is derived from wxCommandEvent), we don't want + // to get the other events if we process this message at all + processed = true; + + // WM_HELP doesn't use lParam under CE +#ifndef __WXWINCE__ + HELPINFO* info = (HELPINFO*) lParam; + if ( info->iContextType == HELPINFO_WINDOW ) + { +#endif // !__WXWINCE__ + wxHelpEvent helpEvent + ( + wxEVT_HELP, + GetId(), +#ifdef __WXWINCE__ + wxGetMousePosition() // what else? +#else + wxPoint(info->MousePos.x, info->MousePos.y) +#endif + ); + + helpEvent.SetEventObject(this); + HandleWindowEvent(helpEvent); +#ifndef __WXWINCE__ + } + else if ( info->iContextType == HELPINFO_MENUITEM ) + { + wxHelpEvent helpEvent(wxEVT_HELP, info->iCtrlId); + helpEvent.SetEventObject(this); + HandleWindowEvent(helpEvent); + + } + else // unknown help event? + { + processed = false; + } +#endif // !__WXWINCE__ + } + break; +#endif // WM_HELP + +#if !defined(__WXWINCE__) + case WM_CONTEXTMENU: + { + // Ignore the events that are propagated from a child window by + // DefWindowProc(): as wxContextMenuEvent is already propagated + // upwards the window hierarchy by us, not doing this would + // result in duplicate events being sent. + WXHWND hWnd = (WXHWND)wParam; + if ( hWnd != m_hWnd ) + { + wxWindowMSW *win = FindItemByHWND(hWnd); + if ( win && IsDescendant(win) ) + { + // We had already generated wxContextMenuEvent when we + // got WM_CONTEXTMENU for that window. + processed = true; + break; + } + } + + // we don't convert from screen to client coordinates as + // the event may be handled by a parent window + wxPoint pt(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); + + wxContextMenuEvent evtCtx(wxEVT_CONTEXT_MENU, GetId(), pt); + evtCtx.SetEventObject(this); + + processed = HandleWindowEvent(evtCtx); + } + break; +#endif + +#if wxUSE_MENUS + case WM_MENUCHAR: + // we're only interested in our own menus, not MF_SYSMENU + if ( HIWORD(wParam) == MF_POPUP ) + { + // handle menu chars for ownerdrawn menu items + int i = HandleMenuChar(toupper(LOWORD(wParam)), lParam); + if ( i != wxNOT_FOUND ) + { + rc.result = MAKELRESULT(i, MNC_EXECUTE); + processed = true; + } + } + break; + +#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) + +// Trying to make compatible with Win 9x +#ifndef WM_UNINITMENUPOPUP + #define WM_UNINITMENUPOPUP 0x0125 +#endif + + case WM_INITMENUPOPUP: + case WM_MENUSELECT: + case WM_EXITMENULOOP: + case WM_UNINITMENUPOPUP: + { + // Contrary to MSDN implications, at least some of these messages are + // not actually sent to the TLW for popup menus, but to the owning + // window or even its parent window. + // + // wx-3.1+ handles these messages in wxWindow instead, but binary + // compatibility requirements on wx-3.0 make it simpler to just forward + // the messages to the wxTLW. + wxWindow *tlw = wxGetTopLevelParent(this); + if (tlw && tlw != this) + { + rc.result = tlw->MSWWindowProc(message, wParam, lParam); + processed = rc.result == 0; + } + } + break; +#endif // !__WXMICROWIN__ +#endif // wxUSE_MENUS + +#ifndef __WXWINCE__ + case WM_POWERBROADCAST: + { + bool vetoed; + processed = HandlePower(wParam, lParam, &vetoed); + rc.result = processed && vetoed ? BROADCAST_QUERY_DENY : TRUE; + } + break; +#endif // __WXWINCE__ + +#if wxUSE_UXTHEME + // If we want the default themed border then we need to draw it ourselves + case WM_NCCALCSIZE: + { + wxUxThemeEngine* theme = wxUxThemeEngine::GetIfActive(); + const wxBorder border = TranslateBorder(GetBorder()); + if (theme && border == wxBORDER_THEME) + { + // first ask the widget to calculate the border size + rc.result = MSWDefWindowProc(message, wParam, lParam); + processed = true; + + // now alter the client size making room for drawing a + // themed border + RECT *rect; + NCCALCSIZE_PARAMS *csparam = NULL; + if ( wParam ) + { + csparam = (NCCALCSIZE_PARAMS *)lParam; + rect = &csparam->rgrc[0]; + } + else + { + rect = (RECT *)lParam; + } + + wxUxThemeHandle hTheme((const wxWindow *)this, L"EDIT"); + RECT rcClient = { 0, 0, 0, 0 }; + wxClientDC dc((wxWindow *)this); + wxMSWDCImpl *impl = (wxMSWDCImpl*) dc.GetImpl(); + + if ( theme->GetThemeBackgroundContentRect + ( + hTheme, + GetHdcOf(*impl), + EP_EDITTEXT, + ETS_NORMAL, + rect, + &rcClient) == S_OK ) + { + InflateRect(&rcClient, -1, -1); + if (wParam) + csparam->rgrc[0] = rcClient; + else + *((RECT*)lParam) = rcClient; + + // WVR_REDRAW triggers a bug whereby child windows are moved up and left, + // so don't use. + // rc.result = WVR_REDRAW; + } + } + } + break; + + case WM_NCPAINT: + { + wxUxThemeEngine* theme = wxUxThemeEngine::GetIfActive(); + const wxBorder border = TranslateBorder(GetBorder()); + if (theme && border == wxBORDER_THEME) + { + // first ask the widget to paint its non-client area, such as scrollbars, etc. + rc.result = MSWDefWindowProc(message, wParam, lParam); + processed = true; + + wxUxThemeHandle hTheme((const wxWindow *)this, L"EDIT"); + wxWindowDC dc((wxWindow *)this); + wxMSWDCImpl *impl = (wxMSWDCImpl*) dc.GetImpl(); + + // Clip the DC so that you only draw on the non-client area + RECT rcBorder; + wxCopyRectToRECT(GetSize(), rcBorder); + + RECT rcClient; + theme->GetThemeBackgroundContentRect( + hTheme, GetHdcOf(*impl), EP_EDITTEXT, ETS_NORMAL, &rcBorder, &rcClient); + InflateRect(&rcClient, -1, -1); + + ::ExcludeClipRect(GetHdcOf(*impl), rcClient.left, rcClient.top, + rcClient.right, rcClient.bottom); + + // Make sure the background is in a proper state + if (theme->IsThemeBackgroundPartiallyTransparent(hTheme, EP_EDITTEXT, ETS_NORMAL)) + { + theme->DrawThemeParentBackground(GetHwnd(), GetHdcOf(*impl), &rcBorder); + } + + // Draw the border + int nState; + if ( !IsEnabled() ) + nState = ETS_DISABLED; + // should we check this? + //else if ( ::GetWindowLong(GetHwnd(), GWL_STYLE) & ES_READONLY) + // nState = ETS_READONLY; + else + nState = ETS_NORMAL; + theme->DrawThemeBackground(hTheme, GetHdcOf(*impl), EP_EDITTEXT, nState, &rcBorder, NULL); + } + } + break; + +#endif // wxUSE_UXTHEME + + default: + // try a custom message handler + const MSWMessageHandlers::const_iterator + i = gs_messageHandlers.find(message); + if ( i != gs_messageHandlers.end() ) + { + processed = (*i->second)(this, message, wParam, lParam); + } + } + + if ( !processed ) + return false; + + *result = rc.result; + + return true; +} + +WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) +{ + WXLRESULT result; + if ( !MSWHandleMessage(&result, message, wParam, lParam) ) + { +#if wxDEBUG_LEVEL >= 2 + wxLogTrace("winmsg", wxT("Forwarding %s to DefWindowProc."), + wxGetMessageName(message)); +#endif // wxDEBUG_LEVEL >= 2 + result = MSWDefWindowProc(message, wParam, lParam); + } + + return result; +} + +// ---------------------------------------------------------------------------- +// wxWindow <-> HWND map +// ---------------------------------------------------------------------------- + +wxWindow *wxFindWinFromHandle(HWND hwnd) +{ + WindowHandles::const_iterator i = gs_windowHandles.find(hwnd); + return i == gs_windowHandles.end() ? NULL : i->second; +} + +void wxAssociateWinWithHandle(HWND hwnd, wxWindowMSW *win) +{ + // adding NULL hwnd is (first) surely a result of an error and + // (secondly) breaks menu command processing + wxCHECK_RET( hwnd != (HWND)NULL, + wxT("attempt to add a NULL hwnd to window list ignored") ); + +#if wxDEBUG_LEVEL + WindowHandles::const_iterator i = gs_windowHandles.find(hwnd); + if ( i != gs_windowHandles.end() ) + { + if ( i->second != win ) + { + wxFAIL_MSG( + wxString::Format( + wxT("HWND %p already associated with another window (%s)"), + hwnd, win->GetClassInfo()->GetClassName() + ) + ); + } + //else: this actually happens currently because we associate the window + // with its HWND during creation (if we create it) and also when + // SubclassWin() is called later, this is ok + } +#endif // wxDEBUG_LEVEL + + gs_windowHandles[hwnd] = (wxWindow *)win; +} + +void wxRemoveHandleAssociation(wxWindowMSW *win) +{ + gs_windowHandles.erase(GetHwndOf(win)); +} + +// ---------------------------------------------------------------------------- +// various MSW speciic class dependent functions +// ---------------------------------------------------------------------------- + +// Default destroyer - override if you destroy it in some other way +// (e.g. with MDI child windows) +void wxWindowMSW::MSWDestroyWindow() +{ +} + +void wxWindowMSW::MSWGetCreateWindowCoords(const wxPoint& pos, + const wxSize& size, + int& x, int& y, + int& w, int& h) const +{ + // CW_USEDEFAULT can't be used for child windows so just position them at + // the origin by default + x = pos.x == wxDefaultCoord ? 0 : pos.x; + y = pos.y == wxDefaultCoord ? 0 : pos.y; + + AdjustForParentClientOrigin(x, y); + + // We don't have any clearly good choice for the size by default neither + // but we must use something non-zero. + w = WidthDefault(size.x); + h = HeightDefault(size.y); + + /* + NB: there used to be some code here which set the initial size of the + window to the client size of the parent if no explicit size was + specified. This was wrong because wxWidgets programs often assume + that they get a WM_SIZE (EVT_SIZE) upon creation, however this broke + it. To see why, you should understand that Windows sends WM_SIZE from + inside ::CreateWindow() anyhow. However, ::CreateWindow() is called + from some base class ctor and so this WM_SIZE is not processed in the + real class' OnSize() (because it's not fully constructed yet and the + event goes to some base class OnSize() instead). So the WM_SIZE we + rely on is the one sent when the parent frame resizes its children + but here is the problem: if the child already has just the right + size, nothing will happen as both wxWidgets and Windows check for + this and ignore any attempts to change the window size to the size it + already has - so no WM_SIZE would be sent. + */ +} + +WXHWND wxWindowMSW::MSWGetParent() const +{ + return m_parent ? m_parent->GetHWND() : WXHWND(NULL); +} + +bool wxWindowMSW::MSWCreate(const wxChar *wclass, + const wxChar *title, + const wxPoint& pos, + const wxSize& size, + WXDWORD style, + WXDWORD extendedStyle) +{ + // check a common bug in the user code: if the window is created with a + // non-default ctor and Create() is called too, we'd create 2 HWND for a + // single wxWindow object and this results in all sorts of trouble, + // especially for wxTLWs + wxCHECK_MSG( !m_hWnd, true, "window can't be recreated" ); + + // this can happen if this function is called using the return value of + // wxApp::GetRegisteredClassName() which failed + wxCHECK_MSG( wclass, false, "failed to register window class?" ); + + + // choose the position/size for the new window + int x, y, w, h; + (void)MSWGetCreateWindowCoords(pos, size, x, y, w, h); + + // controlId is menu handle for the top level windows, so set it to 0 + // unless we're creating a child window + int controlId = style & WS_CHILD ? GetId() : 0; + + // for each class "Foo" we have we also have "FooNR" ("no repaint") class + // which is the same but without CS_[HV]REDRAW class styles so using it + // ensures that the window is not fully repainted on each resize + wxString className(wclass); + if ( !HasFlag(wxFULL_REPAINT_ON_RESIZE) ) + { + className += wxApp::GetNoRedrawClassSuffix(); + } + + // do create the window + wxWindowCreationHook hook(this); + + m_hWnd = (WXHWND)::CreateWindowEx + ( + extendedStyle, + className.t_str(), + title ? title : m_windowName.t_str(), + style, + x, y, w, h, + (HWND)MSWGetParent(), + (HMENU)wxUIntToPtr(controlId), + wxGetInstance(), + NULL // no extra data + ); + + if ( !m_hWnd ) + { + wxLogSysError(_("Can't create window of class %s"), className.c_str()); + + return false; + } + + SubclassWin(m_hWnd); + + return true; +} + +// =========================================================================== +// MSW message handlers +// =========================================================================== + +// --------------------------------------------------------------------------- +// WM_NOTIFY +// --------------------------------------------------------------------------- + +bool wxWindowMSW::HandleNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) +{ +#ifndef __WXMICROWIN__ + LPNMHDR hdr = (LPNMHDR)lParam; + HWND hWnd = hdr->hwndFrom; + wxWindow *win = wxFindWinFromHandle(hWnd); + + // if the control is one of our windows, let it handle the message itself + if ( win ) + { + return win->MSWOnNotify(idCtrl, lParam, result); + } + + // VZ: why did we do it? normally this is unnecessary and, besides, it + // breaks the message processing for the toolbars because the tooltip + // notifications were being forwarded to the toolbar child controls + // (if it had any) before being passed to the toolbar itself, so in my + // example the tooltip for the combobox was always shown instead of the + // correct button tooltips +#if 0 + // try all our children + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + while ( node ) + { + wxWindow *child = node->GetData(); + if ( child->MSWOnNotify(idCtrl, lParam, result) ) + { + return true; + } + + node = node->GetNext(); + } +#endif // 0 + + // by default, handle it ourselves + return MSWOnNotify(idCtrl, lParam, result); +#else // __WXMICROWIN__ + return false; +#endif +} + +#if wxUSE_TOOLTIPS + +bool wxWindowMSW::HandleTooltipNotify(WXUINT code, + WXLPARAM lParam, + const wxString& ttip) +{ + // I don't know why it happens, but the versions of comctl32.dll starting + // from 4.70 sometimes send TTN_NEEDTEXTW even to ANSI programs (normally, + // this message is supposed to be sent to Unicode programs only) -- hence + // we need to handle it as well, otherwise no tooltips will be shown in + // this case +#ifndef __WXWINCE__ + if ( !(code == (WXUINT) TTN_NEEDTEXTA || code == (WXUINT) TTN_NEEDTEXTW) + || ttip.empty() ) + { + // not a tooltip message or no tooltip to show anyhow + return false; + } +#endif + + LPTOOLTIPTEXT ttText = (LPTOOLTIPTEXT)lParam; + + // We don't want to use the szText buffer because it has a limit of 80 + // bytes and this is not enough, especially for Unicode build where it + // limits the tooltip string length to only 40 characters + // + // The best would be, of course, to not impose any length limitations at + // all but then the buffer would have to be dynamic and someone would have + // to free it and we don't have the tooltip owner object here any more, so + // for now use our own static buffer with a higher fixed max length. + // + // Note that using a static buffer should not be a problem as only a single + // tooltip can be shown at the same time anyhow. +#if !wxUSE_UNICODE + if ( code == (WXUINT) TTN_NEEDTEXTW ) + { + // We need to convert tooltip from multi byte to Unicode on the fly. + static wchar_t buf[513]; + + // Truncate tooltip length if needed as otherwise we might not have + // enough space for it in the buffer and MultiByteToWideChar() would + // return an error + size_t tipLength = wxMin(ttip.length(), WXSIZEOF(buf) - 1); + + // Convert to WideChar without adding the NULL character. The NULL + // character is added afterwards (this is more efficient). + int len = ::MultiByteToWideChar + ( + CP_ACP, + 0, // no flags + ttip.t_str(), + tipLength, + buf, + WXSIZEOF(buf) - 1 + ); + + if ( !len ) + { + wxLogLastError(wxT("MultiByteToWideChar()")); + } + + buf[len] = L'\0'; + ttText->lpszText = (LPSTR) buf; + } + else // TTN_NEEDTEXTA +#endif // !wxUSE_UNICODE + { + // we get here if we got TTN_NEEDTEXTA (only happens in ANSI build) or + // if we got TTN_NEEDTEXTW in Unicode build: in this case we just have + // to copy the string we have into the buffer + static wxChar buf[513]; + wxStrlcpy(buf, ttip.c_str(), WXSIZEOF(buf)); + ttText->lpszText = buf; + } + + return true; +} + +#endif // wxUSE_TOOLTIPS + +bool wxWindowMSW::MSWOnNotify(int WXUNUSED(idCtrl), + WXLPARAM lParam, + WXLPARAM* WXUNUSED(result)) +{ +#if wxUSE_TOOLTIPS + if ( m_tooltip ) + { + NMHDR* hdr = (NMHDR *)lParam; + if ( HandleTooltipNotify(hdr->code, lParam, m_tooltip->GetTip())) + { + // processed + return true; + } + } +#else + wxUnusedVar(lParam); +#endif // wxUSE_TOOLTIPS + + return false; +} + +// --------------------------------------------------------------------------- +// end session messages +// --------------------------------------------------------------------------- + +bool wxWindowMSW::HandleQueryEndSession(long logOff, bool *mayEnd) +{ +#ifdef ENDSESSION_LOGOFF + wxCloseEvent event(wxEVT_QUERY_END_SESSION, wxID_ANY); + event.SetEventObject(wxTheApp); + event.SetCanVeto(true); + event.SetLoggingOff(logOff == (long)ENDSESSION_LOGOFF); + + bool rc = wxTheApp->ProcessEvent(event); + + if ( rc ) + { + // we may end only if the app didn't veto session closing (double + // negation...) + *mayEnd = !event.GetVeto(); + } + + return rc; +#else + wxUnusedVar(logOff); + wxUnusedVar(mayEnd); + return false; +#endif +} + +bool wxWindowMSW::HandleEndSession(bool endSession, long logOff) +{ +#ifdef ENDSESSION_LOGOFF + // do nothing if the session isn't ending + if ( !endSession ) + return false; + + // only send once + if ( (this != wxTheApp->GetTopWindow()) ) + return false; + + wxCloseEvent event(wxEVT_END_SESSION, wxID_ANY); + event.SetEventObject(wxTheApp); + event.SetCanVeto(false); + event.SetLoggingOff((logOff & ENDSESSION_LOGOFF) != 0); + + return wxTheApp->ProcessEvent(event); +#else + wxUnusedVar(endSession); + wxUnusedVar(logOff); + return false; +#endif +} + +// --------------------------------------------------------------------------- +// window creation/destruction +// --------------------------------------------------------------------------- + +bool wxWindowMSW::HandleCreate(WXLPCREATESTRUCT WXUNUSED_IN_WINCE(cs), + bool *mayCreate) +{ + // VZ: why is this commented out for WinCE? If it doesn't support + // WS_EX_CONTROLPARENT at all it should be somehow handled globally, + // not with multiple #ifdef's! +#ifndef __WXWINCE__ + if ( ((CREATESTRUCT *)cs)->dwExStyle & WS_EX_CONTROLPARENT ) + EnsureParentHasControlParentStyle(GetParent()); +#endif // !__WXWINCE__ + + *mayCreate = true; + + return true; +} + +bool wxWindowMSW::HandleDestroy() +{ + // delete our drop target if we've got one +#if wxUSE_DRAG_AND_DROP + if ( m_dropTarget != NULL ) + { + m_dropTarget->Revoke(m_hWnd); + + wxDELETE(m_dropTarget); + } +#endif // wxUSE_DRAG_AND_DROP + + // WM_DESTROY handled + return true; +} + +// --------------------------------------------------------------------------- +// activation/focus +// --------------------------------------------------------------------------- + +bool wxWindowMSW::HandleActivate(int state, + bool WXUNUSED(minimized), + WXHWND WXUNUSED(activate)) +{ + wxActivateEvent event(wxEVT_ACTIVATE, + (state == WA_ACTIVE) || (state == WA_CLICKACTIVE), + m_windowId, + state == WA_CLICKACTIVE + ? wxActivateEvent::Reason_Mouse + : wxActivateEvent::Reason_Unknown); + event.SetEventObject(this); + + return HandleWindowEvent(event); +} + +bool wxWindowMSW::HandleSetFocus(WXHWND hwnd) +{ + // Strangly enough, some controls get set focus events when they are being + // deleted, even if they already had focus before. + if ( m_isBeingDeleted ) + { + return false; + } + + // notify the parent keeping track of focus for the kbd navigation + // purposes that we got it + wxChildFocusEvent eventFocus((wxWindow *)this); + (void)HandleWindowEvent(eventFocus); + +#if wxUSE_CARET + // Deal with caret + if ( m_caret ) + { + m_caret->OnSetFocus(); + } +#endif // wxUSE_CARET + + wxFocusEvent event(wxEVT_SET_FOCUS, m_windowId); + event.SetEventObject(this); + + // wxFindWinFromHandle() may return NULL, it is ok + event.SetWindow(wxFindWinFromHandle(hwnd)); + + return HandleWindowEvent(event); +} + +bool wxWindowMSW::HandleKillFocus(WXHWND hwnd) +{ +#if wxUSE_CARET + // Deal with caret + if ( m_caret ) + { + m_caret->OnKillFocus(); + } +#endif // wxUSE_CARET + + // Don't send the event when in the process of being deleted. This can + // only cause problems if the event handler tries to access the object. + if ( m_isBeingDeleted ) + { + return false; + } + + wxFocusEvent event(wxEVT_KILL_FOCUS, m_windowId); + event.SetEventObject(this); + + // wxFindWinFromHandle() may return NULL, it is ok + event.SetWindow(wxFindWinFromHandle(hwnd)); + + return HandleWindowEvent(event); +} + +// --------------------------------------------------------------------------- +// labels +// --------------------------------------------------------------------------- + +void wxWindowMSW::SetLabel( const wxString& label) +{ + SetWindowText(GetHwnd(), label.c_str()); +} + +wxString wxWindowMSW::GetLabel() const +{ + return wxGetWindowText(GetHWND()); +} + +// --------------------------------------------------------------------------- +// miscellaneous +// --------------------------------------------------------------------------- + +bool wxWindowMSW::HandleShow(bool show, int WXUNUSED(status)) +{ + wxShowEvent event(GetId(), show); + event.SetEventObject(this); + + return HandleWindowEvent(event); +} + +bool wxWindowMSW::HandleInitDialog(WXHWND WXUNUSED(hWndFocus)) +{ + wxInitDialogEvent event(GetId()); + event.SetEventObject(this); + + return HandleWindowEvent(event); +} + +bool wxWindowMSW::HandleDropFiles(WXWPARAM wParam) +{ +#if defined (__WXMICROWIN__) || defined(__WXWINCE__) + wxUnusedVar(wParam); + return false; +#else // __WXMICROWIN__ + HDROP hFilesInfo = (HDROP) wParam; + + // Get the total number of files dropped + UINT gwFilesDropped = ::DragQueryFile + ( + (HDROP)hFilesInfo, + (UINT)-1, + (LPTSTR)0, + (UINT)0 + ); + + wxString *files = new wxString[gwFilesDropped]; + for ( UINT wIndex = 0; wIndex < gwFilesDropped; wIndex++ ) + { + // first get the needed buffer length (+1 for terminating NUL) + size_t len = ::DragQueryFile(hFilesInfo, wIndex, NULL, 0) + 1; + + // and now get the file name + ::DragQueryFile(hFilesInfo, wIndex, + wxStringBuffer(files[wIndex], len), len); + } + + wxDropFilesEvent event(wxEVT_DROP_FILES, gwFilesDropped, files); + event.SetEventObject(this); + + POINT dropPoint; + DragQueryPoint(hFilesInfo, (LPPOINT) &dropPoint); + event.m_pos.x = dropPoint.x; + event.m_pos.y = dropPoint.y; + + DragFinish(hFilesInfo); + + return HandleWindowEvent(event); +#endif +} + + +bool wxWindowMSW::HandleSetCursor(WXHWND WXUNUSED(hWnd), + short nHitTest, + int WXUNUSED(mouseMsg)) +{ +#ifndef __WXMICROWIN__ + // the logic is as follows: + // 0. if we're busy, set the busy cursor (even for non client elements) + // 1. don't set custom cursor for non client area of enabled windows + // 2. ask user EVT_SET_CURSOR handler for the cursor + // 3. if still no cursor but we're in a TLW, set the global cursor + + HCURSOR hcursor = 0; + + // Check for "business" is complicated by the fact that modal dialogs shown + // while busy cursor is in effect shouldn't show it as they are active and + // accept input from the user, unlike all the other windows. + bool isBusy = false; + if ( wxIsBusy() ) + { + wxDialog* const + dlg = wxDynamicCast(wxGetTopLevelParent(this), wxDialog); + if ( !dlg || !dlg->IsModal() ) + isBusy = true; + } + + if ( isBusy ) + { + hcursor = wxGetCurrentBusyCursor(); + } + else // not busy + { + if ( nHitTest != HTCLIENT ) + return false; + + // first ask the user code - it may wish to set the cursor in some very + // specific way (for example, depending on the current position) + POINT pt; + wxGetCursorPosMSW(&pt); + + int x = pt.x, + y = pt.y; + ScreenToClient(&x, &y); + wxSetCursorEvent event(x, y); + event.SetId(GetId()); + event.SetEventObject(this); + + bool processedEvtSetCursor = HandleWindowEvent(event); + if ( processedEvtSetCursor && event.HasCursor() ) + { + hcursor = GetHcursorOf(event.GetCursor()); + } + + if ( !hcursor ) + { + // the test for processedEvtSetCursor is here to prevent using + // m_cursor if the user code caught EVT_SET_CURSOR() and returned + // nothing from it - this is a way to say that our cursor shouldn't + // be used for this point + if ( !processedEvtSetCursor && m_cursor.IsOk() ) + { + hcursor = GetHcursorOf(m_cursor); + } + + if ( !hcursor && !GetParent() ) + { + const wxCursor *cursor = wxGetGlobalCursor(); + if ( cursor && cursor->IsOk() ) + { + hcursor = GetHcursorOf(*cursor); + } + } + } + } + + + if ( hcursor ) + { + ::SetCursor(hcursor); + + // cursor set, stop here + return true; + } +#endif // __WXMICROWIN__ + + // pass up the window chain + return false; +} + +bool wxWindowMSW::HandlePower(WXWPARAM WXUNUSED_IN_WINCE(wParam), + WXLPARAM WXUNUSED(lParam), + bool *WXUNUSED_IN_WINCE(vetoed)) +{ +#ifdef __WXWINCE__ + // FIXME + return false; +#else + wxEventType evtType; + switch ( wParam ) + { + case PBT_APMQUERYSUSPEND: + evtType = wxEVT_POWER_SUSPENDING; + break; + + case PBT_APMQUERYSUSPENDFAILED: + evtType = wxEVT_POWER_SUSPEND_CANCEL; + break; + + case PBT_APMSUSPEND: + evtType = wxEVT_POWER_SUSPENDED; + break; + + case PBT_APMRESUMESUSPEND: + evtType = wxEVT_POWER_RESUME; + break; + + default: + wxLogDebug(wxT("Unknown WM_POWERBROADCAST(%d) event"), wParam); + // fall through + + // these messages are currently not mapped to wx events + case PBT_APMQUERYSTANDBY: + case PBT_APMQUERYSTANDBYFAILED: + case PBT_APMSTANDBY: + case PBT_APMRESUMESTANDBY: + case PBT_APMBATTERYLOW: + case PBT_APMPOWERSTATUSCHANGE: + case PBT_APMOEMEVENT: + case PBT_APMRESUMECRITICAL: +#ifdef PBT_APMRESUMEAUTOMATIC + case PBT_APMRESUMEAUTOMATIC: +#endif + evtType = wxEVT_NULL; + break; + } + + // don't handle unknown messages + if ( evtType == wxEVT_NULL ) + return false; + + // TODO: notify about PBTF_APMRESUMEFROMFAILURE in case of resume events? + + wxPowerEvent event(evtType); + if ( !HandleWindowEvent(event) ) + return false; + + *vetoed = event.IsVetoed(); + + return true; +#endif +} + +bool wxWindowMSW::IsDoubleBuffered() const +{ + for ( const wxWindowMSW *win = this; win; win = win->GetParent() ) + { + if ( wxHasWindowExStyle(win, WS_EX_COMPOSITED) ) + return true; + + if ( win->IsTopLevel() ) + break; + } + + return false; +} + +void wxWindowMSW::SetDoubleBuffered(bool on) +{ + // Get the current extended style bits + long exstyle = wxGetWindowExStyle(this); + + // Twiddle the bit as needed + if ( on ) + exstyle |= WS_EX_COMPOSITED; + else + exstyle &= ~WS_EX_COMPOSITED; + + // put it back + wxSetWindowExStyle(this, exstyle); +} + +// --------------------------------------------------------------------------- +// owner drawn stuff +// --------------------------------------------------------------------------- + +#if (wxUSE_OWNER_DRAWN && wxUSE_MENUS_NATIVE) || \ + (wxUSE_CONTROLS && !defined(__WXUNIVERSAL__)) + #define WXUNUSED_UNLESS_ODRAWN(param) param +#else + #define WXUNUSED_UNLESS_ODRAWN(param) +#endif + +bool +wxWindowMSW::MSWOnDrawItem(int WXUNUSED_UNLESS_ODRAWN(id), + WXDRAWITEMSTRUCT * WXUNUSED_UNLESS_ODRAWN(itemStruct)) +{ +#if wxUSE_OWNER_DRAWN + +#if wxUSE_MENUS_NATIVE + // is it a menu item? + DRAWITEMSTRUCT *pDrawStruct = (DRAWITEMSTRUCT *)itemStruct; + if ( id == 0 && pDrawStruct->CtlType == ODT_MENU ) + { + wxMenuItem *pMenuItem = (wxMenuItem *)(pDrawStruct->itemData); + + // see comment before the same test in MSWOnMeasureItem() below + if ( !pMenuItem ) + return false; + + wxCHECK_MSG( wxDynamicCast(pMenuItem, wxMenuItem), + false, wxT("MSWOnDrawItem: bad wxMenuItem pointer") ); + + // prepare to call OnDrawItem(): notice using of wxDCTemp to prevent + // the DC from being released + wxDCTemp dc((WXHDC)pDrawStruct->hDC); + wxRect rect(pDrawStruct->rcItem.left, pDrawStruct->rcItem.top, + pDrawStruct->rcItem.right - pDrawStruct->rcItem.left, + pDrawStruct->rcItem.bottom - pDrawStruct->rcItem.top); + + return pMenuItem->OnDrawItem + ( + dc, + rect, + (wxOwnerDrawn::wxODAction)pDrawStruct->itemAction, + (wxOwnerDrawn::wxODStatus)pDrawStruct->itemState + ); + } +#endif // wxUSE_MENUS_NATIVE + +#endif // USE_OWNER_DRAWN + +#if wxUSE_CONTROLS && !defined(__WXUNIVERSAL__) + +#if wxUSE_OWNER_DRAWN + wxControl *item = wxDynamicCast(FindItem(id), wxControl); +#else // !wxUSE_OWNER_DRAWN + // we may still have owner-drawn buttons internally because we have to make + // them owner-drawn to support colour change + wxControl *item = +# if wxUSE_BUTTON + wxDynamicCast(FindItem(id), wxButton) +# else + NULL +# endif + ; +#endif // USE_OWNER_DRAWN + + if ( item ) + { + return item->MSWOnDraw(itemStruct); + } + +#endif // wxUSE_CONTROLS + + return false; +} + +bool +wxWindowMSW::MSWOnMeasureItem(int id, WXMEASUREITEMSTRUCT *itemStruct) +{ +#if wxUSE_OWNER_DRAWN && wxUSE_MENUS_NATIVE + // is it a menu item? + MEASUREITEMSTRUCT *pMeasureStruct = (MEASUREITEMSTRUCT *)itemStruct; + if ( id == 0 && pMeasureStruct->CtlType == ODT_MENU ) + { + wxMenuItem *pMenuItem = (wxMenuItem *)(pMeasureStruct->itemData); + + // according to Carsten Fuchs the pointer may be NULL under XP if an + // MDI child frame is initially maximized, see this for more info: + // http://article.gmane.org/gmane.comp.lib.wxwidgets.general/27745 + // + // so silently ignore it instead of asserting + if ( !pMenuItem ) + return false; + + wxCHECK_MSG( wxDynamicCast(pMenuItem, wxMenuItem), + false, wxT("MSWOnMeasureItem: bad wxMenuItem pointer") ); + + size_t w, h; + bool rc = pMenuItem->OnMeasureItem(&w, &h); + + pMeasureStruct->itemWidth = w; + pMeasureStruct->itemHeight = h; + + return rc; + } + + wxControl *item = wxDynamicCast(FindItem(id), wxControl); + if ( item ) + { + return item->MSWOnMeasure(itemStruct); + } +#else + wxUnusedVar(id); + wxUnusedVar(itemStruct); +#endif // wxUSE_OWNER_DRAWN && wxUSE_MENUS_NATIVE + + return false; +} + +// --------------------------------------------------------------------------- +// colours and palettes +// --------------------------------------------------------------------------- + +bool wxWindowMSW::HandleSysColorChange() +{ + wxSysColourChangedEvent event; + event.SetEventObject(this); + + (void)HandleWindowEvent(event); + + // always let the system carry on the default processing to allow the + // native controls to react to the colours update + return false; +} + +bool wxWindowMSW::HandleDisplayChange() +{ + wxDisplayChangedEvent event; + event.SetEventObject(this); + + return HandleWindowEvent(event); +} + +#ifndef __WXMICROWIN__ + +bool wxWindowMSW::HandleCtlColor(WXHBRUSH *brush, WXHDC hDC, WXHWND hWnd) +{ +#if !wxUSE_CONTROLS || defined(__WXUNIVERSAL__) + wxUnusedVar(hDC); + wxUnusedVar(hWnd); +#else + wxControl *item = wxDynamicCast(FindItemByHWND(hWnd, true), wxControl); + + if ( item ) + *brush = item->MSWControlColor(hDC, hWnd); + else +#endif // wxUSE_CONTROLS + *brush = NULL; + + return *brush != NULL; +} + +#endif // __WXMICROWIN__ + +bool wxWindowMSW::HandlePaletteChanged(WXHWND hWndPalChange) +{ +#if wxUSE_PALETTE + // same as below except we don't respond to our own messages + if ( hWndPalChange != GetHWND() ) + { + // check to see if we our our parents have a custom palette + wxWindowMSW *win = this; + while ( win && !win->HasCustomPalette() ) + { + win = win->GetParent(); + } + + if ( win && win->HasCustomPalette() ) + { + // realize the palette to see whether redrawing is needed + HDC hdc = ::GetDC((HWND) hWndPalChange); + win->m_palette.SetHPALETTE((WXHPALETTE) + ::SelectPalette(hdc, GetHpaletteOf(win->m_palette), FALSE)); + + int result = ::RealizePalette(hdc); + + // restore the palette (before releasing the DC) + win->m_palette.SetHPALETTE((WXHPALETTE) + ::SelectPalette(hdc, GetHpaletteOf(win->m_palette), FALSE)); + ::RealizePalette(hdc); + ::ReleaseDC((HWND) hWndPalChange, hdc); + + // now check for the need to redraw + if (result > 0) + ::InvalidateRect((HWND) hWndPalChange, NULL, TRUE); + } + + } +#endif // wxUSE_PALETTE + + wxPaletteChangedEvent event(GetId()); + event.SetEventObject(this); + event.SetChangedWindow(wxFindWinFromHandle(hWndPalChange)); + + return HandleWindowEvent(event); +} + +bool wxWindowMSW::HandleCaptureChanged(WXHWND hWndGainedCapture) +{ + // Ensure that wxWindow::GetCapture() returns NULL if called from the event + // handlers invoked below. This is necessary to avoid wrongly calling + // ReleaseMouse() when we're already losing the mouse capture anyhow. + gs_insideCaptureChanged = true; + wxON_BLOCK_EXIT_SET(gs_insideCaptureChanged, false); + + // notify windows on the capture stack about lost capture + // (see http://sourceforge.net/tracker/index.php?func=detail&aid=1153662&group_id=9863&atid=109863): + wxWindowBase::NotifyCaptureLost(); + + wxWindow *win = wxFindWinFromHandle(hWndGainedCapture); + wxMouseCaptureChangedEvent event(GetId(), win); + event.SetEventObject(this); + return HandleWindowEvent(event); +} + +bool wxWindowMSW::HandleSettingChange(WXWPARAM wParam, WXLPARAM lParam) +{ + // despite MSDN saying "(This message cannot be sent directly to a window.)" + // we need to send this to child windows (it is only sent to top-level + // windows) so {list,tree}ctrls can adjust their font size if necessary + // this is exactly how explorer does it to enable the font size changes + + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + while ( node ) + { + // top-level windows already get this message from the system + wxWindow *win = node->GetData(); + if ( !win->IsTopLevel() ) + { + ::SendMessage(GetHwndOf(win), WM_SETTINGCHANGE, wParam, lParam); + } + + node = node->GetNext(); + } + + // let the system handle it + return false; +} + +bool wxWindowMSW::HandleQueryNewPalette() +{ + +#if wxUSE_PALETTE + // check to see if we our our parents have a custom palette + wxWindowMSW *win = this; + while (!win->HasCustomPalette() && win->GetParent()) win = win->GetParent(); + if (win->HasCustomPalette()) { + /* realize the palette to see whether redrawing is needed */ + HDC hdc = ::GetDC((HWND) GetHWND()); + win->m_palette.SetHPALETTE( (WXHPALETTE) + ::SelectPalette(hdc, (HPALETTE) win->m_palette.GetHPALETTE(), FALSE) ); + + int result = ::RealizePalette(hdc); + /* restore the palette (before releasing the DC) */ + win->m_palette.SetHPALETTE( (WXHPALETTE) + ::SelectPalette(hdc, (HPALETTE) win->m_palette.GetHPALETTE(), TRUE) ); + ::RealizePalette(hdc); + ::ReleaseDC((HWND) GetHWND(), hdc); + /* now check for the need to redraw */ + if (result > 0) + ::InvalidateRect((HWND) GetHWND(), NULL, TRUE); + } +#endif // wxUSE_PALETTE + + wxQueryNewPaletteEvent event(GetId()); + event.SetEventObject(this); + + return HandleWindowEvent(event) && event.GetPaletteRealized(); +} + +// Responds to colour changes: passes event on to children. +void wxWindowMSW::OnSysColourChanged(wxSysColourChangedEvent& WXUNUSED(event)) +{ + // the top level window also reset the standard colour map as it might have + // changed (there is no need to do it for the non top level windows as we + // only have to do it once) + if ( IsTopLevel() ) + { + // FIXME-MT + gs_hasStdCmap = false; + } + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + while ( node ) + { + // Only propagate to non-top-level windows because Windows already + // sends this event to all top-level ones + wxWindow *win = node->GetData(); + if ( !win->IsTopLevel() ) + { + // we need to send the real WM_SYSCOLORCHANGE and not just trigger + // EVT_SYS_COLOUR_CHANGED call because the latter wouldn't work for + // the standard controls + ::SendMessage(GetHwndOf(win), WM_SYSCOLORCHANGE, 0, 0); + } + + node = node->GetNext(); + } +} + +extern wxCOLORMAP *wxGetStdColourMap() +{ + static COLORREF s_stdColours[wxSTD_COL_MAX]; + static wxCOLORMAP s_cmap[wxSTD_COL_MAX]; + + if ( !gs_hasStdCmap ) + { + static bool s_coloursInit = false; + + if ( !s_coloursInit ) + { + // When a bitmap is loaded, the RGB values can change (apparently + // because Windows adjusts them to care for the old programs always + // using 0xc0c0c0 while the transparent colour for the new Windows + // versions is different). But we do this adjustment ourselves so + // we want to avoid Windows' "help" and for this we need to have a + // reference bitmap which can tell us what the RGB values change + // to. + wxLogNull logNo; // suppress error if we couldn't load the bitmap + wxBitmap stdColourBitmap(wxT("wxBITMAP_STD_COLOURS")); + if ( stdColourBitmap.IsOk() ) + { + // the pixels in the bitmap must correspond to wxSTD_COL_XXX! + wxASSERT_MSG( stdColourBitmap.GetWidth() == wxSTD_COL_MAX, + wxT("forgot to update wxBITMAP_STD_COLOURS!") ); + + wxMemoryDC memDC; + memDC.SelectObject(stdColourBitmap); + + wxColour colour; + for ( size_t i = 0; i < WXSIZEOF(s_stdColours); i++ ) + { + memDC.GetPixel(i, 0, &colour); + s_stdColours[i] = wxColourToRGB(colour); + } + } + else // wxBITMAP_STD_COLOURS couldn't be loaded + { + s_stdColours[0] = RGB(000,000,000); // black + s_stdColours[1] = RGB(128,128,128); // dark grey + s_stdColours[2] = RGB(192,192,192); // light grey + s_stdColours[3] = RGB(255,255,255); // white + //s_stdColours[4] = RGB(000,000,255); // blue + //s_stdColours[5] = RGB(255,000,255); // magenta + } + + s_coloursInit = true; + } + + gs_hasStdCmap = true; + + // create the colour map +#define INIT_CMAP_ENTRY(col) \ + s_cmap[wxSTD_COL_##col].from = s_stdColours[wxSTD_COL_##col]; \ + s_cmap[wxSTD_COL_##col].to = ::GetSysColor(COLOR_##col) + + INIT_CMAP_ENTRY(BTNTEXT); + INIT_CMAP_ENTRY(BTNSHADOW); + INIT_CMAP_ENTRY(BTNFACE); + INIT_CMAP_ENTRY(BTNHIGHLIGHT); + +#undef INIT_CMAP_ENTRY + } + + return s_cmap; +} + +#if wxUSE_UXTHEME && !defined(TMT_FILLCOLOR) + #define TMT_FILLCOLOR 3802 + #define TMT_TEXTCOLOR 3803 + #define TMT_BORDERCOLOR 3801 +#endif + +wxColour wxWindowMSW::MSWGetThemeColour(const wchar_t *themeName, + int themePart, + int themeState, + MSWThemeColour themeColour, + wxSystemColour fallback) const +{ +#if wxUSE_UXTHEME + const wxUxThemeEngine* theme = wxUxThemeEngine::GetIfActive(); + if ( theme ) + { + int themeProperty = 0; + + // TODO: Convert this into a table? Sure would be faster. + switch ( themeColour ) + { + case ThemeColourBackground: + themeProperty = TMT_FILLCOLOR; + break; + case ThemeColourText: + themeProperty = TMT_TEXTCOLOR; + break; + case ThemeColourBorder: + themeProperty = TMT_BORDERCOLOR; + break; + default: + wxFAIL_MSG(wxT("unsupported theme colour")); + }; + + wxUxThemeHandle hTheme((const wxWindow *)this, themeName); + COLORREF col; + HRESULT hr = theme->GetThemeColor + ( + hTheme, + themePart, + themeState, + themeProperty, + &col + ); + + if ( SUCCEEDED(hr) ) + return wxRGBToColour(col); + + wxLogApiError( + wxString::Format( + "GetThemeColor(%s, %i, %i, %i)", + themeName, themePart, themeState, themeProperty), + hr); + } +#else + wxUnusedVar(themeName); + wxUnusedVar(themePart); + wxUnusedVar(themeState); + wxUnusedVar(themeColour); +#endif + return wxSystemSettings::GetColour(fallback); +} + +// --------------------------------------------------------------------------- +// painting +// --------------------------------------------------------------------------- + +// this variable is used to check that a paint event handler which processed +// the event did create a wxPaintDC inside its code and called BeginPaint() to +// validate the invalidated window area as otherwise we'd keep getting an +// endless stream of WM_PAINT messages for this window resulting in a lot of +// difficult to debug problems (e.g. impossibility to repaint other windows, +// lack of timer and idle events and so on) +extern bool wxDidCreatePaintDC; +bool wxDidCreatePaintDC = false; + +bool wxWindowMSW::HandlePaint() +{ + HRGN hRegion = ::CreateRectRgn(0, 0, 0, 0); // Dummy call to get a handle + if ( !hRegion ) + { + wxLogLastError(wxT("CreateRectRgn")); + } + if ( ::GetUpdateRgn(GetHwnd(), hRegion, FALSE) == ERROR ) + { + wxLogLastError(wxT("GetUpdateRgn")); + } + + m_updateRegion = wxRegion((WXHRGN) hRegion); + + wxDidCreatePaintDC = false; + + wxPaintEvent event(m_windowId); + event.SetEventObject(this); + + bool processed = HandleWindowEvent(event); + + if ( processed && !wxDidCreatePaintDC ) + { + // do call MSWDefWindowProc() to validate the update region to avoid + // the problems mentioned above + processed = false; + } + + // note that we must generate NC event after the normal one as otherwise + // BeginPaint() will happily overwrite our decorations with the background + // colour + wxNcPaintEvent eventNc(m_windowId); + eventNc.SetEventObject(this); + HandleWindowEvent(eventNc); + + // don't keep an HRGN we don't need any longer (GetUpdateRegion() can only + // be called from inside the event handlers called above) + m_updateRegion.Clear(); + + wxPaintDCImpl::EndPaint((wxWindow *)this); + + return processed; +} + +// Can be called from an application's OnPaint handler +void wxWindowMSW::OnPaint(wxPaintEvent& event) +{ +#ifdef __WXUNIVERSAL__ + event.Skip(); +#else + HDC hDC = (HDC) wxPaintDCImpl::FindDCInCache((wxWindow*) event.GetEventObject()); + if (hDC != 0) + { + MSWDefWindowProc(WM_PAINT, (WPARAM) hDC, 0); + } +#endif +} + +bool wxWindowMSW::HandleEraseBkgnd(WXHDC hdc) +{ + if ( IsBeingDeleted() ) + { + // We can get WM_ERASEBKGND after starting the destruction of our top + // level parent. Handling it in this case is unnecessary and can be + // actually harmful as e.g. wxStaticBox::GetClientSize() doesn't work + // without a valid TLW parent (because it uses dialog units internally + // which use the dialog font), so just don't do anything then. + return false; + } + + switch ( GetBackgroundStyle() ) + { + case wxBG_STYLE_ERASE: + case wxBG_STYLE_COLOUR: + // we need to generate an erase background event + { + wxDCTemp dc(hdc, GetClientSize()); + wxDCTempImpl *impl = (wxDCTempImpl*) dc.GetImpl(); + + impl->SetHDC(hdc); + impl->SetWindow((wxWindow *)this); + + wxEraseEvent event(m_windowId, &dc); + event.SetEventObject(this); + bool rc = HandleWindowEvent(event); + + // must be called manually as ~wxDC doesn't do anything for + // wxDCTemp + impl->SelectOldObjects(hdc); + + if ( rc ) + { + // background erased by the user-defined handler + return true; + } + } + // fall through + + case wxBG_STYLE_SYSTEM: + if ( !DoEraseBackground(hdc) ) + { + // let the default processing to take place if we didn't erase + // the background ourselves + return false; + } + break; + + case wxBG_STYLE_PAINT: + case wxBG_STYLE_TRANSPARENT: + // no need to do anything here at all, background will be entirely + // redrawn in WM_PAINT handler + break; + + default: + wxFAIL_MSG( "unknown background style" ); + } + + return true; +} + +#ifdef wxHAS_MSW_BACKGROUND_ERASE_HOOK + +bool wxWindowMSW::MSWHasEraseBgHook() const +{ + return gs_eraseBgHooks.find(const_cast(this)) + != gs_eraseBgHooks.end(); +} + +void wxWindowMSW::MSWSetEraseBgHook(wxWindow *child) +{ + if ( child ) + { + if ( !gs_eraseBgHooks.insert( + EraseBgHooks::value_type(this, child)).second ) + { + wxFAIL_MSG( wxT("Setting erase background hook twice?") ); + } + } + else // reset the hook + { + if ( gs_eraseBgHooks.erase(this) != 1 ) + { + wxFAIL_MSG( wxT("Resetting erase background which was not set?") ); + } + } +} + +#endif // wxHAS_MSW_BACKGROUND_ERASE_HOOK + +bool wxWindowMSW::DoEraseBackground(WXHDC hDC) +{ + HBRUSH hbr = (HBRUSH)MSWGetBgBrush(hDC); + if ( !hbr ) + return false; + + // erase just the client area of the window, this is important for the + // frames to avoid drawing over the toolbar part of the window (you might + // think using WS_CLIPCHILDREN would prevent this from happening, but it + // clearly doesn't) + RECT rc; + wxCopyRectToRECT(GetClientRect(), rc); + ::FillRect((HDC)hDC, &rc, hbr); + + return true; +} + +WXHBRUSH +wxWindowMSW::MSWGetBgBrushForChild(WXHDC hDC, wxWindowMSW *child) +{ + // Test for the custom background brush first. + WXHBRUSH hbrush = MSWGetCustomBgBrush(); + if ( hbrush ) + { + // We assume that this is either a stipple or hatched brush and not a + // solid one as otherwise it would have been enough to set the + // background colour and such brushes need to be positioned correctly + // in order to align when different windows are painted, so do it here. + RECT rc; + ::GetWindowRect(GetHwndOf(child), &rc); + + // It is important to pass both points to MapWindowPoints() as in + // addition to converting them to our coordinate system, this function + // will also exchange the left and right coordinates if this window + // uses RTL layout, which is exactly what we need here as the child + // window origin is its _right_ top corner in this case and not the + // left one. + ::MapWindowPoints(NULL, GetHwnd(), (POINT *)&rc, 2); + + int x = rc.left, + y = rc.top; + MSWAdjustBrushOrg(&x, &y); + + if ( !::SetBrushOrgEx((HDC)hDC, -x, -y, NULL) ) + { + wxLogLastError(wxT("SetBrushOrgEx(bg brush)")); + } + + return hbrush; + } + + // Otherwise see if we have a custom background colour. + if ( m_hasBgCol ) + { + wxBrush * + brush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour()); + + return (WXHBRUSH)GetHbrushOf(*brush); + } + + return 0; +} + +WXHBRUSH wxWindowMSW::MSWGetBgBrush(WXHDC hDC) +{ + // Use the special wxWindowBeingErased variable if it is set as the child + // being erased. + wxWindowMSW * const child = +#if wxUSE_UXTHEME + wxWindowBeingErased ? wxWindowBeingErased : +#endif + this; + + for ( wxWindowMSW *win = this; win; win = win->GetParent() ) + { + WXHBRUSH hBrush = win->MSWGetBgBrushForChild(hDC, child); + if ( hBrush ) + return hBrush; + + // don't use the parent background if we're not transparent + if ( !win->HasTransparentBackground() ) + break; + + // background is not inherited beyond top level windows + if ( win->IsTopLevel() ) + break; + } + + return 0; +} + +bool wxWindowMSW::HandlePrintClient(WXHDC hDC) +{ + // we receive this message when DrawThemeParentBackground() is + // called from def window proc of several controls under XP and we + // must draw properly themed background here + // + // note that naively I'd expect filling the client rect with the + // brush returned by MSWGetBgBrush() work -- but for some reason it + // doesn't and we have to call parents MSWPrintChild() which is + // supposed to call DrawThemeBackground() with appropriate params + // + // also note that in this case lParam == PRF_CLIENT but we're + // clearly expected to paint the background and nothing else! + + if ( IsTopLevel() || InheritsBackgroundColour() ) + return false; + + // sometimes we don't want the parent to handle it at all, instead + // return whatever value this window wants + if ( !MSWShouldPropagatePrintChild() ) + return MSWPrintChild(hDC, (wxWindow *)this); + + for ( wxWindow *win = GetParent(); win; win = win->GetParent() ) + { + if ( win->MSWPrintChild(hDC, (wxWindow *)this) ) + return true; + + if ( win->IsTopLevel() || win->InheritsBackgroundColour() ) + break; + } + + return false; +} + +// --------------------------------------------------------------------------- +// moving and resizing +// --------------------------------------------------------------------------- + +bool wxWindowMSW::HandleMinimize() +{ + wxIconizeEvent event(m_windowId); + event.SetEventObject(this); + + return HandleWindowEvent(event); +} + +bool wxWindowMSW::HandleMaximize() +{ + wxMaximizeEvent event(m_windowId); + event.SetEventObject(this); + + return HandleWindowEvent(event); +} + +bool wxWindowMSW::HandleMove(int x, int y) +{ + wxPoint point(x,y); + wxMoveEvent event(point, m_windowId); + event.SetEventObject(this); + + return HandleWindowEvent(event); +} + +bool wxWindowMSW::HandleMoving(wxRect& rect) +{ + wxMoveEvent event(rect, m_windowId); + event.SetEventObject(this); + + bool rc = HandleWindowEvent(event); + if (rc) + rect = event.GetRect(); + return rc; +} + +bool wxWindowMSW::HandleEnterSizeMove() +{ + wxMoveEvent event(wxPoint(0,0), m_windowId); + event.SetEventType(wxEVT_MOVE_START); + event.SetEventObject(this); + + return HandleWindowEvent(event); +} + +bool wxWindowMSW::HandleExitSizeMove() +{ + wxMoveEvent event(wxPoint(0,0), m_windowId); + event.SetEventType(wxEVT_MOVE_END); + event.SetEventObject(this); + + return HandleWindowEvent(event); +} + +bool wxWindowMSW::BeginRepositioningChildren() +{ +#if wxUSE_DEFERRED_SIZING + int numChildren = 0; + for ( HWND child = ::GetWindow(GetHwndOf(this), GW_CHILD); + child; + child = ::GetWindow(child, GW_HWNDNEXT) ) + { + numChildren ++; + } + + // Nothing is gained by deferring the repositioning of a single child. + if ( numChildren < 2 ) + return false; + + // Protect against valid m_hDWP being overwritten + if ( m_hDWP ) + return false; + + m_hDWP = (WXHANDLE)::BeginDeferWindowPos(numChildren); + if ( !m_hDWP ) + { + wxLogLastError(wxT("BeginDeferWindowPos")); + return false; + } + + // Return true to indicate that EndDeferWindowPos() should be called. + return true; +#endif // wxUSE_DEFERRED_SIZING +} + +void wxWindowMSW::EndRepositioningChildren() +{ +#if wxUSE_DEFERRED_SIZING + wxASSERT_MSG( m_hDWP, wxS("Shouldn't be called") ); + + // reset m_hDWP to NULL so that child windows don't try to use our + // m_hDWP after we call EndDeferWindowPos() on it (this shouldn't + // happen anyhow normally but who knows what weird flow of control we + // may have depending on what the users EVT_SIZE handler does...) + HDWP hDWP = (HDWP)m_hDWP; + m_hDWP = NULL; + + // do put all child controls in place at once + if ( !::EndDeferWindowPos(hDWP) ) + { + wxLogLastError(wxT("EndDeferWindowPos")); + } + + // Reset our children's pending pos/size values. + for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + wxWindowMSW * const child = node->GetData(); + child->MSWEndDeferWindowPos(); + } +#endif // wxUSE_DEFERRED_SIZING +} + +bool wxWindowMSW::HandleSize(int WXUNUSED(w), int WXUNUSED(h), WXUINT wParam) +{ + // when we resize this window, its children are probably going to be + // repositioned as well, prepare to use DeferWindowPos() for them + ChildrenRepositioningGuard repositionGuard(this); + + // update this window size + bool processed = false; + switch ( wParam ) + { + default: + wxFAIL_MSG( wxT("unexpected WM_SIZE parameter") ); + // fall through nevertheless + + case SIZE_MAXHIDE: + case SIZE_MAXSHOW: + // we're not interested in these messages at all + break; + + case SIZE_MINIMIZED: + processed = HandleMinimize(); + break; + + case SIZE_MAXIMIZED: + /* processed = */ HandleMaximize(); + // fall through to send a normal size event as well + + case SIZE_RESTORED: + // don't use w and h parameters as they specify the client size + // while according to the docs EVT_SIZE handler is supposed to + // receive the total size + wxSizeEvent event(GetSize(), m_windowId); + event.SetEventObject(this); + + processed = HandleWindowEvent(event); + } + + return processed; +} + +bool wxWindowMSW::HandleSizing(wxRect& rect) +{ + wxSizeEvent event(rect, m_windowId); + event.SetEventObject(this); + + bool rc = HandleWindowEvent(event); + if (rc) + rect = event.GetRect(); + return rc; +} + +bool wxWindowMSW::HandleGetMinMaxInfo(void *WXUNUSED_IN_WINCE(mmInfo)) +{ +#ifdef __WXWINCE__ + return false; +#else + MINMAXINFO *info = (MINMAXINFO *)mmInfo; + + bool rc = false; + + int minWidth = GetMinWidth(), + minHeight = GetMinHeight(), + maxWidth = GetMaxWidth(), + maxHeight = GetMaxHeight(); + + if ( minWidth != wxDefaultCoord ) + { + info->ptMinTrackSize.x = minWidth; + rc = true; + } + + if ( minHeight != wxDefaultCoord ) + { + info->ptMinTrackSize.y = minHeight; + rc = true; + } + + if ( maxWidth != wxDefaultCoord ) + { + info->ptMaxTrackSize.x = maxWidth; + rc = true; + } + + if ( maxHeight != wxDefaultCoord ) + { + info->ptMaxTrackSize.y = maxHeight; + rc = true; + } + + return rc; +#endif +} + +// --------------------------------------------------------------------------- +// command messages +// --------------------------------------------------------------------------- + +bool wxWindowMSW::HandleCommand(WXWORD id_, WXWORD cmd, WXHWND control) +{ + // sign extend to int from short before comparing with the other int ids + int id = (signed short)id_; + +#if wxUSE_MENUS_NATIVE + if ( !cmd && wxCurrentPopupMenu ) + { + wxMenu *popupMenu = wxCurrentPopupMenu; + wxCurrentPopupMenu = NULL; + + return popupMenu->MSWCommand(cmd, id); + } +#endif // wxUSE_MENUS_NATIVE + + wxWindow *win = NULL; + + // first try to find it from HWND - this works even with the broken + // programs using the same ids for different controls + if ( control ) + { + win = wxFindWinFromHandle(control); + } + + // try the id + if ( !win ) + { + win = FindItem(id, control); + } + + if ( win ) + { + return win->MSWCommand(cmd, id); + } + + // the messages sent from the in-place edit control used by the treectrl + // for label editing have id == 0, but they should _not_ be treated as menu + // messages (they are EN_XXX ones, in fact) so don't translate anything + // coming from a control to wxEVT_MENU + if ( !control ) + { + wxCommandEvent event(wxEVT_MENU, id); + event.SetEventObject(this); + event.SetInt(id); + + return HandleWindowEvent(event); + } + else + { +#if wxUSE_SPINCTRL && !defined(__WXUNIVERSAL__) + // the text ctrl which is logically part of wxSpinCtrl sends WM_COMMAND + // notifications to its parent which we want to reflect back to + // wxSpinCtrl + wxSpinCtrl *spin = wxSpinCtrl::GetSpinForTextCtrl(control); + if ( spin && spin->ProcessTextCommand(cmd, id) ) + return true; +#endif // wxUSE_SPINCTRL + +#if wxUSE_CHOICE && defined(__SMARTPHONE__) + // the listbox ctrl which is logically part of wxChoice sends WM_COMMAND + // notifications to its parent which we want to reflect back to + // wxChoice + wxChoice *choice = wxChoice::GetChoiceForListBox(control); + if ( choice && choice->MSWCommand(cmd, id) ) + return true; +#endif + } + + return false; +} + +// --------------------------------------------------------------------------- +// mouse events +// --------------------------------------------------------------------------- + +void wxWindowMSW::InitMouseEvent(wxMouseEvent& event, + int x, int y, + WXUINT flags) +{ + // our client coords are not quite the same as Windows ones + wxPoint pt = GetClientAreaOrigin(); + event.m_x = x - pt.x; + event.m_y = y - pt.y; + + event.m_shiftDown = (flags & MK_SHIFT) != 0; + event.m_controlDown = (flags & MK_CONTROL) != 0; + event.m_leftDown = (flags & MK_LBUTTON) != 0; + event.m_middleDown = (flags & MK_MBUTTON) != 0; + event.m_rightDown = (flags & MK_RBUTTON) != 0; +#ifdef wxHAS_XBUTTON + event.m_aux1Down = (flags & MK_XBUTTON1) != 0; + event.m_aux2Down = (flags & MK_XBUTTON2) != 0; +#endif // wxHAS_XBUTTON + event.m_altDown = ::wxIsAltDown(); + +#ifndef __WXWINCE__ + event.SetTimestamp(::GetMessageTime()); +#endif + + event.SetEventObject(this); + event.SetId(GetId()); + +#if wxUSE_MOUSEEVENT_HACK + gs_lastMouseEvent.pos = ClientToScreen(wxPoint(x, y)); + gs_lastMouseEvent.type = event.GetEventType(); +#endif // wxUSE_MOUSEEVENT_HACK +} + +#ifdef __WXWINCE__ +// Windows doesn't send the mouse events to the static controls (which are +// transparent in the sense that their WM_NCHITTEST handler returns +// HTTRANSPARENT) at all but we want all controls to receive the mouse events +// and so we manually check if we don't have a child window under mouse and if +// we do, send the event to it instead of the window Windows had sent WM_XXX +// to. +// +// Notice that this is not done for the mouse move events because this could +// (would?) be too slow, but only for clicks which means that the static texts +// still don't get move, enter nor leave events. +static wxWindowMSW *FindWindowForMouseEvent(wxWindowMSW *win, int *x, int *y) +{ + wxCHECK_MSG( x && y, win, wxT("NULL pointer in FindWindowForMouseEvent") ); + + // first try to find a non transparent child: this allows us to send events + // to a static text which is inside a static box, for example + POINT pt = { *x, *y }; + HWND hwnd = GetHwndOf(win), + hwndUnderMouse; + +#ifdef __WXWINCE__ + hwndUnderMouse = ::ChildWindowFromPoint + ( + hwnd, + pt + ); +#else + hwndUnderMouse = ::ChildWindowFromPointEx + ( + hwnd, + pt, + CWP_SKIPINVISIBLE | + CWP_SKIPDISABLED | + CWP_SKIPTRANSPARENT + ); +#endif + + if ( !hwndUnderMouse || hwndUnderMouse == hwnd ) + { + // now try any child window at all + hwndUnderMouse = ::ChildWindowFromPoint(hwnd, pt); + } + + // check that we have a child window which is susceptible to receive mouse + // events: for this it must be shown and enabled + if ( hwndUnderMouse && + hwndUnderMouse != hwnd && + ::IsWindowVisible(hwndUnderMouse) && + ::IsWindowEnabled(hwndUnderMouse) ) + { + wxWindow *winUnderMouse = wxFindWinFromHandle(hwndUnderMouse); + if ( winUnderMouse ) + { + // translate the mouse coords to the other window coords + win->ClientToScreen(x, y); + winUnderMouse->ScreenToClient(x, y); + + win = winUnderMouse; + } + } + + return win; +} +#endif // __WXWINCE__ + +bool wxWindowMSW::HandleMouseEvent(WXUINT msg, int x, int y, WXUINT flags) +{ + // the mouse events take consecutive IDs from WM_MOUSEFIRST to + // WM_MOUSELAST, so it's enough to subtract WM_MOUSEMOVE == WM_MOUSEFIRST + // from the message id and take the value in the table to get wxWin event + // id + static const wxEventType eventsMouse[] = + { + wxEVT_MOTION, + wxEVT_LEFT_DOWN, + wxEVT_LEFT_UP, + wxEVT_LEFT_DCLICK, + wxEVT_RIGHT_DOWN, + wxEVT_RIGHT_UP, + wxEVT_RIGHT_DCLICK, + wxEVT_MIDDLE_DOWN, + wxEVT_MIDDLE_UP, + wxEVT_MIDDLE_DCLICK, + 0, // this one is for wxEVT_MOTION which is not used here + wxEVT_AUX1_DOWN, + wxEVT_AUX1_UP, + wxEVT_AUX1_DCLICK, + wxEVT_AUX2_DOWN, + wxEVT_AUX2_UP, + wxEVT_AUX2_DCLICK + }; + +#ifdef wxHAS_XBUTTON + // the same messages are used for both auxiliary mouse buttons so we need + // to adjust the index manually + switch ( msg ) + { + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: + case WM_XBUTTONDBLCLK: + if (HIWORD(flags) == XBUTTON2) + msg += wxEVT_AUX2_DOWN - wxEVT_AUX1_DOWN; + } +#endif // wxHAS_XBUTTON + + wxMouseEvent event(eventsMouse[msg - WM_MOUSEMOVE]); + InitMouseEvent(event, x, y, flags); + + return HandleWindowEvent(event); +} + +bool wxWindowMSW::HandleMouseMove(int x, int y, WXUINT flags) +{ + if ( !m_mouseInWindow ) + { + // it would be wrong to assume that just because we get a mouse move + // event that the mouse is inside the window: although this is usually + // true, it is not if we had captured the mouse, so we need to check + // the mouse coordinates here + if ( !HasCapture() || IsMouseInWindow() ) + { + // Generate an ENTER event + m_mouseInWindow = true; + +#ifdef HAVE_TRACKMOUSEEVENT + typedef BOOL (WINAPI *_TrackMouseEvent_t)(LPTRACKMOUSEEVENT); +#ifdef __WXWINCE__ + static const _TrackMouseEvent_t + s_pfn_TrackMouseEvent = _TrackMouseEvent; +#else // !__WXWINCE__ + static _TrackMouseEvent_t s_pfn_TrackMouseEvent; + static bool s_initDone = false; + if ( !s_initDone ) + { + // see comment in wxApp::GetComCtl32Version() explaining the + // use of wxLoadedDLL + wxLoadedDLL dllComCtl32(wxT("comctl32.dll")); + if ( dllComCtl32.IsLoaded() ) + { + s_pfn_TrackMouseEvent = (_TrackMouseEvent_t) + dllComCtl32.RawGetSymbol(wxT("_TrackMouseEvent")); + } + + s_initDone = true; + } + + if ( s_pfn_TrackMouseEvent ) +#endif // __WXWINCE__/!__WXWINCE__ + { + WinStruct trackinfo; + + trackinfo.dwFlags = TME_LEAVE; + trackinfo.hwndTrack = GetHwnd(); + + (*s_pfn_TrackMouseEvent)(&trackinfo); + } +#endif // HAVE_TRACKMOUSEEVENT + + wxMouseEvent event(wxEVT_ENTER_WINDOW); + InitMouseEvent(event, x, y, flags); + + (void)HandleWindowEvent(event); + } + } +#ifdef HAVE_TRACKMOUSEEVENT + else // mouse not in window + { + // Check if we need to send a LEAVE event + // Windows doesn't send WM_MOUSELEAVE if the mouse has been captured so + // send it here if we are using native mouse leave tracking + if ( HasCapture() && !IsMouseInWindow() ) + { + GenerateMouseLeave(); + } + } +#endif // HAVE_TRACKMOUSEEVENT + +#if wxUSE_MOUSEEVENT_HACK + // Windows often generates mouse events even if mouse position hasn't + // changed (http://article.gmane.org/gmane.comp.lib.wxwidgets.devel/66576) + // + // Filter this out as it can result in unexpected behaviour compared to + // other platforms + if ( gs_lastMouseEvent.type == wxEVT_RIGHT_DOWN || + gs_lastMouseEvent.type == wxEVT_LEFT_DOWN || + gs_lastMouseEvent.type == wxEVT_MIDDLE_DOWN || + gs_lastMouseEvent.type == wxEVT_MOTION ) + { + if ( ClientToScreen(wxPoint(x, y)) == gs_lastMouseEvent.pos ) + { + gs_lastMouseEvent.type = wxEVT_MOTION; + + return false; + } + } +#endif // wxUSE_MOUSEEVENT_HACK + + return HandleMouseEvent(WM_MOUSEMOVE, x, y, flags); +} + + +bool +wxWindowMSW::HandleMouseWheel(wxMouseWheelAxis axis, + WXWPARAM wParam, WXLPARAM lParam) +{ +#if wxUSE_MOUSEWHEEL + // notice that WM_MOUSEWHEEL position is in screen coords (as it's + // forwarded up to the parent by DefWindowProc()) and not in the client + // ones as all the other messages, translate them to the client coords for + // consistency -- but do it using Windows function and not our own one + // because InitMouseEvent() expects coordinates in Windows client + // coordinates and not wx ones (the difference being the height of the + // toolbar, if any). + POINT pt; + pt.x = GET_X_LPARAM(lParam); + pt.y = GET_Y_LPARAM(lParam); + ::ScreenToClient(GetHwnd(), &pt); + + wxMouseEvent event(wxEVT_MOUSEWHEEL); + InitMouseEvent(event, pt.x, pt.y, LOWORD(wParam)); + event.m_wheelRotation = (short)HIWORD(wParam); + event.m_wheelDelta = WHEEL_DELTA; + event.m_wheelAxis = axis; + + static int s_linesPerRotation = -1; + if ( s_linesPerRotation == -1 ) + { + if ( !::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, + &s_linesPerRotation, 0)) + { + // this is not supposed to happen + wxLogLastError(wxT("SystemParametersInfo(GETWHEELSCROLLLINES)")); + + // the default is 3, so use it if SystemParametersInfo() failed + s_linesPerRotation = 3; + } + } + + static int s_columnsPerRotation = -1; + if ( s_columnsPerRotation == -1 ) + { + if ( !::SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, + &s_columnsPerRotation, 0)) + { + // this setting is not supported on Windows 2000/XP, so use the value of 1 + // http://msdn.microsoft.com/en-us/library/ms997498.aspx + s_columnsPerRotation = 1; + } + } + + event.m_linesPerAction = s_linesPerRotation; + event.m_columnsPerAction = s_columnsPerRotation; + return HandleWindowEvent(event); + +#else // !wxUSE_MOUSEWHEEL + wxUnusedVar(wParam); + wxUnusedVar(lParam); + + return false; +#endif // wxUSE_MOUSEWHEEL/!wxUSE_MOUSEWHEEL +} + +void wxWindowMSW::GenerateMouseLeave() +{ + m_mouseInWindow = false; + + int state = 0; + if ( wxIsShiftDown() ) + state |= MK_SHIFT; + if ( wxIsCtrlDown() ) + state |= MK_CONTROL; + + // Only the high-order bit should be tested + if ( GetKeyState( VK_LBUTTON ) & (1<<15) ) + state |= MK_LBUTTON; + if ( GetKeyState( VK_MBUTTON ) & (1<<15) ) + state |= MK_MBUTTON; + if ( GetKeyState( VK_RBUTTON ) & (1<<15) ) + state |= MK_RBUTTON; + + POINT pt; + wxGetCursorPosMSW(&pt); + + // we need to have client coordinates here for symmetry with + // wxEVT_ENTER_WINDOW + RECT rect = wxGetWindowRect(GetHwnd()); + pt.x -= rect.left; + pt.y -= rect.top; + + wxMouseEvent event(wxEVT_LEAVE_WINDOW); + InitMouseEvent(event, pt.x, pt.y, state); + + (void)HandleWindowEvent(event); +} + +// --------------------------------------------------------------------------- +// keyboard handling +// --------------------------------------------------------------------------- + +namespace +{ + +// Implementation of InitAnyKeyEvent() which can also be used when there is no +// associated window: this can happen for the wxEVT_CHAR_HOOK events created by +// the global keyboard hook (e.g. the event might have happened in a non-wx +// window). +void +MSWInitAnyKeyEvent(wxKeyEvent& event, + WXWPARAM wParam, + WXLPARAM lParam, + const wxWindowBase *win /* may be NULL */) +{ + if ( win ) + { + event.SetId(win->GetId()); + event.SetEventObject(const_cast(win)); + } + else // No associated window. + { + // Use wxID_ANY for compatibility with the old code even if wxID_NONE + // would arguably make more sense. + event.SetId(wxID_ANY); + } + + event.m_shiftDown = wxIsShiftDown(); + event.m_controlDown = wxIsCtrlDown(); + event.m_altDown = (HIWORD(lParam) & KF_ALTDOWN) == KF_ALTDOWN; + + event.m_rawCode = (wxUint32) wParam; + event.m_rawFlags = (wxUint32) lParam; +#ifndef __WXWINCE__ + event.SetTimestamp(::GetMessageTime()); +#endif +} + +} // anonymous namespace + +void +wxWindowMSW::InitAnyKeyEvent(wxKeyEvent& event, + WXWPARAM wParam, + WXLPARAM lParam) const +{ + MSWInitAnyKeyEvent(event, wParam, lParam, this); +} + +wxKeyEvent +wxWindowMSW::CreateKeyEvent(wxEventType evType, + WXWPARAM wParam, + WXLPARAM lParam) const +{ + // Catch any attempts to use this with WM_CHAR, it wouldn't work because + // wParam is supposed to be a virtual key and not a character here. + wxASSERT_MSG( evType != wxEVT_CHAR && evType != wxEVT_CHAR_HOOK, + "CreateKeyEvent() can't be used for char events" ); + + wxKeyEvent event(evType); + InitAnyKeyEvent(event, wParam, lParam); + + event.m_keyCode = wxMSWKeyboard::VKToWX + ( + wParam, + lParam +#if wxUSE_UNICODE + , &event.m_uniChar +#endif // wxUSE_UNICODE + ); + + return event; +} + +wxKeyEvent +wxWindowMSW::CreateCharEvent(wxEventType evType, + WXWPARAM wParam, + WXLPARAM lParam) const +{ + wxKeyEvent event(evType); + InitAnyKeyEvent(event, wParam, lParam); + +#if wxUSE_UNICODE + // TODO: wParam uses UTF-16 so this is incorrect for characters outside of + // the BMP, we should use WM_UNICHAR to handle them. + event.m_uniChar = wParam; +#endif // wxUSE_UNICODE + + // Set non-Unicode key code too for compatibility if possible. + if ( wParam < 0x80 ) + { + // It's an ASCII character, no need to translate it. + event.m_keyCode = wParam; + } + else + { + // Check if this key can be represented (as a single character) in the + // current locale. + const wchar_t wc = wParam; + char ch; + if ( wxConvLibc.FromWChar(&ch, 1, &wc, 1) != wxCONV_FAILED ) + { + // For compatibility continue to provide the key code in this field + // even though using GetUnicodeKey() is recommended now. + event.m_keyCode = static_cast(ch); + } + //else: Key can't be represented in the current locale, leave m_keyCode + // as WXK_NONE and use GetUnicodeKey() to access the character. + } + + // the alphanumeric keys produced by pressing AltGr+something on European + // keyboards have both Ctrl and Alt modifiers which may confuse the user + // code as, normally, keys with Ctrl and/or Alt don't result in anything + // alphanumeric, so pretend that there are no modifiers at all (the + // KEY_DOWN event would still have the correct modifiers if they're really + // needed) + if ( event.m_controlDown && event.m_altDown && + (event.m_keyCode >= 32 && event.m_keyCode < 256) ) + { + event.m_controlDown = + event.m_altDown = false; + } + + return event; +} + +// isASCII is true only when we're called from WM_CHAR handler and not from +// WM_KEYDOWN one +bool wxWindowMSW::HandleChar(WXWPARAM wParam, WXLPARAM lParam) +{ + wxKeyEvent event(CreateCharEvent(wxEVT_CHAR, wParam, lParam)); + return HandleWindowEvent(event); +} + +bool wxWindowMSW::HandleKeyDown(WXWPARAM wParam, WXLPARAM lParam) +{ + wxKeyEvent event(CreateKeyEvent(wxEVT_KEY_DOWN, wParam, lParam)); + return HandleWindowEvent(event); +} + +bool wxWindowMSW::HandleKeyUp(WXWPARAM wParam, WXLPARAM lParam) +{ + wxKeyEvent event(CreateKeyEvent(wxEVT_KEY_UP, wParam, lParam)); + return HandleWindowEvent(event); +} + +#if wxUSE_MENUS +int wxWindowMSW::HandleMenuChar(int WXUNUSED_IN_WINCE(chAccel), + WXLPARAM WXUNUSED_IN_WINCE(lParam)) +{ + // FIXME: implement GetMenuItemCount for WinCE, possibly + // in terms of GetMenuItemInfo +#ifndef __WXWINCE__ + const HMENU hmenu = (HMENU)lParam; + + WinStruct mii; + + // we could use MIIM_FTYPE here as we only need to know if the item is + // ownerdrawn or not and not dwTypeData which MIIM_TYPE also returns, but + // MIIM_FTYPE is not supported under Win95 + mii.fMask = MIIM_TYPE | MIIM_DATA; + + // find if we have this letter in any owner drawn item + const int count = ::GetMenuItemCount(hmenu); + for ( int i = 0; i < count; i++ ) + { + // previous loop iteration could modify it, reset it back before + // calling GetMenuItemInfo() to prevent it from overflowing dwTypeData + mii.cch = 0; + + if ( ::GetMenuItemInfo(hmenu, i, TRUE, &mii) ) + { + if ( mii.fType == MFT_OWNERDRAW ) + { + // dwItemData member of the MENUITEMINFO is a + // pointer to the associated wxMenuItem -- see the + // menu creation code + wxMenuItem *item = (wxMenuItem*)mii.dwItemData; + + const wxString label(item->GetItemLabel()); + const wxChar *p = wxStrchr(label.t_str(), wxT('&')); + while ( p++ ) + { + if ( *p == wxT('&') ) + { + // this is not the accel char, find the real one + p = wxStrchr(p + 1, wxT('&')); + } + else // got the accel char + { + // FIXME-UNICODE: this comparison doesn't risk to work + // for non ASCII accelerator characters I'm afraid, but + // what can we do? + if ( (wchar_t)wxToupper(*p) == (wchar_t)chAccel ) + { + return i; + } + else + { + // this one doesn't match + break; + } + } + } + } + } + else // failed to get the menu text? + { + // it's not fatal, so don't show error, but still log it + wxLogLastError(wxT("GetMenuItemInfo")); + } + } +#endif + return wxNOT_FOUND; +} + +#endif // wxUSE_MENUS + +bool wxWindowMSW::HandleClipboardEvent(WXUINT nMsg) +{ + const wxEventType type = nMsg == WM_CUT ? wxEVT_TEXT_CUT + : nMsg == WM_COPY ? wxEVT_TEXT_COPY + : /* nMsg == WM_PASTE */ wxEVT_TEXT_PASTE; + wxClipboardTextEvent evt(type, GetId()); + + evt.SetEventObject(this); + + return HandleWindowEvent(evt); +} + +// --------------------------------------------------------------------------- +// joystick +// --------------------------------------------------------------------------- + +bool wxWindowMSW::HandleJoystickEvent(WXUINT msg, int x, int y, WXUINT flags) +{ +#ifdef JOY_BUTTON1 + int change = 0; + if ( flags & JOY_BUTTON1CHG ) + change = wxJOY_BUTTON1; + if ( flags & JOY_BUTTON2CHG ) + change = wxJOY_BUTTON2; + if ( flags & JOY_BUTTON3CHG ) + change = wxJOY_BUTTON3; + if ( flags & JOY_BUTTON4CHG ) + change = wxJOY_BUTTON4; + + int buttons = 0; + if ( flags & JOY_BUTTON1 ) + buttons |= wxJOY_BUTTON1; + if ( flags & JOY_BUTTON2 ) + buttons |= wxJOY_BUTTON2; + if ( flags & JOY_BUTTON3 ) + buttons |= wxJOY_BUTTON3; + if ( flags & JOY_BUTTON4 ) + buttons |= wxJOY_BUTTON4; + + // the event ids aren't consecutive so we can't use table based lookup + int joystick; + wxEventType eventType; + switch ( msg ) + { + case MM_JOY1MOVE: + joystick = 1; + eventType = wxEVT_JOY_MOVE; + break; + + case MM_JOY2MOVE: + joystick = 2; + eventType = wxEVT_JOY_MOVE; + break; + + case MM_JOY1ZMOVE: + joystick = 1; + eventType = wxEVT_JOY_ZMOVE; + break; + + case MM_JOY2ZMOVE: + joystick = 2; + eventType = wxEVT_JOY_ZMOVE; + break; + + case MM_JOY1BUTTONDOWN: + joystick = 1; + eventType = wxEVT_JOY_BUTTON_DOWN; + break; + + case MM_JOY2BUTTONDOWN: + joystick = 2; + eventType = wxEVT_JOY_BUTTON_DOWN; + break; + + case MM_JOY1BUTTONUP: + joystick = 1; + eventType = wxEVT_JOY_BUTTON_UP; + break; + + case MM_JOY2BUTTONUP: + joystick = 2; + eventType = wxEVT_JOY_BUTTON_UP; + break; + + default: + wxFAIL_MSG(wxT("no such joystick event")); + + return false; + } + + wxJoystickEvent event(eventType, buttons, joystick, change); + if ( eventType == wxEVT_JOY_ZMOVE ) + event.SetZPosition(x); + else + event.SetPosition(wxPoint(x, y)); + event.SetEventObject(this); + + return HandleWindowEvent(event); +#else + wxUnusedVar(msg); + wxUnusedVar(x); + wxUnusedVar(y); + wxUnusedVar(flags); + return false; +#endif +} + +// --------------------------------------------------------------------------- +// scrolling +// --------------------------------------------------------------------------- + +bool wxWindowMSW::MSWOnScroll(int orientation, WXWORD wParam, + WXWORD pos, WXHWND control) +{ + if ( control && control != m_hWnd ) // Prevent infinite recursion + { + wxWindow *child = wxFindWinFromHandle(control); + if ( child ) + return child->MSWOnScroll(orientation, wParam, pos, control); + } + + wxScrollWinEvent event; + event.SetPosition(pos); + event.SetOrientation(orientation); + event.SetEventObject(this); + + switch ( wParam ) + { + case SB_TOP: + event.SetEventType(wxEVT_SCROLLWIN_TOP); + break; + + case SB_BOTTOM: + event.SetEventType(wxEVT_SCROLLWIN_BOTTOM); + break; + + case SB_LINEUP: + event.SetEventType(wxEVT_SCROLLWIN_LINEUP); + break; + + case SB_LINEDOWN: + event.SetEventType(wxEVT_SCROLLWIN_LINEDOWN); + break; + + case SB_PAGEUP: + event.SetEventType(wxEVT_SCROLLWIN_PAGEUP); + break; + + case SB_PAGEDOWN: + event.SetEventType(wxEVT_SCROLLWIN_PAGEDOWN); + break; + + case SB_THUMBPOSITION: + case SB_THUMBTRACK: + // under Win32, the scrollbar range and position are 32 bit integers, + // but WM_[HV]SCROLL only carry the low 16 bits of them, so we must + // explicitly query the scrollbar for the correct position (this must + // be done only for these two SB_ events as they are the only one + // carrying the scrollbar position) + { + WinStruct scrollInfo; + scrollInfo.fMask = SIF_TRACKPOS; + + if ( !::GetScrollInfo(GetHwnd(), + WXOrientToSB(orientation), + &scrollInfo) ) + { + // Not necessarily an error, if there are no scrollbars yet. + // wxLogLastError(wxT("GetScrollInfo")); + } + + event.SetPosition(scrollInfo.nTrackPos); + } + + event.SetEventType( wParam == SB_THUMBPOSITION + ? wxEVT_SCROLLWIN_THUMBRELEASE + : wxEVT_SCROLLWIN_THUMBTRACK ); + break; + + default: + return false; + } + + return HandleWindowEvent(event); +} + +// ---------------------------------------------------------------------------- +// custom message handlers +// ---------------------------------------------------------------------------- + +/* static */ bool +wxWindowMSW::MSWRegisterMessageHandler(int msg, MSWMessageHandler handler) +{ + wxCHECK_MSG( gs_messageHandlers.find(msg) == gs_messageHandlers.end(), + false, wxT("registering handler for the same message twice") ); + + gs_messageHandlers[msg] = handler; + return true; +} + +/* static */ void +wxWindowMSW::MSWUnregisterMessageHandler(int msg, MSWMessageHandler handler) +{ + const MSWMessageHandlers::iterator i = gs_messageHandlers.find(msg); + wxCHECK_RET( i != gs_messageHandlers.end() && i->second == handler, + wxT("unregistering non-registered handler?") ); + + gs_messageHandlers.erase(i); +} + +// =========================================================================== +// global functions +// =========================================================================== + +void wxGetCharSize(WXHWND wnd, int *x, int *y, const wxFont& the_font) +{ + TEXTMETRIC tm; + HDC dc = ::GetDC((HWND) wnd); + HFONT was = 0; + + // the_font.UseResource(); + // the_font.RealizeResource(); + HFONT fnt = (HFONT)the_font.GetResourceHandle(); // const_cast + if ( fnt ) + was = (HFONT) SelectObject(dc,fnt); + + GetTextMetrics(dc, &tm); + if ( fnt && was ) + { + SelectObject(dc,was); + } + ReleaseDC((HWND)wnd, dc); + + if ( x ) + *x = tm.tmAveCharWidth; + if ( y ) + *y = tm.tmHeight + tm.tmExternalLeading; + + // the_font.ReleaseResource(); +} + +// ---------------------------------------------------------------------------- +// keyboard codes +// ---------------------------------------------------------------------------- + +namespace wxMSWKeyboard +{ + +namespace +{ + +// use the "extended" bit of lParam to distinguish extended keys from normal +// keys as the same virtual key code is sent for both by Windows +inline +int ChooseNormalOrExtended(int lParam, int keyNormal, int keyExtended) +{ + // except that if lParam is 0, it means we don't have real lParam from + // WM_KEYDOWN but are just translating just a VK constant (e.g. done from + // msw/treectrl.cpp when processing TVN_KEYDOWN) -- then assume this is a + // non-numpad (hence extended) key as this is a more common case + return !lParam || (HIWORD(lParam) & KF_EXTENDED) ? keyExtended : keyNormal; +} + +// this array contains the Windows virtual key codes which map one to one to +// WXK_xxx constants and is used in wxMSWKeyboard::VKToWX/WXToVK() below +// +// note that keys having a normal and numpad version (e.g. WXK_HOME and +// WXK_NUMPAD_HOME) are not included in this table as the mapping is not 1-to-1 +const struct wxKeyMapping +{ + int vk; + wxKeyCode wxk; +} gs_specialKeys[] = +{ + { VK_CANCEL, WXK_CANCEL }, + { VK_BACK, WXK_BACK }, + { VK_TAB, WXK_TAB }, + { VK_CLEAR, WXK_CLEAR }, + { VK_SHIFT, WXK_SHIFT }, + { VK_CONTROL, WXK_CONTROL }, + { VK_MENU , WXK_ALT }, + { VK_PAUSE, WXK_PAUSE }, + { VK_CAPITAL, WXK_CAPITAL }, + { VK_SPACE, WXK_SPACE }, + { VK_ESCAPE, WXK_ESCAPE }, + { VK_SELECT, WXK_SELECT }, + { VK_PRINT, WXK_PRINT }, + { VK_EXECUTE, WXK_EXECUTE }, + { VK_SNAPSHOT, WXK_SNAPSHOT }, + { VK_HELP, WXK_HELP }, + + { VK_NUMPAD0, WXK_NUMPAD0 }, + { VK_NUMPAD1, WXK_NUMPAD1 }, + { VK_NUMPAD2, WXK_NUMPAD2 }, + { VK_NUMPAD3, WXK_NUMPAD3 }, + { VK_NUMPAD4, WXK_NUMPAD4 }, + { VK_NUMPAD5, WXK_NUMPAD5 }, + { VK_NUMPAD6, WXK_NUMPAD6 }, + { VK_NUMPAD7, WXK_NUMPAD7 }, + { VK_NUMPAD8, WXK_NUMPAD8 }, + { VK_NUMPAD9, WXK_NUMPAD9 }, + { VK_MULTIPLY, WXK_NUMPAD_MULTIPLY }, + { VK_ADD, WXK_NUMPAD_ADD }, + { VK_SUBTRACT, WXK_NUMPAD_SUBTRACT }, + { VK_DECIMAL, WXK_NUMPAD_DECIMAL }, + { VK_DIVIDE, WXK_NUMPAD_DIVIDE }, + + { VK_F1, WXK_F1 }, + { VK_F2, WXK_F2 }, + { VK_F3, WXK_F3 }, + { VK_F4, WXK_F4 }, + { VK_F5, WXK_F5 }, + { VK_F6, WXK_F6 }, + { VK_F7, WXK_F7 }, + { VK_F8, WXK_F8 }, + { VK_F9, WXK_F9 }, + { VK_F10, WXK_F10 }, + { VK_F11, WXK_F11 }, + { VK_F12, WXK_F12 }, + { VK_F13, WXK_F13 }, + { VK_F14, WXK_F14 }, + { VK_F15, WXK_F15 }, + { VK_F16, WXK_F16 }, + { VK_F17, WXK_F17 }, + { VK_F18, WXK_F18 }, + { VK_F19, WXK_F19 }, + { VK_F20, WXK_F20 }, + { VK_F21, WXK_F21 }, + { VK_F22, WXK_F22 }, + { VK_F23, WXK_F23 }, + { VK_F24, WXK_F24 }, + + { VK_NUMLOCK, WXK_NUMLOCK }, + { VK_SCROLL, WXK_SCROLL }, + +#ifdef VK_APPS + { VK_LWIN, WXK_WINDOWS_LEFT }, + { VK_RWIN, WXK_WINDOWS_RIGHT }, + { VK_APPS, WXK_WINDOWS_MENU }, +#endif // VK_APPS defined +}; + +} // anonymous namespace + +int VKToWX(WXWORD vk, WXLPARAM lParam, wchar_t *uc) +{ + int wxk; + + // check the table first + for ( size_t n = 0; n < WXSIZEOF(gs_specialKeys); n++ ) + { + if ( gs_specialKeys[n].vk == vk ) + { + wxk = gs_specialKeys[n].wxk; + if ( wxk < WXK_START ) + { + // Unicode code for this key is the same as its ASCII code. + if ( uc ) + *uc = wxk; + } + + return wxk; + } + } + + // keys requiring special handling + switch ( vk ) + { + case VK_OEM_1: + case VK_OEM_PLUS: + case VK_OEM_COMMA: + case VK_OEM_MINUS: + case VK_OEM_PERIOD: + case VK_OEM_2: + case VK_OEM_3: + case VK_OEM_4: + case VK_OEM_5: + case VK_OEM_6: + case VK_OEM_7: + case VK_OEM_102: + // MapVirtualKey() returns 0 if it fails to convert the virtual + // key which nicely corresponds to our WXK_NONE. + wxk = ::MapVirtualKey(vk, MAPVK_VK_TO_CHAR); + + if ( HIWORD(wxk) & 0x8000 ) + { + // It's a dead key and we don't return anything at all for them + // as we simply don't have any way to indicate the difference + // between e.g. a normal "'" and "'" as a dead key -- and + // generating the same events for them just doesn't seem like a + // good idea. + wxk = WXK_NONE; + } + + // In any case return this as a Unicode character value. + if ( uc ) + *uc = wxk; + + // For compatibility with the old non-Unicode code we continue + // returning key codes for Latin-1 characters directly + // (normally it would really only make sense to do it for the + // ASCII characters, not Latin-1 ones). + if ( wxk > 255 ) + { + // But for anything beyond this we can only return the key + // value as a real Unicode character, not a wxKeyCode + // because this enum values clash with Unicode characters + // (e.g. WXK_LBUTTON also happens to be U+012C a.k.a. + // "LATIN CAPITAL LETTER I WITH BREVE"). + wxk = WXK_NONE; + } + break; + + // handle extended keys + case VK_PRIOR: + wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_PAGEUP, WXK_PAGEUP); + break; + + case VK_NEXT: + wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_PAGEDOWN, WXK_PAGEDOWN); + break; + + case VK_END: + wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_END, WXK_END); + break; + + case VK_HOME: + wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_HOME, WXK_HOME); + break; + + case VK_LEFT: + wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_LEFT, WXK_LEFT); + break; + + case VK_UP: + wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_UP, WXK_UP); + break; + + case VK_RIGHT: + wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_RIGHT, WXK_RIGHT); + break; + + case VK_DOWN: + wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_DOWN, WXK_DOWN); + break; + + case VK_INSERT: + wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_INSERT, WXK_INSERT); + break; + + case VK_DELETE: + wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_DELETE, WXK_DELETE); + + if ( uc ) + *uc = WXK_DELETE; + break; + + case VK_RETURN: + // don't use ChooseNormalOrExtended() here as the keys are reversed + // here: numpad enter is the extended one + wxk = HIWORD(lParam) & KF_EXTENDED ? WXK_NUMPAD_ENTER : WXK_RETURN; + + if ( uc ) + *uc = WXK_RETURN; + break; + + default: + if ( (vk >= '0' && vk <= '9') || (vk >= 'A' && vk <= 'Z') ) + { + // A simple alphanumeric key and the values of them coincide in + // Windows and wx for both ASCII and Unicode codes. + wxk = vk; + } + else // Something we simply don't know about at all. + { + wxk = WXK_NONE; + } + + if ( uc ) + *uc = vk; + } + + return wxk; +} + +WXWORD WXToVK(int wxk, bool *isExtended) +{ + // check the table first + for ( size_t n = 0; n < WXSIZEOF(gs_specialKeys); n++ ) + { + if ( gs_specialKeys[n].wxk == wxk ) + { + // All extended keys (i.e. non-numpad versions of the keys that + // exist both in the numpad and outside of it) are dealt with + // below. + if ( isExtended ) + *isExtended = false; + + return gs_specialKeys[n].vk; + } + } + + // and then check for special keys not included in the table + bool extended = false; + WXWORD vk; + switch ( wxk ) + { + case WXK_PAGEUP: + extended = true; + case WXK_NUMPAD_PAGEUP: + vk = VK_PRIOR; + break; + + case WXK_PAGEDOWN: + extended = true; + case WXK_NUMPAD_PAGEDOWN: + vk = VK_NEXT; + break; + + case WXK_END: + extended = true; + case WXK_NUMPAD_END: + vk = VK_END; + break; + + case WXK_HOME: + extended = true; + case WXK_NUMPAD_HOME: + vk = VK_HOME; + break; + + case WXK_LEFT: + extended = true; + case WXK_NUMPAD_LEFT: + vk = VK_LEFT; + break; + + case WXK_UP: + extended = true; + case WXK_NUMPAD_UP: + vk = VK_UP; + break; + + case WXK_RIGHT: + extended = true; + case WXK_NUMPAD_RIGHT: + vk = VK_RIGHT; + break; + + case WXK_DOWN: + extended = true; + case WXK_NUMPAD_DOWN: + vk = VK_DOWN; + break; + + case WXK_INSERT: + extended = true; + case WXK_NUMPAD_INSERT: + vk = VK_INSERT; + break; + + case WXK_DELETE: + extended = true; + case WXK_NUMPAD_DELETE: + vk = VK_DELETE; + break; + + default: + // no VkKeyScan() under CE unfortunately, we need to test how does + // it handle OEM keys +#ifndef __WXWINCE__ + // check to see if its one of the OEM key codes. + BYTE vks = LOBYTE(VkKeyScan(wxk)); + if ( vks != 0xff ) + { + vk = vks; + } + else +#endif // !__WXWINCE__ + { + vk = (WXWORD)wxk; + } + } + + if ( isExtended ) + *isExtended = extended; + + return vk; +} + +} // namespace wxMSWKeyboard + +// small helper for wxGetKeyState() and wxGetMouseState() +static inline bool wxIsKeyDown(WXWORD vk) +{ + // SM_SWAPBUTTON is not available under CE, so don't swap buttons there +#ifdef SM_SWAPBUTTON + if ( vk == VK_LBUTTON || vk == VK_RBUTTON ) + { + if ( ::GetSystemMetrics(SM_SWAPBUTTON) ) + { + if ( vk == VK_LBUTTON ) + vk = VK_RBUTTON; + else // vk == VK_RBUTTON + vk = VK_LBUTTON; + } + } +#endif // SM_SWAPBUTTON + + // the low order bit indicates whether the key was pressed since the last + // call and the high order one indicates whether it is down right now and + // we only want that one + return (GetAsyncKeyState(vk) & (1<<15)) != 0; +} + +bool wxGetKeyState(wxKeyCode key) +{ + // although this does work under Windows, it is not supported under other + // platforms so don't allow it, you must use wxGetMouseState() instead + wxASSERT_MSG( key != VK_LBUTTON && + key != VK_RBUTTON && + key != VK_MBUTTON, + wxT("can't use wxGetKeyState() for mouse buttons") ); + + const WXWORD vk = wxMSWKeyboard::WXToVK(key); + + // if the requested key is a LED key, return true if the led is pressed + if ( key == WXK_NUMLOCK || key == WXK_CAPITAL || key == WXK_SCROLL ) + { + // low order bit means LED is highlighted and high order one means the + // key is down; for compatibility with the other ports return true if + // either one is set + return GetKeyState(vk) != 0; + + } + else // normal key + { + return wxIsKeyDown(vk); + } +} + + +wxMouseState wxGetMouseState() +{ + wxMouseState ms; + POINT pt; + wxGetCursorPosMSW(&pt); + + ms.SetX(pt.x); + ms.SetY(pt.y); + ms.SetLeftDown(wxIsKeyDown(VK_LBUTTON)); + ms.SetMiddleDown(wxIsKeyDown(VK_MBUTTON)); + ms.SetRightDown(wxIsKeyDown(VK_RBUTTON)); +#ifdef wxHAS_XBUTTON + ms.SetAux1Down(wxIsKeyDown(VK_XBUTTON1)); + ms.SetAux2Down(wxIsKeyDown(VK_XBUTTON2)); +#endif // wxHAS_XBUTTON + + ms.SetControlDown(wxIsCtrlDown ()); + ms.SetShiftDown (wxIsShiftDown()); + ms.SetAltDown (wxIsAltDown ()); +// ms.SetMetaDown(); + + return ms; +} + + +wxWindow *wxGetActiveWindow() +{ + HWND hWnd = GetActiveWindow(); + if ( hWnd != 0 ) + { + return wxFindWinFromHandle(hWnd); + } + return NULL; +} + +extern wxWindow *wxGetWindowFromHWND(WXHWND hWnd) +{ + HWND hwnd = (HWND)hWnd; + + // For a radiobutton, we get the radiobox from GWL_USERDATA (which is set + // by code in msw/radiobox.cpp), for all the others we just search up the + // window hierarchy + wxWindow *win = NULL; + if ( hwnd ) + { + win = wxFindWinFromHandle(hwnd); + if ( !win ) + { +#if wxUSE_RADIOBOX && !defined(__WXUNIVERSAL__) + // native radiobuttons return DLGC_RADIOBUTTON here and for any + // wxWindow class which overrides WM_GETDLGCODE processing to + // do it as well, win would be already non NULL + if ( ::SendMessage(hwnd, WM_GETDLGCODE, 0, 0) & DLGC_RADIOBUTTON ) + { + win = wxRadioBox::GetFromRadioButtonHWND(hwnd); + } + //else: it's a wxRadioButton, not a radiobutton from wxRadioBox +#endif // wxUSE_RADIOBOX + + // spin control text buddy window should be mapped to spin ctrl + // itself so try it too +#if wxUSE_SPINCTRL && !defined(__WXUNIVERSAL__) + if ( !win ) + { + win = wxSpinCtrl::GetSpinForTextCtrl((WXHWND)hwnd); + } +#endif // wxUSE_SPINCTRL + } + } + + while ( hwnd && !win ) + { + // this is a really ugly hack needed to avoid mistakenly returning the + // parent frame wxWindow for the find/replace modeless dialog HWND - + // this, in turn, is needed to call IsDialogMessage() from + // wxApp::ProcessMessage() as for this we must return NULL from here + // + // FIXME: this is clearly not the best way to do it but I think we'll + // need to change HWND <-> wxWindow code more heavily than I can + // do it now to fix it +#ifndef __WXMICROWIN__ + if ( ::GetWindow(hwnd, GW_OWNER) ) + { + // it's a dialog box, don't go upwards + break; + } +#endif + + hwnd = ::GetParent(hwnd); + win = wxFindWinFromHandle(hwnd); + } + + return win; +} + +#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) + +// Windows keyboard hook. Allows interception of e.g. F1, ESCAPE +// in active frames and dialogs, regardless of where the focus is. +static HHOOK wxTheKeyboardHook = 0; + +int APIENTRY +wxKeyboardHook(int nCode, WORD wParam, DWORD lParam) +{ + DWORD hiWord = HIWORD(lParam); + if ( nCode != HC_NOREMOVE && ((hiWord & KF_UP) == 0) ) + { + wchar_t uc = 0; + int id = wxMSWKeyboard::VKToWX(wParam, lParam, &uc); + + // Don't intercept keyboard entry (notably Escape) if a modal window + // (not managed by wx, e.g. IME one) is currently opened as more often + // than not it needs all the keys for itself. + // + // Also don't catch it if a window currently captures the mouse as + // Escape is normally used to release the mouse capture and if you + // really need to catch all the keys in the window that has mouse + // capture it can be easily done in its own EVT_CHAR handler as it is + // certain to have focus while it has the capture. + if ( !gs_modalEntryWindowCount && !::GetCapture() ) + { + if ( id != WXK_NONE +#if wxUSE_UNICODE + || static_cast(uc) != WXK_NONE +#endif // wxUSE_UNICODE + ) + { + wxWindow const* win = wxWindow::DoFindFocus(); + if ( !win ) + { + // Even if the focus got lost somehow, still send the event + // to the top level parent to allow a wxDialog to always + // close on Escape. + win = wxGetActiveWindow(); + } + + wxKeyEvent event(wxEVT_CHAR_HOOK); + MSWInitAnyKeyEvent(event, wParam, lParam, win); + + event.m_keyCode = id; +#if wxUSE_UNICODE + event.m_uniChar = uc; +#endif // wxUSE_UNICODE + + wxEvtHandler * const handler = win ? win->GetEventHandler() + : wxTheApp; + + if ( handler && handler->ProcessEvent(event) ) + { + if ( !event.IsNextEventAllowed() ) + { + // Stop processing of this event. + return 1; + } + } + } + } + } + + return (int)CallNextHookEx(wxTheKeyboardHook, nCode, wParam, lParam); +} + +void wxSetKeyboardHook(bool doIt) +{ + if ( doIt ) + { + wxTheKeyboardHook = ::SetWindowsHookEx + ( + WH_KEYBOARD, + (HOOKPROC)wxKeyboardHook, + NULL, // must be NULL for process hook + ::GetCurrentThreadId() + ); + if ( !wxTheKeyboardHook ) + { + wxLogLastError(wxT("SetWindowsHookEx(wxKeyboardHook)")); + } + } + else // uninstall + { + if ( wxTheKeyboardHook ) + ::UnhookWindowsHookEx(wxTheKeyboardHook); + } +} + +#endif // !__WXMICROWIN__ + +#if wxDEBUG_LEVEL >= 2 +const wxChar *wxGetMessageName(int message) +{ + switch ( message ) + { + case 0x0000: return wxT("WM_NULL"); + case 0x0001: return wxT("WM_CREATE"); + case 0x0002: return wxT("WM_DESTROY"); + case 0x0003: return wxT("WM_MOVE"); + case 0x0005: return wxT("WM_SIZE"); + case 0x0006: return wxT("WM_ACTIVATE"); + case 0x0007: return wxT("WM_SETFOCUS"); + case 0x0008: return wxT("WM_KILLFOCUS"); + case 0x000A: return wxT("WM_ENABLE"); + case 0x000B: return wxT("WM_SETREDRAW"); + case 0x000C: return wxT("WM_SETTEXT"); + case 0x000D: return wxT("WM_GETTEXT"); + case 0x000E: return wxT("WM_GETTEXTLENGTH"); + case 0x000F: return wxT("WM_PAINT"); + case 0x0010: return wxT("WM_CLOSE"); + case 0x0011: return wxT("WM_QUERYENDSESSION"); + case 0x0012: return wxT("WM_QUIT"); + case 0x0013: return wxT("WM_QUERYOPEN"); + case 0x0014: return wxT("WM_ERASEBKGND"); + case 0x0015: return wxT("WM_SYSCOLORCHANGE"); + case 0x0016: return wxT("WM_ENDSESSION"); + case 0x0017: return wxT("WM_SYSTEMERROR"); + case 0x0018: return wxT("WM_SHOWWINDOW"); + case 0x0019: return wxT("WM_CTLCOLOR"); + case 0x001A: return wxT("WM_WININICHANGE"); + case 0x001B: return wxT("WM_DEVMODECHANGE"); + case 0x001C: return wxT("WM_ACTIVATEAPP"); + case 0x001D: return wxT("WM_FONTCHANGE"); + case 0x001E: return wxT("WM_TIMECHANGE"); + case 0x001F: return wxT("WM_CANCELMODE"); + case 0x0020: return wxT("WM_SETCURSOR"); + case 0x0021: return wxT("WM_MOUSEACTIVATE"); + case 0x0022: return wxT("WM_CHILDACTIVATE"); + case 0x0023: return wxT("WM_QUEUESYNC"); + case 0x0024: return wxT("WM_GETMINMAXINFO"); + case 0x0026: return wxT("WM_PAINTICON"); + case 0x0027: return wxT("WM_ICONERASEBKGND"); + case 0x0028: return wxT("WM_NEXTDLGCTL"); + case 0x002A: return wxT("WM_SPOOLERSTATUS"); + case 0x002B: return wxT("WM_DRAWITEM"); + case 0x002C: return wxT("WM_MEASUREITEM"); + case 0x002D: return wxT("WM_DELETEITEM"); + case 0x002E: return wxT("WM_VKEYTOITEM"); + case 0x002F: return wxT("WM_CHARTOITEM"); + case 0x0030: return wxT("WM_SETFONT"); + case 0x0031: return wxT("WM_GETFONT"); + case 0x0037: return wxT("WM_QUERYDRAGICON"); + case 0x0039: return wxT("WM_COMPAREITEM"); + case 0x0041: return wxT("WM_COMPACTING"); + case 0x0044: return wxT("WM_COMMNOTIFY"); + case 0x0046: return wxT("WM_WINDOWPOSCHANGING"); + case 0x0047: return wxT("WM_WINDOWPOSCHANGED"); + case 0x0048: return wxT("WM_POWER"); + + case 0x004A: return wxT("WM_COPYDATA"); + case 0x004B: return wxT("WM_CANCELJOURNAL"); + case 0x004E: return wxT("WM_NOTIFY"); + case 0x0050: return wxT("WM_INPUTLANGCHANGEREQUEST"); + case 0x0051: return wxT("WM_INPUTLANGCHANGE"); + case 0x0052: return wxT("WM_TCARD"); + case 0x0053: return wxT("WM_HELP"); + case 0x0054: return wxT("WM_USERCHANGED"); + case 0x0055: return wxT("WM_NOTIFYFORMAT"); + case 0x007B: return wxT("WM_CONTEXTMENU"); + case 0x007C: return wxT("WM_STYLECHANGING"); + case 0x007D: return wxT("WM_STYLECHANGED"); + case 0x007E: return wxT("WM_DISPLAYCHANGE"); + case 0x007F: return wxT("WM_GETICON"); + case 0x0080: return wxT("WM_SETICON"); + + case 0x0081: return wxT("WM_NCCREATE"); + case 0x0082: return wxT("WM_NCDESTROY"); + case 0x0083: return wxT("WM_NCCALCSIZE"); + case 0x0084: return wxT("WM_NCHITTEST"); + case 0x0085: return wxT("WM_NCPAINT"); + case 0x0086: return wxT("WM_NCACTIVATE"); + case 0x0087: return wxT("WM_GETDLGCODE"); + case 0x00A0: return wxT("WM_NCMOUSEMOVE"); + case 0x00A1: return wxT("WM_NCLBUTTONDOWN"); + case 0x00A2: return wxT("WM_NCLBUTTONUP"); + case 0x00A3: return wxT("WM_NCLBUTTONDBLCLK"); + case 0x00A4: return wxT("WM_NCRBUTTONDOWN"); + case 0x00A5: return wxT("WM_NCRBUTTONUP"); + case 0x00A6: return wxT("WM_NCRBUTTONDBLCLK"); + case 0x00A7: return wxT("WM_NCMBUTTONDOWN"); + case 0x00A8: return wxT("WM_NCMBUTTONUP"); + case 0x00A9: return wxT("WM_NCMBUTTONDBLCLK"); + + case 0x00B0: return wxT("EM_GETSEL"); + case 0x00B1: return wxT("EM_SETSEL"); + case 0x00B2: return wxT("EM_GETRECT"); + case 0x00B3: return wxT("EM_SETRECT"); + case 0x00B4: return wxT("EM_SETRECTNP"); + case 0x00B5: return wxT("EM_SCROLL"); + case 0x00B6: return wxT("EM_LINESCROLL"); + case 0x00B7: return wxT("EM_SCROLLCARET"); + case 0x00B8: return wxT("EM_GETMODIFY"); + case 0x00B9: return wxT("EM_SETMODIFY"); + case 0x00BA: return wxT("EM_GETLINECOUNT"); + case 0x00BB: return wxT("EM_LINEINDEX"); + case 0x00BC: return wxT("EM_SETHANDLE"); + case 0x00BD: return wxT("EM_GETHANDLE"); + case 0x00BE: return wxT("EM_GETTHUMB"); + case 0x00C1: return wxT("EM_LINELENGTH"); + case 0x00C2: return wxT("EM_REPLACESEL"); + case 0x00C4: return wxT("EM_GETLINE"); + case 0x00C5: return wxT("EM_LIMITTEXT/EM_SETLIMITTEXT"); /* ;win40 Name change */ + case 0x00C6: return wxT("EM_CANUNDO"); + case 0x00C7: return wxT("EM_UNDO"); + case 0x00C8: return wxT("EM_FMTLINES"); + case 0x00C9: return wxT("EM_LINEFROMCHAR"); + case 0x00CB: return wxT("EM_SETTABSTOPS"); + case 0x00CC: return wxT("EM_SETPASSWORDCHAR"); + case 0x00CD: return wxT("EM_EMPTYUNDOBUFFER"); + case 0x00CE: return wxT("EM_GETFIRSTVISIBLELINE"); + case 0x00CF: return wxT("EM_SETREADONLY"); + case 0x00D0: return wxT("EM_SETWORDBREAKPROC"); + case 0x00D1: return wxT("EM_GETWORDBREAKPROC"); + case 0x00D2: return wxT("EM_GETPASSWORDCHAR"); + case 0x00D3: return wxT("EM_SETMARGINS"); + case 0x00D4: return wxT("EM_GETMARGINS"); + case 0x00D5: return wxT("EM_GETLIMITTEXT"); + case 0x00D6: return wxT("EM_POSFROMCHAR"); + case 0x00D7: return wxT("EM_CHARFROMPOS"); + case 0x00D8: return wxT("EM_SETIMESTATUS"); + case 0x00D9: return wxT("EM_GETIMESTATUS"); + + case 0x0100: return wxT("WM_KEYDOWN"); + case 0x0101: return wxT("WM_KEYUP"); + case 0x0102: return wxT("WM_CHAR"); + case 0x0103: return wxT("WM_DEADCHAR"); + case 0x0104: return wxT("WM_SYSKEYDOWN"); + case 0x0105: return wxT("WM_SYSKEYUP"); + case 0x0106: return wxT("WM_SYSCHAR"); + case 0x0107: return wxT("WM_SYSDEADCHAR"); + case 0x0108: return wxT("WM_KEYLAST"); + + case 0x010D: return wxT("WM_IME_STARTCOMPOSITION"); + case 0x010E: return wxT("WM_IME_ENDCOMPOSITION"); + case 0x010F: return wxT("WM_IME_COMPOSITION"); + + case 0x0110: return wxT("WM_INITDIALOG"); + case 0x0111: return wxT("WM_COMMAND"); + case 0x0112: return wxT("WM_SYSCOMMAND"); + case 0x0113: return wxT("WM_TIMER"); + case 0x0114: return wxT("WM_HSCROLL"); + case 0x0115: return wxT("WM_VSCROLL"); + case 0x0116: return wxT("WM_INITMENU"); + case 0x0117: return wxT("WM_INITMENUPOPUP"); + case 0x011F: return wxT("WM_MENUSELECT"); + case 0x0120: return wxT("WM_MENUCHAR"); + case 0x0121: return wxT("WM_ENTERIDLE"); + + case 0x0127: return wxT("WM_CHANGEUISTATE"); + case 0x0128: return wxT("WM_UPDATEUISTATE"); + case 0x0129: return wxT("WM_QUERYUISTATE"); + + case 0x0132: return wxT("WM_CTLCOLORMSGBOX"); + case 0x0133: return wxT("WM_CTLCOLOREDIT"); + case 0x0134: return wxT("WM_CTLCOLORLISTBOX"); + case 0x0135: return wxT("WM_CTLCOLORBTN"); + case 0x0136: return wxT("WM_CTLCOLORDLG"); + case 0x0137: return wxT("WM_CTLCOLORSCROLLBAR"); + case 0x0138: return wxT("WM_CTLCOLORSTATIC"); + case 0x01E1: return wxT("MN_GETHMENU"); + + case 0x0200: return wxT("WM_MOUSEMOVE"); + case 0x0201: return wxT("WM_LBUTTONDOWN"); + case 0x0202: return wxT("WM_LBUTTONUP"); + case 0x0203: return wxT("WM_LBUTTONDBLCLK"); + case 0x0204: return wxT("WM_RBUTTONDOWN"); + case 0x0205: return wxT("WM_RBUTTONUP"); + case 0x0206: return wxT("WM_RBUTTONDBLCLK"); + case 0x0207: return wxT("WM_MBUTTONDOWN"); + case 0x0208: return wxT("WM_MBUTTONUP"); + case 0x0209: return wxT("WM_MBUTTONDBLCLK"); + case 0x020A: return wxT("WM_MOUSEWHEEL"); + case 0x020B: return wxT("WM_XBUTTONDOWN"); + case 0x020C: return wxT("WM_XBUTTONUP"); + case 0x020D: return wxT("WM_XBUTTONDBLCLK"); + case 0x0210: return wxT("WM_PARENTNOTIFY"); + case 0x0211: return wxT("WM_ENTERMENULOOP"); + case 0x0212: return wxT("WM_EXITMENULOOP"); + + case 0x0213: return wxT("WM_NEXTMENU"); + case 0x0214: return wxT("WM_SIZING"); + case 0x0215: return wxT("WM_CAPTURECHANGED"); + case 0x0216: return wxT("WM_MOVING"); + case 0x0218: return wxT("WM_POWERBROADCAST"); + case 0x0219: return wxT("WM_DEVICECHANGE"); + + case 0x0220: return wxT("WM_MDICREATE"); + case 0x0221: return wxT("WM_MDIDESTROY"); + case 0x0222: return wxT("WM_MDIACTIVATE"); + case 0x0223: return wxT("WM_MDIRESTORE"); + case 0x0224: return wxT("WM_MDINEXT"); + case 0x0225: return wxT("WM_MDIMAXIMIZE"); + case 0x0226: return wxT("WM_MDITILE"); + case 0x0227: return wxT("WM_MDICASCADE"); + case 0x0228: return wxT("WM_MDIICONARRANGE"); + case 0x0229: return wxT("WM_MDIGETACTIVE"); + case 0x0230: return wxT("WM_MDISETMENU"); + case 0x0233: return wxT("WM_DROPFILES"); + + case 0x0281: return wxT("WM_IME_SETCONTEXT"); + case 0x0282: return wxT("WM_IME_NOTIFY"); + case 0x0283: return wxT("WM_IME_CONTROL"); + case 0x0284: return wxT("WM_IME_COMPOSITIONFULL"); + case 0x0285: return wxT("WM_IME_SELECT"); + case 0x0286: return wxT("WM_IME_CHAR"); + case 0x0290: return wxT("WM_IME_KEYDOWN"); + case 0x0291: return wxT("WM_IME_KEYUP"); + + case 0x02A0: return wxT("WM_NCMOUSEHOVER"); + case 0x02A1: return wxT("WM_MOUSEHOVER"); + case 0x02A2: return wxT("WM_NCMOUSELEAVE"); + case 0x02A3: return wxT("WM_MOUSELEAVE"); + + case 0x0300: return wxT("WM_CUT"); + case 0x0301: return wxT("WM_COPY"); + case 0x0302: return wxT("WM_PASTE"); + case 0x0303: return wxT("WM_CLEAR"); + case 0x0304: return wxT("WM_UNDO"); + case 0x0305: return wxT("WM_RENDERFORMAT"); + case 0x0306: return wxT("WM_RENDERALLFORMATS"); + case 0x0307: return wxT("WM_DESTROYCLIPBOARD"); + case 0x0308: return wxT("WM_DRAWCLIPBOARD"); + case 0x0309: return wxT("WM_PAINTCLIPBOARD"); + case 0x030A: return wxT("WM_VSCROLLCLIPBOARD"); + case 0x030B: return wxT("WM_SIZECLIPBOARD"); + case 0x030C: return wxT("WM_ASKCBFORMATNAME"); + case 0x030D: return wxT("WM_CHANGECBCHAIN"); + case 0x030E: return wxT("WM_HSCROLLCLIPBOARD"); + case 0x030F: return wxT("WM_QUERYNEWPALETTE"); + case 0x0310: return wxT("WM_PALETTEISCHANGING"); + case 0x0311: return wxT("WM_PALETTECHANGED"); + case 0x0312: return wxT("WM_HOTKEY"); + + case 0x0317: return wxT("WM_PRINT"); + case 0x0318: return wxT("WM_PRINTCLIENT"); + + // common controls messages - although they're not strictly speaking + // standard, it's nice to decode them nevertheless + + // listview + case 0x1000 + 0: return wxT("LVM_GETBKCOLOR"); + case 0x1000 + 1: return wxT("LVM_SETBKCOLOR"); + case 0x1000 + 2: return wxT("LVM_GETIMAGELIST"); + case 0x1000 + 3: return wxT("LVM_SETIMAGELIST"); + case 0x1000 + 4: return wxT("LVM_GETITEMCOUNT"); + case 0x1000 + 5: return wxT("LVM_GETITEMA"); + case 0x1000 + 75: return wxT("LVM_GETITEMW"); + case 0x1000 + 6: return wxT("LVM_SETITEMA"); + case 0x1000 + 76: return wxT("LVM_SETITEMW"); + case 0x1000 + 7: return wxT("LVM_INSERTITEMA"); + case 0x1000 + 77: return wxT("LVM_INSERTITEMW"); + case 0x1000 + 8: return wxT("LVM_DELETEITEM"); + case 0x1000 + 9: return wxT("LVM_DELETEALLITEMS"); + case 0x1000 + 10: return wxT("LVM_GETCALLBACKMASK"); + case 0x1000 + 11: return wxT("LVM_SETCALLBACKMASK"); + case 0x1000 + 12: return wxT("LVM_GETNEXTITEM"); + case 0x1000 + 13: return wxT("LVM_FINDITEMA"); + case 0x1000 + 83: return wxT("LVM_FINDITEMW"); + case 0x1000 + 14: return wxT("LVM_GETITEMRECT"); + case 0x1000 + 15: return wxT("LVM_SETITEMPOSITION"); + case 0x1000 + 16: return wxT("LVM_GETITEMPOSITION"); + case 0x1000 + 17: return wxT("LVM_GETSTRINGWIDTHA"); + case 0x1000 + 87: return wxT("LVM_GETSTRINGWIDTHW"); + case 0x1000 + 18: return wxT("LVM_HITTEST"); + case 0x1000 + 19: return wxT("LVM_ENSUREVISIBLE"); + case 0x1000 + 20: return wxT("LVM_SCROLL"); + case 0x1000 + 21: return wxT("LVM_REDRAWITEMS"); + case 0x1000 + 22: return wxT("LVM_ARRANGE"); + case 0x1000 + 23: return wxT("LVM_EDITLABELA"); + case 0x1000 + 118: return wxT("LVM_EDITLABELW"); + case 0x1000 + 24: return wxT("LVM_GETEDITCONTROL"); + case 0x1000 + 25: return wxT("LVM_GETCOLUMNA"); + case 0x1000 + 95: return wxT("LVM_GETCOLUMNW"); + case 0x1000 + 26: return wxT("LVM_SETCOLUMNA"); + case 0x1000 + 96: return wxT("LVM_SETCOLUMNW"); + case 0x1000 + 27: return wxT("LVM_INSERTCOLUMNA"); + case 0x1000 + 97: return wxT("LVM_INSERTCOLUMNW"); + case 0x1000 + 28: return wxT("LVM_DELETECOLUMN"); + case 0x1000 + 29: return wxT("LVM_GETCOLUMNWIDTH"); + case 0x1000 + 30: return wxT("LVM_SETCOLUMNWIDTH"); + case 0x1000 + 31: return wxT("LVM_GETHEADER"); + case 0x1000 + 33: return wxT("LVM_CREATEDRAGIMAGE"); + case 0x1000 + 34: return wxT("LVM_GETVIEWRECT"); + case 0x1000 + 35: return wxT("LVM_GETTEXTCOLOR"); + case 0x1000 + 36: return wxT("LVM_SETTEXTCOLOR"); + case 0x1000 + 37: return wxT("LVM_GETTEXTBKCOLOR"); + case 0x1000 + 38: return wxT("LVM_SETTEXTBKCOLOR"); + case 0x1000 + 39: return wxT("LVM_GETTOPINDEX"); + case 0x1000 + 40: return wxT("LVM_GETCOUNTPERPAGE"); + case 0x1000 + 41: return wxT("LVM_GETORIGIN"); + case 0x1000 + 42: return wxT("LVM_UPDATE"); + case 0x1000 + 43: return wxT("LVM_SETITEMSTATE"); + case 0x1000 + 44: return wxT("LVM_GETITEMSTATE"); + case 0x1000 + 45: return wxT("LVM_GETITEMTEXTA"); + case 0x1000 + 115: return wxT("LVM_GETITEMTEXTW"); + case 0x1000 + 46: return wxT("LVM_SETITEMTEXTA"); + case 0x1000 + 116: return wxT("LVM_SETITEMTEXTW"); + case 0x1000 + 47: return wxT("LVM_SETITEMCOUNT"); + case 0x1000 + 48: return wxT("LVM_SORTITEMS"); + case 0x1000 + 49: return wxT("LVM_SETITEMPOSITION32"); + case 0x1000 + 50: return wxT("LVM_GETSELECTEDCOUNT"); + case 0x1000 + 51: return wxT("LVM_GETITEMSPACING"); + case 0x1000 + 52: return wxT("LVM_GETISEARCHSTRINGA"); + case 0x1000 + 117: return wxT("LVM_GETISEARCHSTRINGW"); + case 0x1000 + 53: return wxT("LVM_SETICONSPACING"); + case 0x1000 + 54: return wxT("LVM_SETEXTENDEDLISTVIEWSTYLE"); + case 0x1000 + 55: return wxT("LVM_GETEXTENDEDLISTVIEWSTYLE"); + case 0x1000 + 56: return wxT("LVM_GETSUBITEMRECT"); + case 0x1000 + 57: return wxT("LVM_SUBITEMHITTEST"); + case 0x1000 + 58: return wxT("LVM_SETCOLUMNORDERARRAY"); + case 0x1000 + 59: return wxT("LVM_GETCOLUMNORDERARRAY"); + case 0x1000 + 60: return wxT("LVM_SETHOTITEM"); + case 0x1000 + 61: return wxT("LVM_GETHOTITEM"); + case 0x1000 + 62: return wxT("LVM_SETHOTCURSOR"); + case 0x1000 + 63: return wxT("LVM_GETHOTCURSOR"); + case 0x1000 + 64: return wxT("LVM_APPROXIMATEVIEWRECT"); + case 0x1000 + 65: return wxT("LVM_SETWORKAREA"); + + // tree view + case 0x1100 + 0: return wxT("TVM_INSERTITEMA"); + case 0x1100 + 50: return wxT("TVM_INSERTITEMW"); + case 0x1100 + 1: return wxT("TVM_DELETEITEM"); + case 0x1100 + 2: return wxT("TVM_EXPAND"); + case 0x1100 + 4: return wxT("TVM_GETITEMRECT"); + case 0x1100 + 5: return wxT("TVM_GETCOUNT"); + case 0x1100 + 6: return wxT("TVM_GETINDENT"); + case 0x1100 + 7: return wxT("TVM_SETINDENT"); + case 0x1100 + 8: return wxT("TVM_GETIMAGELIST"); + case 0x1100 + 9: return wxT("TVM_SETIMAGELIST"); + case 0x1100 + 10: return wxT("TVM_GETNEXTITEM"); + case 0x1100 + 11: return wxT("TVM_SELECTITEM"); + case 0x1100 + 12: return wxT("TVM_GETITEMA"); + case 0x1100 + 62: return wxT("TVM_GETITEMW"); + case 0x1100 + 13: return wxT("TVM_SETITEMA"); + case 0x1100 + 63: return wxT("TVM_SETITEMW"); + case 0x1100 + 14: return wxT("TVM_EDITLABELA"); + case 0x1100 + 65: return wxT("TVM_EDITLABELW"); + case 0x1100 + 15: return wxT("TVM_GETEDITCONTROL"); + case 0x1100 + 16: return wxT("TVM_GETVISIBLECOUNT"); + case 0x1100 + 17: return wxT("TVM_HITTEST"); + case 0x1100 + 18: return wxT("TVM_CREATEDRAGIMAGE"); + case 0x1100 + 19: return wxT("TVM_SORTCHILDREN"); + case 0x1100 + 20: return wxT("TVM_ENSUREVISIBLE"); + case 0x1100 + 21: return wxT("TVM_SORTCHILDRENCB"); + case 0x1100 + 22: return wxT("TVM_ENDEDITLABELNOW"); + case 0x1100 + 23: return wxT("TVM_GETISEARCHSTRINGA"); + case 0x1100 + 64: return wxT("TVM_GETISEARCHSTRINGW"); + case 0x1100 + 24: return wxT("TVM_SETTOOLTIPS"); + case 0x1100 + 25: return wxT("TVM_GETTOOLTIPS"); + + // header + case 0x1200 + 0: return wxT("HDM_GETITEMCOUNT"); + case 0x1200 + 1: return wxT("HDM_INSERTITEMA"); + case 0x1200 + 10: return wxT("HDM_INSERTITEMW"); + case 0x1200 + 2: return wxT("HDM_DELETEITEM"); + case 0x1200 + 3: return wxT("HDM_GETITEMA"); + case 0x1200 + 11: return wxT("HDM_GETITEMW"); + case 0x1200 + 4: return wxT("HDM_SETITEMA"); + case 0x1200 + 12: return wxT("HDM_SETITEMW"); + case 0x1200 + 5: return wxT("HDM_LAYOUT"); + case 0x1200 + 6: return wxT("HDM_HITTEST"); + case 0x1200 + 7: return wxT("HDM_GETITEMRECT"); + case 0x1200 + 8: return wxT("HDM_SETIMAGELIST"); + case 0x1200 + 9: return wxT("HDM_GETIMAGELIST"); + case 0x1200 + 15: return wxT("HDM_ORDERTOINDEX"); + case 0x1200 + 16: return wxT("HDM_CREATEDRAGIMAGE"); + case 0x1200 + 17: return wxT("HDM_GETORDERARRAY"); + case 0x1200 + 18: return wxT("HDM_SETORDERARRAY"); + case 0x1200 + 19: return wxT("HDM_SETHOTDIVIDER"); + + // tab control + case 0x1300 + 2: return wxT("TCM_GETIMAGELIST"); + case 0x1300 + 3: return wxT("TCM_SETIMAGELIST"); + case 0x1300 + 4: return wxT("TCM_GETITEMCOUNT"); + case 0x1300 + 5: return wxT("TCM_GETITEMA"); + case 0x1300 + 60: return wxT("TCM_GETITEMW"); + case 0x1300 + 6: return wxT("TCM_SETITEMA"); + case 0x1300 + 61: return wxT("TCM_SETITEMW"); + case 0x1300 + 7: return wxT("TCM_INSERTITEMA"); + case 0x1300 + 62: return wxT("TCM_INSERTITEMW"); + case 0x1300 + 8: return wxT("TCM_DELETEITEM"); + case 0x1300 + 9: return wxT("TCM_DELETEALLITEMS"); + case 0x1300 + 10: return wxT("TCM_GETITEMRECT"); + case 0x1300 + 11: return wxT("TCM_GETCURSEL"); + case 0x1300 + 12: return wxT("TCM_SETCURSEL"); + case 0x1300 + 13: return wxT("TCM_HITTEST"); + case 0x1300 + 14: return wxT("TCM_SETITEMEXTRA"); + case 0x1300 + 40: return wxT("TCM_ADJUSTRECT"); + case 0x1300 + 41: return wxT("TCM_SETITEMSIZE"); + case 0x1300 + 42: return wxT("TCM_REMOVEIMAGE"); + case 0x1300 + 43: return wxT("TCM_SETPADDING"); + case 0x1300 + 44: return wxT("TCM_GETROWCOUNT"); + case 0x1300 + 45: return wxT("TCM_GETTOOLTIPS"); + case 0x1300 + 46: return wxT("TCM_SETTOOLTIPS"); + case 0x1300 + 47: return wxT("TCM_GETCURFOCUS"); + case 0x1300 + 48: return wxT("TCM_SETCURFOCUS"); + case 0x1300 + 49: return wxT("TCM_SETMINTABWIDTH"); + case 0x1300 + 50: return wxT("TCM_DESELECTALL"); + + // toolbar + case WM_USER+1: return wxT("TB_ENABLEBUTTON"); + case WM_USER+2: return wxT("TB_CHECKBUTTON"); + case WM_USER+3: return wxT("TB_PRESSBUTTON"); + case WM_USER+4: return wxT("TB_HIDEBUTTON"); + case WM_USER+5: return wxT("TB_INDETERMINATE"); + case WM_USER+9: return wxT("TB_ISBUTTONENABLED"); + case WM_USER+10: return wxT("TB_ISBUTTONCHECKED"); + case WM_USER+11: return wxT("TB_ISBUTTONPRESSED"); + case WM_USER+12: return wxT("TB_ISBUTTONHIDDEN"); + case WM_USER+13: return wxT("TB_ISBUTTONINDETERMINATE"); + case WM_USER+17: return wxT("TB_SETSTATE"); + case WM_USER+18: return wxT("TB_GETSTATE"); + case WM_USER+19: return wxT("TB_ADDBITMAP"); + case WM_USER+20: return wxT("TB_ADDBUTTONS"); + case WM_USER+21: return wxT("TB_INSERTBUTTON"); + case WM_USER+22: return wxT("TB_DELETEBUTTON"); + case WM_USER+23: return wxT("TB_GETBUTTON"); + case WM_USER+24: return wxT("TB_BUTTONCOUNT"); + case WM_USER+25: return wxT("TB_COMMANDTOINDEX"); + case WM_USER+26: return wxT("TB_SAVERESTOREA"); + case WM_USER+76: return wxT("TB_SAVERESTOREW"); + case WM_USER+27: return wxT("TB_CUSTOMIZE"); + case WM_USER+28: return wxT("TB_ADDSTRINGA"); + case WM_USER+77: return wxT("TB_ADDSTRINGW"); + case WM_USER+29: return wxT("TB_GETITEMRECT"); + case WM_USER+30: return wxT("TB_BUTTONSTRUCTSIZE"); + case WM_USER+31: return wxT("TB_SETBUTTONSIZE"); + case WM_USER+32: return wxT("TB_SETBITMAPSIZE"); + case WM_USER+33: return wxT("TB_AUTOSIZE"); + case WM_USER+35: return wxT("TB_GETTOOLTIPS"); + case WM_USER+36: return wxT("TB_SETTOOLTIPS"); + case WM_USER+37: return wxT("TB_SETPARENT"); + case WM_USER+39: return wxT("TB_SETROWS"); + case WM_USER+40: return wxT("TB_GETROWS"); + case WM_USER+42: return wxT("TB_SETCMDID"); + case WM_USER+43: return wxT("TB_CHANGEBITMAP"); + case WM_USER+44: return wxT("TB_GETBITMAP"); + case WM_USER+45: return wxT("TB_GETBUTTONTEXTA"); + case WM_USER+75: return wxT("TB_GETBUTTONTEXTW"); + case WM_USER+46: return wxT("TB_REPLACEBITMAP"); + case WM_USER+47: return wxT("TB_SETINDENT"); + case WM_USER+48: return wxT("TB_SETIMAGELIST"); + case WM_USER+49: return wxT("TB_GETIMAGELIST"); + case WM_USER+50: return wxT("TB_LOADIMAGES"); + case WM_USER+51: return wxT("TB_GETRECT"); + case WM_USER+52: return wxT("TB_SETHOTIMAGELIST"); + case WM_USER+53: return wxT("TB_GETHOTIMAGELIST"); + case WM_USER+54: return wxT("TB_SETDISABLEDIMAGELIST"); + case WM_USER+55: return wxT("TB_GETDISABLEDIMAGELIST"); + case WM_USER+56: return wxT("TB_SETSTYLE"); + case WM_USER+57: return wxT("TB_GETSTYLE"); + case WM_USER+58: return wxT("TB_GETBUTTONSIZE"); + case WM_USER+59: return wxT("TB_SETBUTTONWIDTH"); + case WM_USER+60: return wxT("TB_SETMAXTEXTROWS"); + case WM_USER+61: return wxT("TB_GETTEXTROWS"); + case WM_USER+41: return wxT("TB_GETBITMAPFLAGS"); + + default: + static wxString s_szBuf; + s_szBuf.Printf(wxT(""), message); + return s_szBuf.c_str(); + } +} +#endif // wxDEBUG_LEVEL >= 2 + +static TEXTMETRIC wxGetTextMetrics(const wxWindowMSW *win) +{ + // prepare the DC + TEXTMETRIC tm; + HWND hwnd = GetHwndOf(win); + HDC hdc = ::GetDC(hwnd); + +#if !wxDIALOG_UNIT_COMPATIBILITY + // and select the current font into it + HFONT hfont = GetHfontOf(win->GetFont()); + if ( hfont ) + { + hfont = (HFONT)::SelectObject(hdc, hfont); + } +#endif + + // finally retrieve the text metrics from it + GetTextMetrics(hdc, &tm); + +#if !wxDIALOG_UNIT_COMPATIBILITY + // and clean up + if ( hfont ) + { + (void)::SelectObject(hdc, hfont); + } +#endif + + ::ReleaseDC(hwnd, hdc); + + return tm; +} + +// Find the wxWindow at the current mouse position, returning the mouse +// position. +wxWindow* wxFindWindowAtPointer(wxPoint& pt) +{ + pt = wxGetMousePosition(); + return wxFindWindowAtPoint(pt); +} + +wxWindow* wxFindWindowAtPoint(const wxPoint& pt) +{ + POINT pt2; + pt2.x = pt.x; + pt2.y = pt.y; + + HWND hWnd = ::WindowFromPoint(pt2); + if ( hWnd ) + { + // WindowFromPoint() ignores the disabled children but we're supposed + // to take them into account, so check if we have a child at this + // coordinate using ChildWindowFromPointEx(). + for ( ;; ) + { + pt2.x = pt.x; + pt2.y = pt.y; + ::ScreenToClient(hWnd, &pt2); + HWND child = ::ChildWindowFromPointEx(hWnd, pt2, CWP_SKIPINVISIBLE); + if ( child == hWnd || !child ) + break; + + // ChildWindowFromPointEx() only examines the immediate children + // but we want to get the deepest (top in Z-order) one, so continue + // iterating for as long as it finds anything. + hWnd = child; + } + } + + return wxGetWindowFromHWND((WXHWND)hWnd); +} + +// Get the current mouse position. +wxPoint wxGetMousePosition() +{ + POINT pt; + wxGetCursorPosMSW(&pt); + + return wxPoint(pt.x, pt.y); +} + +#if wxUSE_HOTKEY + +#if defined(__SMARTPHONE__) || defined(__POCKETPC__) +static void WinCEUnregisterHotKey(int modifiers, int id) +{ + // Register hotkeys for the hardware buttons + HINSTANCE hCoreDll; + typedef BOOL (WINAPI *UnregisterFunc1Proc)(UINT, UINT); + + UnregisterFunc1Proc procUnregisterFunc; + hCoreDll = LoadLibrary(wxT("coredll.dll")); + if (hCoreDll) + { + procUnregisterFunc = (UnregisterFunc1Proc)GetProcAddress(hCoreDll, wxT("UnregisterFunc1")); + if (procUnregisterFunc) + procUnregisterFunc(modifiers, id); + FreeLibrary(hCoreDll); + } +} +#endif + +bool wxWindowMSW::RegisterHotKey(int hotkeyId, int modifiers, int keycode) +{ + UINT win_modifiers=0; + if ( modifiers & wxMOD_ALT ) + win_modifiers |= MOD_ALT; + if ( modifiers & wxMOD_SHIFT ) + win_modifiers |= MOD_SHIFT; + if ( modifiers & wxMOD_CONTROL ) + win_modifiers |= MOD_CONTROL; + if ( modifiers & wxMOD_WIN ) + win_modifiers |= MOD_WIN; + +#if defined(__SMARTPHONE__) || defined(__POCKETPC__) + // Required for PPC and Smartphone hardware buttons + if (keycode >= WXK_SPECIAL1 && keycode <= WXK_SPECIAL20) + WinCEUnregisterHotKey(win_modifiers, hotkeyId); +#endif + + if ( !::RegisterHotKey(GetHwnd(), hotkeyId, win_modifiers, keycode) ) + { + wxLogLastError(wxT("RegisterHotKey")); + + return false; + } + + return true; +} + +bool wxWindowMSW::UnregisterHotKey(int hotkeyId) +{ +#if defined(__SMARTPHONE__) || defined(__POCKETPC__) + WinCEUnregisterHotKey(MOD_WIN, hotkeyId); +#endif + + if ( !::UnregisterHotKey(GetHwnd(), hotkeyId) ) + { + wxLogLastError(wxT("UnregisterHotKey")); + + return false; + } + + return true; +} + +bool wxWindowMSW::HandleHotKey(WXWPARAM wParam, WXLPARAM lParam) +{ + int win_modifiers = LOWORD(lParam); + + wxKeyEvent event(CreateKeyEvent(wxEVT_HOTKEY, HIWORD(lParam))); + event.SetId(wParam); + event.m_shiftDown = (win_modifiers & MOD_SHIFT) != 0; + event.m_controlDown = (win_modifiers & MOD_CONTROL) != 0; + event.m_altDown = (win_modifiers & MOD_ALT) != 0; + event.m_metaDown = (win_modifiers & MOD_WIN) != 0; + + return HandleWindowEvent(event); +} + +#endif // wxUSE_HOTKEY + +// Not tested under WinCE +#ifndef __WXWINCE__ + +// this class installs a message hook which really wakes up our idle processing +// each time a WM_NULL is received (wxWakeUpIdle does this), even if we're +// sitting inside a local modal loop (e.g. a menu is opened or scrollbar is +// being dragged or even inside ::MessageBox()) and so don't control message +// dispatching otherwise +class wxIdleWakeUpModule : public wxModule +{ +public: + virtual bool OnInit() + { + ms_hMsgHookProc = ::SetWindowsHookEx + ( + WH_GETMESSAGE, + &wxIdleWakeUpModule::MsgHookProc, + NULL, + GetCurrentThreadId() + ); + + if ( !ms_hMsgHookProc ) + { + wxLogLastError(wxT("SetWindowsHookEx(WH_GETMESSAGE)")); + + return false; + } + + return true; + } + + virtual void OnExit() + { + ::UnhookWindowsHookEx(wxIdleWakeUpModule::ms_hMsgHookProc); + } + + static LRESULT CALLBACK MsgHookProc(int nCode, WPARAM wParam, LPARAM lParam) + { + MSG *msg = (MSG*)lParam; + + // only process the message if it is actually going to be removed from + // the message queue, this prevents that the same event from being + // processed multiple times if now someone just called PeekMessage() + if ( msg->message == WM_NULL && wParam == PM_REMOVE ) + { + wxTheApp->ProcessPendingEvents(); + } + + return CallNextHookEx(ms_hMsgHookProc, nCode, wParam, lParam); + } + +private: + static HHOOK ms_hMsgHookProc; + + DECLARE_DYNAMIC_CLASS(wxIdleWakeUpModule) +}; + +HHOOK wxIdleWakeUpModule::ms_hMsgHookProc = 0; + +IMPLEMENT_DYNAMIC_CLASS(wxIdleWakeUpModule, wxModule) + +#endif // __WXWINCE__ + +#ifdef __WXWINCE__ + +#if wxUSE_STATBOX +static void wxAdjustZOrder(wxWindow* parent) +{ + if (wxDynamicCast(parent, wxStaticBox)) + { + // Set the z-order correctly + SetWindowPos((HWND) parent->GetHWND(), HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE); + } + + wxWindowList::compatibility_iterator current = parent->GetChildren().GetFirst(); + while (current) + { + wxWindow *childWin = current->GetData(); + wxAdjustZOrder(childWin); + current = current->GetNext(); + } +} +#endif + +// We need to adjust the z-order of static boxes in WinCE, to +// make 'contained' controls visible +void wxWindowMSW::OnInitDialog( wxInitDialogEvent& event ) +{ +#if wxUSE_STATBOX + wxAdjustZOrder(this); +#endif + + event.Skip(); +} +#endif diff --git a/installers/utils/CWSDSTUB.EXE_and_exe2coff_goes_here b/installers/utils/CWSDSTUB.EXE_and_exe2coff_goes_here new file mode 100644 index 0000000..c50ed18 --- /dev/null +++ b/installers/utils/CWSDSTUB.EXE_and_exe2coff_goes_here @@ -0,0 +1 @@ +" " diff --git a/installers/wizard/config.script b/installers/wizard/config.script new file mode 100644 index 0000000..4334afd --- /dev/null +++ b/installers/wizard/config.script @@ -0,0 +1,124 @@ +/* + * This file is part of the Code::Blocks IDE and licensed under the GNU General Public License, version 3 + * http://www.gnu.org/licenses/gpl-3.0.html + * + * $Revision: 10722 $ + * $Id: config.script 10722 2016-01-28 14:39:15Z mortenmacfly $ + * $HeadURL: http://svn.code.sf.net/p/codeblocks/code/branches/release-20.xx/src/plugins/scriptedwizard/resources/config.script $ + */ + +// +// Main wizards configuration script. +// Here, we register all the available wizards. +// + +function RegisterWizards() +{ + // + // project wizards + // + RegisterWizard(wizProject, _T("empty"), _T("Empty project"), _T("Console")); + + RegisterWizard(wizProject, _T("wxwidgets"), _T("wxWidgets project"), _T("GUI")); + + RegisterWizard(wizProject, _T("djgpp"), _T("DJGPP DOS application (386+)"), _T("Console")); + + RegisterWizard(wizProject, _T("owcdos"), _T("OpenWatcom DOS (16-bit) application"), _T("Console")); + + RegisterWizard(wizProject, _T("console"), _T("Console application"), _T("Console")); + + RegisterWizard(wizProject, _T("staticlib"), _T("Static library"), _T("Console")); + + if (PLATFORM == PLATFORM_MSW) + { + RegisterWizard(wizProject, _T("win32gui"), _T("Win32 GUI project"), _T("GUI")); + RegisterWizard(wizProject, _T("dll"), _T("Dynamic Link Library"), _T("Console")); + RegisterWizard(wizProject, _T("sys"), _T("Kernel Mode Driver"), _T("Native")); + } + + + /* + RegisterWizard(wizProject, _T("fortran/app"), _T("Fortran application"), _T("Fortran")); + RegisterWizard(wizProject, _T("fortran/lib"), _T("Fortran library"), _T("Fortran")); + RegisterWizard(wizProject, _T("fortran/dll"), _T("Fortran DLL"), _T("Fortran")); + + + RegisterWizard(wizProject, _T("d"), _T("D application"), _T("D language")); + if (PLATFORM == PLATFORM_MSW) + { + RegisterWizard(wizProject, _T("directx"), _T("Direct/X project"), _T("2D/3D Graphics")); + + } + RegisterWizard(wizProject, _T("fltk"), _T("FLTK project"), _T("GUI")); + RegisterWizard(wizProject, _T("glfw"), _T("GLFW project"), _T("2D/3D Graphics")); + RegisterWizard(wizProject, _T("glut"), _T("GLUT project"), _T("2D/3D Graphics")); + RegisterWizard(wizProject, _T("gtk"), _T("GTK+ project"), _T("GUI")); + RegisterWizard(wizProject, _T("irrlicht"), _T("Irrlicht project"), _T("2D/3D Graphics")); + RegisterWizard(wizProject, _T("java"), _T("Java application"), _T("Java")); + RegisterWizard(wizProject, _T("lf"), _T("Lightfeather project"), _T("2D/3D Graphics")); + RegisterWizard(wizProject, _T("matlab_csf"), _T("Matlab project"), _T("Console")); + RegisterWizard(wizProject, _T("opencv"), _T("OpenCV project"), _T("Console")); + RegisterWizard(wizProject, _T("opengl"), _T("OpenGL project"), _T("2D/3D Graphics")); + RegisterWizard(wizProject, _T("ogre"), _T("Ogre project"), _T("2D/3D Graphics")); + RegisterWizard(wizProject, _T("plugins"), _T("Code::Blocks plugin"), _T("Code::Blocks")); + RegisterWizard(wizProject, _T("qt4"), _T("QT4 project"), _T("GUI")); + RegisterWizard(wizProject, _T("qt4dll"), _T("QT4 (shared) project"), _T("GUI")); + RegisterWizard(wizProject, _T("qt5"), _T("QT5 project"), _T("GUI")); + RegisterWizard(wizProject, _T("sdl"), _T("SDL project"), _T("2D/3D Graphics")); + RegisterWizard(wizProject, _T("sdl2"), _T("SDL2 project"), _T("2D/3D Graphics")); + RegisterWizard(wizProject, _T("sfml"), _T("SFML project"), _T("2D/3D Graphics")); + if (PLATFORM == PLATFORM_MSW) + RegisterWizard(wizProject, _T("smartwin"), _T("SmartWin project"), _T("GUI")); + + if (PLATFORM == PLATFORM_MSW) + RegisterWizard(wizProject, _T("stlport"), _T("STL port application"), _T("Console")); + RegisterWizard(wizProject, _T("sharedlib"), _T("Shared library"), _T("Console")); + */ + + + // + // build target wizards + // + RegisterWizard(wizTarget, _T("wxwidgets"), _T("wxWidgets"), _T("GUI")); + RegisterWizard(wizTarget, _T("djgpp"), _T("DJGPP DOS application (386+)"), _T("Console")); + RegisterWizard(wizTarget, _T("owcdos"), _T("OpenWatcom DOS (16-bit) application"), _T("Console")); + RegisterWizard(wizTarget, _T("console"), _T("Console"), _T("Console")); + + RegisterWizard(wizTarget, _T("staticlib"), _T("Static library"), _T("Console")); + if (PLATFORM == PLATFORM_MSW) + RegisterWizard(wizTarget, _T("dll"), _T("Dynamic Link Library"), _T("Console")); + + /* + RegisterWizard(wizProject, _T("arduino"), _T("Arduino Project"), _T("Embedded Systems")); + RegisterWizard(wizProject, _T("arm"), _T("ARM Project"), _T("Embedded Systems")); + RegisterWizard(wizProject, _T("avr"), _T("AVR Project"), _T("Embedded Systems")); + RegisterWizard(wizProject, _T("msp430"), _T("MSP430 Project"), _T("Embedded Systems")); + RegisterWizard(wizProject, _T("tricore"), _T("TriCore Project"), _T("Embedded Systems")); + RegisterWizard(wizProject, _T("ppc"), _T("PowerPC Project"), _T("Embedded Systems")); + RegisterWizard(wizProject, _T("mcs51"), _T("MCS51 Project"), _T("Embedded Systems")); + */ + + // + // file wizards + // + RegisterWizard(wizFiles, _T("empty_file"), _T("Empty file"), _T("C/C++")); + RegisterWizard(wizFiles, _T("c_file"), _T("C/C++ source"), _T("C/C++")); + //RegisterWizard(wizFiles, _T("d_source"), _T("D source"), _T("D language")); + RegisterWizard(wizFiles, _T("h_file"), _T("C/C++ header"), _T("C/C++")); + //RegisterWizard(wizFiles, _T("fortran/file"), _T("Fortran source"), _T("Fortran")); + //RegisterWizard(wizFiles, _T("java/file"), _T("Java source"), _T("Java")); +} + +function RegisterWizard(type, folder, title, category) +{ + // syntax: + // AddWizard(type, title, category, script, template_png, wizard_png, xrc) + + Wizard.AddWizard(type, + title, + category, + folder + _T("/wizard.script"), + folder + _T("/logo.png"), + folder + _T("/wizard.png"), + folder + _T("/wizard.xrc")); +} diff --git a/installers/wizard/console/c/main.c b/installers/wizard/console/c/main.c new file mode 100644 index 0000000..022b16e --- /dev/null +++ b/installers/wizard/console/c/main.c @@ -0,0 +1,8 @@ +#include +#include + +int main() +{ + printf("Hello world!\n"); + return 0; +} diff --git a/installers/wizard/console/cpp/main.cpp b/installers/wizard/console/cpp/main.cpp new file mode 100644 index 0000000..b4392ec --- /dev/null +++ b/installers/wizard/console/cpp/main.cpp @@ -0,0 +1,9 @@ +#include + +using namespace std; + +int main() +{ + cout << "Hello world!" << endl; + return 0; +} diff --git a/installers/wizard/console/logo.png b/installers/wizard/console/logo.png new file mode 100644 index 0000000..1bdcfa8 Binary files /dev/null and b/installers/wizard/console/logo.png differ diff --git a/installers/wizard/console/wizard.png b/installers/wizard/console/wizard.png new file mode 100644 index 0000000..034e231 Binary files /dev/null and b/installers/wizard/console/wizard.png differ diff --git a/installers/wizard/console/wizard.script b/installers/wizard/console/wizard.script new file mode 100644 index 0000000..1d5e4b7 --- /dev/null +++ b/installers/wizard/console/wizard.script @@ -0,0 +1,262 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Code::Blocks new project wizard script +// +// Project: Console application +// Author: Yiannis Mandravellos +// +// Wizard scripts documentation can be found at: +// http://wiki.codeblocks.org/index.php?title=Wizard_scripts +// +//////////////////////////////////////////////////////////////////////////////// + +multi_thread_dynamic <- true; //Default to Multi-thread. For MSVC only. +ConsoleLang <- 1; // default to C++ +WizardType <- 0; // 0 - Project, 1 - Target + +// +//------------------------------------------------------------------------------ +// +function BeginWizard() +{ + local wiz_type = Wizard.GetWizardType(); + + if (wiz_type == wizProject) + { + // this is the text that will appear in the start (intro) page + local intro_msg = _T("Welcome to the new console application wizard!\n" + + "This wizard will guide you to create a new console application.\n\n" + + "When you 're ready to proceed, please click \"Next\"..."); + + // intro + Wizard.AddInfoPage(_T("ConsoleIntro"), intro_msg); + // select language + Wizard.AddGenericSingleChoiceListPage(_T("ConsoleLanguagePage"), _T("Please select the language you want to use."), _T("C;C++"), ConsoleLang); // select language + // select project name and path + Wizard.AddProjectPathPage(); + // select compiler and configurations + Wizard.AddCompilerPage(_T(""), _T("*"), true, true); + } + else if (wiz_type == wizTarget) + { + WizardType = 1; + local intro_msg = _T("Welcome to the new console build target wizard!\n" + + "This wizard will guide you to create a new console build target.\n\n" + + "When you 're ready to proceed, please click \"Next\"..."); + Wizard.AddInfoPage(_T("ConsoleIntro"), intro_msg); + Wizard.AddBuildTargetPage(_T(""), false, true, _T(""), _T("*"), true); + } +} + +//------------------------------------------------------------------------------ +// Function OnEnter_ConsoleLanguagePage +//------------------------------------------------------------------------------ +function OnEnter_ConsoleLanguagePage(fwd) +{ + Wizard.SetListboxSelection(_T("GenericChoiceList"), ConsoleLang); + return true; +} +//------------------------------------------------------------------------------ +// Function OnLeave_ConsoleLanguagePage +//------------------------------------------------------------------------------ +function OnLeave_ConsoleLanguagePage(fwd) +{ + if (fwd) + { + ConsoleLang = Wizard.GetListboxSelection(_T("GenericChoiceList")); + } + return true; +} + +// +//------------------------------------------------------------------------------ +// +function OnLeave_CompilerPage(fwd) +{ + if (fwd) + { + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvctk")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc8")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc10"))) + { + local msg = _T("Wizard will setup the Project in Multi-threaded Dynamic CRT mode by default.\n\n"); + msg = msg + _T("Click Yes to continue with Multi-threaded Dynamic CRT mode\n\n"); + msg = msg + _T("Click No to continue with Multi-threaded Static CRT mode"); + local thread = Message(msg, _T("Console Wizard"), wxICON_QUESTION | wxYES_NO); + if (thread == wxID_YES) + multi_thread_dynamic = true; + else + multi_thread_dynamic = false; + } + } + return true; +} +// +//------------------------------------------------------------------------------ +// +function GetFilesDir() +{ + local result; + + // depending on the source type setting, return the appropriate value. + if (ConsoleLang == 0) // C source file + result = _T("console/c"); + else // C++ source file + result = _T("console/cpp"); + + return result; +} +// +//------------------------------------------------------------------------------ +// +function SetupProject(project) +{ + // NOTE: Major compiler system drawback here. + // Until it is redesigned to allow easier compiler settings, + // we have to check the compiler's ID and set options for different compilers... + // We make things easier for scripts, by providing a few predefined functions + // to setup common settings like "debug", "warnings", etc. + // These functions are located in /common_functions.script. + // If you add other commonly used functions or bug-fix anything in that file, + // please share it with us :) + + // enable compiler warnings (project-wide) + WarningsOn(project, Wizard.GetCompilerID()); + + // add additional libs for special compilers + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("bcc"))) + { + project.AddLinkLib(_T("cw32mt.lib")); + project.AddLinkLib(_T("import32.lib")); + } + + // We setup the targets using SetupTarget() which is conveniently called by Code::Blocks + // if we register this wizard as wizTarget type :) + // This means that this very wizard can be used both as wizProject *and* as wizTarget ;) + + // Debug build target + local target = project.GetBuildTarget(Wizard.GetDebugName()); + if (!IsNull(target)) + SetupTarget(target, true); + + // Release build target + target = project.GetBuildTarget(Wizard.GetReleaseName()); + if (!IsNull(target)) + SetupTarget(target, false); + + //Add CPP Exception handling support + if (ConsoleLang == 1) + CppExceptionsOn(project, Wizard.GetCompilerID()); + // all done! + return true; +} +// +//------------------------------------------------------------------------------ +// +function SetupTarget(target,is_debug) +{ + if (IsNull(target)) + return false; + + target.SetTargetType(ttConsoleOnly); + // TODO (Biplab#9#): Wizard.GetProjectName() returns file extension when the wizard is of Target type. This bug needs to be fixed + local ProjectName = (WizardType == 0) ? Wizard.GetProjectName() : target.GetParentProject().GetTitle(); + + + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("bcc"))) + { + target.AddLinkLib(_T("cw32mt.lib")); + target.AddLinkLib(_T("import32.lib")); + target.AddCompilerOption(_T("-tWM")); + target.AddCompilerOption(_T("-tWC")); + } + + // if target wizard + if (WizardType == 1) + { + target.SetOptionRelation(ortCompilerOptions, orUseTargetOptionsOnly); + target.SetOptionRelation(ortLinkerOptions, orUseTargetOptionsOnly); + } + + if (is_debug) + { + local TargetName = (WizardType == 0) ? Wizard.GetDebugOutputDir() : Wizard.GetTargetOutputDir(); + if (target.GetWorkingDir().Matches(_T(""))) + target.SetOutputFilename(target.SuggestOutputFilename()); + else + //target.SetOutputFilename(Wizard.GetDebugOutputDir() + Wizard.GetProjectName() + DOT_EXT_EXECUTABLE); + target.SetOutputFilename(TargetName + ProjectName + DOT_EXT_EXECUTABLE); + + // enable debugging symbols for this target + // DebugSymbolsOn(target, Wizard.GetTargetCompilerID()); // TODO: doesn't seem to work? + DebugSymbolsOn(target, Wizard.GetCompilerID()); + //Special consideration for MSVC 7.1 + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvctk")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc8")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc10"))) + { + if (!multi_thread_dynamic) + { + target.AddCompilerOption(_T("/MTd")); + target.AddLinkLib(_T("libcmtd.lib")); + target.AddLinkLib(_T("libcpmtd.lib")); + } + else + { + target.AddCompilerOption(_T("/MDd")); + target.AddLinkLib(_T("msvcrtd.lib")); + target.AddLinkLib(_T("msvcprtd.lib")); + } + } + } + else + { + local TargetName = (WizardType == 0) ? Wizard.GetReleaseOutputDir() : Wizard.GetTargetOutputDir(); + if (target.GetWorkingDir().Matches(_T(""))) + target.SetOutputFilename(target.SuggestOutputFilename()); + else + //target.SetOutputFilename(TargetName + Wizard.GetProjectName() + DOT_EXT_EXECUTABLE); + target.SetOutputFilename(TargetName + ProjectName + DOT_EXT_EXECUTABLE); + + // enable optimizations for this target + // OptimizationsOn(target, Wizard.GetTargetCompilerID()); // TODO: doesn't seem to work? + OptimizationsOn(target, Wizard.GetCompilerID()); + //Special consideration for MSVC 7.1 + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvctk")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc8")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc10"))) + { + if (!multi_thread_dynamic) + { + target.AddCompilerOption(_T("/MT")); + target.AddLinkLib(_T("libcmt.lib")); + target.AddLinkLib(_T("libcpmt.lib")); + } + else + { + target.AddCompilerOption(_T("/MD")); + target.AddLinkLib(_T("msvcrt.lib")); + target.AddLinkLib(_T("msvcprt.lib")); + } + } + } + + // all done! + + + // try to open sample file in the editor + local mainfile = ::wxString(); + + if (ConsoleLang==0) mainfile = _T("main.c"); + else mainfile = _T("main.cpp"); + + local ed = GetEditorManager().Open( Wizard.GetProjectPath() + Wizard.GetProjectName() + wxFILE_SEP_PATH + mainfile ); + + /* + if (IsNull(ed)) + ShowError(_T("Could not open: " + Wizard.GetProjectPath() + Wizard.GetProjectName() + wxFILE_SEP_PATH + mainfile )); + */ + + + return true; +} diff --git a/installers/wizard/djgpp/c/main.c b/installers/wizard/djgpp/c/main.c new file mode 100644 index 0000000..022b16e --- /dev/null +++ b/installers/wizard/djgpp/c/main.c @@ -0,0 +1,8 @@ +#include +#include + +int main() +{ + printf("Hello world!\n"); + return 0; +} diff --git a/installers/wizard/djgpp/cpp/main.cpp b/installers/wizard/djgpp/cpp/main.cpp new file mode 100644 index 0000000..b4392ec --- /dev/null +++ b/installers/wizard/djgpp/cpp/main.cpp @@ -0,0 +1,9 @@ +#include + +using namespace std; + +int main() +{ + cout << "Hello world!" << endl; + return 0; +} diff --git a/installers/wizard/djgpp/logo.png b/installers/wizard/djgpp/logo.png new file mode 100644 index 0000000..1bdcfa8 Binary files /dev/null and b/installers/wizard/djgpp/logo.png differ diff --git a/installers/wizard/djgpp/wizard.png b/installers/wizard/djgpp/wizard.png new file mode 100644 index 0000000..034e231 Binary files /dev/null and b/installers/wizard/djgpp/wizard.png differ diff --git a/installers/wizard/djgpp/wizard.script b/installers/wizard/djgpp/wizard.script new file mode 100644 index 0000000..adb1e5e --- /dev/null +++ b/installers/wizard/djgpp/wizard.script @@ -0,0 +1,346 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Code::Blocks new project wizard script +// +// Project: Console application +// Author: based on original script by Yiannis Mandravellos, +// adjusting for DJGPP: adalbert +// +// Wizard scripts documentation can be found at: +// http://wiki.codeblocks.org/index.php?title=Wizard_scripts +// +//////////////////////////////////////////////////////////////////////////////// + +multi_thread_dynamic <- true; //Default to Multi-thread. For MSVC only. +ConsoleLang <- 1; // default to C++ +WizardType <- 0; // 0 - Project, 1 - Target + +// +//------------------------------------------------------------------------------ +// +function BeginWizard() +{ + local wiz_type = Wizard.GetWizardType(); + + if (wiz_type == wizProject) + { + // this is the text that will appear in the start (intro) page + local intro_msg = _T("Welcome to the new console application wizard!\n" + + "This wizard will guide you to create a new console application.\n\n" + + "When you 're ready to proceed, please click \"Next\"..."); + + // intro + Wizard.AddInfoPage(_T("ConsoleIntro"), intro_msg); + // select language + Wizard.AddGenericSingleChoiceListPage(_T("ConsoleLanguagePage"), _T("Please select the language you want to use."), _T("C;C++"), ConsoleLang); // select language + // select project name and path + Wizard.AddProjectPathPage(); + // select compiler and configurations + Wizard.AddCompilerPage((GetCompilerFactory().GetCompilerIDByName(_T("DJGPP"))), _T("*"), true, true); + } + else if (wiz_type == wizTarget) + { + WizardType = 1; + local intro_msg = _T("Welcome to the new console build target wizard!\n" + + "This wizard will guide you to create a new console build target.\n\n" + + "When you 're ready to proceed, please click \"Next\"..."); + Wizard.AddInfoPage(_T("ConsoleIntro"), intro_msg); + Wizard.AddBuildTargetPage(_T(""), false, true, (GetCompilerFactory().GetCompilerIDByName(_T("DJGPP"))), _T("*"), true); + } +} + + + + + + +function OnEnter_CompilerPage(forward) +{ + // we only care to initialize if going forward + if (forward) + { + // This is kind of a hack, but tries to suggest the best default compiler for given configuration + // Even if this function breaks, nothing terrible should happen + // ID_CHECKBOX1 = debug checkbox + + local i = 0; + for (i = 0; i < 99; i++) + { + Wizard.SetComboboxSelection( _T("ID_COMBOBOX1"), i ); + local currCompiler = Wizard.GetComboboxStringSelection( _T("ID_COMBOBOX1") ); + if (currCompiler == _T("DJGPP")) i = 100; + Wizard.CheckCheckbox( _T("ID_CHECKBOX1") , false) // Disable debug, won't work anyway + } + + } +} + +function OnEnter_BuildTargetPage(forward) +{ + // we only care to initialize if going forward + if (forward) + { + // This is kind of a hack, but tries to suggest the best default compiler for given configuration + // Even if this function breaks, nothing terrible should happen + // ID_CHECKBOX1 = debug checkbox + + local i = 0; + for (i = 0; i < 99; i++) + { + Wizard.SetComboboxSelection( _T("ID_COMBOBOX1"), i ); + local currCompiler = Wizard.GetComboboxStringSelection( _T("ID_COMBOBOX1") ); + if (currCompiler == _T("DJGPP")) i = 100; + //Wizard.CheckCheckbox( _T("ID_CHECKBOX1") , false) // Disable debug, won't work anyway + } + + } +} + + + + + + + + + + + +//------------------------------------------------------------------------------ +// Function OnEnter_ConsoleLanguagePage +//------------------------------------------------------------------------------ +function OnEnter_ConsoleLanguagePage(fwd) +{ + Wizard.SetListboxSelection(_T("GenericChoiceList"), ConsoleLang); + return true; +} +//------------------------------------------------------------------------------ +// Function OnLeave_ConsoleLanguagePage +//------------------------------------------------------------------------------ +function OnLeave_ConsoleLanguagePage(fwd) +{ + if (fwd) + { + ConsoleLang = Wizard.GetListboxSelection(_T("GenericChoiceList")); + } + return true; +} + +// +//------------------------------------------------------------------------------ +// +function OnLeave_CompilerPage(fwd) +{ + if (fwd) + { + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvctk")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc8")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc10"))) + { + local msg = _T("Wizard will setup the Project in Multi-threaded Dynamic CRT mode by default.\n\n"); + msg = msg + _T("Click Yes to continue with Multi-threaded Dynamic CRT mode\n\n"); + msg = msg + _T("Click No to continue with Multi-threaded Static CRT mode"); + local thread = Message(msg, _T("Console Wizard"), wxICON_QUESTION | wxYES_NO); + if (thread == wxID_YES) + multi_thread_dynamic = true; + else + multi_thread_dynamic = false; + } + } + return true; +} +// +//------------------------------------------------------------------------------ +// +function GetFilesDir() +{ + local result; + + // depending on the source type setting, return the appropriate value. + if (ConsoleLang == 0) // C source file + result = _T("console/c"); + else // C++ source file + result = _T("console/cpp"); + + return result; +} +// +//------------------------------------------------------------------------------ +// +function SetupProject(project) +{ + + // NOTE: Major compiler system drawback here. + // Until it is redesigned to allow easier compiler settings, + // we have to check the compiler's ID and set options for different compilers... + // We make things easier for scripts, by providing a few predefined functions + // to setup common settings like "debug", "warnings", etc. + // These functions are located in /common_functions.script. + // If you add other commonly used functions or bug-fix anything in that file, + // please share it with us :) + + // enable compiler warnings (project-wide) + WarningsOn(project, Wizard.GetCompilerID()); + + /* + // add additional libs for special compilers + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerIDByName(), _T("bcc"))) + { + project.AddLinkLib(_T("cw32mt.lib")); + project.AddLinkLib(_T("import32.lib")); + } + */ + + // We setup the targets using SetupTarget() which is conveniently called by Code::Blocks + // if we register this wizard as wizTarget type :) + // This means that this very wizard can be used both as wizProject *and* as wizTarget ;) + + // Debug build target + local target = project.GetBuildTarget(Wizard.GetDebugName()); + if (!IsNull(target)) + SetupTarget(target, true); + + // Release build target + target = project.GetBuildTarget(Wizard.GetReleaseName()); + if (!IsNull(target)) + SetupTarget(target, false); + + //Add CPP Exception handling support + if (ConsoleLang == 1) + CppExceptionsOn(project, Wizard.GetCompilerID()); + // all done! + + // try to open sample file in the editor + local mainfile = ::wxString(); + + if (ConsoleLang==0) mainfile = _T("main.c"); + else mainfile = _T("main.cpp"); + + local ed = GetEditorManager().Open( Wizard.GetProjectPath() + Wizard.GetProjectName() + wxFILE_SEP_PATH + mainfile ); + + /* + if (IsNull(ed)) + ShowError(_T("Could not open: " + Wizard.GetProjectPath() + Wizard.GetProjectName() + wxFILE_SEP_PATH + mainfile )); + */ + + return true; +} +// +//------------------------------------------------------------------------------ +// +function SetupTarget(target,is_debug) +{ + + + if (IsNull(target)) + return false; + + + // if target wizard + if (WizardType == 1) + { + target.SetOptionRelation(ortCompilerOptions, orUseTargetOptionsOnly); + target.SetOptionRelation(ortLinkerOptions, orUseTargetOptionsOnly); + } + + + // Post-build commands to prepare exe file without dependencies + local pb_exe2coff = ::wxString(); + local pb_copycw = ::wxString(); + local pb_deltemp = ::wxString(); + pb_exe2coff = _T("$(APPPATH)\\utils\\exe2coff.exe \"$(PROJECT_DIR)$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).exe\""); + pb_copycw = _T("cmd /C \"copy /B \"$(APPPATH)\\utils\\cwsdstub.exe\" + \"$(PROJECT_DIR)$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME)\" \"$(PROJECT_DIR)$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).exe\""); + pb_deltemp = _T("cmd /C \"del \"$(PROJECT_DIR)$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME)\"\""); + + // Post-build commands to run built exe in DOSbox + local pb_rundosbox = ::wxString(); + pb_rundosbox = _T("\"$(APPPATH)\\dosboxx\\dbxlauncher.bat\" \"$(PROJECT_DIR)$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).exe\""); + + // Add post-build commands to target + target.AddCommandsAfterBuild(pb_exe2coff); + target.AddCommandsAfterBuild(pb_copycw); + target.AddCommandsAfterBuild(pb_deltemp); + target.AddCommandsAfterBuild(pb_rundosbox); + + // This will run all above on each build (prepare EXE and run test in DOSbox) + target.SetAlwaysRunPostBuildSteps(true); + + + + + + + target.SetTargetType(ttConsoleOnly); + // TODO (Biplab#9#): Wizard.GetProjectName() returns file extension when the wizard is of Target type. This bug needs to be fixed + local ProjectName = (WizardType == 0) ? Wizard.GetProjectName() : target.GetParentProject().GetTitle(); + + target.SetUseConsoleRunner(false); + + if (is_debug) + { + local TargetName = (WizardType == 0) ? Wizard.GetDebugOutputDir() : Wizard.GetTargetOutputDir(); + if (target.GetWorkingDir().Matches(_T(""))) + target.SetOutputFilename(target.SuggestOutputFilename()); + else + //target.SetOutputFilename(Wizard.GetDebugOutputDir() + Wizard.GetProjectName() + DOT_EXT_EXECUTABLE); + target.SetOutputFilename(TargetName + ProjectName + DOT_EXT_EXECUTABLE); + + // enable debugging symbols for this target + // DebugSymbolsOn(target, Wizard.GetTargetCompilerID()); // TODO: doesn't seem to work? + DebugSymbolsOn(target, Wizard.GetCompilerID()); + //Special consideration for MSVC 7.1 + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvctk")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc8")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc10"))) + { + if (!multi_thread_dynamic) + { + target.AddCompilerOption(_T("/MTd")); + target.AddLinkLib(_T("libcmtd.lib")); + target.AddLinkLib(_T("libcpmtd.lib")); + } + else + { + target.AddCompilerOption(_T("/MDd")); + target.AddLinkLib(_T("msvcrtd.lib")); + target.AddLinkLib(_T("msvcprtd.lib")); + } + } + } + else + { + + + local TargetName = (WizardType == 0) ? Wizard.GetReleaseOutputDir() : Wizard.GetTargetOutputDir(); + if (target.GetWorkingDir().Matches(_T(""))) + target.SetOutputFilename(target.SuggestOutputFilename()); + else + //target.SetOutputFilename(TargetName + Wizard.GetProjectName() + DOT_EXT_EXECUTABLE); + target.SetOutputFilename(TargetName + ProjectName + DOT_EXT_EXECUTABLE); + + // enable optimizations for this target + // OptimizationsOn(target, Wizard.GetTargetCompilerID()); // TODO: doesn't seem to work? + OptimizationsOn(target, Wizard.GetCompilerID()); + //Special consideration for MSVC 7.1 + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvctk")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc8")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc10"))) + { + if (!multi_thread_dynamic) + { + target.AddCompilerOption(_T("/MT")); + target.AddLinkLib(_T("libcmt.lib")); + target.AddLinkLib(_T("libcpmt.lib")); + } + else + { + target.AddCompilerOption(_T("/MD")); + target.AddLinkLib(_T("msvcrt.lib")); + target.AddLinkLib(_T("msvcprt.lib")); + } + } + } + + // all done! + return true; +} diff --git a/installers/wizard/owcdos/c/main.c b/installers/wizard/owcdos/c/main.c new file mode 100644 index 0000000..022b16e --- /dev/null +++ b/installers/wizard/owcdos/c/main.c @@ -0,0 +1,8 @@ +#include +#include + +int main() +{ + printf("Hello world!\n"); + return 0; +} diff --git a/installers/wizard/owcdos/cpp/main.cpp b/installers/wizard/owcdos/cpp/main.cpp new file mode 100644 index 0000000..b4392ec --- /dev/null +++ b/installers/wizard/owcdos/cpp/main.cpp @@ -0,0 +1,9 @@ +#include + +using namespace std; + +int main() +{ + cout << "Hello world!" << endl; + return 0; +} diff --git a/installers/wizard/owcdos/logo.png b/installers/wizard/owcdos/logo.png new file mode 100644 index 0000000..1bdcfa8 Binary files /dev/null and b/installers/wizard/owcdos/logo.png differ diff --git a/installers/wizard/owcdos/wizard.png b/installers/wizard/owcdos/wizard.png new file mode 100644 index 0000000..034e231 Binary files /dev/null and b/installers/wizard/owcdos/wizard.png differ diff --git a/installers/wizard/owcdos/wizard.script b/installers/wizard/owcdos/wizard.script new file mode 100644 index 0000000..e895669 --- /dev/null +++ b/installers/wizard/owcdos/wizard.script @@ -0,0 +1,376 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Code::Blocks new project wizard script +// +// Project: Console application +// Author: based on original script by Yiannis Mandravellos, +// adjusting for OWC/DJGPP: adalbert +// +// Wizard scripts documentation can be found at: +// http://wiki.codeblocks.org/index.php?title=Wizard_scripts +// +//////////////////////////////////////////////////////////////////////////////// + +multi_thread_dynamic <- true; //Default to Multi-thread. For MSVC only. +ConsoleLang <- 1; // default to C++ +WizardType <- 0; // 0 - Project, 1 - Target + +// +//------------------------------------------------------------------------------ +// +function BeginWizard() +{ + local wiz_type = Wizard.GetWizardType(); + + if (wiz_type == wizProject) + { + // this is the text that will appear in the start (intro) page + local intro_msg = _T("Welcome to the new console application wizard!\n" + + "This wizard will guide you to create a new console application.\n\n" + + "When you 're ready to proceed, please click \"Next\"..."); + + // intro + Wizard.AddInfoPage(_T("ConsoleIntro"), intro_msg); + // select language + Wizard.AddGenericSingleChoiceListPage(_T("ConsoleLanguagePage"), _T("Please select the language you want to use."), _T("C;C++"), ConsoleLang); // select language + // select project name and path + Wizard.AddProjectPathPage(); + // select compiler and configurations + Wizard.AddCompilerPage((GetCompilerFactory().GetCompilerIDByName(_T("OpenWatcom (DOS) Compiler"))), _T("*"), true, true); + } + else if (wiz_type == wizTarget) + { + WizardType = 1; + local intro_msg = _T("Welcome to the new console build target wizard!\n" + + "This wizard will guide you to create a new console build target.\n\n" + + "When you 're ready to proceed, please click \"Next\"..."); + Wizard.AddInfoPage(_T("ConsoleIntro"), intro_msg); + Wizard.AddBuildTargetPage(_T(""), false, true, (GetCompilerFactory().GetCompilerIDByName(_T("OpenWatcom (DOS) Compiler"))), _T("*"), true); + } +} + + + + +function OnEnter_CompilerPage(forward) +{ + // we only care to initialize if going forward + if (forward) + { + // This is kind of a hack, but tries to suggest the best default compiler for given configuration + // Even if this function breaks, nothing terrible should happen + // ID_CHECKBOX1 = debug checkbox + + local i = 0; + for (i = 0; i < 99; i++) + { + Wizard.SetComboboxSelection( _T("ID_COMBOBOX1"), i ); + local currCompiler = Wizard.GetComboboxStringSelection( _T("ID_COMBOBOX1") ); + if (currCompiler == _T("OpenWatcom (DOS) Compiler")) i = 100; + Wizard.CheckCheckbox( _T("ID_CHECKBOX1") , false) // Disable debug, won't work anyway + } + + } +} + +function OnEnter_BuildTargetPage(forward) +{ + // we only care to initialize if going forward + if (forward) + { + // This is kind of a hack, but tries to suggest the best default compiler for given configuration + // Even if this function breaks, nothing terrible should happen + // ID_CHECKBOX1 = debug checkbox + + local i = 0; + for (i = 0; i < 99; i++) + { + Wizard.SetComboboxSelection( _T("ID_COMBOBOX1"), i ); + local currCompiler = Wizard.GetComboboxStringSelection( _T("ID_COMBOBOX1") ); + if (currCompiler == _T("OpenWatcom (DOS) Compiler")) i = 100; + //Wizard.CheckCheckbox( _T("ID_CHECKBOX1") , false) // Disable debug, won't work anyway + } + + } +} + + + + + + + + + + + + + + +//------------------------------------------------------------------------------ +// Function OnEnter_ConsoleLanguagePage +//------------------------------------------------------------------------------ +function OnEnter_ConsoleLanguagePage(fwd) +{ + Wizard.SetListboxSelection(_T("GenericChoiceList"), ConsoleLang); + return true; +} +//------------------------------------------------------------------------------ +// Function OnLeave_ConsoleLanguagePage +//------------------------------------------------------------------------------ +function OnLeave_ConsoleLanguagePage(fwd) +{ + if (fwd) + { + ConsoleLang = Wizard.GetListboxSelection(_T("GenericChoiceList")); + } + return true; +} + +// +//------------------------------------------------------------------------------ +// +function OnLeave_CompilerPage(fwd) +{ + if (fwd) + { + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvctk")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc8")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc10"))) + { + local msg = _T("Wizard will setup the Project in Multi-threaded Dynamic CRT mode by default.\n\n"); + msg = msg + _T("Click Yes to continue with Multi-threaded Dynamic CRT mode\n\n"); + msg = msg + _T("Click No to continue with Multi-threaded Static CRT mode"); + local thread = Message(msg, _T("Console Wizard"), wxICON_QUESTION | wxYES_NO); + if (thread == wxID_YES) + multi_thread_dynamic = true; + else + multi_thread_dynamic = false; + } + } + return true; +} +// +//------------------------------------------------------------------------------ +// +function GetFilesDir() +{ + local result; + + // depending on the source type setting, return the appropriate value. + if (ConsoleLang == 0) // C source file + result = _T("console/c"); + else // C++ source file + result = _T("console/cpp"); + + return result; +} +// +//------------------------------------------------------------------------------ +// +function SetupProject(project) +{ + + // NOTE: Major compiler system drawback here. + // Until it is redesigned to allow easier compiler settings, + // we have to check the compiler's ID and set options for different compilers... + // We make things easier for scripts, by providing a few predefined functions + // to setup common settings like "debug", "warnings", etc. + // These functions are located in /common_functions.script. + // If you add other commonly used functions or bug-fix anything in that file, + // please share it with us :) + + // enable compiler warnings (project-wide) + WarningsOn(project, Wizard.GetCompilerID()); + + /* + // add additional libs for special compilers + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerIDByName(), _T("bcc"))) + { + project.AddLinkLib(_T("cw32mt.lib")); + project.AddLinkLib(_T("import32.lib")); + } + */ + + // We setup the targets using SetupTarget() which is conveniently called by Code::Blocks + // if we register this wizard as wizTarget type :) + // This means that this very wizard can be used both as wizProject *and* as wizTarget ;) + + // Debug build target + local target = project.GetBuildTarget(Wizard.GetDebugName()); + if (!IsNull(target)) + SetupTarget(target, true); + + // Release build target + target = project.GetBuildTarget(Wizard.GetReleaseName()); + if (!IsNull(target)) + SetupTarget(target, false); + + //Add CPP Exception handling support + if (ConsoleLang == 1) + CppExceptionsOn(project, Wizard.GetCompilerID()); + // all done! + + // try to open sample file in the editor + local mainfile = ::wxString(); + + if (ConsoleLang==0) mainfile = _T("main.c"); + else mainfile = _T("main.cpp"); + + local ed = GetEditorManager().Open( Wizard.GetProjectPath() + Wizard.GetProjectName() + wxFILE_SEP_PATH + mainfile ); + + /* + if (IsNull(ed)) + ShowError(_T("Could not open: " + Wizard.GetProjectPath() + Wizard.GetProjectName() + wxFILE_SEP_PATH + mainfile )); + */ + + return true; +} +// +//------------------------------------------------------------------------------ +// +function SetupTarget(target,is_debug) +{ + + + if (IsNull(target)) + return false; + + + // if target wizard + if (WizardType == 1) + { + target.SetOptionRelation(ortCompilerOptions, orUseTargetOptionsOnly); + target.SetOptionRelation(ortLinkerOptions, orUseTargetOptionsOnly); + } + + + + // Post-build commands to prepare exe file without dependencies + local pb_exe2coff = ::wxString(); + local pb_copycw = ::wxString(); + local pb_deltemp = ::wxString(); + pb_exe2coff = _T("$(APPPATH)\\utils\\exe2coff.exe \"$(PROJECT_DIR)$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).exe\""); + pb_copycw = _T("cmd /C \"copy /B \"$(APPPATH)\\utils\\cwsdstub.exe\" + \"$(PROJECT_DIR)$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME)\" \"$(PROJECT_DIR)$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).exe\""); + pb_deltemp = _T("cmd /C \"del \"$(PROJECT_DIR)$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME)\"\""); + + // Post-build commands to run built exe in DOSbox + local pb_rundosbox = ::wxString(); + pb_rundosbox = _T("\"$(APPPATH)\\dosboxx\\dbxlauncher.bat\" \"$(PROJECT_DIR)$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).exe\""); + + // Add post-build commands to target + //target.AddCommandsAfterBuild(pb_exe2coff); + //target.AddCommandsAfterBuild(pb_copycw); + //target.AddCommandsAfterBuild(pb_deltemp); + target.AddCommandsAfterBuild(pb_rundosbox); + + // This will run all above on each build (prepare EXE and run test in DOSbox) + target.SetAlwaysRunPostBuildSteps(true); + + + + + + + target.SetTargetType(ttConsoleOnly); + // TODO (Biplab#9#): Wizard.GetProjectName() returns file extension when the wizard is of Target type. This bug needs to be fixed + local ProjectName = (WizardType == 0) ? Wizard.GetProjectName() : target.GetParentProject().GetTitle(); + + target.SetUseConsoleRunner(false); + + if (is_debug) + { + + + local TargetName = (WizardType == 0) ? Wizard.GetDebugOutputDir() : Wizard.GetTargetOutputDir(); + if (target.GetWorkingDir().Matches(_T(""))) + target.SetOutputFilename(target.SuggestOutputFilename()); + else + //target.SetOutputFilename(Wizard.GetDebugOutputDir() + Wizard.GetProjectName() + DOT_EXT_EXECUTABLE); + target.SetOutputFilename(TargetName + ProjectName + DOT_EXT_EXECUTABLE); + + // enable debugging symbols for this target + // DebugSymbolsOn(target, Wizard.GetTargetCompilerID()); // TODO: doesn't seem to work? + DebugSymbolsOn(target, Wizard.GetCompilerID()); + //Special consideration for MSVC 7.1 + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvctk")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc8")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc10"))) + { + if (!multi_thread_dynamic) + { + target.AddCompilerOption(_T("/MTd")); + target.AddLinkLib(_T("libcmtd.lib")); + target.AddLinkLib(_T("libcpmtd.lib")); + } + else + { + target.AddCompilerOption(_T("/MDd")); + target.AddLinkLib(_T("msvcrtd.lib")); + target.AddLinkLib(_T("msvcprtd.lib")); + } + } + + //target.AddLinkerOption(_T("form dos")); + target.AddCompilerOption(_T("-xs")); + target.AddCompilerOption(_T("-wx")); + target.AddCompilerOption(_T("-ms")); + target.AddCompilerOption(_T("-bt=dos")); + target.AddCompilerOption(_T("-bcl=dos")); + target.AddCompilerOption(_T("-0 -ms -ot")); + target.AddCompilerOption(_T("-ox")); + target.AddCompilerOption(_T("-ot")); + target.AddCompilerOption(_T("-d2")); + + + } + else + { + + + local TargetName = (WizardType == 0) ? Wizard.GetReleaseOutputDir() : Wizard.GetTargetOutputDir(); + if (target.GetWorkingDir().Matches(_T(""))) + target.SetOutputFilename(target.SuggestOutputFilename()); + else + //target.SetOutputFilename(TargetName + Wizard.GetProjectName() + DOT_EXT_EXECUTABLE); + target.SetOutputFilename(TargetName + ProjectName + DOT_EXT_EXECUTABLE); + + // enable optimizations for this target + // OptimizationsOn(target, Wizard.GetTargetCompilerID()); // TODO: doesn't seem to work? + OptimizationsOn(target, Wizard.GetCompilerID()); + //Special consideration for MSVC 7.1 + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvctk")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc8")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc10"))) + { + if (!multi_thread_dynamic) + { + target.AddCompilerOption(_T("/MT")); + target.AddLinkLib(_T("libcmt.lib")); + target.AddLinkLib(_T("libcpmt.lib")); + } + else + { + target.AddCompilerOption(_T("/MD")); + target.AddLinkLib(_T("msvcrt.lib")); + target.AddLinkLib(_T("msvcprt.lib")); + } + } + + //target.AddLinkerOption(_T("form dos")); + target.AddCompilerOption(_T("-xs")); + target.AddCompilerOption(_T("-wx")); + target.AddCompilerOption(_T("-ms")); + target.AddCompilerOption(_T("-bt=dos")); + target.AddCompilerOption(_T("-bcl=dos")); + target.AddCompilerOption(_T("-0 -ms -ot")); + target.AddCompilerOption(_T("-ox")); + target.AddCompilerOption(_T("-ot")); + target.AddCompilerOption(_T("-d2")); + + + } + + // all done! + return true; +} diff --git a/installers/wizard/wxwidgets/common/app.cpp b/installers/wizard/wxwidgets/common/app.cpp new file mode 100644 index 0000000..d9d7a2d --- /dev/null +++ b/installers/wizard/wxwidgets/common/app.cpp @@ -0,0 +1,32 @@ +/*************************************************************** + * Name: [FILENAME_PREFIX]App.cpp + * Purpose: Code for Application Class + * Author: [AUTHOR_NAME] ([AUTHOR_EMAIL]) + * Created: [NOW] + * Copyright: [AUTHOR_NAME] ([AUTHOR_WWW]) + * License: + **************************************************************/ + +#ifdef WX_PRECOMP +#include "wx_pch.h" +#endif + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif //__BORLANDC__ + +#include "[FILENAME_PREFIX]App.h" +#include "[FILENAME_PREFIX]Main.h" + +IMPLEMENT_APP([CLASS_PREFIX]App); + +bool [CLASS_PREFIX]App::OnInit() +{ + [IF WXFRAME][CLASS_PREFIX]Frame* frame = new [CLASS_PREFIX]Frame(0L[IF NONE], _("wxWidgets Application Template")[ENDIF NONE]); + [IF WINDOWS]frame->SetIcon(wxICON(aaaa)); // To Set App Icon[ENDIF WINDOWS] + frame->Show();[ENDIF WXFRAME] + [IF WXDIALOG][CLASS_PREFIX]Dialog* dlg = new [CLASS_PREFIX]Dialog(0L[IF NONE], _("wxWidgets Application Template")[ENDIF NONE]); + [IF WINDOWS]dlg->SetIcon(wxICON(aaaa)); // To Set App Icon[ENDIF WINDOWS] + dlg->Show();[ENDIF WXDIALOG] + return true; +} diff --git a/installers/wizard/wxwidgets/common/app.h b/installers/wizard/wxwidgets/common/app.h new file mode 100644 index 0000000..f8aea09 --- /dev/null +++ b/installers/wizard/wxwidgets/common/app.h @@ -0,0 +1,21 @@ +/*************************************************************** + * Name: [FILENAME_PREFIX]App.h + * Purpose: Defines Application Class + * Author: [AUTHOR_NAME] ([AUTHOR_EMAIL]) + * Created: [NOW] + * Copyright: [AUTHOR_NAME] ([AUTHOR_WWW]) + * License: + **************************************************************/ + +#ifndef [PROJECT_HDR]APP_H +#define [PROJECT_HDR]APP_H + +#include + +class [CLASS_PREFIX]App : public wxApp +{ + public: + virtual bool OnInit(); +}; + +#endif // [PROJECT_HDR]APP_H diff --git a/installers/wizard/wxwidgets/common/main.cpp b/installers/wizard/wxwidgets/common/main.cpp new file mode 100644 index 0000000..b99fd10 --- /dev/null +++ b/installers/wizard/wxwidgets/common/main.cpp @@ -0,0 +1,158 @@ +/*************************************************************** + * Name: [FILENAME_PREFIX]Main.cpp + * Purpose: Code for Application Frame + * Author: [AUTHOR_NAME] ([AUTHOR_EMAIL]) + * Created: [NOW] + * Copyright: [AUTHOR_NAME] ([AUTHOR_WWW]) + * License: + **************************************************************/ + +#ifdef WX_PRECOMP +#include "wx_pch.h" +#endif + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif //__BORLANDC__ + +#include "[FILENAME_PREFIX]Main.h" + +//helper functions +enum wxbuildinfoformat { + short_f, long_f }; + +wxString wxbuildinfo(wxbuildinfoformat format) +{ + wxString wxbuild(wxVERSION_STRING); + + if (format == long_f ) + { +#if defined(__WXMSW__) + wxbuild << _T("-Windows"); +#elif defined(__WXMAC__) + wxbuild << _T("-Mac"); +#elif defined(__UNIX__) + wxbuild << _T("-Linux"); +#endif + +#if wxUSE_UNICODE + wxbuild << _T("-Unicode build"); +#else + wxbuild << _T("-ANSI build"); +#endif // wxUSE_UNICODE + } + + return wxbuild; +} + +[IF WXFRAME][IF NONE]BEGIN_EVENT_TABLE([CLASS_PREFIX]Frame, wxFrame) + EVT_CLOSE([CLASS_PREFIX]Frame::OnClose) + EVT_MENU(idMenuQuit, [CLASS_PREFIX]Frame::OnQuit) + EVT_MENU(idMenuAbout, [CLASS_PREFIX]Frame::OnAbout) +END_EVENT_TABLE() + +[CLASS_PREFIX]Frame::[CLASS_PREFIX]Frame(wxFrame *frame, const wxString& title) + : wxFrame(frame, -1, title) +{ +#if wxUSE_MENUS + // create a menu bar + wxMenuBar* mbar = new wxMenuBar(); + wxMenu* fileMenu = new wxMenu(_T("")); + fileMenu->Append(idMenuQuit, _("&Quit\tAlt-F4"), _("Quit the application")); + mbar->Append(fileMenu, _("&File")); + + wxMenu* helpMenu = new wxMenu(_T("")); + helpMenu->Append(idMenuAbout, _("&About\tF1"), _("Show info about this application")); + mbar->Append(helpMenu, _("&Help")); + + SetMenuBar(mbar); +#endif // wxUSE_MENUS + +#if wxUSE_STATUSBAR + // create a status bar with some information about the used wxWidgets version + CreateStatusBar(2); + SetStatusText(_("Hello Code::Blocks user!"),0); + SetStatusText(wxbuildinfo(short_f), 1); +#endif // wxUSE_STATUSBAR + +}[ENDIF NONE] +[IF WXFB][CLASS_PREFIX]Frame::[CLASS_PREFIX]Frame(wxFrame *frame) + : GUIFrame(frame) +{ +#if wxUSE_STATUSBAR + statusBar->SetStatusText(_("Hello Code::Blocks user!"), 0); + statusBar->SetStatusText(wxbuildinfo(short_f), 1); +#endif +}[ENDIF WXFB] + +[CLASS_PREFIX]Frame::~[CLASS_PREFIX]Frame() +{ +} + +void [CLASS_PREFIX]Frame::OnClose(wxCloseEvent &event) +{ + Destroy(); +} + +void [CLASS_PREFIX]Frame::OnQuit(wxCommandEvent &event) +{ + Destroy(); +} + +void [CLASS_PREFIX]Frame::OnAbout(wxCommandEvent &event) +{ + wxString msg = wxbuildinfo(long_f); + wxMessageBox(msg, _("Welcome to...")); +}[ENDIF WXFRAME] +[IF WXDIALOG][IF NONE]BEGIN_EVENT_TABLE([CLASS_PREFIX]Dialog, wxDialog) + EVT_CLOSE([CLASS_PREFIX]Dialog::OnClose) + EVT_BUTTON(idBtnQuit, [CLASS_PREFIX]Dialog::OnQuit) + EVT_BUTTON(idBtnAbout, [CLASS_PREFIX]Dialog::OnAbout) +END_EVENT_TABLE() + +[CLASS_PREFIX]Dialog::[CLASS_PREFIX]Dialog(wxDialog *dlg, const wxString &title) + : wxDialog(dlg, -1, title) +{ + this->SetSizeHints(wxDefaultSize, wxDefaultSize); + wxBoxSizer* bSizer1; + bSizer1 = new wxBoxSizer(wxHORIZONTAL); + m_staticText1 = new wxStaticText(this, wxID_ANY, wxT("Welcome To\nwxWidgets"), wxDefaultPosition, wxDefaultSize, 0); + m_staticText1->SetFont(wxFont(20, 74, 90, 90, false, wxT("Arial"))); + bSizer1->Add(m_staticText1, 0, wxALL|wxEXPAND, 5); + wxBoxSizer* bSizer2; + bSizer2 = new wxBoxSizer(wxVERTICAL); + BtnAbout = new wxButton(this, idBtnAbout, wxT("&About"), wxDefaultPosition, wxDefaultSize, 0); + bSizer2->Add(BtnAbout, 0, wxALL, 5); + m_staticline1 = new wxStaticLine(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL); + bSizer2->Add(m_staticline1, 0, wxALL|wxEXPAND, 5); + BtnQuit = new wxButton(this, idBtnQuit, wxT("&Quit"), wxDefaultPosition, wxDefaultSize, 0); + bSizer2->Add(BtnQuit, 0, wxALL, 5); + bSizer1->Add(bSizer2, 1, wxEXPAND, 5); + this->SetSizer(bSizer1); + this->Layout(); + bSizer1->Fit(this); +}[ENDIF NONE] +[IF WXFB][CLASS_PREFIX]Dialog::[CLASS_PREFIX]Dialog(wxDialog *dlg) + : GUIDialog(dlg) +{ +}[ENDIF WXFB] + +[CLASS_PREFIX]Dialog::~[CLASS_PREFIX]Dialog() +{ +} + +void [CLASS_PREFIX]Dialog::OnClose(wxCloseEvent &event) +{ + Destroy(); +} + +void [CLASS_PREFIX]Dialog::OnQuit(wxCommandEvent &event) +{ + Destroy(); +} + +void [CLASS_PREFIX]Dialog::OnAbout(wxCommandEvent &event) +{ + wxString msg = wxbuildinfo(long_f); + wxMessageBox(msg, _("Welcome to...")); +}[ENDIF WXDIALOG] diff --git a/installers/wizard/wxwidgets/common/main.h b/installers/wizard/wxwidgets/common/main.h new file mode 100644 index 0000000..dbd8ad0 --- /dev/null +++ b/installers/wizard/wxwidgets/common/main.h @@ -0,0 +1,84 @@ +/*************************************************************** + * Name: [FILENAME_PREFIX]Main.h + * Purpose: Defines Application Frame + * Author: [AUTHOR_NAME] ([AUTHOR_EMAIL]) + * Created: [NOW] + * Copyright: [AUTHOR_NAME] ([AUTHOR_WWW]) + * License: + **************************************************************/ + +#ifndef [PROJECT_HDR]MAIN_H +#define [PROJECT_HDR]MAIN_H + +[IF NONE]#ifndef WX_PRECOMP + #include +#endif[ENDIF NONE] + +#include "[FILENAME_PREFIX]App.h" + +[IF WXFRAME][IF NONE]class [CLASS_PREFIX]Frame: public wxFrame +{ + public: + [CLASS_PREFIX]Frame(wxFrame *frame, const wxString& title); + ~[CLASS_PREFIX]Frame(); + private: + enum + { + idMenuQuit = 1000, + idMenuAbout + }; + void OnClose(wxCloseEvent& event); + void OnQuit(wxCommandEvent& event); + void OnAbout(wxCommandEvent& event); + DECLARE_EVENT_TABLE() +};[ENDIF NONE] +[IF WXFB]#include "GUIFrame.h" + +class [CLASS_PREFIX]Frame: public GUIFrame +{ + public: + [CLASS_PREFIX]Frame(wxFrame *frame); + ~[CLASS_PREFIX]Frame(); + private: + virtual void OnClose(wxCloseEvent& event); + virtual void OnQuit(wxCommandEvent& event); + virtual void OnAbout(wxCommandEvent& event); +};[ENDIF WXFB][ENDIF WXFRAME] +[IF WXDIALOG][IF NONE]#include +#include +class [CLASS_PREFIX]Dialog: public wxDialog +{ + public: + [CLASS_PREFIX]Dialog(wxDialog *dlg, const wxString& title); + ~[CLASS_PREFIX]Dialog(); + + protected: + enum + { + idBtnQuit = 1000, + idBtnAbout + }; + wxStaticText* m_staticText1; + wxButton* BtnAbout; + wxStaticLine* m_staticline1; + wxButton* BtnQuit; + + private: + void OnClose(wxCloseEvent& event); + void OnQuit(wxCommandEvent& event); + void OnAbout(wxCommandEvent& event); + DECLARE_EVENT_TABLE() +};[ENDIF NONE] +[IF WXFB]#include "GUIDialog.h" + +class [CLASS_PREFIX]Dialog: public GUIDialog +{ + public: + [CLASS_PREFIX]Dialog(wxDialog *dlg); + ~[CLASS_PREFIX]Dialog(); + private: + virtual void OnClose(wxCloseEvent& event); + virtual void OnQuit(wxCommandEvent& event); + virtual void OnAbout(wxCommandEvent& event); +};[ENDIF WXFB][ENDIF WXDIALOG] +#endif // [PROJECT_HDR]MAIN_H diff --git a/installers/wizard/wxwidgets/logo.png b/installers/wizard/wxwidgets/logo.png new file mode 100644 index 0000000..9ed82ec Binary files /dev/null and b/installers/wizard/wxwidgets/logo.png differ diff --git a/installers/wizard/wxwidgets/pch/wx_pch.h b/installers/wizard/wxwidgets/pch/wx_pch.h new file mode 100644 index 0000000..61dd3fc --- /dev/null +++ b/installers/wizard/wxwidgets/pch/wx_pch.h @@ -0,0 +1,28 @@ +/*************************************************************** + * Name: wx_pch.h + * Purpose: Header to create Pre-Compiled Header (PCH) + * Author: [AUTHOR_NAME] ([AUTHOR_EMAIL]) + * Created: [NOW] + * Copyright: [AUTHOR_NAME] ([AUTHOR_WWW]) + * License: + **************************************************************/ + +#ifndef WX_PCH_H_INCLUDED +#define WX_PCH_H_INCLUDED + +// basic wxWidgets headers +#include + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include +#endif + +#ifdef WX_PRECOMP + // put here all your rarely-changing header files +#endif // WX_PRECOMP + +#endif // WX_PCH_H_INCLUDED diff --git a/installers/wizard/wxwidgets/rc/resource.rc b/installers/wizard/wxwidgets/rc/resource.rc new file mode 100644 index 0000000..553c482 --- /dev/null +++ b/installers/wizard/wxwidgets/rc/resource.rc @@ -0,0 +1,3 @@ +aaaa ICON "wx/msw/std.ico" + +#include "wx/msw/wx.rc" diff --git a/installers/wizard/wxwidgets/wizard.png b/installers/wizard/wxwidgets/wizard.png new file mode 100644 index 0000000..ad3309e Binary files /dev/null and b/installers/wizard/wxwidgets/wizard.png differ diff --git a/installers/wizard/wxwidgets/wizard.script b/installers/wizard/wxwidgets/wizard.script new file mode 100644 index 0000000..9742dc8 --- /dev/null +++ b/installers/wizard/wxwidgets/wizard.script @@ -0,0 +1,2140 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// wxWidgets project wizard +// +//////////////////////////////////////////////////////////////////////////////// + +// globals + +UseOnlyTargetSettingsEverywhere <- true; +ExecuteInVM <- 0; // 0 = nothing, 1 = execute in Win 3.11 in DOSBox, 2 = execute in Win 95 in DOSBox-X + +WizType <- wizProject; +WxPath <- _T(""); +WantPCH <- false; +IsDLL <- false; +IsMonolithic <- true; +IsUnicode <- true; +IsAdvOpt <- false; +IsEmpty <- false; // For empty projects +IsPartialDebug <- false; // For debug linking against release libraries +Configuration <- _T(""); +LibPath <- _T(""); +LibPrefix <- _T(""); // Prefix of lib name +LibWxVer <- _T(""); // Determines wx version +LibUnicSuffix <- _T(""); // Suffix for Unicode +LibDebugSuffix <- _T("d"); // Suffix for Debug wx Lib +LibSuffix <- _T(""); // Suffix for Lib, defines file extension +LibWxXML <- false; // XML Lib +LibWxXRC <- false; // XRC Lib +LibWxAdvanced <- false; //Advanced Lib +LibWxAUI <- false; // AUI Lib +LibWxHTML <- false; // HTML Lib +LibWxMedia <- false; // Media Lib +LibWxNet <- false; // Net Lib +LibWxGL <- false; // OpenGL Lib +LibWxQA <- false; // QA Lib +LibWxRichText <- false; // RichText Lib +LibWxWebView <- false; // WebView Lib +LibWxSTC <- false; // STC Lib +LibWxPropertyGrid <- false; // PropertyGrid Lib +LibWxRibbon <- false; // Ribbon Lib +LibWxLinkWinSock2 <- false; // On Windows, link with WinSock2 instead of WinSock +WxVersion <- 0; // 0 - wx 2.8, 1 - wx 3.0, 2 - wx 3.1, 3 - wx 3.2 +DebugTarget <- 1; // Target Type; 0 - Console, 1 - GUI +ReleaseTarget <- 1; // Target Type; 0 - Console, 1 - GUI +FileName <- _T(""); // Filename for wizard +ProjAuthor <- _T(""); // Project Author +ProjEmail <- _T(""); // Author's e-mail +ProjWebsite <- _T(""); // Project website +PCHFileName <- _T("wx_pch.h"); // PCH filename +ChoiceWxUnixLib <- 0; // wx lib choice in Unix; 0 for default, 1 for advanced +ChkWxDebug <- true; // Adds wxdebug and debug wx lib. By default it's set to True +GuiBuilder <- 1; // Default to None. 0-None, 1-wxSmith, 2-wxFormBuilder +GuiAppType <- 2; // Default to Dialog. 0-Dialog, 1-Frame, 2-Frame with sample elements +AddlLibList <- _T(""); // Contains the complete list +multi_thread_dynamic <- true; //Default to Multi-thread. For MSVC only. + + +function BeginWizard() +{ + local wxpath_msg = _T("Please select the location of wxWidgets on your computer.\n" + + "This is the top-level folder where wxWidgets was unpacked.\n" + + "To help you, this folder must contain the subfolders\n" + + "\"include\" and \"lib\".\n\n" + + "You can also use a global variable, f.e. $(#wx)\n"); + + WizType = Wizard.GetWizardType(); + + if (WizType == wizProject) + { + local intro_msg = _T("Welcome to the wxWidgets project wizard!\n\n" + + "This wizard will guide you to create a new project using\n" + + "the wxWidgets cross-platform GUI library.\n\n" + + "When you 're ready to proceed, please click \"Next\"..."); + + Wizard.AddInfoPage(_T("WxIntro"), intro_msg); + Wizard.AddGenericSingleChoiceListPage(_T("wxVersionPage"), + _T("Please select the wxWidgets version you want to use.\n\n" + + "2.8 will work with Win 3.11, 3.0 will work with Win 95+,\n" + + "3.2 is intended for modern 64-bit systems."), + _T("wxWidgets 2.8.x;wxWidgets 3.0.x;wxWidgets 3.1.x;wxWidgets 3.2.x"), + WxVersion); // select wxwidgets version + + + Wizard.AddGenericSingleChoiceListPage(_T("ExecuteInVMPage"), + _T("Select if you want to run built programs in host operating\nsystem (default) " + + "or in emulated machine. Emulation\nis intended only for legacy software development.\n" + + "To start emulation click Build in Release target.\n\n" + + "Win 3.11 will only work with BCC and wx 2.8 non-Unicode.\n\n" + + "Win 95 will work with wx 2.8 and 3.x. Unicode will not work\nunless you use MSLU/Unicows." + + "\n\nThese options will work only if you configured DOSBox(-X)\n" + +"with your own licensed copies of these systems."), + _T("Execute normally (in host OS);Execute in Win 3.11 (DOSBox);Execute in Win 95 (DOSBox-X)"), + ExecuteInVM); // select if built executables should be ran in VM + + + + + + Wizard.AddProjectPathPage(); + Wizard.AddPage(_T("WxProjDetails")); + Wizard.AddPage(_T("WxGuiSelect")); + + /* + if (PLATFORM == PLATFORM_MSW) + Wizard.AddGenericSelectPathPage(_T("WxPath"), wxpath_msg, _T("wxWidgets' location:"), _T("$(#wx)")); + */ + + // we need the compiler selection before wx settings, because we 'll have + // to validate the settings. To do this we must know the compiler beforehand... + + + Wizard.AddCompilerPage( _T(""), _T("*"), true, true); + + /* + local compilerList = GetCompilerFactory().GetCompilerIDByName(_T("Borland C++ Compiler (5.5, 5.82)")) + + _T(";") + GetCompilerFactory().GetCompilerIDByName(_T("TDM-GCC 4.7.1 32bit")); + + Wizard.AddCompilerPage(_T(""), compilerList + _T(";gcc*") , true, true); + */ + + + if (PLATFORM == PLATFORM_MSW) + Wizard.AddPage(_T("WxConf")); // only for windows + else + Wizard.AddPage(_T("WxConfUnix")); // just PCH option + if (PLATFORM == PLATFORM_MSW) + { + Wizard.AddPage(_T("WxConfAdvOpt")); // Wizard page to select target type + Wizard.AddPage(_T("WxAddLib")); // Add additional wx libraries + Wizard.AddPage(_T("WxAddLibMono")); // libraries options for monolithic build + } + } + else if (WizType == wizTarget) + { + local intro_msg = _T("Welcome to the wxWidgets Target wizard!\n\n" + + "This wizard will guide you to create a new target\n" + + "When you 're ready to proceed, please click \"Next\"..."); + + Wizard.AddInfoPage(_T("WxIntro"), intro_msg); + Wizard.AddGenericSingleChoiceListPage(_T("wxVersionPage"), + _T("Please select the wxWidgets version you want to use."), + _T("wxWidgets 2.8.x;wxWidgets 3.0.x;wxWidgets 3.1.x;wxWidgets 3.2.x"), + WxVersion); // select wxwidgets version + + Wizard.AddGenericSingleChoiceListPage(_T("ExecuteInVMPage"), + _T("Select if you want to run built programs in host operating\nsystem (default) " + + "or in emulated machine. Emulation\nis intended only for legacy software development.\n" + + "To start emulation click Build in Release target.\n\n" + + "Win 3.11 will only work with BCC and wx 2.8 non-Unicode.\n\n" + + "Win 95 will work with wx 2.8 and 3.x. Unicode will not work\nunless you use MSLU/Unicows." + + "\n\nThese options will work only if you configured DOSBox(-X)\n" + +"with your own licensed copies of these systems."), + _T("Execute normally (in host OS);Execute in Win 3.11 (DOSBox);Execute in Win 95 (DOSBox-X)"), + ExecuteInVM); // select if built executables should be ran in VM + + + /* + if (PLATFORM == PLATFORM_MSW) + Wizard.AddGenericSelectPathPage(_T("WxPath"), wxpath_msg, _T("wxWidgets' location:"), _T("$(#wx)")); + */ + + // we need the compiler selection before wx settings, because we 'll have + // to validate the settings. To do this we must know the compiler beforehand... + Wizard.AddBuildTargetPage(_T(""), false, true, _T(""), _T("*"), true); + if (PLATFORM == PLATFORM_MSW) + Wizard.AddPage(_T("WxConf")); // only for windows + else + Wizard.AddPage(_T("WxConfUnix")); // just PCH option + if (PLATFORM == PLATFORM_MSW) + { + Wizard.AddPage(_T("WxConfAdvOpt")); // Wizard page to select target type + Wizard.AddPage(_T("WxAddLib")); // Add additional wx libraries + Wizard.AddPage(_T("WxAddLibMono")); // libraries options for monolithic build + } + } +} + + + +function OnEnter_CompilerPage(forward) +{ + // we only care to initialize if going forward + if (forward) + { + // This is kind of a hack, but tries to suggest the best default compiler for given configuration + // Even if this function breaks, nothing terrible should happen + // ID_CHECKBOX1 = debug checkbox + + if (ExecuteInVM == 1 && WxVersion < 2) + { + local i = 0; + for (i = 0; i < 99; i++) + { + Wizard.SetComboboxSelection( _T("ID_COMBOBOX1"), i ); + local currCompiler = Wizard.GetComboboxStringSelection( _T("ID_COMBOBOX1") ); + if (currCompiler == _T("Borland C++ Compiler (5.5, 5.82)")) i = 100; + Wizard.CheckCheckbox( _T("ID_CHECKBOX1") , false) // Disable debug, won't work anyway + } + } + if (ExecuteInVM != 1 || WxVersion > 0) + { + local i = 0; + for (i = 0; i < 99; i++) + { + Wizard.SetComboboxSelection( _T("ID_COMBOBOX1"), i ); + local currCompiler = Wizard.GetComboboxStringSelection( _T("ID_COMBOBOX1") ); + if (currCompiler == _T("TDM-GCC 4.7.1 32bit")) i = 100; + Wizard.CheckCheckbox( _T("ID_CHECKBOX1") , true) // Enable debug by default + } + } + if (WxVersion > 1) + { + local i = 0; + for (i = 0; i < 99; i++) + { + Wizard.SetComboboxSelection( _T("ID_COMBOBOX1"), i ); + local currCompiler = Wizard.GetComboboxStringSelection( _T("ID_COMBOBOX1") ); + if (currCompiler == _T("MinGW-W64 8.1.0 64bit")) i = 100; + Wizard.CheckCheckbox( _T("ID_CHECKBOX1") , true) // Enable debug by default + } + } + + } +} + +function OnEnter_BuildTargetPage(forward) +{ + // we only care to initialize if going forward + if (forward) + { + // This is kind of a hack, but tries to suggest the best default compiler for given configuration + // Even if this function breaks, nothing terrible should happen + // ID_CHECKBOX1 = debug checkbox + + if (ExecuteInVM == 1 && WxVersion < 2) + { + local i = 0; + for (i = 0; i < 99; i++) + { + Wizard.SetComboboxSelection( _T("ID_COMBOBOX1"), i ); + local currCompiler = Wizard.GetComboboxStringSelection( _T("ID_COMBOBOX1") ); + if (currCompiler == _T("Borland C++ Compiler (5.5, 5.82)")) i = 100; + //Wizard.CheckCheckbox( _T("ID_CHECKBOX1") , false) // Disable debug, won't work anyway + } + } + if (ExecuteInVM != 1 || WxVersion > 0) + { + local i = 0; + for (i = 0; i < 99; i++) + { + Wizard.SetComboboxSelection( _T("ID_COMBOBOX1"), i ); + local currCompiler = Wizard.GetComboboxStringSelection( _T("ID_COMBOBOX1") ); + if (currCompiler == _T("TDM-GCC 4.7.1 32bit")) i = 100; + //Wizard.CheckCheckbox( _T("ID_CHECKBOX1") , true) // Enable debug by default + } + } + if (WxVersion > 1) + { + local i = 0; + for (i = 0; i < 99; i++) + { + Wizard.SetComboboxSelection( _T("ID_COMBOBOX1"), i ); + local currCompiler = Wizard.GetComboboxStringSelection( _T("ID_COMBOBOX1") ); + if (currCompiler == _T("MinGW-W64 8.1.0 64bit")) i = 100; + Wizard.CheckCheckbox( _T("ID_CHECKBOX1") , true) // Enable debug by default + } + } + + } +} + + + +//////////////////////////////////////////////////////////////////////////////// +// wxWidgets' version page +//////////////////////////////////////////////////////////////////////////////// + +function OnEnter_wxVersionPage(fwd) +{ + if (fwd) + { + WxVersion = Wizard.GetListboxSelection(_T("GenericChoiceList")); + + local lib_wxver; + if (WxVersion == 0) + lib_wxver = _T("28"); + else if (WxVersion == 1) + lib_wxver = _T("30"); + else if (WxVersion == 2) + lib_wxver = _T("31"); + else if (WxVersion == 3) + lib_wxver = _T("32"); + + if (WxVersion == 1) Wizard.AddCompilerPage( (GetCompilerFactory().GetCompilerIDByName(_T("DJGPP"))) , _T("*"), true, true); + + + WxPath = _T("$(#wx" + lib_wxver + ")"); + } + return true; +} + +function OnLeave_wxVersionPage(fwd) +{ + if (fwd) + { + WxVersion = Wizard.GetListboxSelection(_T("GenericChoiceList")); + + local lib_wxver; + if (WxVersion == 0) + lib_wxver = _T("28"); + else if (WxVersion == 1) + lib_wxver = _T("30"); + else if (WxVersion == 2) + lib_wxver = _T("31"); + else if (WxVersion == 3) + lib_wxver = _T("32"); + + WxPath = _T("$(#wx" + lib_wxver + ")"); + } + return true; +} + + + +//////////////////////////////////////////////////////////////////////////////// +// wxWidgets' version page +//////////////////////////////////////////////////////////////////////////////// + +function OnEnter_ExecuteInVMPage(fwd) +{ + if (fwd) + { + ExecuteInVM = Wizard.GetListboxSelection(_T("GenericChoiceList")); + } + return true; +} + +function OnLeave_ExecuteInVMPage(fwd) +{ + if (fwd) + { + ExecuteInVM = Wizard.GetListboxSelection(_T("GenericChoiceList")); + } + return true; +} + + + +//////////////////////////////////////////////////////////////////////////////// +// Project Details +//////////////////////////////////////////////////////////////////////////////// + +function OnEnter_WxProjDetails(fwd) +{ + if (fwd) + { + local configManager = GetConfigManager(); + Wizard.SetTextControlValue(_T("txtProjAuthor"), configManager.Read(_T("/wx_project_wizard/author"), _T(""))); + Wizard.SetTextControlValue(_T("txtProjEmail"), configManager.Read(_T("/wx_project_wizard/email"), _T(""))); + Wizard.SetTextControlValue(_T("txtProjWebsite"), configManager.Read(_T("/wx_project_wizard/website"), _T(""))); + } + return true; +} + +function OnLeave_WxProjDetails(fwd) +{ + if (fwd) + { + ProjAuthor = Wizard.GetTextControlValue(_T("txtProjAuthor")); + ProjEmail = Wizard.GetTextControlValue(_T("txtProjEmail")); + ProjWebsite = Wizard.GetTextControlValue(_T("txtProjWebsite")); + } + + local configManager = GetConfigManager(); + configManager.Write(_T("/wx_project_wizard/author"), ProjAuthor); + configManager.Write(_T("/wx_project_wizard/email"), ProjEmail); + configManager.Write(_T("/wx_project_wizard/website"), ProjWebsite); + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +// Project GUI Builder Details +//////////////////////////////////////////////////////////////////////////////// + +function OnEnter_WxGuiSelect(fwd) +{ + if (fwd) + { + local configManager = GetConfigManager(); + //GuiBuilder = configManager.Read(_T("/wx_project_wizard/guibuilder"), 0); + GuiBuilder = 1; + GuiAppType = configManager.Read(_T("/wx_project_wizard/guiapptype"), 0); + + Wizard.SetRadioboxSelection(_T("RB_GUISelect"), GuiBuilder); + Wizard.SetRadioboxSelection(_T("RB_GUIAppType"), GuiAppType); + } + return true; +} + +function OnLeave_WxGuiSelect(fwd) +{ + if (fwd) + { + GuiBuilder = Wizard.GetRadioboxSelection(_T("RB_GUISelect")); + GuiAppType = Wizard.GetRadioboxSelection(_T("RB_GUIAppType")); + if ( GuiBuilder==1 ) + { + if ( !("WxsAddWxExtensions" in getroottable()) ) + { + ShowInfo(_T("wxSmith plugin is not loaded, can't continue")); + return false; + } + } + + local configManager = GetConfigManager(); + configManager.Write(_T("/wx_project_wizard/guibuilder"), GuiBuilder); + configManager.Write(_T("/wx_project_wizard/guiapptype"), GuiAppType); + } + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +// wxWidgets' path page +//////////////////////////////////////////////////////////////////////////////// + +function OnLeave_WxPath(fwd) +{ + if (fwd) + { + local dir = Wizard.GetTextControlValue(_T("txtFolder")); + local dir_nomacro = ReplaceMacros(dir); + if (!IO.FileExists(dir_nomacro + _T("/include/wx/wx.h"))) + { + ShowError(_T("The path you entered seems valid, but this wizard " + + "can't locate wxWidgets' files in it...")); + return false; + } + + WxPath = dir; + } + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +// wxWidgets' settings +//////////////////////////////////////////////////////////////////////////////// + +function OnEnter_WxConf(fwd) +{ + if (fwd) + { + local configManager = GetConfigManager(); + Wizard.CheckCheckbox(_T("chkWxConfDLL"), IntToBool(configManager.Read(_T("/wx_project_wizard/dll"), 0))); + + //Wizard.CheckCheckbox(_T("chkWxConfMono"), IntToBool(configManager.Read(_T("/wx_project_wizard/monolithic"), 0))); + Wizard.CheckCheckbox(_T("chkWxConfMono"), true); + + + //Wizard.CheckCheckbox(_T("chkWxConfUni"), IntToBool(configManager.Read(_T("/wx_project_wizard/unicode"), 1))); + + // default to Unicode for wx 3.0 or newer + if (WxVersion >= 1) + { + Wizard.CheckCheckbox(_T("chkWxConfUni"), true); + } + else Wizard.CheckCheckbox(_T("chkWxConfUni"), false); + + + Wizard.CheckCheckbox(_T("chkWxConfAdvOpt"), IntToBool(configManager.Read(_T("/wx_project_wizard/debug"), 0))); + Wizard.CheckCheckbox(_T("chkWxConfPCH"), IntToBool(configManager.Read(_T("/wx_project_wizard/pch"), 0))); + Wizard.SetTextControlValue(_T("txtWxConfConfig"), configManager.Read(_T("/wx_project_wizard/configuration"), _T(""))); + } + return true; +} + +function OnLeave_WxConf(fwd) +{ + if (fwd) + { + IsDLL = Wizard.IsCheckboxChecked(_T("chkWxConfDLL")); + IsMonolithic = Wizard.IsCheckboxChecked(_T("chkWxConfMono")); + IsUnicode = Wizard.IsCheckboxChecked(_T("chkWxConfUni")); + IsEmpty = Wizard.IsCheckboxChecked(_T("chkWxEmpty")); + IsAdvOpt = Wizard.IsCheckboxChecked(_T("chkWxConfAdvOpt")); + WantPCH = Wizard.IsCheckboxChecked(_T("chkWxConfPCH")); + Configuration = Wizard.GetTextControlValue(_T("txtWxConfConfig")); + + // Ask the user whether wizard shall add PCH support when empty Project is selected + if (IsEmpty && WantPCH) + { + local msg = _T("You have selected PCH support for Empty project.\n\n"); + msg = msg + _T("Wizard will add support for PCH assuming the PCH header name as wx_pch.h\n\n"); + msg = msg + _T("Click Yes to accept default settings\n\nClick No to Enter PCH header manually"); + local return_val = Message(msg, _T("wxWidgets Project Wizard"), wxICON_QUESTION | wxYES_NO); + if (return_val == wxID_NO) + { + msg = _T("Please enter PCH header file name"); + PCHFileName = wxGetTextFromUser(msg, _T("wxWidgets Wizard"), _T("wxprec.h")); + if (PCHFileName.IsEmpty()) // Check for empty string + PCHFileName = _T("wx_pch.h"); + } + else if (return_val == wxID_YES) + PCHFileName = _T("wx_pch.h"); + } + else // Set PCHFileName to Default + PCHFileName = _T("wx_pch.h"); + + // Now write the configurations + local configManager = GetConfigManager(); + configManager.Write(_T("/wx_project_wizard/dll"), BoolToInt(IsDLL)); + configManager.Write(_T("/wx_project_wizard/monolithic"), BoolToInt(IsMonolithic)); + configManager.Write(_T("/wx_project_wizard/unicode"), BoolToInt(IsUnicode)); + configManager.Write(_T("/wx_project_wizard/debug"), BoolToInt(IsAdvOpt)); + configManager.Write(_T("/wx_project_wizard/pch"), BoolToInt(WantPCH)); + + // validate settings + local lib_prefix; + local lib_wxver; + local lib_unic_suffix; + local lib_suffix; + local lib = WxPath + _T("/lib/"); + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("gcc*"))) + { + lib = lib + _T("gcc_"); + lib_prefix = _T("lib"); + lib_suffix = _T(".a"); + } + else if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc*"))) + { + lib = lib + _T("vc_"); + lib_prefix = _T(""); + lib_suffix = _T(".lib"); + } + else if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("bcc*"))) + { + lib = lib + _T("bcc_"); + lib_prefix = _T(""); + lib_suffix = _T(".lib"); + } + else if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("ow"))) + { + lib = lib + _T("wat_"); + lib_prefix = _T(""); + lib_suffix = _T(".lib"); + } + + + if (IsDLL) + lib = lib + _T("dll"); + else + lib = lib + _T("lib"); + + lib = lib + Configuration; + + // at this point we have the full path to the link libraries + LibPath = lib; + + lib = lib + _T("/"); + + local lib_name = lib_prefix; + + if (IsUnicode) + lib_unic_suffix = _T("u"); + else + lib_unic_suffix = _T(""); + + if (WxVersion == 0) + lib_wxver = _T("28"); + else if (WxVersion == 1) + lib_wxver = _T("30"); + else if (WxVersion == 2) + lib_wxver = _T("31"); + else if (WxVersion == 3) + lib_wxver = _T("32"); + + // Now set the global variables + LibPrefix = lib_prefix; // Prefix of lib name + LibWxVer <- lib_wxver; // Determines wx version + LibUnicSuffix <- lib_unic_suffix; // Suffix for Unicode + LibSuffix <- lib_suffix; // Suffix for Lib, defines file extension + + // we can finally check for existence :) + local lib_deb_name = _T(""); + local lib_rel_name = _T(""); + if (IsMonolithic) + { + lib_deb_name = LibPrefix + _T("wxmsw") + LibWxVer + LibUnicSuffix + _T("d") + LibSuffix; + lib_rel_name = LibPrefix + _T("wxmsw") + LibWxVer + LibUnicSuffix + LibSuffix; + } + else /* Check for wxcore*/ + { + lib_deb_name = LibPrefix + _T("wxbase") + LibWxVer + LibUnicSuffix + _T("d") + LibSuffix; + lib_rel_name = LibPrefix + _T("wxbase") + LibWxVer + LibUnicSuffix + LibSuffix; + } + /* Check whether the libraries exist or not */ + if (WizType == wizProject) + { + local chk_debug = Wizard.GetWantDebug(); + local chk_release = Wizard.GetWantRelease(); + if (!IO.FileExists(LibPath + _T("/") + lib_deb_name) && (chk_debug == true)) + { + // alarm! + if (!IO.FileExists(LibPath + _T("/") + lib_rel_name)) + { + if (Message(_T("A matching Debug configuration cannot be found in the wxWidgets directory " + + "you specified.\n" + + "This means that Debug target of your project will not build.\n\n" + + "Are you sure you want to continue with these settings?"), + _T("Warning"), wxYES_NO) == wxID_NO) + { + return false; + } + } + else + { + if (Message(_T("A matching Debug configuration cannot be found in the wxWidgets directory " + + "you specified.\n" + + "Would you like to link this target against the release binaries instead?\n" + + "(Debugging the executable will still be possible.)"), + _T("Warning"), wxYES_NO) == wxID_YES) + { + IsPartialDebug = true; + } + else if (Message(_T("This means that Debug target of your project will not build.\n\n" + + "Are you sure you want to continue with these settings?"), + _T("Warning"), wxYES_NO) == wxID_NO) + { + return false; + } + } + } + if (!IO.FileExists(LibPath + _T("/") + lib_rel_name) && (chk_release == true)) + { + // alarm! + if (Message(_T("A matching Release configuration cannot be found in the wxWidgets directory " + + "you specified.\n" + + "This means that Release target of your project will not build.\n\n" + + "Are you sure you want to continue with these settings?"), + _T("Warning"), wxYES_NO) == wxID_NO) + { + return false; + } + } + } + else + { + local libname; + if (Wizard.GetTargetEnableDebug()) + libname = LibPath + _T("/") + lib_deb_name; + else + libname = LibPath + _T("/") + lib_rel_name; + if (!IO.FileExists(libname)) + { + if (Message(_T("A matching configuration cannot be found in the wxWidgets directory " + + "you specified.\n" + + "This means that this target of your project will not build.\n\n" + + "Are you sure you want to continue with these settings?"), + _T("Warning"), wxYES_NO) == wxID_NO) + { + return false; + } + } + } + + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvctk")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc8")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc10"))) + { + local msg = _T("Wizard will setup the Project in Multi-threaded Dynamic CRT mode by default.\n\n"); + msg = msg + _T("Click Yes to continue with Multi-threaded Dynamic CRT mode\n\n"); + msg = msg + _T("Click No to continue with Multi-threaded Static CRT mode"); + local thread = Message(msg, _T("wxWidgets Wizard"), wxICON_QUESTION | wxYES_NO); + if (thread == wxID_YES) + multi_thread_dynamic = true; + else + multi_thread_dynamic = false; + } + } + + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +// wxWidgets' settings (unix page) +//////////////////////////////////////////////////////////////////////////////// + +function OnEnter_WxConfUnix(fwd) +{ + if (fwd) + { + Wizard.SetRadioboxSelection(_T("m_radioBoxWxChoice"), ChoiceWxUnixLib); + local configManager = GetConfigManager(); + Wizard.CheckCheckbox(_T("chkWxConfSo"), IntToBool(configManager.Read(_T("/wx_project_wizard/dll"), 0))); + Wizard.CheckCheckbox(_T("chkWxConfUnicode"), IntToBool(configManager.Read(_T("/wx_project_wizard/unicode"), 0))); + Wizard.CheckCheckbox(_T("chkWxUnixConfPCH"), IntToBool(configManager.Read(_T("/wx_project_wizard/pch"), 0))); + + OnClick_m_radioBoxWxChoice(); + } + return true; +} + +function OnLeave_WxConfUnix(fwd) +{ + if (fwd) + { + ChoiceWxUnixLib = Wizard.GetRadioboxSelection(_T("m_radioBoxWxChoice")); + if (ChoiceWxUnixLib == 1) + { + IsDLL = Wizard.IsCheckboxChecked(_T("chkWxConfSo")); + IsUnicode = Wizard.IsCheckboxChecked(_T("chkWxConfUnicode")); + } + IsEmpty = Wizard.IsCheckboxChecked(_T("chkWxUnixEmpty")); // Checks option for Empty Project + WantPCH = Wizard.IsCheckboxChecked(_T("chkWxUnixConfPCH")); + + if (!GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("gcc*")) && WantPCH) + { + ShowWarning(_T("Precompiled headers currently only work for GNU GCC.\n" + + "They are disabled for all other compilers.")); + WantPCH = false; + } + + if (WxVersion == 0) + LibWxVer = _T("2.8"); + else if (WxVersion == 1) + LibWxVer = _T("3.0"); + else if (WxVersion == 2) + LibWxVer = _T("3.1"); + else if (WxVersion == 3) + LibWxVer = _T("3.2"); + + // Ask the user whether wizard shall add PCH support when empty Project is selected + if (IsEmpty && WantPCH) + { + local msg = _T("You have selected PCH support for Empty project.\n"); + msg = msg + _T("Wizard will NOT add PCH support as it can't be added without adding any file.\n\n"); + msg = msg + _T("Please add the PCH header later to Project"); + ShowInfo(msg); + WantPCH = false; // Sorry! Wizard can't add PCH support + } + PCHFileName = _T("wx_pch.h"); + + // Now write the setting to Configuration + local configManager = GetConfigManager(); + configManager.Write(_T("/wx_project_wizard/dll"), BoolToInt(IsDLL)); + configManager.Write(_T("/wx_project_wizard/unicode"), BoolToInt(IsUnicode)); + configManager.Write(_T("/wx_project_wizard/pch"), BoolToInt(WantPCH)); + } + return true; +} + +function OnClick_m_radioBoxWxChoice() +{ + ChoiceWxUnixLib = Wizard.GetRadioboxSelection(_T("m_radioBoxWxChoice")); + if (ChoiceWxUnixLib == 0) // Means default choice + { + Wizard.EnableWindow(_T("chkWxConfSo"), false); + Wizard.EnableWindow(_T("chkWxConfUnicode"), false); + } + else + { + Wizard.EnableWindow(_T("chkWxConfSo"), true); + Wizard.EnableWindow(_T("chkWxConfUnicode"), true); + } +} + +// ----------------------------------------------------------------------------- +// each time, return a string of the form "filename.ext;contents" +// you can change the return string based on +// return an empty string to denote that no more files are to be generated +function GetGeneratedFile(file_index) +{ + if (!IsEmpty) + { + local Prefix = GetFixedProjectName(Wizard.GetProjectName()); + if (file_index == 0) + return Prefix + _T("App.h") + _T(";") + GenerateHeader(file_index); + else if (file_index == 1) + return Prefix + _T("App.cpp") + _T(";") + GenerateSource(file_index); + else if (file_index == 2) + return Prefix + _T("Main.h") + _T(";") + GenerateHeader(file_index); + else if (file_index == 3) + return Prefix + _T("Main.cpp") + _T(";") + GenerateSource(file_index); + if (GuiBuilder == 1) + { + if (file_index == 4) + { + if (GuiAppType == 0) + return _T("wxsmith/") + Prefix + _T("dialog.wxs") + _T(";") + GenerateSource(file_index); + else + return _T("wxsmith/") + Prefix + _T("frame.wxs") + _T(";") + GenerateSource(file_index); + } + if (file_index == 5 && WantPCH) + return _T("wx_pch.h") + _T(";") + GenerateHeader(file_index); + } + else + { + if (file_index == 4 && WantPCH) + return _T("wx_pch.h") + _T(";") + GenerateHeader(file_index); + } + } + return _T(""); // no more generated files +} + +// return the files this project contains +function GetFilesDir() +{ + local result = _T(""); + if (!IsEmpty) // Checks whether user wants Empty Project or not + { + if (PLATFORM == PLATFORM_MSW) + result = _T("wxwidgets/rc;"); + if (GuiBuilder == 2) + { + if (GuiAppType == 0) + result = result + _T("wxwidgets/wxfb/dialog;"); + else if (GuiAppType > 0) + result = result + _T("wxwidgets/wxfb/frame;"); + } + } + return result; +} + +// setup the already created project +function SetupProject(project) +{ + local libdir; + + SetupAddlLibs(); + + // set project options + if (PLATFORM != PLATFORM_MSW) + { + if (ChoiceWxUnixLib == 0) + { + + if (!UseOnlyTargetSettingsEverywhere) + { + project.AddCompilerOption(_T("`wx-config --cflags`")); + project.AddLinkerOption(_T("`wx-config --libs`")); + } + + } + else + { + local target = project.GetBuildTarget(Wizard.GetDebugName()); + if (!IsNull(target)) + SetupTarget(target, true); + local target = project.GetBuildTarget(Wizard.GetReleaseName()); + if (!IsNull(target)) + SetupTarget(target, false); + } + + // Now enable PCH + if (WantPCH && GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("gcc*"))) + { + + if (!UseOnlyTargetSettingsEverywhere) + { + + local pchfile = project.GetFileByFilename(PCHFileName, true, true); + if (!IsNull(pchfile)) + { + pchfile.compile = true; + pchfile.link = false; + pchfile.weight = 0; + project.SetModeForPCH(pchSourceDir); // pch dir + project.AddCompilerOption(_T("-Winvalid-pch")); + project.AddCompilerOption(_T("-include ") + PCHFileName); + project.AddCompilerOption(_T("-DWX_PRECOMP")); + } + + } + } + } + else if (!UseOnlyTargetSettingsEverywhere) + { + + project.AddIncludeDir(WxPath + _T("/include")); + project.AddResourceIncludeDir(WxPath + _T("/include")); + libdir = LibPath + _T("/msw"); + if (IsUnicode) + libdir = libdir + _T("u"); + + /* Add standard and special compiler options and libraries */ + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc*"))) + { + project.AddCompilerOption(_T("/DWIN32")); + project.AddCompilerOption(_T("/D__WIN32__")); + project.AddCompilerOption(_T("/D__WXMSW__")); + if (IsDLL) + project.AddCompilerOption(_T("/DWXUSINGDLL")); + if (IsUnicode) + project.AddCompilerOption(_T("/DwxUSE_UNICODE")); + project.AddCompilerOption(_T("/D_WINDOWS")); + project.AddLinkerOption(_T("/INCREMENTAL:NO")); + } + else if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("gcc*"))) + { + project.AddCompilerOption(_T("-pipe")); + project.AddCompilerOption(_T("-mthreads")); + project.AddLinkerOption(_T("-mthreads")); + project.AddCompilerOption(_T("-D__GNUWIN32__")); + project.AddCompilerOption(_T("-D__WXMSW__")); + if (IsDLL) + project.AddCompilerOption(_T("-DWXUSINGDLL")); + if (IsUnicode) + project.AddCompilerOption(_T("-DwxUSE_UNICODE")); + if (!IsUnicode) + project.AddCompilerOption(_T("-DwxUSE_UNICODE=0")); + } + else if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("bcc*"))) + { + project.AddCompilerOption(_T("-D__WXMSW__")); + if (IsDLL) + project.AddCompilerOption(_T("-DWXUSINGDLL")); + if (IsUnicode) + project.AddCompilerOption(_T("-DUNICODE")); + project.AddCompilerOption(_T("-q")); + project.AddCompilerOption(_T("-c")); + project.AddCompilerOption(_T("-P")); + //project.AddCompilerOption(_T("-tWR")); + project.AddCompilerOption(_T("-tWM")); + project.AddCompilerOption(_T("-a8")); + project.AddLinkLib(_T("import32.lib")); + project.AddLinkLib(_T("cw32mt.lib")); // cw32mti.lib + project.AddLinkLib(_T("ole2w32.lib")); + project.AddLinkerOption(_T("-Tpe")); + project.AddLinkerOption(_T("-aa")); + } + else if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("ow"))) + { + project.AddCompilerOption(_T("-d__WXMSW__")); + if (IsDLL) + project.AddCompilerOption(_T("-dWXUSINGDLL")); + if (IsUnicode) + project.AddCompilerOption(_T("-dUNICODE")); + project.AddCompilerOption(_T("-bm")); + project.AddCompilerOption(_T("-br")); + project.AddCompilerOption(_T("-bt=nt")); + project.AddCompilerOption(_T("-zq")); + project.AddCompilerOption(_T("-xr")); + project.AddCompilerOption(_T("-xs")); + project.AddCompilerOption(_T("-wcd=549")); + project.AddCompilerOption(_T("-wcd=656")); + project.AddCompilerOption(_T("-wcd=657")); + project.AddCompilerOption(_T("-wcd=667")); + } + // Please remember that the following code have been added separately as it is not tested with MSVC 6 + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvctk")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc8")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc10"))) + { + project.AddCompilerOption(_T("/EHs")); + project.AddCompilerOption(_T("/EHc")); + project.AddCompilerOption(_T("/D_CRT_SECURE_DEPRECATE")); + project.AddCompilerOption(_T("/D_CRT_NONSTDC_NO_DEPRECATE")); + project.AddCompilerOption(_T("/D_CRT_SECURE_NO_WARNINGS")); + project.AddLinkerOption(_T("/SUBSYSTEM:WINDOWS")); + project.AddLinkLib(_T("winmm.lib")); + project.AddLinkLib(_T("rpcrt4.lib")); + } + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc8"))) + { + project.AddCompilerOption(_T("/Zc:wchar_t")); + project.AddCompilerOption(_T("/D_VC80_UPGRADE=0x0600")); + } + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc10"))) + { + project.AddCompilerOption(_T("/Zc:wchar_t")); + project.AddCompilerOption(_T("/Zc:auto")); + } + + if (!IsDLL) + { + project.AddLinkLib(LibPrefix + _T("kernel32") + LibSuffix); + project.AddLinkLib(LibPrefix + _T("user32") + LibSuffix); + project.AddLinkLib(LibPrefix + _T("gdi32") + LibSuffix); + project.AddLinkLib(LibPrefix + _T("winspool") + LibSuffix); + project.AddLinkLib(LibPrefix + _T("comdlg32") + LibSuffix); + project.AddLinkLib(LibPrefix + _T("advapi32") + LibSuffix); + project.AddLinkLib(LibPrefix + _T("gdi32") + LibSuffix); + project.AddLinkLib(LibPrefix + _T("shell32") + LibSuffix); + project.AddLinkLib(LibPrefix + _T("ole32") + LibSuffix); + project.AddLinkLib(LibPrefix + _T("oleaut32") + LibSuffix); + project.AddLinkLib(LibPrefix + _T("uuid") + LibSuffix); + project.AddLinkLib(LibPrefix + _T("comctl32") + LibSuffix); + if (LibWxLinkWinSock2) + project.AddLinkLib(LibPrefix + _T("ws2_32") + LibSuffix); + else + project.AddLinkLib(LibPrefix + _T("wsock32") + LibSuffix); + if (LibWxGL) + project.AddLinkLib(LibPrefix + _T("opengl32") + LibSuffix); + + // needed for wxWidgets 3.1 and newer + if (WxVersion >= 2 && GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("gcc*"))) + { + project.AddLinkLib(LibPrefix + _T("shlwapi") + LibSuffix); + project.AddLinkLib(LibPrefix + _T("version") + LibSuffix); + project.AddLinkLib(LibPrefix + _T("oleacc") + LibSuffix); + project.AddLinkLib(LibPrefix + _T("uxtheme") + LibSuffix); + if (LibWxSTC) + project.AddLinkLib(LibPrefix + _T("imm32") + LibSuffix); + } + + + } + } + + + // enable PCH + if (WantPCH && GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("gcc*"))) + { + local pchfile = project.GetFileByFilename(PCHFileName, true, true); + if (!IsNull(pchfile) && !UseOnlyTargetSettingsEverywhere) + { + pchfile.compile = true; + pchfile.link = false; + pchfile.weight = 0; + project.SetModeForPCH(pchSourceDir); // pch dir + project.AddCompilerOption(_T("-Winvalid-pch")); + project.AddCompilerOption(_T("-include ") + PCHFileName); + project.AddCompilerOption(_T("-DWX_PRECOMP")); + } + } + // For other compilers, different approach has been used + else if (WantPCH && GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("bcc*")) && !UseOnlyTargetSettingsEverywhere) + { + project.AddCompilerOption(_T("-H")); + project.AddCompilerOption(_T("-DWX_PRECOMP")); + } + else if (WantPCH && !UseOnlyTargetSettingsEverywhere && (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvctk")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc8")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc10")))) + { + project.AddCompilerOption(_T("/FI\"") + PCHFileName + _T("\"")); + project.AddCompilerOption(_T("/Yc\"") + PCHFileName + _T("\"")); + } + + // enable compiler warnings (project-wide) + if (!UseOnlyTargetSettingsEverywhere) WarningsOn(project, Wizard.GetCompilerID()); + + // Debug + local target = project.GetBuildTarget(Wizard.GetDebugName()); + if (!IsNull(target)) + { + SetupTarget(target, true); + if (UseOnlyTargetSettingsEverywhere) WarningsOn(target, Wizard.GetCompilerID()); + } + + + // Release + target = project.GetBuildTarget(Wizard.GetReleaseName()); + + if (!IsNull(target)) + { + SetupTarget(target, false); + if (UseOnlyTargetSettingsEverywhere) WarningsOn(target, Wizard.GetCompilerID()); + } + + + if (GuiBuilder == 1) + { + if ("WxsAddWxExtensions" in getroottable()) + { + // Adding extra bindings for wxSmith + local Prefix = GetFixedProjectName(Wizard.GetProjectName()); + local WxsFileName = _T(""); + + if ( GuiAppType==0 ) + WxsFileName = _T("dialog.wxs"); + else + WxsFileName = _T("frame.wxs"); + + WxsAddWxExtensions( + project, + Prefix+_T("App.cpp"), + Prefix+_T("Main.cpp"), + Prefix+_T("Main.h"), + _T("wxsmith/")+Prefix+WxsFileName); + } + } + + + + return true; +} + +// generates a name for a wxWidgets "main" library, e.g., "wxmsw31ud_aui.lib" +function GetMSWwxLibraryFileName(is_base, library_name) +{ + local name = LibPrefix; + + if (is_base) + name += _T("wxbase"); + else + name += _T("wxmsw"); + + name += LibWxVer + LibUnicSuffix + LibDebugSuffix; + + // library_name can be empty for the base or monolithic library + if (library_name.len() != 0) + name += _T("_") + library_name; + + name += LibSuffix; + + return name; +} + +// generates a name for a wxWidgets 3rd party library (image formats, expat, regex, scintilla, zlib) +function GetMSWwxLibrary3rdPartyFileName(library_name, has_unic_suffix) +{ + local name = LibPrefix + _T("wx") + library_name; + + if (has_unic_suffix) + name += LibUnicSuffix; + + name += LibDebugSuffix + LibSuffix; + + return name; +} + + +function SetupTarget(target, is_debug) +{ + if (IsNull(target)) + return false; + + + +///////////////////////// +// This is based on project setup +// in order to make each target have completely separate settings +// That should help when working with the same projects on different operating systems +// or with extreme cases like building the same application for Win 3.11 and M1 Mac... +// at least that's the idea + +if (UseOnlyTargetSettingsEverywhere) +{ + //local libdir; + + // set project options + if (PLATFORM != PLATFORM_MSW) + { + if (ChoiceWxUnixLib == 0) + { + target.AddCompilerOption(_T("`wx-config --cflags`")); + target.AddLinkerOption(_T("`wx-config --libs`")); + } + + // Now enable PCH + if (WantPCH && GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("gcc*"))) + { + local pchfile = target.GetFileByFilename(PCHFileName, true, true); + if (!IsNull(pchfile)) + { + pchfile.compile = true; + pchfile.link = false; + pchfile.weight = 0; + target.SetModeForPCH(pchSourceDir); // pch dir + target.AddCompilerOption(_T("-Winvalid-pch")); + target.AddCompilerOption(_T("-include ") + PCHFileName); + target.AddCompilerOption(_T("-DWX_PRECOMP")); + } + } + } + else + { + target.AddIncludeDir(WxPath + _T("/include")); + target.AddResourceIncludeDir(WxPath + _T("/include")); + //libdir = LibPath + _T("/msw"); + //if (IsUnicode) + // libdir = libdir + _T("u"); + + + + /* Add standard and special compiler options and libraries */ + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc*"))) + { + target.AddCompilerOption(_T("/DWIN32")); + target.AddCompilerOption(_T("/D__WIN32__")); + target.AddCompilerOption(_T("/D__WXMSW__")); + if (IsDLL) + target.AddCompilerOption(_T("/DWXUSINGDLL")); + if (IsUnicode) + target.AddCompilerOption(_T("/DwxUSE_UNICODE")); + target.AddCompilerOption(_T("/D_WINDOWS")); + target.AddLinkerOption(_T("/INCREMENTAL:NO")); + } + else if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("gcc*"))) + { + target.AddCompilerOption(_T("-pipe")); + target.AddCompilerOption(_T("-mthreads")); + target.AddLinkerOption(_T("-mthreads")); + target.AddCompilerOption(_T("-D__GNUWIN32__")); + target.AddCompilerOption(_T("-D__WXMSW__")); + if (IsDLL) + target.AddCompilerOption(_T("-DWXUSINGDLL")); + if (IsUnicode) + target.AddCompilerOption(_T("-DwxUSE_UNICODE")); + if (!IsUnicode) + target.AddCompilerOption(_T("-DwxUSE_UNICODE=0")); + + if (WxVersion > 0) + target.AddResourceCompilerOption(_T("-DwxUSE_DPI_AWARE_MANIFEST=2")); + + if (!is_debug) + { + target.AddCompilerOption(_T("-DNDEBUG")); + if (WxVersion > 0) target.AddCompilerOption(_T("-DwxDEBUG_LEVEL=0")); + } + + } + else if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("bcc*"))) + { + target.AddCompilerOption(_T("-D__WXMSW__")); + if (IsDLL) + target.AddCompilerOption(_T("-DWXUSINGDLL")); + if (IsUnicode) + target.AddCompilerOption(_T("-DUNICODE")); + target.AddCompilerOption(_T("-q")); + target.AddCompilerOption(_T("-c")); + target.AddCompilerOption(_T("-P")); + //project.AddCompilerOption(_T("-tWR")); + target.AddCompilerOption(_T("-tWM")); + target.AddCompilerOption(_T("-a8")); + target.AddLinkLib(_T("import32.lib")); + target.AddLinkLib(_T("cw32mt.lib")); // cw32mti.lib + target.AddLinkLib(_T("ole2w32.lib")); + target.AddLinkerOption(_T("-Tpe")); + target.AddLinkerOption(_T("-aa")); + + if (!is_debug) + { + target.AddCompilerOption(_T("-DNDEBUG")); + if (WxVersion > 0) target.AddCompilerOption(_T("-DwxDEBUG_LEVEL=0")); + } + + + } + else if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("ow"))) + { + target.AddCompilerOption(_T("-d__WXMSW__")); + if (IsDLL) + target.AddCompilerOption(_T("-dWXUSINGDLL")); + if (IsUnicode) + target.AddCompilerOption(_T("-dUNICODE")); + target.AddCompilerOption(_T("-bm")); + target.AddCompilerOption(_T("-br")); + target.AddCompilerOption(_T("-bt=nt")); + target.AddCompilerOption(_T("-zq")); + target.AddCompilerOption(_T("-xr")); + target.AddCompilerOption(_T("-xs")); + target.AddCompilerOption(_T("-wcd=549")); + target.AddCompilerOption(_T("-wcd=656")); + target.AddCompilerOption(_T("-wcd=657")); + target.AddCompilerOption(_T("-wcd=667")); + } + // Please remember that the following code have been added separately as it is not tested with MSVC 6 + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvctk")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc8")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc10"))) + { + target.AddCompilerOption(_T("/EHs")); + target.AddCompilerOption(_T("/EHc")); + target.AddCompilerOption(_T("/D_CRT_SECURE_DEPRECATE")); + target.AddCompilerOption(_T("/D_CRT_NONSTDC_NO_DEPRECATE")); + target.AddCompilerOption(_T("/D_CRT_SECURE_NO_WARNINGS")); + target.AddLinkerOption(_T("/SUBSYSTEM:WINDOWS")); + target.AddLinkLib(_T("winmm.lib")); + target.AddLinkLib(_T("rpcrt4.lib")); + } + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc8"))) + { + target.AddCompilerOption(_T("/Zc:wchar_t")); + target.AddCompilerOption(_T("/D_VC80_UPGRADE=0x0600")); + } + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc10"))) + { + target.AddCompilerOption(_T("/Zc:wchar_t")); + target.AddCompilerOption(_T("/Zc:auto")); + } + + + + + + } + + + // enable PCH + if (WantPCH && GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("gcc*"))) + { + local pchfile = target.GetFileByFilename(PCHFileName, true, true); + if (!IsNull(pchfile)) + { + pchfile.compile = true; + pchfile.link = false; + pchfile.weight = 0; + target.SetModeForPCH(pchSourceDir); // pch dir + target.AddCompilerOption(_T("-Winvalid-pch")); + target.AddCompilerOption(_T("-include ") + PCHFileName); + target.AddCompilerOption(_T("-DWX_PRECOMP")); + } + } + // For other compilers, different approach has been used + else if (WantPCH && GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("bcc*"))) + { + target.AddCompilerOption(_T("-H")); + target.AddCompilerOption(_T("-DWX_PRECOMP")); + } + else if (WantPCH && (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvctk")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc8")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc10")))) + { + target.AddCompilerOption(_T("/FI\"") + PCHFileName + _T("\"")); + target.AddCompilerOption(_T("/Yc\"") + PCHFileName + _T("\"")); + } + + // enable compiler warnings + WarningsOn(target, Wizard.GetCompilerID()); + + + /* // should that be left as project-wide? + if (GuiBuilder == 1) + { + if ("WxsAddWxExtensions" in getroottable()) + { + // Adding extra bindings for wxSmith + local Prefix = GetFixedProjectName(Wizard.GetProjectName()); + local WxsFileName = _T(""); + + if ( GuiAppType==0 ) + WxsFileName = _T("dialog.wxs"); + else + WxsFileName = _T("frame.wxs"); + + WxsAddWxExtensions( + project, + Prefix+_T("App.cpp"), + Prefix+_T("Main.cpp"), + Prefix+_T("Main.h"), + _T("wxsmith/")+Prefix+WxsFileName); + } + } + */ + +} // UseOnlyTargetSettingsEverywhere + +///////////////////////// +///////////////////////// + + + + + local obj_output_dir, exe_file_name, exe_output_dir; + if (WizType == wizProject) + { + if (is_debug) + { + obj_output_dir = Wizard.GetDebugObjectOutputDir(); + exe_output_dir = Wizard.GetDebugOutputDir(); + } + else + { + obj_output_dir = Wizard.GetReleaseObjectOutputDir(); + exe_output_dir = Wizard.GetReleaseOutputDir(); + } + exe_file_name = Wizard.GetProjectName(); + } + else if (WizType == wizTarget) + { + obj_output_dir = Wizard.GetTargetObjectOutputDir(); + exe_output_dir = Wizard.GetTargetOutputDir(); + exe_file_name = target.GetParentProject().GetTitle(); + } + + if (is_debug) + { + if (DebugTarget == 0) + target.SetTargetType(ttConsoleOnly); + else + target.SetTargetType(ttExecutable); + } + else + { + if (ReleaseTarget == 0) + target.SetTargetType(ttConsoleOnly); + else + target.SetTargetType(ttExecutable); + } + + target.SetOutputFilename(exe_output_dir + exe_file_name + DOT_EXT_EXECUTABLE); + + if (is_debug) + DebugSymbolsOn(target, Wizard.GetCompilerID()); + else + OptimizationsOn(target, Wizard.GetCompilerID()); + + + if (UseOnlyTargetSettingsEverywhere) + { + target.SetOptionRelation(ortCompilerOptions, orUseTargetOptionsOnly); + target.SetOptionRelation(ortLinkerOptions, orUseTargetOptionsOnly); + target.SetOptionRelation(ortIncludeDirs, orUseTargetOptionsOnly); + target.SetOptionRelation(ortLibDirs, orUseTargetOptionsOnly); + target.SetOptionRelation(ortResDirs, orUseTargetOptionsOnly); + } + + + if (!UseOnlyTargetSettingsEverywhere) target.SetOptionRelation(ortLinkerOptions, orPrependToParentOptions); + + + + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("gcc*"))) + is_debug = ChkWxDebug && is_debug; + + if (!is_debug || IsPartialDebug) + LibDebugSuffix = _T(""); + + /* For Linux / Mac */ + if (PLATFORM != PLATFORM_MSW) + { + if (ChoiceWxUnixLib == 1) + { + local flags; + flags = _T("`wx-config "); + flags = flags + _T(" --version=") + LibWxVer; + flags = flags + (IsDLL == false ? _T(" --static=yes") : _T(" --static=no")); + flags = flags + (IsUnicode == true ? _T(" --unicode=yes") : _T(" --unicode=no")); + if (is_debug) + { + target.AddCompilerOption(flags + _T(" --debug=yes --cflags`")); + target.AddLinkerOption(flags + _T(" --debug=yes --libs`")); + } + if (!is_debug) + { + target.AddCompilerOption(flags + _T(" --debug=no --cflags`")); + target.AddLinkerOption(flags + _T(" --debug=no --libs`")); + } + } + + if (PLATFORM == PLATFORM_MAC) + { + // still need the resource fork hack to run unbundled wxWidgets applications: + local rezflags = _T("/Developer/Tools/Rez -d __DARWIN__ -t APPL Carbon.r -o"); + + if (!IsNull(target)) + { + target.AddCommandsAfterBuild(rezflags + _T(" $(TARGET_OUTPUT_FILE)")); + } + } + } + else if (PLATFORM == PLATFORM_MSW) + { + local libdir = LibPath + _T("/msw"); + if (IsUnicode) + libdir = libdir + _T("u"); + if (is_debug && !IsPartialDebug) + { + target.AddIncludeDir(libdir + _T("d")); + target.AddLibDir(LibPath); + target.AddResourceIncludeDir(libdir + _T("d")); + } + else + { + target.AddIncludeDir(libdir); + target.AddLibDir(LibPath); + target.AddResourceIncludeDir(libdir); + } + + /* Modified and added */ + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc*")) && is_debug && !IsPartialDebug) + { + target.AddCompilerOption(_T("/D__WXDEBUG__")); // For Debug Build + } + else if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("gcc*")) && is_debug && !IsPartialDebug) + { + target.AddCompilerOption(_T("-D__WXDEBUG__")); + } + else if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("bcc*"))) + { + if (is_debug) + { + if (!IsPartialDebug) + { + target.AddCompilerOption(_T("-D__WXDEBUG__")); + } + target.AddLinkerOption(_T("-v")); + } + if (WantPCH) // Add support for PCH + target.AddCompilerOption(_T("-H -H=") + obj_output_dir + exe_file_name + _T(".csm")); + } + else if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("ow"))) + { + if (is_debug) + { + if (!IsPartialDebug) + { + target.AddCompilerOption(_T("-d__WXDEBUG__")); + } + target.AddLinkerOption(_T("-d2")); + } + } + + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvctk"))) + { + if (is_debug) + { + target.AddLinkerOption(_T("/NODEFAULTLIB:libcpmtd.lib")); + target.AddLinkLib(_T("msvcprtd.lib")); + } + else + { + target.AddLinkerOption(_T("/NODEFAULTLIB:libcpmt.lib")); + target.AddLinkLib(_T("msvcprt.lib")); + } + } + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvctk")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc8")) + || GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc10"))) + { + if(WantPCH) // Add support for PCH + target.AddCompilerOption(_T("/Fp\"") + obj_output_dir + exe_file_name + _T(".pch\"")); + + if (is_debug) + { + if (multi_thread_dynamic) + { + target.AddCompilerOption(_T("/MDd")); + target.AddLinkerOption(_T("/NODEFAULTLIB:libcmtd.lib")); + target.AddLinkerOption(_T("/NODEFAULTLIB:msvcrt.lib")); + target.AddLinkLib(_T("msvcrtd.lib")); + } + else + { + target.AddCompilerOption(_T("/MTd")); + } + + target.AddCompilerOption(_T("/D_DEBUG")); + } + else + { + if (multi_thread_dynamic) + { + target.AddCompilerOption(_T("/MD")); + target.AddLinkerOption(_T("/NODEFAULTLIB:libcmt.lib")); + target.AddLinkLib(_T("msvcrt.lib")); + } + else + { + target.AddCompilerOption(_T("/MT")); + } + + target.AddCompilerOption(_T("/O2")); + } + } + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("msvc8"))) + { + target.RemoveCompilerOption(_T("/Og")); // Deprecated option in MSVC 8 + /* Now embed the generated manifest file */ + target.AddCommandsAfterBuild(_T("mt.exe /nologo /manifest \"") + exe_output_dir + exe_file_name + _T(".exe.manifest\" /outputresource:\"") + exe_output_dir + exe_file_name + _T(".exe\";1")); + } + /* End Modification*/ + + /* Now Add the required Libraries */ + if (IsMonolithic) + { + target.AddLinkLib(GetMSWwxLibraryFileName(false, _T(""))); // the monolithic library itself + if (LibWxGL) + target.AddLinkLib(GetMSWwxLibraryFileName(false, _T("gl"))); + } + else + { + // Check and add additional libraries + if (LibWxWebView) target.AddLinkLib(GetMSWwxLibraryFileName(false, _T("webview"))); + if (LibWxSTC) target.AddLinkLib(GetMSWwxLibraryFileName(false, _T("stc"))); + if (LibWxPropertyGrid) target.AddLinkLib(GetMSWwxLibraryFileName(false, _T("propgrid"))); + if (LibWxRibbon) target.AddLinkLib(GetMSWwxLibraryFileName(false, _T("ribbon"))); + if (LibWxRichText) target.AddLinkLib(GetMSWwxLibraryFileName(false, _T("richtext"))); + if (LibWxXRC) target.AddLinkLib(GetMSWwxLibraryFileName(false, _T("xrc"))); + if (LibWxAUI) target.AddLinkLib(GetMSWwxLibraryFileName(false, _T("aui"))); + if (LibWxMedia) target.AddLinkLib(GetMSWwxLibraryFileName(false, _T("media"))); + if (LibWxNet) target.AddLinkLib(GetMSWwxLibraryFileName(true, _T("net"))); + if (LibWxGL) target.AddLinkLib(GetMSWwxLibraryFileName(false, _T("gl"))); + if (LibWxQA) target.AddLinkLib(GetMSWwxLibraryFileName(false, _T("qa"))); + if (LibWxXML) target.AddLinkLib(GetMSWwxLibraryFileName(true, _T("xml"))); + if (LibWxAdvanced) target.AddLinkLib(GetMSWwxLibraryFileName(false, _T("adv"))); + if (LibWxHTML) target.AddLinkLib(GetMSWwxLibraryFileName(false, _T("html"))); + target.AddLinkLib(GetMSWwxLibraryFileName(false, _T("core"))); + target.AddLinkLib(GetMSWwxLibraryFileName(true, _T(""))); // the base library itself + } + + if (!IsDLL) + { + target.AddLinkLib(GetMSWwxLibrary3rdPartyFileName(_T("png"), false)); + target.AddLinkLib(GetMSWwxLibrary3rdPartyFileName(_T("jpeg"), false)); + target.AddLinkLib(GetMSWwxLibrary3rdPartyFileName(_T("tiff"), false)); + target.AddLinkLib(GetMSWwxLibrary3rdPartyFileName(_T("zlib"), false)); + target.AddLinkLib(GetMSWwxLibrary3rdPartyFileName(_T("regex"), true)); + + // No scintilla for wx2.8 and older + if ((LibWxSTC) && (WxVersion >= 1)) + target.AddLinkLib(GetMSWwxLibrary3rdPartyFileName(_T("scintilla"), false)); + if (LibWxXML) + target.AddLinkLib(GetMSWwxLibrary3rdPartyFileName(_T("expat"), false)); + + } + + if ( IsUnicode && (WxVersion == 0 || WxVersion == 1 ) ) target.AddLinkLib(LibPrefix + _T("unicows") + LibSuffix); + + if (!IsDLL) + { + target.AddLinkLib(LibPrefix + _T("kernel32") + LibSuffix); + target.AddLinkLib(LibPrefix + _T("user32") + LibSuffix); + target.AddLinkLib(LibPrefix + _T("gdi32") + LibSuffix); + target.AddLinkLib(LibPrefix + _T("winspool") + LibSuffix); + target.AddLinkLib(LibPrefix + _T("comdlg32") + LibSuffix); + target.AddLinkLib(LibPrefix + _T("advapi32") + LibSuffix); + target.AddLinkLib(LibPrefix + _T("gdi32") + LibSuffix); + target.AddLinkLib(LibPrefix + _T("shell32") + LibSuffix); + target.AddLinkLib(LibPrefix + _T("ole32") + LibSuffix); + target.AddLinkLib(LibPrefix + _T("oleaut32") + LibSuffix); + target.AddLinkLib(LibPrefix + _T("uuid") + LibSuffix); + target.AddLinkLib(LibPrefix + _T("comctl32") + LibSuffix); + if (LibWxLinkWinSock2) + target.AddLinkLib(LibPrefix + _T("ws2_32") + LibSuffix); + else + target.AddLinkLib(LibPrefix + _T("wsock32") + LibSuffix); + if (LibWxGL) + target.AddLinkLib(LibPrefix + _T("opengl32") + LibSuffix); + + // needed for wxWidgets 3.1 and newer + if (WxVersion >= 2 && GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("gcc*"))) + { + target.AddLinkLib(LibPrefix + _T("shlwapi") + LibSuffix); + target.AddLinkLib(LibPrefix + _T("version") + LibSuffix); + target.AddLinkLib(LibPrefix + _T("oleacc") + LibSuffix); + target.AddLinkLib(LibPrefix + _T("uxtheme") + LibSuffix); + if (LibWxSTC) + target.AddLinkLib(LibPrefix + _T("imm32") + LibSuffix); + } + + + } + + + + + + } + + + if (ExecuteInVM > 0 && !is_debug) + { + + /* + // Post-build commands to run built exe in DOSbox-X (Win 95) + local pb_rundosboxw95 = ::wxString(); + pb_rundosboxw95 = _T("\"$(APPPATH)\\dosboxw95\\w95launcher.bat\" \"$(PROJECT_DIR)$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).exe\"" ); + // Add post-build commands to target + target.AddCommandsAfterBuild(pb_rundosboxw95); + // This will run all above on each build (prepare EXE and run test in DOSbox) + target.SetAlwaysRunPostBuildSteps(true); + */ + + local proj = target.GetParentProject(); + + local releaseName = proj.GetBuildTarget(Wizard.GetReleaseName()); + + WizType = Wizard.GetWizardType(); + + if (WizType == wizTarget) releaseName = Wizard.GetTargetName(); + + proj.ExtensionAddNode( _T(""), _T("debugger")); + + local targetName = ""; + if (WizType == wizTarget) targetName = _T( "" + releaseName ); + else targetName = _T( "" + releaseName.GetTitle() ); + + + local rdNode = proj.ExtensionAddNode( _T("debugger"), _T("remote_debugging") ); + + proj.ExtensionSetNodeAttribute(rdNode, _T("target"), _T( "" + targetName ) ); + + local optNode = proj.ExtensionAddNode( rdNode , _T("options") ); + + + proj.ExtensionSetNodeAttribute( optNode , _T("conn_type"), _T("2")); + proj.ExtensionSetNodeAttribute( optNode , _T("additional_cmds"), _T("q")); // That will quit execution on host and run only in VM + + if (ExecuteInVM == 1) proj.ExtensionSetNodeAttribute(optNode, _T("additional_shell_cmds_before"), + _T("$(APPPATH)\\dosboxw31\\w31launcher.bat \"$(PROJECT_DIR)$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).exe\"")); + + if (ExecuteInVM == 2) proj.ExtensionSetNodeAttribute(optNode, _T("additional_shell_cmds_before"), + _T("$(APPPATH)\\dosboxw95\\w95launcher.bat \"$(PROJECT_DIR)$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).exe\"")); + + if (ExecuteInVM == 2 && (IsUnicode) ) + { + // copy unicows.dll to build directory + local pb_copyunicows = ::wxString(); + pb_copyunicows = _T("$(CMD_CP) \"$(CODEBLOCKS)\\redist\\unicows\\unicows.dll\" \"$(PROJECT_DIR)$(TARGET_OUTPUT_DIR)\\unicows.dll\"" ); + target.AddCommandsAfterBuild(pb_copyunicows); + } + + //if (ExecuteInVM == 2) proj.ExtensionSetNodeAttribute(optNode, _T("additional_shell_cmds_before"), + //_T("$(APPPATH)\\dosboxw95\\w95launcher.bat \"$(PROJECT_DIR)$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).exe\"")); + + + } + + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +// Add additional wxWidgets libraries (for Windows) +//////////////////////////////////////////////////////////////////////////////// + +function OnGetNextPage_WxConf() +{ + IsAdvOpt = Wizard.IsCheckboxChecked(_T("chkWxConfAdvOpt")); + IsMonolithic = Wizard.IsCheckboxChecked(_T("chkWxConfMono")); + if (IsAdvOpt) + return _T("WxConfAdvOpt"); + if (!IsMonolithic) + return _T("WxAddLib"); + else + return _T("WxAddLibMono"); +} + +//////////////////////////////////////////////////////////////////////////////// +// Set appropriate Global Variables for Target type +//////////////////////////////////////////////////////////////////////////////// + +function OnEnter_WxConfAdvOpt(fwd) +{ + if (fwd) + { + local configManager = GetConfigManager(); + + Wizard.CheckCheckbox(_T("chkWxDebug"), configManager.Read(_T("/wx_project_wizard/wxdebug"), ChkWxDebug)); + + Wizard.EnableWindow(_T("RadioBoxDebug"), Wizard.GetWantDebug()); + if (Wizard.GetWantDebug()) + Wizard.SetRadioboxSelection(_T("RadioBoxDebug"), configManager.Read(_T("/wx_project_wizard/debugtarget"), DebugTarget)); + + Wizard.EnableWindow(_T("RadioBoxRelease"), Wizard.GetWantRelease()); + if (Wizard.GetWantRelease()) + Wizard.SetRadioboxSelection(_T("RadioBoxRelease"), configManager.Read(_T("/wx_project_wizard/releasetarget"), ReleaseTarget)); + } + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +// Set appropriate Global Variables for Target type +//////////////////////////////////////////////////////////////////////////////// + +function OnLeave_WxConfAdvOpt(fwd) +{ + if (fwd) + { + ChkWxDebug = Wizard.IsCheckboxChecked(_T("chkWxDebug")); + DebugTarget = Wizard.GetRadioboxSelection(_T("RadioBoxDebug")); + ReleaseTarget = Wizard.GetRadioboxSelection(_T("RadioBoxRelease")); + if (!ChkWxDebug) + LibDebugSuffix = _T(""); + + local configManager = GetConfigManager(); + configManager.Write(_T("/wx_project_wizard/wxdebug"), ChkWxDebug); + configManager.Write(_T("/wx_project_wizard/debugtarget"), DebugTarget); + configManager.Write(_T("/wx_project_wizard/releasetarget"), ReleaseTarget); + } + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +// Check for next wizard page after Target type +//////////////////////////////////////////////////////////////////////////////// + +function OnGetNextPage_WxConfAdvOpt() +{ + if (IsMonolithic) + return _T("WxAddLibMono"); + else + return _T("WxAddLib"); +} + +//////////////////////////////////////////////////////////////////////////////// +// Set global variables for additional lib wizard page (for Windows) +//////////////////////////////////////////////////////////////////////////////// + +function OnGetPrevPage_WxAddLib() +{ + if (IsAdvOpt) // IsAdvOpt - Refers to Target Type + return _T("WxConfAdvOpt"); + else + return _T("WxConf"); +} + +//////////////////////////////////////////////////////////////////////////////// +// Set global variables for additional lib wizard page (for Windows) +//////////////////////////////////////////////////////////////////////////////// + +function OnEnter_WxAddLib(fwd) +{ + if (fwd) + { + if (IsDLL) // no linking against any winsock needed + { + Wizard.CheckCheckbox(_T("chkWxLinkWinSock2"), false); + Wizard.EnableWindow(_T("chkWxLinkWinSock2"), false); + } + else + { + Wizard.CheckCheckbox(_T("chkWxLinkWinSock2"), GetConfigManager().Read(_T("/wx_project_wizard/winsock2"), LibWxLinkWinSock2)); + Wizard.EnableWindow(_T("chkWxLinkWinSock2"), true); + } + } + return true; +} + +function OnLeave_WxAddLib(fwd) +{ + if (fwd) + { + if (GetCompilerFactory().CompilerInheritsFrom(Wizard.GetCompilerID(), _T("gcc*"))) + { + local tempLibArray = GetArrayFromString(Wizard.GetListboxStringSelections(_T("lstWxLibs")), _T(";"), false); + + if (tempLibArray.Index(_T("wxQA")) >= 0) + { + if (Message(_T("Library wxQA may not be available for wxWidgets built with GCC.\n" + + "Continue anyway?"), + _T("Warning"), wxYES_NO) == wxID_NO) + { + return false; + } + } + } + + LibWxLinkWinSock2 = Wizard.IsCheckboxChecked(_T("chkWxLinkWinSock2")); + AddlLibList = Wizard.GetListboxStringSelections(_T("lstWxLibs")); + } + return true; +} + +function OnGetNextPage_WxAddLib() +{ + // the project is set to use multilib wxWidgets build, + // return empty string to prevent showing + // the monolithic library options + return _T(""); +} + +//////////////////////////////////////////////////////////////////////////////// +// Set options for the monolithic build (for Windows) +//////////////////////////////////////////////////////////////////////////////// + +function OnGetPrevPage_WxAddLibMono() +{ + if (IsAdvOpt) // IsAdvOpt - Refers to Target Type + return _T("WxConfAdvOpt"); + else + return _T("WxConf"); +} + +function OnEnter_WxAddLibMono(fwd) +{ + if (fwd) + { + local configManager = GetConfigManager(); + + Wizard.CheckCheckbox(_T("chkWxLinkOpenGLMono"), configManager.Read(_T("/wx_project_wizard/linkopenglmono"), false)); + + if (IsDLL) // no linking against any winsock needed + { + Wizard.CheckCheckbox(_T("chkWxLinkWinSock2Mono"), false); + Wizard.EnableWindow(_T("chkWxLinkWinSock2Mono"), false); + } + else + { + Wizard.CheckCheckbox(_T("chkWxLinkWinSock2Mono"), configManager.Read(_T("/wx_project_wizard/winsock2mono"), LibWxLinkWinSock2)); + Wizard.EnableWindow(_T("chkWxLinkWinSock2Mono"), true); + } + } + return true; +} + +function OnLeave_WxAddLibMono(fwd) +{ + if (fwd) + { + LibWxGL = Wizard.IsCheckboxChecked(_T("chkWxLinkOpenGLMono")); + LibWxLinkWinSock2 = Wizard.IsCheckboxChecked(_T("chkWxLinkWinSock2Mono")); + + // Assume that XML and STC is always used and set the vars to true + // since we will need it to link scintilla and expat + LibWxSTC = true; + LibWxXML = true; + } + return true; +} + +// ----------------------------------------------------------------------------- +// return the template's filename, appending as an extension (must include the dot) +function GetTemplateFile(index) +{ + local template_file = _T(""); + if (GuiBuilder == 1 && GuiAppType < 2) + { + if (index == 0) + template_file = _T("wxwidgets/common/app.h"); + else if (index == 1) + template_file = _T("wxwidgets/wxsmith/app.cpp"); + else if (index == 2) + template_file = _T("wxwidgets/wxsmith/main.h"); + else if (index == 3) + template_file = _T("wxwidgets/wxsmith/main.cpp"); + else if (index == 4) + template_file = _T("wxwidgets/wxsmith/resource.wxs"); + else if (index == 5 && WantPCH) + template_file = _T("wxwidgets/pch/wx_pch.h"); + } + else if (GuiBuilder == 1 && GuiAppType == 2) + { + if (index == 0) + template_file = _T("wxwidgets/common/app.h"); + else if (index == 1) + template_file = _T("wxwidgets/wxsmith/app.cpp"); + else if (index == 2) + template_file = _T("wxwidgets/wxsmith/main_s.h"); + else if (index == 3) + template_file = _T("wxwidgets/wxsmith/main_s.cpp"); + else if (index == 4) + template_file = _T("wxwidgets/wxsmith/resource_s.wxs"); + else if (index == 5 && WantPCH) + template_file = _T("wxwidgets/pch/wx_pch.h"); + } + else + { + if (index == 0) + template_file = _T("wxwidgets/common/app.h"); + else if (index == 1) + template_file = _T("wxwidgets/common/app.cpp"); + else if (index == 2) + template_file = _T("wxwidgets/common/main.h"); + else if (index == 3) + template_file = _T("wxwidgets/common/main.cpp"); + else if (index == 4 && WantPCH) + template_file = _T("wxwidgets/pch/wx_pch.h"); + } + return template_file; +} + +// ----------------------------------------------------------------------------- +// return the header contents string +function GenerateHeader(index) +{ + local path = Wizard.FindTemplateFile(GetTemplateFile(index)); + local buffer = IO.ReadFileContents(path); + + return SubstituteMacros(buffer); +} + +// ----------------------------------------------------------------------------- +// return the implementation contents string +function GenerateSource(index) +{ + local path = Wizard.FindTemplateFile(GetTemplateFile(index)); + local buffer = IO.ReadFileContents(path); + + return SubstituteMacros(buffer); +} + +// ----------------------------------------------------------------------------- +// substitute all plugin macros in +function SubstituteMacros(buffer) +{ + // handle [IF] / [ENDIF] pairs + if (GuiBuilder == 0) + { + if (GuiAppType == 0) + { + buffer = HandleDirective(buffer, _T("WXDIALOG"), true); + buffer = HandleDirective(buffer, _T("WXFRAME"), false); + } + else if (GuiAppType > 0) + { + buffer = HandleDirective(buffer, _T("WXDIALOG"), false); + buffer = HandleDirective(buffer, _T("WXFRAME"), true); + } + buffer = HandleDirective(buffer, _T("NONE"), true); + buffer = HandleDirective(buffer, _T("WXFB"), false); + } + else if (GuiBuilder == 1) + { + if (GuiAppType == 0) + { + buffer = HandleDirective(buffer, _T("WXDIALOG"), true); + buffer = HandleDirective(buffer, _T("WXFRAME"), false); + } + else if (GuiAppType > 0) + { + buffer = HandleDirective(buffer, _T("WXDIALOG"), false); + buffer = HandleDirective(buffer, _T("WXFRAME"), true); + } + } + else if (GuiBuilder == 2) + { + if (GuiAppType == 0) + { + buffer = HandleDirective(buffer, _T("WXDIALOG"), true); + buffer = HandleDirective(buffer, _T("WXFRAME"), false); + } + else if (GuiAppType > 0) + { + buffer = HandleDirective(buffer, _T("WXDIALOG"), false); + buffer = HandleDirective(buffer, _T("WXFRAME"), true); + } + buffer = HandleDirective(buffer, _T("NONE"), false); + buffer = HandleDirective(buffer, _T("WXFB"), true); + } + buffer = HandleDirective(buffer, _T("WINDOWS"), (PLATFORM == PLATFORM_MSW ? true : false)); + + // create class name from project name which is valid c++ identifier + local Prefix = GetFixedProjectName(Wizard.GetProjectName()); + local PchInclude = WantPCH ? ( _T("#include \"") + PCHFileName + _T("\"\n") ) : _T(""); + + // macros substitution + buffer.Replace(_T("[PROJECT_HDR]"), Prefix.Upper() ); + buffer.Replace(_T("[PROJECT_NAME]"), Wizard.GetProjectName()); + buffer.Replace(_T("[FILENAME_PREFIX]"), Prefix); + buffer.Replace(_T("[CLASS_PREFIX]"), Prefix); + buffer.Replace(_T("[AUTHOR_NAME]"), ProjAuthor); + buffer.Replace(_T("[AUTHOR_EMAIL]"), ProjEmail); + buffer.Replace(_T("[AUTHOR_WWW]"), ProjWebsite); + buffer.Replace(_T("[NOW]"), ReplaceMacros(_T("$(TODAY)"))); + buffer.Replace(_T("[PCH_INCLUDE]"), PchInclude); + + return buffer; +} + +// ----------------------------------------------------------------------------- +// if is true, removes the [IF ] and [ENDIF ] +// macros. +// if is false, removes everything enclosed by the [IF ] +// and [ENDIF ] macros (including them). +function HandleDirective(buffer, directive, enabled) +{ + local dir_if = _T("[IF ") + directive + _T("]"); + local dir_endif = _T("[ENDIF ") + directive + _T("]"); + + while ( true ) + { + local findStart = buffer.Find(dir_if); + if (findStart == -1) + return buffer; + + local findEnd = buffer.Find(dir_endif); + if (findEnd == -1 || findEnd <= findStart) + return buffer; + + // look for [ELSE] + local block = buffer.Mid(findStart, findEnd - findStart); + local findElse = block.Find(_T("[ELSE]")); // findElse is in "local scope", i.e. offset from findStart + + if (!enabled) + { + if (findElse == -1) + { + // remove whole section + buffer.Remove(findStart, (findEnd - findStart) + dir_endif.Length()); + } + else + { + // remove [ENDIF] + buffer.Remove(findEnd, dir_endif.Length()); + // remove from [IF] to [ELSE] (including) + buffer.Remove(findStart, findElse + 6); // 6 is the [ELSE] size + } + } + else + { + if (findElse == -1) + { + // just remove the directives + // we must remove the [ENDIF] first because if we removed the [IF] it would + // render the findEnd index invalid! + buffer.Remove(findEnd, dir_endif.Length()); + buffer.Remove(findStart, dir_if.Length()); + } + else + { + // remove from [ELSE] to [ENDIF] + local start = findStart + findElse; + buffer.Remove(start, (findEnd - start) + dir_endif.Length()); + // remove from [IF] + buffer.Remove(findStart, dir_if.Length()); + } + } + } + + return buffer; +} + +function IntToBool(val) +{ + return (val == 0 ? false : true); +} + +function BoolToInt(val) +{ + return (val ? 1 : 0); +} + +function SetupAddlLibs() +{ + // Now set these variable values based on library selections + // for the multilib build + if (!AddlLibList.IsEmpty()) + { + local tempLibArray = ::wxArrayString(); + tempLibArray = GetArrayFromString(AddlLibList, _T(";"), false); + + LibWxWebView = (tempLibArray.Index(_T("wxWebView")) >=0); + LibWxSTC = (tempLibArray.Index(_T("wxSTC")) >=0); + LibWxPropertyGrid = (tempLibArray.Index(_T("wxPropertyGrid")) >=0); + LibWxRibbon = (tempLibArray.Index(_T("wxRibbon")) >=0); + LibWxRichText = (tempLibArray.Index(_T("wxRichText")) >=0); + LibWxAUI = (tempLibArray.Index(_T("wxAUI")) >=0); + LibWxXRC = (tempLibArray.Index(_T("wxXRC")) >=0); + LibWxMedia = (tempLibArray.Index(_T("wxMedia")) >=0);; + LibWxNet = (tempLibArray.Index(_T("wxNet")) >=0); + LibWxGL = (tempLibArray.Index(_T("wxGL")) >=0); + LibWxQA = (tempLibArray.Index(_T("wxQA")) >=0); + LibWxXML = (tempLibArray.Index(_T("wxXML")) >=0) || LibWxRichText || LibWxXRC || LibWxQA; + LibWxAdvanced = (tempLibArray.Index(_T("wxAdvanced")) >=0) || LibWxRichText || LibWxXRC; + LibWxHTML = (tempLibArray.Index(_T("wxHTML")) >=0) || LibWxRichText || LibWxXRC; + } +} diff --git a/installers/wizard/wxwidgets/wizard.xrc b/installers/wizard/wxwidgets/wizard.xrc new file mode 100644 index 0000000..72f947f --- /dev/null +++ b/installers/wizard/wxwidgets/wizard.xrc @@ -0,0 +1,379 @@ + + + + + wxVERTICAL + + + + + wxALL|wxEXPAND + 8 + + + + + wxVERTICAL + + + + + wxALL + 8 + + + + + + wxALL + 8 + + + + + + wxALL + 8 + + + wxALL|wxEXPAND + 8 + + + + + wxVERTICAL + + + + + wxALL + 8 + + + + + + wxALL|wxEXPAND + 8 + + + + + + + + wxALL|wxALIGN_CENTER_VERTICAL + 8 + + + + wxALL|wxEXPAND + 8 + + + + wxEXPAND + + + + + + wxALL + 8 + + + wxALL|wxEXPAND + 8 + + + + + + wxVERTICAL + + + + + wxALL|wxEXPAND + 8 + + + + + + Use default wxWidgets configuration + Use Advanced options + + + + wxALL|wxEXPAND + 8 + + + + + wxVERTICAL + + + + + wxALL + 8 + + + + + + wxALL + 8 + + + wxALL|wxEXPAND + 8 + + + + + wxVERTICAL + + + + + wxALL|wxEXPAND + 8 + + + + + + wxALL + 8 + + + wxALL|wxEXPAND + 8 + + + + + + wxVERTICAL + + + + + wxALL + 8 + + + + + + + bold + + + wxALL + 8 + + + + + wxVERTICAL + + + + This is available for GCC only! + + wxALL + 8 + + + wxALL|wxEXPAND + 8 + + + + + + Console Mode Application + GUI Mode Application + + + + wxALL|wxEXPAND + 8 + + + + + + Console Mode Application + GUI Mode Application + + + + wxALL|wxEXPAND + 8 + + + + + + wxVERTICAL + + + + + wxALL + 8 + + + + + wxAdvanced + wxAUI + wxGL + wxHTML + wxMedia + wxNet + wxPropertyGrid + wxQA + wxRibbon + wxRichText + wxSTC + wxWebView + wxXML + wxXRC + + + + wxALL|wxEXPAND + 8 + + + + + For static build only, needed by wxWidgets 3.1.6+ + + wxALL + 8 + + + + + + + wxVERTICAL + + + + Link with wxGL and opengl32 libraries + + wxALL + 8 + + + + + For static build only, needed by wxWidgets 3.1.6+ + + wxALL + 8 + + + + + + wxVERTICAL + + + + + wxALL + 8 + + + + 2 + 3 + 8 + 8 + 1 + + + + + wxALL + + + + wxALL|wxEXPAND + + + + + + wxALL + + + + wxALL|wxEXPAND + + + + + + wxALL + + + + wxALL|wxEXPAND + + + wxALL|wxEXPAND + 8 + + + + + + + wxVERTICAL + + + + + wxALL + 8 + + + + + + None + wxSmith (recommended) + wxFormBuilder + + + + wxALL|wxEXPAND + 8 + + + + + + Dialog Based + Frame Based + Frame Based (with sample elements, recommended) + + + + wxALL|wxEXPAND + 8 + + + + diff --git a/installers/wizard/wxwidgets/wxfb/dialog/GUIDialog.cpp b/installers/wizard/wxwidgets/wxfb/dialog/GUIDialog.cpp new file mode 100644 index 0000000..02c7c6d --- /dev/null +++ b/installers/wizard/wxwidgets/wxfb/dialog/GUIDialog.cpp @@ -0,0 +1,56 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Feb 17 2007) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif //__BORLANDC__ + +#ifndef WX_PRECOMP +#include +#endif //WX_PRECOMP + +#include "GUIDialog.h" + +/////////////////////////////////////////////////////////////////////////// +BEGIN_EVENT_TABLE( GUIDialog, wxDialog ) + EVT_CLOSE( GUIDialog::_wxFB_OnClose ) + EVT_BUTTON( idBtnAbout, GUIDialog::_wxFB_OnAbout ) + EVT_BUTTON( idBtnQuit, GUIDialog::_wxFB_OnQuit ) +END_EVENT_TABLE() + +GUIDialog::GUIDialog( wxWindow* parent, int id, wxString title, wxPoint pos, wxSize size, int style ) : wxDialog( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer1; + bSizer1 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText1 = new wxStaticText( this, wxID_ANY, wxT("Welcome To\nwxWidgets"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText1->SetFont( wxFont( 20, 74, 90, 90, false, wxT("Arial") ) ); + + bSizer1->Add( m_staticText1, 0, wxALL|wxEXPAND, 5 ); + + wxBoxSizer* bSizer2; + bSizer2 = new wxBoxSizer( wxVERTICAL ); + + BtnAbout = new wxButton( this, idBtnAbout, wxT("&About"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer2->Add( BtnAbout, 0, wxALL, 5 ); + + m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer2->Add( m_staticline1, 0, wxALL|wxEXPAND, 5 ); + + BtnQuit = new wxButton( this, idBtnQuit, wxT("&Quit"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer2->Add( BtnQuit, 0, wxALL, 5 ); + + bSizer1->Add( bSizer2, 1, wxEXPAND, 5 ); + + this->SetSizer( bSizer1 ); + this->Layout(); + bSizer1->Fit( this ); +} diff --git a/installers/wizard/wxwidgets/wxfb/dialog/GUIDialog.h b/installers/wizard/wxwidgets/wxfb/dialog/GUIDialog.h new file mode 100644 index 0000000..495f210 --- /dev/null +++ b/installers/wizard/wxwidgets/wxfb/dialog/GUIDialog.h @@ -0,0 +1,64 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Feb 17 2007) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#ifndef __GUIDialog__ +#define __GUIDialog__ + +// Define WX_GCH in order to support precompiled headers with GCC compiler. +// You have to create the header "wx_pch.h" and include all files needed +// for compile your gui inside it. +// Then, compile it and place the file "wx_pch.h.gch" into the same +// directory that "wx_pch.h". +#ifdef WX_GCH +#include +#else +#include +#endif + +#include +#include + +/////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +/// Class GUIDialog +/////////////////////////////////////////////////////////////////////////////// +class GUIDialog : public wxDialog +{ + DECLARE_EVENT_TABLE() + private: + + // Private event handlers + void _wxFB_OnClose( wxCloseEvent& event ){ OnClose( event ); } + void _wxFB_OnAbout( wxCommandEvent& event ){ OnAbout( event ); } + void _wxFB_OnQuit( wxCommandEvent& event ){ OnQuit( event ); } + + + protected: + enum + { + idBtnAbout = 1000, + idBtnQuit, + }; + + wxStaticText* m_staticText1; + wxButton* BtnAbout; + wxStaticLine* m_staticline1; + wxButton* BtnQuit; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnAbout( wxCommandEvent& event ){ event.Skip(); } + virtual void OnQuit( wxCommandEvent& event ){ event.Skip(); } + + + public: + GUIDialog( wxWindow* parent, int id = wxID_ANY, wxString title = wxT("wxWidgets Application Template"), wxPoint pos = wxDefaultPosition, wxSize size = wxDefaultSize, int style = wxDEFAULT_DIALOG_STYLE ); + +}; + +#endif //__GUIDialog__ diff --git a/installers/wizard/wxwidgets/wxfb/dialog/WxWizDialog.fbp b/installers/wizard/wxwidgets/wxfb/dialog/WxWizDialog.fbp new file mode 100644 index 0000000..a849384 --- /dev/null +++ b/installers/wizard/wxwidgets/wxfb/dialog/WxWizDialog.fbp @@ -0,0 +1,158 @@ + + + + + + C++ + UTF-8 + GUIDialog + 1000 + + 0 + MyProject + . + wx/wxprec.h + 1 + 1 + 0 + + + + 1 + + + + 0 + wxID_ANY + + + GUIDialog + + + wxDEFAULT_DIALOG_STYLE + + wxWidgets Application Template + + + + OnClose + + + + bSizer1 + wxHORIZONTAL + + 5 + wxALL|wxEXPAND + 0 + + + 1 + + Arial,90,90,20 + 0 + wxID_ANY + Welcome To wxWidgets + + + m_staticText1 + protected + + + + + + + + + + + 5 + wxEXPAND + 1 + + + bSizer2 + wxVERTICAL + + 5 + wxALL + 0 + + + 1 + + + 0 + idBtnAbout + &About + + + BtnAbout + protected + + + + + + + + OnAbout + + + + 5 + wxALL|wxEXPAND + 0 + + + 1 + + + 0 + wxID_ANY + + + m_staticline1 + protected + + + wxLI_HORIZONTAL + + + + + + + + 5 + wxALL + 0 + + + 1 + + + 0 + idBtnQuit + &Quit + + + BtnQuit + protected + + + + + + + + OnQuit + + + + + + + + diff --git a/installers/wizard/wxwidgets/wxfb/frame/GUIFrame.cpp b/installers/wizard/wxwidgets/wxfb/frame/GUIFrame.cpp new file mode 100644 index 0000000..3ef1e32 --- /dev/null +++ b/installers/wizard/wxwidgets/wxfb/frame/GUIFrame.cpp @@ -0,0 +1,45 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Feb 17 2007) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif //__BORLANDC__ + +#ifndef WX_PRECOMP +#include +#endif //WX_PRECOMP + +#include "GUIFrame.h" + +/////////////////////////////////////////////////////////////////////////// +BEGIN_EVENT_TABLE( GUIFrame, wxFrame ) + EVT_CLOSE( GUIFrame::_wxFB_OnClose ) + EVT_MENU( idMenuQuit, GUIFrame::_wxFB_OnQuit ) + EVT_MENU( idMenuAbout, GUIFrame::_wxFB_OnAbout ) +END_EVENT_TABLE() + +GUIFrame::GUIFrame( wxWindow* parent, int id, wxString title, wxPoint pos, wxSize size, int style ) : wxFrame( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + mbar = new wxMenuBar( 0 ); + wxMenu* fileMenu; + fileMenu = new wxMenu(); + wxMenuItem* menuFileQuit = new wxMenuItem( fileMenu, idMenuQuit, wxString( wxT("&Quit") ) + wxT('\t') + wxT("Alt+F4"), wxT("Quit the application"), wxITEM_NORMAL ); + fileMenu->Append( menuFileQuit ); + mbar->Append( fileMenu, wxT("&File") ); + wxMenu* helpMenu; + helpMenu = new wxMenu(); + wxMenuItem* menuHelpAbout = new wxMenuItem( helpMenu, idMenuAbout, wxString( wxT("&About") ) + wxT('\t') + wxT("F1"), wxT("Show info about this application"), wxITEM_NORMAL ); + helpMenu->Append( menuHelpAbout ); + mbar->Append( helpMenu, wxT("&Help") ); + this->SetMenuBar( mbar ); + + statusBar = this->CreateStatusBar( 2, wxST_SIZEGRIP, wxID_ANY ); +} diff --git a/installers/wizard/wxwidgets/wxfb/frame/GUIFrame.h b/installers/wizard/wxwidgets/wxfb/frame/GUIFrame.h new file mode 100644 index 0000000..de5e087 --- /dev/null +++ b/installers/wizard/wxwidgets/wxfb/frame/GUIFrame.h @@ -0,0 +1,58 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Feb 17 2007) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#ifndef __GUIFrame__ +#define __GUIFrame__ + +// Define WX_GCH in order to support precompiled headers with GCC compiler. +// You have to create the header "wx_pch.h" and include all files needed +// for compile your gui inside it. +// Then, compile it and place the file "wx_pch.h.gch" into the same +// directory that "wx_pch.h". +#ifdef WX_GCH +#include +#else +#include +#endif + +#include + +/////////////////////////////////////////////////////////////////////////// + +#define idMenuQuit 1000 +#define idMenuAbout 1001 + +/////////////////////////////////////////////////////////////////////////////// +/// Class GUIFrame +/////////////////////////////////////////////////////////////////////////////// +class GUIFrame : public wxFrame +{ + DECLARE_EVENT_TABLE() + private: + + // Private event handlers + void _wxFB_OnClose( wxCloseEvent& event ){ OnClose( event ); } + void _wxFB_OnQuit( wxCommandEvent& event ){ OnQuit( event ); } + void _wxFB_OnAbout( wxCommandEvent& event ){ OnAbout( event ); } + + + protected: + wxMenuBar* mbar; + wxStatusBar* statusBar; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnQuit( wxCommandEvent& event ){ event.Skip(); } + virtual void OnAbout( wxCommandEvent& event ){ event.Skip(); } + + + public: + GUIFrame( wxWindow* parent, int id = wxID_ANY, wxString title = wxT("wxWidgets Application Template"), wxPoint pos = wxDefaultPosition, wxSize size = wxSize( 481,466 ), int style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL ); + +}; + +#endif //__GUIFrame__ diff --git a/installers/wizard/wxwidgets/wxfb/frame/WxWizFrame.fbp b/installers/wizard/wxwidgets/wxfb/frame/WxWizFrame.fbp new file mode 100644 index 0000000..5e61913 --- /dev/null +++ b/installers/wizard/wxwidgets/wxfb/frame/WxWizFrame.fbp @@ -0,0 +1,117 @@ + + + + + + C++ + UTF-8 + GUIFrame + 1000 + + 0 + MyProject + . + wx/wxprec.h + 1 + 0 + 0 + + + + 1 + + + + 0 + wxID_ANY + + + GUIFrame + + 481,466 + wxDEFAULT_FRAME_STYLE + + wxWidgets Application Template + + + wxTAB_TRAVERSAL + 1 + OnClose + + + + 1 + + + 0 + wxID_ANY + + + + mbar + protected + + + + + + + + + &File + fileMenu + + + 0 + 1 + Quit the application + idMenuQuit + wxITEM_NORMAL + &Quit + menuFileQuit + Alt+F4 + + OnQuit + + + + &Help + helpMenu + + + 0 + 1 + Show info about this application + idMenuAbout + wxITEM_NORMAL + &About + menuHelpAbout + F1 + + OnAbout + + + + + + 1 + + 2 + + 0 + wxID_ANY + + + statusBar + protected + + + wxST_SIZEGRIP + + + + + + + + diff --git a/installers/wizard/wxwidgets/wxsmith/app.cpp b/installers/wizard/wxwidgets/wxsmith/app.cpp new file mode 100644 index 0000000..dd5b9f0 --- /dev/null +++ b/installers/wizard/wxwidgets/wxsmith/app.cpp @@ -0,0 +1,23 @@ +/*************************************************************** + * Name: [FILENAME_PREFIX]App.cpp + * Purpose: Code for Application Class + * Author: [AUTHOR_NAME] ([AUTHOR_EMAIL]) + * Created: [NOW] + * Copyright: [AUTHOR_NAME] ([AUTHOR_WWW]) + * License: + **************************************************************/ + +[PCH_INCLUDE]#include "[FILENAME_PREFIX]App.h" + +//(*AppHeaders +//*) + +IMPLEMENT_APP([CLASS_PREFIX]App); + +bool [CLASS_PREFIX]App::OnInit() +{ + //(*AppInitialize + //*) + return wxsOK; + +} diff --git a/installers/wizard/wxwidgets/wxsmith/main.cpp b/installers/wizard/wxwidgets/wxsmith/main.cpp new file mode 100644 index 0000000..820481c --- /dev/null +++ b/installers/wizard/wxwidgets/wxsmith/main.cpp @@ -0,0 +1,100 @@ +/*************************************************************** + * Name: [FILENAME_PREFIX]Main.cpp + * Purpose: Code for Application Frame + * Author: [AUTHOR_NAME] ([AUTHOR_EMAIL]) + * Created: [NOW] + * Copyright: [AUTHOR_NAME] ([AUTHOR_WWW]) + * License: + **************************************************************/ + +[PCH_INCLUDE]#include "[FILENAME_PREFIX]Main.h" +#include + +//(*InternalHeaders([CLASS_PREFIX][IF WXFRAME]Frame[ENDIF WXFRAME][IF WXDIALOG]Dialog[ENDIF WXDIALOG]) +//*) + +//helper functions +enum wxbuildinfoformat { + short_f, long_f }; + +wxString wxbuildinfo(wxbuildinfoformat format) +{ + wxString wxbuild(wxVERSION_STRING); + + if (format == long_f ) + { +#if defined(__WXMSW__) + wxbuild << _T("-Windows"); +#elif defined(__UNIX__) + wxbuild << _T("-Linux"); +#endif + +#if wxUSE_UNICODE + wxbuild << _T("-Unicode build"); +#else + wxbuild << _T("-ANSI build"); +#endif // wxUSE_UNICODE + } + + return wxbuild; +} + +[IF WXFRAME]//(*IdInit([CLASS_PREFIX]Frame) +//*) + +BEGIN_EVENT_TABLE([CLASS_PREFIX]Frame,wxFrame) + //(*EventTable([CLASS_PREFIX]Frame) + //*) +END_EVENT_TABLE() + +[CLASS_PREFIX]Frame::[CLASS_PREFIX]Frame(wxWindow* parent,wxWindowID id) +{ + //(*Initialize([CLASS_PREFIX]Frame) + //*) +} + +[CLASS_PREFIX]Frame::~[CLASS_PREFIX]Frame() +{ + //(*Destroy([CLASS_PREFIX]Frame) + //*) +} + +void [CLASS_PREFIX]Frame::OnQuit(wxCommandEvent& event) +{ + Close(); +} + +void [CLASS_PREFIX]Frame::OnAbout(wxCommandEvent& event) +{ + wxString msg = wxbuildinfo(long_f); + wxMessageBox(msg, _("Welcome to...")); +}[ENDIF WXFRAME][IF WXDIALOG]//(*IdInit([CLASS_PREFIX]Dialog) +//*) + +BEGIN_EVENT_TABLE([CLASS_PREFIX]Dialog,wxDialog) + //(*EventTable([CLASS_PREFIX]Dialog) + //*) +END_EVENT_TABLE() + +[CLASS_PREFIX]Dialog::[CLASS_PREFIX]Dialog(wxWindow* parent,wxWindowID id) +{ + //(*Initialize([CLASS_PREFIX]Dialog) + //*) +} + +[CLASS_PREFIX]Dialog::~[CLASS_PREFIX]Dialog() +{ + //(*Destroy([CLASS_PREFIX]Dialog) + //*) +} + +void [CLASS_PREFIX]Dialog::OnQuit(wxCommandEvent& event) +{ + Close(); +} + +void [CLASS_PREFIX]Dialog::OnAbout(wxCommandEvent& event) +{ + wxString msg = wxbuildinfo(long_f); + wxMessageBox(msg, _("Welcome to...")); +}[ENDIF WXDIALOG] diff --git a/installers/wizard/wxwidgets/wxsmith/main.h b/installers/wizard/wxwidgets/wxsmith/main.h new file mode 100644 index 0000000..df55c37 --- /dev/null +++ b/installers/wizard/wxwidgets/wxsmith/main.h @@ -0,0 +1,65 @@ +/*************************************************************** + * Name: [FILENAME_PREFIX]Main.h + * Purpose: Defines Application Frame + * Author: [AUTHOR_NAME] ([AUTHOR_EMAIL]) + * Created: [NOW] + * Copyright: [AUTHOR_NAME] ([AUTHOR_WWW]) + * License: + **************************************************************/ + +#ifndef [PROJECT_HDR]MAIN_H +#define [PROJECT_HDR]MAIN_H + +[IF WXFRAME]//(*Headers([CLASS_PREFIX]Frame) +//*) + +class [CLASS_PREFIX]Frame: public wxFrame +{ + public: + + [CLASS_PREFIX]Frame(wxWindow* parent,wxWindowID id = -1); + virtual ~[CLASS_PREFIX]Frame(); + + private: + + //(*Handlers([CLASS_PREFIX]Frame) + void OnQuit(wxCommandEvent& event); + void OnAbout(wxCommandEvent& event); + //*) + + //(*Identifiers([CLASS_PREFIX]Frame) + //*) + + //(*Declarations([CLASS_PREFIX]Frame) + //*) + + DECLARE_EVENT_TABLE() +};[ENDIF WXFRAME][IF WXDIALOG]//(*Headers([CLASS_PREFIX]Dialog) +//*) + +class [CLASS_PREFIX]Dialog: public wxDialog +{ + public: + + [CLASS_PREFIX]Dialog(wxWindow* parent,wxWindowID id = -1); + virtual ~[CLASS_PREFIX]Dialog(); + + private: + + //(*Handlers([CLASS_PREFIX]Dialog) + void OnQuit(wxCommandEvent& event); + void OnAbout(wxCommandEvent& event); + //*) + + //(*Identifiers([CLASS_PREFIX]Dialog) + + //*) + + //(*Declarations([CLASS_PREFIX]Dialog) + + //*) + + DECLARE_EVENT_TABLE() +};[ENDIF WXDIALOG] + +#endif // [PROJECT_HDR]MAIN_H diff --git a/installers/wizard/wxwidgets/wxsmith/main_s.cpp b/installers/wizard/wxwidgets/wxsmith/main_s.cpp new file mode 100644 index 0000000..8507c72 --- /dev/null +++ b/installers/wizard/wxwidgets/wxsmith/main_s.cpp @@ -0,0 +1,107 @@ +/*************************************************************** + * Name: [FILENAME_PREFIX]Main.cpp + * Purpose: Code for Application Frame + * Author: [AUTHOR_NAME] ([AUTHOR_EMAIL]) + * Created: [NOW] + * Copyright: [AUTHOR_NAME] ([AUTHOR_WWW]) + * License: + **************************************************************/ + +[PCH_INCLUDE]#include "[FILENAME_PREFIX]Main.h" +#include + +//(*InternalHeaders([CLASS_PREFIX][IF WXFRAME]Frame[ENDIF WXFRAME][IF WXDIALOG]Dialog[ENDIF WXDIALOG]) +//*) + +//helper functions +enum wxbuildinfoformat { + short_f, long_f }; + +wxString wxbuildinfo(wxbuildinfoformat format) +{ + wxString wxbuild(wxVERSION_STRING); + + if (format == long_f ) + { +#if defined(__WXMSW__) + wxbuild << _T("-Windows"); +#elif defined(__UNIX__) + wxbuild << _T("-Linux"); +#endif + +#if wxUSE_UNICODE + wxbuild << _T("-Unicode build"); +#else + wxbuild << _T("-ANSI build"); +#endif // wxUSE_UNICODE + } + + return wxbuild; +} + +[IF WXFRAME]//(*IdInit([CLASS_PREFIX]Frame) +//*) + +BEGIN_EVENT_TABLE([CLASS_PREFIX]Frame,wxFrame) + //(*EventTable([CLASS_PREFIX]Frame) + //*) +END_EVENT_TABLE() + +[CLASS_PREFIX]Frame::[CLASS_PREFIX]Frame(wxWindow* parent,wxWindowID id) +{ + //(*Initialize([CLASS_PREFIX]Frame) + //*) +} + +[CLASS_PREFIX]Frame::~[CLASS_PREFIX]Frame() +{ + //(*Destroy([CLASS_PREFIX]Frame) + //*) +} + +void [CLASS_PREFIX]Frame::OnQuit(wxCommandEvent& event) +{ + Close(); +} + +void [CLASS_PREFIX]Frame::OnAbout(wxCommandEvent& event) +{ + wxString msg = wxbuildinfo(long_f); + wxMessageBox(msg, _("Welcome to...")); +} + +void [CLASS_PREFIX]Frame::OnButton1Click(wxCommandEvent& event) +{ + // Show message box with contents of TextCtrl1 + wxMessageBox(TextCtrl1->GetValue()); +} +[ENDIF WXFRAME][IF WXDIALOG]//(*IdInit([CLASS_PREFIX]Dialog) +//*) + +BEGIN_EVENT_TABLE([CLASS_PREFIX]Dialog,wxDialog) + //(*EventTable([CLASS_PREFIX]Dialog) + //*) +END_EVENT_TABLE() + +[CLASS_PREFIX]Dialog::[CLASS_PREFIX]Dialog(wxWindow* parent,wxWindowID id) +{ + //(*Initialize([CLASS_PREFIX]Dialog) + //*) +} + +[CLASS_PREFIX]Dialog::~[CLASS_PREFIX]Dialog() +{ + //(*Destroy([CLASS_PREFIX]Dialog) + //*) +} + +void [CLASS_PREFIX]Dialog::OnQuit(wxCommandEvent& event) +{ + Close(); +} + +void [CLASS_PREFIX]Dialog::OnAbout(wxCommandEvent& event) +{ + wxString msg = wxbuildinfo(long_f); + wxMessageBox(msg, _("Welcome to...")); +}[ENDIF WXDIALOG] diff --git a/installers/wizard/wxwidgets/wxsmith/main_s.h b/installers/wizard/wxwidgets/wxsmith/main_s.h new file mode 100644 index 0000000..37fefac --- /dev/null +++ b/installers/wizard/wxwidgets/wxsmith/main_s.h @@ -0,0 +1,66 @@ +/*************************************************************** + * Name: [FILENAME_PREFIX]Main.h + * Purpose: Defines Application Frame + * Author: [AUTHOR_NAME] ([AUTHOR_EMAIL]) + * Created: [NOW] + * Copyright: [AUTHOR_NAME] ([AUTHOR_WWW]) + * License: + **************************************************************/ + +#ifndef [PROJECT_HDR]MAIN_H +#define [PROJECT_HDR]MAIN_H + +[IF WXFRAME]//(*Headers([CLASS_PREFIX]Frame) +//*) + +class [CLASS_PREFIX]Frame: public wxFrame +{ + public: + + [CLASS_PREFIX]Frame(wxWindow* parent,wxWindowID id = -1); + virtual ~[CLASS_PREFIX]Frame(); + + private: + + //(*Handlers([CLASS_PREFIX]Frame) + void OnQuit(wxCommandEvent& event); + void OnAbout(wxCommandEvent& event); + void OnButton1Click(wxCommandEvent& event); + //*) + + //(*Identifiers([CLASS_PREFIX]Frame) + //*) + + //(*Declarations([CLASS_PREFIX]Frame) + //*) + + DECLARE_EVENT_TABLE() +};[ENDIF WXFRAME][IF WXDIALOG]//(*Headers([CLASS_PREFIX]Dialog) +//*) + +class [CLASS_PREFIX]Dialog: public wxDialog +{ + public: + + [CLASS_PREFIX]Dialog(wxWindow* parent,wxWindowID id = -1); + virtual ~[CLASS_PREFIX]Dialog(); + + private: + + //(*Handlers([CLASS_PREFIX]Dialog) + void OnQuit(wxCommandEvent& event); + void OnAbout(wxCommandEvent& event); + //*) + + //(*Identifiers([CLASS_PREFIX]Dialog) + + //*) + + //(*Declarations([CLASS_PREFIX]Dialog) + + //*) + + DECLARE_EVENT_TABLE() +};[ENDIF WXDIALOG] + +#endif // [PROJECT_HDR]MAIN_H diff --git a/installers/wizard/wxwidgets/wxsmith/resource.wxs b/installers/wizard/wxwidgets/wxsmith/resource.wxs new file mode 100644 index 0000000..1fa4234 --- /dev/null +++ b/installers/wizard/wxwidgets/wxsmith/resource.wxs @@ -0,0 +1,78 @@ + + + [IF WXDIALOG] + wxWidgets app + + + + + + 20 + wxSYS_DEFAULT_GUI_FONT + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 10 + + + + + wxVERTICAL + + + + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 4 + + + + + 10,-1 + + wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 4 + + + + + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 4 + + + + wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 4 + + + [ENDIF WXDIALOG][IF WXFRAME] + + + + + + Alt-F4 + Quit the application + + + + + + + + F1 + Show info about this application + + + + + + 1 + -1 + wxSB_NORMAL + + [ENDIF WXFRAME] + diff --git a/installers/wizard/wxwidgets/wxsmith/resource_s.wxs b/installers/wizard/wxwidgets/wxsmith/resource_s.wxs new file mode 100644 index 0000000..aca5f87 --- /dev/null +++ b/installers/wizard/wxwidgets/wxsmith/resource_s.wxs @@ -0,0 +1,142 @@ + + + [IF WXDIALOG] + wxWidgets app + + + + + + 20 + wxSYS_DEFAULT_GUI_FONT + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 10 + + + + + wxVERTICAL + + + + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 4 + + + + + 10,-1 + + wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 4 + + + + + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 4 + + + + wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 4 + + + [ENDIF WXDIALOG][IF WXFRAME] + wxSYS_COLOUR_BTNFACE + 200,200 + // This code will set a smaller font if Win 3.11 is detected: int majorVer; int minorVer; wxGetOsVersion(&majorVer, &minorVer); if (minorVer == 30 || majorVer == 30 || majorVer == 3) { wxFont thisFont(8,wxFONTFAMILY__DEFAULT,wxFONTSTYLE__NORMAL,wxFONTWEIGHT__NORMAL,false,wxEmptyString,wxFONTENCODING__DEFAULT); SetFont(thisFont); } + 0 + + + + + 286,334 + + wxVERTICAL + + + + + + + + How to create a scalable window with working sizers: A wxBoxSizer (BoxSizer1) is placed as the first element on the wxFrame. Then, a wxPanel (Panel1) is placed onto the sizer. "Expand" is selected, "Border width" is set to 0. The panel will fill the entire sizer. The panel size can be increased by dragging the corner, or typing "Width" and "Height" parameters. A minimum size can be forced by unchecking "Default Min size" and specifying the size. BoxSizer2 is placed onto the Panel1. Option wxVERTICAL is selected. Then, a wxNotebook (Notebook1) and Panel2 are placed onto the BoxSizer2. Option "Expand" is selected for both the Panel2 and Notebook1. Now each of these elements will take half of the space in the window and they will be arranged vertically. BoxSizer3 is added onto the Panel2. Orientation wxHORIZONTAL is selected. Then a wxTextCtrl (TextCtrl1) and wxButton (Button1) is placed onto BoxSizer3. Now the text control and the button will be arranged horizontally and will take half of the panel space. They will not use the entire height of the panel, because "Expand" property is not selected. Button1 can be made smaller by setting "Proportion" property to 0. Now the button will have the default size and will not be scaled. TextCtrl1 has "Proportion" set to 1 and it will take entire available horizontal space. "Proportion" is set to 0 for Panel2. Now the panel will be shrunk vertically and will have the same height as the button and the text control. A new page is added into Notebook1 by clicking right mouse button - Add New Page. Panel3 is created automatically. BoxSizer4 is added onto Panel3. TextCtrl2 is added onto BoxSizer4. "Expand" property is checked. Now the text box will fill the entire page of the wxNotebook. Style wxTE__MULTILINE is selected to enable multiline text. NOTES FOR WIN 3.11 COMPATIBILITY: =============================== wxBORDER__SIMPLE style needs to be applied to text controls, otherwise there will be no border visible. Also, Font type: Custom font, Size: 8 may be selected to have smaller fonts under Win 3.11. This can be changed globally, by editing the "Font" property for entire wxFrame. OR, if you want the proper font to be determined on the runtime, then don't change the "Font" property manually, instead add the following code into "Extra code" property of the wxFrame: // This code will set a smaller font if Win 3.11 is detected: int majorVer; int minorVer; wxGetOsVersion(&majorVer, &minorVer); if (minorVer == 30 || majorVer == 30 || majorVer == 3) { wxFont thisFont(8,wxFONTFAMILY__DEFAULT,wxFONTSTYLE__NORMAL,wxFONTWEIGHT__NORMAL,false,wxEmptyString,wxFONTENCODING__DEFAULT); SetFont(thisFont); } The "Background" of the wxFrame can be also changed to "Face of button" for better color consistency. Also, wxFULL__REPAINT__ON__RESIZE style has been checked on wxFrame to fix incomplete window refresh after resizing under Win 3.11. + + + wxALL|wxEXPAND + 5 + + + + + + + + wxALL|wxEXPAND + 5 + + + + + + + + Click the button to popup this message + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + + + + + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + + + wxALL|wxEXPAND + + + + wxALL|wxEXPAND + + + + + + + + + Alt-F4 + Quit the application + + + + + + + + F1 + Show info about this application + + + + + + 1 + -1 + wxSB_NORMAL + + [ENDIF WXFRAME] +