Native message box on MacOSX; platform-specific separation of box drivers

git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@3252 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
avolkov
2009-10-25 22:21:08 +00:00
parent 9ef9d69622
commit 90945cf8df
9 changed files with 205 additions and 46 deletions
+1
View File
@@ -1,4 +1,5 @@
Changes towards version 0.7: Changes towards version 0.7:
- Added a native error box for MacOSX (like we have for Windows) - Alex
- Fix for weird colors problem on MacOSX w/ SDL 1.2.14; also improves - Fix for weird colors problem on MacOSX w/ SDL 1.2.14; also improves
overall compatibility on all platforms - Alex overall compatibility on all platforms - Alex
- Unix build system cleanups, fix detection of SDL, libmikmod, pthread - SvdB - Unix build system cleanups, fix detection of SDL, libmikmod, pthread - SvdB
+12
View File
@@ -1 +1,13 @@
uqm_CFILES="uqmlog.c" uqm_CFILES="uqmlog.c"
case "$HOST_SYSTEM" in
Darwin)
uqm_MFILES="msgbox_macosx.m"
;;
MINGW32*|CYGWIN*)
uqm_CFILES="$uqm_CFILES msgbox_win.c"
;;
*)
uqm_CFILES="$uqm_CFILES msgbox_stub.c"
;;
esac
+24
View File
@@ -0,0 +1,24 @@
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef UQM_LOGINTERNAL_H_INCL__
#define UQM_LOGINTERNAL_H_INCL__
#include <stdio.h>
extern FILE *streamOut;
#endif /* UQM_LOGINTERNAL_H_INCL__ */
+23
View File
@@ -0,0 +1,23 @@
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef UQM_MSGBOX_H_INCL__
#define UQM_MSGBOX_H_INCL__
extern void log_displayBox (const /*UTF-8*/char *title, int isError,
const /*UTF-8*/char *msg);
#endif /* UQM_MSGBOX_H_INCL__ */
+37
View File
@@ -0,0 +1,37 @@
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#import <Cocoa/Cocoa.h>
#import "msgbox.h"
void
log_displayBox (const /*UTF-8*/char *title, int isError,
const /*UTF-8*/char *msg)
{
NSString *titleStr = [NSString stringWithUTF8String:title];
NSString *msgStr = [NSString stringWithUTF8String:msg];
if (!titleStr || !msgStr)
return; // Oops, out of memory?
if (isError)
NSRunCriticalAlertPanel (titleStr, msgStr, nil, nil, nil);
else
NSRunInformationalAlertPanel (titleStr, msgStr, nil, nil, nil);
// titleStr and msgStr are autoreleased
}
+34
View File
@@ -0,0 +1,34 @@
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "msgbox.h"
#include "loginternal.h"
void
log_displayBox (const /*UTF-8*/char *title, int isError,
const /*UTF-8*/char *msg)
{
// We do not know how to display a box. Perhaps it's done with a
// hefty dose of pixie dust, or perhaps with a hammer and nails.
// So just inform the user of our predicament
fprintf (streamOut, "Do not know how to display %s box\n",
isError ? "an error" : "a");
// Suppress the compiler warnings in any case.
(void)title;
(void)msg;
}
+67
View File
@@ -0,0 +1,67 @@
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "msgbox.h"
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdlib.h>
#include <malloc.h>
// Converts a UTF-8 string to Windows WideChar.
// Caller is responsible for free()ing the returned string.
static LPWSTR
toWideChar (const /*UTF-8*/char *str)
{
int cch;
LPWSTR wstr;
cch = MultiByteToWideChar (CP_UTF8, 0, str, -1, NULL, 0);
if (cch == 0)
return NULL; // failed, probably no UTF8 converter
wstr = malloc (cch * sizeof (WCHAR));
if (!wstr)
return NULL; // out of memory
cch = MultiByteToWideChar (CP_UTF8, 0, str, -1, wstr, cch);
if (cch == 0)
{ // Failed. It should not fail here if it succeeded just above,
// but it did. Not much can be done about it.
free (wstr);
return NULL;
}
return wstr;
}
void
log_displayBox (const /*UTF-8*/char *title, int isError,
const /*UTF-8*/char *msg)
{
LPWSTR swTitle = toWideChar (title);
LPWSTR swMsg = toWideChar (msg);
UINT uType = isError ? MB_ICONWARNING : MB_ICONINFORMATION;
if (swTitle && swMsg)
MessageBoxW (NULL, swMsg, swTitle, uType);
else // Could not convert; let's try ASCII, though it may look ugly
MessageBoxA (NULL, msg, title, uType);
free (swTitle);
free (swMsg);
}
+4 -42
View File
@@ -15,6 +15,8 @@
*/ */
#include "uqmlog.h" #include "uqmlog.h"
#include "loginternal.h"
#include "msgbox.h"
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include <stdarg.h> #include <stdarg.h>
@@ -48,14 +50,13 @@ static volatile bool noThreadReady = false;
static bool showBox = true; static bool showBox = true;
static bool errorBox = true; static bool errorBox = true;
static FILE *streamOut; FILE *streamOut;
static volatile int qlock = 0; static volatile int qlock = 0;
static Mutex qmutex; static Mutex qmutex;
static void exitCallback (void); static void exitCallback (void);
static void displayLog (bool isError); static void displayLog (bool isError);
static void displayBox (const char *title, bool isError, const char *msg);
static void static void
lockQueue (void) lockQueue (void)
@@ -324,45 +325,6 @@ displayLog (bool isError)
*p = '\0'; *p = '\0';
displayBox ("The Ur-Quan Masters", isError, msgBuf); log_displayBox ("The Ur-Quan Masters", isError, msgBuf);
} }
#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)
extern int __stdcall MessageBoxA (void *hWnd, const char* lpText,
const char* lpCaption, uint32 uType);
#define MB_ICONEXCLAMATION 0x00000030L
#define MB_ICONASTERISK 0x00000040L
static void
displayBox (const char *title, bool isError, const char *msg)
{
MessageBoxA (0, msg, title,
isError ? MB_ICONEXCLAMATION : MB_ICONASTERISK);
}
#elif defined(__APPLE__)
static void
displayBox (const char *title, bool isError, const char *msg)
{
(void) title;
(void) isError;
(void) msg;
// do something here
}
#else
static void
displayBox (const char *title, bool isError, const char *msg)
{
(void) title;
(void) isError;
(void) msg;
// do nothing here
}
#endif /* OS disjunction */
+3 -4
View File
@@ -14,8 +14,8 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
#ifndef _UQMLOG_H #ifndef UQMLOG_H_INCL__
#define _UQMLOG_H #define UQMLOG_H_INCL__
#include "port.h" #include "port.h"
#include "types.h" #include "types.h"
@@ -56,5 +56,4 @@ extern void log_add_nothreadV (log_Level, const char *fmt, va_list)
VPRINTF_FUNCTION(2); VPRINTF_FUNCTION(2);
#endif /* _UQMLOG_H */ #endif /* UQMLOG_H_INCL__ */