summaryrefslogtreecommitdiff
path: root/indra/llwindow
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llwindow')
-rw-r--r--indra/llwindow/llwindow.cpp27
-rw-r--r--indra/llwindow/llwindow.h15
-rw-r--r--indra/llwindow/llwindowmacosx-objc.h3
-rw-r--r--indra/llwindow/llwindowmacosx-objc.mm19
-rw-r--r--indra/llwindow/llwindowmacosx.cpp48
-rw-r--r--indra/llwindow/llwindowmacosx.h2
-rw-r--r--indra/llwindow/llwindowsdl.cpp202
-rw-r--r--indra/llwindow/llwindowsdl.h3
-rw-r--r--indra/llwindow/llwindowwin32.cpp11
-rw-r--r--indra/llwindow/llwindowwin32.h3
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,