From 48fd4c8d14172ab9780d88bf204d1e4e56f2004e Mon Sep 17 00:00:00 2001
From: Eugene Mutavchi <emutavchi@productengine.com>
Date: Fri, 5 Mar 2010 21:36:41 +0200
Subject: Working on major bug EXT-4820([NUX] Viewer dimensions on first-run) -
 moved LLDisplayInfo to llwindow, implemented getting the width/height of
 screen for mac os and linux.

--HG--
branch : product-engine
---
 indra/llwindow/llwindow.cpp           | 27 +++++++++++++++++++++++
 indra/llwindow/llwindow.h             | 15 +++++++++++++
 indra/llwindow/llwindowmacosx-objc.h  |  1 +
 indra/llwindow/llwindowmacosx-objc.mm |  9 ++++++++
 indra/llwindow/llwindowmacosx.cpp     | 20 +++++++++++++++++
 indra/llwindow/llwindowmacosx.h       |  2 ++
 indra/llwindow/llwindowsdl.cpp        | 41 +++++++++++++++++++++++++++++++++++
 indra/llwindow/llwindowsdl.h          |  3 +++
 indra/llwindow/llwindowwin32.cpp      | 11 ++++++++++
 indra/llwindow/llwindowwin32.h        |  3 +++
 10 files changed, 132 insertions(+)

(limited to 'indra/llwindow')

diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp
index 1c6c9e6e9d..b77deb003f 100644
--- a/indra/llwindow/llwindow.cpp
+++ b/indra/llwindow/llwindow.cpp
@@ -407,3 +407,30 @@ BOOL LLWindowManager::isWindowValid(LLWindow *window)
 {
 	return sWindowList.find(window) != sWindowList.end();
 }
+
+S32 LLDisplayInfo::getDisplayWidth() const
+{
+#if LL_WINDOWS
+	return LLWindowWin32::getDisplayWidth();
+#elif LL_DARWIN
+	return LLWindowMacOSX::getDisplayWidth();
+#elif LL_SDL
+	return LLWindowSDL::getDisplayWidth();
+#else
+	return 1024; //*FIXME
+#endif
+}
+
+S32 LLDisplayInfo::getDisplayHeight() const
+{
+#if LL_WINDOWS
+	return LLWindowWin32::getDisplayHeight();
+#elif LL_DARWIN
+	return LLWindowMacOSX::getDisplayHeight();
+#elif LL_SDL
+	return LLWindowSDL::getDisplayHeight();
+#else
+	return 768; //*FIXME
+#endif
+}
+
diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h
index 55b221e716..b769f5071b 100644
--- a/indra/llwindow/llwindow.h
+++ b/indra/llwindow/llwindow.h
@@ -281,4 +281,19 @@ extern const std::string gURLProtocolWhitelistHandler[];
 
 void simpleEscapeString ( std::string& stringIn  );
 
+//=============================================================================
+//
+//	CLASS		LLDisplayInfo
+class LLDisplayInfo
+
+/*!	@brief		Class to query the information about some display settings
+*/
+{
+public:
+	LLDisplayInfo(){}; ///< Default constructor
+
+	S32 getDisplayWidth() const; ///< display width
+	S32 getDisplayHeight() const; ///< display height
+};
+
 #endif // _LL_window_h_
diff --git a/indra/llwindow/llwindowmacosx-objc.h b/indra/llwindow/llwindowmacosx-objc.h
index ed5d7b1e74..66851300d4 100644
--- a/indra/llwindow/llwindowmacosx-objc.h
+++ b/indra/llwindow/llwindowmacosx-objc.h
@@ -40,4 +40,5 @@ void setupCocoa();
 CursorRef createImageCursor(const char *fullpath, int hotspotX, int hotspotY);
 OSErr releaseImageCursor(CursorRef ref);
 OSErr setImageCursor(CursorRef ref);
+void getScreenSize(int* width, int* height);
 
diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm
index 59b25e1726..6eca24ec1d 100644
--- a/indra/llwindow/llwindowmacosx-objc.mm
+++ b/indra/llwindow/llwindowmacosx-objc.mm
@@ -116,3 +116,12 @@ OSErr setImageCursor(CursorRef ref)
 	return noErr;
 }
 
+void getScreenSize(int* width, int* height)
+{
+	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+	NSRect screen_rect = [[NSScreen mainScreen] frame];
+	if (width)  *width  = (int)(screen_rect.size.width);
+	if (height) *height = (int)(screen_rect.size.height);
+	[pool release];
+}
+
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index ad97bc45fc..5b21e06fe2 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -3464,6 +3464,26 @@ MASK LLWindowMacOSX::modifiersToMask(SInt16 modifiers)
 	return mask;
 }	
 
+// static
+S32 LLWindowMacOSX::getDisplayWidth()
+{
+	S32 width = 1024;
+	// Need to invoke cocoa before use getScreenSize()
+	setupCocoa();
+	getScreenSize(&width, NULL);
+	return width;
+}
+
+// static
+S32 LLWindowMacOSX::getDisplayHeight()
+{
+	S32 height = 768;
+	// Need to invoke cocoa before use getScreenSize()
+	setupCocoa();
+	getScreenSize(NULL, &height);
+	return height;
+}
+
 #if LL_OS_DRAGDROP_ENABLED
 
 OSErr LLWindowMacOSX::dragTrackingHandler(DragTrackingMessage message, WindowRef theWindow,
diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h
index 7c6b324029..86036a261c 100644
--- a/indra/llwindow/llwindowmacosx.h
+++ b/indra/llwindow/llwindowmacosx.h
@@ -123,6 +123,8 @@ public:
 	// Provide native key event data
 	/*virtual*/ LLSD getNativeKeyData();
 
+	static S32 getDisplayWidth();
+	static S32 getDisplayHeight();
 
 protected:
 	LLWindowMacOSX(LLWindowCallbacks* callbacks,
diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp
index 1f705f9e60..fe0ada5b09 100644
--- a/indra/llwindow/llwindowsdl.cpp
+++ b/indra/llwindow/llwindowsdl.cpp
@@ -187,6 +187,47 @@ Display* LLWindowSDL::get_SDL_Display(void)
 }
 #endif // LL_X11
 
+// static
+S32 LLWindowSDL::getDisplayWidth()
+{
+#if LL_GTK
+	if (LLWindowSDL::ll_try_gtk_init())
+	{
+		return gdk_screen_width();
+	}
+#endif // LL_GTK
+
+#if LL_X11
+	Display *display = XOpenDisplay(NULL);
+	int screen_num = DefaultScreen(display);
+	S32 width = DisplayWidth(display, screen_num);
+	XCloseDisplay(display);
+	return width;
+#endif //LL_X11
+
+	return 1024;
+}
+
+// static
+S32 LLWindowSDL::getDisplayHeight()
+{
+#if LL_GTK
+	if (LLWindowSDL::ll_try_gtk_init())
+	{
+		return gdk_screen_height();
+	}
+#endif // LL_GTK
+
+#if LL_X11
+	Display *display = XOpenDisplay(NULL);
+	int screen_num = DefaultScreen(display);
+	S32 height = DisplayHeight(display, screen_num);
+	XCloseDisplay(display);
+	return height;
+#endif //LL_X11
+
+	return 768;
+}
 
 LLWindowSDL::LLWindowSDL(LLWindowCallbacks* callbacks,
 			 const std::string& title, S32 x, S32 y, S32 width,
diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h
index e6bdd46a77..2311a361fa 100644
--- a/indra/llwindow/llwindowsdl.h
+++ b/indra/llwindow/llwindowsdl.h
@@ -148,6 +148,9 @@ public:
 	static Display* get_SDL_Display(void);
 #endif // LL_X11	
 
+	static S32 getDisplayWidth();
+	static S32 getDisplayHeight();
+
 protected:
 	LLWindowSDL(LLWindowCallbacks* callbacks,
 		const std::string& title, int x, int y, int width, int height, U32 flags,
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index c80392ad45..4be5d06c2b 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -3714,5 +3714,16 @@ std::vector<std::string> LLWindowWin32::getDynamicFallbackFontList()
 	return std::vector<std::string>();
 }
 
+// static
+S32 LLWindowWin32::getDisplayWidth()
+{
+	return ::GetSystemMetrics(SM_CXVIRTUALSCREEN);
+}
+
+// static
+S32 LLWindowWin32::getDisplayHeight()
+{
+	return ::GetSystemMetrics(SM_CYVIRTUALSCREEN);
+}
 
 #endif // LL_WINDOWS
diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h
index 9d57735772..c221ec0192 100644
--- a/indra/llwindow/llwindowwin32.h
+++ b/indra/llwindow/llwindowwin32.h
@@ -120,6 +120,9 @@ public:
 
 	static std::vector<std::string> getDynamicFallbackFontList();
 
+	static S32 getDisplayWidth();
+	static S32 getDisplayHeight();
+
 protected:
 	LLWindowWin32(LLWindowCallbacks* callbacks,
 		const std::string& title, const std::string& name, int x, int y, int width, int height, U32 flags, 
-- 
cgit v1.2.3