diff options
| author | Eli Linden <eli@lindenlab.com> | 2010-03-08 10:56:55 -0800 | 
|---|---|---|
| committer | Eli Linden <eli@lindenlab.com> | 2010-03-08 10:56:55 -0800 | 
| commit | 5917029eefbd32d9db29e2359f9dcc805caeec60 (patch) | |
| tree | ab995985e3dcf011d9938ab78838b3f1e669ffab /indra/llwindow | |
| parent | 72c6dc9698d0815bfd5b9ebefb401d92c6337500 (diff) | |
| parent | 0e11e774f839abf4c7e051fc3b021fd6d470a092 (diff) | |
Merge
Diffstat (limited to 'indra/llwindow')
| -rw-r--r-- | indra/llwindow/llwindow.cpp | 27 | ||||
| -rw-r--r-- | indra/llwindow/llwindow.h | 15 | ||||
| -rw-r--r-- | indra/llwindow/llwindowmacosx-objc.h | 3 | ||||
| -rw-r--r-- | indra/llwindow/llwindowmacosx-objc.mm | 19 | ||||
| -rw-r--r-- | indra/llwindow/llwindowmacosx.cpp | 48 | ||||
| -rw-r--r-- | indra/llwindow/llwindowmacosx.h | 2 | ||||
| -rw-r--r-- | indra/llwindow/llwindowsdl.cpp | 202 | ||||
| -rw-r--r-- | indra/llwindow/llwindowsdl.h | 3 | ||||
| -rw-r--r-- | indra/llwindow/llwindowwin32.cpp | 11 | ||||
| -rw-r--r-- | indra/llwindow/llwindowwin32.h | 3 | 
10 files changed, 329 insertions, 4 deletions
| 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..ed8c874dcb 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); +void getVisibleScreen(int *x, int *y, int* width, int* height); diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm index 59b25e1726..5cab2619fd 100644 --- a/indra/llwindow/llwindowmacosx-objc.mm +++ b/indra/llwindow/llwindowmacosx-objc.mm @@ -116,3 +116,22 @@ 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]; +} + +void getVisibleScreen(int *x, int *y, int* width, int* height) +{ +	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; +	NSRect visible_rect = [[NSScreen mainScreen] visibleFrame]; +	if (width)  *width = (int)(visible_rect.size.width); +	if (height) *height = (int)(visible_rect.size.height); +	if (x) *x = (int)(visible_rect.origin.x); +	if (y) *y = (int)(visible_rect.origin.y); +	[pool release]; +} diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index ad97bc45fc..924acaf148 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -1122,7 +1122,33 @@ BOOL LLWindowMacOSX::getMaximized()  BOOL LLWindowMacOSX::maximize()  { -	// TODO +	if (mWindow) +	{ +		// *HACK: Because Mac OSX doesn't have a concept of a "maximized" window, we just +		// stretch it out to the visible screen size. +		Rect win_rect; + +		int visible_x; +		int visible_y; +		int visible_width; +		int visible_height; +		int screen_width; +		int screen_height; + +		getScreenSize(&screen_width, &screen_height); +		getVisibleScreen(&visible_x, &visible_y, &visible_width, &visible_height); + +		int mac_os_menu_bar_height = screen_height - (visible_height + visible_y); +		::SetRect(&win_rect, +				  visible_x, +				  mac_os_menu_bar_height, +				  visible_width + visible_x, +				  visible_height + mac_os_menu_bar_height); + +		::SetWindowBounds(mWindow, kWindowStructureRgn, &win_rect); + +		return TRUE; +	}  	return FALSE;  } @@ -3464,6 +3490,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..cb4e04511c 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, @@ -909,7 +950,68 @@ BOOL LLWindowSDL::getMaximized()  	if (mWindow)  	{ -		// TODO +#if LL_X11 +		if (mSDL_Display) +		{ +			maybe_lock_display(); + +			// Return data in the specified format, XA_ATOM. +			U8*	prop; +			// Actual format of the property. +			int format; +			// Actual number of items stored in the prop return data. +			unsigned long nitems; +			// Number of bytes remaining to be read in the property if a partial read was performed. +			unsigned long bytes_after; +			// Atom identifier that defines the actual type of the property. +			Atom type; + +			// Atom used to obtain list of hints describing the window state. +			Atom wm_state = XInternAtom(mSDL_Display, "_NET_WM_STATE", False); + +			// Atoms indicates that the window is vertically/horizontally maximized.  +			Atom max_vert = XInternAtom(mSDL_Display, "_NET_WM_STATE_MAXIMIZED_VERT", False); +			Atom max_horz = XInternAtom(mSDL_Display, "_NET_WM_STATE_MAXIMIZED_HORZ", False); + +			// How many atoms in which we interested are present in list of hints. +			U32 pass = 0; + +			do +			{ +				nitems = 0; +				bytes_after = 0; +				type = None; +				if ( (XGetWindowProperty (mSDL_Display, +										  mSDL_XWindowID, +										  wm_state, +										  0, UINT_MAX, +										  False, XA_ATOM, +										  &type, &format, +										  &nitems, &bytes_after, +										  &prop) == Success) +					 && type != None ) +				{ +					Atom *atoms = (Atom *)prop; +					for (unsigned long i=0; i<nitems; ++i) +					{ +						if (atoms[i] == max_horz) +							++pass; +						else if (atoms[i] == max_vert) +							++pass; +					} +					XFree (atoms); +				} +				else +				{ +					break; +				} +			} while (bytes_after > 0); + +			result = (pass == 2); + +			maybe_unlock_display(); +		} +#endif // LL_X11  	}  	return(result); @@ -917,7 +1019,103 @@ BOOL LLWindowSDL::getMaximized()  BOOL LLWindowSDL::maximize()  { -	// TODO +#if LL_X11 +	if (mSDL_Display && !mFullscreen) +	{ +		maybe_lock_display(); + +		BOOL is_maximize_allowed = FALSE; + +		// Check if maximize is allowed +		{ +			// Return data in the specified format, XA_ATOM. +			U8*	prop; +			// Actual format of the property. +			int format; +			// Actual number of items stored in the prop return data. +			unsigned long nitems; +			// Number of bytes remaining to be read in the property if a partial read was performed. +			unsigned long bytes_after; +			// Atom identifier that defines the actual type of the property. +			Atom type; + +			// Atom used to obtain a list of atoms indicating user operations that the Window Manager supports for this window. +			Atom allowed_act  = XInternAtom(mSDL_Display, "_NET_WM_ALLOWED_ACTIONS", False); + +			// Atoms that indicates that the window may be vertically/horizontally maximized. +			Atom max_vert_act = XInternAtom(mSDL_Display, "_NET_WM_ACTION_MAXIMIZE_HORZ", False); +			Atom max_horz_act = XInternAtom(mSDL_Display, "_NET_WM_ACTION_MAXIMIZE_VERT", False); + +			// How many atoms in which we interested are present in list of hints. +			U32 pass = 0; + +			do +			{ +				nitems = 0; +				bytes_after = 0; +				type = None; +				if ( (XGetWindowProperty (mSDL_Display, +										  mSDL_XWindowID, +										  allowed_act, +										  0, UINT_MAX, +										  False, XA_ATOM, +										  &type, &format, +										  &nitems, &bytes_after, +										  &prop) == Success) +					 && type != None ) +				{ +					Atom *atoms = (Atom *)prop; +					for (unsigned long i=0; i<nitems; ++i) +					{ +						if (atoms[i] == max_vert_act) +							++pass; +						else if (atoms[i] == max_horz_act) +							++pass; +					} +					XFree (atoms); +				} +				else +				{ +					break; +				} +			} while (bytes_after > 0); + +			is_maximize_allowed = (pass == 2); +		} + +		// Send maximize event to X11 system +		if (is_maximize_allowed) +		{ +			XEvent xev; + +			// Atom describing the window state. +			Atom wm_state = XInternAtom(mSDL_Display, "_NET_WM_STATE", False); + +			// Atoms indicates that the window is vertically/horizontally maximized.  +			Atom max_vert = XInternAtom(mSDL_Display, "_NET_WM_STATE_MAXIMIZED_VERT", False); +			Atom max_horz = XInternAtom(mSDL_Display, "_NET_WM_STATE_MAXIMIZED_HORZ", False); + +			memset(&xev, 0, sizeof(xev)); +			xev.type = ClientMessage; +			xev.xclient.window = mSDL_XWindowID; +			xev.xclient.message_type = wm_state; +			xev.xclient.format = 32; +			xev.xclient.data.l[0] = 1;  // add/set property +			xev.xclient.data.l[1] = max_vert; +			xev.xclient.data.l[2] = max_horz; +			xev.xclient.data.l[3] = 0; +			xev.xclient.data.l[4] = 0; + +			XSendEvent(mSDL_Display, +					   DefaultRootWindow(mSDL_Display), +					   False, +					   SubstructureNotifyMask, &xev); +		} + +		maybe_unlock_display(); +		return is_maximize_allowed; +	} +#endif // LL_X11  	return FALSE;  } 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,  | 
