@@ -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(); | |||