@@ -17,35 +17,44 @@ | |||||
#ifndef DGL_BASE_HPP_INCLUDED | #ifndef DGL_BASE_HPP_INCLUDED | ||||
#define 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__) | #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) | ||||
# define DGL_OS_WINDOWS 1 | # define DGL_OS_WINDOWS 1 | ||||
#elif defined(__APPLE__) | #elif defined(__APPLE__) | ||||
# define DGL_OS_MAC 1 | # define DGL_OS_MAC 1 | ||||
#elif defined(__HAIKU__) | #elif defined(__HAIKU__) | ||||
# define DGL_OS_HAIKU 1 | # define DGL_OS_HAIKU 1 | ||||
#elif defined(__linux__) | |||||
#elif defined(__linux__) || defined(__linux) | |||||
# define DGL_OS_LINUX 1 | # define DGL_OS_LINUX 1 | ||||
#endif | #endif | ||||
/* Check for C++11 support */ | |||||
#if defined(HAVE_CPP11_SUPPORT) | #if defined(HAVE_CPP11_SUPPORT) | ||||
# define PROPER_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 | ||||
#endif | #endif | ||||
#ifndef PROPER_CPP11_SUPPORT | #ifndef PROPER_CPP11_SUPPORT | ||||
# ifndef __clang__ | |||||
# define noexcept throw() | |||||
# endif | |||||
# define noexcept throw() | |||||
# define override | # define override | ||||
# define final | |||||
# define nullptr (0) | # define nullptr (0) | ||||
#endif | #endif | ||||
/* Define namespace */ | |||||
#ifndef DGL_NAMESPACE | #ifndef DGL_NAMESPACE | ||||
# define DGL_NAMESPACE DGL | # define DGL_NAMESPACE DGL | ||||
#endif | #endif | ||||
@@ -54,12 +63,14 @@ | |||||
#define END_NAMESPACE_DGL } | #define END_NAMESPACE_DGL } | ||||
#define USE_NAMESPACE_DGL using namespace DGL_NAMESPACE; | #define USE_NAMESPACE_DGL using namespace DGL_NAMESPACE; | ||||
/* GL includes */ | |||||
#ifdef DGL_OS_MAC | #ifdef DGL_OS_MAC | ||||
# include <OpenGL/gl.h> | # include <OpenGL/gl.h> | ||||
#else | #else | ||||
# include <GL/gl.h> | # include <GL/gl.h> | ||||
#endif | #endif | ||||
/* missing GL defines */ | |||||
#if defined(GL_BGR_EXT) && ! defined(GL_BGR) | #if defined(GL_BGR_EXT) && ! defined(GL_BGR) | ||||
# define GL_BGR GL_BGR_EXT | # define GL_BGR GL_BGR_EXT | ||||
#endif | #endif | ||||
@@ -61,6 +61,8 @@ public: | |||||
void setTitle(const char* title); | void setTitle(const char* title); | ||||
void setTransientWinId(intptr_t winId); | |||||
App& getApp() const noexcept; | App& getApp() const noexcept; | ||||
uint32_t getEventTimestamp() const; | uint32_t getEventTimestamp() const; | ||||
int getModifiers() const; | int getModifiers() const; | ||||
@@ -34,6 +34,8 @@ struct PuglViewImpl { | |||||
int height; | int height; | ||||
};} | };} | ||||
#elif defined(DGL_OS_LINUX) | #elif defined(DGL_OS_LINUX) | ||||
# include <sys/types.h> | |||||
# include <unistd.h> | |||||
extern "C" { | extern "C" { | ||||
# include "pugl/pugl_x11.c" | # include "pugl/pugl_x11.c" | ||||
} | } | ||||
@@ -185,6 +187,10 @@ public: | |||||
xDisplay = impl->display; | xDisplay = impl->display; | ||||
xWindow = impl->win; | xWindow = impl->win; | ||||
assert(xWindow != 0); | 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 | #endif | ||||
DBG("Success!\n"); | DBG("Success!\n"); | ||||
@@ -426,7 +432,9 @@ public: | |||||
XSizeHints sizeHints; | XSizeHints sizeHints; | ||||
memset(&sizeHints, 0, sizeof(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_width = static_cast<int>(width); | ||||
sizeHints.min_height = static_cast<int>(height); | sizeHints.min_height = static_cast<int>(height); | ||||
sizeHints.max_width = static_cast<int>(width); | sizeHints.max_width = static_cast<int>(width); | ||||
@@ -457,6 +465,19 @@ public: | |||||
#endif | #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 | App& getApp() const noexcept | ||||
{ | { | ||||
return fApp; | return fApp; | ||||
@@ -871,6 +892,11 @@ void Window::setTitle(const char* title) | |||||
pData->setTitle(title); | pData->setTitle(title); | ||||
} | } | ||||
void Window::setTransientWinId(intptr_t winId) | |||||
{ | |||||
pData->setTransientWinId(winId); | |||||
} | |||||
App& Window::getApp() const noexcept | App& Window::getApp() const noexcept | ||||
{ | { | ||||
return pData->getApp(); | return pData->getApp(); | ||||