Added linux implementations of Open and Close
~g2k
This commit is contained in:
135
src/window.cpp
135
src/window.cpp
@@ -50,10 +50,30 @@ void OpenArena::Window::Close()
|
|||||||
instance=NULL;
|
instance=NULL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
#ifdef __linux
|
||||||
|
if(hRC)
|
||||||
|
{
|
||||||
|
if(!glXMakeCurrent(display, None, NULL))
|
||||||
|
{
|
||||||
|
printf("Could not release drawing context.\n");
|
||||||
|
}
|
||||||
|
glXDestroyContext(display, hRC);
|
||||||
|
hRC = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(fullscreen)
|
||||||
|
{
|
||||||
|
XF86VidModeSwitchToMode(display, screen, &vidMode);
|
||||||
|
XF86VidModeSetViewPort(display, screen, 0, 0);
|
||||||
|
}
|
||||||
|
XCloseDisplay(display);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}//End OpenArena::Window::Close()
|
||||||
|
|
||||||
bool OpenArena::Window::Open()
|
bool OpenArena::Window::Open()
|
||||||
{
|
{
|
||||||
|
#ifdef WIN32
|
||||||
unsigned int PixelFormat;
|
unsigned int PixelFormat;
|
||||||
WNDCLASS wc;
|
WNDCLASS wc;
|
||||||
DWORD dwExStyle;
|
DWORD dwExStyle;
|
||||||
@@ -178,6 +198,103 @@ bool OpenArena::Window::Open()
|
|||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
#endif
|
||||||
|
#ifdef __linux
|
||||||
|
XVisualInfo* vi;
|
||||||
|
Colormap cmap;
|
||||||
|
int bestMode = 0;
|
||||||
|
int vidModeMajorVersion;
|
||||||
|
int vidModeMinorVersion;
|
||||||
|
int glxMajorVersion;
|
||||||
|
int glxMinorVersion;
|
||||||
|
int modeNum;
|
||||||
|
XF86VidModeModeInfo** modes;
|
||||||
|
Atom wmDelete;
|
||||||
|
::Window winDummy;
|
||||||
|
unsigned int borderDummy;
|
||||||
|
|
||||||
|
display = XOpenDisplay(0);
|
||||||
|
screen = DefaultScreen(display);
|
||||||
|
XF86VidModeQueryVersion(display, &vidModeMajorVersion, &vidModeMinorVersion);
|
||||||
|
printf("XF86VidModeExtension-Version %d.%d\n", vidModeMajorVersion, vidModeMinorVersion);
|
||||||
|
|
||||||
|
XF86VidModeGetAllModeLines(display, screen, &modeNum, &modes);
|
||||||
|
vidMode = *modes[0];
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for(i=0; i<modeNum; i++)
|
||||||
|
{
|
||||||
|
//Add a check for colordepth here
|
||||||
|
if((modes[i]->hdisplay == width) && (modes[i]->vdisplay == height))
|
||||||
|
{
|
||||||
|
bestMode = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vi = glXChooseVisual(display, screen, attrListDbl);
|
||||||
|
if(vi == NULL)
|
||||||
|
{
|
||||||
|
vi = glXChooseVisual(display, screen, attrListSgl);
|
||||||
|
doubleBuffered = false;
|
||||||
|
printf("Only Singlebuffered Visual!\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
doubleBuffered = true;
|
||||||
|
printf("Got Doublebuffered Visual!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
glXQueryVersion(display, &glxMajorVersion, & glxMinorVersion);
|
||||||
|
printf("glX-Version %d.%d\n", glxMajorVersion, glxMinorVersion);
|
||||||
|
|
||||||
|
hRC = glXCreateContext(display, vi, 0, GL_TRUE);
|
||||||
|
cmap = XCreateColormap(display, RootWindow(display, vi->screen), vi->visual, AllocNone);
|
||||||
|
attributes.colormap = cmap;
|
||||||
|
attributes.border_pixel = 0;
|
||||||
|
|
||||||
|
if(fullscreen)
|
||||||
|
{
|
||||||
|
XF86VidModeSwitchToMode(display, screen, modes[bestMode]);
|
||||||
|
XF86VidModeSetViewPort(display, screen, 0, 0);
|
||||||
|
XFree(modes);
|
||||||
|
|
||||||
|
attributes.override_redirect = true;
|
||||||
|
attributes.event_mask = ExposureMask | KeyPressMask | ButtonPressMask | StructureNotifyMask;
|
||||||
|
window = XCreateWindow(display, RootWindow(display, vi->screen), 0, 0, width, height, 0, vi->depth, InputOutput, vi->visual, CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect, &attributes);
|
||||||
|
XWarpPointer(display, None, window, 0, 0, 0, 0, 0, 0);
|
||||||
|
XMapRaised(display, window);
|
||||||
|
XGrabKeyboard(display, window, true, GrabModeAsync, GrabModeAsync, CurrentTime);
|
||||||
|
XGrabPointer(display, window, true, ButtonPressMask, GrabModeAsync, GrabModeAsync, window, None, CurrentTime);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
attributes.event_mask = ExposureMask | KeyPressMask | ButtonPressMask | StructureNotifyMask;
|
||||||
|
window = XCreateWindow(display, RootWindow(display, vi->screen), 0, 0, width, height, 0, vi->depth, InputOutput, vi->visual, CWBorderPixel | CWColormap | CWEventMask, &attributes);
|
||||||
|
wmDelete = XInternAtom(display, "WM_DELETE_WINDOW", true);
|
||||||
|
XSetWMProtocols(display, window, &wmDelete, 1);
|
||||||
|
XSetStandardProperties(display, window, name.c_str(), name.c_str(), None, NULL, 0, NULL);
|
||||||
|
XMapRaised(display, window);
|
||||||
|
}
|
||||||
|
|
||||||
|
glXMakeCurrent(display, window, hRC);
|
||||||
|
unsigned int twidth, theight, depth;
|
||||||
|
XGetGeometry(display, window, &winDummy, &x, &y, &twidth, &theight, &borderDummy, &depth);
|
||||||
|
bpp = (char)depth;
|
||||||
|
height = (short)twidth;
|
||||||
|
width = (short)theight;
|
||||||
|
printf("Depth %d\n", bpp);
|
||||||
|
if(glXIsDirect(display, hRC))
|
||||||
|
{
|
||||||
|
printf("Congrats, you have Direct Rendering!\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("Sorry, no Direct Rendering possible!\n");
|
||||||
|
}
|
||||||
|
OnInit();
|
||||||
|
return true;
|
||||||
|
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OpenArena::Window::Open(string title, int width, int height, int bits, bool fullscreenflag)
|
bool OpenArena::Window::Open(string title, int width, int height, int bits, bool fullscreenflag)
|
||||||
@@ -228,6 +345,7 @@ int OpenArena::DefaultInit()
|
|||||||
|
|
||||||
void OpenArena::DefaultResize(GLsizei width, GLsizei height)
|
void OpenArena::DefaultResize(GLsizei width, GLsizei height)
|
||||||
{
|
{
|
||||||
|
#ifdef WIN32
|
||||||
if (height==0)
|
if (height==0)
|
||||||
height=1;
|
height=1;
|
||||||
|
|
||||||
@@ -239,4 +357,19 @@ void OpenArena::DefaultResize(GLsizei width, GLsizei height)
|
|||||||
|
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
|
#endif
|
||||||
|
#ifdef __linux
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OpenArena::Window::Resize(GLsizei width, GLsizei height)
|
||||||
|
{
|
||||||
|
OnResize(width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __linux
|
||||||
|
Display* OpenArena::Window::GetDisplay()
|
||||||
|
{
|
||||||
|
return display;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user