261 lines
8.0 KiB
C++
Executable File
261 lines
8.0 KiB
C++
Executable File
//-----------------------------------------------------------------------------
|
|
// Torque Game Engine
|
|
// Copyright (C) GarageGames.com, Inc.
|
|
//
|
|
// Initial revision: 12/13/01 Paul G. Allen, Random Logic Consulting
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
#include "math/mPoint.h"
|
|
#include "platformX86UNIX/platformX86UNIX.h"
|
|
#include "platformX86UNIX/platformGL.h"
|
|
|
|
#ifndef DEDICATED
|
|
#include <X11/Xlib.h> // for Display, Window and other X mojo
|
|
#else
|
|
#define Display int
|
|
#define Window int
|
|
#define Screen int
|
|
#endif
|
|
|
|
#include <libgen.h> // for basename
|
|
|
|
typedef void (*LockFunc_t)(void);
|
|
|
|
class DisplayPtrManager;
|
|
|
|
class x86UNIXPlatformState
|
|
{
|
|
friend class DisplayPtrManager;
|
|
|
|
private:
|
|
Point2I mDesktopSize;
|
|
Point2I mWindowSize;
|
|
S32 mDesktopBpp;
|
|
Display *mDisplay;
|
|
Window mCurrentWindow;
|
|
Screen *mScreenPointer;
|
|
int mScreenNumber;
|
|
char mWindowName[40];
|
|
char mExePathName[4096];
|
|
char mExeName[40];
|
|
bool mWindowCreated;
|
|
bool mWindowActive;
|
|
bool mWindowLocked;
|
|
bool mXWindowsRunning;
|
|
bool mDedicated;
|
|
bool mCDAudioEnabled;
|
|
bool mDSleep;
|
|
bool mUseRedirect;
|
|
|
|
// Access to the display* needs to be controlled because the SDL event
|
|
// loop runs in a separate thread. If you need the display pointer,
|
|
// use the DisplayPtrManager class. See the clipboard functions in
|
|
// x86unixinput.cc for an example.
|
|
Display *getDisplayPointer() { return mDisplay; }
|
|
|
|
public:
|
|
U32 currentTime;
|
|
|
|
void setDisplayPointer( Display *displayPointer )
|
|
{ mDisplay = displayPointer; }
|
|
|
|
void setScreenNumber( int newNumber ) { mScreenNumber = newNumber; }
|
|
int getScreenNumber() { return mScreenNumber; }
|
|
|
|
void setScreenPointer( Screen *newScreenPointer )
|
|
{ mScreenPointer = newScreenPointer; }
|
|
Screen * getScreenPointer() { return mScreenPointer; }
|
|
|
|
// for compatibility, convert 24 bpp to 32
|
|
void setDesktopBpp( S32 bpp )
|
|
{
|
|
if (bpp == 24)
|
|
mDesktopBpp = 32;
|
|
else
|
|
mDesktopBpp = bpp;
|
|
}
|
|
S32 getDesktopBpp() { return mDesktopBpp; }
|
|
|
|
void setDesktopSize( S32 horizontal, S32 vertical )
|
|
{ mDesktopSize.set( horizontal, vertical ); }
|
|
Point2I getDesktopSize() { return mDesktopSize; }
|
|
|
|
void setWindow( Window newWindow ) { mCurrentWindow = newWindow; }
|
|
Window getWindow() { return mCurrentWindow; }
|
|
|
|
void setWindowSize (S32 horizontal, S32 vertical )
|
|
{ mWindowSize.set ( horizontal, vertical ); }
|
|
void setWindowSize( Point2I size ) { mWindowSize = size; }
|
|
Point2I& getWindowSize() { return ( mWindowSize ); }
|
|
|
|
void setWindowName (const char * windowName)
|
|
{
|
|
if (windowName == NULL)
|
|
dStrncpy( mWindowName, "", sizeof( mWindowName ));
|
|
else
|
|
dStrncpy( mWindowName, windowName, sizeof( mWindowName ) );
|
|
}
|
|
const char * getWindowName() { return mWindowName; }
|
|
|
|
void setExePathName(const char* exePathName)
|
|
{
|
|
if (exePathName == NULL)
|
|
dStrncpy(mExePathName, "", sizeof(mExePathName));
|
|
else
|
|
dStrncpy(mExePathName, exePathName, sizeof(mExePathName));
|
|
|
|
// set the base exe name field
|
|
char tempBuf[2048];
|
|
dStrncpy(tempBuf, mExePathName, 2048);
|
|
dStrncpy(mExeName, basename(tempBuf), sizeof(mExeName));
|
|
}
|
|
const char * getExePathName() { return mExePathName; }
|
|
const char * getExeName() { return mExeName; }
|
|
|
|
bool windowCreated() { return mWindowCreated; }
|
|
bool windowActive() { return mWindowActive; }
|
|
bool windowLocked() { return mWindowLocked; }
|
|
void setWindowCreated(bool windowCreated)
|
|
{ mWindowCreated = windowCreated; }
|
|
void setWindowActive(bool windowActive)
|
|
{ mWindowActive = windowActive; }
|
|
void setWindowLocked(bool windowLocked)
|
|
{ mWindowLocked = windowLocked; }
|
|
|
|
bool isXWindowsRunning() { return mXWindowsRunning; }
|
|
void setXWindowsRunning(bool running) { mXWindowsRunning = running; }
|
|
|
|
bool isDedicated() { return mDedicated; }
|
|
void setDedicated(bool dedicated) { mDedicated = dedicated; }
|
|
|
|
bool getCDAudioEnabled() { return mCDAudioEnabled; }
|
|
void setCDAudioEnabled(bool enabled) { mCDAudioEnabled = enabled; }
|
|
|
|
bool getDSleep() { return mDSleep; }
|
|
void setDSleep(bool enabled) { mDSleep = enabled; }
|
|
|
|
bool getUseRedirect() { return mUseRedirect; }
|
|
void setUseRedirect(bool enabled) { mUseRedirect = enabled; }
|
|
|
|
x86UNIXPlatformState()
|
|
{
|
|
currentTime = 0;
|
|
mDesktopBpp = 16;
|
|
mDesktopSize.set( 0, 0 );
|
|
mWindowSize.set( 800, 600 );
|
|
setWindowName("Torque");
|
|
setExePathName(NULL);
|
|
mWindowCreated = mWindowActive = mWindowLocked = false;
|
|
mXWindowsRunning = false;
|
|
mDedicated = false;
|
|
mCDAudioEnabled = false;
|
|
mDSleep = false;
|
|
#ifdef USE_FILE_REDIRECT
|
|
mUseRedirect = true;
|
|
#else
|
|
mUseRedirect = false;
|
|
#endif
|
|
}
|
|
};
|
|
|
|
extern x86UNIXPlatformState * x86UNIXState;
|
|
|
|
class DisplayPtrManager
|
|
{
|
|
// static interface
|
|
private:
|
|
static bool sgDisplayLocked;
|
|
static LockFunc_t sgLockFunc;
|
|
static LockFunc_t sgUnlockFunc;
|
|
|
|
static bool lockDisplay()
|
|
{
|
|
if (!sgDisplayLocked && sgLockFunc)
|
|
{
|
|
sgLockFunc();
|
|
sgDisplayLocked = true;
|
|
return true;
|
|
}
|
|
else
|
|
return false;
|
|
}
|
|
static void unlockDisplay()
|
|
{
|
|
if (sgDisplayLocked && sgUnlockFunc)
|
|
{
|
|
sgUnlockFunc();
|
|
sgDisplayLocked = false;
|
|
}
|
|
}
|
|
|
|
//friend Display* x86UNIXPlatformState::getDisplayPointer();
|
|
|
|
public:
|
|
static void setDisplayLockFunction(LockFunc_t lockFunc)
|
|
{ sgLockFunc = lockFunc; }
|
|
static void setDisplayUnlockFunction(LockFunc_t unlockFunc)
|
|
{ sgUnlockFunc = unlockFunc; }
|
|
|
|
// nonstatic interface
|
|
private:
|
|
bool mAcquiredLock; // true if this instance acquired the display lock
|
|
// (multiple instances of DisplayPtrManager can coexist, but only
|
|
// the first to access the display pointer will be responsible for
|
|
// acquiring and releasing the lock)
|
|
bool mOpenedDisplay; // true if this instance created a display pointer
|
|
// because the one in platform state was null.
|
|
Display* mDisplay;
|
|
|
|
private:
|
|
Display* openDisplay()
|
|
{
|
|
#ifndef DEDICATED
|
|
mDisplay = XOpenDisplay(NULL);
|
|
if (mDisplay != NULL)
|
|
mOpenedDisplay = true;
|
|
#endif
|
|
return mDisplay;
|
|
}
|
|
|
|
void closeDisplay()
|
|
{
|
|
if (mOpenedDisplay)
|
|
{
|
|
#ifndef DEDICATED
|
|
XCloseDisplay(mDisplay);
|
|
mDisplay = NULL;
|
|
mOpenedDisplay = false;
|
|
#endif
|
|
}
|
|
}
|
|
public:
|
|
DisplayPtrManager()
|
|
{
|
|
mAcquiredLock = false;
|
|
mOpenedDisplay = false;
|
|
mDisplay = NULL;
|
|
}
|
|
|
|
~DisplayPtrManager()
|
|
{
|
|
if (mAcquiredLock)
|
|
{
|
|
DisplayPtrManager::unlockDisplay();
|
|
mAcquiredLock = false;
|
|
}
|
|
closeDisplay();
|
|
}
|
|
|
|
Display* getDisplayPointer()
|
|
{
|
|
Display* display = x86UNIXState->getDisplayPointer();
|
|
if (display == NULL)
|
|
return openDisplay();
|
|
|
|
mAcquiredLock = DisplayPtrManager::lockDisplay();
|
|
return display;
|
|
}
|
|
};
|