]> git.saurik.com Git - wxWidgets.git/blobdiff - utils/emulator/src/emulator.cpp
wxMessageBox off the main thread lost result code.
[wxWidgets.git] / utils / emulator / src / emulator.cpp
index ccc15aa3ea3f86f860baba766eceeac8b60e57da..74a2a832b908343a3e39206b961a2fad63c01997 100644 (file)
@@ -1,10 +1,9 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        emulator.cpp
-// Purpose:     Emulator wxWindows sample
+// Purpose:     Emulator wxWidgets sample
 // Author:      Julian Smart
 // Modified by:
 // Created:     04/01/98
-// RCS-ID:      $Id$
 // Copyright:   (c) Julian Smart
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 // declarations
 // ============================================================================
 
-#ifdef __GNUG__
-    #pragma implementation "emulator.h"
-#endif
-
 // ----------------------------------------------------------------------------
 // headers
 // ----------------------------------------------------------------------------
@@ -29,7 +24,7 @@
 #endif
 
 // for all others, include the necessary headers (this file is usually all you
-// need because it includes almost all "standard" wxWindows headers)
+// need because it includes almost all "standard" wxWidgets headers)
 #ifndef WX_PRECOMP
     #include "wx/wx.h"
 #endif
 #include "wx/confbase.h"
 #include "wx/fileconf.h"
 #include "wx/cmdline.h"
+#include "wx/image.h"
+#include "wx/file.h"
+#include "wx/filename.h"
 
-#ifdef __WXX11__    
+#ifdef __WXX11__
 #include "wx/x11/reparent.h"
 #endif
 
 // ----------------------------------------------------------------------------
 
 // the application icon (under Windows and OS/2 it is in resources)
-#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXMGL__) || defined(__WXX11__)
+#ifndef wxHAS_IMAGES_IN_RESOURCES
     #include "emulator.xpm"
 #endif
 
 // ----------------------------------------------------------------------------
-// event tables and other macros for wxWindows
+// event tables and other macros for wxWidgets
 // ----------------------------------------------------------------------------
 
-// the event tables connect the wxWindows events with the functions (event
+// the event tables connect the wxWidgets events with the functions (event
 // handlers) which process them. It can be also done at run-time, but for the
 // simple menu events like this the static method is much simpler.
 BEGIN_EVENT_TABLE(wxEmulatorFrame, wxFrame)
     EVT_MENU(Emulator_Quit,  wxEmulatorFrame::OnQuit)
     EVT_MENU(Emulator_About, wxEmulatorFrame::OnAbout)
+    EVT_CLOSE(wxEmulatorFrame::OnCloseWindow)
 END_EVENT_TABLE()
 
-// Create a new application object: this macro will allow wxWindows to create
+// Create a new application object: this macro will allow wxWidgets to create
 // the application object during program execution (it's better than using a
 // static object for many reasons) and also declares the accessor function
 // wxGetApp() which will return the reference of the right type (i.e. wxEmulatorApp and
@@ -74,14 +73,14 @@ IMPLEMENT_APP(wxEmulatorApp)
 
 static const wxCmdLineEntryDesc sg_cmdLineDesc[] =
 {
-    { wxCMD_LINE_OPTION, "u", "use-display",   "display number to use (default 100)" },
+    { wxCMD_LINE_OPTION, "u", "use-display", "display number to use (default 100)" },
 
-    { wxCMD_LINE_SWITCH, "h", "help",   "displays help on the command line parameters" },
-    { wxCMD_LINE_SWITCH, "v", "version",    "print version" },
+    { wxCMD_LINE_SWITCH, "h", "help", "displays help on the command line parameters" },
+    { wxCMD_LINE_SWITCH, "v", "version", "print version" },
 
     { wxCMD_LINE_PARAM,  NULL, NULL, "config file 1", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL },
 
-    { wxCMD_LINE_NONE }
+    wxCMD_LINE_DESC_END
 };
 
 
@@ -98,24 +97,29 @@ wxEmulatorApp::wxEmulatorApp()
     m_xnestWindow = NULL;
     m_containerWindow = NULL;
     m_displayNumber = wxT("100");
+    m_xnestPID = 0;
+
 }
 
 // 'Main program' equivalent: the program execution "starts" here
 bool wxEmulatorApp::OnInit()
 {
+#if wxUSE_LOG
+    wxLog::DisableTimestamp();
+#endif // wxUSE_LOG
     wxInitAllImageHandlers();
 
     wxString currentDir = wxGetCwd();
 
     // Use argv to get current app directory
     m_appDir = wxFindAppPath(argv[0], currentDir, wxT("WXEMUDIR"));
-    
+
     // If the development version, go up a directory.
 #ifdef __WXMSW__
-    if ((m_appDir.Right(5).CmpNoCase("DEBUG") == 0) ||
-        (m_appDir.Right(11).CmpNoCase("DEBUGSTABLE") == 0) ||
-        (m_appDir.Right(7).CmpNoCase("RELEASE") == 0) ||
-        (m_appDir.Right(13).CmpNoCase("RELEASESTABLE") == 0)
+    if ((m_appDir.Right(5).CmpNoCase(wxT("DEBUG")) == 0) ||
+        (m_appDir.Right(11).CmpNoCase(wxT("DEBUGSTABLE")) == 0) ||
+        (m_appDir.Right(7).CmpNoCase(wxT("RELEASE")) == 0) ||
+        (m_appDir.Right(13).CmpNoCase(wxT("RELEASESTABLE")) == 0)
         )
         m_appDir = wxPathOnly(m_appDir);
 #endif
@@ -133,7 +137,7 @@ bool wxEmulatorApp::OnInit()
         wxLog::SetActiveTarget(new wxLogStderr);
 #endif
         parser.Usage();
-        return FALSE;
+        return false;
     }
     if (parser.Found(wxT("v")))
     {
@@ -141,9 +145,9 @@ bool wxEmulatorApp::OnInit()
         wxLog::SetActiveTarget(new wxLogStderr);
 #endif
         wxString msg;
-        msg.Printf(wxT("wxWindows PDA Emulator (c) Julian Smart, 2002 Version %.2f, %s"), wxEMULATOR_VERSION, __DATE__);
+        msg.Printf(wxT("wxWidgets PDA Emulator (c) Julian Smart, 2002 Version %.2f, %s"), wxEMULATOR_VERSION, __DATE__);
         wxLogMessage(msg);
-        return FALSE;
+        return false;
     }
     if (parser.Found(wxT("u"), & m_displayNumber))
     {
@@ -167,61 +171,64 @@ bool wxEmulatorApp::OnInit()
     if (!LoadEmulator(m_appDir))
     {
         //wxMessageBox(wxT("Sorry, could not load this emulator. Please check bitmaps are valid."));
-        return FALSE;        
+        return false;
     }
-    
+
     // create the main application window
-    wxEmulatorFrame *frame = new wxEmulatorFrame(_T("wxEmulator"),
+    wxEmulatorFrame *frame = new wxEmulatorFrame(wxT("wxEmulator"),
                                  wxPoint(50, 50), wxSize(450, 340));
-                                
+
+#if wxUSE_STATUSBAR
     frame->SetStatusText(m_emulatorInfo.m_emulatorTitle, 0);
 
     wxString sizeStr;
     sizeStr.Printf(wxT("Screen: %dx%d"), (int) m_emulatorInfo.m_emulatorScreenSize.x,
             (int) m_emulatorInfo.m_emulatorScreenSize.y);
     frame->SetStatusText(sizeStr, 1);
+#endif // wxUSE_STATUSBAR
 
-    m_containerWindow = new wxEmulatorContainer(frame, -1);
+    m_containerWindow = new wxEmulatorContainer(frame, wxID_ANY);
 
     frame->SetClientSize(m_emulatorInfo.m_emulatorDeviceSize.x,
                          m_emulatorInfo.m_emulatorDeviceSize.y);
-    
+
     // and show it (the frames, unlike simple controls, are not shown when
     // created initially)
-    frame->Show(TRUE);
-    
-#ifdef __WXX11__    
+    frame->Show(true);
+
+#ifdef __WXX11__
     m_xnestWindow = new wxAdoptedWindow;
 
     wxString cmd;
-    cmd.Printf(wxT("Xnest %s -geometry %dx%d"),
+    cmd.Printf(wxT("Xnest :%s -geometry %dx%d"),
         m_displayNumber.c_str(),
         (int) m_emulatorInfo.m_emulatorScreenSize.x,
         (int) m_emulatorInfo.m_emulatorScreenSize.y);
 
-    // Asynchronously executes Xnest    
-    if (0 == wxExecute(cmd))
+    // Asynchronously executes Xnest
+    m_xnestPID = wxExecute(cmd);
+    if (0 == m_xnestPID)
     {
         frame->Destroy();
         wxMessageBox(wxT("Sorry, could not run Xnest. Please check your PATH."));
-        return FALSE;
+        return false;
     }
-    
+
     wxReparenter reparenter;
     if (!reparenter.WaitAndReparent(m_containerWindow, m_xnestWindow, wxT("Xnest")))
     {
         wxMessageBox(wxT("Sorry, could not reparent Xnest.."));
         frame->Destroy();
-        return FALSE;
+        return false;
     }
 
 #endif
     m_containerWindow->DoResize();
 
     // success: wxApp::OnRun() will be called which will enter the main message
-    // loop and the application will run. If we returned FALSE here, the
+    // loop and the application will run. If we returned false here, the
     // application would exit immediately.
-    return TRUE;
+    return true;
 }
 
 // Prepend the current program directory to the name
@@ -235,7 +242,7 @@ wxString wxEmulatorApp::GetFullAppPath(const wxString& filename) const
         path += '\\';
 #endif
     path += filename;
-    
+
     return path;
 }
 
@@ -253,8 +260,9 @@ bool wxEmulatorApp::LoadEmulator(const wxString& appDir)
 // ----------------------------------------------------------------------------
 
 // frame constructor
-wxEmulatorFrame::wxEmulatorFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
-       : wxFrame(NULL, -1, title, pos, size)
+wxEmulatorFrame::wxEmulatorFrame(const wxString& title,
+    const wxPoint& pos, const wxSize& size)
+    : wxFrame(NULL, wxID_ANY, title, pos, size)
 {
     // set the frame icon
     SetIcon(wxICON(emulator));
@@ -265,14 +273,14 @@ wxEmulatorFrame::wxEmulatorFrame(const wxString& title, const wxPoint& pos, cons
 
     // the "About" item should be in the help menu
     wxMenu *helpMenu = new wxMenu;
-    helpMenu->Append(Emulator_About, _T("&About...\tF1"), _T("Show about dialog"));
+    helpMenu->Append(Emulator_About, wxT("&About\tF1"), wxT("Show about dialog"));
 
-    menuFile->Append(Emulator_Quit, _T("E&xit\tAlt-X"), _T("Quit this program"));
+    menuFile->Append(Emulator_Quit, wxT("E&xit\tAlt-X"), wxT("Quit this program"));
 
     // now append the freshly created menu to the menu bar...
     wxMenuBar *menuBar = new wxMenuBar();
-    menuBar->Append(menuFile, _T("&File"));
-    menuBar->Append(helpMenu, _T("&Help"));
+    menuBar->Append(menuFile, wxT("&File"));
+    menuBar->Append(helpMenu, wxT("&Help"));
 
     // ... and attach this menu bar to the frame
     SetMenuBar(menuBar);
@@ -289,16 +297,32 @@ wxEmulatorFrame::wxEmulatorFrame(const wxString& title, const wxPoint& pos, cons
 
 void wxEmulatorFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
 {
-    // TRUE is to force the frame to close
-    Close(TRUE);
+    // true is to force the frame to close
+    Close(true);
 }
 
 void wxEmulatorFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
 {
     wxString msg;
-    msg.Printf( _T("wxEmulator is an environment for testing embedded X11 apps.\n"));
+    msg.Printf( wxT("wxEmulator is an environment for testing embedded X11 apps.\n"));
+
+    wxMessageBox(msg, wxT("About wxEmulator"), wxOK | wxICON_INFORMATION, this);
+}
 
-    wxMessageBox(msg, _T("About wxEmulator"), wxOK | wxICON_INFORMATION, this);
+void wxEmulatorFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
+{
+#ifdef __WXX11__
+    if (wxGetApp().m_xnestWindow)
+    {
+        wxGetApp().m_xnestWindow->SetHandle((WXWindow) NULL);
+    }
+#endif
+    this->Destroy();
+    if (wxGetApp().m_xnestPID > 0)
+    {
+        wxKill(wxGetApp().m_xnestPID);
+        wxGetApp().m_xnestPID = 0;
+    }
 }
 
 IMPLEMENT_CLASS(wxEmulatorContainer, wxWindow)
@@ -314,7 +338,7 @@ wxEmulatorContainer::wxEmulatorContainer(wxWindow* parent, wxWindowID id):
 {
 }
 
-void wxEmulatorContainer::OnSize(wxSizeEvent& event)
+void wxEmulatorContainer::OnSize(wxSizeEvent& WXUNUSED(event))
 {
     DoResize();
 }
@@ -322,43 +346,47 @@ void wxEmulatorContainer::OnSize(wxSizeEvent& event)
 void wxEmulatorContainer::DoResize()
 {
     wxSize sz = GetClientSize();
-    if (wxGetApp().m_xnestWindow)
+    if (wxGetApp().m_xnestWindow
+#ifdef __WXX11__
+        && wxGetApp().m_xnestWindow->X11GetMainWindow()
+#endif
+        )
     {
         int deviceWidth = wxGetApp().m_emulatorInfo.m_emulatorDeviceSize.x;
         int deviceHeight = wxGetApp().m_emulatorInfo.m_emulatorDeviceSize.y;
-        
+
         int x = wxMax(0, (int) ((sz.x - deviceWidth)/2.0));
         int y = wxMax(0, (int) ((sz.y - deviceHeight)/2.0));
-        
+
         x += wxGetApp().m_emulatorInfo.m_emulatorScreenPosition.x;
         y += wxGetApp().m_emulatorInfo.m_emulatorScreenPosition.y;
-        
+
         wxGetApp().m_xnestWindow->Move(x, y);
     }
     Refresh();
 }
 
-void wxEmulatorContainer::OnPaint(wxPaintEvent& event)
+void wxEmulatorContainer::OnPaint(wxPaintEvent& WXUNUSED(event))
 {
     wxPaintDC dc(this);
-    
+
     wxSize sz = GetClientSize();
-    if (wxGetApp().m_emulatorInfo.m_emulatorBackgroundBitmap.Ok())
+    if (wxGetApp().m_emulatorInfo.m_emulatorBackgroundBitmap.IsOk())
     {
         int deviceWidth = wxGetApp().m_emulatorInfo.m_emulatorDeviceSize.x;
         int deviceHeight = wxGetApp().m_emulatorInfo.m_emulatorDeviceSize.y;
-        
+
         int x = wxMax(0, (int) ((sz.x - deviceWidth)/2.0));
         int y = wxMax(0, (int) ((sz.y - deviceHeight)/2.0));
-        
+
         dc.DrawBitmap(wxGetApp().m_emulatorInfo.m_emulatorBackgroundBitmap, x, y);
     }
 }
 
 void wxEmulatorContainer::OnEraseBackground(wxEraseEvent& event)
 {
-    wxDC* dc = NULL;
-    
+    wxDC* dc wxDUMMY_INITIALIZE(NULL);
+
     if (event.GetDC())
     {
         dc = event.GetDC();
@@ -367,10 +395,10 @@ void wxEmulatorContainer::OnEraseBackground(wxEraseEvent& event)
     {
         dc = new wxClientDC(this);
     }
-    
+
     dc->SetBackground(wxBrush(wxGetApp().m_emulatorInfo.m_emulatorBackgroundColour, wxSOLID));
     dc->Clear();
-    
+
     if (!event.GetDC())
         delete dc;
 }
@@ -402,27 +430,31 @@ bool wxEmulatorInfo::Load(const wxString& appDir)
 {
     // Try to find absolute path
     wxString absoluteConfigPath = m_emulatorFilename;
-    if (!wxIsAbsolutePath(absoluteConfigPath))
+    if ( !::wxIsAbsolutePath(absoluteConfigPath) )
     {
         wxString currDir = wxGetCwd();
         absoluteConfigPath = currDir + wxString(wxFILE_SEP_PATH) + m_emulatorFilename;
-        if (!wxFileExists(absoluteConfigPath))
+        if ( !wxFile::Exists(absoluteConfigPath) )
         {
-            absoluteConfigPath = appDir + wxString(wxFILE_SEP_PATH) + m_emulatorFilename;
+            absoluteConfigPath = appDir + wxString(wxFILE_SEP_PATH)
+                + m_emulatorFilename;
         }
     }
-    if (!wxFileExists(absoluteConfigPath))
+
+    if ( !wxFile::Exists(absoluteConfigPath) )
     {
         wxString str;
-        str.Printf(wxT("Could not find config file %s"), absoluteConfigPath.c_str()), 
+        str.Printf( wxT("Could not find config file %s"),
+            absoluteConfigPath.c_str() );
+
         wxMessageBox(str);
-        return FALSE;
+        return false;
     }
 
     wxString rootPath = wxPathOnly(absoluteConfigPath);
 
     {
-        wxFileConfig config(wxT("wxEmulator"), wxT("wxWindows"),
+        wxFileConfig config(wxT("wxEmulator"), wxT("wxWidgets"),
             absoluteConfigPath, wxEmptyString, wxCONFIG_USE_LOCAL_FILE);
 
         config.Read(wxT("/General/title"), & m_emulatorTitle);
@@ -450,57 +482,60 @@ bool wxEmulatorInfo::Load(const wxString& appDir)
         m_emulatorScreenPosition = wxPoint(x, y);
         m_emulatorScreenSize = wxSize(w, h);
     }
-    
-    if (!m_emulatorBackgroundBitmapName.IsEmpty())
+
+    if (!m_emulatorBackgroundBitmapName.empty())
     {
         wxString absoluteBackgroundBitmapName = rootPath + wxString(wxFILE_SEP_PATH) + m_emulatorBackgroundBitmapName;
-        if (!wxFileExists(absoluteBackgroundBitmapName))
+        if ( !wxFile::Exists(absoluteBackgroundBitmapName) )
         {
             wxString str;
-            str.Printf(wxT("Could not find bitmap %s"), absoluteBackgroundBitmapName.c_str()), 
+            str.Printf( wxT("Could not find bitmap %s"),
+                absoluteBackgroundBitmapName.c_str() );
             wxMessageBox(str);
-            return FALSE;
+            return false;
         }
-        
-        int type = wxDetermineImageType(m_emulatorBackgroundBitmapName);
-        if (type == -1)
-            return FALSE;
-        
+
+        wxBitmapType type = wxDetermineImageType(m_emulatorBackgroundBitmapName);
+        if (type == wxBITMAP_TYPE_INVALID)
+            return false;
+
         if (!m_emulatorBackgroundBitmap.LoadFile(m_emulatorBackgroundBitmapName, type))
         {
             wxString str;
-            str.Printf(wxT("Could not load bitmap file %s"), m_emulatorBackgroundBitmapName.c_str()), 
+            str.Printf( wxT("Could not load bitmap file %s"),
+                m_emulatorBackgroundBitmapName.c_str() );
             wxMessageBox(str);
-            return FALSE;
+            return false;
         }
+
         m_emulatorDeviceSize = wxSize(m_emulatorBackgroundBitmap.GetWidth(),
             m_emulatorBackgroundBitmap.GetHeight());
     }
-    return TRUE;
+    return true;
 }
 
 // Returns the image type, or -1, determined from the extension.
-int wxDetermineImageType(const wxString& filename)
+wxBitmapType wxDetermineImageType(const wxString& filename)
 {
     wxString path, name, ext;
 
-    wxSplitPath(filename, & path, & name, & ext);
+    wxFileName::SplitPath(filename, & path, & name, & ext);
 
     ext.MakeLower();
-    if (ext == "jpg" || ext == "jpeg")
+    if (ext == wxT("jpg") || ext == wxT("jpeg"))
         return wxBITMAP_TYPE_JPEG;
-    else if (ext == "gif")
+    if (ext == wxT("gif"))
         return wxBITMAP_TYPE_GIF;
-    else if (ext == "bmp")
+    if (ext == wxT("bmp"))
         return wxBITMAP_TYPE_BMP;
-    else if (ext == "png")
+    if (ext == wxT("png"))
         return wxBITMAP_TYPE_PNG;
-    else if (ext == "pcx")
+    if (ext == wxT("pcx"))
         return wxBITMAP_TYPE_PCX;
-    else if (ext == "tif" || ext == "tiff")
-        return wxBITMAP_TYPE_TIF;
-    else
-        return -1;
+    if (ext == wxT("tif") || ext == wxT("tiff"))
+        return wxBITMAP_TYPE_TIFF;
+
+    return wxBITMAP_TYPE_INVALID;
 }
 
 // Convert a colour to a 6-digit hex string
@@ -518,12 +553,9 @@ wxString wxColourToHexString(const wxColour& col)
 // Convert 6-digit hex string to a colour
 wxColour wxHexStringToColour(const wxString& hex)
 {
-    unsigned int r = 0;
-    unsigned int g = 0;
-    unsigned int b = 0;
-    r = wxHexToDec(hex.Mid(0, 2));
-    g = wxHexToDec(hex.Mid(2, 2));
-    b = wxHexToDec(hex.Mid(4, 2));
+    unsigned char r = (unsigned char)wxHexToDec(hex.Mid(0, 2));
+    unsigned char g = (unsigned char)wxHexToDec(hex.Mid(2, 2));
+    unsigned char b = (unsigned char)wxHexToDec(hex.Mid(4, 2));
 
     return wxColour(r, g, b);
 }
@@ -539,10 +571,10 @@ wxString wxFindAppPath(const wxString& argv0, const wxString& cwd, const wxStrin
     wxString str;
 
     // Try appVariableName
-    if (!appVariableName.IsEmpty())
+    if (!appVariableName.empty())
     {
         str = wxGetenv(appVariableName);
-        if (!str.IsEmpty())
+        if (!str.empty())
             return str;
     }
 
@@ -552,11 +584,11 @@ wxString wxFindAppPath(const wxString& argv0, const wxString& cwd, const wxStrin
     {
         // Is it a relative path?
         wxString currentDir(cwd);
-        if (currentDir.Last() != wxFILE_SEP_PATH)
+        if (!wxEndsWithPathSeparator(currentDir))
             currentDir += wxFILE_SEP_PATH;
 
         str = currentDir + argv0;
-        if (wxFileExists(str))
+        if ( wxFile::Exists(str) )
             return wxPathOnly(str);
     }
 
@@ -566,7 +598,7 @@ wxString wxFindAppPath(const wxString& argv0, const wxString& cwd, const wxStrin
     wxPathList pathList;
     pathList.AddEnvList(wxT("PATH"));
     str = pathList.FindAbsoluteValidPath(argv0);
-    if (!str.IsEmpty())
+    if (!str.empty())
         return wxPathOnly(str);
 
     // Failed