attempt to fix some mingw issues

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4341 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2013-05-07 19:38:36 +00:00
parent 61e1eee0e9
commit d4f3879a25
2 changed files with 128 additions and 84 deletions

View file

@ -36,6 +36,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include <process.h> #include <process.h>
#endif #endif
#include "fs.h"
#ifdef GLQUAKE #ifdef GLQUAKE
#define PRINTGLARRAYS #define PRINTGLARRAYS
#endif #endif
@ -1424,7 +1426,6 @@ char *Sys_ConsoleInput (void)
static int len; static int len;
INPUT_RECORD recs[1024]; INPUT_RECORD recs[1024];
// int count; // int count;
int i;
int ch; int ch;
DWORD numevents, numread, dummy=0; DWORD numevents, numread, dummy=0;
HANDLE th; HANDLE th;
@ -1492,6 +1493,7 @@ char *Sys_ConsoleInput (void)
if (th) { if (th) {
clipText = GlobalLock(th); clipText = GlobalLock(th);
if (clipText) { if (clipText) {
int i;
textCopied = BZ_Malloc(GlobalSize(th)+1); textCopied = BZ_Malloc(GlobalSize(th)+1);
strcpy(textCopied, clipText); strcpy(textCopied, clipText);
/* Substitutes a NULL for every token */strtok(textCopied, "\n\r\b"); /* Substitutes a NULL for every token */strtok(textCopied, "\n\r\b");
@ -1515,7 +1517,7 @@ char *Sys_ConsoleInput (void)
{ {
wchar_t wch = ch; wchar_t wch = ch;
WriteConsoleW(houtput, &wch, 1, &dummy, NULL); WriteConsoleW(houtput, &wch, 1, &dummy, NULL);
len += i; len += 1;
} }
break; break;
@ -1773,87 +1775,67 @@ HWND hwnd_dialog;
#include "ntverp.h" #include "ntverp.h"
#endif #endif
#if defined(__MINGW64_VERSION_MAJOR) && (__MINGW64_VERSION_MAJOR >= 3)
#define SHARD_APPIDINFOLINK SHARD_APPIDINFOLINK
#endif
#ifndef SHARD_APPIDINFOLINK
// SDK version 7600 = v7.0a & v7.1 // SDK version 7600 = v7.0a & v7.1
#if !defined(VER_PRODUCTBUILD) || VER_PRODUCTBUILD < 7600 typedef struct qSHARDAPPIDINFOLINK {
typedef struct SHARDAPPIDINFOLINK {
IShellLinkW *psl; IShellLinkW *psl;
PCWSTR pszAppID; PCWSTR pszAppID;
} SHARDAPPIDINFOLINK; } qSHARDAPPIDINFOLINK;
#endif
#define SHARD_APPIDINFOLINK 0x00000007 #define qSHARD_APPIDINFOLINK 0x00000007
#if !defined(VER_PRODUCTBUILD) || VER_PRODUCTBUILD < 7600
typedef struct { typedef struct {
GUID fmtid; GUID fmtid;
DWORD pid; DWORD pid;
} PROPERTYKEY; } qPROPERTYKEY;
#endif
typedef struct IPropertyStore IPropertyStore; typedef struct qIPropertyStore qIPropertyStore;
; struct qIPropertyStore
#ifndef MINGW
#if !defined(VER_PRODUCTBUILD) || VER_PRODUCTBUILD < 7600
typedef struct IPropertyStore
{ {
CONST_VTBL struct CONST_VTBL struct
{ {
/*IUnknown*/ /*IUnknown*/
HRESULT ( STDMETHODCALLTYPE *QueryInterface )( HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
IPropertyStore * This, qIPropertyStore * This,
REFIID riid, REFIID riid,
void **ppvObject); void **ppvObject);
ULONG ( STDMETHODCALLTYPE *AddRef )( ULONG ( STDMETHODCALLTYPE *AddRef )(
IPropertyStore * This); qIPropertyStore * This);
ULONG ( STDMETHODCALLTYPE *Release )( ULONG ( STDMETHODCALLTYPE *Release )(
IPropertyStore * This); qIPropertyStore * This);
/*property store stuff*/ /*property store stuff*/
HRESULT ( STDMETHODCALLTYPE *GetCount)( HRESULT ( STDMETHODCALLTYPE *GetCount)(
IPropertyStore * This, qIPropertyStore * This,
ULONG *count); ULONG *count);
HRESULT ( STDMETHODCALLTYPE *GetAt)( HRESULT ( STDMETHODCALLTYPE *GetAt)(
IPropertyStore * This, qIPropertyStore * This,
DWORD prop, DWORD prop,
PROPERTYKEY * key); qPROPERTYKEY * key);
HRESULT ( STDMETHODCALLTYPE *GetValue)( HRESULT ( STDMETHODCALLTYPE *GetValue)(
IPropertyStore * This, qIPropertyStore * This,
PROPERTYKEY * key, qPROPERTYKEY * key,
PROPVARIANT * val); PROPVARIANT * val);
HRESULT ( STDMETHODCALLTYPE *SetValue)( HRESULT ( STDMETHODCALLTYPE *SetValue)(
IPropertyStore * This, qIPropertyStore * This,
PROPERTYKEY * key, qPROPERTYKEY * key,
PROPVARIANT * val); PROPVARIANT * val);
HRESULT ( STDMETHODCALLTYPE *Commit)( HRESULT ( STDMETHODCALLTYPE *Commit)(
IPropertyStore * This); qIPropertyStore * This);
} *lpVtbl; } *lpVtbl;
} IPropertyStore; };
#endif
#endif
static const IID qIID_IPropertyStore = {0x886d8eeb, 0x8cf2, 0x4446, {0x8d, 0x02, 0xcd, 0xba, 0x1d, 0xbd, 0xcf, 0x99}}; static const IID qIID_IPropertyStore = {0x886d8eeb, 0x8cf2, 0x4446, {0x8d, 0x02, 0xcd, 0xba, 0x1d, 0xbd, 0xcf, 0x99}};
#ifndef MINGW #define qIObjectArray IUnknown
#if !defined(VER_PRODUCTBUILD) || VER_PRODUCTBUILD < 7600
#define IObjectArray IUnknown
#endif
#endif
static const IID qIID_IObjectArray = {0x92ca9dcd, 0x5622, 0x4bba, {0xa8,0x05,0x5e,0x9f,0x54,0x1b,0xd8,0xc9}}; static const IID qIID_IObjectArray = {0x92ca9dcd, 0x5622, 0x4bba, {0xa8,0x05,0x5e,0x9f,0x54,0x1b,0xd8,0xc9}};
#ifndef MINGW typedef struct qIObjectCollection
#if !defined(VER_PRODUCTBUILD) || VER_PRODUCTBUILD < 7600
typedef struct IObjectCollection
{ {
struct IObjectCollectionVtbl struct qIObjectCollectionVtbl
{ {
HRESULT ( __stdcall *QueryInterface )( HRESULT ( __stdcall *QueryInterface )(
/* [in] IShellLink*/ void *This, /* [in] IShellLink*/ void *This,
@ -1882,7 +1864,7 @@ typedef struct IObjectCollection
HRESULT ( __stdcall *AddFromArray )( HRESULT ( __stdcall *AddFromArray )(
/* [in] IShellLink*/ void *This, /* [in] IShellLink*/ void *This,
/* [in] */ IObjectArray *poaSource); /* [in] */ qIObjectArray *poaSource);
HRESULT ( __stdcall *RemoveObjectAt )( HRESULT ( __stdcall *RemoveObjectAt )(
/* [in] IShellLink*/ void *This, /* [in] IShellLink*/ void *This,
@ -1891,18 +1873,13 @@ typedef struct IObjectCollection
HRESULT ( __stdcall *Clear )( HRESULT ( __stdcall *Clear )(
/* [in] IShellLink*/ void *This); /* [in] IShellLink*/ void *This);
} *lpVtbl; } *lpVtbl;
} IObjectCollection; } qIObjectCollection;
#endif
#endif
static const IID qIID_IObjectCollection = {0x5632b1a4, 0xe38a, 0x400a, {0x92,0x8a,0xd4,0xcd,0x63,0x23,0x02,0x95}}; static const IID qIID_IObjectCollection = {0x5632b1a4, 0xe38a, 0x400a, {0x92,0x8a,0xd4,0xcd,0x63,0x23,0x02,0x95}};
static const CLSID qCLSID_EnumerableObjectCollection = {0x2d3468c1, 0x36a7, 0x43b6, {0xac,0x24,0xd3,0xf0,0x2f,0xd9,0x60,0x7a}}; static const CLSID qCLSID_EnumerableObjectCollection = {0x2d3468c1, 0x36a7, 0x43b6, {0xac,0x24,0xd3,0xf0,0x2f,0xd9,0x60,0x7a}};
typedef struct qICustomDestinationList
#ifndef MINGW
#if !defined(VER_PRODUCTBUILD) || VER_PRODUCTBUILD < 7600
typedef struct ICustomDestinationList
{ {
struct ICustomDestinationListVtbl struct qICustomDestinationListVtbl
{ {
HRESULT ( __stdcall *QueryInterface ) ( HRESULT ( __stdcall *QueryInterface ) (
/* [in] ICustomDestinationList*/ void *This, /* [in] ICustomDestinationList*/ void *This,
@ -1954,31 +1931,26 @@ typedef struct ICustomDestinationList
/* [in] ICustomDestinationList*/ void *This); /* [in] ICustomDestinationList*/ void *This);
} *lpVtbl; } *lpVtbl;
} ICustomDestinationList; } qICustomDestinationList;
#endif
#endif
static const IID qIID_ICustomDestinationList = {0x6332debf, 0x87b5, 0x4670, {0x90,0xc0,0x5e,0x57,0xb4,0x08,0xa4,0x9e}}; static const IID qIID_ICustomDestinationList = {0x6332debf, 0x87b5, 0x4670, {0x90,0xc0,0x5e,0x57,0xb4,0x08,0xa4,0x9e}};
static const CLSID qCLSID_DestinationList = {0x77f10cf0, 0x3db5, 0x4966, {0xb5,0x20,0xb7,0xc5,0x4f,0xd3,0x5e,0xd6}}; static const CLSID qCLSID_DestinationList = {0x77f10cf0, 0x3db5, 0x4966, {0xb5,0x20,0xb7,0xc5,0x4f,0xd3,0x5e,0xd6}};
static const IID qIID_IShellLinkW = {0x000214F9L, 0, 0, {0xc0,0,0,0,0,0,0,0x46}};
#endif
#if _MSC_VER > 1200
#define WIN7_APPNAME L"FTEQuake" #define WIN7_APPNAME L"FTEQuake"
static IShellLinkW *CreateShellLink(char *command, char *target, char *title, char *desc) static IShellLinkW *CreateShellLink(char *command, char *target, char *title, char *desc)
{ {
HRESULT hr; HRESULT hr;
IShellLinkW *link; IShellLinkW *link;
IPropertyStore *prop_store; qIPropertyStore *prop_store;
WCHAR buf[1024]; WCHAR buf[1024];
char tmp[1024], *s; char tmp[1024], *s;
// Get a pointer to the IShellLink interface. // Get a pointer to the IShellLink interface.
hr = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLinkW, &link); hr = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &qIID_IShellLinkW, (void**)&link);
if (FAILED(hr)) if (FAILED(hr))
return NULL; return NULL;
@ -1995,19 +1967,18 @@ static IShellLinkW *CreateShellLink(char *command, char *target, char *title, ch
else else
*s = tolower(*s); *s = tolower(*s);
} }
swprintf(buf, sizeof(buf), L"%S \"%S\" -basedir \"%S\"", command, target, tmp); _snwprintf(buf, sizeof(buf), L"%ls \"%ls\" -basedir \"%ls\"", command, target, tmp);
IShellLinkW_SetArguments(link, buf); /*args*/ IShellLinkW_SetArguments(link, buf); /*args*/
swprintf(buf, sizeof(buf), L"%S", desc); _snwprintf(buf, sizeof(buf), L"%ls", desc);
IShellLinkW_SetDescription(link, buf); /*tooltip*/ IShellLinkW_SetDescription(link, buf); /*tooltip*/
hr = IShellLinkW_QueryInterface(link, &qIID_IPropertyStore, &prop_store); hr = IShellLinkW_QueryInterface(link, &qIID_IPropertyStore, &prop_store);
#ifndef MINGW
if(SUCCEEDED(hr)) if(SUCCEEDED(hr))
{ {
PROPVARIANT pv; PROPVARIANT pv;
PROPERTYKEY PKEY_Title; qPROPERTYKEY PKEY_Title;
pv.vt=VT_LPSTR; pv.vt=VT_LPSTR;
pv.pszVal=title; /*item text*/ pv.pszVal=title; /*item text*/
CLSIDFromString(L"{F29F85E0-4FF9-1068-AB91-08002B27B3D9}", &(PKEY_Title.fmtid)); CLSIDFromString(L"{F29F85E0-4FF9-1068-AB91-08002B27B3D9}", &(PKEY_Title.fmtid));
@ -2016,14 +1987,13 @@ static IShellLinkW *CreateShellLink(char *command, char *target, char *title, ch
hr = prop_store->lpVtbl->Commit(prop_store); hr = prop_store->lpVtbl->Commit(prop_store);
prop_store->lpVtbl->Release(prop_store); prop_store->lpVtbl->Release(prop_store);
} }
#endif
return link; return link;
} }
void Sys_RecentServer(char *command, char *target, char *title, char *desc) void Sys_RecentServer(char *command, char *target, char *title, char *desc)
{ {
SHARDAPPIDINFOLINK appinfo; qSHARDAPPIDINFOLINK appinfo;
IShellLinkW *link; IShellLinkW *link;
link = CreateShellLink(command, target, title, desc); link = CreateShellLink(command, target, title, desc);
@ -2032,7 +2002,7 @@ void Sys_RecentServer(char *command, char *target, char *title, char *desc)
appinfo.pszAppID=WIN7_APPNAME; appinfo.pszAppID=WIN7_APPNAME;
appinfo.psl=link; appinfo.psl=link;
SHAddToRecentDocs(SHARD_APPIDINFOLINK, &appinfo); SHAddToRecentDocs(qSHARD_APPIDINFOLINK, &appinfo);
IShellLinkW_Release(link); IShellLinkW_Release(link);
} }
@ -2040,7 +2010,7 @@ void Sys_RecentServer(char *command, char *target, char *title, char *desc)
typedef struct { typedef struct {
LPCWSTR pcszFile; LPCWSTR pcszFile;
LPCWSTR pcszClass; LPCWSTR pcszClass;
enum qOPEN_AS_INFO_FLAGS oaifInFlags; int oaifInFlags;
} qOPENASINFO; } qOPENASINFO;
HRESULT (WINAPI *pSHOpenWithDialog)(HWND hwndParent, const qOPENASINFO *poainfo); HRESULT (WINAPI *pSHOpenWithDialog)(HWND hwndParent, const qOPENASINFO *poainfo);
@ -2063,18 +2033,18 @@ void Win7_Init(void)
void Win7_TaskListInit(void) void Win7_TaskListInit(void)
{ {
ICustomDestinationList *cdl; qICustomDestinationList *cdl;
IObjectCollection *col; qIObjectCollection *col;
IObjectArray *arr; qIObjectArray *arr;
IShellLinkW *link; IShellLinkW *link;
CoInitialize(NULL); CoInitialize(NULL);
if (SUCCEEDED(CoCreateInstance(&qCLSID_DestinationList, NULL, CLSCTX_INPROC_SERVER, &qIID_ICustomDestinationList, &cdl))) if (SUCCEEDED(CoCreateInstance(&qCLSID_DestinationList, NULL, CLSCTX_INPROC_SERVER, &qIID_ICustomDestinationList, (void**)&cdl)))
{ {
UINT minslots; UINT minslots;
IUnknown *removed; IUnknown *removed;
cdl->lpVtbl->BeginList(cdl, &minslots, &qIID_IObjectArray, &removed); cdl->lpVtbl->BeginList(cdl, &minslots, &qIID_IObjectArray, &removed);
if (SUCCEEDED(CoCreateInstance(&qCLSID_EnumerableObjectCollection, NULL, CLSCTX_INPROC_SERVER, &qIID_IObjectCollection, &col))) if (SUCCEEDED(CoCreateInstance(&qCLSID_EnumerableObjectCollection, NULL, CLSCTX_INPROC_SERVER, &qIID_IObjectCollection, (void**)&col)))
{ {
switch(M_GameType()) switch(M_GameType())
@ -2135,7 +2105,7 @@ void Win7_TaskListInit(void)
cdl->lpVtbl->Release(cdl); cdl->lpVtbl->Release(cdl);
} }
} }
#endif
#if defined(SVNREVISION) && !defined(MINIMAL) #if defined(SVNREVISION) && !defined(MINIMAL)
#define SVNREVISIONSTR STRINGIFY(SVNREVISION) #define SVNREVISIONSTR STRINGIFY(SVNREVISION)
@ -2289,7 +2259,6 @@ static void Update_CreatePath (char *path)
} }
} }
#include "fs.h"
void Update_Version_Updated(struct dl_download *dl) void Update_Version_Updated(struct dl_download *dl)
{ {
//happens in a thread, avoid va //happens in a thread, avoid va
@ -2609,14 +2578,14 @@ void VARGS Signal_Error_Handler(int i)
#endif #endif
*/ */
void Sys_RunFile(const char *fname, int nlen) qboolean Sys_RunFile(const char *fname, int nlen)
{ {
char buffer[MAX_OSPATH]; char buffer[MAX_OSPATH];
char *ext; char *ext;
if (nlen >= MAX_OSPATH) if (nlen >= MAX_OSPATH)
{ {
Con_Printf("Filename too long.\n"); Con_Printf("Filename too long.\n");
return; return true;
} }
memcpy(buffer, fname, nlen); memcpy(buffer, fname, nlen);
@ -2636,10 +2605,80 @@ void Sys_RunFile(const char *fname, int nlen)
} }
else if (!strcmp(ext, "qwd") || !strcmp(ext, "dem") || !strcmp(ext, "mvd")) else if (!strcmp(ext, "qwd") || !strcmp(ext, "dem") || !strcmp(ext, "mvd"))
Cbuf_AddText(va("playdemo \"#%s\"\n", fname), RESTRICT_LOCAL); Cbuf_AddText(va("playdemo \"#%s\"\n", fname), RESTRICT_LOCAL);
else if (!strcmp(ext, "pak") || !strcmp(ext, "pk3") || !strcmp(ext, "pk4"))
Con_Printf("Unable to install paks/pk3s at this time\n");
else if (!strcmp(ext, "bsp")) else if (!strcmp(ext, "bsp"))
Cbuf_AddText(va("map \"#%s\"\n", fname), RESTRICT_LOCAL); {
char qname[MAX_QPATH];
vfsfile_t *sf, *qf;
qboolean overwrite = false;
COM_StripExtension(COM_SkipPath(fname), qname, sizeof(qname));
sf = VFSOS_Open(fname, "rb");
qf = FS_OpenVFS(va("maps/%s.bsp", qname), "rb", FS_GAME);
if (qf)
{
if (VFS_GETLEN(sf) != VFS_GETLEN(qf))
overwrite = true;
VFS_SEEK(sf, 0);
VFS_CLOSE(qf);
}
if (overwrite)
{
switch(MessageBox(mainwindow, va("Overwrite existing map: %s?", qname), "Install And Play", MB_YESNOCANCEL))
{
case IDYES:
//overwrite it and load it up
overwrite = true;
break;
case IDNO:
//load up the old version
overwrite = false;
break;
default:
case IDCANCEL:
//quit or something
return false;
}
}
else if (!qf)
{
switch(MessageBox(mainwindow, va("Install new map: %s?", qname), "Install And Play", MB_OKCANCEL))
{
case IDOK:
//overwrite it and load it up
overwrite = true;
break;
default:
case IDCANCEL:
//quit or something
return false;
}
}
if (overwrite)
{
char buffer[8192];
int len;
qf = FS_OpenVFS(va("maps/%s.bsp", qname), "wb", FS_GAMEONLY);
if (qf)
{
while(1)
{
len = VFS_READ(sf, buffer, sizeof(buffer));
if (len <= 0)
break;
VFS_WRITE(qf, buffer, len);
}
VFS_CLOSE(qf);
}
}
VFS_CLOSE(sf);
Cbuf_AddText(va("map \"%s\"\n", qname), RESTRICT_LOCAL);
}
else else
Cbuf_AddText(va("qtvplay \"#%s\"\n", fname), RESTRICT_LOCAL); Cbuf_AddText(va("qtvplay \"#%s\"\n", fname), RESTRICT_LOCAL);
return true;
} }
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
@ -2786,7 +2825,7 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin
} }
*/ */
#ifdef CATCHCRASH #if defined(CATCHCRASH) && defined(MULTITHREAD)
if (COM_CheckParm("-watchdog")) if (COM_CheckParm("-watchdog"))
Sys_CreateThread("watchdog", watchdogthread, NULL, 0, 0); Sys_CreateThread("watchdog", watchdogthread, NULL, 0, 0);
#endif #endif
@ -2914,7 +2953,12 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin
if (qtvfile) if (qtvfile)
{ {
Sys_RunFile(qtvfile, strlen(qtvfile)); if (!Sys_RunFile(qtvfile, strlen(qtvfile)))
{
SetHookState(false);
Host_Shutdown ();
return TRUE;
}
} }
//client console should now be initialized. //client console should now be initialized.

View file

@ -62,7 +62,7 @@ qboolean LibZ_Init(void);
qboolean LibJPEG_Init(void); qboolean LibJPEG_Init(void);
qboolean LibPNG_Init(void); qboolean LibPNG_Init(void);
void Sys_RunFile(const char *fname, int nlen); qboolean Sys_RunFile(const char *fname, int nlen);
unsigned int Sys_Milliseconds (void); unsigned int Sys_Milliseconds (void);
double Sys_DoubleTime (void); double Sys_DoubleTime (void);