about summary refs log tree commit diff
path: root/src/engine/external/glfw/lib/x11/x11_init.c
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2007-08-22 07:52:33 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2007-08-22 07:52:33 +0000
commit8b3c16e6152a527f9aec1a88a9eed74119de7000 (patch)
treef0bde5cea15e696e42cade06a3b12ff6b13acc57 /src/engine/external/glfw/lib/x11/x11_init.c
parent9899666a7ce6679a3b9667ab09f615f4d0769c16 (diff)
downloadzcatch-8b3c16e6152a527f9aec1a88a9eed74119de7000.tar.gz
zcatch-8b3c16e6152a527f9aec1a88a9eed74119de7000.zip
major engine cleanup. dependency on baselib removed. engine is now C code (not ansi tho). some other cruft removed aswell
Diffstat (limited to 'src/engine/external/glfw/lib/x11/x11_init.c')
-rw-r--r--src/engine/external/glfw/lib/x11/x11_init.c275
1 files changed, 275 insertions, 0 deletions
diff --git a/src/engine/external/glfw/lib/x11/x11_init.c b/src/engine/external/glfw/lib/x11/x11_init.c
new file mode 100644
index 00000000..9e406156
--- /dev/null
+++ b/src/engine/external/glfw/lib/x11/x11_init.c
@@ -0,0 +1,275 @@
+//========================================================================

+// GLFW - An OpenGL framework

+// File:        x11_init.c

+// Platform:    X11 (Unix)

+// API version: 2.6

+// WWW:         http://glfw.sourceforge.net

+//------------------------------------------------------------------------

+// Copyright (c) 2002-2006 Camilla Berglund

+//

+// This software is provided 'as-is', without any express or implied

+// warranty. In no event will the authors be held liable for any damages

+// arising from the use of this software.

+//

+// Permission is granted to anyone to use this software for any purpose,

+// including commercial applications, and to alter it and redistribute it

+// freely, subject to the following restrictions:

+//

+// 1. The origin of this software must not be misrepresented; you must not

+//    claim that you wrote the original software. If you use this software

+//    in a product, an acknowledgment in the product documentation would

+//    be appreciated but is not required.

+//

+// 2. Altered source versions must be plainly marked as such, and must not

+//    be misrepresented as being the original software.

+//

+// 3. This notice may not be removed or altered from any source

+//    distribution.

+//

+//========================================================================

+

+#include "internal.h"

+

+

+

+//************************************************************************

+//****                  GLFW internal functions                       ****

+//************************************************************************

+

+//========================================================================

+// Initialize GLFW thread package

+//========================================================================

+

+static void _glfwInitThreads( void )

+{

+    // Initialize critical section handle

+#ifdef _GLFW_HAS_PTHREAD

+    (void) pthread_mutex_init( &_glfwThrd.CriticalSection, NULL );

+#endif

+

+    // The first thread (the main thread) has ID 0

+    _glfwThrd.NextID = 0;

+

+    // Fill out information about the main thread (this thread)

+    _glfwThrd.First.ID       = _glfwThrd.NextID++;

+    _glfwThrd.First.Function = NULL;

+    _glfwThrd.First.Previous = NULL;

+    _glfwThrd.First.Next     = NULL;

+#ifdef _GLFW_HAS_PTHREAD

+    _glfwThrd.First.PosixID  = pthread_self();

+#endif

+}

+

+

+//========================================================================

+// Terminate GLFW thread package

+//========================================================================

+

+static void _glfwTerminateThreads( void )

+{

+#ifdef _GLFW_HAS_PTHREAD

+

+    _GLFWthread *t, *t_next;

+

+    // Enter critical section

+    ENTER_THREAD_CRITICAL_SECTION

+

+    // Kill all threads (NOTE: THE USER SHOULD WAIT FOR ALL THREADS TO

+    // DIE, _BEFORE_ CALLING glfwTerminate()!!!)

+    t = _glfwThrd.First.Next;

+    while( t != NULL )

+    {

+        // Get pointer to next thread

+        t_next = t->Next;

+

+        // Simply murder the process, no mercy!

+        pthread_kill( t->PosixID, SIGKILL );

+

+        // Free memory allocated for this thread

+        free( (void *) t );

+

+        // Select next thread in list

+        t = t_next;

+    }

+

+    // Leave critical section

+    LEAVE_THREAD_CRITICAL_SECTION

+

+    // Delete critical section handle

+    pthread_mutex_destroy( &_glfwThrd.CriticalSection );

+

+#endif // _GLFW_HAS_PTHREAD

+}

+

+

+//========================================================================

+// Dynamically load libraries

+//========================================================================

+

+#ifdef _GLFW_DLOPEN_LIBGL

+static char * _glfw_libGL_name[ ] =

+{

+    "libGL.so",

+    "libGL.so.1",

+    "/usr/lib/libGL.so",

+    "/usr/lib/libGL.so.1",

+    NULL

+};

+#endif

+

+static void _glfwInitLibraries( void )

+{

+#ifdef _GLFW_DLOPEN_LIBGL

+    int i;

+

+    _glfwLibrary.Libs.libGL = NULL;

+    for( i = 0; !_glfw_libGL_name[ i ] != NULL; i ++ )

+    {

+        _glfwLibrary.Libs.libGL = dlopen( _glfw_libGL_name[ i ],

+                                          RTLD_LAZY | RTLD_GLOBAL );

+	if( _glfwLibrary.Libs.libGL )

+	    break;

+    }

+#endif

+}

+

+

+//========================================================================

+// Terminate GLFW when exiting application

+//========================================================================

+

+void _glfwTerminate_atexit( void )

+{

+    glfwTerminate();

+}

+

+

+//========================================================================

+// Initialize X11 display

+//========================================================================

+

+static int _glfwInitDisplay( void )

+{

+    // Open display

+    _glfwLibrary.Dpy = XOpenDisplay( 0 );

+    if( !_glfwLibrary.Dpy )

+    {

+        return GL_FALSE;

+    }

+

+    // Check screens

+    _glfwLibrary.NumScreens = ScreenCount( _glfwLibrary.Dpy );

+    _glfwLibrary.DefaultScreen = DefaultScreen( _glfwLibrary.Dpy );

+

+    // Check for XF86VidMode extension

+#ifdef _GLFW_HAS_XF86VIDMODE

+    _glfwLibrary.XF86VidMode.Available =

+        XF86VidModeQueryExtension( _glfwLibrary.Dpy,

+	                           &_glfwLibrary.XF86VidMode.EventBase,

+	                           &_glfwLibrary.XF86VidMode.ErrorBase);

+#else

+    _glfwLibrary.XF86VidMode.Available = 0;

+#endif

+

+    // Check for XRandR extension

+#ifdef _GLFW_HAS_XRANDR

+    _glfwLibrary.XRandR.Available =

+        XRRQueryExtension( _glfwLibrary.Dpy,

+	                   &_glfwLibrary.XRandR.EventBase,

+			   &_glfwLibrary.XRandR.ErrorBase );

+#else

+    _glfwLibrary.XRandR.Available = 0;

+#endif

+

+     return GL_TRUE;

+}

+

+

+//========================================================================

+// Terminate X11 display

+//========================================================================

+

+static void _glfwTerminateDisplay( void )

+{

+    // Open display

+    if( _glfwLibrary.Dpy )

+    {

+        XCloseDisplay( _glfwLibrary.Dpy );

+        _glfwLibrary.Dpy = NULL;

+    }

+}

+

+

+//************************************************************************

+//****               Platform implementation functions                ****

+//************************************************************************

+

+//========================================================================

+// Initialize various GLFW state

+//========================================================================

+

+int _glfwPlatformInit( void )

+{

+    // Initialize display

+    if( !_glfwInitDisplay() )

+    {

+        return GL_FALSE;

+    }

+

+    // Initialize thread package

+    _glfwInitThreads();

+

+    // Try to load libGL.so if necessary

+    _glfwInitLibraries();

+

+    // Install atexit() routine

+    atexit( _glfwTerminate_atexit );

+

+    // Initialize joysticks

+    _glfwInitJoysticks();

+

+    // Start the timer

+    _glfwInitTimer();

+

+    return GL_TRUE;

+}

+

+

+//========================================================================

+// Close window and kill all threads

+//========================================================================

+

+int _glfwPlatformTerminate( void )

+{

+#ifdef _GLFW_HAS_PTHREAD

+    // Only the main thread is allowed to do this...

+    if( pthread_self() != _glfwThrd.First.PosixID )

+    {

+        return GL_FALSE;

+    }

+#endif // _GLFW_HAS_PTHREAD

+

+    // Close OpenGL window

+    glfwCloseWindow();

+

+    // Kill thread package

+    _glfwTerminateThreads();

+

+    // Terminate display

+    _glfwTerminateDisplay();

+

+    // Terminate joysticks

+    _glfwTerminateJoysticks();

+

+    // Unload libGL.so if necessary

+#ifdef _GLFW_DLOPEN_LIBGL

+    if( _glfwLibrary.Libs.libGL != NULL )

+    {

+        dlclose( _glfwLibrary.Libs.libGL );

+        _glfwLibrary.Libs.libGL = NULL;

+    }

+#endif

+

+    return GL_TRUE;

+}

+