* Changed "true" to "TRUE" in some file: "true" doesn't exist in BC++ 5

* Added wxDataStream and wxProcess
* Added the asynchronous end process notification on GTK and MSW
* Updated configure* and setup.h
* Added extended.c: Apple code to encode/decode float in IEEE format
  this code is removable by disabling USE_APPLE_CODEC


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@162 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Guilhem Lavaux 1998-07-01 17:26:46 +00:00
parent 0423b68518
commit cf44735628
27 changed files with 1030 additions and 505 deletions

View File

@ -29,7 +29,7 @@
/// shall we be case sensitive in parsing variable names?
#ifndef APPCONF_CASE_SENSITIVE
#define APPCONF_CASE_SENSITIVE false
#define APPCONF_CASE_SENSITIVE FALSE
#endif
/// separates group and entry names
@ -44,7 +44,7 @@
/// should we use registry instead of configuration files under Win32?
#ifndef APPCONF_WIN32_NATIVE
#define APPCONF_WIN32_NATIVE true
#define APPCONF_WIN32_NATIVE TRUE
#endif
// ----------------------------------------------------------------------------
@ -124,13 +124,13 @@ public:
virtual bool Write(const char *szKey, const char *szValue) = 0;
virtual bool Write(const char *szKey, long lValue) = 0;
// permanently writes all changes
virtual bool Flush(bool bCurrentOnly = false) = 0;
virtual bool Flush(bool bCurrentOnly = FALSE) = 0;
// delete entries/groups
// deletes the specified entry and the group it belongs to if
// it was the last key in it and the second parameter is true
virtual bool DeleteEntry(const char *szKey,
bool bDeleteGroupIfEmpty = true) = 0;
bool bDeleteGroupIfEmpty = TRUE) = 0;
// delete the group (with all subgroups)
virtual bool DeleteGroup(const char *szKey) = 0;
// delete the whole underlying object (disk file, registry key, ...)

46
include/wx/datstrm.h Normal file
View File

@ -0,0 +1,46 @@
/////////////////////////////////////////////////////////////////////////////
// Name: datstrm.h
// Purpose: Data stream classes
// Author: Guilhem Lavaux
// Modified by:
// Created: 28/06/1998
// RCS-ID: $Id$
// Copyright: (c) Guilhem Lavaux
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#ifndef __DATSTREAMH__
#define __DATSTREAMH__
#ifdef __GNUG__
#pragma interface "datstrm.h"
#endif
#include "wx/wx.h"
class wxDataStream {
public:
wxDataStream(iostream& s);
wxDataStream(istream& s);
wxDataStream(ostream& s);
virtual ~wxDataStream();
unsigned long Read32();
unsigned short Read16();
unsigned char Read8();
double ReadDouble();
wxString ReadLine();
void Write32(unsigned long i);
void Write16(unsigned short i);
void Write8(unsigned char i);
void WriteDouble(double d);
void WriteLine(const wxString& line);
protected:
istream *m_istream;
ostream *m_ostream;
};
#endif
// __HELPBASEH__

View File

@ -179,7 +179,10 @@ enum wxEventType {
wxEVT_COMMAND_TAB_SEL_CHANGED,
wxEVT_COMMAND_TAB_SEL_CHANGING,
wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING
wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING,
/* System misc. */
wxEVT_END_PROCESS = wxEVT_FIRST + 300
};
// Compatibility

View File

@ -43,7 +43,7 @@ public:
virtual bool Read(long&, const char *, long = 0) const;
virtual bool Write(const char *szKey, const char *szValue);
virtual bool Write(const char *szKey, long Value);
virtual bool Flush(bool /* bCurrentOnly = FALSE */ ) { return true; }
virtual bool Flush(bool /* bCurrentOnly = FALSE */ ) { return TRUE; }
// delete
virtual bool DeleteEntry(const char *szKey, bool bGroupIfEmptyAlso);
@ -59,4 +59,4 @@ private:
wxString m_strPath;
};
#endif //_REGCONF_H
#endif //_REGCONF_H

View File

@ -111,7 +111,7 @@ public:
// get infomation about the key
// get the (full) key name. Abbreviate std root keys if bShortPrefix.
wxString GetName(bool bShortPrefix = true) const;
wxString GetName(bool bShortPrefix = TRUE) const;
// return true if the key exists
bool Exists() const;
// return true if the key is opened
@ -124,7 +124,7 @@ public:
// which need the key to be opened if the key is not opened yet)
bool Open();
// create the key: will fail if the key already exists and bOkIfExists
bool Create(bool bOkIfExists = true);
bool Create(bool bOkIfExists = TRUE);
// close the key (will be automatically done in dtor)
bool Close();

View File

@ -163,6 +163,11 @@
*
*/
#define USE_APPLE_IEEE 1
// if enabled, the float codec written by Apple
// will be used to write, in a portable way,
// float on the disk
/*
* Motif and XView
*

View File

@ -130,7 +130,7 @@ wxObject* WXDLLEXPORT_CTORFN wxConstructorFor##name(void) \
#ifdef USE_STORABLE_CLASSES
#define IMPLEMENT_STORABLE_CLASS(name, basename) \
wxObject* WXDLLEXPORT_CTORFN wxStorableConstructorFor##name( fstream* stream, char* data )\
wxObject* WXDLLEXPORT_CTORFN wxStorableConstructorFor##name( istream* stream, char* data )\
{ return new name( stream, data ); }\
wxObject* WXDLLEXPORT_CTORFN wxConstructorFor##name(void)\
{ return new name; }\
@ -138,7 +138,7 @@ wxObject* WXDLLEXPORT_CTORFN wxConstructorFor##name(void)\
wxStorableConstructorFor##name );
#define IMPLEMENT_STORABLE_CLASS2(name, basename1, basename2) \
wxObject* WXDLLEXPORT_CTORFN wxStorableConstructorFor##name( fstream* stream, char* data )\
wxObject* WXDLLEXPORT_CTORFN wxStorableConstructorFor##name( istream* stream, char* data )\
{ return new name( stream, data ); }\
wxObject* WXDLLEXPORT_CTORFN wxConstructorFor##name(void)\
{ return new name; }\

58
include/wx/process.h Normal file
View File

@ -0,0 +1,58 @@
/////////////////////////////////////////////////////////////////////////////
// Name: process.h
// Purpose: wxProcess class
// Author: Guilhem Lavaux
// Modified by:
// Created: 24/06/98
// RCS-ID: $Id$
// Copyright: (c) 1998 Guilhem Lavaux
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#ifndef __PROCESSH__
#define __PROCESSH__
#ifdef __GNUG__
#pragma interface
#endif
#include "wx/defs.h"
#include "wx/object.h"
#include "wx/event.h"
class WXDLLEXPORT wxProcess: public wxEvtHandler
{
DECLARE_DYNAMIC_CLASS(wxProcess)
public:
wxProcess(wxEvtHandler *parent = NULL, int id = -1);
virtual ~wxProcess();
virtual void OnTerminate(int pid);
protected:
int m_id;
};
// Process Event handling
class WXDLLEXPORT wxProcessEvent: public wxEvent
{
DECLARE_DYNAMIC_CLASS(wxProcessEvent)
public:
wxProcessEvent(int id = 0, int pid = -1);
inline int GetPid() { return m_pid; }
inline void SetPid(int pid) { m_pid = pid; }
public:
int m_pid;
};
typedef void (wxObject::*wxProcessEventFunction)(wxProcessEvent&);
#define EVT_END_PROCESS(id, func) { wxEVT_END_TERMINATE, id, -1, (wxObjectEvent) (wxEventFunction) (wxProcessEventFunction) & fn, NULL},
#endif
// __PROCESSH__

View File

@ -21,6 +21,7 @@
#include "wx/list.h"
#include "wx/window.h"
#include "wx/filefn.h"
#include "wx/process.h"
#if USE_IOSTREAMH
#include <iostream.h>
@ -96,8 +97,10 @@ int WXDLLEXPORT wxHexToDec(char *buf);
void WXDLLEXPORT wxDecToHex(int dec, char *buf);
// Execute another program. Returns 0 if there was an error, a PID otherwise.
long WXDLLEXPORT wxExecute(char **argv, bool Async = FALSE);
long WXDLLEXPORT wxExecute(const wxString& command, bool Async = FALSE);
long WXDLLEXPORT wxExecute(char **argv, bool Async = FALSE,
wxProcess *process = NULL);
long WXDLLEXPORT wxExecute(const wxString& command, bool Async = FALSE,
wxProcess *process = NULL);
#define wxSIGTERM 1

563
install/gtk/configure vendored

File diff suppressed because it is too large Load Diff

View File

@ -696,6 +696,7 @@ DEFAULT_USE_ZLIB=1
DEFAULT_USE_GDK_IMLIB=1
DEFAULT_USE_LIBPNG=1
DEFAULT_USE_APPLE_IEEE=1
DEFAULT_USE_STORABLE_CLASSES=1
DEFAULT_USE_AUTOTRANS=1
DEFAULT_USE_AFM_FOR_POSTSCRIPT=1
@ -764,31 +765,35 @@ dnl user options for libraries (no choice yet)
dnl ----------------------------------------------------------------
AC_OVERRIDES(zlib,zlib,
**--with-zlib use zlib (LZW comression),
**--with-zlib use zlib (LZW comression),
USE_ZLIB)
AC_OVERRIDES(gdk_imlib,gdk_imlib,
**--with-gdk_imlib use Raster's gdk_imlib (Image library),
**--with-gdk_imlib use Raster's gdk_imlib (Image library),
USE_GDK_IMLIB)
AC_OVERRIDES(libpng,libpng,
**--with-libpng use libpng (PNG image format),
**--with-libpng use libpng (PNG image format),
USE_LIBPNG)
AC_OVERRIDES(opengl,opengl,
**--with-opengl use opengl (OpenGL or Mesa),
**--with-opengl use opengl (OpenGL or Mesa),
USE_OPENGL)
dnl ----------------------------------------------------------------
dnl user options for code features (no choice yet)
dnl ----------------------------------------------------------------
AC_OVERRIDES(apple-ieee, apple-ieee,
**--with-apple-ieee use the Apple IEEE codec,
USE_APPLE_IEEE)
AC_OVERRIDES(storable,storable,
**--with-storable use storable classes,
**--with-storable use storable classes,
USE_STORABLE_CLASSES)
AC_OVERRIDES(autotrans,autotrans,
**--with-autotrans use gettext automatic translation,
**--with-autotrans use gettext automatic translation,
USE_AUTOTRANS)
AC_OVERRIDES(afmfonts,afmfonts,

View File

@ -55,6 +55,7 @@ LIB_CPP_SRC=\
common/time.cpp \
common/timercmn.cpp \
common/utilscmn.cpp \
common/datstrm.cpp \
\
gtk/app.cpp \
gtk/bitmap.cpp \
@ -118,6 +119,7 @@ LIB_CPP_SRC=\
generic/treectrl.cpp
LIB_C_SRC=\
common/extended.c \
\
gtk/win_gtk.c \
\

172
src/common/datstrm.cpp Normal file
View File

@ -0,0 +1,172 @@
/////////////////////////////////////////////////////////////////////////////
// Name: datstrm.cpp
// Purpose: Data stream classes
// Author: Guilhem Lavaux
// Modified by:
// Created: 28/06/98
// RCS-ID: $Id$
// Copyright: (c) Guilhem Lavaux
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "datstrm.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/defs.h"
#endif
#include "wx/datstrm.h"
wxDataStream::wxDataStream(istream& s)
{
m_istream = &s;
m_ostream = NULL;
}
wxDataStream::wxDataStream(ostream& s)
{
m_istream = NULL;
m_ostream = &s;
}
wxDataStream::wxDataStream(iostream& s)
{
m_istream = &s;
m_ostream = &s;
}
wxDataStream::~wxDataStream()
{
}
unsigned long wxDataStream::Read32()
{
char buf[4];
if (!m_istream)
return 0;
m_istream->read(buf, 4);
return (unsigned long)buf[0] |
((unsigned long)buf[1] << 8) |
((unsigned long)buf[2] << 16) |
((unsigned long)buf[3] << 24);
}
unsigned short wxDataStream::Read16()
{
char buf[2];
if (!m_istream)
return 0;
m_istream->read(buf, 2);
return (unsigned short)buf[0] |
((unsigned short)buf[1] << 8);
}
unsigned char wxDataStream::Read8()
{
char buf;
if (!m_istream)
return 0;
m_istream->read(&buf, 1);
return (unsigned char)buf;
}
double wxDataStream::ReadDouble()
{
extern "C" double ConvertFromIeeeExtended(const unsigned char *bytes);
#if USE_APPLE_IEEE
char buf[10];
if (!m_istream)
return 0.0;
m_istream->read(buf, 10);
return ConvertFromIeeeExtended((unsigned char *)buf);
#else
return 0.0;
#endif
}
wxString wxDataStream::ReadLine()
{
char i_strg[255];
if (!m_istream)
return "";
m_istream->getline(i_strg, 255);
return i_strg;
}
void wxDataStream::Write32(unsigned long i)
{
char buf[4];
if (!m_ostream)
return;
buf[0] = i & 0xff;
buf[1] = (i >> 8) & 0xff;
buf[2] = (i >> 16) & 0xff;
buf[3] = (i >> 24) & 0xff;
m_ostream->write(buf, 4);
}
void wxDataStream::Write16(unsigned short i)
{
char buf[2];
if (!m_ostream)
return;
buf[0] = i & 0xff;
buf[1] = (i >> 8) & 0xff;
m_ostream->write(buf, 2);
}
void wxDataStream::Write8(unsigned char i)
{
if (!m_ostream)
return;
m_ostream->write(&i, 1);
}
void wxDataStream::WriteLine(const wxString& line)
{
wxString tmp_string = line + '\n';
if (!m_ostream)
return;
m_ostream->write((const char *) tmp_string, tmp_string.Length());
}
void wxDataStream::WriteDouble(double d)
{
extern "C" void ConvertToIeeeExtended(double num, unsigned char *bytes)
char buf[10];
if (!m_ostream)
return;
ConvertToIeeeExtended(d, (unsigned char *)buf);
m_ostream->write(buf, 10);
}

179
src/common/extended.c Normal file
View File

@ -0,0 +1,179 @@
#include "wx/setup.h"
#include <math.h>
#if USE_APPLE_IEEE
/*
* C O N V E R T T O I E E E E X T E N D E D
*/
/* Copyright (C) 1988-1991 Apple Computer, Inc.
* All rights reserved.
*
* Machine-independent I/O routines for IEEE floating-point numbers.
*
* NaN's and infinities are converted to HUGE_VAL or HUGE, which
* happens to be infinity on IEEE machines. Unfortunately, it is
* impossible to preserve NaN's in a machine-independent way.
* Infinities are, however, preserved on IEEE machines.
*
* These routines have been tested on the following machines:
* Apple Macintosh, MPW 3.1 C compiler
* Apple Macintosh, THINK C compiler
* Silicon Graphics IRIS, MIPS compiler
* Cray X/MP and Y/MP
* Digital Equipment VAX
*
*
* Implemented by Malcolm Slaney and Ken Turkowski.
*
* Malcolm Slaney contributions during 1988-1990 include big- and little-
* endian file I/O, conversion to and from Motorola's extended 80-bit
* floating-point format, and conversions to and from IEEE single-
* precision floating-point format.
*
* In 1991, Ken Turkowski implemented the conversions to and from
* IEEE double-precision format, added more precision to the extended
* conversions, and accommodated conversions involving +/- infinity,
* NaN's, and denormalized numbers.
*/
#ifndef HUGE_VAL
#define HUGE_VAL HUGE
#endif /*HUGE_VAL*/
#define FloatToUnsigned(f) ((unsigned long) (((long) (f - 2147483648.0)) + 2147483647L) + 1)
void ConvertToIeeeExtended(double num, unsigned char *bytes)
{
int sign;
int expon;
double fMant, fsMant;
unsigned long hiMant, loMant;
if (num < 0) {
sign = 0x8000;
num *= -1;
} else {
sign = 0;
}
if (num == 0) {
expon = 0; hiMant = 0; loMant = 0;
}
else {
fMant = frexp(num, &expon);
if ((expon > 16384) || !(fMant < 1)) { /* Infinity or NaN */
expon = sign|0x7FFF; hiMant = 0; loMant = 0; /* infinity */
}
else { /* Finite */
expon += 16382;
if (expon < 0) { /* denormalized */
fMant = ldexp(fMant, expon);
expon = 0;
}
expon |= sign;
fMant = ldexp(fMant, 32);
fsMant = floor(fMant);
hiMant = FloatToUnsigned(fsMant);
fMant = ldexp(fMant - fsMant, 32);
fsMant = floor(fMant);
loMant = FloatToUnsigned(fsMant);
}
}
bytes[0] = expon >> 8;
bytes[1] = expon;
bytes[2] = hiMant >> 24;
bytes[3] = hiMant >> 16;
bytes[4] = hiMant >> 8;
bytes[5] = hiMant;
bytes[6] = loMant >> 24;
bytes[7] = loMant >> 16;
bytes[8] = loMant >> 8;
bytes[9] = loMant;
}
/*
* C O N V E R T F R O M I E E E E X T E N D E D
*/
/*
* Copyright (C) 1988-1991 Apple Computer, Inc.
* All rights reserved.
*
* Machine-independent I/O routines for IEEE floating-point numbers.
*
* NaN's and infinities are converted to HUGE_VAL or HUGE, which
* happens to be infinity on IEEE machines. Unfortunately, it is
* impossible to preserve NaN's in a machine-independent way.
* Infinities are, however, preserved on IEEE machines.
*
* These routines have been tested on the following machines:
* Apple Macintosh, MPW 3.1 C compiler
* Apple Macintosh, THINK C compiler
* Silicon Graphics IRIS, MIPS compiler
* Cray X/MP and Y/MP
* Digital Equipment VAX
*
*
* Implemented by Malcolm Slaney and Ken Turkowski.
*
* Malcolm Slaney contributions during 1988-1990 include big- and little-
* endian file I/O, conversion to and from Motorola's extended 80-bit
* floating-point format, and conversions to and from IEEE single-
* precision floating-point format.
*
* In 1991, Ken Turkowski implemented the conversions to and from
* IEEE double-precision format, added more precision to the extended
* conversions, and accommodated conversions involving +/- infinity,
* NaN's, and denormalized numbers.
*/
#ifndef HUGE_VAL
# define HUGE_VAL HUGE
#endif /*HUGE_VAL*/
# define UnsignedToFloat(u) (((double) ((long) (u - 2147483647L - 1))) + 2147483648.0)
/****************************************************************
* Extended precision IEEE floating-point conversion routine.
****************************************************************/
double ConvertFromIeeeExtended(const unsigned char *bytes)
{
double f;
int expon;
unsigned long hiMant, loMant;
expon = ((bytes[0] & 0x7F) << 8) | (bytes[1] & 0xFF);
hiMant = ((unsigned long)(bytes[2] & 0xFF) << 24)
| ((unsigned long) (bytes[3] & 0xFF) << 16)
| ((unsigned long) (bytes[4] & 0xFF) << 8)
| ((unsigned long) (bytes[5] & 0xFF));
loMant = ((unsigned long) (bytes[6] & 0xFF) << 24)
| ((unsigned long) (bytes[7] & 0xFF) << 16)
| ((unsigned long) (bytes[8] & 0xFF) << 8)
| ((unsigned long) (bytes[9] & 0xFF));
if (expon == 0 && hiMant == 0 && loMant == 0) {
f = 0;
}
else {
if (expon == 0x7FFF) { /* Infinity or NaN */
f = HUGE_VAL;
}
else {
expon -= 16383;
f = ldexp(UnsignedToFloat(hiMant), expon-=31);
f += ldexp(UnsignedToFloat(loMant), expon-=32);
}
}
if (bytes[0] & 0x80)
return -f;
else
return f;
}
#endif USE_APPLE_IEEE

View File

@ -333,12 +333,16 @@ IMPLEMENT_DYNAMIC_CLASS(wxInitDialogEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxSysColourChangedEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxIdleEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxUpdateUIEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxProcessEvent, wxEvent)
#include "wx/utils.h"
IMPLEMENT_DYNAMIC_CLASS(wxPathList, wxList)
IMPLEMENT_DYNAMIC_CLASS(wxRect, wxObject)
#include "wx/process.h"
IMPLEMENT_DYNAMIC_CLASS(wxProcess, wxEvtHandler)
#if USE_TIMEDATE
#include "wx/date.h"
IMPLEMENT_DYNAMIC_CLASS(wxDate, wxObject)

View File

@ -176,6 +176,10 @@
/*
* Use wxTree
*/
/*
* Use Apple Ieee-double converter
*/
#undef USE_APPLE_IEEE
/********************** DO NOT CHANGE BELOW THIS POINT **********************/

View File

@ -337,10 +337,46 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special )
// subprocess routines
//------------------------------------------------------------------------
long wxExecute( char **argv, bool Async )
typedef struct {
gint pid, tag;
wxProcess *process;
} wxEndProcessData;
static void GTK_EndProcessDetector(gpointer data, gint source,
GdkInputCondition condition)
{
wxEndProcessData *proc_data = (wxEndProcessData *)data;
int pid;
pid = (proc_data->pid > 0) ? proc_data->pid : -(proc_data->pid);
wait4(proc_data->pid, NULL, 0, NULL);
close(source);
gdk_input_remove(proc_data->tag);
if (proc_data->process)
proc_data->process->OnTerminate(proc_data->pid);
if (proc_data->pid > 0)
delete proc_data;
else
proc_data->pid = 0;
};
long wxExecute( char **argv, bool Async, wxProcess *process )
{
wxEndProcessData *data = new wxEndProcessData;
int end_proc_detect[2];
if (*argv == NULL)
return FALSE;
return 0;
/* Create pipes */
if (pipe(end_proc_detect) == -1) {
perror("pipe failed");
return 0;
}
/* fork the process */
#if defined(sun) || defined(__ultrix) || defined(__bsdi__)
@ -350,8 +386,11 @@ long wxExecute( char **argv, bool Async )
#endif
if (pid == -1) {
perror ("fork failed");
return FALSE;
return 0;
} else if (pid == 0) {
/* Close fd not useful */
close(end_proc_detect[0]); // close reading side
/* child */
#ifdef _AIX
execvp ((const char *)*argv, (const char **)argv);
@ -366,39 +405,26 @@ long wxExecute( char **argv, bool Async )
_exit (-1);
}
// Code below is NOT really acceptable!
// One should NEVER use wait under X
// Ideas? A Sleep idle callback?
// WARNING: WARNING: WARNING: WARNING:
// The CODE BELOW IS BAD BAD BAD BAD!
close(end_proc_detect[1]); // close writing side
data->tag = gdk_input_add(end_proc_detect[0], GDK_INPUT_READ,
GTK_EndProcessDetector, (gpointer)data);
data->pid = pid;
if (Async) {
int status;
/*
wxSleep(2); // Give a little time
*/
#if !defined(DG) && \
!defined(__AIX__) && \
!defined(__xlC__) && \
!defined(__SVR4__) && \
!defined(__SUN__) && \
!defined(__ALPHA__) && \
!defined(__SGI__) && \
!defined(__HPUX__) && \
!defined(__SUNPRO_CC) && \
!defined(__FreeBSD__)
while (wait((union wait*)&status) != pid)
#else
while (wait(&status) != pid)
#endif
{};
/*
wxSleep(3); // 3 sec?
*/
};
return TRUE;
data->process = process;
} else {
data->process = NULL;
data->pid = -(data->pid);
while (data->pid != 0)
wxYield();
delete data;
}
return pid;
};
long wxExecute( const wxString& command, bool Async )
long wxExecute( const wxString& command, bool Async, wxProcess *process )
{
if (command.IsNull() || command == "") return FALSE;
@ -412,6 +438,6 @@ long wxExecute( const wxString& command, bool Async )
argv[argc++] = strtok (tmp, IFS);
while ((argv[argc++] = strtok(NULL, IFS)) != NULL)
/* loop */ ;
return wxExecute(argv, Async);
return wxExecute(argv, Async, process);
};

View File

@ -333,12 +333,16 @@ IMPLEMENT_DYNAMIC_CLASS(wxInitDialogEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxSysColourChangedEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxIdleEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxUpdateUIEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxProcessEvent, wxEvent)
#include "wx/utils.h"
IMPLEMENT_DYNAMIC_CLASS(wxPathList, wxList)
IMPLEMENT_DYNAMIC_CLASS(wxRect, wxObject)
#include "wx/process.h"
IMPLEMENT_DYNAMIC_CLASS(wxProcess, wxEvtHandler)
#if USE_TIMEDATE
#include "wx/date.h"
IMPLEMENT_DYNAMIC_CLASS(wxDate, wxObject)

View File

@ -176,6 +176,10 @@
/*
* Use wxTree
*/
/*
* Use Apple Ieee-double converter
*/
#undef USE_APPLE_IEEE
/********************** DO NOT CHANGE BELOW THIS POINT **********************/

View File

@ -337,10 +337,46 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special )
// subprocess routines
//------------------------------------------------------------------------
long wxExecute( char **argv, bool Async )
typedef struct {
gint pid, tag;
wxProcess *process;
} wxEndProcessData;
static void GTK_EndProcessDetector(gpointer data, gint source,
GdkInputCondition condition)
{
wxEndProcessData *proc_data = (wxEndProcessData *)data;
int pid;
pid = (proc_data->pid > 0) ? proc_data->pid : -(proc_data->pid);
wait4(proc_data->pid, NULL, 0, NULL);
close(source);
gdk_input_remove(proc_data->tag);
if (proc_data->process)
proc_data->process->OnTerminate(proc_data->pid);
if (proc_data->pid > 0)
delete proc_data;
else
proc_data->pid = 0;
};
long wxExecute( char **argv, bool Async, wxProcess *process )
{
wxEndProcessData *data = new wxEndProcessData;
int end_proc_detect[2];
if (*argv == NULL)
return FALSE;
return 0;
/* Create pipes */
if (pipe(end_proc_detect) == -1) {
perror("pipe failed");
return 0;
}
/* fork the process */
#if defined(sun) || defined(__ultrix) || defined(__bsdi__)
@ -350,8 +386,11 @@ long wxExecute( char **argv, bool Async )
#endif
if (pid == -1) {
perror ("fork failed");
return FALSE;
return 0;
} else if (pid == 0) {
/* Close fd not useful */
close(end_proc_detect[0]); // close reading side
/* child */
#ifdef _AIX
execvp ((const char *)*argv, (const char **)argv);
@ -366,39 +405,26 @@ long wxExecute( char **argv, bool Async )
_exit (-1);
}
// Code below is NOT really acceptable!
// One should NEVER use wait under X
// Ideas? A Sleep idle callback?
// WARNING: WARNING: WARNING: WARNING:
// The CODE BELOW IS BAD BAD BAD BAD!
close(end_proc_detect[1]); // close writing side
data->tag = gdk_input_add(end_proc_detect[0], GDK_INPUT_READ,
GTK_EndProcessDetector, (gpointer)data);
data->pid = pid;
if (Async) {
int status;
/*
wxSleep(2); // Give a little time
*/
#if !defined(DG) && \
!defined(__AIX__) && \
!defined(__xlC__) && \
!defined(__SVR4__) && \
!defined(__SUN__) && \
!defined(__ALPHA__) && \
!defined(__SGI__) && \
!defined(__HPUX__) && \
!defined(__SUNPRO_CC) && \
!defined(__FreeBSD__)
while (wait((union wait*)&status) != pid)
#else
while (wait(&status) != pid)
#endif
{};
/*
wxSleep(3); // 3 sec?
*/
};
return TRUE;
data->process = process;
} else {
data->process = NULL;
data->pid = -(data->pid);
while (data->pid != 0)
wxYield();
delete data;
}
return pid;
};
long wxExecute( const wxString& command, bool Async )
long wxExecute( const wxString& command, bool Async, wxProcess *process )
{
if (command.IsNull() || command == "") return FALSE;
@ -412,6 +438,6 @@ long wxExecute( const wxString& command, bool Async )
argv[argc++] = strtok (tmp, IFS);
while ((argv[argc++] = strtok(NULL, IFS)) != NULL)
/* loop */ ;
return wxExecute(argv, Async);
return wxExecute(argv, Async, process);
};

View File

@ -104,7 +104,9 @@ COMMONOBJS = \
$(MSWDIR)\string.obj \
$(MSWDIR)\time.obj \
$(MSWDIR)\wxexpr.obj \
$(MSWDIR)\y_tab.obj
$(MSWDIR)\y_tab.obj \
$(MSWDIR)\datstrm.obj \
$(MSWDIR)\extended.obj
# $(MSWDIR)\matrix.obj \
@ -184,6 +186,7 @@ MSWOBJS = \
$(MSWDIR)\timer.obj \
$(MSWDIR)\treectrl.obj \
$(MSWDIR)\utils.obj \
$(MSWDIR)\utilsexc.obj \
$(MSWDIR)\wave.obj \
$(MSWDIR)\window.obj \
$(MSWDIR)\droptgt.obj \
@ -369,6 +372,8 @@ $(MSWDIR)\treectrl.obj: $(MSWDIR)\treectrl.$(SRCSUFF)
$(MSWDIR)\utils.obj: $(MSWDIR)\utils.$(SRCSUFF)
$(MSWDIR)\utilsexc.obj: $(MSWDIR)\utilsexc.$(SRCSUFF)
$(MSWDIR)\wave.obj: $(MSWDIR)\wave.$(SRCSUFF)
$(MSWDIR)\window.obj: $(MSWDIR)\window.$(SRCSUFF)
@ -456,6 +461,10 @@ $(MSWDIR)\matrix.obj: $(COMMDIR)\matrix.$(SRCSUFF)
$(MSWDIR)\time.obj: $(COMMDIR)\time.$(SRCSUFF)
$(MSWDIR)\datstrm.obj: $(COMMDIR)\datstrm.$(SRCSUFF)
$(MSWDIR)\extended.obj: $(COMMDIR)\extended.c
########################################################
# Generic objects (not always compiled, depending on
# whether platforms have native implementations)

View File

@ -104,7 +104,9 @@ COMMONOBJS = \
$(COMMDIR)\list.obj \
$(COMMDIR)\string.obj \
$(COMMDIR)\time.obj \
$(COMMDIR)\y_tab.obj
$(COMMDIR)\y_tab.obj \
$(COMMDIR)\datstrm.obj \
$(COMMDIR)\extended.obj
# Nested classes: won't comple
# $(COMMDIR)\fileconf.obj \
@ -806,6 +808,16 @@ $(COMMDIR)/time.obj: $*.$(SRCSUFF)
$(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF)
<<
$(COMMDIR)/datstrm.obj: $*.$(SRCSUFF)
cl @<<
$(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF)
<<
$(COMMDIR)/extended.obj: $*.c
cl @<<
$(CPPFLAGS) /Fo$@ /c /Tp $*.c
<<
$(COMMDIR)/y_tab.obj: $*.c $(COMMDIR)/lex_yy.c
cl @<<
$(CPPFLAGS2) -DUSE_DEFINE -DYY_USE_PROTOS /Fo$@ /I ..\common /c $*.c

View File

@ -109,7 +109,9 @@ COMMONOBJS = \
$(COMMDIR)/list.$(OBJSUFF) \
$(COMMDIR)/string.$(OBJSUFF) \
$(COMMDIR)/time.$(OBJSUFF) \
$(COMMDIR)/y_tab.$(OBJSUFF)
$(COMMDIR)/y_tab.$(OBJSUFF) \
$(COMMDIR)/datstrm.$(OBJSUFF) \
$(COMMDIR)/extended.$(OBJSUFF)
# $(COMMDIR)/wxstrgnu/wxstrgnu.$(OBJSUFF) \
# $(COMMDIR)/wxstrgnu/wxregex.$(OBJSUFF)
@ -189,6 +191,7 @@ MSWOBJS = \
timer.$(OBJSUFF) \
treectrl.$(OBJSUFF) \
utils.$(OBJSUFF) \
utilsexc.$(OBJSUFF) \
wave.$(OBJSUFF) \
window.$(OBJSUFF) \
$(OLEDIR)/droptgt.$(OBJSUFF) \

View File

@ -106,7 +106,9 @@ COMMONOBJS = \
$(COMMDIR)\string.obj \
$(COMMDIR)\time.obj \
$(COMMDIR)\wxexpr.obj \
$(COMMDIR)\y_tab.obj
$(COMMDIR)\y_tab.obj \
$(COMMDIR)\datstrm.obj \
$(COMMDIR)\extended.obj
# $(COMMDIR)\wxstrgnu\wxstrgnu.obj \
# $(COMMDIR)\wxstrgnu\wxregex.obj \
@ -189,6 +191,7 @@ MSWOBJS = \
$(MSWDIR)\timer.obj \
$(MSWDIR)\treectrl.obj \
$(MSWDIR)\utils.obj \
$(MSWDIR)\utilsexc.obj \
$(MSWDIR)\wave.obj \
$(MSWDIR)\window.obj \
$(OLEDIR)\droptgt.obj \
@ -646,6 +649,11 @@ $(MSWDIR)/utils.obj: $*.$(SRCSUFF)
$(CPPFLAGS) /c /Tp $*.$(SRCSUFF) /Fo$@
<<
$(MSWDIR)/utilsexc.obj: $*.$(SRCSUFF)
cl @<<
$(CPPFLAGS) /c /Tp $*.$(SRCSUFF) /Fo$@
<<
$(MSWDIR)/wave.obj: $*.$(SRCSUFF)
echo $(CPPFLAGS)
cl @<<
@ -879,6 +887,16 @@ $(COMMDIR)/time.obj: $*.$(SRCSUFF)
$(CPPFLAGS) /c /Tp $*.$(SRCSUFF) /Fo$@
<<
$(COMMDIR)\datstrm.obj: $*.$(SRCSUFF)
cl @<<
$(CPPFLAGS) /c /Tp $*.$(SRCSUFF) /Fo$@
<<
$(COMMDIR)/extended.obj: $*.c
cl @<<
$(CPPFLAGS) /c /Tp $*.c /Fo$@
<<
$(COMMDIR)/y_tab.obj: $*.c $(COMMDIR)/lex_yy.c
cl @<<
$(CPPFLAGS2) /c $*.c -DUSE_DEFINE -DYY_USE_PROTOS /Fo$@

View File

@ -189,7 +189,7 @@ bool wxRegConfig::Read(wxString& str,
{
PathChanger path(this, szKey);
bool bQueryGlobal = true;
bool bQueryGlobal = TRUE;
// if immutable key exists in global key we must check that it's not
// overriden by the local key with the same name
@ -200,30 +200,30 @@ bool wxRegConfig::Read(wxString& str,
path.Name().c_str());
}
return true;
return TRUE;
}
else {
// don't waste time - it's not there anyhow
bQueryGlobal = false;
bQueryGlobal = FALSE;
}
}
// first try local key
if ( TryGetValue(m_keyLocal, path.Name(), str) ||
(bQueryGlobal && TryGetValue(m_keyGlobal, path.Name(), str)) ) {
return true;
return TRUE;
}
// default value
str = szDefault;
return false;
return FALSE;
}
bool wxRegConfig::Read(long &lValue, const char *szKey, long lDefault) const
{
PathChanger path(this, szKey);
bool bQueryGlobal = true;
bool bQueryGlobal = TRUE;
// if immutable key exists in global key we must check that it's not
// overriden by the local key with the same name
@ -234,23 +234,23 @@ bool wxRegConfig::Read(long &lValue, const char *szKey, long lDefault) const
path.Name().c_str());
}
return true;
return TRUE;
}
else {
// don't waste time - it's not there anyhow
bQueryGlobal = false;
bQueryGlobal = FALSE;
}
}
// first try local key
if ( TryGetValue(m_keyLocal, path.Name(), &lValue) ||
(bQueryGlobal && TryGetValue(m_keyGlobal, path.Name(), &lValue)) ) {
return true;
return TRUE;
}
// default
lValue = lDefault;
return false;
return FALSE;
}
bool wxRegConfig::Write(const char *szKey, const char *szValue)
@ -259,7 +259,7 @@ bool wxRegConfig::Write(const char *szKey, const char *szValue)
if ( IsImmutable(path.Name()) ) {
wxLogError("Can't change immutable entry '%s'.", path.Name().c_str());
return false;
return FALSE;
}
return m_keyLocal.SetValue(path.Name(), szValue);
@ -271,7 +271,7 @@ bool wxRegConfig::Write(const char *szKey, long lValue)
if ( IsImmutable(path.Name()) ) {
wxLogError("Can't change immutable entry '%s'.", path.Name().c_str());
return false;
return FALSE;
}
return m_keyLocal.SetValue(path.Name(), lValue);
@ -285,7 +285,7 @@ bool wxRegConfig::DeleteEntry(const char *szValue, bool bGroupIfEmptyAlso)
PathChanger path(this, szValue);
if ( !m_keyLocal.DeleteValue(path.Name()) )
return false;
return FALSE;
if ( m_keyLocal.IsEmpty() ) {
wxString strKey = GetPath().Right(APPCONF_PATH_SEPARATOR);
@ -293,7 +293,7 @@ bool wxRegConfig::DeleteEntry(const char *szValue, bool bGroupIfEmptyAlso)
return m_keyLocal.DeleteKey(strKey);
}
return true;
return TRUE;
}
bool wxRegConfig::DeleteGroup(const char *szKey)
@ -306,7 +306,7 @@ bool wxRegConfig::DeleteGroup(const char *szKey)
bool wxRegConfig::DeleteAll()
{
// first of all, prevent the creation of new registry entries
Config::EnableAutosave(false);
Config::EnableAutosave(FALSE);
m_keyLocal.Close();
m_keyGlobal.Close();

View File

@ -100,7 +100,7 @@ aStdKeys[] =
// removes the trailing backslash from the string if it has one
static inline void RemoveTrailingSeparator(wxString& str);
// returns true if given registry key exists
// returns TRUE if given registry key exists
static bool KeyExists(HKEY hRootKey, const char *szKey);
// combines value and key name (uses static buffer!)
@ -274,11 +274,11 @@ void wxRegKey::SetHkey(HKEY hKey)
// info about the key
// ----------------------------------------------------------------------------
// returns true if the key exists
// returns TRUE if the key exists
bool wxRegKey::Exists() const
{
// opened key has to exist, try to open it if not done yet
return IsOpened() ? true : KeyExists(m_hRootKey, m_strKey);
return IsOpened() ? TRUE : KeyExists(m_hRootKey, m_strKey);
}
// returns the full name of the key (prefix is abbreviated if bShortPrefix)
@ -301,16 +301,16 @@ wxString wxRegKey::GetName(bool bShortPrefix) const
bool wxRegKey::Open()
{
if ( IsOpened() )
return true;
return TRUE;
m_dwLastError = RegOpenKey(m_hRootKey, m_strKey, &m_hKey);
if ( m_dwLastError != ERROR_SUCCESS ) {
wxLogSysError(m_dwLastError, "can't open registry key '%s'",
GetName().c_str());
return false;
return FALSE;
}
else
return true;
return TRUE;
}
// creates key, failing if it exists and !bOkIfExists
@ -318,20 +318,20 @@ bool wxRegKey::Create(bool bOkIfExists)
{
// check for existence only if asked (i.e. order is important!)
if ( !bOkIfExists && Exists() ) {
return false;
return FALSE;
}
if ( IsOpened() )
return true;
return TRUE;
m_dwLastError = RegCreateKey(m_hRootKey, m_strKey, &m_hKey);
if ( m_dwLastError != ERROR_SUCCESS ) {
wxLogSysError(m_dwLastError, "can't create registry key '%s'",
GetName().c_str());
return false;
return FALSE;
}
else
return true;
return TRUE;
}
// close the key, it's not an error to call it when not opened
@ -344,14 +344,14 @@ bool wxRegKey::Close()
GetName().c_str());
m_hKey = 0;
return false;
return FALSE;
}
else {
m_hKey = 0;
}
}
return true;
return TRUE;
}
// ----------------------------------------------------------------------------
@ -402,7 +402,7 @@ bool wxRegKey::DeleteSelf()
bool wxRegKey::DeleteKey(const char *szKey)
{
if ( !Open() )
return false;
return FALSE;
wxRegKey key(*this, szKey);
return key.DeleteSelf();
@ -411,14 +411,14 @@ bool wxRegKey::DeleteKey(const char *szKey)
bool wxRegKey::DeleteValue(const char *szValue)
{
if ( !Open() )
return false;
return FALSE;
#ifdef __WIN32__
m_dwLastError = RegDeleteValue(m_hKey, szValue);
if ( m_dwLastError != ERROR_SUCCESS ) {
wxLogSysError(m_dwLastError, "can't delete value '%s' from key '%s'",
szValue, GetName().c_str());
return false;
return FALSE;
}
#else //WIN16
// named registry values don't exist in Win16 world
@ -429,18 +429,18 @@ bool wxRegKey::DeleteValue(const char *szValue)
if ( m_dwLastError != ERROR_SUCCESS ) {
wxLogSysError(m_dwLastError, "can't delete value of key '%s'",
GetName().c_str());
return false;
return FALSE;
}
#endif //WIN16/32
return true;
return TRUE;
}
// ----------------------------------------------------------------------------
// access to values and subkeys
// ----------------------------------------------------------------------------
// return true if value exists
// return TRUE if value exists
bool wxRegKey::HasValue(const char *szValue) const
{
#ifdef __WIN32__
@ -449,14 +449,14 @@ bool wxRegKey::HasValue(const char *szValue) const
NULL, NULL, NULL) == ERROR_SUCCESS;
}
else
return false;
return FALSE;
#else // WIN16
// only unnamed value exists
return IsEmpty(szValue);
#endif // WIN16/32
}
// returns true if this key has any subkeys
// returns TRUE if this key has any subkeys
bool wxRegKey::HasSubkeys() const
{
// just call GetFirstKey with dummy parameters
@ -465,13 +465,13 @@ bool wxRegKey::HasSubkeys() const
return CONST_CAST GetFirstKey(str, l);
}
// returns true if given subkey exists
// returns TRUE if given subkey exists
bool wxRegKey::HasSubKey(const char *szKey) const
{
if ( CONST_CAST Open() )
return KeyExists(m_hKey, szKey);
else
return false;
return FALSE;
}
wxRegKey::ValueType wxRegKey::GetValueType(const char *szValue)
@ -502,12 +502,12 @@ bool wxRegKey::SetValue(const char *szValue, long lValue)
m_dwLastError = RegSetValueEx(m_hKey, szValue, RESERVED, REG_DWORD,
(RegString)&lValue, sizeof(lValue));
if ( m_dwLastError == ERROR_SUCCESS )
return true;
return TRUE;
}
wxLogSysError(m_dwLastError, "can't set value of '%s'",
GetFullName(this, szValue));
return false;
return FALSE;
}
bool wxRegKey::QueryValue(const char *szValue, long *plValue) const
@ -520,18 +520,18 @@ bool wxRegKey::QueryValue(const char *szValue, long *plValue) const
if ( m_dwLastError != ERROR_SUCCESS ) {
wxLogSysError(m_dwLastError, "can't read value of key '%s'",
GetName().c_str());
return false;
return FALSE;
}
else {
// check that we read the value of right type
wxASSERT_MSG( dwType == REG_DWORD,
"Type mismatch in wxRegKey::QueryValue()." );
return true;
return TRUE;
}
}
else
return false;
return FALSE;
}
#endif //Win32
@ -553,7 +553,7 @@ bool wxRegKey::QueryValue(const char *szValue, wxString& strValue) const
wxASSERT_MSG( dwType == REG_SZ,
"Type mismatch in wxRegKey::QueryValue()." );
return true;
return TRUE;
}
}
#else //WIN16
@ -562,13 +562,13 @@ bool wxRegKey::QueryValue(const char *szValue, wxString& strValue) const
m_dwLastError = RegQueryValue(m_hKey, 0, strValue.GetWriteBuf(256), &l);
if ( m_dwLastError == ERROR_SUCCESS )
return true;
return TRUE;
#endif //WIN16/32
}
wxLogSysError(m_dwLastError, "can't read value of '%s'",
GetFullName(this, szValue));
return false;
return FALSE;
}
bool wxRegKey::SetValue(const char *szValue, const wxString& strValue)
@ -579,20 +579,20 @@ bool wxRegKey::SetValue(const char *szValue, const wxString& strValue)
(RegString)strValue.c_str(),
strValue.Len() + 1);
if ( m_dwLastError == ERROR_SUCCESS )
return true;
return TRUE;
#else //WIN16
// named registry values don't exist in Win16
wxASSERT( IsEmpty(szValue) );
m_dwLastError = RegSetValue(m_hKey, NULL, REG_SZ, strValue, NULL);
if ( m_dwLastError == ERROR_SUCCESS )
return true;
return TRUE;
#endif //WIN16/32
}
wxLogSysError(m_dwLastError, "can't set value of '%s'",
GetFullName(this, szValue));
return false;
return FALSE;
}
wxRegKey::operator wxString() const
@ -611,7 +611,7 @@ wxRegKey::operator wxString() const
bool wxRegKey::GetFirstValue(wxString& strValueName, long& lIndex)
{
if ( !Open() )
return false;
return FALSE;
lIndex = 0;
return GetNextValue(strValueName, lIndex);
@ -623,7 +623,7 @@ bool wxRegKey::GetNextValue(wxString& strValueName, long& lIndex) const
// are we already at the end of enumeration?
if ( lIndex == -1 )
return false;
return FALSE;
#ifdef __WIN32__
char szValueName[1024]; // @@ use RegQueryInfoKey...
@ -647,7 +647,7 @@ bool wxRegKey::GetNextValue(wxString& strValueName, long& lIndex) const
GetName().c_str());
}
return false;
return FALSE;
}
strValueName = szValueName;
@ -659,13 +659,13 @@ bool wxRegKey::GetNextValue(wxString& strValueName, long& lIndex) const
strValueName.Empty();
#endif
return true;
return TRUE;
}
bool wxRegKey::GetFirstKey(wxString& strKeyName, long& lIndex)
{
if ( !Open() )
return false;
return FALSE;
lIndex = 0;
return GetNextKey(strKeyName, lIndex);
@ -677,7 +677,7 @@ bool wxRegKey::GetNextKey(wxString& strKeyName, long& lIndex) const
// are we already at the end of enumeration?
if ( lIndex == -1 )
return false;
return FALSE;
char szKeyName[_MAX_PATH + 1];
m_dwLastError = RegEnumKey(m_hKey, lIndex++, szKeyName, WXSIZEOF(szKeyName));
@ -692,11 +692,11 @@ bool wxRegKey::GetNextKey(wxString& strKeyName, long& lIndex) const
GetName().c_str());
}
return false;
return FALSE;
}
strKeyName = szKeyName;
return true;
return TRUE;
}
// ============================================================================
@ -707,10 +707,10 @@ bool KeyExists(HKEY hRootKey, const char *szKey)
HKEY hkeyDummy;
if ( RegOpenKey(hRootKey, szKey, &hkeyDummy) == ERROR_SUCCESS ) {
RegCloseKey(hkeyDummy);
return true;
return TRUE;
}
else
return false;
return FALSE;
}
const char *GetFullName(const wxRegKey *pKey, const char *szValue)

View File

@ -207,97 +207,6 @@ bool wxGetUserName(char *buf, int maxSize)
#endif
}
// Execute a command (e.g. another program) in a
// system-independent manner.
long wxExecute(char **argv, bool sync)
{
if (*argv == NULL)
return 0;
char command[1024];
command[0] = '\0';
int argc;
for (argc = 0; argv[argc]; argc++)
{
if (argc)
strcat(command, " ");
strcat(command, argv[argc]);
}
return wxExecute((char *)command, sync);
}
long wxExecute(const wxString& command, bool sync)
{
if (command == "")
return 0;
#ifdef __WIN32__
char * cl;
char * argp;
int clen;
HINSTANCE result;
DWORD dresult;
// copy the command line
clen = command.Length();
if (!clen) return -1;
cl = (char *) calloc( 1, 256);
if (!cl) return -1;
strcpy( cl, WXSTRINGCAST command);
// isolate command and arguments
argp = strchr( cl, ' ');
if (argp)
*argp++ = '\0';
// execute the command
#ifdef __GNUWIN32__
result = ShellExecute( (HWND) (wxTheApp->GetTopWindow() ? (HWND) wxTheApp->GetTopWindow()->GetHWND() : NULL),
(const wchar_t) "open", (const wchar_t) cl, (const wchar_t) argp, (const wchar_t) NULL, SW_SHOWNORMAL);
#else
result = ShellExecute( (HWND) (wxTheApp->GetTopWindow() ? wxTheApp->GetTopWindow()->GetHWND() : NULL),
"open", cl, argp, NULL, SW_SHOWNORMAL);
#endif
if (((long)result) <= 32) {
free(cl);
return 0;
}
if (!sync)
{
free(cl);
return dresult;
}
// waiting until command executed
do {
wxYield();
dresult = GetModuleFileName( result, cl, 256);
} while( dresult);
/* long lastError = GetLastError(); */
free(cl);
return 0;
#else
long instanceID = WinExec((LPCSTR) WXSTRINGCAST command, SW_SHOW);
if (instanceID < 32) return(0);
if (sync) {
int running;
do {
wxYield();
running = GetModuleUsage((HANDLE)instanceID);
} while (running);
}
return(instanceID);
#endif
}
int wxKill(long pid, int sig)
{
return 0;