unix build merged in, bitmap resources from xpm instead of rc, better addr relay...
authors_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
Thu, 5 Nov 2009 04:41:36 +0000 (04:41 +0000)
committers_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
Thu, 5 Nov 2009 04:41:36 +0000 (04:41 +0000)
git-svn-id: https://bitcoin.svn.sourceforge.net/svnroot/bitcoin/trunk@32 1a98c847-1fd6-4fd8-948a-caf3550aa51b

23 files changed:
build-unix.txt [new file with mode: 0644]
build.txt [deleted file]
db.cpp
headers.h
irc.cpp
irc.h
main.cpp
main.h
makefile.unix [new file with mode: 0644]
net.cpp
net.h
ui.cpp
uibase.cpp
uiproject.fbp
util.cpp
util.h
xpm/addressbook16.xpm [new file with mode: 0644]
xpm/addressbook20.xpm [new file with mode: 0644]
xpm/bitcoin.xpm [new file with mode: 0644]
xpm/check.xpm [new file with mode: 0644]
xpm/send16.xpm [new file with mode: 0644]
xpm/send16noshadow.xpm [new file with mode: 0644]
xpm/send20.xpm [new file with mode: 0644]

diff --git a/build-unix.txt b/build-unix.txt
new file mode 100644 (file)
index 0000000..6b29e1e
--- /dev/null
@@ -0,0 +1,73 @@
+Bitcoin v0.2.0 BETA\r
+\r
+Copyright (c) 2009 Satoshi Nakamoto\r
+Distributed under the MIT/X11 software license, see the accompanying\r
+file license.txt or http://www.opensource.org/licenses/mit-license.php.\r
+This product includes software developed by the OpenSSL Project for use in\r
+the OpenSSL Toolkit (http://www.openssl.org/).  This product includes\r
+cryptographic software written by Eric Young (eay@cryptsoft.com).\r
+\r
+\r
+UNIX BUILD NOTES\r
+\r
+\r
+Dependencies\r
+------------\r
+apt-get install build-essential\r
+apt-get install libgtk2.0-dev\r
+apt-get install libssl-dev\r
+\r
+Libraries you need to obtain separately and build:\r
+              default path   download\r
+wxWidgets      \wxwidgets     http://www.wxwidgets.org/downloads/\r
+Berkeley DB    \db            http://www.oracle.com/technology/software/products/berkeley-db/index.html\r
+Boost          \boost         http://www.boost.org/users/download/\r
+\r
+Their licenses:\r
+wxWidgets      LGPL 2.1 with very liberal exceptions\r
+Berkeley DB    New BSD license with additional requirement that linked software must be free open source\r
+Boost          MIT-like license\r
+\r
+Versions used in this release:\r
+GCC          4.3.3\r
+OpenSSL      0.9.8k\r
+wxWidgets    2.8.9\r
+Berkeley DB  4.7.25.NC\r
+Boost        1.40.0\r
+\r
+\r
+Notes\r
+-----\r
+The UI layout is edited with wxFormBuilder.  Open the project file\r
+uiproject.fbp.  It generates uibase.cpp and uibase.h, which define base\r
+classes that do the rote work of constructing all the UI elements.\r
+\r
+The release is built with GCC and then "strip bitcoin" to strip the debug\r
+symbols, which reduces the executable size by about 90%.\r
+\r
+\r
+wxWidgets\r
+---------\r
+cd /usr/local/wxWidgets-2.8.9\r
+mkdir buildgtk\r
+cd buildgtk\r
+../configure --with-gtk --enable-debug --disable-shared --enable-monolithic\r
+make\r
+su\r
+make install\r
+ldconfig\r
+\r
+\r
+Berkeley DB\r
+-----------\r
+cd /usr/local/db-4.7.25.NC/build_unix\r
+../dist/configure --enable-cxx\r
+make\r
+\r
+\r
+Boost\r
+-----\r
+cd /usr/local/boost_1_40_0\r
+su\r
+./bootstrap.sh\r
+./bjam install\r
diff --git a/build.txt b/build.txt
deleted file mode 100644 (file)
index 4368af8..0000000
--- a/build.txt
+++ /dev/null
@@ -1,88 +0,0 @@
-BitCoin v0.1.6 BETA\r
-\r
-Copyright (c) 2009 Satoshi Nakamoto\r
-Distributed under the MIT/X11 software license, see the accompanying\r
-file license.txt or http://www.opensource.org/licenses/mit-license.php.\r
-This product includes software developed by the OpenSSL Project for use in\r
-the OpenSSL Toolkit (http://www.openssl.org/).  This product includes\r
-cryptographic software written by Eric Young (eay@cryptsoft.com).\r
-\r
-\r
-Compilers Supported\r
--------------------\r
-MinGW GCC (v3.4.5)\r
-Microsoft Visual C++ 6.0 SP6\r
-\r
-\r
-Dependencies\r
-------------\r
-Libraries you need to obtain separately to build:\r
-\r
-              default path   download\r
-wxWidgets      \wxwidgets     http://www.wxwidgets.org/downloads/\r
-                                or prebuilt: http://wxpack.sourceforge.net\r
-OpenSSL        \openssl       http://www.openssl.org/source/\r
-Berkeley DB    \db            http://www.oracle.com/technology/software/products/berkeley-db/index.html\r
-Boost          \boost         http://www.boost.org/users/download/\r
-\r
-Their licenses:\r
-wxWidgets      LGPL 2.1 with very liberal exceptions\r
-OpenSSL        Old BSD license with the problematic advertising requirement\r
-Berkeley DB    New BSD license with additional requirement that linked software must be free open source\r
-Boost          MIT-like license\r
-\r
-\r
-Notes\r
------\r
-The UI layout is edited with wxFormBuilder.  Open the project file\r
-uiproject.fbp.  It generates uibase.cpp and uibase.h, which define base\r
-classes that do the rote work of constructing all the UI elements.\r
-\r
-The release is built with GCC and then "strip bitcoin.exe" to strip the debug\r
-symbols, which reduces the executable size by about 90%.\r
-\r
-\r
-OpenSSL\r
--------\r
-Bitcoin does not use any encryption.  If you want to do a no-everything\r
-build of OpenSSL to exclude encryption routines, a few patches are required.\r
-(OpenSSL v0.9.8h)\r
-\r
-Edit engines\e_gmp.c and put this #ifndef around #include <openssl/rsa.h>\r
-  #ifndef OPENSSL_NO_RSA\r
-  #include <openssl/rsa.h>\r
-  #endif\r
-\r
-Add this to crypto\err\err_all.c before the ERR_load_crypto_strings line:\r
-  void ERR_load_RSA_strings(void) { }\r
-\r
-Edit ms\mingw32.bat and replace the Configure line's parameters with this\r
-no-everything list.  You have to put this in the batch file because batch\r
-files can't take more than 9 command line parameters.\r
-  perl Configure mingw threads no-rc2 no-rc4 no-rc5 no-idea no-des no-bf no-cast no-aes no-camellia no-seed no-rsa no-dh\r
-\r
-Also REM out the following line in ms\mingw32.bat.  The build fails after it's\r
-already finished building libeay32, which is all we care about, but the\r
-failure aborts the script before it runs dllwrap to generate libeay32.dll.\r
-  REM  if errorlevel 1 goto end\r
-\r
-Build\r
-  ms\mingw32.bat\r
-\r
-If you want to use it with MSVC, generate the .lib file\r
-  lib /machine:i386 /def:ms\libeay32.def /out:out\libeay32.lib\r
-\r
-\r
-Berkeley DB\r
------------\r
-Using MinGW and MSYS:\r
-cd \db\build_unix\r
-sh ../dist/configure --enable-mingw --enable-cxx\r
-make\r
-\r
-\r
-Boost\r
------\r
-If you have trouble compiling Boost with Microsoft Visual C++ 6.0, try going\r
-back to Boost version 1.35.  It looks like they may be starting to reduce\r
-support for MSVC 6.0.\r
diff --git a/db.cpp b/db.cpp
index f9e2583..b702b0c 100644 (file)
--- a/db.cpp
+++ b/db.cpp
@@ -62,9 +62,9 @@ CDB::CDB(const char* pszFile, const char* pszMode, bool fTxn) : pdb(NULL)
             if (fShutdown)\r
                 return;\r
             string strDataDir = GetDataDir();\r
-            string strLogDir = strDataDir + "\\database";\r
+            string strLogDir = strDataDir + "/database";\r
             _mkdir(strLogDir.c_str());\r
-            string strErrorFile = strDataDir + "\\db.log";\r
+            string strErrorFile = strDataDir + "/db.log";\r
             printf("dbenv.open strLogDir=%s strErrorFile=%s\n", strLogDir.c_str(), strErrorFile.c_str());\r
 \r
             dbenv.set_lg_dir(strLogDir.c_str());\r
@@ -411,7 +411,6 @@ bool CAddrDB::WriteAddress(const CAddress& addr)
 \r
 bool CAddrDB::LoadAddresses()\r
 {\r
-    CRITICAL_BLOCK(cs_mapIRCAddresses)\r
     CRITICAL_BLOCK(cs_mapAddresses)\r
     {\r
         // Load user provided addresses\r
@@ -425,10 +424,7 @@ bool CAddrDB::LoadAddresses()
                 {\r
                     CAddress addr(psz, NODE_NETWORK);\r
                     if (addr.IsValid())\r
-                    {\r
                         AddAddress(*this, addr);\r
-                        mapIRCAddresses.insert(make_pair(addr.GetKey(), addr));\r
-                    }\r
                 }\r
             }\r
             catch (...) { }\r
@@ -678,7 +674,7 @@ void ThreadFlushWalletDB(void* parg)
                     if (nRefCount == 0 && !fShutdown)\r
                     {\r
                         // Flush wallet.dat so it's self contained\r
-                        nLastFlushed == nWalletDBUpdated;\r
+                        nLastFlushed = nWalletDBUpdated;\r
                         int64 nStart = GetTimeMillis();\r
                         dbenv.txn_checkpoint(0, 0, 0);\r
                         dbenv.lsn_reset(strFile.c_str(), 0);\r
index f00b7dd..c7f3cd8 100644 (file)
--- a/headers.h
+++ b/headers.h
 #endif\r
 #define _WIN32_IE 0x0400\r
 #define WIN32_LEAN_AND_MEAN 1\r
+#define __STDC_LIMIT_MACROS // to enable UINT64_MAX from stdint.h\r
 #include <wx/wx.h>\r
 #include <wx/clipbrd.h>\r
 #include <wx/snglinst.h>\r
 #include <wx/taskbar.h>\r
 #include <wx/stdpaths.h>\r
+#include <wx/utils.h>\r
 #include <openssl/ecdsa.h>\r
 #include <openssl/evp.h>\r
 #include <openssl/rand.h>\r
 #include <openssl/sha.h>\r
-#include <openssl/ripemd.h>
+#include <openssl/ripemd.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <math.h>\r
 #include <boost/tuple/tuple.hpp>\r
 #include <boost/tuple/tuple_comparison.hpp>\r
 #include <boost/tuple/tuple_io.hpp>\r
-#include <boost/array.hpp>
-
+#include <boost/array.hpp>\r
+\r
 #ifdef __WXMSW__\r
 #include <windows.h>\r
 #include <winsock2.h>\r
-#include <mswsock.h>
+#include <mswsock.h>\r
 #include <shlobj.h>\r
-#include <shlwapi.h>
-#include <io.h>
-#include <process.h>
-#else
+#include <shlwapi.h>\r
+#include <io.h>\r
+#include <process.h>\r
+#else\r
 #include <sys/time.h>\r
+#include <sys/resource.h>\r
 #include <sys/socket.h>\r
-#include <arpa/inet.h>
-#include <unistd.h>
-#endif
+#include <arpa/inet.h>\r
+#include <netdb.h>\r
+#include <unistd.h>\r
+#include <errno.h>\r
+#include <boost/filesystem.hpp>\r
+#include <boost/thread/thread.hpp>\r
+#include <boost/algorithm/string.hpp>\r
+#endif\r
 \r
 #pragma hdrstop\r
 using namespace std;\r
@@ -88,3 +96,11 @@ using namespace boost;
 #include "market.h"\r
 #include "uibase.h"\r
 #include "ui.h"\r
+\r
+#include "xpm/addressbook16.xpm"\r
+#include "xpm/addressbook20.xpm"\r
+#include "xpm/bitcoin.xpm"\r
+#include "xpm/check.xpm"\r
+#include "xpm/send16.xpm"\r
+#include "xpm/send16noshadow.xpm"\r
+#include "xpm/send20.xpm"\r
diff --git a/irc.cpp b/irc.cpp
index f839dc5..4d4ed0f 100644 (file)
--- a/irc.cpp
+++ b/irc.cpp
@@ -4,10 +4,7 @@
 \r
 #include "headers.h"\r
 \r
-\r
-map<vector<unsigned char>, CAddress> mapIRCAddresses;\r
-CCriticalSection cs_mapIRCAddresses;\r
-\r
+int nGotIRCAddresses = 0;\r
 \r
 \r
 \r
@@ -259,16 +256,7 @@ void ThreadIRCSeed(void* parg)
                     CAddrDB addrdb;\r
                     if (AddAddress(addrdb, addr))\r
                         printf("IRC got new address\n");\r
-                    else\r
-                    {\r
-                        // make it try connecting again\r
-                        CRITICAL_BLOCK(cs_mapAddresses)\r
-                            if (mapAddresses.count(addr.GetKey()))\r
-                                mapAddresses[addr.GetKey()].nLastFailed = 0;\r
-                    }\r
-\r
-                    CRITICAL_BLOCK(cs_mapIRCAddresses)\r
-                        mapIRCAddresses.insert(make_pair(addr.GetKey(), addr));\r
+                    nGotIRCAddresses++;\r
                 }\r
                 else\r
                 {\r
diff --git a/irc.h b/irc.h
index 91c3ffe..c69fd9e 100644 (file)
--- a/irc.h
+++ b/irc.h
@@ -4,7 +4,5 @@
 \r
 extern bool RecvLine(SOCKET hSocket, string& strLine);\r
 extern void ThreadIRCSeed(void* parg);\r
-extern bool fRestartIRCSeed;\r
 \r
-extern map<vector<unsigned char>, CAddress> mapIRCAddresses;\r
-extern CCriticalSection cs_mapIRCAddresses;\r
+extern int nGotIRCAddresses;\r
index ade3b51..2119495 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -100,13 +100,10 @@ bool AddToWallet(const CWalletTx& wtxIn)
         if (fInsertedNew)\r
             wtx.nTimeReceived = GetAdjustedTime();\r
 \r
-        //// debug print\r
-        printf("AddToWallet %s  %s\n", wtxIn.GetHash().ToString().substr(0,6).c_str(), fInsertedNew ? "new" : "update");\r
-\r
+        bool fUpdated = false;\r
         if (!fInsertedNew)\r
         {\r
             // Merge\r
-            bool fUpdated = false;\r
             if (wtxIn.hashBlock != 0 && wtxIn.hashBlock != wtx.hashBlock)\r
             {\r
                 wtx.hashBlock = wtxIn.hashBlock;\r
@@ -128,13 +125,15 @@ bool AddToWallet(const CWalletTx& wtxIn)
                 wtx.fSpent = wtxIn.fSpent;\r
                 fUpdated = true;\r
             }\r
-            if (!fUpdated)\r
-                return true;\r
         }\r
 \r
+        //// debug print\r
+        printf("AddToWallet %s  %s%s\n", wtxIn.GetHash().ToString().substr(0,6).c_str(), (fInsertedNew ? "new" : ""), (fUpdated ? "update" : ""));\r
+\r
         // Write to disk\r
-        if (!wtx.WriteToDisk())\r
-            return false;\r
+        if (fInsertedNew || fUpdated)\r
+            if (!wtx.WriteToDisk())\r
+                return false;\r
 \r
         // Notify UI\r
         vWalletUpdated.push_back(hash);\r
@@ -820,7 +819,7 @@ bool CTransaction::ConnectInputs(CTxDB& txdb, map<uint256, CTxIndex>& mapTestPoo
             }\r
 \r
             if (prevout.n >= txPrev.vout.size() || prevout.n >= txindex.vSpent.size())\r
-                return error("ConnectInputs() : %s prevout.n out of range %d %d %d", GetHash().ToString().substr(0,6).c_str(), prevout.n, txPrev.vout.size(), txindex.vSpent.size());\r
+                return error("ConnectInputs() : %s prevout.n out of range %d %d %d prev tx %s\n%s", GetHash().ToString().substr(0,6).c_str(), prevout.n, txPrev.vout.size(), txindex.vSpent.size(), prevout.hash.ToString().substr(0,6).c_str(), txPrev.ToString().c_str());\r
 \r
             // If prev is coinbase, check that it's matured\r
             if (txPrev.IsCoinBase())\r
@@ -1217,7 +1216,7 @@ bool CBlock::AcceptBlock()
     if (nTime <= pindexPrev->GetMedianTimePast())\r
         return error("AcceptBlock() : block's timestamp is too early");\r
 \r
-    // Check that all transactions are finalized (starting around 30 Nov 2009)\r
+    // Check that all transactions are finalized (starting around Dec 2009)\r
     if (nBestHeight > 31000) // 25620 + 5320\r
         foreach(const CTransaction& tx, vtx)\r
             if (!tx.IsFinal(nTime))\r
@@ -1384,7 +1383,7 @@ FILE* OpenBlockFile(unsigned int nFile, unsigned int nBlockPos, const char* pszM
 {\r
     if (nFile == -1)\r
         return NULL;\r
-    FILE* file = fopen(strprintf("%s\\blk%04d.dat", GetDataDir().c_str(), nFile).c_str(), pszMode);\r
+    FILE* file = fopen(strprintf("%s/blk%04d.dat", GetDataDir().c_str(), nFile).c_str(), pszMode);\r
     if (!file)\r
         return NULL;\r
     if (nBlockPos != 0 && !strchr(pszMode, 'a') && !strchr(pszMode, 'w'))\r
@@ -1718,6 +1717,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
 \r
 \r
 \r
+\r
     if (strCommand == "version")\r
     {\r
         // Each connection can only send one version message\r
@@ -1765,6 +1765,10 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
 \r
         pfrom->fSuccessfullyConnected = true;\r
 \r
+        // Update the last seen time\r
+        if (pfrom->fNetworkNode)\r
+            AddressCurrentlyConnected(pfrom->addr);\r
+\r
         printf("version message: version %d\n", pfrom->nVersion);\r
     }\r
 \r
@@ -1781,23 +1785,16 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
         vector<CAddress> vAddr;\r
         vRecv >> vAddr;\r
 \r
-        // Clear addrknown lists periodically to allow refresh broadcasts\r
-        static int64 nLastClearedAddrKnown;\r
-        if (nLastClearedAddrKnown < GetAdjustedTime() - 24 * 60 * 60)\r
-        {\r
-            nLastClearedAddrKnown = GetAdjustedTime();\r
-            CRITICAL_BLOCK(cs_vNodes)\r
-                foreach(CNode* pnode, vNodes)\r
-                    pnode->setAddrKnown.clear();\r
-        }\r
-\r
         // Store the new addresses\r
         CAddrDB addrdb;\r
-        foreach(const CAddress& addr, vAddr)\r
+        foreach(CAddress& addr, vAddr)\r
         {\r
             if (fShutdown)\r
                 return true;\r
-            AddAddress(addrdb, addr);\r
+            addr.nTime = GetAdjustedTime();\r
+            if (pfrom->fGetAddr)\r
+                addr.nTime -= 5 * 24 * 60 * 60;\r
+            AddAddress(addrdb, addr, false);\r
             pfrom->AddAddressKnown(addr);\r
             if (!pfrom->fGetAddr && addr.IsRoutable())\r
             {\r
@@ -1816,6 +1813,10 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
         vector<CInv> vInv;\r
         vRecv >> vInv;\r
 \r
+        // Update the last seen time for this node's address\r
+        if (pfrom->fNetworkNode)\r
+            AddressCurrentlyConnected(pfrom->addr);\r
+\r
         CTxDB txdb("r");\r
         foreach(const CInv& inv, vInv)\r
         {\r
@@ -2099,6 +2100,25 @@ bool SendMessages(CNode* pto)
         if (pto->nVersion == 0)\r
             return true;\r
 \r
+        // Address refresh broadcast\r
+        static int64 nLastRebroadcast;\r
+        if (nLastRebroadcast < GetTime() - 24 * 60 * 60) // every 24 hours\r
+        {\r
+            nLastRebroadcast = GetTime();\r
+            CRITICAL_BLOCK(cs_vNodes)\r
+            {\r
+                foreach(CNode* pnode, vNodes)\r
+                {\r
+                    // Periodically clear setAddrKnown to allow refresh broadcasts\r
+                    pnode->setAddrKnown.clear();\r
+\r
+                    // Rebroadcast our address\r
+                    if (addrLocalHost.IsRoutable() && !fUseProxy)\r
+                        pnode->PushAddress(addrLocalHost);\r
+                }\r
+            }\r
+        }\r
+\r
 \r
         //\r
         // Message: addr\r
@@ -2187,7 +2207,7 @@ void GenerateBitcoins(bool fGenerate)
     }\r
     if (fGenerateBitcoins)\r
     {\r
-        int nProcessors = atoi(getenv("NUMBER_OF_PROCESSORS"));\r
+        int nProcessors = wxThread::GetCPUCount();\r
         printf("%d processors\n", nProcessors);\r
         if (nProcessors < 1)\r
             nProcessors = 1;\r
diff --git a/main.h b/main.h
index a0258cf..6d8f0ed 100644 (file)
--- a/main.h
+++ b/main.h
@@ -968,6 +968,14 @@ public:
             return error("CBlock::WriteToDisk() : ftell failed");\r
         fileout << *this;\r
 \r
+        // Flush stdio buffers and commit to disk before returning\r
+        fflush(fileout);\r
+#ifdef __WXMSW__\r
+        _commit(_fileno(fileout));\r
+#else\r
+        fsync(fileno(fileout));\r
+#endif\r
+\r
         return true;\r
     }\r
 \r
diff --git a/makefile.unix b/makefile.unix
new file mode 100644 (file)
index 0000000..c62efc0
--- /dev/null
@@ -0,0 +1,86 @@
+# Copyright (c) 2009 Satoshi Nakamoto\r
+# Distributed under the MIT/X11 software license, see the accompanying\r
+# file license.txt or http://www.opensource.org/licenses/mit-license.php.\r
+\r
+\r
+ifneq "$(BUILD)" "debug"\r
+ifneq "$(BUILD)" "release"\r
+BUILD=debug\r
+endif\r
+endif\r
+ifeq "$(BUILD)" "debug"\r
+D=d\r
+DEBUGFLAGS=-g -D__WXDEBUG__\r
+endif\r
+\r
+\r
+\r
+INCLUDEPATHS=-I"/usr/include" \\r
+             -I"/usr/local/boost_1_40_0" \\r
+             -I"/usr/local/db-4.7.25.NC/build_unix" \\r
+             -I"/usr/local/include/wx-2.8" \\r
+             -I"/usr/local/lib/wx/include/gtk2-ansi-debug-static-2.8"\r
+\r
+LIBPATHS=-L"/usr/lib" \\r
+         -L"/usr/local/lib" \\r
+         -L"/usr/local/db-4.7.25.NC/build_unix"\r
+\r
+LIBS= \\r
+ -Wl,-Bstatic -l boost_thread -l boost_system -l boost_filesystem -Wl,-Bdynamic \\r
+ -Wl,-Bstatic -l db_cxx -l wx_gtk2$(D)-2.8 -Wl,-Bdynamic \\r
+ -l crypto \\r
+ -l gtk-x11-2.0 -l gthread-2.0 -l SM\r
+WXDEFS=-D__WXGTK__ -DNOPCH\r
+CFLAGS=-O0 -w -Wno-invalid-offsetof -Wformat $(DEBUGFLAGS) $(WXDEFS) $(INCLUDEPATHS)\r
+HEADERS=headers.h util.h main.h serialize.h uint256.h key.h bignum.h script.h db.h base58.h\r
+\r
+\r
+\r
+all: bitcoin\r
+\r
+\r
+headers.h.gch: headers.h $(HEADERS) net.h irc.h market.h uibase.h ui.h\r
+       g++ -c $(CFLAGS) -o $@ $<\r
+\r
+obj/util.o: util.cpp               $(HEADERS)\r
+       g++ -c $(CFLAGS) -o $@ $<\r
+\r
+obj/script.o: script.cpp           $(HEADERS)\r
+       g++ -c $(CFLAGS) -o $@ $<\r
+\r
+obj/db.o: db.cpp                   $(HEADERS) market.h\r
+       g++ -c $(CFLAGS) -o $@ $<\r
+\r
+obj/net.o: net.cpp                 $(HEADERS) net.h\r
+       g++ -c $(CFLAGS) -o $@ $<\r
+\r
+obj/main.o: main.cpp               $(HEADERS) net.h market.h sha.h\r
+       g++ -c $(CFLAGS) -o $@ $<\r
+\r
+obj/market.o: market.cpp           $(HEADERS) market.h\r
+       g++ -c $(CFLAGS) -o $@ $<\r
+\r
+obj/ui.o: ui.cpp                   $(HEADERS) net.h uibase.h ui.h market.h\r
+       g++ -c $(CFLAGS) -o $@ $<\r
+\r
+obj/uibase.o: uibase.cpp           uibase.h\r
+       g++ -c $(CFLAGS) -o $@ $<\r
+\r
+obj/sha.o: sha.cpp                 sha.h\r
+       g++ -c $(CFLAGS) -O3 -o $@ $<\r
+\r
+obj/irc.o:  irc.cpp                $(HEADERS)\r
+       g++ -c $(CFLAGS) -o $@ $<\r
+\r
+\r
+\r
+\r
+OBJS=obj/util.o obj/script.o obj/db.o obj/net.o obj/main.o obj/market.o \\r
+       obj/ui.o obj/uibase.o obj/sha.o obj/irc.o \r
+\r
+bitcoin: headers.h.gch $(OBJS)\r
+       g++ $(CFLAGS) -o $@ $(LIBPATHS) $(OBJS) $(LIBS)\r
+\r
+clean:\r
+       -rm obj/*\r
+       -rm headers.h.gch\r
diff --git a/net.cpp b/net.cpp
index 8ccf48b..c14061e 100644 (file)
--- a/net.cpp
+++ b/net.cpp
@@ -3,7 +3,6 @@
 // file license.txt or http://www.opensource.org/licenses/mit-license.php.\r
 \r
 #include "headers.h"\r
-#include <winsock2.h>\r
 \r
 void ThreadMessageHandler2(void* parg);\r
 void ThreadSocketHandler2(void* parg);\r
@@ -201,12 +200,14 @@ bool GetMyExternalIP(unsigned int& ipRet)
 \r
 \r
 \r
-bool AddAddress(CAddrDB& addrdb, const CAddress& addr)\r
+bool AddAddress(CAddrDB& addrdb, CAddress addr, bool fCurrentlyOnline)\r
 {\r
     if (!addr.IsRoutable())\r
         return false;\r
     if (addr.ip == addrLocalHost.ip)\r
         return false;\r
+    if (fCurrentlyOnline)\r
+        addr.nTime = GetAdjustedTime();\r
     CRITICAL_BLOCK(cs_mapAddresses)\r
     {\r
         map<vector<unsigned char>, CAddress>::iterator it = mapAddresses.find(addr.GetKey());\r
@@ -219,24 +220,47 @@ bool AddAddress(CAddrDB& addrdb, const CAddress& addr)
         }\r
         else\r
         {\r
+            bool fUpdated = false;\r
             CAddress& addrFound = (*it).second;\r
             if ((addrFound.nServices | addr.nServices) != addrFound.nServices)\r
             {\r
                 // Services have been added\r
                 addrFound.nServices |= addr.nServices;\r
-                addrdb.WriteAddress(addrFound);\r
-                return true;\r
+                fUpdated = true;\r
+            }\r
+            int64 nUpdateInterval = (fCurrentlyOnline ? 60 * 60 : 24 * 60 * 60);\r
+            if (addrFound.nTime < addr.nTime - nUpdateInterval)\r
+            {\r
+                // Periodically update most recently seen time\r
+                addrFound.nTime = addr.nTime;\r
+                fUpdated = true;\r
             }\r
-            else if (addrFound.nTime < GetAdjustedTime() - 24 * 60 * 60)\r
+            if (fUpdated)\r
+                addrdb.WriteAddress(addrFound);\r
+        }\r
+    }\r
+    return false;\r
+}\r
+\r
+void AddressCurrentlyConnected(const CAddress& addr)\r
+{\r
+    CRITICAL_BLOCK(cs_mapAddresses)\r
+    {\r
+        // Only if it's been published already\r
+        map<vector<unsigned char>, CAddress>::iterator it = mapAddresses.find(addr.GetKey());\r
+        if (it != mapAddresses.end())\r
+        {\r
+            CAddress& addrFound = (*it).second;\r
+            int64 nUpdateInterval = 60 * 60;\r
+            if (addrFound.nTime < GetAdjustedTime() - nUpdateInterval)\r
             {\r
                 // Periodically update most recently seen time\r
                 addrFound.nTime = GetAdjustedTime();\r
+                CAddrDB addrdb;\r
                 addrdb.WriteAddress(addrFound);\r
-                return false;\r
             }\r
         }\r
     }\r
-    return false;\r
 }\r
 \r
 \r
@@ -398,9 +422,14 @@ CNode* ConnectNode(CAddress addrConnect, int64 nTimeout)
         printf("connected %s\n", addrConnect.ToStringLog().c_str());\r
 \r
         // Set to nonblocking\r
-        u_long nOne = 1;\r
+#ifdef __WXMSW__\r
+               u_long nOne = 1;\r
         if (ioctlsocket(hSocket, FIONBIO, &nOne) == SOCKET_ERROR)\r
             printf("ConnectSocket() : ioctlsocket nonblocking setting failed, error %d\n", WSAGetLastError());\r
+#else\r
+        if (fcntl(hSocket, F_SETFL, O_NONBLOCK) == SOCKET_ERROR)\r
+            printf("ConnectSocket() : fcntl nonblocking setting failed, error %d\n", errno);\r
+#endif\r
 \r
         // Add node\r
         CNode* pnode = new CNode(hSocket, addrConnect, false);\r
@@ -418,7 +447,7 @@ CNode* ConnectNode(CAddress addrConnect, int64 nTimeout)
     else\r
     {\r
         CRITICAL_BLOCK(cs_mapAddresses)\r
-            mapAddresses[addrConnect.GetKey()].nLastFailed = GetTime();\r
+            mapAddresses[addrConnect.GetKey()].nLastFailed = GetAdjustedTime();\r
         return NULL;\r
     }\r
 }\r
@@ -432,7 +461,7 @@ void CNode::DoDisconnect()
     // If outbound and never got version message, mark address as failed\r
     if (!fInbound && !fSuccessfullyConnected)\r
         CRITICAL_BLOCK(cs_mapAddresses)\r
-            mapAddresses[addr.GetKey()].nLastFailed = GetTime();\r
+            mapAddresses[addr.GetKey()].nLastFailed = GetAdjustedTime();\r
 \r
     // All of a nodes broadcasts and subscriptions are automatically torn down\r
     // when it goes down, so a node has to stay up to keep its broadcast going.\r
@@ -549,8 +578,8 @@ void ThreadSocketHandler2(void* parg)
         timeout.tv_sec  = 0;\r
         timeout.tv_usec = 50000; // frequency to poll pnode->vSend\r
 \r
-        struct fd_set fdsetRecv;\r
-        struct fd_set fdsetSend;\r
+        fd_set fdsetRecv;\r
+        fd_set fdsetSend;\r
         FD_ZERO(&fdsetRecv);\r
         FD_ZERO(&fdsetSend);\r
         SOCKET hSocketMax = 0;\r
@@ -599,7 +628,11 @@ void ThreadSocketHandler2(void* parg)
         if (FD_ISSET(hListenSocket, &fdsetRecv))\r
         {\r
             struct sockaddr_in sockaddr;\r
+#ifdef __WXMSW__\r
             int len = sizeof(sockaddr);\r
+#else\r
+            socklen_t len = sizeof(sockaddr);\r
+#endif\r
             SOCKET hSocket = accept(hListenSocket, (struct sockaddr*)&sockaddr, &len);\r
             CAddress addr(sockaddr);\r
             if (hSocket == INVALID_SOCKET)\r
@@ -765,14 +798,12 @@ void ThreadOpenConnections2(void* parg)
     }\r
 \r
     // Initiate network connections\r
-    int nTry = 0;\r
-    bool fIRCOnly = false;\r
-    const int nMaxConnections = 15;\r
     loop\r
     {\r
         // Wait\r
         vnThreadsRunning[1]--;\r
         Sleep(500);\r
+        const int nMaxConnections = 15;\r
         while (vNodes.size() >= nMaxConnections || vNodes.size() >= mapAddresses.size())\r
         {\r
             CheckForShutdown(1);\r
@@ -781,93 +812,55 @@ void ThreadOpenConnections2(void* parg)
         vnThreadsRunning[1]++;\r
         CheckForShutdown(1);\r
 \r
-\r
         //\r
-        // The IP selection process is designed to limit vulnerability to address flooding.\r
-        // Any class C (a.b.c.?) has an equal chance of being chosen, then an IP is\r
-        // chosen within the class C.  An attacker may be able to allocate many IPs, but\r
-        // they would normally be concentrated in blocks of class C's.  They can hog the\r
-        // attention within their class C, but not the whole IP address space overall.\r
-        // A lone node in a class C will get as much attention as someone holding all 255\r
-        // IPs in another class C.\r
+        // Choose an address to connect to based on most recently seen\r
         //\r
+        CAddress addrConnect;\r
+        int64 nBestTime = 0;\r
+        int64 nDelay = ((60 * 60) << vNodes.size());\r
+        if (vNodes.size() >= 3)\r
+            nDelay *= 4;\r
+        if (nGotIRCAddresses > 0)\r
+            nDelay *= 100;\r
+\r
+        // Do this here so we don't have to critsect vNodes inside mapAddresses critsect\r
+        set<unsigned int> setConnected;\r
+        CRITICAL_BLOCK(cs_vNodes)\r
+            foreach(CNode* pnode, vNodes)\r
+                setConnected.insert(pnode->addr.ip);\r
 \r
-        // Every other try is with IRC addresses only\r
-        fIRCOnly = !fIRCOnly;\r
-        if (mapIRCAddresses.empty())\r
-            fIRCOnly = false;\r
-        else if (nTry++ < 30 && vNodes.size() < nMaxConnections/2)\r
-            fIRCOnly = true;\r
-\r
-        // Make a list of unique class C's\r
-        unsigned char pchIPCMask[4] = { 0xff, 0xff, 0xff, 0x00 };\r
-        unsigned int nIPCMask = *(unsigned int*)pchIPCMask;\r
-        vector<unsigned int> vIPC;\r
-        CRITICAL_BLOCK(cs_mapIRCAddresses)\r
         CRITICAL_BLOCK(cs_mapAddresses)\r
         {\r
-            vIPC.reserve(mapAddresses.size());\r
-            unsigned int nPrev = 0;\r
             foreach(const PAIRTYPE(vector<unsigned char>, CAddress)& item, mapAddresses)\r
             {\r
                 const CAddress& addr = item.second;\r
-                if (!addr.IsIPv4())\r
-                    continue;\r
-                if (fIRCOnly && !mapIRCAddresses.count(item.first))\r
+                if (!addr.IsIPv4() || !addr.IsValid() || setConnected.count(addr.ip))\r
                     continue;\r
 \r
-                // Taking advantage of mapAddresses being in sorted order,\r
-                // with IPs of the same class C grouped together.\r
-                unsigned int ipC = addr.ip & nIPCMask;\r
-                if (ipC != nPrev)\r
-                    vIPC.push_back(nPrev = ipC);\r
-            }\r
-        }\r
-        if (vIPC.empty())\r
-            continue;\r
-\r
-        // Choose a random class C\r
-        unsigned int ipC = vIPC[GetRand(vIPC.size())];\r
+                // Limit retry frequency\r
+                if (GetAdjustedTime() < addr.nLastFailed + nDelay)\r
+                    continue;\r
 \r
-        // Organize all addresses in the class C by IP\r
-        map<unsigned int, vector<CAddress> > mapIP;\r
-        CRITICAL_BLOCK(cs_mapIRCAddresses)\r
-        CRITICAL_BLOCK(cs_mapAddresses)\r
-        {\r
-            int64 nDelay = ((30 * 60) << vNodes.size());\r
-            if (!fIRCOnly)\r
-            {\r
-                nDelay *= 2;\r
-                if (vNodes.size() >= 3)\r
-                    nDelay *= 4;\r
-                if (!mapIRCAddresses.empty())\r
-                    nDelay *= 100;\r
-            }\r
+                // Try again only after all addresses had a first attempt\r
+                int64 nTime = addr.nTime;\r
+                if (addr.nLastFailed > addr.nTime)\r
+                    nTime -= 365 * 24 * 60 * 60;\r
 \r
-            for (map<vector<unsigned char>, CAddress>::iterator mi = mapAddresses.lower_bound(CAddress(ipC, 0).GetKey());\r
-                 mi != mapAddresses.upper_bound(CAddress(ipC | ~nIPCMask, 0xffff).GetKey());\r
-                 ++mi)\r
-            {\r
-                const CAddress& addr = (*mi).second;\r
-                if (fIRCOnly && !mapIRCAddresses.count((*mi).first))\r
-                    continue;\r
+                // Randomize the order a little, putting the standard port first\r
+                nTime += GetRand(1 * 60 * 60);\r
+                if (addr.port != DEFAULT_PORT)\r
+                    nTime -= 1 * 60 * 60;\r
 \r
-                int64 nRandomizer = (addr.nLastFailed * addr.ip * 7777U) % 20000;\r
-                if (GetTime() - addr.nLastFailed > nDelay * nRandomizer / 10000)\r
-                    mapIP[addr.ip].push_back(addr);\r
+                if (nTime > nBestTime)\r
+                {\r
+                    nBestTime = nTime;\r
+                    addrConnect = addr;\r
+                }\r
             }\r
         }\r
-        if (mapIP.empty())\r
-            continue;\r
-\r
-        // Choose a random IP in the class C\r
-        map<unsigned int, vector<CAddress> >::iterator mi = mapIP.begin();\r
-        advance(mi, GetRand(mapIP.size()));\r
 \r
-        // Once we've chosen an IP, we'll try every given port before moving on\r
-        foreach(const CAddress& addrConnect, (*mi).second)\r
-            if (OpenNetworkConnection(addrConnect))\r
-                break;\r
+        if (addrConnect.IsValid())\r
+            OpenNetworkConnection(addrConnect);\r
     }\r
 }\r
 \r
@@ -989,6 +982,7 @@ bool StartNode(string& strError)
         pnodeLocalHost = new CNode(INVALID_SOCKET, CAddress("127.0.0.1", nLocalServices));\r
     strError = "";\r
 \r
+#ifdef __WXMSW__\r
     // Sockets startup\r
     WSADATA wsadata;\r
     int ret = WSAStartup(MAKEWORD(2,2), &wsadata);\r
@@ -998,6 +992,7 @@ bool StartNode(string& strError)
         printf("%s\n", strError.c_str());\r
         return false;\r
     }\r
+#endif\r
 \r
     // Get local host ip\r
     char pszHostName[255];\r
@@ -1029,10 +1024,14 @@ bool StartNode(string& strError)
     }\r
 \r
     // Set to nonblocking, incoming connections will also inherit this\r
+#ifdef __WXMSW__\r
     u_long nOne = 1;\r
     if (ioctlsocket(hListenSocket, FIONBIO, &nOne) == SOCKET_ERROR)\r
+#else\r
+    if (fcntl(hListenSocket, F_SETFL, O_NONBLOCK) == SOCKET_ERROR)\r
+#endif\r
     {\r
-        strError = strprintf("Error: Couldn't set properties on socket for incoming connections (ioctlsocket returned error %d)", WSAGetLastError());\r
+        strError = strprintf("Error: Couldn't set properties on socket for incoming connections (error %d)", WSAGetLastError());\r
         printf("%s\n", strError.c_str());\r
         return false;\r
     }\r
@@ -1041,7 +1040,7 @@ bool StartNode(string& strError)
     // IP address, and port for the socket that is being bound\r
     int nRetryLimit = 15;\r
     struct sockaddr_in sockaddr = addrLocalHost.GetSockAddr();\r
-    if (bind(hListenSocket, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) == SOCKET_ERROR)\r
+    if (::bind(hListenSocket, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) == SOCKET_ERROR)\r
     {\r
         int nErr = WSAGetLastError();\r
         if (nErr == WSAEADDRINUSE)\r
@@ -1131,7 +1130,9 @@ bool StopNode()
     Sleep(50);\r
 \r
     // Sockets shutdown\r
+#ifdef __WXMSW__\r
     WSACleanup();\r
+#endif\r
     return true;\r
 }\r
 \r
diff --git a/net.h b/net.h
index 7716426..275a4cb 100644 (file)
--- a/net.h
+++ b/net.h
@@ -22,7 +22,8 @@ enum
 \r
 bool ConnectSocket(const CAddress& addrConnect, SOCKET& hSocketRet);\r
 bool GetMyExternalIP(unsigned int& ipRet);\r
-bool AddAddress(CAddrDB& addrdb, const CAddress& addr);\r
+bool AddAddress(CAddrDB& addrdb, CAddress addr, bool fCurrentlyOnline=true);\r
+void AddressCurrentlyConnected(const CAddress& addr);\r
 CNode* FindNode(unsigned int ip);\r
 CNode* ConnectNode(CAddress addrConnect, int64 nTimeout=0);\r
 void AbandonRequests(void (*fn)(void*, CDataStream&), void* param1);\r
diff --git a/ui.cpp b/ui.cpp
index 9185b81..2125481 100644 (file)
--- a/ui.cpp
+++ b/ui.cpp
@@ -260,7 +260,8 @@ void AddPendingReplyEvent3(void* pevthandler, CDataStream& vRecv)
 CDataStream GetStreamFromEvent(const wxCommandEvent& event)\r
 {\r
     wxString strData = event.GetString();\r
-    return CDataStream(strData.begin(), strData.begin() + event.GetInt(), SER_NETWORK);\r
+    const char* pszBegin = strData.c_str();\r
+    return CDataStream(pszBegin, pszBegin + event.GetInt(), SER_NETWORK);\r
 }\r
 \r
 \r
@@ -288,20 +289,6 @@ CMainFrame::CMainFrame(wxWindow* parent) : CMainFrameBase(parent)
     SetIcon(wxICON(bitcoin));\r
     ptaskbaricon = new CMyTaskBarIcon();\r
 \r
-    // Init toolbar with transparency masked bitmaps\r
-    m_toolBar->ClearTools();\r
-\r
-    //// shouldn't have to do mask separately anymore, bitmap alpha support added in wx 2.8.9,\r
-    wxBitmap bmpSend(wxT("send20"), wxBITMAP_TYPE_RESOURCE);\r
-    bmpSend.SetMask(new wxMask(wxBitmap(wxT("send20mask"), wxBITMAP_TYPE_RESOURCE)));\r
-    m_toolBar->AddTool(wxID_BUTTONSEND, wxT("&Send Coins"), bmpSend, wxNullBitmap, wxITEM_NORMAL, wxEmptyString, wxEmptyString);\r
-\r
-    wxBitmap bmpAddressBook(wxT("addressbook20"), wxBITMAP_TYPE_RESOURCE);\r
-    bmpAddressBook.SetMask(new wxMask(wxBitmap(wxT("addressbook20mask"), wxBITMAP_TYPE_RESOURCE)));\r
-    m_toolBar->AddTool(wxID_BUTTONRECEIVE, wxT("&Address Book"), bmpAddressBook, wxNullBitmap, wxITEM_NORMAL, wxEmptyString, wxEmptyString);\r
-\r
-    m_toolBar->Realize();\r
-\r
     // Init column headers\r
     int nDateWidth = DateTimeStr(1229413914).size() * 6 + 8;\r
     if (!strstr(DateTimeStr(1229413914).c_str(), "2008"))\r
@@ -909,15 +896,17 @@ void CMainFrame::OnPaintListCtrl(wxPaintEvent& event)
         {\r
             TRY_CRITICAL_BLOCK(cs_mapWallet)\r
             {\r
-                bool fInserted = false;\r
+                string strTop;\r
+                if (m_listCtrl->GetItemCount())\r
+                    strTop = (string)m_listCtrl->GetItemText(0);\r
                 foreach(uint256 hash, vWalletUpdated)\r
                 {\r
                     map<uint256, CWalletTx>::iterator mi = mapWallet.find(hash);\r
                     if (mi != mapWallet.end())\r
-                        fInserted |= InsertTransaction((*mi).second, false);\r
+                        InsertTransaction((*mi).second, false);\r
                 }\r
                 vWalletUpdated.clear();\r
-                if (fInserted)\r
+                if (m_listCtrl->GetItemCount() && strTop != (string)m_listCtrl->GetItemText(0))\r
                     m_listCtrl->ScrollList(0, INT_MAX);\r
             }\r
         }\r
@@ -954,7 +943,9 @@ void CMainFrame::OnPaintListCtrl(wxPaintEvent& event)
     string strStatus = strprintf("     %d connections     %d blocks     %d transactions", vNodes.size(), nBestHeight + 1, nTransactionCount);\r
     m_statusBar->SetStatusText(strStatus, 2);\r
 \r
+#ifdef __WXMSW__\r
     m_listCtrl->OnPaint(event);\r
+#endif\r
 }\r
 \r
 \r
@@ -1407,7 +1398,7 @@ COptionsDialog::COptionsDialog(wxWindow* parent) : COptionsDialogBase(parent)
     m_checkBoxLimitProcessors->SetValue(fLimitProcessors);\r
     m_spinCtrlLimitProcessors->Enable(fLimitProcessors);\r
     m_spinCtrlLimitProcessors->SetValue(nLimitProcessors);\r
-    int nProcessors = atoi(getenv("NUMBER_OF_PROCESSORS"));\r
+    int nProcessors = wxThread::GetCPUCount();\r
     if (nProcessors < 1)\r
         nProcessors = 999;\r
     m_spinCtrlLimitProcessors->SetRange(1, nProcessors);\r
@@ -1549,17 +1540,11 @@ void COptionsDialog::OnButtonApply(wxCommandEvent& event)
         walletdb.WriteSetting("fMinimizeOnClose", fMinimizeOnClose);\r
     }\r
 \r
-    if (fUseProxy != m_checkBoxUseProxy->GetValue())\r
-    {\r
-        fUseProxy = m_checkBoxUseProxy->GetValue();\r
-        walletdb.WriteSetting("fUseProxy", fUseProxy);\r
-    }\r
+    fUseProxy = m_checkBoxUseProxy->GetValue();\r
+    walletdb.WriteSetting("fUseProxy", fUseProxy);\r
 \r
-    if (addrProxy != GetProxyAddr())\r
-    {\r
-        addrProxy = GetProxyAddr();\r
-        walletdb.WriteSetting("addrProxy", addrProxy);\r
-    }\r
+    addrProxy = GetProxyAddr();\r
+    walletdb.WriteSetting("addrProxy", addrProxy);\r
 }\r
 \r
 \r
@@ -1608,10 +1593,8 @@ CSendDialog::CSendDialog(wxWindow* parent, const wxString& strAddress) : CSendDi
     //// todo: should add a display of your balance for convenience\r
 \r
     // Set Icon\r
-    wxBitmap bmpSend(wxT("send16"), wxBITMAP_TYPE_RESOURCE);\r
-    bmpSend.SetMask(new wxMask(wxBitmap(wxT("send16masknoshadow"), wxBITMAP_TYPE_RESOURCE)));\r
     wxIcon iconSend;\r
-    iconSend.CopyFromBitmap(bmpSend);\r
+    iconSend.CopyFromBitmap(wxBitmap(send16noshadow_xpm));\r
     SetIcon(iconSend);\r
 \r
     wxCommandEvent event;\r
@@ -2231,10 +2214,8 @@ CAddressBookDialog::CAddressBookDialog(wxWindow* parent, const wxString& strInit
     m_listCtrl->SetFocus();\r
 \r
     // Set Icon\r
-    wxBitmap bmpAddressBook(wxT("addressbook16"), wxBITMAP_TYPE_RESOURCE);\r
-    bmpAddressBook.SetMask(new wxMask(wxBitmap(wxT("addressbook16mask"), wxBITMAP_TYPE_RESOURCE)));\r
     wxIcon iconAddressBook;\r
-    iconAddressBook.CopyFromBitmap(bmpAddressBook);\r
+    iconAddressBook.CopyFromBitmap(wxBitmap(addressbook16_xpm));\r
     SetIcon(iconAddressBook);\r
 \r
     // Fill listctrl with address book data\r
@@ -3345,7 +3326,7 @@ bool CMyApp::OnInit2()
     _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);\r
     _CrtSetReportFile(_CRT_WARN, CreateFile("NUL", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0));\r
 #endif\r
-#ifdef __WXDEBUG__\r
+#if defined(__WXMSW__) && defined(__WXDEBUG__)\r
     // Disable malfunctioning wxWidgets debug assertion\r
     g_isPainting = 10000;\r
 #endif\r
@@ -3362,8 +3343,7 @@ bool CMyApp::OnInit2()
             "  -gen=0\t\t  Don't generate coins\n"\r
             "  -min\t\t  Start minimized\n"\r
             "  -datadir=<dir>\t  Specify data directory\n"\r
-            "  -proxy=<ip:port>\t  Connect through socks4 proxy,\n"\r
-            "  \t\t     e.g. -proxy=127.0.0.1:9050 to use TOR\n"\r
+            "  -proxy=<ip:port>\t  Connect through socks4 proxy\n"\r
             "  -addnode=<ip>\t  Add a node to connect to\n"\r
             "  -connect=<ip>\t  Connect only to the specified node\n"\r
             "  -?\t\t  This help message\n";\r
@@ -3386,6 +3366,8 @@ bool CMyApp::OnInit2()
         unsigned int nStart = GetTime();\r
         loop\r
         {\r
+            // TODO: find out how to do this in Linux, or replace with wxWidgets commands\r
+#ifdef __WXMSW__\r
             // Show the previous instance and exit\r
             HWND hwndPrev = FindWindow("wxWindowClassNR", "Bitcoin");\r
             if (hwndPrev)\r
@@ -3395,6 +3377,7 @@ bool CMyApp::OnInit2()
                 SetForegroundWindow(hwndPrev);\r
                 return false;\r
             }\r
+#endif\r
 \r
             if (GetTime() > nStart + 60)\r
                 return false;\r
@@ -3421,7 +3404,7 @@ bool CMyApp::OnInit2()
         fPrintToDebugger = true;\r
 \r
     printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");\r
-    printf("Bitcoin version %d, Windows version %08x\n", VERSION, GetVersion());\r
+    printf("Bitcoin version %d, OS version %s\n", VERSION, wxGetOsDescription().mb_str());\r
 \r
     if (mapArgs.count("-dropmessages"))\r
     {\r
@@ -3493,12 +3476,36 @@ bool CMyApp::OnInit2()
         return false;\r
     }\r
 \r
+    if (mapArgs.count("-printblock"))\r
+    {\r
+        string strMatch = mapArgs["-printblock"];\r
+        int nFound = 0;\r
+        for (map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.begin(); mi != mapBlockIndex.end(); ++mi)\r
+        {\r
+            uint256 hash = (*mi).first;\r
+            if (strncmp(hash.ToString().c_str(), strMatch.c_str(), strMatch.size()) == 0)\r
+            {\r
+                CBlockIndex* pindex = (*mi).second;\r
+                CBlock block;\r
+                block.ReadFromDisk(pindex, true);\r
+                block.BuildMerkleTree();\r
+                block.print();\r
+                printf("\n");\r
+                nFound++;\r
+            }\r
+        }\r
+        if (nFound == 0)\r
+            printf("No blocks matching %s were found\n", strMatch.c_str());\r
+        OnExit();\r
+        return false;\r
+    }\r
+\r
     if (mapArgs.count("-gen"))\r
     {\r
         if (mapArgs["-gen"].empty())\r
             fGenerateBitcoins = true;\r
         else\r
-            fGenerateBitcoins = atoi(mapArgs["-gen"].c_str());\r
+            fGenerateBitcoins = (atoi(mapArgs["-gen"].c_str()) != 0);\r
     }\r
 \r
     if (mapArgs.count("-proxy"))\r
@@ -3511,9 +3518,6 @@ bool CMyApp::OnInit2()
             OnExit();\r
             return false;\r
         }\r
-        CWalletDB walletdb;\r
-        walletdb.WriteSetting("fUseProxy", fUseProxy);\r
-        walletdb.WriteSetting("addrProxy", addrProxy);\r
     }\r
 \r
     if (mapArgs.count("-addnode"))\r
@@ -3522,6 +3526,7 @@ bool CMyApp::OnInit2()
         foreach(string strAddr, mapMultiArgs["-addnode"])\r
         {\r
             CAddress addr(strAddr, NODE_NETWORK);\r
+            addr.nTime = 0; // so it won't relay unless successfully connected\r
             if (addr.IsValid())\r
                 AddAddress(addrdb, addr);\r
         }\r
@@ -3559,7 +3564,11 @@ bool CMyApp::OnInit2()
     //\r
     // Tests\r
     //\r
+#ifdef __WXMSW__\r
     if (argc >= 2 && stricmp(argv[1], "-send") == 0)\r
+#else\r
+    if (argc >= 2 && strcmp(argv[1], "-send") == 0)\r
+#endif\r
     {\r
         int64 nValue = 1;\r
         if (argc >= 3)\r
@@ -3646,7 +3655,8 @@ void CMyApp::OnFatalException()
 \r
 \r
 \r
-typedef WINSHELLAPI BOOL WINAPI (*PSHGETSPECIALFOLDERPATHA)(HWND hwndOwner, LPSTR lpszPath, int nFolder, BOOL fCreate);\r
+#ifdef __WXMSW__\r
+typedef WINSHELLAPI BOOL (WINAPI *PSHGETSPECIALFOLDERPATHA)(HWND hwndOwner, LPSTR lpszPath, int nFolder, BOOL fCreate);\r
 \r
 string MyGetSpecialFolderPath(int nFolder, bool fCreate)\r
 {\r
@@ -3737,7 +3747,10 @@ void SetStartOnSystemStartup(bool fAutoStart)
         CoUninitialize();\r
     }\r
 }\r
-\r
+#else\r
+bool GetStartOnSystemStartup() { return false; }\r
+void SetStartOnSystemStartup(bool fAutoStart) { }\r
+#endif\r
 \r
 \r
 \r
index b03e578..bb564e9 100644 (file)
@@ -7,6 +7,10 @@
 \r
 #include "uibase.h"\r
 \r
+#include "xpm/addressbook20.xpm"\r
+#include "xpm/check.xpm"\r
+#include "xpm/send20.xpm"\r
+\r
 ///////////////////////////////////////////////////////////////////////////\r
 \r
 CMainFrameBase::CMainFrameBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )\r
@@ -60,8 +64,8 @@ CMainFrameBase::CMainFrameBase( wxWindow* parent, wxWindowID id, const wxString&
        m_toolBar->SetToolSeparation( 1 );\r
        m_toolBar->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxEmptyString ) );\r
        \r
-       m_toolBar->AddTool( wxID_BUTTONSEND, wxT("&Send Coins"), wxBitmap( wxT("send20"), wxBITMAP_TYPE_RESOURCE ), wxNullBitmap, wxITEM_NORMAL, wxEmptyString, wxEmptyString );\r
-       m_toolBar->AddTool( wxID_BUTTONRECEIVE, wxT("&Address Book"), wxBitmap( wxT("addressbook20"), wxBITMAP_TYPE_RESOURCE ), wxNullBitmap, wxITEM_NORMAL, wxEmptyString, wxEmptyString );\r
+       m_toolBar->AddTool( wxID_BUTTONSEND, wxT("&Send Coins"), wxBitmap( send20_xpm ), wxNullBitmap, wxITEM_NORMAL, wxEmptyString, wxEmptyString );\r
+       m_toolBar->AddTool( wxID_BUTTONRECEIVE, wxT("&Address Book"), wxBitmap( addressbook20_xpm ), wxNullBitmap, wxITEM_NORMAL, wxEmptyString, wxEmptyString );\r
        m_toolBar->Realize();\r
        \r
        m_statusBar = this->CreateStatusBar( 1, wxST_SIZEGRIP, wxID_ANY );\r
@@ -666,7 +670,7 @@ CSendDialogBase::CSendDialogBase( wxWindow* parent, wxWindowID id, const wxStrin
        \r
        bSizer47->Add( 0, 0, 1, wxEXPAND, 5 );\r
        \r
-       m_bitmapCheckMark = new wxStaticBitmap( this, wxID_ANY, wxICON( check ), wxDefaultPosition, wxSize( 16,16 ), 0 );\r
+       m_bitmapCheckMark = new wxStaticBitmap( this, wxID_ANY, wxBitmap( check_xpm ), wxDefaultPosition, wxSize( 16,16 ), 0 );\r
        bSizer47->Add( m_bitmapCheckMark, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );\r
        \r
        m_staticText36 = new wxStaticText( this, wxID_ANY, wxT("Pay &To:"), wxDefaultPosition, wxSize( -1,-1 ), wxALIGN_RIGHT );\r
index 313e5aa..7bce734 100644 (file)
                     </object>\r
                 </object>\r
             </object>\r
-            <object class="wxToolBar" expanded="0">\r
+            <object class="wxToolBar" expanded="1">\r
                 <property name="bg"></property>\r
                 <property name="bitmapsize">20,20</property>\r
                 <property name="context_help"></property>\r
                 <event name="OnSize"></event>\r
                 <event name="OnUpdateUI"></event>\r
                 <object class="tool" expanded="1">\r
-                    <property name="bitmap">send20; Load From Resource</property>\r
+                    <property name="bitmap">xpm/send20.xpm; Load From File</property>\r
                     <property name="id">wxID_BUTTONSEND</property>\r
                     <property name="kind">wxITEM_NORMAL</property>\r
                     <property name="label">&amp;Send Coins</property>\r
                     <event name="OnUpdateUI"></event>\r
                 </object>\r
                 <object class="tool" expanded="1">\r
-                    <property name="bitmap">addressbook20; Load From Resource</property>\r
+                    <property name="bitmap">xpm/addressbook20.xpm; Load From File</property>\r
                     <property name="id">wxID_BUTTONRECEIVE</property>\r
                     <property name="kind">wxITEM_NORMAL</property>\r
                     <property name="label">&amp;Address Book</property>\r
                 </object>\r
             </object>\r
         </object>\r
-        <object class="Dialog" expanded="1">\r
+        <object class="Dialog" expanded="0">\r
             <property name="bg"></property>\r
             <property name="center"></property>\r
             <property name="context_help"></property>\r
                                     <property name="proportion">0</property>\r
                                     <object class="wxStaticBitmap" expanded="1">\r
                                         <property name="bg"></property>\r
-                                        <property name="bitmap">check; Load From Icon Resource [-1; -1]</property>\r
+                                        <property name="bitmap">xpm/check.xpm; Load From File</property>\r
                                         <property name="context_help"></property>\r
                                         <property name="enabled">1</property>\r
                                         <property name="fg"></property>\r
index 23b59f1..d2e624d 100644 (file)
--- a/util.cpp
+++ b/util.cpp
@@ -38,8 +38,10 @@ public:
             ppmutexOpenSSL[i] = new wxMutex();\r
         CRYPTO_set_locking_callback(locking_callback);\r
 \r
+#ifdef __WXMSW__\r
         // Seed random number generator with screen scrape and other hardware sources\r
         RAND_screen();\r
+#endif\r
 \r
         // Seed random number generator with performance counter\r
         RandAddSeed();\r
@@ -325,8 +327,8 @@ void ParseParameters(int argc, char* argv[])
             pszValue = strchr(psz, '=');\r
             *pszValue++ = '\0';\r
         }\r
-        strlwr(psz);\r
         #ifdef __WXMSW__\r
+        _strlwr(psz);\r
         if (psz[0] == '/')\r
             psz[0] = '-';\r
         #endif\r
@@ -343,9 +345,13 @@ void ParseParameters(int argc, char* argv[])
 \r
 void FormatException(char* pszMessage, std::exception* pex, const char* pszThread)\r
 {\r
+#ifdef __WXMSW__\r
     char pszModule[MAX_PATH];\r
     pszModule[0] = '\0';\r
     GetModuleFileName(NULL, pszModule, sizeof(pszModule));\r
+#else\r
+    const char* pszModule = wxStandardPaths::Get().GetExecutablePath().mb_str();\r
+#endif\r
     if (pex)\r
         snprintf(pszMessage, 1000,\r
             "EXCEPTION: %s       \n%s       \n%s in %s       \n", typeid(*pex).name(), pex->what(), pszModule, pszThread);\r
diff --git a/util.h b/util.h
index 822a049..3bc7c79 100644 (file)
--- a/util.h
+++ b/util.h
@@ -55,9 +55,34 @@ inline T& REF(const T& val)
 }\r
 \r
 #ifndef __WXMSW__\r
-#define closesocket(s)  close(s)\r
-#define INVALID_SOCKET  (SOCKET)(~0)\r
+#define _UI64_MAX           UINT64_MAX\r
+#define _I64_MAX            INT64_MAX\r
+#define WSAGetLastError()   errno\r
+#define WSAEWOULDBLOCK      EWOULDBLOCK\r
+#define WSAEMSGSIZE         EMSGSIZE\r
+#define WSAEINTR            EINTR\r
+#define WSAEINPROGRESS      EINPROGRESS\r
+#define WSAEADDRINUSE       EADDRINUSE\r
+#define closesocket(s)      close(s)\r
+#define INVALID_SOCKET      (SOCKET)(~0)\r
+#define SOCKET_ERROR        -1\r
 typedef u_int SOCKET;\r
+#define _vsnprintf(a,b,c,d) vsnprintf(a,b,c,d)\r
+#define strlwr(psz)         to_lower(psz)\r
+#define _strlwr(psz)        to_lower(psz)\r
+#define _mkdir(psz)         filesystem::create_directory(psz)\r
+#define MAX_PATH            1024\r
+#define Sleep(n)            wxMilliSleep(n)\r
+#define Beep(n1,n2)         (0)\r
+inline int _beginthread(void(*pfn)(void*), unsigned nStack, void* parg) { thread(bind(pfn, parg)); return 0; }\r
+inline void _endthread() { pthread_exit(NULL); }\r
+inline int GetCurrentThread() { return 0; }\r
+// threads are processes on linux, so setpriority affects just the one thread\r
+inline void SetThreadPriority(int nThread, int nPriority) { setpriority(PRIO_PROCESS, getpid(), nPriority); }\r
+#define THREAD_PRIORITY_LOWEST          PRIO_MIN\r
+#define THREAD_PRIORITY_BELOW_NORMAL    2\r
+#define THREAD_PRIORITY_NORMAL          0\r
+#define THREAD_PRIORITY_ABOVE_NORMAL    0\r
 #endif\r
 \r
 \r
@@ -120,7 +145,7 @@ public:
 protected:\r
     wxMutex mutex;\r
 public:\r
-    explicit CCriticalSection() { }\r
+    explicit CCriticalSection() : mutex(wxMUTEX_RECURSIVE) { }\r
     ~CCriticalSection() { }\r
     void Enter() { mutex.Lock(); }\r
     void Leave() { mutex.Unlock(); }\r
@@ -183,7 +208,7 @@ inline int OutputDebugStringF(const char* pszFormat, ...)
         // print to debug.log\r
         char pszFile[MAX_PATH+100];\r
         GetDataDir(pszFile);\r
-        strlcat(pszFile, "\\debug.log", sizeof(pszFile));\r
+        strlcat(pszFile, "/debug.log", sizeof(pszFile));\r
         FILE* fileout = fopen(pszFile, "a");\r
         if (fileout)\r
         {\r
@@ -354,13 +379,6 @@ inline int64 GetTimeMillis()
     return wxGetLocalTimeMillis().GetValue();\r
 }\r
 \r
-#ifndef __WXMSW__\r
-inline void Sleep(unsigned int nMilliseconds)\r
-{\r
-    wxMilliSleep(nMilliseconds);\r
-}\r
-#endif\r
-\r
 \r
 \r
 \r
diff --git a/xpm/addressbook16.xpm b/xpm/addressbook16.xpm
new file mode 100644 (file)
index 0000000..471f700
--- /dev/null
@@ -0,0 +1,278 @@
+/* XPM */\r
+static char * addressbook16_xpm[] = {\r
+/* columns rows colors chars-per-pixel */\r
+"16 16 256 2",\r
+"   c #FFFFFF",\r
+".  c #F7FFFF",\r
+"X  c #F7F7FF",\r
+"o  c #EFF7FF",\r
+"O  c #E6EFF7",\r
+"+  c #E6E6F7",\r
+"@  c #CEE6F7",\r
+"#  c #DEDEEF",\r
+"$  c #D6DEEF",\r
+"%  c #D6DEE6",\r
+"&  c #CEDEF7",\r
+"*  c #CEDEEF",\r
+"=  c #EFF708",\r
+"-  c #C5DEF7",\r
+";  c #CED6EF",\r
+":  c None",\r
+">  c #C5D6E6",\r
+",  c #BDD6F7",\r
+"<  c #BDD6EF",\r
+"1  c #D6CECE",\r
+"2  c #BDCEE6",\r
+"3  c #BDC5E6",\r
+"4  c #B5C5DE",\r
+"5  c #BDD631",\r
+"6  c #ADBDDE",\r
+"7  c #B5B5BD",\r
+"8  c #A5B5D6",\r
+"9  c #00FFFF",\r
+"0  c #9CB5CE",\r
+"q  c #9CADD6",\r
+"w  c #94A5D6",\r
+"e  c #8CA5D6",\r
+"r  c #8CA5CE",\r
+"t  c #8CA5C5",\r
+"y  c #849CC5",\r
+"u  c #7B9CD6",\r
+"i  c #7B9CCE",\r
+"p  c #31BDCE",\r
+"a  c #6B9CD6",\r
+"s  c #00F708",\r
+"d  c #8494AD",\r
+"f  c #7B94B5",\r
+"g  c #6B94D6",\r
+"h  c #6B9C84",\r
+"j  c #7B8CAD",\r
+"k  c #738CAD",\r
+"l  c #638CC5",\r
+"z  c #10CE42",\r
+"x  c #638CBD",\r
+"c  c #7B849C",\r
+"v  c #73849C",\r
+"b  c #6B84A5",\r
+"n  c #7B7BA5",\r
+"m  c #6B849C",\r
+"M  c #7B8C42",\r
+"N  c #5A84C5",\r
+"B  c #29AD6B",\r
+"V  c #F74A4A",\r
+"C  c #6384A5",\r
+"Z  c #5284C5",\r
+"A  c #637BA5",\r
+"S  c #637B9C",\r
+"D  c #9C637B",\r
+"F  c #6B7B5A",\r
+"G  c #637394",\r
+"H  c #52739C",\r
+"J  c #5A7384",\r
+"K  c #526B94",\r
+"L  c #426B94",\r
+"P  c #52638C",\r
+"I  c #426B7B",\r
+"U  c #5A5A8C",\r
+"Y  c #524A7B",\r
+"T  c #425273",\r
+"R  c #21636B",\r
+"E  c #106394",\r
+"W  c #106B52",\r
+"Q  c #3A4273",\r
+"!  c #31426B",\r
+"~  c #523163",\r
+"^  c #29426B",\r
+"/  c #293A63",\r
+"(  c #213A63",\r
+")  c #193A63",\r
+"_  c #193163",\r
+"`  c #19315A",\r
+"'  c #212963",\r
+"]  c #10315A",\r
+"[  c #082952",\r
+"{  c #FFCC33",\r
+"}  c #33FF33",\r
+"|  c #66FF33",\r
+" . c #99FF33",\r
+".. c #CCFF33",\r
+"X. c #FFFF33",\r
+"o. c #000066",\r
+"O. c #330066",\r
+"+. c #660066",\r
+"@. c #990066",\r
+"#. c #CC0066",\r
+"$. c #FF0066",\r
+"%. c #003366",\r
+"&. c #333366",\r
+"*. c #663366",\r
+"=. c #993366",\r
+"-. c #CC3366",\r
+";. c #FF3366",\r
+":. c #006666",\r
+">. c #336666",\r
+",. c #666666",\r
+"<. c #996666",\r
+"1. c #CC6666",\r
+"2. c #009966",\r
+"3. c #339966",\r
+"4. c #669966",\r
+"5. c #999966",\r
+"6. c #CC9966",\r
+"7. c #FF9966",\r
+"8. c #00CC66",\r
+"9. c #33CC66",\r
+"0. c #99CC66",\r
+"q. c #CCCC66",\r
+"w. c #FFCC66",\r
+"e. c #00FF66",\r
+"r. c #33FF66",\r
+"t. c #99FF66",\r
+"y. c #CCFF66",\r
+"u. c #FF00CC",\r
+"i. c #CC00FF",\r
+"p. c #009999",\r
+"a. c #993399",\r
+"s. c #990099",\r
+"d. c #CC0099",\r
+"f. c #000099",\r
+"g. c #333399",\r
+"h. c #660099",\r
+"j. c #CC3399",\r
+"k. c #FF0099",\r
+"l. c #006699",\r
+"z. c #336699",\r
+"x. c #663399",\r
+"c. c #996699",\r
+"v. c #CC6699",\r
+"b. c #FF3399",\r
+"n. c #339999",\r
+"m. c #669999",\r
+"M. c #999999",\r
+"N. c #CC9999",\r
+"B. c #FF9999",\r
+"V. c #00CC99",\r
+"C. c #33CC99",\r
+"Z. c #66CC66",\r
+"A. c #99CC99",\r
+"S. c #CCCC99",\r
+"D. c #FFCC99",\r
+"F. c #00FF99",\r
+"G. c #33FF99",\r
+"H. c #66CC99",\r
+"J. c #99FF99",\r
+"K. c #CCFF99",\r
+"L. c #FFFF99",\r
+"P. c #0000CC",\r
+"I. c #330099",\r
+"U. c #6600CC",\r
+"Y. c #9900CC",\r
+"T. c #CC00CC",\r
+"R. c #003399",\r
+"E. c #3333CC",\r
+"W. c #6633CC",\r
+"Q. c #9933CC",\r
+"!. c #CC33CC",\r
+"~. c #FF33CC",\r
+"^. c #0066CC",\r
+"/. c #3366CC",\r
+"(. c #666699",\r
+"). c #9966CC",\r
+"_. c #CC66CC",\r
+"`. c #FF6699",\r
+"'. c #0099CC",\r
+"]. c #3399CC",\r
+"[. c #6699CC",\r
+"{. c #9999CC",\r
+"}. c #CC99CC",\r
+"|. c #FF99CC",\r
+" X c #00CCCC",\r
+".X c #33CCCC",\r
+"XX c #66CCCC",\r
+"oX c #99CCCC",\r
+"OX c #CCCCCC",\r
+"+X c #FFCCCC",\r
+"@X c #00FFCC",\r
+"#X c #33FFCC",\r
+"$X c #66FF99",\r
+"%X c #99FFCC",\r
+"&X c #CCFFCC",\r
+"*X c #FFFFCC",\r
+"=X c #3300CC",\r
+"-X c #6600FF",\r
+";X c #9900FF",\r
+":X c #0033CC",\r
+">X c #3333FF",\r
+",X c #6633FF",\r
+"<X c #9933FF",\r
+"1X c #CC33FF",\r
+"2X c #FF33FF",\r
+"3X c #0066FF",\r
+"4X c #3366FF",\r
+"5X c #6666CC",\r
+"6X c #9966FF",\r
+"7X c #CC66FF",\r
+"8X c #FF66CC",\r
+"9X c #0099FF",\r
+"0X c #3399FF",\r
+"qX c #6699FF",\r
+"wX c #9999FF",\r
+"eX c #CC99FF",\r
+"rX c #FF99FF",\r
+"tX c #00CCFF",\r
+"yX c #33CCFF",\r
+"uX c #66CCFF",\r
+"iX c #99CCFF",\r
+"pX c #CCCCFF",\r
+"aX c #FFCCFF",\r
+"sX c #33FFFF",\r
+"dX c #66FFCC",\r
+"fX c #99FFFF",\r
+"gX c #CCFFFF",\r
+"hX c #FF6666",\r
+"jX c #66FF66",\r
+"kX c #FFFF66",\r
+"lX c #6666FF",\r
+"zX c #FF66FF",\r
+"xX c #66FFFF",\r
+"cX c #A50021",\r
+"vX c #5F5F5F",\r
+"bX c #777777",\r
+"nX c #868686",\r
+"mX c #969696",\r
+"MX c #CBCBCB",\r
+"NX c #B2B2B2",\r
+"BX c #D7D7D7",\r
+"VX c #DDDDDD",\r
+"CX c #E3E3E3",\r
+"ZX c #EAEAEA",\r
+"AX c #F1F1F1",\r
+"SX c #F8F8F8",\r
+"DX c #FFFBF0",\r
+"FX c #A0A0A4",\r
+"GX c #808080",\r
+"HX c #FF0000",\r
+"JX c #00FF00",\r
+"KX c #FFFF00",\r
+"LX c #0000FF",\r
+"PX c #FF00FF",\r
+"IX c #00FFFF",\r
+"UX c #FFFFFF",\r
+/* pixels */\r
+": : : : : : : : : : : : : : : : ",\r
+": : H H H A d : 7 G K H H : : : ",\r
+"n n c     X 4 k j X     b n n : ",\r
+"n 2 c $ 8 6 4 x < + 4 4 C V ~ : ",\r
+"n * c X o $ y N u 6 $ + b D Y : ",\r
+"n * c     X > g ,       S z R : ",\r
+"n * c * r r y g , 6 r q S s W : ",\r
+"n * c     X 4 N u +     m B I : ",\r
+"n * c     X ; a -       S 5 F : ",\r
+"n * c * r r r g -       S = M : ",\r
+"n * c     X 4 N -       m h J : ",\r
+"n * c     X ; a -       A 9 E : ",\r
+"n * ( ] ` ^ P l y T / / ( p L : ",\r
+"n O     > 0 f ) ! t 8     % n : ",\r
+"U U U U U U U ' Q U U U U U U : ",\r
+": : : : : : : : : : : : : : : : "\r
+};\r
diff --git a/xpm/addressbook20.xpm b/xpm/addressbook20.xpm
new file mode 100644 (file)
index 0000000..48df12d
--- /dev/null
@@ -0,0 +1,282 @@
+/* XPM */\r
+static char * addressbook20_xpm[] = {\r
+/* columns rows colors chars-per-pixel */\r
+"20 20 256 2",\r
+"   c #FFFFFF",\r
+".  c #F7FFFF",\r
+"X  c #F7F7FF",\r
+"o  c #EFF7FF",\r
+"O  c #EFF7F7",\r
+"+  c #E6EFFF",\r
+"@  c #E6EFF7",\r
+"#  c #DEEFFF",\r
+"$  c #DEE6F7",\r
+"%  c #DEE6EF",\r
+"&  c #D6E6F7",\r
+"*  c #FFFF00",\r
+"=  c #DEDEE6",\r
+"-  c #D6DEE6",\r
+";  c #D6D6DE",\r
+":  c #CED6E6",\r
+">  c None",\r
+",  c #C5D6E6",\r
+"<  c #C5CEE6",\r
+"1  c #B5CEEF",\r
+"2  c #C5C5C5",\r
+"3  c #C5DE31",\r
+"4  c #B5C5DE",\r
+"5  c #BDC5C5",\r
+"6  c #ADC5EF",\r
+"7  c #B5C5CE",\r
+"8  c #BDBDBD",\r
+"9  c #B5BDCE",\r
+"0  c #ADBDDE",\r
+"q  c #ADBDD6",\r
+"w  c #B5CE52",\r
+"e  c #ADB5C5",\r
+"r  c #00FFFF",\r
+"t  c #A5B5C5",\r
+"y  c #9CB5CE",\r
+"u  c #94B5DE",\r
+"i  c #9CADD6",\r
+"p  c #A5ADB5",\r
+"a  c #94ADDE",\r
+"s  c #94ADD6",\r
+"d  c #9CADBD",\r
+"f  c #8CADDE",\r
+"g  c #BD9CA5",\r
+"h  c #9CA5BD",\r
+"j  c #9CA5B5",\r
+"k  c #29D6E6",\r
+"l  c #8CA5CE",\r
+"z  c #849CCE",\r
+"x  c #6BA5C5",\r
+"c  c #739CDE",\r
+"v  c #00FF00",\r
+"b  c #739CD6",\r
+"n  c #7B94CE",\r
+"m  c #8494AD",\r
+"M  c #7394CE",\r
+"N  c #7B94B5",\r
+"B  c #4AB584",\r
+"V  c #848CB5",\r
+"C  c #6B94CE",\r
+"Z  c #6394D6",\r
+"A  c #6394CE",\r
+"S  c #7B8CAD",\r
+"D  c #6B8CC5",\r
+"F  c #738CAD",\r
+"G  c #5294B5",\r
+"H  c #6B84C5",\r
+"J  c #7384A5",\r
+"K  c #73849C",\r
+"L  c #738494",\r
+"P  c #FF4A4A",\r
+"I  c #FF4A42",\r
+"U  c #737B8C",\r
+"Y  c #637BAD",\r
+"T  c #527BBD",\r
+"R  c #637394",\r
+"E  c #637352",\r
+"W  c #5A6B8C",\r
+"Q  c #526B9C",\r
+"!  c #63638C",\r
+"~  c #5A734A",\r
+"^  c #4A6B9C",\r
+"/  c #526B63",\r
+"(  c #0884A5",\r
+")  c #526384",\r
+"_  c #52637B",\r
+"`  c #4A6B5A",\r
+"'  c #52636B",\r
+"]  c #525A8C",\r
+"[  c #525A7B",\r
+"{  c #426363",\r
+"}  c #4A5A7B",\r
+"|  c #425A8C",\r
+" . c #196B94",\r
+".. c #3A5A8C",\r
+"X. c #3A5A84",\r
+"o. c #087B4A",\r
+"O. c #21636B",\r
+"+. c #634263",\r
+"@. c #3A527B",\r
+"#. c #424A84",\r
+"$. c #315284",\r
+"%. c #295284",\r
+"&. c #3A4A6B",\r
+"*. c #42427B",\r
+"=. c #424273",\r
+"-. c #294A84",\r
+";. c #3A3A73",\r
+":. c #194284",\r
+">. c #104A63",\r
+",. c #213A6B",\r
+"<. c #31316B",\r
+"1. c #21315A",\r
+"2. c #212163",\r
+"3. c #08295A",\r
+"4. c #082152",\r
+"5. c #101952",\r
+"6. c #CC9966",\r
+"7. c #FF9966",\r
+"8. c #00CC66",\r
+"9. c #33CC66",\r
+"0. c #99CC66",\r
+"q. c #CCCC66",\r
+"w. c #FFCC66",\r
+"e. c #00FF66",\r
+"r. c #33FF66",\r
+"t. c #99FF66",\r
+"y. c #CCFF66",\r
+"u. c #FF00CC",\r
+"i. c #CC00FF",\r
+"p. c #009999",\r
+"a. c #993399",\r
+"s. c #990099",\r
+"d. c #CC0099",\r
+"f. c #000099",\r
+"g. c #333399",\r
+"h. c #660099",\r
+"j. c #CC3399",\r
+"k. c #FF0099",\r
+"l. c #006699",\r
+"z. c #336699",\r
+"x. c #663399",\r
+"c. c #996699",\r
+"v. c #CC6699",\r
+"b. c #FF3399",\r
+"n. c #339999",\r
+"m. c #669999",\r
+"M. c #999999",\r
+"N. c #CC9999",\r
+"B. c #FF9999",\r
+"V. c #00CC99",\r
+"C. c #33CC99",\r
+"Z. c #66CC66",\r
+"A. c #99CC99",\r
+"S. c #CCCC99",\r
+"D. c #FFCC99",\r
+"F. c #00FF99",\r
+"G. c #33FF99",\r
+"H. c #66CC99",\r
+"J. c #99FF99",\r
+"K. c #CCFF99",\r
+"L. c #FFFF99",\r
+"P. c #0000CC",\r
+"I. c #330099",\r
+"U. c #6600CC",\r
+"Y. c #9900CC",\r
+"T. c #CC00CC",\r
+"R. c #003399",\r
+"E. c #3333CC",\r
+"W. c #6633CC",\r
+"Q. c #9933CC",\r
+"!. c #CC33CC",\r
+"~. c #FF33CC",\r
+"^. c #0066CC",\r
+"/. c #3366CC",\r
+"(. c #666699",\r
+"). c #9966CC",\r
+"_. c #CC66CC",\r
+"`. c #FF6699",\r
+"'. c #0099CC",\r
+"]. c #3399CC",\r
+"[. c #6699CC",\r
+"{. c #9999CC",\r
+"}. c #CC99CC",\r
+"|. c #FF99CC",\r
+" X c #00CCCC",\r
+".X c #33CCCC",\r
+"XX c #66CCCC",\r
+"oX c #99CCCC",\r
+"OX c #CCCCCC",\r
+"+X c #FFCCCC",\r
+"@X c #00FFCC",\r
+"#X c #33FFCC",\r
+"$X c #66FF99",\r
+"%X c #99FFCC",\r
+"&X c #CCFFCC",\r
+"*X c #FFFFCC",\r
+"=X c #3300CC",\r
+"-X c #6600FF",\r
+";X c #9900FF",\r
+":X c #0033CC",\r
+">X c #3333FF",\r
+",X c #6633FF",\r
+"<X c #9933FF",\r
+"1X c #CC33FF",\r
+"2X c #FF33FF",\r
+"3X c #0066FF",\r
+"4X c #3366FF",\r
+"5X c #6666CC",\r
+"6X c #9966FF",\r
+"7X c #CC66FF",\r
+"8X c #FF66CC",\r
+"9X c #0099FF",\r
+"0X c #3399FF",\r
+"qX c #6699FF",\r
+"wX c #9999FF",\r
+"eX c #CC99FF",\r
+"rX c #FF99FF",\r
+"tX c #00CCFF",\r
+"yX c #33CCFF",\r
+"uX c #66CCFF",\r
+"iX c #99CCFF",\r
+"pX c #CCCCFF",\r
+"aX c #FFCCFF",\r
+"sX c #33FFFF",\r
+"dX c #66FFCC",\r
+"fX c #99FFFF",\r
+"gX c #CCFFFF",\r
+"hX c #FF6666",\r
+"jX c #66FF66",\r
+"kX c #FFFF66",\r
+"lX c #6666FF",\r
+"zX c #FF66FF",\r
+"xX c #66FFFF",\r
+"cX c #A50021",\r
+"vX c #5F5F5F",\r
+"bX c #777777",\r
+"nX c #868686",\r
+"mX c #969696",\r
+"MX c #CBCBCB",\r
+"NX c #B2B2B2",\r
+"BX c #D7D7D7",\r
+"VX c #DDDDDD",\r
+"CX c #E3E3E3",\r
+"ZX c #EAEAEA",\r
+"AX c #F1F1F1",\r
+"SX c #F8F8F8",\r
+"DX c #FFFBF0",\r
+"FX c #A0A0A4",\r
+"GX c #808080",\r
+"HX c #FF0000",\r
+"JX c #00FF00",\r
+"KX c #FFFF00",\r
+"LX c #0000FF",\r
+"PX c #FF00FF",\r
+"IX c #00FFFF",\r
+"UX c #FFFFFF",\r
+/* pixels */\r
+"> > > > > > > > > > > > > > > > > > > > ",\r
+"> > > > > > > > > > > > > > > > > > > > ",\r
+"> > U $.| | ^ S 2 > p W | | @.L > > > > ",\r
+"8 5 R -       < Y j S O     - ) g e > > ",\r
+"! V K -       % a Q #       - +.P <.> > ",\r
+"! & K - 0 z n D C b f n n z q +.P <.> > ",\r
+"! & K -       % M A 1       - %.G #.> > ",\r
+"! & K -       % u b #       - o.v >.> > ",\r
+"! & K - 0 z n H M b 6 z n z q o.v >.> > ",\r
+"! & K -     X - M A a       - O.B @.> > ",\r
+"! & K -     X % u b #       - ` 3 / > > ",\r
+"! & K - 0 l i 4 u b #       - ~ * E > > ",\r
+"! & K - X o $ s T b #       - { w ' > > ",\r
+"! & K -       % f b #       -  .k -.> > ",\r
+"! & K m d t 7 , u b # ; 9 9 h ( r :.> > ",\r
+"! & h _ _ [ &.4.$.A ,.1.} _ _ F x ] > > ",\r
+"! @       , y N _ 3._ N y ,     @ ! > > ",\r
+"*.*.*.*.*.*.*.*.;.5.*.*.*.*.*.*.*.2.> > ",\r
+"> > > > > > > > > > > > > > > > > > > > ",\r
+"> > > > > > > > > > > > > > > > > > > > "\r
+};\r
diff --git a/xpm/bitcoin.xpm b/xpm/bitcoin.xpm
new file mode 100644 (file)
index 0000000..166d5aa
--- /dev/null
@@ -0,0 +1,304 @@
+/* XPM */\r
+static char * bitcoin_xpm[] = {\r
+/* columns rows colors chars-per-pixel */\r
+"48 48 250 2",\r
+"   c #725203",\r
+".  c #795603",\r
+"X  c #7D5903",\r
+"o  c #76560B",\r
+"O  c #77590E",\r
+"+  c #795A0D",\r
+"@  c #7B5D14",\r
+"#  c #7C5F18",\r
+"$  c #7D6019",\r
+"%  c #825D05",\r
+"&  c #856007",\r
+"*  c #86620B",\r
+"=  c #8B660B",\r
+"-  c #8E690E",\r
+";  c #906A0F",\r
+":  c #8F6B17",\r
+">  c #83641C",\r
+",  c #8D6C1E",\r
+"<  c #926C11",\r
+"1  c #967014",\r
+"2  c #997215",\r
+"3  c #9C761B",\r
+"4  c #9E791D",\r
+"5  c #A37C1E",\r
+"6  c #816520",\r
+"7  c #876A25",\r
+"8  c #8E6E22",\r
+"9  c #866A29",\r
+"0  c #896E2C",\r
+"q  c #8E7020",\r
+"w  c #937324",\r
+"e  c #997722",\r
+"r  c #9E7B25",\r
+"t  c #94762B",\r
+"y  c #967828",\r
+"u  c #9A7B2D",\r
+"i  c #8B7131",\r
+"p  c #9E7E31",\r
+"a  c #947839",\r
+"s  c #A37D22",\r
+"d  c #A68125",\r
+"f  c #AA8325",\r
+"g  c #AE8827",\r
+"h  c #A6832D",\r
+"j  c #AA852B",\r
+"k  c #AD892B",\r
+"l  c #B08727",\r
+"z  c #B28827",\r
+"x  c #B08729",\r
+"c  c #B38B2C",\r
+"v  c #B88E2F",\r
+"b  c #B8902D",\r
+"n  c #A38334",\r
+"m  c #A98632",\r
+"M  c #AB8A34",\r
+"N  c #A4873C",\r
+"B  c #A78A3D",\r
+"V  c #AC8B3C",\r
+"C  c #B38D32",\r
+"Z  c #BA8F30",\r
+"A  c #B28E3C",\r
+"S  c #B69332",\r
+"D  c #BC9433",\r
+"F  c #BF9832",\r
+"G  c #B4923C",\r
+"H  c #BA963D",\r
+"J  c #B7993E",\r
+"K  c #BE9A3B",\r
+"L  c #C1932F",\r
+"P  c #C39732",\r
+"I  c #C49935",\r
+"U  c #C59C3A",\r
+"Y  c #C99E3D",\r
+"T  c #C2A13F",\r
+"R  c #CDA23F",\r
+"E  c #9D8342",\r
+"W  c #AB8C43",\r
+"Q  c #B28E40",\r
+"!  c #AE9144",\r
+"~  c #AE914A",\r
+"^  c #B49445",\r
+"/  c #BC9B44",\r
+"(  c #B3964D",\r
+")  c #B5994C",\r
+"_  c #BD9B4A",\r
+"`  c #A98F50",\r
+"'  c #B19553",\r
+"]  c #B59A54",\r
+"[  c #BD9F51",\r
+"{  c #B59B5C",\r
+"}  c #B89D5C",\r
+"|  c #BEA155",\r
+" . c #BDA35D",\r
+".. c #B59C61",\r
+"X. c #B99F66",\r
+"o. c #BCA363",\r
+"O. c #BDA56C",\r
+"+. c #BCA571",\r
+"@. c #BDA873",\r
+"#. c #BFAA78",\r
+"$. c #C49D43",\r
+"%. c #C99F45",\r
+"&. c #C29E4B",\r
+"*. c #C5A144",\r
+"=. c #CCA244",\r
+"-. c #C5A44B",\r
+";. c #CAA54B",\r
+":. c #C8A84C",\r
+">. c #D0A644",\r
+",. c #D3AA44",\r
+"<. c #D3AC4C",\r
+"1. c #D8AD4D",\r
+"2. c #DAB046",\r
+"3. c #DCB24E",\r
+"4. c #C3A454",\r
+"5. c #CBA751",\r
+"6. c #CCAA53",\r
+"7. c #C1A65B",\r
+"8. c #C8A75A",\r
+"9. c #CBAC5B",\r
+"0. c #D0A650",\r
+"q. c #D2AC53",\r
+"w. c #DAAD54",\r
+"e. c #D3AD5C",\r
+"r. c #CFB259",\r
+"t. c #D4B156",\r
+"y. c #DDB454",\r
+"u. c #D4B25C",\r
+"i. c #DAB65A",\r
+"p. c #D7B95F",\r
+"a. c #DEBA5E",\r
+"s. c #E2B555",\r
+"d. c #E5BA53",\r
+"f. c #E1B55A",\r
+"g. c #E5BC5C",\r
+"h. c #EABF5D",\r
+"j. c #C1A761",\r
+"k. c #C4AA63",\r
+"l. c #CBAE63",\r
+"z. c #CBB166",\r
+"x. c #CBB26C",\r
+"c. c #D4B263",\r
+"v. c #DAB462",\r
+"b. c #D6B864",\r
+"n. c #DCB965",\r
+"m. c #D3B669",\r
+"M. c #DCB768",\r
+"N. c #D4BA6E",\r
+"B. c #DCBB6C",\r
+"V. c #CDB672",\r
+"C. c #D2B972",\r
+"Z. c #DBBE72",\r
+"A. c #E4BC62",\r
+"S. c #E9BE62",\r
+"D. c #E2BD6C",\r
+"F. c #E0BF72",\r
+"G. c #E6C05E",\r
+"H. c #EFC05D",\r
+"J. c #F0C15B",\r
+"K. c #DFC167",\r
+"L. c #D7C069",\r
+"P. c #DDC36D",\r
+"I. c #DBC376",\r
+"U. c #D4C17B",\r
+"Y. c #DAC17B",\r
+"T. c #D8C878",\r
+"R. c #E4C362",\r
+"E. c #EBC364",\r
+"W. c #E3C865",\r
+"Q. c #EDC866",\r
+"!. c #E4C36A",\r
+"~. c #E9C66B",\r
+"^. c #ECCA6B",\r
+"/. c #F1C564",\r
+"(. c #F8C765",\r
+"). c #F5CB66",\r
+"_. c #F8CC67",\r
+"`. c #F6CC6A",\r
+"'. c #F9CD6B",\r
+"]. c #EED26A",\r
+"[. c #F2D06F",\r
+"{. c #FBD26D",\r
+"}. c #E4C374",\r
+"|. c #EBC474",\r
+" X c #E1C972",\r
+".X c #EDCD72",\r
+"XX c #E4C57A",\r
+"oX c #E9C67C",\r
+"OX c #E5C87C",\r
+"+X c #EACA7D",\r
+"@X c #F2CC74",\r
+"#X c #FBCF71",\r
+"$X c #EED174",\r
+"%X c #ECD37B",\r
+"&X c #F4D274",\r
+"*X c #FDD473",\r
+"=X c #FFD975",\r
+"-X c #F4D57C",\r
+";X c #FCD57A",\r
+":X c #F3DA7C",\r
+">X c #FEDB7C",\r
+",X c #FFE37D",\r
+"<X c #DCC683",\r
+"1X c #E4C681",\r
+"2X c #E4CA84",\r
+"3X c #EBCD83",\r
+"4X c #E4CE8B",\r
+"5X c #EDCE8A",\r
+"6X c #EED186",\r
+"7X c #E5D08E",\r
+"8X c #EDD38B",\r
+"9X c #FBD581",\r
+"0X c #F5DB84",\r
+"qX c #FCDC83",\r
+"wX c #F2D38C",\r
+"eX c #F5DA8D",\r
+"rX c #FCDD8A",\r
+"tX c #EAD493",\r
+"yX c #EDDB94",\r
+"uX c #EDD898",\r
+"iX c #F1D594",\r
+"pX c #F5DB93",\r
+"aX c #F3DD9E",\r
+"sX c #F5E184",\r
+"dX c #FFE384",\r
+"fX c #FFE883",\r
+"gX c #F3E18D",\r
+"hX c #FEE38B",\r
+"jX c #FFEB8D",\r
+"kX c #FEE594",\r
+"lX c #FFEC93",\r
+"zX c #FEE599",\r
+"xX c #FFEB9B",\r
+"cX c #FFF296",\r
+"vX c #FFF39B",\r
+"bX c #FFF99C",\r
+"nX c #F3DFA0",\r
+"mX c #F6E2A3",\r
+"MX c #F8E5A5",\r
+"NX c #F4EAA4",\r
+"BX c #FEECA3",\r
+"VX c #FAE7A9",\r
+"CX c #FEEBAD",\r
+"ZX c #FFF2AD",\r
+"AX c #FEF4B4",\r
+"SX c #FFFAB5",\r
+"DX c #F9F7B9",\r
+"FX c #FFFCBC",\r
+"GX c #FFFDC2",\r
+"HX c None",\r
+/* pixels */\r
+"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX#.O.{ ~ W W ~ { o.O.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXO.W h j s f g b b S k f d 4 e ` HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHXHXHXHXHXHX' h f l U 1.H./.{.{.,X>X=XQ.s.=.v 5 1 < E HXHXHXHXHXHXHXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHXHXHXHX' g f F d.).).{.{.=X=X=X{.{.{.`.`.`.).g.U f 2 * a HXHXHXHXHXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHXHXHXV f b G.J.{.{.{.*X=X,X=X*X{.`.).`.).).{.`.{./.U 5 ; + HXHXHXHXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHX} h g 1.)._._.{.,X*X=X,X{.{.)._.).).`.`.`.{.*X*X*X`.y.g 2 & $ HXHXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHX{ j c G.).{.{.{.=X,X{.{.J.d.2.R 2.,.3.g.`.&X;X;X;X&X[.{.`.I 3 & + HXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHX{ d D /.{.{.*X=X=X*X).3.R I I I P F F U $.;.n.-XrXrX;X&X;X>XdX:.4 X o HXHXHXHXHXHXHX",\r
+"HXHXHXHXHX..j v /.*X=X=X=X=X`.1.R R R R I I I P K U *.e.D.|.}.+XrXqXhXhXdXfX:.4 X o HXHXHXHXHXHX",\r
+"HXHXHXHXHXh v `.{.>X,X*X{.g.>.Y R I I I I I I U U ;.t.D.|.oXB.z.F.kXvXcXjXjXjX/ 1 . + HXHXHXHXHX",\r
+"HXHXHXHXV g Q.=X=X>X>X'.>.Y Y U R I I I P P I U U <.n.~.}.F.XXXX}.%XbXbXcXcXcXsXc =   # HXHXHXHX",\r
+"HXHXHX} j t.>X>X>X*X'.>.U U I U P U U I P P I U T 6.M.D.oX5XwXeXeXqX0XvXbXbXcXjXW.5 %   HXHXHXHX",\r
+"HXHXHXM G hXhXqX>X*X<.U U U I I I I I I D D U T T -.9.B.3XpXpXzXgXqX:X:XbXbXcXjXfXT <   o HXHXHX",\r
+"HXHX} k  XlXkXkXrXA.$.D Z Z Z v v v b b v D U U *.-.9.B.OX2XOXI.P.L.K.W.$XbXcXjX,X].d %   9 HXHX",\r
+"HXHXV J xXxXxXxXrX5.&.A M m m m h h n s 5 g S K *.:.8.4.| k.x.C.N.z.7.) :.$XjXfX,X,XT ;   o HXHX",\r
+"HXHXM L.vXxXxXxXF._ MXCXCXCXCXCXCXCXCXmXY.h g K *./ ^ Y.mXCXCXCXCXCXCXVXZ.4.hXfX,X,XW.4 X   HXHX",\r
+"HX] k gXxXxXxXgXe.V MXCXCXCXCXVXCXCXCXCXCXyXh D G [ mXCXCXCXCXCXCXCXCXCX4XG ~.fX,X,X,Xg &   $ HX",\r
+"HXV J vXxXxXxX6Xe.V MXCXCXCXCXk.N VXCXCXCXVX| h ^ MXCXCXCXCXuX( n V l.mX4XA y.fX,X,X=XT ;     HX",\r
+"HXk r.xXxXxXxX|.v.V MXCXCXCXCXo.> 4XCXCXCXCXx.w tXCXCXCXCXnXn V / / M V m.&.t.=X,X,X=Xy.2 o   HX",\r
+"HXk P.xXvXxXxX|.M.Q nXCXCXCXCXj.w <XCXCXCXCXz.W CXCXCXCXCXk.V e.a.i.:.-.;.e.f.@X>X>X=XH.5 X   $ ",\r
+"o.k %XvXbXBXkX|.D.Q nXCXCXCXCXj., 7XCXCXCXCX~ k.CXCXCXCXCXV &.n.R.g.G.g.S.S.S.(.qX*X=X`.5 X   $ ",\r
+" .k 0XvXvXvXrX@XD.^ VXCXCXCXCXx.~ VXCXCXCX<Xe C.CXCXCXCXMXn q.R.R.h.S.E.E.E.S.S.>X=X*X*Xd X   $ ",\r
+"{ k sXcXvXBXeX@XD.( nXCXCXCXCXCXCXCXCXVXo., u T.CXCXCXVXmXn t.E.g.g.h.S.g.S.f.A.>X;X*X*Xf &   o ",\r
+"{ k sXjXlXcX0X~.n.^ MXCXCXCXCXCXCXCXCXCXCXU.t U.CXCXCXCXmXM p.~.W.g.s.s.s.s.f.A.>X*X*X*Xj %     ",\r
+"o.k :XjXlXlX-XD.v.A MXCXCXCXCXj.t mXCXCXCXCX .x.CXCXCXCXVXV p.$X^.E.g.s.w.w.w.A.9X;X*X*Xf X     ",\r
+"o.g ].dXjXhX-Xn.e.V MXCXCXCXCXj.8 <XCXCXCXCX<X] CXCXCXCXCX^ r.$X$X~.A.s.w.1.q.S.qX>X*X#X5 X   O ",\r
+"HXj K.dXdXhX9Xv.9.M MXCXCXCXCXk.a Z.CXCXCXCX7Xu CXCXCXCXCXV./ !.$X~.f.5.%.0.q.S.>X*X*XE.5 X   # ",\r
+"HXj t.dX,XdXdXi.6.N MXCXCXCXCXo.q <XCXCXCXCX<Xy 4XCXCXCXCXMX) / e.6./ _ C.U ;.`.;X*X#Xs.1 .   @ ",\r
+"HXj K >XqXqXqX!.6.m MXCXCXCXCXV.' VXCXCXZXCXk.! ] VXCXCXCXCXVXC.[ 7.Z.VX2Xx %.#X#X'.'.%.- o   6 ",\r
+"HX( g &X>X>XdX-X5.M MXCXCXCXCXCXCXCXCXCXCX7X) m.9. .MXCXCXCXCXCXCXCXCXCX2Xs 1.'.`.'.'.x %     HX",\r
+"HXO.j y.>X>X>X>X6.! zXMXMXMXMXMXMXMXMXuXx.( N.8X6Xz.) C.uXCXCXCXCXCXVX7X4.c h.'.(.(.s.5 X     HX",\r
+"HXHXj H &X=X:X>X~./ V h y u n n n N W ( 7.Z.8XpXpX+Xm.| V V ^ ) ( m e 3 s R (.(.'.'.Y ; .   > HX",\r
+"HXHX} f G.&X&X&X:Xt._ / ) _ 4.8.l.m.B.Z.2XwXpXeXwX6X+XP.c.8.-./ C x x z P J.(.'.(./.5 %     HXHX",\r
+"HXHXHXh D &X&X&X&X@X:.4.5.9.c.m.F.OX+XwXwXwXwX6X3XOX}.D.D.v.w.%.Y I P P d.(.(.'.'.=.< .   + HXHX",\r
+"HXHXHX] d y.[.&X&X&X~.:.4.9.e.M.B.}.oX3X5X3X3X+X}.F.M.e.0.0.0.%.%.Y Y s.#X#X#X#XS.s %     HXHXHX",\r
+"HXHXHXHXm g `.@X&X&X&X~.5.6.e.b.B.}.XX+X3XOX}.I.F.F.D.e.e.e.e.e.q.0.A.;X;X#X-X@XZ = o   + HXHXHX",\r
+"HXHXHXHX..j D @X&X&X&X&X@Xp.u.M.D.}.XXOXOXZ.Z.XX1XOXoXoXF.F.F.M.D.6XrXqX9X9X9X%.1 .     HXHXHXHX",\r
+"HXHXHXHXHX' f $.&X&X&X>XqXqX XB.D.!.XXXXZ.XXOX5XwXwXwXwXiXwXwXnXVXZXBXxXzXxXb.r X     $ HXHXHXHX",\r
+"HXHXHXHXHXHX~ j ;.qXqXqXqXrXkXrX+XD.Z.Z.XX1X2X5X5X5XwXwXiXnXCXGXGXFXFXSXAXT.s %     @ HXHXHXHXHX",\r
+"HXHXHXHXHXHXHX~ j -.0XrXzXxXzXzXzXzXwX3XXXXXOX1X2X5XpXmXAXFXGXGXGXFXFXSXL.r %     O HXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHX! j / gXSXSXZXxXzXzXkXxXzXBXBXBXZXCXAXAXAXAXSXSXSXSXNX| 3 &     O HXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHXHX} n V U.DXSXBXzXkXkXkXxXxXxXBXxXBXBXCXZXZXZXAXAXU.M < .     @ HXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHXHXHXHXV d G Z.pXzXkXzXjXkXkXxXzXxXxXxXBXBXZXNXT.G 3 * .     9 HXHXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHXHXHXHXHX@.u s k -.K.6XhXjXhXkXlXzXzXzXeXOX9.k 3 = X     O HXHXHXHXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHXHXHXHXHXHXHX..w < s j k K -.;.:.-./ C j 4 < & .     O HXHXHXHXHXHXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXE * = - - < < - = & X .       0 HXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",\r
+"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXi 7 7 @ o o O > 0 i HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX"\r
+};\r
diff --git a/xpm/check.xpm b/xpm/check.xpm
new file mode 100644 (file)
index 0000000..8f0b9d2
--- /dev/null
@@ -0,0 +1,41 @@
+/* XPM */\r
+static char * check_xpm[] = {\r
+/* columns rows colors chars-per-pixel */\r
+"32 32 3 1",\r
+"  c #008000",\r
+". c #00FF00",\r
+"X c None",\r
+/* pixels */\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXX   XXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXX .  XXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXX .. XXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXX .  XXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXX .. XXXXXXXXXXXXX",\r
+"XXXXXXXXXXX  XX .  XXXXXXXXXXXXX",\r
+"XXXXXXXXXXX .  .. XXXXXXXXXXXXXX",\r
+"XXXXXXXXXXX .. .  XXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXX ... XXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXX .  XXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXX  XXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\r
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"\r
+};\r
diff --git a/xpm/send16.xpm b/xpm/send16.xpm
new file mode 100644 (file)
index 0000000..1eeceb4
--- /dev/null
@@ -0,0 +1,278 @@
+/* XPM */\r
+static char * send16_xpm[] = {\r
+/* columns rows colors chars-per-pixel */\r
+"16 16 256 2",\r
+"   c #ADF7AD",\r
+".  c #9CFF9C",\r
+"X  c None",\r
+"o  c #ADEFAD",\r
+"O  c #94FF94",\r
+"+  c #D6CECE",\r
+"@  c #8CFF8C",\r
+"#  c #CECECE",\r
+"$  c #CECEC5",\r
+"%  c #84FF84",\r
+"&  c #CEC5C5",\r
+"*  c #73FF73",\r
+"=  c #C5C5C5",\r
+"-  c #6BFF6B",\r
+";  c #73F773",\r
+":  c #C5BDBD",\r
+">  c #6BF76B",\r
+",  c #BDBDBD",\r
+"<  c #63F763",\r
+"1  c #B5B5B5",\r
+"2  c #52F752",\r
+"3  c #42FF42",\r
+"4  c #3AFF3A",\r
+"5  c #ADADAD",\r
+"6  c #ADADA5",\r
+"7  c #4AEF4A",\r
+"8  c #29FF29",\r
+"9  c #A5A5A5",\r
+"0  c #42E642",\r
+"q  c #9CA59C",\r
+"w  c #3AE63A",\r
+"e  c #10FF10",\r
+"r  c #08FF08",\r
+"t  c #949C94",\r
+"y  c #00FF00",\r
+"u  c #00F700",\r
+"i  c #8C948C",\r
+"p  c #00EF00",\r
+"a  c #08E608",\r
+"s  c #10DE10",\r
+"d  c #00E600",\r
+"f  c #00DE00",\r
+"g  c #19C519",\r
+"h  c #00CE00",\r
+"j  c #00C500",\r
+"k  c #008C00",\r
+"l  c #008400",\r
+"z  c #669900",\r
+"x  c #999900",\r
+"c  c #CC9900",\r
+"v  c #FF9900",\r
+"b  c #00CC00",\r
+"n  c #33CC00",\r
+"m  c #66CC00",\r
+"M  c #99CC00",\r
+"N  c #CCCC00",\r
+"B  c #FFCC00",\r
+"V  c #66FF00",\r
+"C  c #99FF00",\r
+"Z  c #CCFF00",\r
+"A  c #000033",\r
+"S  c #330033",\r
+"D  c #660033",\r
+"F  c #990033",\r
+"G  c #CC0033",\r
+"H  c #FF0033",\r
+"J  c #003333",\r
+"K  c #333333",\r
+"L  c #663333",\r
+"P  c #993333",\r
+"I  c #CC3333",\r
+"U  c #FF3333",\r
+"Y  c #006633",\r
+"T  c #336633",\r
+"R  c #666633",\r
+"E  c #996633",\r
+"W  c #CC6633",\r
+"Q  c #FF6633",\r
+"!  c #009933",\r
+"~  c #339933",\r
+"^  c #669933",\r
+"/  c #999933",\r
+"(  c #CC9933",\r
+")  c #FF9933",\r
+"_  c #00CC33",\r
+"`  c #33CC33",\r
+"'  c #66CC33",\r
+"]  c #99CC33",\r
+"[  c #CCCC33",\r
+"{  c #FFCC33",\r
+"}  c #33FF33",\r
+"|  c #66FF33",\r
+" . c #99FF33",\r
+".. c #CCFF33",\r
+"X. c #FFFF33",\r
+"o. c #000066",\r
+"O. c #330066",\r
+"+. c #660066",\r
+"@. c #990066",\r
+"#. c #CC0066",\r
+"$. c #FF0066",\r
+"%. c #003366",\r
+"&. c #333366",\r
+"*. c #663366",\r
+"=. c #993366",\r
+"-. c #CC3366",\r
+";. c #FF3366",\r
+":. c #006666",\r
+">. c #336666",\r
+",. c #666666",\r
+"<. c #996666",\r
+"1. c #CC6666",\r
+"2. c #009966",\r
+"3. c #339966",\r
+"4. c #669966",\r
+"5. c #999966",\r
+"6. c #CC9966",\r
+"7. c #FF9966",\r
+"8. c #00CC66",\r
+"9. c #33CC66",\r
+"0. c #99CC66",\r
+"q. c #CCCC66",\r
+"w. c #FFCC66",\r
+"e. c #00FF66",\r
+"r. c #33FF66",\r
+"t. c #99FF66",\r
+"y. c #CCFF66",\r
+"u. c #FF00CC",\r
+"i. c #CC00FF",\r
+"p. c #009999",\r
+"a. c #993399",\r
+"s. c #990099",\r
+"d. c #CC0099",\r
+"f. c #000099",\r
+"g. c #333399",\r
+"h. c #660099",\r
+"j. c #CC3399",\r
+"k. c #FF0099",\r
+"l. c #006699",\r
+"z. c #336699",\r
+"x. c #663399",\r
+"c. c #996699",\r
+"v. c #CC6699",\r
+"b. c #FF3399",\r
+"n. c #339999",\r
+"m. c #669999",\r
+"M. c #999999",\r
+"N. c #CC9999",\r
+"B. c #FF9999",\r
+"V. c #00CC99",\r
+"C. c #33CC99",\r
+"Z. c #66CC66",\r
+"A. c #99CC99",\r
+"S. c #CCCC99",\r
+"D. c #FFCC99",\r
+"F. c #00FF99",\r
+"G. c #33FF99",\r
+"H. c #66CC99",\r
+"J. c #99FF99",\r
+"K. c #CCFF99",\r
+"L. c #FFFF99",\r
+"P. c #0000CC",\r
+"I. c #330099",\r
+"U. c #6600CC",\r
+"Y. c #9900CC",\r
+"T. c #CC00CC",\r
+"R. c #003399",\r
+"E. c #3333CC",\r
+"W. c #6633CC",\r
+"Q. c #9933CC",\r
+"!. c #CC33CC",\r
+"~. c #FF33CC",\r
+"^. c #0066CC",\r
+"/. c #3366CC",\r
+"(. c #666699",\r
+"). c #9966CC",\r
+"_. c #CC66CC",\r
+"`. c #FF6699",\r
+"'. c #0099CC",\r
+"]. c #3399CC",\r
+"[. c #6699CC",\r
+"{. c #9999CC",\r
+"}. c #CC99CC",\r
+"|. c #FF99CC",\r
+" X c #00CCCC",\r
+".X c #33CCCC",\r
+"XX c #66CCCC",\r
+"oX c #99CCCC",\r
+"OX c #CCCCCC",\r
+"+X c #FFCCCC",\r
+"@X c #00FFCC",\r
+"#X c #33FFCC",\r
+"$X c #66FF99",\r
+"%X c #99FFCC",\r
+"&X c #CCFFCC",\r
+"*X c #FFFFCC",\r
+"=X c #3300CC",\r
+"-X c #6600FF",\r
+";X c #9900FF",\r
+":X c #0033CC",\r
+">X c #3333FF",\r
+",X c #6633FF",\r
+"<X c #9933FF",\r
+"1X c #CC33FF",\r
+"2X c #FF33FF",\r
+"3X c #0066FF",\r
+"4X c #3366FF",\r
+"5X c #6666CC",\r
+"6X c #9966FF",\r
+"7X c #CC66FF",\r
+"8X c #FF66CC",\r
+"9X c #0099FF",\r
+"0X c #3399FF",\r
+"qX c #6699FF",\r
+"wX c #9999FF",\r
+"eX c #CC99FF",\r
+"rX c #FF99FF",\r
+"tX c #00CCFF",\r
+"yX c #33CCFF",\r
+"uX c #66CCFF",\r
+"iX c #99CCFF",\r
+"pX c #CCCCFF",\r
+"aX c #FFCCFF",\r
+"sX c #33FFFF",\r
+"dX c #66FFCC",\r
+"fX c #99FFFF",\r
+"gX c #CCFFFF",\r
+"hX c #FF6666",\r
+"jX c #66FF66",\r
+"kX c #FFFF66",\r
+"lX c #6666FF",\r
+"zX c #FF66FF",\r
+"xX c #66FFFF",\r
+"cX c #A50021",\r
+"vX c #5F5F5F",\r
+"bX c #777777",\r
+"nX c #868686",\r
+"mX c #969696",\r
+"MX c #CBCBCB",\r
+"NX c #B2B2B2",\r
+"BX c #D7D7D7",\r
+"VX c #DDDDDD",\r
+"CX c #E3E3E3",\r
+"ZX c #EAEAEA",\r
+"AX c #F1F1F1",\r
+"SX c #F8F8F8",\r
+"DX c #FFFBF0",\r
+"FX c #A0A0A4",\r
+"GX c #808080",\r
+"HX c #FF0000",\r
+"JX c #00FF00",\r
+"KX c #FFFF00",\r
+"LX c #0000FF",\r
+"PX c #FF00FF",\r
+"IX c #00FFFF",\r
+"UX c #FFFFFF",\r
+/* pixels */\r
+"X X X X X X X k k X X X X X X X ",\r
+"X X X X X X X k j k X X X X X X ",\r
+"X X X X X X X k o j k X X X X X ",\r
+"X X X X X X X k * o j k X X X X ",\r
+"l k k k k k k k * * . j k X X X ",\r
+"l @ @ @ @ @ @ @ 4 e e % j k X X ",\r
+"l O 3 8 e r r r r r r e ; j k X ",\r
+"l @ e e r r r r r u p a f < j k ",\r
+"l @ r u p a a a a a f f w j k i ",\r
+"l O ; ; ; ; ; < a f b 0 j k t : ",\r
+"l k k k k k k k s j 7 j k q = X ",\r
+"X $ = = = = = k g 7 j k 9 & X X ",\r
+"X X X X X X X k 2 j k 6 $ X X X ",\r
+"X X X X X X X k j k 5 + X X X X ",\r
+"X X X X X X X k k 1 + X X X X X ",\r
+"X X X X X X X = , X X X X X X X "\r
+};\r
diff --git a/xpm/send16noshadow.xpm b/xpm/send16noshadow.xpm
new file mode 100644 (file)
index 0000000..d1b482e
--- /dev/null
@@ -0,0 +1,278 @@
+/* XPM */\r
+static char * send16noshadow_xpm[] = {\r
+/* columns rows colors chars-per-pixel */\r
+"16 16 256 2",\r
+"   c #ADF7AD",\r
+".  c #9CFF9C",\r
+"X  c None",\r
+"o  c #ADEFAD",\r
+"O  c #94FF94",\r
+"+  c #D6CECE",\r
+"@  c #8CFF8C",\r
+"#  c #CECECE",\r
+"$  c #CECEC5",\r
+"%  c #84FF84",\r
+"&  c #CEC5C5",\r
+"*  c #73FF73",\r
+"=  c #C5C5C5",\r
+"-  c #6BFF6B",\r
+";  c #73F773",\r
+":  c #C5BDBD",\r
+">  c #6BF76B",\r
+",  c #BDBDBD",\r
+"<  c #63F763",\r
+"1  c #B5B5B5",\r
+"2  c #52F752",\r
+"3  c #42FF42",\r
+"4  c #3AFF3A",\r
+"5  c #ADADAD",\r
+"6  c #ADADA5",\r
+"7  c #4AEF4A",\r
+"8  c #29FF29",\r
+"9  c #A5A5A5",\r
+"0  c #42E642",\r
+"q  c #9CA59C",\r
+"w  c #3AE63A",\r
+"e  c #10FF10",\r
+"r  c #08FF08",\r
+"t  c #949C94",\r
+"y  c #00FF00",\r
+"u  c #00F700",\r
+"i  c #8C948C",\r
+"p  c #00EF00",\r
+"a  c #08E608",\r
+"s  c #10DE10",\r
+"d  c #00E600",\r
+"f  c #00DE00",\r
+"g  c #19C519",\r
+"h  c #00CE00",\r
+"j  c #00C500",\r
+"k  c #008C00",\r
+"l  c #008400",\r
+"z  c #669900",\r
+"x  c #999900",\r
+"c  c #CC9900",\r
+"v  c #FF9900",\r
+"b  c #00CC00",\r
+"n  c #33CC00",\r
+"m  c #66CC00",\r
+"M  c #99CC00",\r
+"N  c #CCCC00",\r
+"B  c #FFCC00",\r
+"V  c #66FF00",\r
+"C  c #99FF00",\r
+"Z  c #CCFF00",\r
+"A  c #000033",\r
+"S  c #330033",\r
+"D  c #660033",\r
+"F  c #990033",\r
+"G  c #CC0033",\r
+"H  c #FF0033",\r
+"J  c #003333",\r
+"K  c #333333",\r
+"L  c #663333",\r
+"P  c #993333",\r
+"I  c #CC3333",\r
+"U  c #FF3333",\r
+"Y  c #006633",\r
+"T  c #336633",\r
+"R  c #666633",\r
+"E  c #996633",\r
+"W  c #CC6633",\r
+"Q  c #FF6633",\r
+"!  c #009933",\r
+"~  c #339933",\r
+"^  c #669933",\r
+"/  c #999933",\r
+"(  c #CC9933",\r
+")  c #FF9933",\r
+"_  c #00CC33",\r
+"`  c #33CC33",\r
+"'  c #66CC33",\r
+"]  c #99CC33",\r
+"[  c #CCCC33",\r
+"{  c #FFCC33",\r
+"}  c #33FF33",\r
+"|  c #66FF33",\r
+" . c #99FF33",\r
+".. c #CCFF33",\r
+"X. c #FFFF33",\r
+"o. c #000066",\r
+"O. c #330066",\r
+"+. c #660066",\r
+"@. c #990066",\r
+"#. c #CC0066",\r
+"$. c #FF0066",\r
+"%. c #003366",\r
+"&. c #333366",\r
+"*. c #663366",\r
+"=. c #993366",\r
+"-. c #CC3366",\r
+";. c #FF3366",\r
+":. c #006666",\r
+">. c #336666",\r
+",. c #666666",\r
+"<. c #996666",\r
+"1. c #CC6666",\r
+"2. c #009966",\r
+"3. c #339966",\r
+"4. c #669966",\r
+"5. c #999966",\r
+"6. c #CC9966",\r
+"7. c #FF9966",\r
+"8. c #00CC66",\r
+"9. c #33CC66",\r
+"0. c #99CC66",\r
+"q. c #CCCC66",\r
+"w. c #FFCC66",\r
+"e. c #00FF66",\r
+"r. c #33FF66",\r
+"t. c #99FF66",\r
+"y. c #CCFF66",\r
+"u. c #FF00CC",\r
+"i. c #CC00FF",\r
+"p. c #009999",\r
+"a. c #993399",\r
+"s. c #990099",\r
+"d. c #CC0099",\r
+"f. c #000099",\r
+"g. c #333399",\r
+"h. c #660099",\r
+"j. c #CC3399",\r
+"k. c #FF0099",\r
+"l. c #006699",\r
+"z. c #336699",\r
+"x. c #663399",\r
+"c. c #996699",\r
+"v. c #CC6699",\r
+"b. c #FF3399",\r
+"n. c #339999",\r
+"m. c #669999",\r
+"M. c #999999",\r
+"N. c #CC9999",\r
+"B. c #FF9999",\r
+"V. c #00CC99",\r
+"C. c #33CC99",\r
+"Z. c #66CC66",\r
+"A. c #99CC99",\r
+"S. c #CCCC99",\r
+"D. c #FFCC99",\r
+"F. c #00FF99",\r
+"G. c #33FF99",\r
+"H. c #66CC99",\r
+"J. c #99FF99",\r
+"K. c #CCFF99",\r
+"L. c #FFFF99",\r
+"P. c #0000CC",\r
+"I. c #330099",\r
+"U. c #6600CC",\r
+"Y. c #9900CC",\r
+"T. c #CC00CC",\r
+"R. c #003399",\r
+"E. c #3333CC",\r
+"W. c #6633CC",\r
+"Q. c #9933CC",\r
+"!. c #CC33CC",\r
+"~. c #FF33CC",\r
+"^. c #0066CC",\r
+"/. c #3366CC",\r
+"(. c #666699",\r
+"). c #9966CC",\r
+"_. c #CC66CC",\r
+"`. c #FF6699",\r
+"'. c #0099CC",\r
+"]. c #3399CC",\r
+"[. c #6699CC",\r
+"{. c #9999CC",\r
+"}. c #CC99CC",\r
+"|. c #FF99CC",\r
+" X c #00CCCC",\r
+".X c #33CCCC",\r
+"XX c #66CCCC",\r
+"oX c #99CCCC",\r
+"OX c #CCCCCC",\r
+"+X c #FFCCCC",\r
+"@X c #00FFCC",\r
+"#X c #33FFCC",\r
+"$X c #66FF99",\r
+"%X c #99FFCC",\r
+"&X c #CCFFCC",\r
+"*X c #FFFFCC",\r
+"=X c #3300CC",\r
+"-X c #6600FF",\r
+";X c #9900FF",\r
+":X c #0033CC",\r
+">X c #3333FF",\r
+",X c #6633FF",\r
+"<X c #9933FF",\r
+"1X c #CC33FF",\r
+"2X c #FF33FF",\r
+"3X c #0066FF",\r
+"4X c #3366FF",\r
+"5X c #6666CC",\r
+"6X c #9966FF",\r
+"7X c #CC66FF",\r
+"8X c #FF66CC",\r
+"9X c #0099FF",\r
+"0X c #3399FF",\r
+"qX c #6699FF",\r
+"wX c #9999FF",\r
+"eX c #CC99FF",\r
+"rX c #FF99FF",\r
+"tX c #00CCFF",\r
+"yX c #33CCFF",\r
+"uX c #66CCFF",\r
+"iX c #99CCFF",\r
+"pX c #CCCCFF",\r
+"aX c #FFCCFF",\r
+"sX c #33FFFF",\r
+"dX c #66FFCC",\r
+"fX c #99FFFF",\r
+"gX c #CCFFFF",\r
+"hX c #FF6666",\r
+"jX c #66FF66",\r
+"kX c #FFFF66",\r
+"lX c #6666FF",\r
+"zX c #FF66FF",\r
+"xX c #66FFFF",\r
+"cX c #A50021",\r
+"vX c #5F5F5F",\r
+"bX c #777777",\r
+"nX c #868686",\r
+"mX c #969696",\r
+"MX c #CBCBCB",\r
+"NX c #B2B2B2",\r
+"BX c #D7D7D7",\r
+"VX c #DDDDDD",\r
+"CX c #E3E3E3",\r
+"ZX c #EAEAEA",\r
+"AX c #F1F1F1",\r
+"SX c #F8F8F8",\r
+"DX c #FFFBF0",\r
+"FX c #A0A0A4",\r
+"GX c #808080",\r
+"HX c #FF0000",\r
+"JX c #00FF00",\r
+"KX c #FFFF00",\r
+"LX c #0000FF",\r
+"PX c #FF00FF",\r
+"IX c #00FFFF",\r
+"UX c #FFFFFF",\r
+/* pixels */\r
+"X X X X X X X k k X X X X X X X ",\r
+"X X X X X X X k j k X X X X X X ",\r
+"X X X X X X X k o j k X X X X X ",\r
+"X X X X X X X k * o j k X X X X ",\r
+"l k k k k k k k * * . j k X X X ",\r
+"l @ @ @ @ @ @ @ 4 e e % j k X X ",\r
+"l O 3 8 e r r r r r r e ; j k X ",\r
+"l @ e e r r r r r u p a f < j k ",\r
+"l @ r u p a a a a a f f w j k X ",\r
+"l O ; ; ; ; ; < a f b 0 j k X X ",\r
+"l k k k k k k k s j 7 j k X X X ",\r
+"X X X X X X X k g 7 j k X X X X ",\r
+"X X X X X X X k 2 j k X X X X X ",\r
+"X X X X X X X k j k X X X X X X ",\r
+"X X X X X X X k k X X X X X X X ",\r
+"X X X X X X X X X X X X X X X X "\r
+};\r
diff --git a/xpm/send20.xpm b/xpm/send20.xpm
new file mode 100644 (file)
index 0000000..597ea14
--- /dev/null
@@ -0,0 +1,282 @@
+/* XPM */\r
+static char * send20_xpm[] = {\r
+/* columns rows colors chars-per-pixel */\r
+"20 20 256 2",\r
+"   c #CEFFCE",\r
+".  c #BDFFBD",\r
+"X  c #C5F7C5",\r
+"o  c #B5FFB5",\r
+"O  c #ADFFAD",\r
+"+  c #A5FFA5",\r
+"@  c #9CFF9C",\r
+"#  c None",\r
+"$  c #94FF94",\r
+"%  c #D6CECE",\r
+"&  c #8CFF8C",\r
+"*  c #CECEC5",\r
+"=  c #84FF84",\r
+"-  c #94EF94",\r
+";  c #7BFF7B",\r
+":  c #CEC5C5",\r
+">  c #73FF73",\r
+",  c #C5C5C5",\r
+"<  c #C5C5BD",\r
+"1  c #6BFF6B",\r
+"2  c #BDC5B5",\r
+"3  c #63FF63",\r
+"4  c #6BF76B",\r
+"5  c #BDBDBD",\r
+"6  c #BDBDB5",\r
+"7  c #5AFF5A",\r
+"8  c #63F763",\r
+"9  c #B5BDB5",\r
+"0  c #B5BDAD",\r
+"q  c #52FF52",\r
+"w  c #BDB5B5",\r
+"e  c #5AF75A",\r
+"r  c #B5B5B5",\r
+"t  c #B5B5AD",\r
+"y  c #52F752",\r
+"u  c #42FF42",\r
+"i  c #52EF52",\r
+"p  c #ADADAD",\r
+"a  c #ADADA5",\r
+"s  c #4AEF4A",\r
+"d  c #31FF31",\r
+"f  c #29FF29",\r
+"g  c #A5A5A5",\r
+"h  c #21FF21",\r
+"j  c #5AD65A",\r
+"k  c #42E642",\r
+"l  c #94AD94",\r
+"z  c #4ADE4A",\r
+"x  c #3AE63A",\r
+"c  c #5ACE5A",\r
+"v  c #10FF10",\r
+"b  c #9C9C9C",\r
+"n  c #31E631",\r
+"m  c #08FF08",\r
+"M  c #949C94",\r
+"N  c #84A584",\r
+"B  c #00FF00",\r
+"V  c #3AD63A",\r
+"C  c #52C552",\r
+"Z  c #00F700",\r
+"A  c #8C948C",\r
+"S  c #849484",\r
+"D  c #00EF00",\r
+"F  c #739C73",\r
+"G  c #08E608",\r
+"H  c #4AB54A",\r
+"J  c #31C531",\r
+"K  c #00E600",\r
+"L  c #739473",\r
+"P  c #00DE00",\r
+"I  c #63945A",\r
+"U  c #6B8C6B",\r
+"Y  c #00D600",\r
+"T  c #42A542",\r
+"R  c #638C63",\r
+"E  c #00CE00",\r
+"W  c #21B521",\r
+"Q  c #5A8C5A",\r
+"!  c #00C500",\r
+"~  c #528C52",\r
+"^  c #3A9C3A",\r
+"/  c #4A8C4A",\r
+"(  c #00BD00",\r
+")  c #319431",\r
+"_  c #219C21",\r
+"`  c #318C31",\r
+"'  c #3A843A",\r
+"]  c #219421",\r
+"[  c #298C29",\r
+"{  c #318431",\r
+"}  c #218C21",\r
+"|  c #218C19",\r
+" . c #198C19",\r
+".. c #218421",\r
+"X. c #297B29",\r
+"o. c #198419",\r
+"O. c #217B21",\r
+"+. c #108410",\r
+"@. c #197B19",\r
+"#. c #CC0066",\r
+"$. c #FF0066",\r
+"%. c #003366",\r
+"&. c #333366",\r
+"*. c #663366",\r
+"=. c #993366",\r
+"-. c #CC3366",\r
+";. c #FF3366",\r
+":. c #006666",\r
+">. c #336666",\r
+",. c #666666",\r
+"<. c #996666",\r
+"1. c #CC6666",\r
+"2. c #009966",\r
+"3. c #339966",\r
+"4. c #669966",\r
+"5. c #999966",\r
+"6. c #CC9966",\r
+"7. c #FF9966",\r
+"8. c #00CC66",\r
+"9. c #33CC66",\r
+"0. c #99CC66",\r
+"q. c #CCCC66",\r
+"w. c #FFCC66",\r
+"e. c #00FF66",\r
+"r. c #33FF66",\r
+"t. c #99FF66",\r
+"y. c #CCFF66",\r
+"u. c #FF00CC",\r
+"i. c #CC00FF",\r
+"p. c #009999",\r
+"a. c #993399",\r
+"s. c #990099",\r
+"d. c #CC0099",\r
+"f. c #000099",\r
+"g. c #333399",\r
+"h. c #660099",\r
+"j. c #CC3399",\r
+"k. c #FF0099",\r
+"l. c #006699",\r
+"z. c #336699",\r
+"x. c #663399",\r
+"c. c #996699",\r
+"v. c #CC6699",\r
+"b. c #FF3399",\r
+"n. c #339999",\r
+"m. c #669999",\r
+"M. c #999999",\r
+"N. c #CC9999",\r
+"B. c #FF9999",\r
+"V. c #00CC99",\r
+"C. c #33CC99",\r
+"Z. c #66CC66",\r
+"A. c #99CC99",\r
+"S. c #CCCC99",\r
+"D. c #FFCC99",\r
+"F. c #00FF99",\r
+"G. c #33FF99",\r
+"H. c #66CC99",\r
+"J. c #99FF99",\r
+"K. c #CCFF99",\r
+"L. c #FFFF99",\r
+"P. c #0000CC",\r
+"I. c #330099",\r
+"U. c #6600CC",\r
+"Y. c #9900CC",\r
+"T. c #CC00CC",\r
+"R. c #003399",\r
+"E. c #3333CC",\r
+"W. c #6633CC",\r
+"Q. c #9933CC",\r
+"!. c #CC33CC",\r
+"~. c #FF33CC",\r
+"^. c #0066CC",\r
+"/. c #3366CC",\r
+"(. c #666699",\r
+"). c #9966CC",\r
+"_. c #CC66CC",\r
+"`. c #FF6699",\r
+"'. c #0099CC",\r
+"]. c #3399CC",\r
+"[. c #6699CC",\r
+"{. c #9999CC",\r
+"}. c #CC99CC",\r
+"|. c #FF99CC",\r
+" X c #00CCCC",\r
+".X c #33CCCC",\r
+"XX c #66CCCC",\r
+"oX c #99CCCC",\r
+"OX c #CCCCCC",\r
+"+X c #FFCCCC",\r
+"@X c #00FFCC",\r
+"#X c #33FFCC",\r
+"$X c #66FF99",\r
+"%X c #99FFCC",\r
+"&X c #CCFFCC",\r
+"*X c #FFFFCC",\r
+"=X c #3300CC",\r
+"-X c #6600FF",\r
+";X c #9900FF",\r
+":X c #0033CC",\r
+">X c #3333FF",\r
+",X c #6633FF",\r
+"<X c #9933FF",\r
+"1X c #CC33FF",\r
+"2X c #FF33FF",\r
+"3X c #0066FF",\r
+"4X c #3366FF",\r
+"5X c #6666CC",\r
+"6X c #9966FF",\r
+"7X c #CC66FF",\r
+"8X c #FF66CC",\r
+"9X c #0099FF",\r
+"0X c #3399FF",\r
+"qX c #6699FF",\r
+"wX c #9999FF",\r
+"eX c #CC99FF",\r
+"rX c #FF99FF",\r
+"tX c #00CCFF",\r
+"yX c #33CCFF",\r
+"uX c #66CCFF",\r
+"iX c #99CCFF",\r
+"pX c #CCCCFF",\r
+"aX c #FFCCFF",\r
+"sX c #33FFFF",\r
+"dX c #66FFCC",\r
+"fX c #99FFFF",\r
+"gX c #CCFFFF",\r
+"hX c #FF6666",\r
+"jX c #66FF66",\r
+"kX c #FFFF66",\r
+"lX c #6666FF",\r
+"zX c #FF66FF",\r
+"xX c #66FFFF",\r
+"cX c #A50021",\r
+"vX c #5F5F5F",\r
+"bX c #777777",\r
+"nX c #868686",\r
+"mX c #969696",\r
+"MX c #CBCBCB",\r
+"NX c #B2B2B2",\r
+"BX c #D7D7D7",\r
+"VX c #DDDDDD",\r
+"CX c #E3E3E3",\r
+"ZX c #EAEAEA",\r
+"AX c #F1F1F1",\r
+"SX c #F8F8F8",\r
+"DX c #FFFBF0",\r
+"FX c #A0A0A4",\r
+"GX c #808080",\r
+"HX c #FF0000",\r
+"JX c #00FF00",\r
+"KX c #FFFF00",\r
+"LX c #0000FF",\r
+"PX c #FF00FF",\r
+"IX c #00FFFF",\r
+"UX c #FFFFFF",\r
+/* pixels */\r
+"# # # # # # # # # # # # # # # # # # # # ",\r
+"# # # # # # # ` 0 # # # # # # # # # # # ",\r
+"# # # # # # # ..` l # # # # # # # # # # ",\r
+"# # # # # # # [ X ) N # # # # # # # # # ",\r
+"# # # # # # # [ &X. ^ F # # # # # # # # ",\r
+"# # # # # # # } o & o T I : # # # # # # ",\r
+"` ` ` ` ` ` ` ` + 7 ; + H ~ < # # # # # ",\r
+"` = = = = = = - @ d v h $ C ' 5 # # # # ",\r
+"` = = 3 u h v v v m m m v ; c { 6 # # # ",\r
+"` = f v v m m m m m m Z G G 4 j ..t # # ",\r
+"` = v m m m Z Z D D G G G P n ; _ R 5 # ",\r
+"` = m Z G G G G G G G P Y x 4 _ Q g # # ",\r
+"` = $ $ $ $ $ & e P P E k 8  .U g # # # ",\r
+"..[ ......[ [ ] e Y ! s i o.L p # # # # ",\r
+"# # 5 6 6 6 9 ..i ( i z o.S t # # # # # ",\r
+"# # # # # # # } i i V O.A r # # # # # # ",\r
+"# # # # # # # } 7 J X.M 6 # # # # # # # ",\r
+"# # # # # # # | W ' b < # # # # # # # # ",\r
+"# # # # # # # @.~ g , # # # # # # # # # ",\r
+"# # # # # # # 6 < , # # # # # # # # # # "\r
+};\r