| @@ -17,35 +17,44 @@ | |||
| #ifndef DGL_BASE_HPP_INCLUDED | |||
| #define DGL_BASE_HPP_INCLUDED | |||
| /* Compatibility with non-clang compilers */ | |||
| #ifndef __has_feature | |||
| # define __has_feature(x) 0 | |||
| #endif | |||
| #ifndef __has_extension | |||
| # define __has_extension __has_feature | |||
| #endif | |||
| /* Check OS */ | |||
| #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) | |||
| # define DGL_OS_WINDOWS 1 | |||
| #elif defined(__APPLE__) | |||
| # define DGL_OS_MAC 1 | |||
| #elif defined(__HAIKU__) | |||
| # define DGL_OS_HAIKU 1 | |||
| #elif defined(__linux__) | |||
| #elif defined(__linux__) || defined(__linux) | |||
| # define DGL_OS_LINUX 1 | |||
| #endif | |||
| /* Check for C++11 support */ | |||
| #if defined(HAVE_CPP11_SUPPORT) | |||
| # define PROPER_CPP11_SUPPORT | |||
| #elif defined(__GNUC__) && (__cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)) | |||
| # if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 | |||
| # define PROPER_CPP11_SUPPORT | |||
| # if (__GNUC__ * 100 + __GNUC_MINOR__) < 407 | |||
| # define override // gcc4.7+ only | |||
| # endif | |||
| #elif __cplusplus >= 201103L || (defined(__GNUC__) && defined(__GXX_EXPERIMENTAL_CXX0X__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 405) || __has_extension(cxx_noexcept) | |||
| # define PROPER_CPP11_SUPPORT | |||
| # if (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) < 407) || ! __has_extension(cxx_override_control) | |||
| # define override // gcc4.7+ only | |||
| # define final // gcc4.7+ only | |||
| # endif | |||
| #endif | |||
| #ifndef PROPER_CPP11_SUPPORT | |||
| # ifndef __clang__ | |||
| # define noexcept throw() | |||
| # endif | |||
| # define noexcept throw() | |||
| # define override | |||
| # define final | |||
| # define nullptr (0) | |||
| #endif | |||
| /* Define namespace */ | |||
| #ifndef DGL_NAMESPACE | |||
| # define DGL_NAMESPACE DGL | |||
| #endif | |||
| @@ -54,12 +63,14 @@ | |||
| #define END_NAMESPACE_DGL } | |||
| #define USE_NAMESPACE_DGL using namespace DGL_NAMESPACE; | |||
| /* GL includes */ | |||
| #ifdef DGL_OS_MAC | |||
| # include <OpenGL/gl.h> | |||
| #else | |||
| # include <GL/gl.h> | |||
| #endif | |||
| /* missing GL defines */ | |||
| #if defined(GL_BGR_EXT) && ! defined(GL_BGR) | |||
| # define GL_BGR GL_BGR_EXT | |||
| #endif | |||
| @@ -61,6 +61,8 @@ public: | |||
| void setTitle(const char* title); | |||
| void setTransientWinId(intptr_t winId); | |||
| App& getApp() const noexcept; | |||
| uint32_t getEventTimestamp() const; | |||
| int getModifiers() const; | |||
| @@ -34,6 +34,8 @@ struct PuglViewImpl { | |||
| int height; | |||
| };} | |||
| #elif defined(DGL_OS_LINUX) | |||
| # include <sys/types.h> | |||
| # include <unistd.h> | |||
| extern "C" { | |||
| # include "pugl/pugl_x11.c" | |||
| } | |||
| @@ -185,6 +187,10 @@ public: | |||
| xDisplay = impl->display; | |||
| xWindow = impl->win; | |||
| assert(xWindow != 0); | |||
| pid_t pid = getpid(); | |||
| Atom _nwp = XInternAtom(xDisplay, "_NET_WM_PID", True); | |||
| XChangeProperty(xDisplay, xWindow, _nwp, XA_CARDINAL, 32, PropModeReplace, (const unsigned char*)&pid, 1); | |||
| #endif | |||
| DBG("Success!\n"); | |||
| @@ -426,7 +432,9 @@ public: | |||
| XSizeHints sizeHints; | |||
| memset(&sizeHints, 0, sizeof(sizeHints)); | |||
| sizeHints.flags = PMinSize|PMaxSize; | |||
| sizeHints.flags = PSize|PMinSize|PMaxSize; | |||
| sizeHints.width = static_cast<int>(width); | |||
| sizeHints.height = static_cast<int>(height); | |||
| sizeHints.min_width = static_cast<int>(width); | |||
| sizeHints.min_height = static_cast<int>(height); | |||
| sizeHints.max_width = static_cast<int>(width); | |||
| @@ -457,6 +465,19 @@ public: | |||
| #endif | |||
| } | |||
| void setTransientWinId(const intptr_t winId) | |||
| { | |||
| #if defined(DGL_OS_LINUX) | |||
| XSetTransientForHint(xDisplay, xWindow, static_cast<::Window>(winId)); | |||
| #else | |||
| return; | |||
| // unused | |||
| (void)winId; | |||
| #endif | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| App& getApp() const noexcept | |||
| { | |||
| return fApp; | |||
| @@ -871,6 +892,11 @@ void Window::setTitle(const char* title) | |||
| pData->setTitle(title); | |||
| } | |||
| void Window::setTransientWinId(intptr_t winId) | |||
| { | |||
| pData->setTransientWinId(winId); | |||
| } | |||
| App& Window::getApp() const noexcept | |||
| { | |||
| return pData->getApp(); | |||