diff options
Diffstat (limited to 'indra/llwindow/llwindowmacosx.h')
-rw-r--r-- | indra/llwindow/llwindowmacosx.h | 525 |
1 files changed, 265 insertions, 260 deletions
diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h index 0d675671a9..9ed51a9f15 100644 --- a/indra/llwindow/llwindowmacosx.h +++ b/indra/llwindow/llwindowmacosx.h @@ -1,260 +1,265 @@ -/** - * @file llwindowmacosx.h - * @brief Mac implementation of LLWindow class - * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#ifndef LL_LLWINDOWMACOSX_H -#define LL_LLWINDOWMACOSX_H - -#include "llwindow.h" -#include "llwindowcallbacks.h" -#include "llwindowmacosx-objc.h" - -#include "lltimer.h" - -#include <ApplicationServices/ApplicationServices.h> -#include <OpenGL/OpenGL.h> - -// AssertMacros.h does bad things. -#include "fix_macros.h" -#undef verify -#undef require - -class LLWindowMacOSX : public LLWindow -{ -public: - void show() override; - void hide() override; - void close() override; - bool getVisible() override; - bool getMinimized() override; - bool getMaximized() override; - bool maximize() override; - void minimize() override; - void restore() override; - bool getFullscreen(); - bool getPosition(LLCoordScreen *position) override; - bool getSize(LLCoordScreen *size) override; - bool getSize(LLCoordWindow *size) override; - bool setPosition(LLCoordScreen position) override; - bool setSizeImpl(LLCoordScreen size) override; - bool setSizeImpl(LLCoordWindow size) override; - bool switchContext(bool fullscreen, const LLCoordScreen &size, bool enable_vsync, const LLCoordScreen * const posp = NULL) override; - bool setCursorPosition(LLCoordWindow position) override; - bool getCursorPosition(LLCoordWindow *position) override; - void showCursor() override; - void hideCursor() override; - void showCursorFromMouseMove() override; - void hideCursorUntilMouseMove() override; - bool isCursorHidden() override; - void updateCursor() override; - ECursorType getCursor() const override; - void captureMouse() override; - void releaseMouse() override; - void setMouseClipping( bool b ) override; - bool isClipboardTextAvailable() override; - bool pasteTextFromClipboard(LLWString &dst) override; - bool copyTextToClipboard(const LLWString & src) override; - void flashIcon(F32 seconds) override; - F32 getGamma() override; - bool setGamma(const F32 gamma) override; // Set the gamma - U32 getFSAASamples() override; - void setFSAASamples(const U32 fsaa_samples) override; - bool restoreGamma() override; // Restore original gamma table (before updating gamma) - ESwapMethod getSwapMethod() override { return mSwapMethod; } - void gatherInput() override; - void delayInputProcessing() override {}; - void swapBuffers() override; - - // handy coordinate space conversion routines - bool convertCoords(LLCoordScreen from, LLCoordWindow *to) override; - bool convertCoords(LLCoordWindow from, LLCoordScreen *to) override; - bool convertCoords(LLCoordWindow from, LLCoordGL *to) override; - bool convertCoords(LLCoordGL from, LLCoordWindow *to) override; - bool convertCoords(LLCoordScreen from, LLCoordGL *to) override; - bool convertCoords(LLCoordGL from, LLCoordScreen *to) override; - - LLWindowResolution* getSupportedResolutions(S32 &num_resolutions) override; - F32 getNativeAspectRatio() override; - F32 getPixelAspectRatio() override; - void setNativeAspectRatio(F32 ratio) override { mOverrideAspectRatio = ratio; } - - virtual void setMaxVRAMMegabytes(U32 max_vram) override {} - - void beforeDialog() override; - void afterDialog() override; - - bool dialogColorPicker(F32 *r, F32 *g, F32 *b) override; - - void *getPlatformWindow() override; - void bringToFront() override {}; - - void allowLanguageTextInput(LLPreeditor *preeditor, bool b) override; - void interruptLanguageTextInput() override; - void spawnWebBrowser(const std::string& escaped_url, bool async) override; - F32 getSystemUISize() override; - - static std::vector<std::string> getDisplaysResolutionList(); - - static std::vector<std::string> getDynamicFallbackFontList(); - - // Provide native key event data - LLSD getNativeKeyData() override; - - void* getWindow() { return mWindow; } - LLWindowCallbacks* getCallbacks() { return mCallbacks; } - LLPreeditor* getPreeditor() { return mPreeditor; } - - void updateMouseDeltas(float* deltas); - void getMouseDeltas(float* delta); - - void handleDragNDrop(std::string url, LLWindowCallbacks::DragNDropAction action); - - bool allowsLanguageInput() { return mLanguageTextInputAllowed; } - - //create a new GL context that shares a namespace with this Window's main GL context and make it current on the current thread - // returns a pointer to be handed back to destroySharedConext/makeContextCurrent - void* createSharedContext() override; - //make the given context current on the current thread - void makeContextCurrent(void* context) override; - //destroy the given context that was retrieved by createSharedContext() - //Must be called on the same thread that called createSharedContext() - void destroySharedContext(void* context) override; - - void toggleVSync(bool enable_vsync) override; - -protected: - LLWindowMacOSX(LLWindowCallbacks* callbacks, - const std::string& title, const std::string& name, int x, int y, int width, int height, U32 flags, - bool fullscreen, bool clearBg, bool enable_vsync, bool use_gl, - bool ignore_pixel_depth, - U32 fsaa_samples, - U32 max_vram); - ~LLWindowMacOSX(); - - void initCursors(); - bool isValid() override; - void moveWindow(const LLCoordScreen& position,const LLCoordScreen& size); - - - // Changes display resolution. Returns true if successful - bool setDisplayResolution(S32 width, S32 height, S32 bits, S32 refresh); - - // Go back to last fullscreen display resolution. - bool setFullscreenResolution(); - - // Restore the display resolution to its value before we ran the app. - bool resetDisplayResolution(); - - bool shouldPostQuit() { return mPostQuit; } - - //Satisfy MAINT-3135 and MAINT-3288 with a flag. - /*virtual */ void setOldResize(bool oldresize) override {setResizeMode(oldresize, mGLView); } - -private: - void restoreGLContext(); - -protected: - // - // Platform specific methods - // - - // create or re-create the GL context/window. Called from the constructor and switchContext(). - bool createContext(int x, int y, int width, int height, int bits, bool fullscreen, bool enable_vsync); - void destroyContext(); - void setupFailure(const std::string& text, const std::string& caption, U32 type); - void adjustCursorDecouple(bool warpingMouse = false); - static MASK modifiersToMask(S16 modifiers); - -#if LL_OS_DRAGDROP_ENABLED - - //static OSErr dragTrackingHandler(DragTrackingMessage message, WindowRef theWindow, void * handlerRefCon, DragRef theDrag); - //static OSErr dragReceiveHandler(WindowRef theWindow, void * handlerRefCon, DragRef theDrag); - - -#endif // LL_OS_DRAGDROP_ENABLED - - // - // Platform specific variables - // - - // Use generic pointers here. This lets us do some funky Obj-C interop using Obj-C objects without having to worry about any compilation problems that may arise. - NSWindowRef mWindow; - GLViewRef mGLView; - CGLContextObj mContext; - CGLPixelFormatObj mPixelFormat; - CGDirectDisplayID mDisplay; - - LLRect mOldMouseClip; // Screen rect to which the mouse cursor was globally constrained before we changed it in clipMouse() - std::string mWindowTitle; - double mOriginalAspectRatio; - bool mSimulatedRightClick; - U32 mLastModifiers; - bool mHandsOffEvents; // When true, temporarially disable CarbonEvent processing. - // Used to allow event processing when putting up dialogs in fullscreen mode. - bool mCursorDecoupled; - S32 mCursorLastEventDeltaX; - S32 mCursorLastEventDeltaY; - bool mCursorIgnoreNextDelta; - bool mNeedsResize; // Constructor figured out the window is too big, it needs a resize. - LLCoordScreen mNeedsResizeSize; - F32 mOverrideAspectRatio; - bool mMaximized; - bool mMinimized; - U32 mFSAASamples; - bool mForceRebuild; - - S32 mDragOverrideCursor; - - // Input method management through Text Service Manager. - bool mLanguageTextInputAllowed; - LLPreeditor* mPreeditor; - -public: - static bool sUseMultGL; - - friend class LLWindowManager; - -}; - - -class LLSplashScreenMacOSX : public LLSplashScreen -{ -public: - LLSplashScreenMacOSX(); - virtual ~LLSplashScreenMacOSX(); - - void showImpl(); - void updateImpl(const std::string& mesg); - void hideImpl(); - -private: - WindowRef mWindow; -}; - -S32 OSMessageBoxMacOSX(const std::string& text, const std::string& caption, U32 type); - -void load_url_external(const char* url); - -#endif //LL_LLWINDOWMACOSX_H +/**
+ * @file llwindowmacosx.h
+ * @brief Mac implementation of LLWindow class
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLWINDOWMACOSX_H
+#define LL_LLWINDOWMACOSX_H
+
+#include "llwindow.h"
+#include "llwindowcallbacks.h"
+#include "llwindowmacosx-objc.h"
+
+#include "lltimer.h"
+
+#include <ApplicationServices/ApplicationServices.h>
+#include <OpenGL/OpenGL.h>
+
+// AssertMacros.h does bad things.
+#include "fix_macros.h"
+#undef verify
+#undef require
+
+class LLWindowMacOSX : public LLWindow
+{
+public:
+ void show() override;
+ void hide() override;
+ void close() override;
+ bool getVisible() override;
+ bool getMinimized() override;
+ bool getMaximized() override;
+ bool maximize() override;
+ void minimize() override;
+ void restore() override;
+ bool getFullscreen();
+ bool getPosition(LLCoordScreen *position) override;
+ bool getSize(LLCoordScreen *size) override;
+ bool getSize(LLCoordWindow *size) override;
+ bool setPosition(LLCoordScreen position) override;
+ bool setSizeImpl(LLCoordScreen size) override;
+ bool setSizeImpl(LLCoordWindow size) override;
+ bool switchContext(bool fullscreen, const LLCoordScreen &size, bool enable_vsync, const LLCoordScreen * const posp = NULL) override;
+ bool setCursorPosition(LLCoordWindow position) override;
+ bool getCursorPosition(LLCoordWindow *position) override;
+ void showCursor() override;
+ void hideCursor() override;
+ void showCursorFromMouseMove() override;
+ void hideCursorUntilMouseMove() override;
+ bool isCursorHidden() override;
+ void updateCursor() override;
+ ECursorType getCursor() const override;
+ void captureMouse() override;
+ void releaseMouse() override;
+ void setMouseClipping( bool b ) override;
+ bool isClipboardTextAvailable() override;
+ bool pasteTextFromClipboard(LLWString &dst) override;
+ bool copyTextToClipboard(const LLWString & src) override;
+ void flashIcon(F32 seconds) override;
+ F32 getGamma() override;
+ bool setGamma(const F32 gamma) override; // Set the gamma
+ U32 getFSAASamples() override;
+ void setFSAASamples(const U32 fsaa_samples) override;
+ bool restoreGamma() override; // Restore original gamma table (before updating gamma)
+ ESwapMethod getSwapMethod() override { return mSwapMethod; }
+ void gatherInput() override;
+ void delayInputProcessing() override {};
+ void swapBuffers() override;
+
+ // handy coordinate space conversion routines
+ bool convertCoords(LLCoordScreen from, LLCoordWindow *to) override;
+ bool convertCoords(LLCoordWindow from, LLCoordScreen *to) override;
+ bool convertCoords(LLCoordWindow from, LLCoordGL *to) override;
+ bool convertCoords(LLCoordGL from, LLCoordWindow *to) override;
+ bool convertCoords(LLCoordScreen from, LLCoordGL *to) override;
+ bool convertCoords(LLCoordGL from, LLCoordScreen *to) override;
+
+ LLWindowResolution* getSupportedResolutions(S32 &num_resolutions) override;
+ F32 getNativeAspectRatio() override;
+ F32 getPixelAspectRatio() override;
+ void setNativeAspectRatio(F32 ratio) override { mOverrideAspectRatio = ratio; }
+
+ virtual void setMaxVRAMMegabytes(U32 max_vram) override {}
+
+ void beforeDialog() override;
+ void afterDialog() override;
+
+ bool dialogColorPicker(F32 *r, F32 *g, F32 *b) override;
+
+ void *getPlatformWindow() override;
+ void bringToFront() override {};
+
+ void allowLanguageTextInput(LLPreeditor *preeditor, bool b) override;
+ void interruptLanguageTextInput() override;
+ void spawnWebBrowser(const std::string& escaped_url, bool async) override;
+ F32 getSystemUISize() override;
+
+ bool getInputDevices(U32 device_type_filter,
+ std::function<bool(std::string&, LLSD&, void*)> osx_callback,
+ void* win_callback,
+ void* userdata) override;
+
+ static std::vector<std::string> getDisplaysResolutionList();
+
+ static std::vector<std::string> getDynamicFallbackFontList();
+
+ // Provide native key event data
+ LLSD getNativeKeyData() override;
+
+ void* getWindow() { return mWindow; }
+ LLWindowCallbacks* getCallbacks() { return mCallbacks; }
+ LLPreeditor* getPreeditor() { return mPreeditor; }
+
+ void updateMouseDeltas(float* deltas);
+ void getMouseDeltas(float* delta);
+
+ void handleDragNDrop(std::string url, LLWindowCallbacks::DragNDropAction action);
+
+ bool allowsLanguageInput() { return mLanguageTextInputAllowed; }
+
+ //create a new GL context that shares a namespace with this Window's main GL context and make it current on the current thread
+ // returns a pointer to be handed back to destroySharedConext/makeContextCurrent
+ void* createSharedContext() override;
+ //make the given context current on the current thread
+ void makeContextCurrent(void* context) override;
+ //destroy the given context that was retrieved by createSharedContext()
+ //Must be called on the same thread that called createSharedContext()
+ void destroySharedContext(void* context) override;
+
+ void toggleVSync(bool enable_vsync) override;
+
+protected:
+ LLWindowMacOSX(LLWindowCallbacks* callbacks,
+ const std::string& title, const std::string& name, int x, int y, int width, int height, U32 flags,
+ bool fullscreen, bool clearBg, bool enable_vsync, bool use_gl,
+ bool ignore_pixel_depth,
+ U32 fsaa_samples,
+ U32 max_vram);
+ ~LLWindowMacOSX();
+
+ void initCursors();
+ bool isValid() override;
+ void moveWindow(const LLCoordScreen& position,const LLCoordScreen& size);
+
+
+ // Changes display resolution. Returns true if successful
+ bool setDisplayResolution(S32 width, S32 height, S32 bits, S32 refresh);
+
+ // Go back to last fullscreen display resolution.
+ bool setFullscreenResolution();
+
+ // Restore the display resolution to its value before we ran the app.
+ bool resetDisplayResolution();
+
+ bool shouldPostQuit() { return mPostQuit; }
+
+ //Satisfy MAINT-3135 and MAINT-3288 with a flag.
+ /*virtual */ void setOldResize(bool oldresize) override {setResizeMode(oldresize, mGLView); }
+
+private:
+ void restoreGLContext();
+
+protected:
+ //
+ // Platform specific methods
+ //
+
+ // create or re-create the GL context/window. Called from the constructor and switchContext().
+ bool createContext(int x, int y, int width, int height, int bits, bool fullscreen, bool enable_vsync);
+ void destroyContext();
+ void setupFailure(const std::string& text, const std::string& caption, U32 type);
+ void adjustCursorDecouple(bool warpingMouse = false);
+ static MASK modifiersToMask(S16 modifiers);
+
+#if LL_OS_DRAGDROP_ENABLED
+
+ //static OSErr dragTrackingHandler(DragTrackingMessage message, WindowRef theWindow, void * handlerRefCon, DragRef theDrag);
+ //static OSErr dragReceiveHandler(WindowRef theWindow, void * handlerRefCon, DragRef theDrag);
+
+
+#endif // LL_OS_DRAGDROP_ENABLED
+
+ //
+ // Platform specific variables
+ //
+
+ // Use generic pointers here. This lets us do some funky Obj-C interop using Obj-C objects without having to worry about any compilation problems that may arise.
+ NSWindowRef mWindow;
+ GLViewRef mGLView;
+ CGLContextObj mContext;
+ CGLPixelFormatObj mPixelFormat;
+ CGDirectDisplayID mDisplay;
+
+ LLRect mOldMouseClip; // Screen rect to which the mouse cursor was globally constrained before we changed it in clipMouse()
+ std::string mWindowTitle;
+ double mOriginalAspectRatio;
+ bool mSimulatedRightClick;
+ U32 mLastModifiers;
+ bool mHandsOffEvents; // When true, temporarially disable CarbonEvent processing.
+ // Used to allow event processing when putting up dialogs in fullscreen mode.
+ bool mCursorDecoupled;
+ S32 mCursorLastEventDeltaX;
+ S32 mCursorLastEventDeltaY;
+ bool mCursorIgnoreNextDelta;
+ bool mNeedsResize; // Constructor figured out the window is too big, it needs a resize.
+ LLCoordScreen mNeedsResizeSize;
+ F32 mOverrideAspectRatio;
+ bool mMaximized;
+ bool mMinimized;
+ U32 mFSAASamples;
+ bool mForceRebuild;
+
+ S32 mDragOverrideCursor;
+
+ // Input method management through Text Service Manager.
+ bool mLanguageTextInputAllowed;
+ LLPreeditor* mPreeditor;
+
+public:
+ static bool sUseMultGL;
+
+ friend class LLWindowManager;
+
+};
+
+
+class LLSplashScreenMacOSX : public LLSplashScreen
+{
+public:
+ LLSplashScreenMacOSX();
+ virtual ~LLSplashScreenMacOSX();
+
+ void showImpl();
+ void updateImpl(const std::string& mesg);
+ void hideImpl();
+
+private:
+ WindowRef mWindow;
+};
+
+S32 OSMessageBoxMacOSX(const std::string& text, const std::string& caption, U32 type);
+
+void load_url_external(const char* url);
+
+#endif //LL_LLWINDOWMACOSX_H
|