📄 utils.cpp
字号:
/////////////////////////////////////////////////////////////////////////////
// Name: src/mac/carbon/utils.cpp
// Purpose: Various utilities
// Author: Stefan Csomor
// Modified by:
// Created: 1998-01-01
// RCS-ID: $Id: utils.cpp,v 1.120 2006/06/14 19:50:56 ABX Exp $
// Copyright: (c) Stefan Csomor
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#include "wx/wxprec.h"
#include "wx/utils.h"
#ifndef WX_PRECOMP
#include "wx/intl.h"
#include "wx/app.h"
#if wxUSE_GUI
#include "wx/toplevel.h"
#include "wx/font.h"
#endif
#endif
#include "wx/apptrait.h"
#if wxUSE_GUI
#include "wx/mac/uma.h"
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "MoreFilesX.h"
#ifndef __DARWIN__
#include <Threads.h>
#include <Sound.h>
#endif
#if wxUSE_GUI
#if TARGET_API_MAC_OSX
#include <CoreServices/CoreServices.h>
#else
#include <DriverServices.h>
#include <Multiprocessing.h>
#endif
#ifdef __DARWIN__
#include <Carbon/Carbon.h>
#else
#include <ATSUnicode.h>
#include <TextCommon.h>
#include <TextEncodingConverter.h>
#endif
#endif // wxUSE_GUI
#include "wx/mac/private.h"
#if defined(__MWERKS__) && wxUSE_UNICODE
#if __MWERKS__ < 0x4100 || !defined(__DARWIN__)
#include <wtime.h>
#endif
#endif
// ---------------------------------------------------------------------------
// code used in both base and GUI compilation
// ---------------------------------------------------------------------------
// our OS version is the same in non GUI and GUI cases
static int DoGetOSVersion(int *majorVsn, int *minorVsn)
{
long theSystem;
// are there x-platform conventions ?
Gestalt(gestaltSystemVersion, &theSystem);
if (minorVsn != NULL)
*minorVsn = (theSystem & 0xFF);
if (majorVsn != NULL)
*majorVsn = (theSystem >> 8);
#ifdef __DARWIN__
return wxMAC_DARWIN;
#else
return wxMAC;
#endif
}
#if wxUSE_BASE
// ----------------------------------------------------------------------------
// debugging support
// ----------------------------------------------------------------------------
#if defined(__WXDEBUG__) && defined(__WXMAC__) && !defined(__DARWIN__) && defined(__MWERKS__) && (__MWERKS__ >= 0x2400)
// MetroNub stuff doesn't seem to work in CodeWarrior 5.3 Carbon builds...
#ifndef __MetroNubUtils__
#include "MetroNubUtils.h"
#endif
#ifndef __GESTALT__
#include <Gestalt.h>
#endif
#if TARGET_API_MAC_CARBON
#include <CodeFragments.h>
extern "C" long CallUniversalProc(UniversalProcPtr theProcPtr, ProcInfoType procInfo, ...);
ProcPtr gCallUniversalProc_Proc = NULL;
#endif
static MetroNubUserEntryBlock* gMetroNubEntry = NULL;
static long fRunOnce = false;
Boolean IsMetroNubInstalled()
{
if (!fRunOnce)
{
long result, value;
fRunOnce = true;
gMetroNubEntry = NULL;
if (Gestalt(gestaltSystemVersion, &value) == noErr && value < 0x1000)
{
// look for MetroNub's Gestalt selector
if (Gestalt(kMetroNubUserSignature, &result) == noErr)
{
#if TARGET_API_MAC_CARBON
if (gCallUniversalProc_Proc == NULL)
{
CFragConnectionID connectionID;
Ptr mainAddress;
Str255 errorString;
ProcPtr symbolAddress;
OSErr err;
CFragSymbolClass symbolClass;
symbolAddress = NULL;
err = GetSharedLibrary("\pInterfaceLib", kPowerPCCFragArch, kFindCFrag,
&connectionID, &mainAddress, errorString);
if (err != noErr)
{
gCallUniversalProc_Proc = NULL;
goto end;
}
err = FindSymbol(connectionID, "\pCallUniversalProc",
(Ptr *) &gCallUniversalProc_Proc, &symbolClass);
if (err != noErr)
{
gCallUniversalProc_Proc = NULL;
goto end;
}
}
#endif
{
MetroNubUserEntryBlock* block = (MetroNubUserEntryBlock *)result;
// make sure the version of the API is compatible
if (block->apiLowVersion <= kMetroNubUserAPIVersion &&
kMetroNubUserAPIVersion <= block->apiHiVersion)
{
// success!
gMetroNubEntry = block;
}
}
}
}
}
end:
#if TARGET_API_MAC_CARBON
return (gMetroNubEntry != NULL && gCallUniversalProc_Proc != NULL);
#else
return (gMetroNubEntry != NULL);
#endif
}
Boolean IsMWDebuggerRunning()
{
if (IsMetroNubInstalled())
return CallIsDebuggerRunningProc(gMetroNubEntry->isDebuggerRunning);
return false;
}
Boolean AmIBeingMWDebugged()
{
if (IsMetroNubInstalled())
return CallAmIBeingDebuggedProc(gMetroNubEntry->amIBeingDebugged);
return false;
}
extern bool WXDLLEXPORT wxIsDebuggerRunning()
{
return IsMWDebuggerRunning() && AmIBeingMWDebugged();
}
#else
extern bool WXDLLEXPORT wxIsDebuggerRunning()
{
return false;
}
#endif // defined(__WXMAC__) && !defined(__DARWIN__) && (__MWERKS__ >= 0x2400)
#ifndef __DARWIN__
// defined in unix/utilsunx.cpp for Mac OS X
// get full hostname (with domain name if possible)
bool wxGetFullHostName(wxChar *buf, int maxSize)
{
return wxGetHostName(buf, maxSize);
}
// Get user ID e.g. jacs
bool wxGetUserId(wxChar *buf, int maxSize)
{
return wxGetUserName( buf , maxSize );
}
const wxChar* wxGetHomeDir(wxString *pstr)
{
*pstr = wxMacFindFolder( (short) kOnSystemDisk, kPreferencesFolderType, kDontCreateFolder );
return pstr->c_str();
}
// Get hostname only (without domain name)
bool wxGetHostName(wxChar *buf, int maxSize)
{
// Gets Chooser name of user by examining a System resource.
buf[0] = 0;
const short kComputerNameID = -16413;
short oldResFile = CurResFile();
UseResFile(0);
StringHandle chooserName = (StringHandle)::GetString(kComputerNameID);
UseResFile(oldResFile);
if (chooserName && *chooserName)
{
HLock( (Handle) chooserName );
wxString name = wxMacMakeStringFromPascal( *chooserName );
HUnlock( (Handle) chooserName );
ReleaseResource( (Handle) chooserName );
wxStrncpy( buf , name , maxSize - 1 );
}
return true;
}
// Get user name e.g. Stefan Csomor
bool wxGetUserName(wxChar *buf, int maxSize)
{
// Gets Chooser name of user by examining a System resource.
buf[0] = 0;
const short kChooserNameID = -16096;
short oldResFile = CurResFile();
UseResFile(0);
StringHandle chooserName = (StringHandle)::GetString(kChooserNameID);
UseResFile(oldResFile);
if (chooserName && *chooserName)
{
HLock( (Handle) chooserName );
wxString name = wxMacMakeStringFromPascal( *chooserName );
HUnlock( (Handle) chooserName );
ReleaseResource( (Handle) chooserName );
wxStrncpy( buf , name , maxSize - 1 );
}
return true;
}
int wxKill(long pid, wxSignal sig , wxKillError *rc, int flags)
{
// TODO
return 0;
}
WXDLLEXPORT bool wxGetEnv(const wxString& var, wxString *value)
{
// TODO : under classic there is no environement support, under X yes
return false;
}
// set the env var name to the given value, return true on success
WXDLLEXPORT bool wxSetEnv(const wxString& var, const wxChar *value)
{
// TODO : under classic there is no environement support, under X yes
return false;
}
// Execute a program in an Interactive Shell
bool wxShell(const wxString& command)
{
// TODO
return false;
}
// Shutdown or reboot the PC
bool wxShutdown(wxShutdownFlags wFlags)
{
// TODO
return false;
}
// Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX)
wxMemorySize wxGetFreeMemory()
{
return (wxMemorySize)FreeMem();
}
#ifndef __DARWIN__
void wxMicroSleep(unsigned long microseconds)
{
AbsoluteTime wakeup = AddDurationToAbsolute( microseconds * durationMicrosecond , UpTime());
MPDelayUntil( & wakeup);
}
void wxMilliSleep(unsigned long milliseconds)
{
AbsoluteTime wakeup = AddDurationToAbsolute( milliseconds, UpTime());
MPDelayUntil( & wakeup);
}
void wxSleep(int nSecs)
{
wxMilliSleep(1000*nSecs);
}
#endif
// Consume all events until no more left
void wxFlushEvents()
{
}
#endif // !__DARWIN__
// Emit a beeeeeep
void wxBell()
{
SysBeep(30);
}
wxToolkitInfo& wxConsoleAppTraits::GetToolkitInfo()
{
static wxToolkitInfo info;
info.os = DoGetOSVersion(&info.versionMajor, &info.versionMinor);
info.name = _T("wxBase");
return info;
}
#endif // wxUSE_BASE
#if wxUSE_GUI
wxToolkitInfo& wxGUIAppTraits::GetToolkitInfo()
{
static wxToolkitInfo info;
info.os = DoGetOSVersion(&info.versionMajor, &info.versionMinor);
info.shortName = _T("mac");
info.name = _T("wxMac");
#ifdef __WXUNIVERSAL__
info.shortName << _T("univ");
info.name << _T("/wxUniversal");
#endif
return info;
}
// Reading and writing resources (eg WIN.INI, .Xdefaults)
#if wxUSE_RESOURCES
bool wxWriteResource(const wxString& section, const wxString& entry, const wxString& value, const wxString& file)
{
// TODO
return false;
}
bool wxWriteResource(const wxString& section, const wxString& entry, float value, const wxString& file)
{
wxString buf;
buf.Printf(wxT("%.4f"), value);
return wxWriteResource(section, entry, buf, file);
}
bool wxWriteResource(const wxString& section, const wxString& entry, long value, const wxString& file)
{
wxString buf;
buf.Printf(wxT("%ld"), value);
return wxWriteResource(section, entry, buf, file);
}
bool wxWriteResource(const wxString& section, const wxString& entry, int value, const wxString& file)
{
wxString buf;
buf.Printf(wxT("%d"), value);
return wxWriteResource(section, entry, buf, file);
}
bool wxGetResource(const wxString& section, const wxString& entry, char **value, const wxString& file)
{
// TODO
return false;
}
bool wxGetResource(const wxString& section, const wxString& entry, float *value, const wxString& file)
{
char *s = NULL;
bool succ = wxGetResource(section, entry, (char **)&s, file);
if (succ)
{
*value = (float)strtod(s, NULL);
delete[] s;
}
return succ;
}
bool wxGetResource(const wxString& section, const wxString& entry, long *value, const wxString& file)
{
char *s = NULL;
bool succ = wxGetResource(section, entry, (char **)&s, file);
if (succ)
{
*value = strtol(s, NULL, 10);
delete[] s;
}
return succ;
}
bool wxGetResource(const wxString& section, const wxString& entry, int *value, const wxString& file)
{
char *s = NULL;
bool succ = wxGetResource(section, entry, (char **)&s, file);
if (succ)
{
*value = (int)strtol(s, NULL, 10);
delete[] s;
}
return succ;
}
#endif // wxUSE_RESOURCES
int gs_wxBusyCursorCount = 0;
extern wxCursor gMacCurrentCursor;
wxCursor gMacStoredActiveCursor;
// Set the cursor to the busy cursor for all windows
void wxBeginBusyCursor(const wxCursor *cursor)
{
if (gs_wxBusyCursorCount++ == 0)
{
gMacStoredActiveCursor = gMacCurrentCursor;
cursor->MacInstall();
}
//else: nothing to do, already set
}
// Restore cursor to normal
void wxEndBusyCursor()
{
wxCHECK_RET( gs_wxBusyCursorCount > 0,
wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") );
if (--gs_wxBusyCursorCount == 0)
{
gMacStoredActiveCursor.MacInstall();
gMacStoredActiveCursor = wxNullCursor;
}
}
// true if we're between the above two calls
bool wxIsBusy()
{
return (gs_wxBusyCursorCount > 0);
}
#endif // wxUSE_GUI
#if wxUSE_BASE
wxString wxMacFindFolderNoSeparator( short vol,
OSType folderType,
Boolean createFolder)
{
FSRef fsRef;
wxString strDir;
if ( FSFindFolder( vol, folderType, createFolder, &fsRef) == noErr)
{
strDir = wxMacFSRefToPath( &fsRef );
}
return strDir;
}
wxString wxMacFindFolder( short vol,
OSType folderType,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -