Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/ghost')
-rw-r--r--intern/ghost/CMakeLists.txt10
-rw-r--r--intern/ghost/intern/GHOST_SystemX11.cpp48
2 files changed, 56 insertions, 2 deletions
diff --git a/intern/ghost/CMakeLists.txt b/intern/ghost/CMakeLists.txt
index ea09987c564..c6269d49b47 100644
--- a/intern/ghost/CMakeLists.txt
+++ b/intern/ghost/CMakeLists.txt
@@ -271,6 +271,16 @@ elseif(UNIX)
if(WITH_X11_XINPUT)
add_definitions(-DWITH_X11_XINPUT)
+ list(APPEND INC_SYS
+ ${X11_Xinput_INCLUDE_PATH}
+ )
+ endif()
+
+ if(WITH_X11_XINERAMA)
+ add_definitions(-DWITH_X11_XINERAMA)
+ list(APPEND INC_SYS
+ ${X11_Xinerama_INCLUDE_PATH}
+ )
endif()
elseif(WIN32)
diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp
index 1e815870fc9..6902b2e8347 100644
--- a/intern/ghost/intern/GHOST_SystemX11.cpp
+++ b/intern/ghost/intern/GHOST_SystemX11.cpp
@@ -50,6 +50,10 @@
# include "GHOST_DropTargetX11.h"
#endif
+#ifdef WITH_X11_XINERAMA
+# include "X11/extensions/Xinerama.h"
+#endif
+
#include "GHOST_Debug.h"
#include <X11/Xatom.h>
@@ -237,8 +241,48 @@ getMainDisplayDimensions(
GHOST_TUns32& height) const
{
if (m_display) {
- width = DisplayWidth(m_display, DefaultScreen(m_display));
- height = DisplayHeight(m_display, DefaultScreen(m_display));
+
+#ifdef WITH_X11_XINERAMA
+ GHOST_TInt32 m_x = 1, m_y = 1;
+ getCursorPosition(m_x, m_y);
+
+ /* NOTE, no way to select a primary monitor, uses the first */
+ bool success = false;
+ int dummy1, dummy2;
+ if (XineramaQueryExtension(m_display, &dummy1, &dummy2)) {
+ if (XineramaIsActive(m_display)) {
+ int heads = 0;
+ XineramaScreenInfo *p = XineramaQueryScreens(m_display, &heads);
+ /* with a single head, all dimensions is fine */
+ if (heads > 1) {
+ int i;
+ for (i = 0; i < heads; i++) {
+ if ((m_x >= p[i].x_org) && (m_x <= p[i].x_org + p[i].width) &&
+ (m_y >= p[i].y_org) && (m_y <= p[i].y_org + p[i].height))
+ {
+ width = p[i].width;
+ height = p[i].height;
+ break;
+ }
+ }
+ /* highly unlikely! */
+ if (i == heads) {
+ width = p[0].width;
+ height = p[0].height;
+ }
+ success = true;
+ }
+ XFree(p);
+ }
+ }
+
+ if (success) {
+ return;
+ }
+#endif
+
+ /* fallback to all */
+ getAllDisplayDimensions(width, height);
}
}