From 3373d6bfafe9f537f30865de9d02a55b91bc848f Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Sun, 10 Mar 2002 13:30:16 +0000 Subject: [PATCH] Added emulator utility. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14538 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- utils/configure.in | 2 + utils/emulator/Makefile.in | 7 + utils/emulator/docs/readme.txt | 87 ++++++++ utils/emulator/src/Makefile.in | 23 +++ utils/emulator/src/emulator.cpp | 345 ++++++++++++++++++++++++++++++++ utils/emulator/src/emulator.dsp | 159 +++++++++++++++ utils/emulator/src/emulator.dsw | 29 +++ utils/emulator/src/emulator.h | 137 +++++++++++++ utils/emulator/src/emulator.rc | 3 + utils/emulator/src/ipaq01.jpg | Bin 0 -> 15418 bytes utils/emulator/src/makefile.g95 | 16 ++ utils/emulator/src/makefile.vc | 18 ++ utils/emulator/src/mondrian.ico | Bin 0 -> 766 bytes utils/emulator/src/mondrian.xpm | 44 ++++ 14 files changed, 870 insertions(+) create mode 100644 utils/emulator/Makefile.in create mode 100644 utils/emulator/docs/readme.txt create mode 100644 utils/emulator/src/Makefile.in create mode 100644 utils/emulator/src/emulator.cpp create mode 100644 utils/emulator/src/emulator.dsp create mode 100644 utils/emulator/src/emulator.dsw create mode 100644 utils/emulator/src/emulator.h create mode 100644 utils/emulator/src/emulator.rc create mode 100644 utils/emulator/src/ipaq01.jpg create mode 100644 utils/emulator/src/makefile.g95 create mode 100644 utils/emulator/src/makefile.vc create mode 100644 utils/emulator/src/mondrian.ico create mode 100644 utils/emulator/src/mondrian.xpm diff --git a/utils/configure.in b/utils/configure.in index ff794a4c5c..46288258bb 100644 --- a/utils/configure.in +++ b/utils/configure.in @@ -16,4 +16,6 @@ AC_OUTPUT([ hhp2cached/Makefile dialoged/Makefile dialoged/src/Makefile + emulator/Makefile + emulator/src/Makefile ]) diff --git a/utils/emulator/Makefile.in b/utils/emulator/Makefile.in new file mode 100644 index 0000000000..6d36395442 --- /dev/null +++ b/utils/emulator/Makefile.in @@ -0,0 +1,7 @@ + +all: + cd src; $(MAKE) + +clean: + cd src; $(MAKE) clean + diff --git a/utils/emulator/docs/readme.txt b/utils/emulator/docs/readme.txt new file mode 100644 index 0000000000..42e8cff2c2 --- /dev/null +++ b/utils/emulator/docs/readme.txt @@ -0,0 +1,87 @@ +wxWindows PDA/Embedded System Emulator +====================================== + +This is a simple display emulator for embedded +applications (wxWindows or other) that use +an X server. The Familiar Linux distribution +is one such environment, using Tiny-X. + +wxEmulator uses Xnest, which is the XFree86 +X server compiled to show a virtual X desktop +in a window. wxEmulator hijacks the Xnest +window by reparenting its window, and shows +this window with appropriate PDA-style decorations +surrounding it. + +No real emulation is done, apart from the work +that Xnest does. You compile your apps on your +host as usual and test them out with the emulator +to get an idea of the constraints of the embedded +system display. Then compile the apps for your +target system with a suitable cross-compiler, +or if you have the luxury of lots of space on +your target device, compile natively on the +target. + +It is intended to create a tarball of the +emulator, wxX11 and maybe some other useful +components such as a simple window manager so that +people can quickly start developing embedded +GUI applications without the need for actual +target hardware. + +Running wxEmulator +================== + +Make sure Xnest is in your PATH. You can download +a binary from the XFree86 ftp server or a mirror, +or you can compile Xnest from source -- but this +downloading XFree86 source in its entirety and +compiling it. Say goodbye to half a gig of disk +space if you take this option. + +Then run wxEmulator: + +% emulator & + +After a brief flicker in which wxEmulator steals +Xnest's window, you should see an emulated iPAQ with +a checked screen that indicates raw X with nothing else +running. + +Running any X applications with the Xnest display +number (currently 100) will show those applications +in the emulator window instead of the normal desktop. + +For example: + +% xeyes -display :100 & + +Before running any other programs, run a window +manager such as twm: + +% twm -display :100 & + +If the X program or WM you want to run doesn't support the +-display argument, try exporting the DISPLAY variable +before running it. E.g.: + +% export DISPLAY=:100 +% xterm & + +Eventually the emulator will support configurable +skins, complete with buttons as on the actual device. +For now, it just pretends to be an iPAQ. + +Compiling wxEmulator +==================== + +You need to use wxX11 -- no other port is supported. +Configure and make wxX11 in the usual way (see docs/x11/install.txt +at the wxWindows top level), then compile wxEmulator +using the makefile that configure created. + +Have fun! + +Julian Smart, March 2002 + diff --git a/utils/emulator/src/Makefile.in b/utils/emulator/src/Makefile.in new file mode 100644 index 0000000000..314b59ac86 --- /dev/null +++ b/utils/emulator/src/Makefile.in @@ -0,0 +1,23 @@ +# +# File: Makefile.in +# Author: Julian Smart +# Created: 2002 +# Updated: +# Copyright: (c) 2002 Julian Smart +# +# "%W% %G%" +# +# Makefile for PDA emulator + +top_srcdir = @top_srcdir@/.. +top_builddir = ../../.. +program_dir = utils/emulator/src + +PROGRAM=emulator + +OBJECTS =$(PROGRAM).o +DEPFILES=$(PROGRAM).d + +include ../../../src/makeprog.env + +@IF_GNU_MAKE@-include $(DEPFILES) diff --git a/utils/emulator/src/emulator.cpp b/utils/emulator/src/emulator.cpp new file mode 100644 index 0000000000..2740f75923 --- /dev/null +++ b/utils/emulator/src/emulator.cpp @@ -0,0 +1,345 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: emulator.cpp +// Purpose: Emulator wxWindows 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 +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// for all others, include the necessary headers (this file is usually all you +// need because it includes almost all "standard" wxWindows headers) +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include "emulator.h" + +#ifdef __WXX11__ +#include "wx/x11/reparent.h" +#endif + +// ---------------------------------------------------------------------------- +// resources +// ---------------------------------------------------------------------------- + +// the application icon (under Windows and OS/2 it is in resources) +#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXMGL__) || defined(__WXX11__) + #include "mondrian.xpm" +#endif + +// ---------------------------------------------------------------------------- +// event tables and other macros for wxWindows +// ---------------------------------------------------------------------------- + +// the event tables connect the wxWindows 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) +END_EVENT_TABLE() + +// Create a new application object: this macro will allow wxWindows 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 +// not wxApp) +IMPLEMENT_APP(wxEmulatorApp) + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// the application class +// ---------------------------------------------------------------------------- + +wxEmulatorApp::wxEmulatorApp() +{ + m_xnestWindow = NULL; + m_containerWindow = NULL; +} + +// 'Main program' equivalent: the program execution "starts" here +bool wxEmulatorApp::OnInit() +{ + wxInitAllImageHandlers(); + + // create the main application window + wxEmulatorFrame *frame = new wxEmulatorFrame(_T("wxEmulator"), + wxPoint(50, 50), wxSize(450, 340)); + + m_containerWindow = new wxEmulatorContainer(frame, -1); + + // Load the emulation info + if (!LoadEmulator()) + { + frame->Destroy(); + wxMessageBox(wxT("Sorry, could not load this emulator. Please check bitmaps are valid.")); + return FALSE; + } + + if (m_emulatorInfo.m_emulatorBackgroundBitmap.Ok()) + frame->SetClientSize(m_emulatorInfo.m_emulatorBackgroundBitmap.GetWidth(), + m_emulatorInfo.m_emulatorBackgroundBitmap.GetHeight()); + + // and show it (the frames, unlike simple controls, are not shown when + // created initially) + frame->Show(TRUE); + +#ifdef __WXX11__ + m_xnestWindow = new wxAdoptedWindow; + + wxString cmd; + cmd.Printf(wxT("Xnest :100 -geometry %dx%d+50+50"), + (int) m_emulatorScreenSize.x, (int) m_emulatorScreenSize.y); + + // Asynchronously executes Xnest + if (0 == wxExecute(cmd)) + { + frame->Destroy(); + wxMessageBox(wxT("Sorry, could not run Xnest. Please check your PATH.")); + return FALSE; + } + + wxReparenter reparenter; + if (!reparenter.WaitAndReparent(m_containerWindow, m_xnestWindow, wxT("Xnest"))) + { + wxMessageBox(wxT("Sorry, could not reparent Xnest..")); + frame->Destroy(); + return FALSE; + } +#endif + + // success: wxApp::OnRun() will be called which will enter the main message + // loop and the application will run. If we returned FALSE here, the + // application would exit immediately. + return TRUE; +} + +// Load the specified emulator. +// For now, hard-wired. TODO: make this configurable +bool wxEmulatorApp::LoadEmulator() +{ + m_emulatorInfo.m_emulatorTitle = wxT("iPAQ Emulator"); + + m_emulatorInfo.m_emulatorDescription = wxT("No description yet"); + + // The offset from the top-left of the main emulator + // bitmap and the virtual screen (where Xnest is + // positioned) + m_emulatorInfo.m_emulatorScreenPosition = wxPoint(45, 57); + + // The emulated screen size + m_emulatorInfo.m_emulatorScreenSize = wxSize(240, 320); + + m_emulatorInfo.m_emulatorBackgroundBitmapName = wxT("ipaq01.jpg"); + + m_emulatorInfo.m_emulatorBackgroundColour = * wxBLACK; + + return m_emulatorInfo.Load(); +} + +// ---------------------------------------------------------------------------- +// main frame +// ---------------------------------------------------------------------------- + +// frame constructor +wxEmulatorFrame::wxEmulatorFrame(const wxString& title, const wxPoint& pos, const wxSize& size) + : wxFrame(NULL, -1, title, pos, size) +{ + // set the frame icon + SetIcon(wxICON(mondrian)); + +#if wxUSE_MENUS + // create a menu bar + wxMenu *menuFile = new wxMenu; + + // the "About" item should be in the help menu + wxMenu *helpMenu = new wxMenu; + helpMenu->Append(Emulator_About, _T("&About...\tF1"), _T("Show about dialog")); + + menuFile->Append(Emulator_Quit, _T("E&xit\tAlt-X"), _T("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")); + + // ... and attach this menu bar to the frame + SetMenuBar(menuBar); +#endif // wxUSE_MENUS + +#if wxUSE_STATUSBAR + // create a status bar just for fun (by default with 1 pane only) + CreateStatusBar(2); + SetStatusText(_T("Welcome to wxWindows!")); +#endif // wxUSE_STATUSBAR +} + + +// event handlers + +void wxEmulatorFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) +{ + // 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")); + + wxMessageBox(msg, _T("About wxEmulator"), wxOK | wxICON_INFORMATION, this); +} + +IMPLEMENT_CLASS(wxEmulatorContainer, wxWindow) + +BEGIN_EVENT_TABLE(wxEmulatorContainer, wxWindow) + EVT_SIZE(wxEmulatorContainer::OnSize) + EVT_PAINT(wxEmulatorContainer::OnPaint) + EVT_ERASE_BACKGROUND(wxEmulatorContainer::OnEraseBackground) +END_EVENT_TABLE() + +wxEmulatorContainer::wxEmulatorContainer(wxWindow* parent, wxWindowID id): + wxWindow(parent, id, wxDefaultPosition, wxDefaultSize) +{ +} + +void wxEmulatorContainer::OnSize(wxSizeEvent& event) +{ + wxSize sz = GetClientSize(); + if (wxGetApp().m_emulatorInfo.m_emulatorBackgroundBitmap.Ok() && + wxGetApp().m_xnestWindow) + { + int bitmapWidth = wxGetApp().m_emulatorInfo.m_emulatorBackgroundBitmap.GetWidth(); + int bitmapHeight = wxGetApp().m_emulatorInfo.m_emulatorBackgroundBitmap.GetHeight(); + + int x = wxMax(0, (sz.x - bitmapWidth)/2.0); + int y = wxMax(0, (sz.y - bitmapHeight)/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) +{ + wxPaintDC dc(this); + + wxSize sz = GetClientSize(); + if (wxGetApp().m_emulatorInfo.m_emulatorBackgroundBitmap.Ok()) + { + int bitmapWidth = wxGetApp().m_emulatorInfo.m_emulatorBackgroundBitmap.GetWidth(); + int bitmapHeight = wxGetApp().m_emulatorInfo.m_emulatorBackgroundBitmap.GetHeight(); + + int x = wxMax(0, (sz.x - bitmapWidth)/2.0); + int y = wxMax(0, (sz.y - bitmapHeight)/2.0); + + dc.DrawBitmap(wxGetApp().m_emulatorInfo.m_emulatorBackgroundBitmap, x, y); + } +} + +void wxEmulatorContainer::OnEraseBackground(wxEraseEvent& event) +{ + wxDC* dc = NULL; + + if (event.GetDC()) + { + dc = event.GetDC(); + } + else + { + dc = new wxClientDC(this); + } + + dc->SetBackground(wxBrush(wxGetApp().m_emulatorInfo.m_emulatorBackgroundColour, wxSOLID)); + dc->Clear(); + + if (!event.GetDC()) + delete dc; +} + +// Information about the emulator decorations + +void wxEmulatorInfo::Copy(const wxEmulatorInfo& info) +{ + m_emulatorTitle = info.m_emulatorTitle; + m_emulatorDescription = info.m_emulatorDescription; + m_emulatorScreenPosition = info.m_emulatorScreenPosition; + m_emulatorScreenSize = info.m_emulatorScreenSize; + m_emulatorBackgroundBitmap = info.m_emulatorBackgroundBitmap; + m_emulatorBackgroundBitmapName = info.m_emulatorBackgroundBitmapName; + m_emulatorBackgroundColour = info.m_emulatorBackgroundColour; +} + +// Initialisation +void wxEmulatorInfo::Init() +{ +} + +// Loads bitmaps +bool wxEmulatorInfo::Load() +{ + if (m_emulatorBackgroundBitmapName.IsEmpty()) + return FALSE; + + // TODO: prepend current directory if relative name + int type = wxDetermineImageType(m_emulatorBackgroundBitmapName); + if (type == -1) + return FALSE; + + return m_emulatorBackgroundBitmap.LoadFile(m_emulatorBackgroundBitmapName, type); +} + +// Returns the image type, or -1, determined from the extension. +int wxDetermineImageType(const wxString& filename) +{ + wxString path, name, ext; + + wxSplitPath(filename, & path, & name, & ext); + + ext.MakeLower(); + if (ext == "jpg" || ext == "jpeg") + return wxBITMAP_TYPE_JPEG; + else if (ext == "gif") + return wxBITMAP_TYPE_GIF; + else if (ext == "bmp") + return wxBITMAP_TYPE_BMP; + else if (ext == "png") + return wxBITMAP_TYPE_PNG; + else if (ext == "pcx") + return wxBITMAP_TYPE_PCX; + else if (ext == "tif" || ext == "tiff") + return wxBITMAP_TYPE_TIF; + else + return -1; +} + + diff --git a/utils/emulator/src/emulator.dsp b/utils/emulator/src/emulator.dsp new file mode 100644 index 0000000000..e7222863f4 --- /dev/null +++ b/utils/emulator/src/emulator.dsp @@ -0,0 +1,159 @@ +# Microsoft Developer Studio Project File - Name="emulator" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=emulator - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "emulator.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "emulator.mak" CFG="emulator - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "emulator - Win32 Release DLL" (based on "Win32 (x86) Application") +!MESSAGE "emulator - Win32 Debug DLL" (based on "Win32 (x86) Application") +!MESSAGE "emulator - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "emulator - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "emulator - Win32 Release DLL" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "ReleaseDll" +# PROP BASE Intermediate_Dir "ReleaseDll" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "ReleaseDll" +# PROP Intermediate_Dir "ReleaseDll" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W4 /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D WINVER=0x400 /YX /FD /c +# ADD CPP /nologo /MD /W4 /O2 /I "../../../include" /I "..\..\lib\mswdll" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D WINVER=0x400 /D "_MT" /D wxUSE_GUI=1 /D "WXUSINGDLL" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /i "../../../include" /d "NDEBUG" +# ADD RSC /l 0x409 /i "../../../include" /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib ..\..\lib\wxmsw233.lib /nologo /subsystem:windows /machine:I386 + +!ELSEIF "$(CFG)" == "emulator - Win32 Debug DLL" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "DebugDll" +# PROP BASE Intermediate_Dir "DebugDll" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "DebugDll" +# PROP Intermediate_Dir "DebugDll" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W4 /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D WINVER=0x400 /YX /FD /c +# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../../../include" /I "..\..\lib\mswdlld" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D WINVER=0x400 /D "_MT" /D wxUSE_GUI=1 /D "__WXDEBUG__" /D WXDEBUG=1 /D "WXUSINGDLL" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /i "../../../include" /d "_DEBUG" +# ADD RSC /l 0x409 /i "../../../include" /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib ..\..\lib\wxmsw233d.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept + +!ELSEIF "$(CFG)" == "emulator - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W4 /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D WINVER=0x400 /YX /FD /c +# ADD CPP /nologo /MD /W4 /O2 /I "../../../include" /I "..\..\..\lib\msw" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D WINVER=0x400 /D "_MT" /D wxUSE_GUI=1 /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /i "../../../include" /d "NDEBUG" +# ADD RSC /l 0x409 /i "../../../include" /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib ..\..\..\lib\zlib.lib ..\..\..\lib\regex.lib ..\..\..\lib\png.lib ..\..\..\lib\jpeg.lib ..\..\..\lib\tiff.lib ..\..\..\lib\wxmsw.lib /nologo /subsystem:windows /machine:I386 + +!ELSEIF "$(CFG)" == "emulator - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W4 /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D WINVER=0x400 /YX /FD /c +# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../../../include" /I "..\..\..\lib\mswd" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D WINVER=0x400 /D "_MT" /D wxUSE_GUI=1 /D "__WXDEBUG__" /D WXDEBUG=1 /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /i "../../../include" /d "_DEBUG" +# ADD RSC /l 0x409 /i "../../../include" /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib ..\..\..\lib\zlibd.lib ..\..\..\lib\regexd.lib ..\..\..\lib\pngd.lib ..\..\..\lib\jpegd.lib ..\..\..\lib\tiffd.lib ..\..\..\lib\wxmswd.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "emulator - Win32 Release DLL" +# Name "emulator - Win32 Debug DLL" +# Name "emulator - Win32 Release" +# Name "emulator - Win32 Debug" +# Begin Source File + +SOURCE=.\emulator.cpp +# End Source File +# Begin Source File + +SOURCE=.\emulator.h +# End Source File +# Begin Source File + +SOURCE=.\emulator.rc +# End Source File +# End Target +# End Project diff --git a/utils/emulator/src/emulator.dsw b/utils/emulator/src/emulator.dsw new file mode 100644 index 0000000000..506e0eb863 --- /dev/null +++ b/utils/emulator/src/emulator.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "emulator"=.\emulator.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/utils/emulator/src/emulator.h b/utils/emulator/src/emulator.h new file mode 100644 index 0000000000..34f5d7a868 --- /dev/null +++ b/utils/emulator/src/emulator.h @@ -0,0 +1,137 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: emulator.h +// Purpose: wxX11-based PDA emulator classes +// Author: Julian Smart +// Modified by: +// Created: 2002-03-10 +// RCS-ID: $Id$ +// Copyright: (c) wxWindows team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_EMULATOR_H_ +#define _WX_EMULATOR_H_ + +#ifdef __GNUG__ + #pragma interface "emulator.h" +#endif + +// Information about the emulator decorations +class wxEmulatorInfo: public wxObject +{ +public: + + wxEmulatorInfo() { Init(); } + wxEmulatorInfo(const wxEmulatorInfo& info) { Init(); Copy(info); } + + void operator= (const wxEmulatorInfo& info) { Copy(info); } + void Copy(const wxEmulatorInfo& info); + + // Initialisation + void Init(); + + // Loads bitmaps + bool Load(); + + // Emulator title + wxString m_emulatorTitle; + + // Emulator description + wxString m_emulatorDescription; + + // The offset from the top-left of the main emulator + // bitmap and the virtual screen (where Xnest is + // positioned) + wxPoint m_emulatorScreenPosition; + + // The emulated screen size, e.g. 320x240 + wxSize m_emulatorScreenSize; + + // The bitmap used for drawing the main emulator + // decorations + wxBitmap m_emulatorBackgroundBitmap; + wxString m_emulatorBackgroundBitmapName; + + // The intended background colour (for filling in + // areas of the window not covered by the bitmap) + wxColour m_emulatorBackgroundColour; + + // TODO: an array of bitmaps and ids for custom buttons +}; + +// Emulator app class +class wxEmulatorContainer; +class wxEmulatorApp : public wxApp +{ +public: + wxEmulatorApp(); + virtual bool OnInit(); + + // Load the specified emulator + bool LoadEmulator(); + +public: + wxEmulatorInfo m_emulatorInfo; +#ifdef __WXX11__ + wxAdoptedWindow* m_xnestWindow; +#else + wxWindow* m_xnestWindow; +#endif + wxEmulatorContainer* m_containerWindow; +}; + +// The container for the Xnest window. The decorations +// will be drawn on this window. +class wxEmulatorContainer: public wxWindow +{ +public: + + wxEmulatorContainer(wxWindow* parent, wxWindowID id); + + void OnSize(wxSizeEvent& event); + void OnPaint(wxPaintEvent& event); + void OnEraseBackground(wxEraseEvent& event); + +DECLARE_CLASS(wxEmulatorContainer) +DECLARE_EVENT_TABLE() + +}; + +// Frame class +class wxEmulatorFrame : public wxFrame +{ +public: + // ctor(s) + wxEmulatorFrame(const wxString& title, const wxPoint& pos, const wxSize& size); + + // event handlers (these functions should _not_ be virtual) + void OnQuit(wxCommandEvent& event); + void OnAbout(wxCommandEvent& event); + +private: + // any class wishing to process wxWindows events must use this macro + DECLARE_EVENT_TABLE() +}; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// IDs for the controls and the menu commands +enum +{ + // menu items + Emulator_Quit = 1, + + // it is important for the id corresponding to the "About" command to have + // this standard value as otherwise it won't be handled properly under Mac + // (where it is special and put into the "Apple" menu) + Emulator_About = wxID_ABOUT +}; + +// Returns the image type, or -1, determined from the extension. +int wxDetermineImageType(const wxString& filename); + +#endif + // _WX_EMULATOR_H_ + diff --git a/utils/emulator/src/emulator.rc b/utils/emulator/src/emulator.rc new file mode 100644 index 0000000000..7655c62a4c --- /dev/null +++ b/utils/emulator/src/emulator.rc @@ -0,0 +1,3 @@ +mondrian ICON "mondrian.ico" +#include "wx/msw/wx.rc" + diff --git a/utils/emulator/src/ipaq01.jpg b/utils/emulator/src/ipaq01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4366e721981b5ef87c7d2b60a48a85a3eba1b2a9 GIT binary patch literal 15418 zcmb7q1yEegw(bxJgg_u9I1D6sAV6>(2*Dvha2Ond4ess<1h+uY!QI_;fWh4z26uOP zgv6B@9w?&Tm7xIy8ChZaT)MhN=#A=fP{nuka)TPk8=QF04mCJ z)aNLusLxT+&`@8zeEsqzI{HgoENslz1h|BR1i1M4#6W6tViHPHeEfGG-%--gexUzA zM9%n$k?s>U-3PkAjUb_+p}lI1>hMD5;6|b zV+Q~TKmt5_hWzxq|0kiMJ%54p39y8t01`6tGvsHe80Z);(4Qmyt&WWH90&D1 z+8Y)j`4?{~^lU0{DOovfeInD!+D7oG*x0`)*q5*3Q`0Ev+xbTQ9z7!D5>Yhx9-Yo1 zENYn14qG`UP4%L54e|vs@<9)DU5G;G8lFBBj zL;jWufBTvY$#k7B>^w4aWid1VS2HgG7up|e{v1K#ITelVbQ7y!G-PCltzpe=;LYIM07Yvm%_tkmLo^DNh^xdvy5&w%`$7RKdWw!f zUU|}Gmje6`G1!-rOI(Cx(w?82lR6yMA97VM1Uts$Nnlzkd-~I`l*`(umdC9(6&2g4 zDl{&PRmxQwlW&nFd*=>p#n%wS1W-K^_-|J6c%3J4U$L*uirr13B`T}D7+UV_5Qs_( zW3+#R_UhLk^LVRX4kG+1@%9DM zt;CO?h!7EmB`7B;Us@-vWd}Zn+rQ}_mW$%o1-SPtq1L2NXSCj`XFB7ta+xGw|8&B9 z<9+ac+YKQD^8|BlXbJm~^Q0YCKpb|F40rUe?TmGxxcqSmS&l;A913KKy4gQUu1<-C zWB=r*$N+W(PSR^PfsghtCEEk)*B#;}`QVn4oAZtrbTUW+ZHWzp^j2*`mwN$&;!dtd zI~qlC*9EgL5=oHNhKD&@XFU9Dxwa>Wmx;yP1X~{gmRLCC0-6qJpkRb5o9T9Dg1Bv0tLCQD^DVoYLml+huyk4&pG$gVRv4MSFOJo! zXL9Y1L=k>(P+$t>orYl))90tUAiEI50ZN;)Zw&+(_F2K-FgoAmM;X1jqKLf4baJ^? zYF8ByCxB+Ityl>xJOX+}R2~6EbVcVwH9}%c94kpDmECI739hdX#x}Gnjk05J6LA@-G z%PMJMnBV~1b)xp-N{-KA(rI&gU%p40Agm-ezEp^a`y}~V8m^)0Sqe6+Ut(q~_Q%I> z4)5^S|AGY&&?lHvHJv$}!0*lHo!*A*A09^%k@Uk!FMb|1PM2`qD$6ilY=5~4r21ag zBZqE4yll6QHL(fgzUU!zE80|?{fO_DB|5JpZ5>&J`|LH35G7^eaBYJb@2+E7Zu}tD z7<}$Apm{@oX?oe~GL>c(ad z+GmVw{HrB@Xn$&2GiE3f`;~5vU%Ou+fF#NsVjb}Z9hJprQ%Z|jQAo}{Bdu1fSK6;G ziF8zZDZGv!xF8rVj(y0*(3uV?C>+S`I1Ks#b8$BSi(Tz$H!0?BRqoT4nxgn#^0 zY24M&&|kmpCLFJHA2uXA2p-S{g#2 zlTA@-MwE0TVHDA9V;^r%?0DmYehV{t3iwCc^_=T>F^z>w0Z9r+5NT*m^MsPv-pK~1 zVzRe^>ua_$&~9fD^LXs6l+berQDuYpAx0J#ccsk+5NRpcf6Qi#AU^GPAEu?vM!fd} zW~jG-Lqy|tuiX4kYF(Pwh}8vVZTYEQi~?+yO$BXi2sj}ame**Oj2YTr79Bwz8tfJj zuUX7Jqv-yoRFd(cdhfkE=QLvNr0tG|Kgr3r_#GG3fhw26P7^JbbQpm+&-9So7rue9 zGWSL6(Z-7sJo{oy$~Z)&q2kR+v6Sheo=Z5ekXvQnY58JCVO~;T-h*KdL%m1aj2mW_ zXSi+>dq=`+q`nN#QdnNIxBe6v4?6wlKs{IX>PX(`s7Sv{wL|$aOvBrdKQxWt&`I4kK$F6=q^sWz@ z(;svlYg~g-^Nz4p^KQG@QMH%X-@+$3`j1WhesY+i<$ZK-?K(!D2`$N9gT=J%>+gKo zJ^6_?-Kf*sBeuh6j*59a@^kAJU%|e-yvBTeKX?kw?AFPCTv}FzaZ#G$Sa$erXo={? z5T}njjC}598n-5{hlJ~^ex*LC>+b$&yl&o%caxrVV~bH?x{{UYVP~)rq(j6ujr9U& zGf(w+Em4Yrj?VJ6bK*}@j#or$%p^5~_^gbSM!o{7&FSfEb^hOYKo}$%#UHi@C=peX z%;h=u`uNcUBqZ0eO9qR4_~OzF^u><=duk|@JI}!F2Z|u`Oy+V;g@X}~u+5(!?hmGj zoQ$8p&&onr>AC>7s$V2~{bre+dd$T(=o{T_#=c(jf7c8(m|Z0n+HX~Glgzb#qokQp z`1VVWh%P{%>idmt5p18c8=+T!-BWk{$8H>vqrY?XiEUN|Z@G>fLaop!%3}lnRva97 zkpsx{q`=Y_6X4hm=Fr(?8(=Isqq%|S?nLY|!{+$ME$*FiPj=xxA6AN5=gvKF80`?r zi|_Zb7`q)|pk-207vI_{E#{E2=8{B{?l)X5pijAccp6*G?8-K%^%6#Av%uj9H}^h+ zg0u^fH)GKQgrtMITYH!Xjjm(rQZ0B@N~k2tlAsv@2kPbNldvTOMw{m^-cEULU0pY6 zKXI`VC$uoMvxYAxJ4bO>1sx9JRqbr=?af0-4No{yB((@vdKYd&&Xsh29Ni*hlWWW$ z0XJqtS>c}GBIP*_Mh+pje4xlFl{R(fSm}B)+%sOsSeP{C(|EI#B0uJ_4gX+&S?w0r zR;4L{=2p*n?7o~{&4i)=RKn!5jSZIh9+sZtpq;EEwNsgT^V%F`s;{dt45ve6oGq^A zTAVK?Q=(+`IIU^1(}i~KgRS5q(M4LO=XBJcTVa8Tbh?Twiv6b5FuC*bmRX{U;`A`# zM}WHY=Iu%fWQ0ofsAJCUCuz#AsaGZ2zGe{DIjh1AC}OC}#FuuZ!^*2Pb1(L9JLBw8 zx^9Nd7ycdvA~-s*UyFx&joi0}%o#J7x8LNuS1Nzc?O(zEc9#InZD3snAxJoBl= zTco>;xjgagv=qqjnjGxc60`1W&V=Z{zXoH>fb+^T68;WTcm$9QCNHQ2P_zUIHCdL9 z^(giJsa}K-y8Q4rGEO|LKi8rdv$v6=3XQ$sm!Q@&?>`~q>T{YdA`mU^<|@}fVR8yF z+nRYF(W^N#6NMO0zEw5Zvj}sc{WU6fjmF?dV}dp`l|OsHWAGB1BA$_XdwKMV({t|8heCL_j|r~i|G0+5^AfXZqv&v zCqGZTzBtk|w6ktnANUN~B^}r`gvnW%D%9~uLVauv`3vhgE9GYg>u(`&6H2NmO3^^g#DIkca#%98(J7 zPbgmClOu22O6>J>^#$5z*Dvp1zh3;?%+I`5@WIkzvsw5& zPXrDK$t^*h_qwt9;x*f_s}PThrAnjN!)>rzqqpC!jQyJA;Pw%4LBCSms&}Z2_F8Nd zapwT;q%WH!57Br8h>#bbd#m5;T)8=I`JFG8Vq}ovzl1L@h-6nIq=5Tk*u*Pg!=FhW z0g|dOm0@qZ9F;;*yti_OIx&XEE5;MMA{}!QnP%{$ zLS{_PSMQ)%)=SDab?H=9O?c!hJXZ%PM6|OT0!3P-288XIjkI!yq29(1*>ZQmV^&*hF^=t|B#ysR_pQty>KqqqCzy|NaQ_a=Wp=c=>iOz7rN?Rm<78w%~| zqjB5GkKjvL1gFYm>7s1s>8lf1jAM9u4VGn%9NlY=0AMg>ekuEe ztk_I1{Ae!Ic;K7~V`pljN!AvRc7@l=qtM{qZ)k@hA9H_0Dd)$<^PR4RlMhL9cLh(f zc1g+O5SUR=yrZCa_V2UV1GGb!l-|S9lZ!7CY%Q@5QeyTIPxO!2EYEsEL^0%q42v^oMtuH#BZ6xI(+vG-j1Qg?jPLl~XS)C}{|y5cI!SP8`U2m{UkTj@ET z+|odON-wNef{&Sz%9+0HBYoVeT3d9>BOu0p;-IZO>ngEfWAE$^GM*o-hN(2{86>E+ z3&jIxhr}%A)Xs4s#M@lcAx8&_yqEYlp+F}BEhx{P@ki;GVw{m}&JcW)6no|LzY@rjB9ee0BWR@v7QZe$o zlnMFRBjSaw;U6DL?~MG;Tf1WCS?eg@ROWfWtljWFtO)Gwl9(K% zg>Svw&0OTXd7+f^6V=Nxc5lsNh3NWE&2ew`2#!PQ|3p_$LUSIrH4<3Y8kCnk0>I_p z_4bBri}{H^J7HSO-Do^i8Fi0}@jb=L@gdX(!gkee6Tr?_IT6tPW(PM-u-(R^bM17w!{-J)!&4_xDksg{f%xx!p}5uDaBfR&#AC za4*Sgx#{aYq!^?VKHn*B%>c~c{H}g*6DzHHJCy=_1gNPE0I#_3$rV7rJxBdRUP3hw znEPh6x_0BrEvq|41QiBh$+iXLsIP%A0PQT*P zRg((pPkIC_H;F3c_zUw+{&0c|=DEh-j55jSRmY~RxCa9>IfFhreGDrXYy*2c_LY^x zP5H0lJTQEZT2y{EzL{K6c))ertw(+YIJOHI+Rw518{}uX(=|Pe96tCE4A;A&E3Hy6 zdH+we{3J3-c)7Y<<^;c2OYKDu--RxtC4v)_NW;f+UT8%B%J^!a;f(X4;R$Ys z6a@a#@Z8Oz{CcCa+6OsIkK1o|==aj&>QCBzIP148x1*iyS*4Gd^gPcRk~It+Z4d>_ zo0s#BEq3@_yBQi(Huw8^ww*DN2cJV`QNMnEb&|V;9);B$fJKWN=?5K%*)$-EVp?cV z=cmSUxOKIVZL3MMKU2v6E~35sAC#Mmt&R3>R%R9yb$4Auzm>p>^or=YqV@|$?3GS& zHwc-hZ3#Nbh9I$sSaAq{4y|DksR@dz6fYk+0b~}V5A8Q95;^b00sERtuPmG#a@s== zoz#%CAV2uW`;Igdgw3(t$+Q%o1OKJu@TDrW)|Bxk(cd{wW-3G&?RQI%VMz5nVo>kmtlh$kB?QQD;Ws_e`zyA~H8O!!AwJu7FE$)2V^cTNh zwW6dPKL}nc3Hmftq|whUu!RpQKg}$znKzWG)mUF#Z27prHC@?}Iv)f!N!)*0c&z(% z^6^miS1E=LJgYVbmJ0ZmMJclsJ_4}K?_V{S?eJ!T$Bu)owk*!WM6^8m++XWHMM)b1HD0B?6mJ3sSmFNK|J*zJ)!VQ<5~|S>p_Zp4Oeqy z5NGT9{!MJ-l^CYYn@lHm4?rY!O?W2KpH42Jz z`G0G<{$~t6$rL&zH>(SsSk59@OR(RQiXn1gLK>qPY zczcn0_15)IZh4F~?7#Hj>%A!fP5EW%Bj86Pu~#ACu21>pF1G8z(#b>Taw&rSei|dl z2EQ0c_o67>$|}TYi4Z&l-*z{C!<4)qKXC0k(?qqj^zwbL=GV~a8KH3pJYc}b0#KV_Hcd#n0Q82zhksNV!bS|xia2n(2u0-vmx?< z0~2HNNNugTi0&~gcfHvMvB1G_P_ZI%_;E~9E$fP;nQ%g|-eHDSp=($kSv6r^wcm`` zlG-_`inY+w%&xBfFOmOxV*gV8CqnP+E3CMUrzEkv4{p=%G7X4h_AFnLArH7na%YDZ-P0X04&}NUPpb79 zqX@!ZV0&o%@S>t|16pRvJzi<(rTbg5GYv@+dshV+VoES{&g*II%Qf@^XZ;;y=H{)(_aN57 z<-d0OFRqDyDJ{ca``(1@y2ABOUP_VjP@%`3VE=L>Co@dZYFgmu!6eCc6xyaoFif8) zHVIfwawi?+4sJO6+}R!%2CqEa#*pWRKiHH!0D~#NxIPownWt72C+zCPjtfd46 z%X44IEx3kYVs+MhHy*Ac2-m%z%-wOiiG_U6IA21j^gjaLJgxPKDP?FsaGBjdZ!Q-l zP_eG?k>WN!ob+4%3-OLTOwhBE{F#-)Ioo-DU6of;#!+)8qRayH0WKDv=EmXFlw%bI zj6sY&0z$_8rhZ!-GkrLQTn?wYQ75y6b!KZSE@>}@dni6+)$t10U?6NRxp&;~aPqks z+?sYslC2AUilAwu;&W?BE>lKa@+tYx@n)CM5^w8O6(0eL7k>oT4s!*=|0%~dr03zP zdR_BE_zkNf$hSO4_xMR2SS~qO{+6AD#3>pd0X+?h2!Zb4o0Q7XBg+Xat53P%DVhSh(UPs3NW$aB3eIK)D0VTK+0?E-QSlI{3IM79syqi z{`DnYNy>@I1QEPE?Vm5V_zBO2_$J4~pE@=FCQ-7o+?f~HR+3FVe4jP#{AovV6d`>t zH!IUtvQ_=UnHggFH8F<9txnL?kqo2$cjWD+6x&_+tW2nzXepx2Ou=y>_YshHE1h?w zIj-w9`n%;Rm@?($*v4gJFm^%m}=Mbp;Pwp)m~Svq65m2cHvWa9oOw35Yp!A&i=Z`KmY&I`fvN5Dg1 z8THYpM?gk#3&68ZgB4G>Re)&z$^qEL5Tl95@)cR1rRMkfAcD3@qfNibKxyA!)SKj>{Sae4hYtw=Ld#1C`)p|+GG~;;`U3ttg#&MtO)~ly-x-9-nc^IfF z3;Q2GU_8Sgdbj2IFF!zq$wKSUVhLkU8^rHXp9uOS@N;j%ZM)`rEF`a49;n!JSoHUnpuqax%*`7#T1eI^{U>63^}DO#QD5BJolVY#G2 z$MW&XWIQ8|OVwwWn8LE7JnK%@x5{tr5ret8xf@jqBg12xJz*w4!r+;V8t@-#1Zo&*6ia zy~?iVvN;u|V9o*e!nN)b1EWKyw5EK(puqOqZ-iS1@*R$wpMWuTY8rWF>$Tbx9)^>J zf67r?V#>tOVLo?}VeJ{pF}RU!ltix8O^e?yc!HVcayNQ4iize-=&C%@o0F^XZz9=c ziRN<8E}4a`hEEL3nqb3~r?L>a`FjtLA)jU&0xdLWx@v&RDyCAUpf3`G4XuY5W_pp%qOx`z-mmCYUp_68P@|lksE!?Uayqecjp9lSfR{c*m5Tvy+knd@ z4fKYL9fd}Hf@QzWs;SQ=N|lm?>FgQ;l<_C{#Y#=<_+^yFl*ZTm@EG{@Ob_%@(x{=mAxhgtUh0n?|HET%z0`EvYR^EvS(Z*%z9_AZcr z{tDCZsMt#X>G^ZTCFkUPb;SfoFNyO5Bggwl*g!w0a#6|hTV(pE(IgY+f}m*S(W=mh zlb~sdHMGISP6uI1n!u=z<*P-Wgq7NNXLJH_p95!oe&z|hrX+|L;`6&Gs=k@bau!-! z%p_bAgv7AQ--*oDPuw7bz6a4{C5hZQPK2*wKF!Yr*%u$gUx9AEJp#C%!m!{xam@Q0 zd9T0a_?wB~L?tW>F4}f&60A{0rwDvug~J@0vvq?#!5`T}y5wJ0Q}BzM1P|1(;4fRt zP6F5)NK?PxNg?Gd#LX=I)CFq{kYoV0;p}9qVggk&0WYQ&DaR!X&YRlRbtt!U7fqMH z8{3hanrsh5q^i!|bLc_ojAJDYhpJyvU?d(@%w`cMm9p?F%g-E z^1b2f+9fi`tBN6--(%et$2BXFa@Rv)2 zO4#L>U*!p9X~U-%o0WKF`~n=p60;v#-ygRV%i=ktL#)6P{v+&)s^3sKA_tFz0*eH; zT$StW#)-{@G~zi66X9mm5|t5|9S+cDLd-c-rcIqPAq8Fp|T3hv5J^Va)w`U zA;1H6t3|z=)(*YRrltm-!=iGHBYtD%1{h04=T*jUc1e_N407%FnAg)YO#7ptJuY5! zq1B3^ct-Xmr-=M*Eu6h-2$&Vcuamfd6oRT3)j3>n!4wI_69ZD)e1x+6a&2|!y zAF}oWB+RZg$7mvBX==@d6T`E#1#4ZhbRE+t6ep`-u`0p zwTy$ESthEs>kQ!I;ESDDMfre4VY9-j5mT}5(~xzTmF(_YhYHA?G`~@Lg^EI}Ea9~G z8uuB)g`da_br8|JqIw~DDhoH@-k$~%C&v=G13`t+KXQ->xe@?*+C#i!p71TPh< zi(_g~9V+6T{M&LNl(Dg?Ckjf>Y)CFIDxeb{(z+bL#*NmkodUY>PdF~xEDiTB zgEDSoWGo7@YE73p(4)Ipi%za8rnnjR_Ozpk$Xu+fFwQtu;c}8rg<)WNRYYg=SJWOT ztVL_Q<>v&=f@5Lh*W*5EIjX{;I%eeeEyNe2kPlU%nCx7iuk*IlNW_I@c{-x8k`DGP z7gWplGwIn&unXSB#WU<`Q|EeuhU~;M(hWH);IR@qTPEA;xy%!9Wb6yALLIMPR~`_B z9jucy+HfvtA#bnL$h_4lrOrs)`i3!P7zO6Z&vc4;t41sr^_c``Q8^rTKs1!M)s!SG zjC3M>L5|-CHm;wf4_dNnP^{0M8Xy%n7CCL<+Gw~oF4JzrYEYWo&NC?>)1iKQjbzh< zTuS~WhvCdYIqDH`35p`zNv3n7G(B-~wX403DQE@r=%qJI2-5ImubZ7#1UoWta)q8$ zzpZ*kse35|k^8|ia3C|t6Fylz?SP@s_^vVWEYp5tU!fu@V)av}L%|v9O%JZ5bZrES z4&)vQS}uws`Ly!LZNgT#- z&kpcxLE>~zg{-Zmtl`-c|CIpwu4wGxt|_zHV6f21E$*{+78(3GT|-%muyr#hxDkO7 zKWky_aYkldm3+mb%JuT${y92*@9~Ek_Rq;igr+-9C1i;`Ca z0)r*gHxe?-PRBm6{LJXF`!y7T*5a_885ud6Kr@k@6IQ*6sr)CeP7--u(VNAet76bi z%5N9SG++4?&3vy|Dw-~93jNfG3A||lHRbommpG{9=c08zNSf|K&wZzEo+W~3I#^># ze!L&@O+z@gpjnB@TU|w{ZKO47r01vpR#5;oj?{7+g9gF(E9zPt8LFmZ0E4!gTKwKc z-KCF~{5vceRoUq)DwPhv3)=e7A)IlA25#%_i!O)5r!7l#Gp#YO%C^R2T+R68h|+K@ z%Q4qG?piX%O&MC2GB6}`)O1%QWSz-@$~dvo(0ebHUvAZ%Sk}O7Y(H!z&&U#)cv&6L z)wytsFbrDVd`mUVD=?#9UAE*zF8-F<>DY@Bjn83vMU)$+bt@66@!LXt&16eP$fgtMe^IUR$df;YEd1*}|5hG~j6}y?-Zg6M%#)w5R z)W1Brvm8cQ@wR){XCA-9WI@hiLK*k0zIR9l&qG=`wb<;lppEh>KRM@)dm#9` zYdMB=74+83;`H;;rwau4{-L@oP4nG0hxquVWs4E zDrZ#?TR`VSW-F?CPY+}sUo2R5u)5E>e-v42KdnKffzlw7=aH6AW*I%lz7A+Rk@ zy1$3@QjW}jtnk&V>dx*3n62kTQ5nla%z68ax>qwViTyxsVRDP-BuAz=+KISVN0G+! z?1UauU*FK$u=jO$n~o`=uDQ9}Te`31+q?Cw#44G^A+a^@0`k|G1Y&US(zd}dE2w)q z>&P|($3>O<7z*4E4;CWFv!q$Z)QlZzLASC?7j9238ds9NUr{$LX^_IhI$dD#pz*y==99g`&*~lQYz}R$X zwDiX0P;Lnt98MmrTJ^Jegb?_GWL?H$GbYo(vpp?Vuv5Ql&OB?JiIDHktOQ?svw;?k zf1!byQGzyaPrDQygx}ScWU(2^3oGro;}^m{xo|%epr&!*-wD+$-k$g~w2})0{dz6W8v% z9Cq;aQ=HpyK??azdTFl8|M|ykRdecwDI+Q`RB@#B>C9k`JGIAxX{knSN=8~i?q?+#A8)7?xNPlJtJG27QLw;^U#0to~gTn$QF` zo&4lHX!RhYX1Zju=9c=zR$*|Ydy^Y03^d2+R{=KJ$M2Q)Kw%7vjq!=7D52X^5-2WS zS$e@_EhlO2;BgnRwSA|{^ozWAw@l?e1w3nJUzLBY&c=A8NeCpNwKhe$u>2v$-J(D8 zn|*MSIDc+0KKGZIwWD2_^@{`LHL^GM!=sh3oH-yHD%wZCm}cFqd9ziA3aN=v^#eyP zEt7nB$nOTyxIN02^!{x|=G1dg5b-YPIe#Uq)oKM)abC=W&g&Sn@=AP;K5;ZXP*6KU zB|WEL47@5%<_gIfgUOPvcy9$_wJKj?r$zY&O-QJ9U2WDE^1ygdaP_O1ec~*F*1F!V zCMx?QPk*YLQr4ZUOY2xeptr{+FyhFA5o;3?hI*i;;J4Ox#RRppTvTT-SF3o2e`jOp z@Le(sE`Q(>U8@=kg3zVEdgoIM+MUe!rkRa{#J?LB4E+VL#7{eZ1T1~^cG$R8S@iq{ zc7gwSTR??!W*d_f!-e|@*yfXa1cX}^#eDhQ7kJ94kz9zzUibTzSpt@{Tu8)n7|a(7 zTMw;DSi!nfyFuCgqW222t-T>lQvTwGAQDgc(x^qF>J|B7xtpFY+voeF`Fl!GMx!xC zQ#H+qs@M$h7e;mTsRw;<^^}rE0cBohM7i3a5U^RlsEI94Z#=Rdzw3RmneCRiBwwGv z;K6xcigfiM-kgDXKTX1$cGC9w0OSgP-2BD)N~yV|TN+~`04WpcU@NZ^bEOR7dziiR`;~_4sq``q7Q52uar%HD zP6{|{HNLqkq9(mTyA=_|YhGIKI|6jTj1)wvCH-g|w#pItbEK9h)0b;Tk~{ca1K5Ov z5-BM$IEy)>CYye^Df0uM}Rd!u>mxYrbdz+J)nbUmB8a+LR{yz4zCZ+XVcDI~t zqP=$QdRdLp2Rbu%4Pht+x0%*3**S1^vBlD_jOU1zH+VwW=B>~yDE#-K7%M?=z`RV& z!V{-+7<6#dUevc;@c{PSTBu6GidQ&LbEgKz&!-6H86OynaOFuW5!o;Hw96prE96*A z{Gu(A9uo=!d)Oq1%vi;BB|gFE7Mb6P?Snu29icUIgzD1I->(^9)0to)r=C79wSUbS zl<*Q_Lh1XuwM%TIQrGG@AFcfgv{yDRa?;U)Dov4m1Vw#L4GlDSFzZb+@2Z~OIw`f zyURjZ%}J75*NRMj*`z8F2ghs}-12)^PL5knQcVfp<)5`Z#d|^H+}P@%1xaiUMT8k$ zUwvFf3zuU@9)9Rbr%jgL*yOQQmgiyZqy>BOwH^t>8-EhnP+wtbx}t{eMOCHP&;V;- zP=&#ab1Vr*aTr|0#US(7Cx2+ze(%**&|7r}_d%0m8^^*|g5kAFr)0);2R$I=oE*lY z>bbanY{Hd4ud6yFH_F>=eQe9;yz4~Ugu0|Q5t?r@T>I3)?8(hi1zFOB#Jt8iS*Vr> z4LKokYEh+uAR5d+Jf=FNRfhRy<0l$a<`dszt1<(eOV;@+KrjRd-r0r4K3}D5{<}Ib zGpD9(@oT6JmRClt`{uxiqLqzXaFV3WeDth;a!#z|hI<8QRO&=?lY1@7P3k)R?-84Q zk_8gKxYa4F;ret8tJzLrf{t4OZHLt6Ieu-OEL8re;{kE~Uh)Ihn@H zdf4PiSVCZq@8g`ezh$iREU1n6bCXMCCcgVPKloZxKgh`X$EVV=01!K19ZwuLf zs|I~QMg9(mja-T;0s9UqncA}f2du5z?GF|c;qv7@`b9PAnXkm5y{LSY#w@^&R0&EwV@W7X%6;ErwW7A z_8q!B-hRDYyXARC!x!1Ix>05sMj+rSJeZt#eV)sw-!9(um)=TJn1KB0ij3Jd>+DTH zSc2t@sI;iCDy~IVXc^Se&d!^q#x@8Nj?VUxCTc>O2G#Ql1vA7P&9*QZmS}Io-DjPA z!ZBb~RY}&=?A_3rDm;JV#=&=>3`C+#+o$X=PP4Uj5X+jJ0@H06e21E%*pGBhQuFhFiUCH5txI(z%hT|HYiDp(1?VtXE;pZUDCcbdY^fQrb`g(OSB6C1DL4x#34u97R)-< zk*Q*c=w{dF4%=Fc&+|f~R04*=4sA=&5_YrLZ%y>xjI&>ja+==7(0vAweLs}1V_#=Y zA>RHN8v1j{+U#==)!7Tab@zPZpafb;{?Jfw2b=cdszdxeSMA8dx2!Gz{#0NfFj&<& z2F@^;&8j%JxZ}$8s)tN91=!7eKyNcTl&u#PJI4SqlX#z&xQwW&wO@c>RZjj%)&cJX zH%UWBg>cv-TE(2YTo0U1bJwB-#Q$_}^1$ zr+gs%LS~Csll4DmvhovHBBX`G8Op{e({@}h3mv_rtM9fgKbqe58HAN}1(hKjan|ng z+kBlN>6=*zJkxG!EwoFBOgs{7VIKD&IoeF6fH)}^7WJZLJMo_H?=C+sFbeRY)4|d?nl6fl!>is zU*AiEIxhB@QVHx6@0+QGi(LyLm<~GO78&+r6ivc8R%4w3!2rwi&iiuq7Y~MKyo(D- z4I&)HWbSu6XMZHW^&c3aE<54%+5e=OF_X*0-Je#`&@g#$rfTXxKCqg7( zG;1B}j2fV^eoX|uS=^G?4o(60cGlVLszK&kUZGg;{o|z&U}RRgb)#~P6!H6n{9OGx zZaZ&k$VSakw0&qS2Bv5mjI=}dRsCfW`Ik%wK^zCv)Z8G`UFx6xR!kIb-hAh~6Q~Qj zP(C&Gvur5TsOQ_TblkFC=@!eZ`xSV%#Cg|q{0-{dT2w42f5fT~l_RDB@}|;RxP3TN zWal7Xl&qxIH&+HTh*`G%M06i}7|+vV_@=h~zderne36Hoq%LlCZ1LsRFV@K>A=~Ok z-q@^GWT?1{j6j5=I>f`lHbfGUnvp!TwJAc|Hw@2z7KB;4Jb!|Nq<5-6@uWu!{ zOONzcSQmkqP~-6!Ty|P|MQ(M~+o^Q?aEl z!9x`~SYTgoTY8QBlErq_@S!|aYNmsmaNTGbdOr?)ZFEQs-E~~QFjSl;nZ|kslcZeZ TaZ5sM@@UEbKc_a)9%ud+Z6kpe literal 0 HcmV?d00001 diff --git a/utils/emulator/src/makefile.g95 b/utils/emulator/src/makefile.g95 new file mode 100644 index 0000000000..6bea4324fb --- /dev/null +++ b/utils/emulator/src/makefile.g95 @@ -0,0 +1,16 @@ +# +# File: makefile.g95 +# Author: Julian Smart +# Created: 1999 +# Updated: +# Copyright: (c) Julian Smart, 1999 +# +# Makefile for emulator (Cygwin/Mingw32). + +WXDIR = ../../.. + +TARGET=emulator +OBJECTS = $(TARGET).o + +include $(WXDIR)/src/makeprog.g95 + diff --git a/utils/emulator/src/makefile.vc b/utils/emulator/src/makefile.vc new file mode 100644 index 0000000000..8753e0716d --- /dev/null +++ b/utils/emulator/src/makefile.vc @@ -0,0 +1,18 @@ +# +# File: makefile.vc +# Author: Julian Smart +# Created: 1999 +# Updated: +# Copyright: (c) Julian Smart +# +# Makefile : Builds emulator (VC++, WIN32) +# Use FINAL=1 argument to nmake to build final version with no debug info. + +# Set WXDIR for your system +WXDIR = $(WXWIN) + +PROGRAM=emulator +OBJECTS = $(PROGRAM).obj + +!include $(WXDIR)\src\makeprog.vc + diff --git a/utils/emulator/src/mondrian.ico b/utils/emulator/src/mondrian.ico new file mode 100644 index 0000000000000000000000000000000000000000..2310c5d275a87af295d5ea8dc79ea417a5e74c53 GIT binary patch literal 766 zcmZQzU<5)11px*Sc)`TLAO@s0fLH;D9e|jTfdxnc0Z