From cfc71a47db79c1aee0c161ea4e29f2fc90ecdc06 Mon Sep 17 00:00:00 2001 From: Lirusaito Date: Tue, 19 Feb 2019 04:11:41 -0500 Subject: [PATCH] Fix up ShellEx It's now crossplatform wrapper for std::system opening of a file/path/url. It returns an int just like std::system, 0 means it worked. It's static so you don't need to gViewerWindow->getWindow() anymore, honestly it should've been static in the first place. Clean up other code to use this function because duplicate code sucks. # Conflicts: # indra/llwindow/llwindowmacosx.h # indra/llwindow/llwindowsdl2.cpp --- indra/llwindow/llwindow.cpp | 13 ++++ indra/llwindow/llwindow.h | 2 +- indra/llwindow/llwindowmacosx.cpp | 7 -- indra/llwindow/llwindowmacosx.h | 93 +++++++++++++-------------- indra/llwindow/llwindowwin32.cpp | 14 ---- indra/llwindow/llwindowwin32.h | 1 - indra/newview/lgghunspell_wrapper.cpp | 2 +- indra/newview/llimpanel.cpp | 9 +-- 8 files changed, 60 insertions(+), 81 deletions(-) diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp index 5efcdbd18..1acd62169 100644 --- a/indra/llwindow/llwindow.cpp +++ b/indra/llwindow/llwindow.cpp @@ -252,6 +252,19 @@ BOOL LLWindow::copyTextToPrimary(const LLWString &src) return FALSE; // fail } +int LLWindow::ShellEx(const std::string& command) +{ + constexpr auto&& open = +#if LL_WINDOWS + "start \"\" \""; // Quoted first argument is the title of the command prompt +#elif LL_DARWIN + "open \""; +#else // LL_LINUX or other modern unix, pray it has xdg-open + "xdg-open \"" +#endif + return std::system((open + command + '"').c_str()); +} + // static std::vector LLWindow::getDynamicFallbackFontList() { diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index 85d5c0fb1..d05b00b95 100644 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -168,7 +168,7 @@ public: virtual void updateLanguageTextInputArea() {} virtual void interruptLanguageTextInput() {} virtual void spawnWebBrowser(const std::string& escaped_url, bool async) {}; - virtual void ShellEx(const std::string& command) {}; + static int ShellEx(const std::string& command); static std::vector getDynamicFallbackFontList(); diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index 9becdcaff..dcde667e3 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -1756,13 +1756,6 @@ void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url, bool async) } } -// Open a URL with the user's default web browser. -// Must begin with protocol identifier. -void LLWindowMacOSX::ShellEx(const std::string& command) -{ - std::system(("open " + command).data()); -} - LLSD LLWindowMacOSX::getNativeKeyData() { LLSD result = LLSD::emptyMap(); diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h index d8d46edb9..292af641a 100644 --- a/indra/llwindow/llwindowmacosx.h +++ b/indra/llwindow/llwindowmacosx.h @@ -29,22 +29,23 @@ #include "llwindow.h" #include "llwindowcallbacks.h" +#include "llwindowmacosx-objc.h" #include "lltimer.h" -#include -#include +#include +#include // AssertMacros.h does bad things. +#include "fix_macros.h" #undef verify -#undef check #undef require class LLWindowMacOSX : public LLWindow { public: - /*virtual*/ void show(); + /*virtual*/ void show(bool focus = true); /*virtual*/ void hide(); /*virtual*/ void close(); /*virtual*/ BOOL getVisible(); @@ -60,7 +61,7 @@ public: /*virtual*/ BOOL setPosition(LLCoordScreen position); /*virtual*/ BOOL setSizeImpl(LLCoordScreen size); /*virtual*/ BOOL setSizeImpl(LLCoordWindow size); - /*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, const S32 vsync_mode, const LLCoordScreen * const posp = NULL); + /*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, const S32 vsync_mode, const LLCoordScreen * const posp = nullptr); /*virtual*/ BOOL setCursorPosition(LLCoordWindow position); /*virtual*/ BOOL getCursorPosition(LLCoordWindow *position); /*virtual*/ void showCursor(); @@ -76,19 +77,18 @@ public: /*virtual*/ BOOL isClipboardTextAvailable(); /*virtual*/ BOOL pasteTextFromClipboard(LLWString &dst); /*virtual*/ BOOL copyTextToClipboard(const LLWString & src); + /*virtual*/ void setWindowTitle(const std::string& title); /*virtual*/ void flashIcon(F32 seconds); /*virtual*/ F32 getGamma(); /*virtual*/ BOOL setGamma(const F32 gamma); // Set the gamma /*virtual*/ U32 getFSAASamples(); /*virtual*/ void setFSAASamples(const U32 fsaa_samples); - /*virtual*/ void setVsyncMode(const S32 vsync_mode); - /*virtual*/ S32 getVsyncMode(); /*virtual*/ BOOL restoreGamma(); // Restore original gamma table (before updating gamma) /*virtual*/ ESwapMethod getSwapMethod() { return mSwapMethod; } /*virtual*/ void gatherInput(); /*virtual*/ void delayInputProcessing() {}; /*virtual*/ void swapBuffers(); - + // handy coordinate space conversion routines /*virtual*/ BOOL convertCoords(LLCoordScreen from, LLCoordWindow *to); /*virtual*/ BOOL convertCoords(LLCoordWindow from, LLCoordScreen *to); @@ -108,26 +108,34 @@ public: /*virtual*/ BOOL dialogColorPicker(F32 *r, F32 *g, F32 *b); /*virtual*/ void *getPlatformWindow(); - /*virtual*/ void *getMediaWindow(); /*virtual*/ void bringToFront() {}; /*virtual*/ void allowLanguageTextInput(LLPreeditor *preeditor, BOOL b); /*virtual*/ void interruptLanguageTextInput(); /*virtual*/ void spawnWebBrowser(const std::string& escaped_url, bool async); - - /*virtual*/ void setTitle(const std::string &title); - /*virtual*/ void ShellEx(const std::string& command); + /*virtual*/ F32 getScaleFactor(); + /*virtual*/ void updateUnreadCount(S32 num_conversations); static std::vector getDynamicFallbackFontList(); // Provide native key event data /*virtual*/ LLSD getNativeKeyData(); - + + void* getWindow() { return mWindow; } + LLWindowCallbacks* getCallbacks() { return mCallbacks; } + LLPreeditor* getPreeditor() { return mPreeditor; } + + void updateMouseDeltas(double* deltas); + void getMouseDeltas(S32* delta); + + void handleDragNDrop(std::string url, LLWindowCallbacks::DragNDropAction action); + + bool allowsLanguageInput() { return mLanguageTextInputAllowed; } 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, const S32 vsync_mode, + BOOL fullscreen, BOOL clearBg, S32 vsync_setting, BOOL ignore_pixel_depth, U32 fsaa_samples); ~LLWindowMacOSX(); @@ -148,6 +156,8 @@ protected: BOOL shouldPostQuit() { return mPostQuit; } +private: + void restoreGLContext(); protected: // @@ -155,43 +165,36 @@ protected: // // 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, const S32 vsync_mode); + BOOL createContext(int x, int y, int width, int height, int bits, BOOL fullscreen, S32 vsync_setting); void destroyContext(); void setupFailure(const std::string& text, const std::string& caption, U32 type); - static pascal OSStatus staticEventHandler (EventHandlerCallRef myHandler, EventRef event, void* userData); - static pascal Boolean staticMoveEventComparator( EventRef event, void* data); - OSStatus eventHandler (EventHandlerCallRef myHandler, EventRef event); void adjustCursorDecouple(bool warpingMouse = false); - void stopDockTileBounce(); - static MASK modifiersToMask(SInt16 modifiers); + 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); - OSErr handleDragNDrop(DragRef theDrag, LLWindowCallbacks::DragNDropAction action); + + //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 // - WindowRef mWindow; - AGLContext mContext; - AGLPixelFormat mPixelFormat; - CGDirectDisplayID mDisplay; - CFDictionaryRef mOldDisplayMode; - EventLoopTimerRef mTimer; - EventHandlerUPP mEventHandlerUPP; - EventHandlerRef mGlobalHandlerRef; - EventHandlerRef mWindowHandlerRef; - EventComparatorUPP mMoveEventCampartorUPP; - Rect mOldMouseClip; // Screen rect to which the mouse cursor was globally constrained before we changed it in clipMouse() - Rect mPreviousWindowRect; // Save previous window for un-maximize event - Str255 mWindowTitle; + // 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; - UInt32 mLastModifiers; + U32 mLastModifiers; BOOL mHandsOffEvents; // When true, temporarially disable CarbonEvent processing. // Used to allow event processing when putting up dialogs in fullscreen mode. BOOL mCursorDecoupled; @@ -204,28 +207,18 @@ protected: BOOL mMaximized; BOOL mMinimized; U32 mFSAASamples; - S32 mVsyncMode; BOOL mForceRebuild; - S32 mDragOverrideCursor; - - F32 mBounceTime; - NMRec mBounceRec; - LLTimer mBounceTimer; + S32 mDragOverrideCursor; // Input method management through Text Service Manager. - TSMDocumentID mTSMDocument; BOOL mLanguageTextInputAllowed; - ScriptCode mTSMScriptCode; - LangCode mTSMLangCode; LLPreeditor* mPreeditor; static BOOL sUseMultGL; friend class LLWindowManager; - static WindowRef sMediaWindow; - EventRef mRawKeyEvent; - + }; diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index c9a779cc2..a4cbdc757 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -3361,20 +3361,6 @@ S32 OSMessageBoxWin32(const std::string& text, const std::string& caption, U32 t return retval; } -void LLWindowWin32::ShellEx(const std::string& command) -{ - LLWString url_wstring = utf8str_to_wstring( "\"" + command + "\"" ); - llutf16string url_utf16 = wstring_to_utf16str( url_wstring ); - - SHELLEXECUTEINFO sei = { sizeof( sei ) }; - sei.fMask = SEE_MASK_FLAG_DDEWAIT; - sei.nShow = SW_SHOWNORMAL; - sei.lpVerb = L"open"; - sei.lpFile = url_utf16.c_str(); - ShellExecuteEx( &sei ); -} - - void LLWindowWin32::spawnWebBrowser(const std::string& escaped_url, bool async) { if (!isWhitelistedProtocol(escaped_url)) diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h index ca82f7512..02466adde 100644 --- a/indra/llwindow/llwindowwin32.h +++ b/indra/llwindow/llwindowwin32.h @@ -109,7 +109,6 @@ public: /*virtual*/ void setLanguageTextInput( const LLCoordGL & pos ); /*virtual*/ void updateLanguageTextInputArea(); /*virtual*/ void interruptLanguageTextInput(); - void ShellEx(const std::string& command); /*virtual*/ void spawnWebBrowser(const std::string& escaped_url, bool async); /*virtual*/ void setTitle(const std::string &title); diff --git a/indra/newview/lgghunspell_wrapper.cpp b/indra/newview/lgghunspell_wrapper.cpp index c28f83a0c..d19e91485 100644 --- a/indra/newview/lgghunspell_wrapper.cpp +++ b/indra/newview/lgghunspell_wrapper.cpp @@ -948,7 +948,7 @@ void lggHunSpell_Wrapper::editCustomButton() //glggHunSpell->addWordToCustomDictionary("temp"); } - gViewerWindow->getWindow()->ShellEx(dicdicpath); + LLWindow::ShellEx(dicdicpath); } void lggHunSpell_Wrapper::setSpellCheckHighlight(BOOL highlight) diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index b80225d3e..5425fc965 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -1154,13 +1154,8 @@ void show_log_browser(const std::string& name, const std::string& id) const std::string file(LLLogChat::makeLogFileName(name)); if (gSavedSettings.getBOOL("LiruLegacyLogLaunch")) { -#if LL_WINDOWS || LL_DARWIN - gViewerWindow->getWindow()->ShellEx(file); -#elif LL_LINUX - // xdg-open might not actually be installed on all distros, but it's our best bet. - if (!std::system(("/usr/bin/xdg-open \"" + file +'"').c_str())) // 0 = success, otherwise fallback on internal browser. -#endif - return; + if (!LLWindow::ShellEx(file)) // 0 = success, otherwise fallback on internal browser. + return; } LLFloaterWebContent::Params p; p.url("file:///" + file);