From 3871c8d6d135407ef55ca46c3552b53c315f437e Mon Sep 17 00:00:00 2001 From: Julian Storer Date: Fri, 1 Jul 2011 11:40:44 +0100 Subject: [PATCH] Tweaked OS file drag-and-drop to ignore unwanted file types. Minor structural fixes. Changes to avoid cancellation of ThreadWithAlertWindow and for Linux openGL rendering. --- .../Source/Project/jucer_Project.cpp | 3 +- juce_amalgamated.cpp | 398 ++++++++++-------- juce_amalgamated.h | 23 +- .../juce_PluginDirectoryScanner.cpp | 2 +- src/core/juce_Initialisation.cpp | 138 ------ src/core/juce_StandardHeader.h | 2 +- .../special/juce_OpenGLComponent.cpp | 14 +- .../components/windows/juce_AlertWindow.cpp | 17 +- src/gui/components/windows/juce_AlertWindow.h | 9 + .../components/windows/juce_ComponentPeer.cpp | 26 +- .../components/windows/juce_ComponentPeer.h | 6 +- .../windows/juce_ThreadWithProgressWindow.cpp | 3 + src/io/files/juce_File.cpp | 5 + src/io/files/juce_File.h | 5 + src/native/linux/juce_linux_SystemStats.cpp | 2 +- .../mac/juce_mac_CoreGraphicsContext.mm | 23 + .../mac/juce_mac_NSViewComponentPeer.mm | 8 +- src/native/mac/juce_osx_ObjCHelpers.h | 19 - .../windows/juce_win32_ActiveXComponent.cpp | 92 ++-- .../windows/juce_win32_AudioCDReader.cpp | 18 +- src/native/windows/juce_win32_ComSmartPtr.h | 15 +- src/native/windows/juce_win32_WASAPI.cpp | 16 +- .../juce_win32_WebBrowserComponent.cpp | 10 +- src/native/windows/juce_win32_Windowing.cpp | 115 +++-- src/utilities/juce_WindowsRegistry.h | 1 + 25 files changed, 461 insertions(+), 509 deletions(-) delete mode 100644 src/core/juce_Initialisation.cpp diff --git a/extras/Introjucer/Source/Project/jucer_Project.cpp b/extras/Introjucer/Source/Project/jucer_Project.cpp index 67d1ff76f4..8cfcd76bd8 100644 --- a/extras/Introjucer/Source/Project/jucer_Project.cpp +++ b/extras/Introjucer/Source/Project/jucer_Project.cpp @@ -833,9 +833,8 @@ void Project::getJuceConfigFlags (OwnedArray & flags) { ValueTree configNode (getJuceConfigNode()); - File juceConfigH (getLocalJuceFolder().getChildFile ("juce_Config.h")); StringArray lines; - lines.addLines (juceConfigH.loadFileAsString()); + getLocalJuceFolder().getChildFile ("juce_Config.h").readLines (lines); for (int i = 0; i < lines.size(); ++i) { diff --git a/juce_amalgamated.cpp b/juce_amalgamated.cpp index a799d610c0..fc92e4ec5a 100644 --- a/juce_amalgamated.cpp +++ b/juce_amalgamated.cpp @@ -716,11 +716,11 @@ public: HRESULT CoCreateInstance (REFCLSID classUUID, DWORD dwClsContext = CLSCTX_INPROC_SERVER) { - #ifndef __MINGW32__ + #ifndef __MINGW32__ return ::CoCreateInstance (classUUID, 0, dwClsContext, __uuidof (ComClass), (void**) resetAndGetPointerAddress()); - #else + #else return E_NOTIMPL; - #endif + #endif } template @@ -746,6 +746,8 @@ private: ComClass** operator&() throw(); // private to avoid it being used accidentally }; +#define JUCE_COMRESULT HRESULT __stdcall + /** Handy base class for writing COM objects, providing ref-counting and a basic QueryInterface method. */ template @@ -755,11 +757,11 @@ public: ComBaseClassHelper() : refCount (1) {} virtual ~ComBaseClassHelper() {} - HRESULT __stdcall QueryInterface (REFIID refId, void** result) + JUCE_COMRESULT QueryInterface (REFIID refId, void** result) { - #ifndef __MINGW32__ + #ifndef __MINGW32__ if (refId == __uuidof (ComClass)) { AddRef(); *result = dynamic_cast (this); return S_OK; } - #endif + #endif if (refId == IID_IUnknown) { AddRef(); *result = dynamic_cast (this); return S_OK; } @@ -8007,6 +8009,11 @@ String File::loadFileAsString() const return in.readEntireStreamAsString(); } +void File::readLines (StringArray& destLines) const +{ + destLines.addLines (loadFileAsString()); +} + int File::findChildFiles (Array& results, const int whatToLookFor, const bool searchRecursively, @@ -32243,7 +32250,7 @@ StringArray PluginDirectoryScanner::getDeadMansPedalFile() if (deadMansPedalFile != File::nonexistent) { - lines.addLines (deadMansPedalFile.loadFileAsString()); + deadMansPedalFile.readLines (lines); lines.removeEmptyStrings(); } @@ -78072,6 +78079,18 @@ public: void run() { + #if JUCE_LINUX + { + MessageManagerLock mml (this); + + if (! mml.lockWasGained()) + return; + + owner.updateContext(); + owner.updateContextPosition(); + } + #endif + while (! threadShouldExit()) { const uint32 startOfRendering = Time::getMillisecondCounter(); @@ -78529,7 +78548,8 @@ AlertWindow::AlertWindow (const String& title, Component* associatedComponent_) : TopLevelWindow (title, true), alertIconType (iconType), - associatedComponent (associatedComponent_) + associatedComponent (associatedComponent_), + escapeKeyCancels (true) { if (message.isEmpty()) text = " "; // to force an update if the message is empty @@ -78562,7 +78582,8 @@ AlertWindow::~AlertWindow() void AlertWindow::userTriedToCloseWindow() { - exitModalState (0); + if (escapeKeyCancels || buttons.size() > 0) + exitModalState (0); } void AlertWindow::setMessage (const String& message) @@ -78631,6 +78652,11 @@ void AlertWindow::triggerButtonClick (const String& buttonName) } } +void AlertWindow::setEscapeKeyCancels (bool shouldEscapeKeyCancel) +{ + escapeKeyCancels = shouldEscapeKeyCancel; +} + void AlertWindow::addTextEditor (const String& name, const String& initialContents, const String& onScreenLabel, @@ -78715,10 +78741,6 @@ public: setColour (TextEditor::shadowColourId, Colours::transparentBlack); } - ~AlertTextComp() - { - } - int getPreferredWidth() const noexcept { return bestWidth; } void updateLayout (const int width) @@ -79013,7 +79035,7 @@ bool AlertWindow::keyPressed (const KeyPress& key) } } - if (key.isKeyCode (KeyPress::escapeKey) && buttons.size() == 0) + if (key.isKeyCode (KeyPress::escapeKey) && escapeKeyCancels && buttons.size() == 0) { exitModalState (0); return true; @@ -79832,7 +79854,7 @@ namespace ComponentPeerHelpers } } -void ComponentPeer::handleFileDragMove (const StringArray& files, const Point& position) +bool ComponentPeer::handleFileDragMove (const StringArray& files, const Point& position) { updateCurrentModifiers(); @@ -79868,21 +79890,22 @@ void ComponentPeer::handleFileDragMove (const StringArray& files, const Point (newTarget); - const Point pos (targetComp->getLocalPoint (component, position)); + if (newTarget == nullptr) + return false; - newTarget->fileDragMove (files, pos.getX(), pos.getY()); - } + Component* const targetComp = dynamic_cast (newTarget); + const Point pos (targetComp->getLocalPoint (component, position)); + newTarget->fileDragMove (files, pos.getX(), pos.getY()); + return true; } -void ComponentPeer::handleFileDragExit (const StringArray& files) +bool ComponentPeer::handleFileDragExit (const StringArray& files) { - handleFileDragMove (files, Point (-1, -1)); + const bool used = handleFileDragMove (files, Point (-1, -1)); jassert (dragAndDropTargetComponent == nullptr); lastDragAndDropCompUnderMouse = nullptr; + return used; } // We'll use an async message to deliver the drop, because if the target decides @@ -79911,7 +79934,7 @@ private: JUCE_DECLARE_NON_COPYABLE (AsyncFileDropMessage); }; -void ComponentPeer::handleFileDragDrop (const StringArray& files, const Point& position) +bool ComponentPeer::handleFileDragDrop (const StringArray& files, const Point& position) { handleFileDragMove (files, position); @@ -79932,12 +79955,15 @@ void ComponentPeer::handleFileDragDrop (const StringArray& files, const PointinternalModalInputAttempt(); if (targetComp->isCurrentlyBlockedByAnotherModalComponent()) - return; + return true; } (new AsyncFileDropMessage (targetComp, target, targetComp->getLocalPoint (component, position), files))->post(); + return true; } } + + return false; } void ComponentPeer::handleUserClosingWindow() @@ -81123,6 +81149,9 @@ ThreadWithProgressWindow::ThreadWithProgressWindow (const String& title, String::empty, String::empty, AlertWindow::NoIcon, hasCancelButton ? 1 : 0, 0); + // if there are no buttons, we won't allow the user to interrupt the thread. + alertWindow->setEscapeKeyCancels (false); + if (hasProgressBar) alertWindow->addProgressBarComponent (progress); } @@ -250308,39 +250337,58 @@ private: { } - HRESULT __stdcall DragEnter (IDataObject* pDataObject, DWORD /*grfKeyState*/, POINTL mousePos, DWORD* pdwEffect) + JUCE_COMRESULT DragEnter (IDataObject* pDataObject, DWORD /*grfKeyState*/, POINTL mousePos, DWORD* pdwEffect) { updateFileList (pDataObject); - owner->handleFileDragMove (files, owner->globalToLocal (Point (mousePos.x, mousePos.y))); - *pdwEffect = DROPEFFECT_COPY; - return S_OK; + const bool wasWanted = owner->handleFileDragMove (files, owner->globalToLocal (Point (mousePos.x, mousePos.y))); + *pdwEffect = wasWanted ? DROPEFFECT_COPY : DROPEFFECT_NONE; + return wasWanted ? S_OK : S_FALSE; } - HRESULT __stdcall DragLeave() + JUCE_COMRESULT DragLeave() { owner->handleFileDragExit (files); return S_OK; } - HRESULT __stdcall DragOver (DWORD /*grfKeyState*/, POINTL mousePos, DWORD* pdwEffect) + JUCE_COMRESULT DragOver (DWORD /*grfKeyState*/, POINTL mousePos, DWORD* pdwEffect) { - owner->handleFileDragMove (files, owner->globalToLocal (Point (mousePos.x, mousePos.y))); - *pdwEffect = DROPEFFECT_COPY; - return S_OK; + const bool wasWanted = owner->handleFileDragMove (files, owner->globalToLocal (Point (mousePos.x, mousePos.y))); + *pdwEffect = wasWanted ? DROPEFFECT_COPY : DROPEFFECT_NONE; + return wasWanted ? S_OK : S_FALSE; } - HRESULT __stdcall Drop (IDataObject* pDataObject, DWORD /*grfKeyState*/, POINTL mousePos, DWORD* pdwEffect) + JUCE_COMRESULT Drop (IDataObject* pDataObject, DWORD /*grfKeyState*/, POINTL mousePos, DWORD* pdwEffect) { updateFileList (pDataObject); - owner->handleFileDragDrop (files, owner->globalToLocal (Point (mousePos.x, mousePos.y))); - *pdwEffect = DROPEFFECT_COPY; - return S_OK; + const bool wasWanted = owner->handleFileDragDrop (files, owner->globalToLocal (Point (mousePos.x, mousePos.y))); + *pdwEffect = wasWanted ? DROPEFFECT_COPY : DROPEFFECT_NONE; + return wasWanted ? S_OK : S_FALSE; } private: Win32ComponentPeer* const owner; StringArray files; + template + void parseFileList (const CharType* names, const SIZE_T totalLen) + { + unsigned int i = 0; + + for (;;) + { + unsigned int len = 0; + while (i + len < totalLen && names [i + len] != 0) + ++len; + + if (len == 0) + break; + + files.add (String (names + i, len)); + i += len + 1; + } + } + void updateFileList (IDataObject* const pDataObject) { files.clear(); @@ -250351,43 +250399,13 @@ private: if (pDataObject->GetData (&format, &medium) == S_OK) { const SIZE_T totalLen = GlobalSize (medium.hGlobal); - const LPDROPFILES pDropFiles = (const LPDROPFILES) GlobalLock (medium.hGlobal); - unsigned int i = 0; - - if (pDropFiles->fWide) - { - const WCHAR* const fname = (WCHAR*) addBytesToPointer (pDropFiles, sizeof (DROPFILES)); - - for (;;) - { - unsigned int len = 0; - while (i + len < totalLen && fname [i + len] != 0) - ++len; - - if (len == 0) - break; + const LPDROPFILES dropFiles = (const LPDROPFILES) GlobalLock (medium.hGlobal); + const void* const names = addBytesToPointer (dropFiles, sizeof (DROPFILES)); - files.add (String (fname + i, len)); - i += len + 1; - } - } + if (dropFiles->fWide) + parseFileList (static_cast (names), totalLen); else - { - const char* const fname = (const char*) addBytesToPointer (pDropFiles, sizeof (DROPFILES)); - - for (;;) - { - unsigned int len = 0; - while (i + len < totalLen && fname [i + len] != 0) - ++len; - - if (len == 0) - break; - - files.add (String (fname + i, len)); - i += len + 1; - } - } + parseFileList (static_cast (names), totalLen); GlobalUnlock (medium.hGlobal); } @@ -251547,7 +251565,7 @@ class JuceDropSource : public ComBaseClassHelper public: JuceDropSource() {} - HRESULT __stdcall QueryContinueDrag (BOOL escapePressed, DWORD keys) + JUCE_COMRESULT QueryContinueDrag (BOOL escapePressed, DWORD keys) { if (escapePressed) return DRAGDROP_S_CANCEL; @@ -251558,7 +251576,7 @@ public: return S_OK; } - HRESULT __stdcall GiveFeedback (DWORD) + JUCE_COMRESULT GiveFeedback (DWORD) { return DRAGDROP_S_USEDEFAULTCURSORS; } @@ -251573,7 +251591,7 @@ public: { } - HRESULT __stdcall Clone (IEnumFORMATETC** result) + JUCE_COMRESULT Clone (IEnumFORMATETC** result) { if (result == 0) return E_POINTER; @@ -251585,7 +251603,7 @@ public: return S_OK; } - HRESULT __stdcall Next (ULONG celt, LPFORMATETC lpFormatEtc, ULONG* pceltFetched) + JUCE_COMRESULT Next (ULONG celt, LPFORMATETC lpFormatEtc, ULONG* pceltFetched) { if (pceltFetched != nullptr) *pceltFetched = 0; @@ -251606,7 +251624,7 @@ public: return S_FALSE; } - HRESULT __stdcall Skip (ULONG celt) + JUCE_COMRESULT Skip (ULONG celt) { if (index + (int) celt >= 1) return S_FALSE; @@ -251615,7 +251633,7 @@ public: return S_OK; } - HRESULT __stdcall Reset() + JUCE_COMRESULT Reset() { index = 0; return S_OK; @@ -251656,7 +251674,7 @@ public: jassert (refCount == 0); } - HRESULT __stdcall GetData (FORMATETC* pFormatEtc, STGMEDIUM* pMedium) + JUCE_COMRESULT GetData (FORMATETC* pFormatEtc, STGMEDIUM* pMedium) { if ((pFormatEtc->tymed & format->tymed) != 0 && pFormatEtc->cfFormat == format->cfFormat @@ -251683,7 +251701,7 @@ public: return DV_E_FORMATETC; } - HRESULT __stdcall QueryGetData (FORMATETC* f) + JUCE_COMRESULT QueryGetData (FORMATETC* f) { if (f == 0) return E_INVALIDARG; @@ -251696,13 +251714,13 @@ public: return DV_E_FORMATETC; } - HRESULT __stdcall GetCanonicalFormatEtc (FORMATETC*, FORMATETC* pFormatEtcOut) + JUCE_COMRESULT GetCanonicalFormatEtc (FORMATETC*, FORMATETC* pFormatEtcOut) { pFormatEtcOut->ptd = 0; return E_NOTIMPL; } - HRESULT __stdcall EnumFormatEtc (DWORD direction, IEnumFORMATETC** result) + JUCE_COMRESULT EnumFormatEtc (DWORD direction, IEnumFORMATETC** result) { if (result == 0) return E_POINTER; @@ -251717,11 +251735,11 @@ public: return E_NOTIMPL; } - HRESULT __stdcall GetDataHere (FORMATETC*, STGMEDIUM*) { return DATA_E_FORMATETC; } - HRESULT __stdcall SetData (FORMATETC*, STGMEDIUM*, BOOL) { return E_NOTIMPL; } - HRESULT __stdcall DAdvise (FORMATETC*, DWORD, IAdviseSink*, DWORD*) { return OLE_E_ADVISENOTSUPPORTED; } - HRESULT __stdcall DUnadvise (DWORD) { return E_NOTIMPL; } - HRESULT __stdcall EnumDAdvise (IEnumSTATDATA**) { return OLE_E_ADVISENOTSUPPORTED; } + JUCE_COMRESULT GetDataHere (FORMATETC*, STGMEDIUM*) { return DATA_E_FORMATETC; } + JUCE_COMRESULT SetData (FORMATETC*, STGMEDIUM*, BOOL) { return E_NOTIMPL; } + JUCE_COMRESULT DAdvise (FORMATETC*, DWORD, IAdviseSink*, DWORD*) { return OLE_E_ADVISENOTSUPPORTED; } + JUCE_COMRESULT DUnadvise (DWORD) { return E_NOTIMPL; } + JUCE_COMRESULT EnumDAdvise (IEnumSTATDATA**) { return OLE_E_ADVISENOTSUPPORTED; } private: JuceDropSource* const dropSource; @@ -252120,21 +252138,21 @@ namespace ActiveXHelpers public: JuceIStorage() {} - HRESULT __stdcall CreateStream (const WCHAR*, DWORD, DWORD, DWORD, IStream**) { return E_NOTIMPL; } - HRESULT __stdcall OpenStream (const WCHAR*, void*, DWORD, DWORD, IStream**) { return E_NOTIMPL; } - HRESULT __stdcall CreateStorage (const WCHAR*, DWORD, DWORD, DWORD, IStorage**) { return E_NOTIMPL; } - HRESULT __stdcall OpenStorage (const WCHAR*, IStorage*, DWORD, SNB, DWORD, IStorage**) { return E_NOTIMPL; } - HRESULT __stdcall CopyTo (DWORD, IID const*, SNB, IStorage*) { return E_NOTIMPL; } - HRESULT __stdcall MoveElementTo (const OLECHAR*,IStorage*, const OLECHAR*, DWORD) { return E_NOTIMPL; } - HRESULT __stdcall Commit (DWORD) { return E_NOTIMPL; } - HRESULT __stdcall Revert() { return E_NOTIMPL; } - HRESULT __stdcall EnumElements (DWORD, void*, DWORD, IEnumSTATSTG**) { return E_NOTIMPL; } - HRESULT __stdcall DestroyElement (const OLECHAR*) { return E_NOTIMPL; } - HRESULT __stdcall RenameElement (const WCHAR*, const WCHAR*) { return E_NOTIMPL; } - HRESULT __stdcall SetElementTimes (const WCHAR*, FILETIME const*, FILETIME const*, FILETIME const*) { return E_NOTIMPL; } - HRESULT __stdcall SetClass (REFCLSID) { return S_OK; } - HRESULT __stdcall SetStateBits (DWORD, DWORD) { return E_NOTIMPL; } - HRESULT __stdcall Stat (STATSTG*, DWORD) { return E_NOTIMPL; } + JUCE_COMRESULT CreateStream (const WCHAR*, DWORD, DWORD, DWORD, IStream**) { return E_NOTIMPL; } + JUCE_COMRESULT OpenStream (const WCHAR*, void*, DWORD, DWORD, IStream**) { return E_NOTIMPL; } + JUCE_COMRESULT CreateStorage (const WCHAR*, DWORD, DWORD, DWORD, IStorage**) { return E_NOTIMPL; } + JUCE_COMRESULT OpenStorage (const WCHAR*, IStorage*, DWORD, SNB, DWORD, IStorage**) { return E_NOTIMPL; } + JUCE_COMRESULT CopyTo (DWORD, IID const*, SNB, IStorage*) { return E_NOTIMPL; } + JUCE_COMRESULT MoveElementTo (const OLECHAR*,IStorage*, const OLECHAR*, DWORD) { return E_NOTIMPL; } + JUCE_COMRESULT Commit (DWORD) { return E_NOTIMPL; } + JUCE_COMRESULT Revert() { return E_NOTIMPL; } + JUCE_COMRESULT EnumElements (DWORD, void*, DWORD, IEnumSTATSTG**) { return E_NOTIMPL; } + JUCE_COMRESULT DestroyElement (const OLECHAR*) { return E_NOTIMPL; } + JUCE_COMRESULT RenameElement (const WCHAR*, const WCHAR*) { return E_NOTIMPL; } + JUCE_COMRESULT SetElementTimes (const WCHAR*, FILETIME const*, FILETIME const*, FILETIME const*) { return E_NOTIMPL; } + JUCE_COMRESULT SetClass (REFCLSID) { return S_OK; } + JUCE_COMRESULT SetStateBits (DWORD, DWORD) { return E_NOTIMPL; } + JUCE_COMRESULT Stat (STATSTG*, DWORD) { return E_NOTIMPL; } }; class JuceOleInPlaceFrame : public ComBaseClassHelper @@ -252142,18 +252160,18 @@ namespace ActiveXHelpers public: JuceOleInPlaceFrame (HWND window_) : window (window_) {} - HRESULT __stdcall GetWindow (HWND* lphwnd) { *lphwnd = window; return S_OK; } - HRESULT __stdcall ContextSensitiveHelp (BOOL) { return E_NOTIMPL; } - HRESULT __stdcall GetBorder (LPRECT) { return E_NOTIMPL; } - HRESULT __stdcall RequestBorderSpace (LPCBORDERWIDTHS) { return E_NOTIMPL; } - HRESULT __stdcall SetBorderSpace (LPCBORDERWIDTHS) { return E_NOTIMPL; } - HRESULT __stdcall SetActiveObject (IOleInPlaceActiveObject*, LPCOLESTR) { return S_OK; } - HRESULT __stdcall InsertMenus (HMENU, LPOLEMENUGROUPWIDTHS) { return E_NOTIMPL; } - HRESULT __stdcall SetMenu (HMENU, HOLEMENU, HWND) { return S_OK; } - HRESULT __stdcall RemoveMenus (HMENU) { return E_NOTIMPL; } - HRESULT __stdcall SetStatusText (LPCOLESTR) { return S_OK; } - HRESULT __stdcall EnableModeless (BOOL) { return S_OK; } - HRESULT __stdcall TranslateAccelerator (LPMSG, WORD) { return E_NOTIMPL; } + JUCE_COMRESULT GetWindow (HWND* lphwnd) { *lphwnd = window; return S_OK; } + JUCE_COMRESULT ContextSensitiveHelp (BOOL) { return E_NOTIMPL; } + JUCE_COMRESULT GetBorder (LPRECT) { return E_NOTIMPL; } + JUCE_COMRESULT RequestBorderSpace (LPCBORDERWIDTHS) { return E_NOTIMPL; } + JUCE_COMRESULT SetBorderSpace (LPCBORDERWIDTHS) { return E_NOTIMPL; } + JUCE_COMRESULT SetActiveObject (IOleInPlaceActiveObject*, LPCOLESTR) { return S_OK; } + JUCE_COMRESULT InsertMenus (HMENU, LPOLEMENUGROUPWIDTHS) { return E_NOTIMPL; } + JUCE_COMRESULT SetMenu (HMENU, HOLEMENU, HWND) { return S_OK; } + JUCE_COMRESULT RemoveMenus (HMENU) { return E_NOTIMPL; } + JUCE_COMRESULT SetStatusText (LPCOLESTR) { return S_OK; } + JUCE_COMRESULT EnableModeless (BOOL) { return S_OK; } + JUCE_COMRESULT TranslateAccelerator (LPMSG, WORD) { return E_NOTIMPL; } private: HWND window; @@ -252172,13 +252190,13 @@ namespace ActiveXHelpers frame->Release(); } - HRESULT __stdcall GetWindow (HWND* lphwnd) { *lphwnd = window; return S_OK; } - HRESULT __stdcall ContextSensitiveHelp (BOOL) { return E_NOTIMPL; } - HRESULT __stdcall CanInPlaceActivate() { return S_OK; } - HRESULT __stdcall OnInPlaceActivate() { return S_OK; } - HRESULT __stdcall OnUIActivate() { return S_OK; } + JUCE_COMRESULT GetWindow (HWND* lphwnd) { *lphwnd = window; return S_OK; } + JUCE_COMRESULT ContextSensitiveHelp (BOOL) { return E_NOTIMPL; } + JUCE_COMRESULT CanInPlaceActivate() { return S_OK; } + JUCE_COMRESULT OnInPlaceActivate() { return S_OK; } + JUCE_COMRESULT OnUIActivate() { return S_OK; } - HRESULT __stdcall GetWindowContext (LPOLEINPLACEFRAME* lplpFrame, LPOLEINPLACEUIWINDOW* lplpDoc, LPRECT, LPRECT, LPOLEINPLACEFRAMEINFO lpFrameInfo) + JUCE_COMRESULT GetWindowContext (LPOLEINPLACEFRAME* lplpFrame, LPOLEINPLACEUIWINDOW* lplpDoc, LPRECT, LPRECT, LPOLEINPLACEFRAMEINFO lpFrameInfo) { /* Note: if you call AddRef on the frame here, then some types of object (e.g. web browser control) cause leaks.. If you don't call AddRef then others crash (e.g. QuickTime).. Bit of a catch-22, so letting it leak is probably preferable. @@ -252192,12 +252210,12 @@ namespace ActiveXHelpers return S_OK; } - HRESULT __stdcall Scroll (SIZE) { return E_NOTIMPL; } - HRESULT __stdcall OnUIDeactivate (BOOL) { return S_OK; } - HRESULT __stdcall OnInPlaceDeactivate() { return S_OK; } - HRESULT __stdcall DiscardUndoState() { return E_NOTIMPL; } - HRESULT __stdcall DeactivateAndUndo() { return E_NOTIMPL; } - HRESULT __stdcall OnPosRectChange (LPCRECT) { return S_OK; } + JUCE_COMRESULT Scroll (SIZE) { return E_NOTIMPL; } + JUCE_COMRESULT OnUIDeactivate (BOOL) { return S_OK; } + JUCE_COMRESULT OnInPlaceDeactivate() { return S_OK; } + JUCE_COMRESULT DiscardUndoState() { return E_NOTIMPL; } + JUCE_COMRESULT DeactivateAndUndo() { return E_NOTIMPL; } + JUCE_COMRESULT OnPosRectChange (LPCRECT) { return S_OK; } private: HWND window; @@ -252216,7 +252234,7 @@ namespace ActiveXHelpers inplaceSite->Release(); } - HRESULT __stdcall QueryInterface (REFIID type, void** result) + JUCE_COMRESULT QueryInterface (REFIID type, void** result) { if (type == IID_IOleInPlaceSite) { @@ -252228,12 +252246,12 @@ namespace ActiveXHelpers return ComBaseClassHelper ::QueryInterface (type, result); } - HRESULT __stdcall SaveObject() { return E_NOTIMPL; } - HRESULT __stdcall GetMoniker (DWORD, DWORD, IMoniker**) { return E_NOTIMPL; } - HRESULT __stdcall GetContainer (LPOLECONTAINER* ppContainer) { *ppContainer = 0; return E_NOINTERFACE; } - HRESULT __stdcall ShowObject() { return S_OK; } - HRESULT __stdcall OnShowWindow (BOOL) { return E_NOTIMPL; } - HRESULT __stdcall RequestNewObjectLayout() { return E_NOTIMPL; } + JUCE_COMRESULT SaveObject() { return E_NOTIMPL; } + JUCE_COMRESULT GetMoniker (DWORD, DWORD, IMoniker**) { return E_NOTIMPL; } + JUCE_COMRESULT GetContainer (LPOLECONTAINER* ppContainer) { *ppContainer = 0; return E_NOINTERFACE; } + JUCE_COMRESULT ShowObject() { return S_OK; } + JUCE_COMRESULT OnShowWindow (BOOL) { return E_NOTIMPL; } + JUCE_COMRESULT RequestNewObjectLayout() { return E_NOTIMPL; } private: JuceIOleInPlaceSite* inplaceSite; @@ -253970,12 +253988,12 @@ private: { } - HRESULT __stdcall GetTypeInfoCount (UINT*) { return E_NOTIMPL; } - HRESULT __stdcall GetTypeInfo (UINT, LCID, ITypeInfo**) { return E_NOTIMPL; } - HRESULT __stdcall GetIDsOfNames (REFIID, LPOLESTR*, UINT, LCID, DISPID*) { return E_NOTIMPL; } + JUCE_COMRESULT GetTypeInfoCount (UINT*) { return E_NOTIMPL; } + JUCE_COMRESULT GetTypeInfo (UINT, LCID, ITypeInfo**) { return E_NOTIMPL; } + JUCE_COMRESULT GetIDsOfNames (REFIID, LPOLESTR*, UINT, LCID, DISPID*) { return E_NOTIMPL; } - HRESULT __stdcall Invoke (DISPID dispIdMember, REFIID /*riid*/, LCID /*lcid*/, WORD /*wFlags*/, DISPPARAMS* pDispParams, - VARIANT* /*pVarResult*/, EXCEPINFO* /*pExcepInfo*/, UINT* /*puArgErr*/) + JUCE_COMRESULT Invoke (DISPID dispIdMember, REFIID /*riid*/, LCID /*lcid*/, WORD /*wFlags*/, DISPPARAMS* pDispParams, + VARIANT* /*pVarResult*/, EXCEPINFO* /*pExcepInfo*/, UINT* /*puArgErr*/) { if (dispIdMember == DISPID_BEFORENAVIGATE2) { @@ -256003,7 +256021,7 @@ public: Release(); } - HRESULT __stdcall QueryCancel (boolean* pbCancel) + JUCE_COMRESULT QueryCancel (boolean* pbCancel) { if (listener != nullptr && ! shouldCancel) shouldCancel = listener->audioCDBurnProgress (progress); @@ -256013,7 +256031,7 @@ public: return S_OK; } - HRESULT __stdcall NotifyBlockProgress (long nCompleted, long nTotal) + JUCE_COMRESULT NotifyBlockProgress (long nCompleted, long nTotal) { progress = nCompleted / (float) nTotal; shouldCancel = listener != nullptr && listener->audioCDBurnProgress (progress); @@ -256021,13 +256039,13 @@ public: return E_NOTIMPL; } - HRESULT __stdcall NotifyPnPActivity (void) { return E_NOTIMPL; } - HRESULT __stdcall NotifyAddProgress (long /*nCompletedSteps*/, long /*nTotalSteps*/) { return E_NOTIMPL; } - HRESULT __stdcall NotifyTrackProgress (long /*nCurrentTrack*/, long /*nTotalTracks*/) { return E_NOTIMPL; } - HRESULT __stdcall NotifyPreparingBurn (long /*nEstimatedSeconds*/) { return E_NOTIMPL; } - HRESULT __stdcall NotifyClosingDisc (long /*nEstimatedSeconds*/) { return E_NOTIMPL; } - HRESULT __stdcall NotifyBurnComplete (HRESULT /*status*/) { return E_NOTIMPL; } - HRESULT __stdcall NotifyEraseComplete (HRESULT /*status*/) { return E_NOTIMPL; } + JUCE_COMRESULT NotifyPnPActivity (void) { return E_NOTIMPL; } + JUCE_COMRESULT NotifyAddProgress (long /*nCompletedSteps*/, long /*nTotalSteps*/) { return E_NOTIMPL; } + JUCE_COMRESULT NotifyTrackProgress (long /*nCurrentTrack*/, long /*nTotalTracks*/) { return E_NOTIMPL; } + JUCE_COMRESULT NotifyPreparingBurn (long /*nEstimatedSeconds*/) { return E_NOTIMPL; } + JUCE_COMRESULT NotifyClosingDisc (long /*nEstimatedSeconds*/) { return E_NOTIMPL; } + JUCE_COMRESULT NotifyBurnComplete (HRESULT /*status*/) { return E_NOTIMPL; } + JUCE_COMRESULT NotifyEraseComplete (HRESULT /*status*/) { return E_NOTIMPL; } class ScopedDiscOpener { @@ -260115,14 +260133,14 @@ private: public: SessionEventCallback (WASAPIDeviceBase& owner_) : owner (owner_) {} - HRESULT __stdcall OnDisplayNameChanged (LPCWSTR, LPCGUID) { return S_OK; } - HRESULT __stdcall OnIconPathChanged (LPCWSTR, LPCGUID) { return S_OK; } - HRESULT __stdcall OnSimpleVolumeChanged (float, BOOL, LPCGUID) { return S_OK; } - HRESULT __stdcall OnChannelVolumeChanged (DWORD, float*, DWORD, LPCGUID) { return S_OK; } - HRESULT __stdcall OnGroupingParamChanged (LPCGUID, LPCGUID) { return S_OK; } - HRESULT __stdcall OnStateChanged (AudioSessionState) { return S_OK; } + JUCE_COMRESULT OnDisplayNameChanged (LPCWSTR, LPCGUID) { return S_OK; } + JUCE_COMRESULT OnIconPathChanged (LPCWSTR, LPCGUID) { return S_OK; } + JUCE_COMRESULT OnSimpleVolumeChanged (float, BOOL, LPCGUID) { return S_OK; } + JUCE_COMRESULT OnChannelVolumeChanged (DWORD, float*, DWORD, LPCGUID) { return S_OK; } + JUCE_COMRESULT OnGroupingParamChanged (LPCGUID, LPCGUID) { return S_OK; } + JUCE_COMRESULT OnStateChanged (AudioSessionState) { return S_OK; } - HRESULT __stdcall OnSessionDisconnected (AudioSessionDisconnectReason reason) + JUCE_COMRESULT OnSessionDisconnected (AudioSessionDisconnectReason reason) { if (reason == DisconnectReasonFormatChanged) owner.deviceSampleRateChanged(); @@ -263785,7 +263803,7 @@ namespace LinuxStatsHelpers String getCpuInfo (const char* const key) { StringArray lines; - lines.addLines (File ("/proc/cpuinfo").loadFileAsString()); + File ("/proc/cpuinfo").readLines (lines); for (int i = lines.size(); --i >= 0;) // (NB - it's important that this runs in reverse order) if (lines[i].startsWithIgnoreCase (key)) @@ -270826,24 +270844,6 @@ namespace { return [NSString stringWithUTF8String: s.toUTF8()]; } - - template - const Rectangle convertToRectInt (const RectType& r) - { - return Rectangle ((int) r.origin.x, (int) r.origin.y, (int) r.size.width, (int) r.size.height); - } - - template - const Rectangle convertToRectFloat (const RectType& r) - { - return Rectangle (r.origin.x, r.origin.y, r.size.width, r.size.height); - } - - template - CGRect convertToCGRect (const RectType& r) - { - return CGRectMake ((CGFloat) r.getX(), (CGFloat) r.getY(), (CGFloat) r.getWidth(), (CGFloat) r.getHeight()); - } } ScopedAutoReleasePool::ScopedAutoReleasePool() @@ -274055,6 +274055,27 @@ void Font::getPlatformDefaultFontNames (String& defaultSans, String& defaultSeri // compiled on its own). #if JUCE_INCLUDED_FILE +namespace +{ + template + const Rectangle convertToRectInt (const RectType& r) + { + return Rectangle ((int) r.origin.x, (int) r.origin.y, (int) r.size.width, (int) r.size.height); + } + + template + const Rectangle convertToRectFloat (const RectType& r) + { + return Rectangle (r.origin.x, r.origin.y, r.size.width, r.size.height); + } + + template + CGRect convertToCGRect (const RectType& r) + { + return CGRectMake ((CGFloat) r.getX(), (CGFloat) r.getY(), (CGFloat) r.getWidth(), (CGFloat) r.getHeight()); + } +} + class CoreGraphicsImage : public Image::SharedImage { public: @@ -279315,6 +279336,27 @@ void Font::getPlatformDefaultFontNames (String& defaultSans, String& defaultSeri // compiled on its own). #if JUCE_INCLUDED_FILE +namespace +{ + template + const Rectangle convertToRectInt (const RectType& r) + { + return Rectangle ((int) r.origin.x, (int) r.origin.y, (int) r.size.width, (int) r.size.height); + } + + template + const Rectangle convertToRectFloat (const RectType& r) + { + return Rectangle (r.origin.x, r.origin.y, r.size.width, r.size.height); + } + + template + CGRect convertToCGRect (const RectType& r) + { + return CGRectMake ((CGFloat) r.getX(), (CGFloat) r.getY(), (CGFloat) r.getWidth(), (CGFloat) r.getHeight()); + } +} + class CoreGraphicsImage : public Image::SharedImage { public: @@ -281628,13 +281670,11 @@ BOOL NSViewComponentPeer::sendDragCallback (const int type, id { switch (type) { - case 0: handleFileDragMove (files, pos); break; - case 1: handleFileDragExit (files); break; - case 2: handleFileDragDrop (files, pos); break; + case 0: return handleFileDragMove (files, pos); + case 1: return handleFileDragExit (files); + case 2: return handleFileDragDrop (files, pos); default: jassertfalse; break; } - - return true; } return false; diff --git a/juce_amalgamated.h b/juce_amalgamated.h index 86a022d88b..4b4258d839 100644 --- a/juce_amalgamated.h +++ b/juce_amalgamated.h @@ -73,7 +73,7 @@ namespace JuceDummyNamespace {} */ #define JUCE_MAJOR_VERSION 1 #define JUCE_MINOR_VERSION 54 -#define JUCE_BUILDNUMBER 12 +#define JUCE_BUILDNUMBER 13 /** Current Juce version number. @@ -12790,6 +12790,11 @@ public: */ String loadFileAsString() const; + /** Reads the contents of this file as text and splits it into lines, which are + appended to the given StringArray. + */ + void readLines (StringArray& destLines) const; + /** Appends a block of binary data to the end of the file. This will try to write the given buffer to the end of the file. @@ -58146,6 +58151,14 @@ public: /** Invokes a click of one of the buttons. */ void triggerButtonClick (const String& buttonName); + /** If set to true and the window contains no buttons, then pressing the escape key will make + the alert cancel its modal state. + By default this setting is true - turn it off if you don't want the box to respond to + the escape key. Note that it is ignored if you have any buttons, and in that case you + should give the buttons appropriate keypresses to trigger cancelling if you want to. + */ + void setEscapeKeyCancels (bool shouldEscapeKeyCancel); + /** Adds a textbox to the window for entering strings. @param name an internal name for the text-box. This is the name to pass to @@ -58473,6 +58486,7 @@ private: StringArray textboxNames, comboBoxNames; Font font; Component* associatedComponent; + bool escapeKeyCancels; void updateLayout (bool onlyIncreaseSize); @@ -66196,9 +66210,9 @@ public: void handleUserClosingWindow(); - void handleFileDragMove (const StringArray& files, const Point& position); - void handleFileDragExit (const StringArray& files); - void handleFileDragDrop (const StringArray& files, const Point& position); + bool handleFileDragMove (const StringArray& files, const Point& position); + bool handleFileDragExit (const StringArray& files); + bool handleFileDragDrop (const StringArray& files, const Point& position); /** Resets the masking region. @@ -69675,6 +69689,7 @@ private: */ class WindowsRegistry { +public: /** Returns a string from the registry. diff --git a/src/audio/plugin_host/juce_PluginDirectoryScanner.cpp b/src/audio/plugin_host/juce_PluginDirectoryScanner.cpp index 6af33e5686..f31c657131 100644 --- a/src/audio/plugin_host/juce_PluginDirectoryScanner.cpp +++ b/src/audio/plugin_host/juce_PluginDirectoryScanner.cpp @@ -117,7 +117,7 @@ StringArray PluginDirectoryScanner::getDeadMansPedalFile() if (deadMansPedalFile != File::nonexistent) { - lines.addLines (deadMansPedalFile.loadFileAsString()); + deadMansPedalFile.readLines (lines); lines.removeEmptyStrings(); } diff --git a/src/core/juce_Initialisation.cpp b/src/core/juce_Initialisation.cpp deleted file mode 100644 index f9b904c4ff..0000000000 --- a/src/core/juce_Initialisation.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE 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 General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#include "juce_StandardHeader.h" - -BEGIN_JUCE_NAMESPACE - -//============================================================================== -#if JUCE_UNIT_TESTS - -#include "../utilities/juce_UnitTest.h" -#include "../memory/juce_Atomic.h" - -class AtomicTests : public UnitTest -{ -public: - AtomicTests() : UnitTest ("Atomics") {} - - void runTest() - { - beginTest ("Misc"); - - char a1[7]; - expect (numElementsInArray(a1) == 7); - int a2[3]; - expect (numElementsInArray(a2) == 3); - - expect (ByteOrder::swap ((uint16) 0x1122) == 0x2211); - expect (ByteOrder::swap ((uint32) 0x11223344) == 0x44332211); - expect (ByteOrder::swap ((uint64) literal64bit (0x1122334455667788)) == literal64bit (0x8877665544332211)); - - beginTest ("Atomic int"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic unsigned int"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic int32"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic uint32"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic long"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic void*"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic int*"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic float"); - AtomicTester ::testFloat (*this); - #if ! JUCE_64BIT_ATOMICS_UNAVAILABLE // 64-bit intrinsics aren't available on some old platforms - beginTest ("Atomic int64"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic uint64"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic double"); - AtomicTester ::testFloat (*this); - #endif - } - - template - class AtomicTester - { - public: - AtomicTester() {} - - static void testInteger (UnitTest& test) - { - Atomic a, b; - a.set ((Type) 10); - test.expect (a.value == (Type) 10); - test.expect (a.get() == (Type) 10); - a += (Type) 15; - test.expect (a.get() == (Type) 25); - a.memoryBarrier(); - a -= (Type) 5; - test.expect (a.get() == (Type) 20); - test.expect (++a == (Type) 21); - ++a; - test.expect (--a == (Type) 21); - test.expect (a.get() == (Type) 21); - a.memoryBarrier(); - - testFloat (test); - } - - static void testFloat (UnitTest& test) - { - Atomic a, b; - a = (Type) 21; - a.memoryBarrier(); - - /* These are some simple test cases to check the atomics - let me know - if any of these assertions fail on your system! - */ - test.expect (a.get() == (Type) 21); - test.expect (a.compareAndSetValue ((Type) 100, (Type) 50) == (Type) 21); - test.expect (a.get() == (Type) 21); - test.expect (a.compareAndSetValue ((Type) 101, a.get()) == (Type) 21); - test.expect (a.get() == (Type) 101); - test.expect (! a.compareAndSetBool ((Type) 300, (Type) 200)); - test.expect (a.get() == (Type) 101); - test.expect (a.compareAndSetBool ((Type) 200, a.get())); - test.expect (a.get() == (Type) 200); - - test.expect (a.exchange ((Type) 300) == (Type) 200); - test.expect (a.get() == (Type) 300); - - b = a; - test.expect (b.get() == a.get()); - } - }; -}; - -static AtomicTests atomicUnitTests; - -#endif - -END_JUCE_NAMESPACE diff --git a/src/core/juce_StandardHeader.h b/src/core/juce_StandardHeader.h index a480580eb9..a0cb33cf77 100644 --- a/src/core/juce_StandardHeader.h +++ b/src/core/juce_StandardHeader.h @@ -33,7 +33,7 @@ */ #define JUCE_MAJOR_VERSION 1 #define JUCE_MINOR_VERSION 54 -#define JUCE_BUILDNUMBER 12 +#define JUCE_BUILDNUMBER 13 /** Current Juce version number. diff --git a/src/gui/components/special/juce_OpenGLComponent.cpp b/src/gui/components/special/juce_OpenGLComponent.cpp index 7afbdcd281..14db1f9f2b 100644 --- a/src/gui/components/special/juce_OpenGLComponent.cpp +++ b/src/gui/components/special/juce_OpenGLComponent.cpp @@ -33,7 +33,7 @@ BEGIN_JUCE_NAMESPACE #include "../windows/juce_ComponentPeer.h" #include "../layout/juce_ComponentMovementWatcher.h" #include "../../../threads/juce_Thread.h" - +#include "../../../events/juce_MessageManager.h" //============================================================================== extern void juce_glViewport (const int w, const int h); @@ -177,6 +177,18 @@ public: void run() { + #if JUCE_LINUX + { + MessageManagerLock mml (this); + + if (! mml.lockWasGained()) + return; + + owner.updateContext(); + owner.updateContextPosition(); + } + #endif + while (! threadShouldExit()) { const uint32 startOfRendering = Time::getMillisecondCounter(); diff --git a/src/gui/components/windows/juce_AlertWindow.cpp b/src/gui/components/windows/juce_AlertWindow.cpp index baec3033a2..a9b2472d89 100644 --- a/src/gui/components/windows/juce_AlertWindow.cpp +++ b/src/gui/components/windows/juce_AlertWindow.cpp @@ -81,7 +81,8 @@ AlertWindow::AlertWindow (const String& title, Component* associatedComponent_) : TopLevelWindow (title, true), alertIconType (iconType), - associatedComponent (associatedComponent_) + associatedComponent (associatedComponent_), + escapeKeyCancels (true) { if (message.isEmpty()) text = " "; // to force an update if the message is empty @@ -114,7 +115,8 @@ AlertWindow::~AlertWindow() void AlertWindow::userTriedToCloseWindow() { - exitModalState (0); + if (escapeKeyCancels || buttons.size() > 0) + exitModalState (0); } //============================================================================== @@ -186,6 +188,11 @@ void AlertWindow::triggerButtonClick (const String& buttonName) } } +void AlertWindow::setEscapeKeyCancels (bool shouldEscapeKeyCancel) +{ + escapeKeyCancels = shouldEscapeKeyCancel; +} + //============================================================================== void AlertWindow::addTextEditor (const String& name, const String& initialContents, @@ -274,10 +281,6 @@ public: setColour (TextEditor::shadowColourId, Colours::transparentBlack); } - ~AlertTextComp() - { - } - int getPreferredWidth() const noexcept { return bestWidth; } void updateLayout (const int width) @@ -576,7 +579,7 @@ bool AlertWindow::keyPressed (const KeyPress& key) } } - if (key.isKeyCode (KeyPress::escapeKey) && buttons.size() == 0) + if (key.isKeyCode (KeyPress::escapeKey) && escapeKeyCancels && buttons.size() == 0) { exitModalState (0); return true; diff --git a/src/gui/components/windows/juce_AlertWindow.h b/src/gui/components/windows/juce_AlertWindow.h index 968bee717f..238be48015 100644 --- a/src/gui/components/windows/juce_AlertWindow.h +++ b/src/gui/components/windows/juce_AlertWindow.h @@ -117,6 +117,14 @@ public: /** Invokes a click of one of the buttons. */ void triggerButtonClick (const String& buttonName); + /** If set to true and the window contains no buttons, then pressing the escape key will make + the alert cancel its modal state. + By default this setting is true - turn it off if you don't want the box to respond to + the escape key. Note that it is ignored if you have any buttons, and in that case you + should give the buttons appropriate keypresses to trigger cancelling if you want to. + */ + void setEscapeKeyCancels (bool shouldEscapeKeyCancel); + //============================================================================== /** Adds a textbox to the window for entering strings. @@ -454,6 +462,7 @@ private: StringArray textboxNames, comboBoxNames; Font font; Component* associatedComponent; + bool escapeKeyCancels; void updateLayout (bool onlyIncreaseSize); diff --git a/src/gui/components/windows/juce_ComponentPeer.cpp b/src/gui/components/windows/juce_ComponentPeer.cpp index 274c4f7ef3..3d6f26dd11 100644 --- a/src/gui/components/windows/juce_ComponentPeer.cpp +++ b/src/gui/components/windows/juce_ComponentPeer.cpp @@ -435,7 +435,7 @@ namespace ComponentPeerHelpers } } -void ComponentPeer::handleFileDragMove (const StringArray& files, const Point& position) +bool ComponentPeer::handleFileDragMove (const StringArray& files, const Point& position) { updateCurrentModifiers(); @@ -471,21 +471,22 @@ void ComponentPeer::handleFileDragMove (const StringArray& files, const Point (newTarget); - const Point pos (targetComp->getLocalPoint (component, position)); + if (newTarget == nullptr) + return false; - newTarget->fileDragMove (files, pos.getX(), pos.getY()); - } + Component* const targetComp = dynamic_cast (newTarget); + const Point pos (targetComp->getLocalPoint (component, position)); + newTarget->fileDragMove (files, pos.getX(), pos.getY()); + return true; } -void ComponentPeer::handleFileDragExit (const StringArray& files) +bool ComponentPeer::handleFileDragExit (const StringArray& files) { - handleFileDragMove (files, Point (-1, -1)); + const bool used = handleFileDragMove (files, Point (-1, -1)); jassert (dragAndDropTargetComponent == nullptr); lastDragAndDropCompUnderMouse = nullptr; + return used; } // We'll use an async message to deliver the drop, because if the target decides @@ -514,7 +515,7 @@ private: JUCE_DECLARE_NON_COPYABLE (AsyncFileDropMessage); }; -void ComponentPeer::handleFileDragDrop (const StringArray& files, const Point& position) +bool ComponentPeer::handleFileDragDrop (const StringArray& files, const Point& position) { handleFileDragMove (files, position); @@ -535,12 +536,15 @@ void ComponentPeer::handleFileDragDrop (const StringArray& files, const PointinternalModalInputAttempt(); if (targetComp->isCurrentlyBlockedByAnotherModalComponent()) - return; + return true; } (new AsyncFileDropMessage (targetComp, target, targetComp->getLocalPoint (component, position), files))->post(); + return true; } } + + return false; } //============================================================================== diff --git a/src/gui/components/windows/juce_ComponentPeer.h b/src/gui/components/windows/juce_ComponentPeer.h index 5dbbef05ce..85df987f47 100644 --- a/src/gui/components/windows/juce_ComponentPeer.h +++ b/src/gui/components/windows/juce_ComponentPeer.h @@ -313,9 +313,9 @@ public: void handleUserClosingWindow(); - void handleFileDragMove (const StringArray& files, const Point& position); - void handleFileDragExit (const StringArray& files); - void handleFileDragDrop (const StringArray& files, const Point& position); + bool handleFileDragMove (const StringArray& files, const Point& position); + bool handleFileDragExit (const StringArray& files); + bool handleFileDragDrop (const StringArray& files, const Point& position); //============================================================================== /** Resets the masking region. diff --git a/src/gui/components/windows/juce_ThreadWithProgressWindow.cpp b/src/gui/components/windows/juce_ThreadWithProgressWindow.cpp index 541f8a073a..4d3b6a2e11 100644 --- a/src/gui/components/windows/juce_ThreadWithProgressWindow.cpp +++ b/src/gui/components/windows/juce_ThreadWithProgressWindow.cpp @@ -47,6 +47,9 @@ ThreadWithProgressWindow::ThreadWithProgressWindow (const String& title, String::empty, String::empty, AlertWindow::NoIcon, hasCancelButton ? 1 : 0, 0); + // if there are no buttons, we won't allow the user to interrupt the thread. + alertWindow->setEscapeKeyCancels (false); + if (hasProgressBar) alertWindow->addProgressBarComponent (progress); } diff --git a/src/io/files/juce_File.cpp b/src/io/files/juce_File.cpp index 9b7fc88950..738e76f43f 100644 --- a/src/io/files/juce_File.cpp +++ b/src/io/files/juce_File.cpp @@ -509,6 +509,11 @@ String File::loadFileAsString() const return in.readEntireStreamAsString(); } +void File::readLines (StringArray& destLines) const +{ + destLines.addLines (loadFileAsString()); +} + //============================================================================== int File::findChildFiles (Array& results, const int whatToLookFor, diff --git a/src/io/files/juce_File.h b/src/io/files/juce_File.h index ee64b85779..b96c563435 100644 --- a/src/io/files/juce_File.h +++ b/src/io/files/juce_File.h @@ -607,6 +607,11 @@ public: */ String loadFileAsString() const; + /** Reads the contents of this file as text and splits it into lines, which are + appended to the given StringArray. + */ + void readLines (StringArray& destLines) const; + //============================================================================== /** Appends a block of binary data to the end of the file. diff --git a/src/native/linux/juce_linux_SystemStats.cpp b/src/native/linux/juce_linux_SystemStats.cpp index 2abce828f8..3db6341980 100644 --- a/src/native/linux/juce_linux_SystemStats.cpp +++ b/src/native/linux/juce_linux_SystemStats.cpp @@ -61,7 +61,7 @@ namespace LinuxStatsHelpers String getCpuInfo (const char* const key) { StringArray lines; - lines.addLines (File ("/proc/cpuinfo").loadFileAsString()); + File ("/proc/cpuinfo").readLines (lines); for (int i = lines.size(); --i >= 0;) // (NB - it's important that this runs in reverse order) if (lines[i].startsWithIgnoreCase (key)) diff --git a/src/native/mac/juce_mac_CoreGraphicsContext.mm b/src/native/mac/juce_mac_CoreGraphicsContext.mm index aea85a34cc..afa24c2415 100644 --- a/src/native/mac/juce_mac_CoreGraphicsContext.mm +++ b/src/native/mac/juce_mac_CoreGraphicsContext.mm @@ -27,6 +27,29 @@ // compiled on its own). #if JUCE_INCLUDED_FILE + +//============================================================================== +namespace +{ + template + const Rectangle convertToRectInt (const RectType& r) + { + return Rectangle ((int) r.origin.x, (int) r.origin.y, (int) r.size.width, (int) r.size.height); + } + + template + const Rectangle convertToRectFloat (const RectType& r) + { + return Rectangle (r.origin.x, r.origin.y, r.size.width, r.size.height); + } + + template + CGRect convertToCGRect (const RectType& r) + { + return CGRectMake ((CGFloat) r.getX(), (CGFloat) r.getY(), (CGFloat) r.getWidth(), (CGFloat) r.getHeight()); + } +} + //============================================================================== class CoreGraphicsImage : public Image::SharedImage { diff --git a/src/native/mac/juce_mac_NSViewComponentPeer.mm b/src/native/mac/juce_mac_NSViewComponentPeer.mm index 7eda3a4dce..59d3213190 100644 --- a/src/native/mac/juce_mac_NSViewComponentPeer.mm +++ b/src/native/mac/juce_mac_NSViewComponentPeer.mm @@ -1491,13 +1491,11 @@ BOOL NSViewComponentPeer::sendDragCallback (const int type, id { switch (type) { - case 0: handleFileDragMove (files, pos); break; - case 1: handleFileDragExit (files); break; - case 2: handleFileDragDrop (files, pos); break; + case 0: return handleFileDragMove (files, pos); + case 1: return handleFileDragExit (files); + case 2: return handleFileDragDrop (files, pos); default: jassertfalse; break; } - - return true; } return false; diff --git a/src/native/mac/juce_osx_ObjCHelpers.h b/src/native/mac/juce_osx_ObjCHelpers.h index 468e5fe51a..68b6b92aef 100644 --- a/src/native/mac/juce_osx_ObjCHelpers.h +++ b/src/native/mac/juce_osx_ObjCHelpers.h @@ -42,25 +42,6 @@ namespace { return [NSString stringWithUTF8String: s.toUTF8()]; } - - //============================================================================== - template - const Rectangle convertToRectInt (const RectType& r) - { - return Rectangle ((int) r.origin.x, (int) r.origin.y, (int) r.size.width, (int) r.size.height); - } - - template - const Rectangle convertToRectFloat (const RectType& r) - { - return Rectangle (r.origin.x, r.origin.y, r.size.width, r.size.height); - } - - template - CGRect convertToCGRect (const RectType& r) - { - return CGRectMake ((CGFloat) r.getX(), (CGFloat) r.getY(), (CGFloat) r.getWidth(), (CGFloat) r.getHeight()); - } } //============================================================================== diff --git a/src/native/windows/juce_win32_ActiveXComponent.cpp b/src/native/windows/juce_win32_ActiveXComponent.cpp index 965ab49a23..c69cb01581 100644 --- a/src/native/windows/juce_win32_ActiveXComponent.cpp +++ b/src/native/windows/juce_win32_ActiveXComponent.cpp @@ -35,21 +35,21 @@ namespace ActiveXHelpers public: JuceIStorage() {} - HRESULT __stdcall CreateStream (const WCHAR*, DWORD, DWORD, DWORD, IStream**) { return E_NOTIMPL; } - HRESULT __stdcall OpenStream (const WCHAR*, void*, DWORD, DWORD, IStream**) { return E_NOTIMPL; } - HRESULT __stdcall CreateStorage (const WCHAR*, DWORD, DWORD, DWORD, IStorage**) { return E_NOTIMPL; } - HRESULT __stdcall OpenStorage (const WCHAR*, IStorage*, DWORD, SNB, DWORD, IStorage**) { return E_NOTIMPL; } - HRESULT __stdcall CopyTo (DWORD, IID const*, SNB, IStorage*) { return E_NOTIMPL; } - HRESULT __stdcall MoveElementTo (const OLECHAR*,IStorage*, const OLECHAR*, DWORD) { return E_NOTIMPL; } - HRESULT __stdcall Commit (DWORD) { return E_NOTIMPL; } - HRESULT __stdcall Revert() { return E_NOTIMPL; } - HRESULT __stdcall EnumElements (DWORD, void*, DWORD, IEnumSTATSTG**) { return E_NOTIMPL; } - HRESULT __stdcall DestroyElement (const OLECHAR*) { return E_NOTIMPL; } - HRESULT __stdcall RenameElement (const WCHAR*, const WCHAR*) { return E_NOTIMPL; } - HRESULT __stdcall SetElementTimes (const WCHAR*, FILETIME const*, FILETIME const*, FILETIME const*) { return E_NOTIMPL; } - HRESULT __stdcall SetClass (REFCLSID) { return S_OK; } - HRESULT __stdcall SetStateBits (DWORD, DWORD) { return E_NOTIMPL; } - HRESULT __stdcall Stat (STATSTG*, DWORD) { return E_NOTIMPL; } + JUCE_COMRESULT CreateStream (const WCHAR*, DWORD, DWORD, DWORD, IStream**) { return E_NOTIMPL; } + JUCE_COMRESULT OpenStream (const WCHAR*, void*, DWORD, DWORD, IStream**) { return E_NOTIMPL; } + JUCE_COMRESULT CreateStorage (const WCHAR*, DWORD, DWORD, DWORD, IStorage**) { return E_NOTIMPL; } + JUCE_COMRESULT OpenStorage (const WCHAR*, IStorage*, DWORD, SNB, DWORD, IStorage**) { return E_NOTIMPL; } + JUCE_COMRESULT CopyTo (DWORD, IID const*, SNB, IStorage*) { return E_NOTIMPL; } + JUCE_COMRESULT MoveElementTo (const OLECHAR*,IStorage*, const OLECHAR*, DWORD) { return E_NOTIMPL; } + JUCE_COMRESULT Commit (DWORD) { return E_NOTIMPL; } + JUCE_COMRESULT Revert() { return E_NOTIMPL; } + JUCE_COMRESULT EnumElements (DWORD, void*, DWORD, IEnumSTATSTG**) { return E_NOTIMPL; } + JUCE_COMRESULT DestroyElement (const OLECHAR*) { return E_NOTIMPL; } + JUCE_COMRESULT RenameElement (const WCHAR*, const WCHAR*) { return E_NOTIMPL; } + JUCE_COMRESULT SetElementTimes (const WCHAR*, FILETIME const*, FILETIME const*, FILETIME const*) { return E_NOTIMPL; } + JUCE_COMRESULT SetClass (REFCLSID) { return S_OK; } + JUCE_COMRESULT SetStateBits (DWORD, DWORD) { return E_NOTIMPL; } + JUCE_COMRESULT Stat (STATSTG*, DWORD) { return E_NOTIMPL; } }; //============================================================================== @@ -58,18 +58,18 @@ namespace ActiveXHelpers public: JuceOleInPlaceFrame (HWND window_) : window (window_) {} - HRESULT __stdcall GetWindow (HWND* lphwnd) { *lphwnd = window; return S_OK; } - HRESULT __stdcall ContextSensitiveHelp (BOOL) { return E_NOTIMPL; } - HRESULT __stdcall GetBorder (LPRECT) { return E_NOTIMPL; } - HRESULT __stdcall RequestBorderSpace (LPCBORDERWIDTHS) { return E_NOTIMPL; } - HRESULT __stdcall SetBorderSpace (LPCBORDERWIDTHS) { return E_NOTIMPL; } - HRESULT __stdcall SetActiveObject (IOleInPlaceActiveObject*, LPCOLESTR) { return S_OK; } - HRESULT __stdcall InsertMenus (HMENU, LPOLEMENUGROUPWIDTHS) { return E_NOTIMPL; } - HRESULT __stdcall SetMenu (HMENU, HOLEMENU, HWND) { return S_OK; } - HRESULT __stdcall RemoveMenus (HMENU) { return E_NOTIMPL; } - HRESULT __stdcall SetStatusText (LPCOLESTR) { return S_OK; } - HRESULT __stdcall EnableModeless (BOOL) { return S_OK; } - HRESULT __stdcall TranslateAccelerator (LPMSG, WORD) { return E_NOTIMPL; } + JUCE_COMRESULT GetWindow (HWND* lphwnd) { *lphwnd = window; return S_OK; } + JUCE_COMRESULT ContextSensitiveHelp (BOOL) { return E_NOTIMPL; } + JUCE_COMRESULT GetBorder (LPRECT) { return E_NOTIMPL; } + JUCE_COMRESULT RequestBorderSpace (LPCBORDERWIDTHS) { return E_NOTIMPL; } + JUCE_COMRESULT SetBorderSpace (LPCBORDERWIDTHS) { return E_NOTIMPL; } + JUCE_COMRESULT SetActiveObject (IOleInPlaceActiveObject*, LPCOLESTR) { return S_OK; } + JUCE_COMRESULT InsertMenus (HMENU, LPOLEMENUGROUPWIDTHS) { return E_NOTIMPL; } + JUCE_COMRESULT SetMenu (HMENU, HOLEMENU, HWND) { return S_OK; } + JUCE_COMRESULT RemoveMenus (HMENU) { return E_NOTIMPL; } + JUCE_COMRESULT SetStatusText (LPCOLESTR) { return S_OK; } + JUCE_COMRESULT EnableModeless (BOOL) { return S_OK; } + JUCE_COMRESULT TranslateAccelerator (LPMSG, WORD) { return E_NOTIMPL; } private: HWND window; @@ -89,13 +89,13 @@ namespace ActiveXHelpers frame->Release(); } - HRESULT __stdcall GetWindow (HWND* lphwnd) { *lphwnd = window; return S_OK; } - HRESULT __stdcall ContextSensitiveHelp (BOOL) { return E_NOTIMPL; } - HRESULT __stdcall CanInPlaceActivate() { return S_OK; } - HRESULT __stdcall OnInPlaceActivate() { return S_OK; } - HRESULT __stdcall OnUIActivate() { return S_OK; } + JUCE_COMRESULT GetWindow (HWND* lphwnd) { *lphwnd = window; return S_OK; } + JUCE_COMRESULT ContextSensitiveHelp (BOOL) { return E_NOTIMPL; } + JUCE_COMRESULT CanInPlaceActivate() { return S_OK; } + JUCE_COMRESULT OnInPlaceActivate() { return S_OK; } + JUCE_COMRESULT OnUIActivate() { return S_OK; } - HRESULT __stdcall GetWindowContext (LPOLEINPLACEFRAME* lplpFrame, LPOLEINPLACEUIWINDOW* lplpDoc, LPRECT, LPRECT, LPOLEINPLACEFRAMEINFO lpFrameInfo) + JUCE_COMRESULT GetWindowContext (LPOLEINPLACEFRAME* lplpFrame, LPOLEINPLACEUIWINDOW* lplpDoc, LPRECT, LPRECT, LPOLEINPLACEFRAMEINFO lpFrameInfo) { /* Note: if you call AddRef on the frame here, then some types of object (e.g. web browser control) cause leaks.. If you don't call AddRef then others crash (e.g. QuickTime).. Bit of a catch-22, so letting it leak is probably preferable. @@ -109,12 +109,12 @@ namespace ActiveXHelpers return S_OK; } - HRESULT __stdcall Scroll (SIZE) { return E_NOTIMPL; } - HRESULT __stdcall OnUIDeactivate (BOOL) { return S_OK; } - HRESULT __stdcall OnInPlaceDeactivate() { return S_OK; } - HRESULT __stdcall DiscardUndoState() { return E_NOTIMPL; } - HRESULT __stdcall DeactivateAndUndo() { return E_NOTIMPL; } - HRESULT __stdcall OnPosRectChange (LPCRECT) { return S_OK; } + JUCE_COMRESULT Scroll (SIZE) { return E_NOTIMPL; } + JUCE_COMRESULT OnUIDeactivate (BOOL) { return S_OK; } + JUCE_COMRESULT OnInPlaceDeactivate() { return S_OK; } + JUCE_COMRESULT DiscardUndoState() { return E_NOTIMPL; } + JUCE_COMRESULT DeactivateAndUndo() { return E_NOTIMPL; } + JUCE_COMRESULT OnPosRectChange (LPCRECT) { return S_OK; } private: HWND window; @@ -134,7 +134,7 @@ namespace ActiveXHelpers inplaceSite->Release(); } - HRESULT __stdcall QueryInterface (REFIID type, void** result) + JUCE_COMRESULT QueryInterface (REFIID type, void** result) { if (type == IID_IOleInPlaceSite) { @@ -146,12 +146,12 @@ namespace ActiveXHelpers return ComBaseClassHelper ::QueryInterface (type, result); } - HRESULT __stdcall SaveObject() { return E_NOTIMPL; } - HRESULT __stdcall GetMoniker (DWORD, DWORD, IMoniker**) { return E_NOTIMPL; } - HRESULT __stdcall GetContainer (LPOLECONTAINER* ppContainer) { *ppContainer = 0; return E_NOINTERFACE; } - HRESULT __stdcall ShowObject() { return S_OK; } - HRESULT __stdcall OnShowWindow (BOOL) { return E_NOTIMPL; } - HRESULT __stdcall RequestNewObjectLayout() { return E_NOTIMPL; } + JUCE_COMRESULT SaveObject() { return E_NOTIMPL; } + JUCE_COMRESULT GetMoniker (DWORD, DWORD, IMoniker**) { return E_NOTIMPL; } + JUCE_COMRESULT GetContainer (LPOLECONTAINER* ppContainer) { *ppContainer = 0; return E_NOINTERFACE; } + JUCE_COMRESULT ShowObject() { return S_OK; } + JUCE_COMRESULT OnShowWindow (BOOL) { return E_NOTIMPL; } + JUCE_COMRESULT RequestNewObjectLayout() { return E_NOTIMPL; } private: JuceIOleInPlaceSite* inplaceSite; diff --git a/src/native/windows/juce_win32_AudioCDReader.cpp b/src/native/windows/juce_win32_AudioCDReader.cpp index 033ea31e1a..ac0bb783a2 100644 --- a/src/native/windows/juce_win32_AudioCDReader.cpp +++ b/src/native/windows/juce_win32_AudioCDReader.cpp @@ -1405,7 +1405,7 @@ public: Release(); } - HRESULT __stdcall QueryCancel (boolean* pbCancel) + JUCE_COMRESULT QueryCancel (boolean* pbCancel) { if (listener != nullptr && ! shouldCancel) shouldCancel = listener->audioCDBurnProgress (progress); @@ -1415,7 +1415,7 @@ public: return S_OK; } - HRESULT __stdcall NotifyBlockProgress (long nCompleted, long nTotal) + JUCE_COMRESULT NotifyBlockProgress (long nCompleted, long nTotal) { progress = nCompleted / (float) nTotal; shouldCancel = listener != nullptr && listener->audioCDBurnProgress (progress); @@ -1423,13 +1423,13 @@ public: return E_NOTIMPL; } - HRESULT __stdcall NotifyPnPActivity (void) { return E_NOTIMPL; } - HRESULT __stdcall NotifyAddProgress (long /*nCompletedSteps*/, long /*nTotalSteps*/) { return E_NOTIMPL; } - HRESULT __stdcall NotifyTrackProgress (long /*nCurrentTrack*/, long /*nTotalTracks*/) { return E_NOTIMPL; } - HRESULT __stdcall NotifyPreparingBurn (long /*nEstimatedSeconds*/) { return E_NOTIMPL; } - HRESULT __stdcall NotifyClosingDisc (long /*nEstimatedSeconds*/) { return E_NOTIMPL; } - HRESULT __stdcall NotifyBurnComplete (HRESULT /*status*/) { return E_NOTIMPL; } - HRESULT __stdcall NotifyEraseComplete (HRESULT /*status*/) { return E_NOTIMPL; } + JUCE_COMRESULT NotifyPnPActivity (void) { return E_NOTIMPL; } + JUCE_COMRESULT NotifyAddProgress (long /*nCompletedSteps*/, long /*nTotalSteps*/) { return E_NOTIMPL; } + JUCE_COMRESULT NotifyTrackProgress (long /*nCurrentTrack*/, long /*nTotalTracks*/) { return E_NOTIMPL; } + JUCE_COMRESULT NotifyPreparingBurn (long /*nEstimatedSeconds*/) { return E_NOTIMPL; } + JUCE_COMRESULT NotifyClosingDisc (long /*nEstimatedSeconds*/) { return E_NOTIMPL; } + JUCE_COMRESULT NotifyBurnComplete (HRESULT /*status*/) { return E_NOTIMPL; } + JUCE_COMRESULT NotifyEraseComplete (HRESULT /*status*/) { return E_NOTIMPL; } class ScopedDiscOpener { diff --git a/src/native/windows/juce_win32_ComSmartPtr.h b/src/native/windows/juce_win32_ComSmartPtr.h index e60578618c..fcc29acf8c 100644 --- a/src/native/windows/juce_win32_ComSmartPtr.h +++ b/src/native/windows/juce_win32_ComSmartPtr.h @@ -63,11 +63,11 @@ public: HRESULT CoCreateInstance (REFCLSID classUUID, DWORD dwClsContext = CLSCTX_INPROC_SERVER) { - #ifndef __MINGW32__ + #ifndef __MINGW32__ return ::CoCreateInstance (classUUID, 0, dwClsContext, __uuidof (ComClass), (void**) resetAndGetPointerAddress()); - #else + #else return E_NOTIMPL; - #endif + #endif } template @@ -93,6 +93,9 @@ private: ComClass** operator&() throw(); // private to avoid it being used accidentally }; +//============================================================================== +#define JUCE_COMRESULT HRESULT __stdcall + //============================================================================== /** Handy base class for writing COM objects, providing ref-counting and a basic QueryInterface method. */ @@ -103,11 +106,11 @@ public: ComBaseClassHelper() : refCount (1) {} virtual ~ComBaseClassHelper() {} - HRESULT __stdcall QueryInterface (REFIID refId, void** result) + JUCE_COMRESULT QueryInterface (REFIID refId, void** result) { - #ifndef __MINGW32__ + #ifndef __MINGW32__ if (refId == __uuidof (ComClass)) { AddRef(); *result = dynamic_cast (this); return S_OK; } - #endif + #endif if (refId == IID_IUnknown) { AddRef(); *result = dynamic_cast (this); return S_OK; } diff --git a/src/native/windows/juce_win32_WASAPI.cpp b/src/native/windows/juce_win32_WASAPI.cpp index e68ae6ee2f..4f21894a4c 100644 --- a/src/native/windows/juce_win32_WASAPI.cpp +++ b/src/native/windows/juce_win32_WASAPI.cpp @@ -267,14 +267,14 @@ private: public: SessionEventCallback (WASAPIDeviceBase& owner_) : owner (owner_) {} - HRESULT __stdcall OnDisplayNameChanged (LPCWSTR, LPCGUID) { return S_OK; } - HRESULT __stdcall OnIconPathChanged (LPCWSTR, LPCGUID) { return S_OK; } - HRESULT __stdcall OnSimpleVolumeChanged (float, BOOL, LPCGUID) { return S_OK; } - HRESULT __stdcall OnChannelVolumeChanged (DWORD, float*, DWORD, LPCGUID) { return S_OK; } - HRESULT __stdcall OnGroupingParamChanged (LPCGUID, LPCGUID) { return S_OK; } - HRESULT __stdcall OnStateChanged (AudioSessionState) { return S_OK; } - - HRESULT __stdcall OnSessionDisconnected (AudioSessionDisconnectReason reason) + JUCE_COMRESULT OnDisplayNameChanged (LPCWSTR, LPCGUID) { return S_OK; } + JUCE_COMRESULT OnIconPathChanged (LPCWSTR, LPCGUID) { return S_OK; } + JUCE_COMRESULT OnSimpleVolumeChanged (float, BOOL, LPCGUID) { return S_OK; } + JUCE_COMRESULT OnChannelVolumeChanged (DWORD, float*, DWORD, LPCGUID) { return S_OK; } + JUCE_COMRESULT OnGroupingParamChanged (LPCGUID, LPCGUID) { return S_OK; } + JUCE_COMRESULT OnStateChanged (AudioSessionState) { return S_OK; } + + JUCE_COMRESULT OnSessionDisconnected (AudioSessionDisconnectReason reason) { if (reason == DisconnectReasonFormatChanged) owner.deviceSampleRateChanged(); diff --git a/src/native/windows/juce_win32_WebBrowserComponent.cpp b/src/native/windows/juce_win32_WebBrowserComponent.cpp index ed9c7bc65a..97b5007426 100644 --- a/src/native/windows/juce_win32_WebBrowserComponent.cpp +++ b/src/native/windows/juce_win32_WebBrowserComponent.cpp @@ -151,12 +151,12 @@ private: } //============================================================================== - HRESULT __stdcall GetTypeInfoCount (UINT*) { return E_NOTIMPL; } - HRESULT __stdcall GetTypeInfo (UINT, LCID, ITypeInfo**) { return E_NOTIMPL; } - HRESULT __stdcall GetIDsOfNames (REFIID, LPOLESTR*, UINT, LCID, DISPID*) { return E_NOTIMPL; } + JUCE_COMRESULT GetTypeInfoCount (UINT*) { return E_NOTIMPL; } + JUCE_COMRESULT GetTypeInfo (UINT, LCID, ITypeInfo**) { return E_NOTIMPL; } + JUCE_COMRESULT GetIDsOfNames (REFIID, LPOLESTR*, UINT, LCID, DISPID*) { return E_NOTIMPL; } - HRESULT __stdcall Invoke (DISPID dispIdMember, REFIID /*riid*/, LCID /*lcid*/, WORD /*wFlags*/, DISPPARAMS* pDispParams, - VARIANT* /*pVarResult*/, EXCEPINFO* /*pExcepInfo*/, UINT* /*puArgErr*/) + JUCE_COMRESULT Invoke (DISPID dispIdMember, REFIID /*riid*/, LCID /*lcid*/, WORD /*wFlags*/, DISPPARAMS* pDispParams, + VARIANT* /*pVarResult*/, EXCEPINFO* /*pExcepInfo*/, UINT* /*puArgErr*/) { if (dispIdMember == DISPID_BEFORENAVIGATE2) { diff --git a/src/native/windows/juce_win32_Windowing.cpp b/src/native/windows/juce_win32_Windowing.cpp index 3af31912f3..5312522729 100644 --- a/src/native/windows/juce_win32_Windowing.cpp +++ b/src/native/windows/juce_win32_Windowing.cpp @@ -1859,39 +1859,58 @@ private: { } - HRESULT __stdcall DragEnter (IDataObject* pDataObject, DWORD /*grfKeyState*/, POINTL mousePos, DWORD* pdwEffect) + JUCE_COMRESULT DragEnter (IDataObject* pDataObject, DWORD /*grfKeyState*/, POINTL mousePos, DWORD* pdwEffect) { updateFileList (pDataObject); - owner->handleFileDragMove (files, owner->globalToLocal (Point (mousePos.x, mousePos.y))); - *pdwEffect = DROPEFFECT_COPY; - return S_OK; + const bool wasWanted = owner->handleFileDragMove (files, owner->globalToLocal (Point (mousePos.x, mousePos.y))); + *pdwEffect = wasWanted ? DROPEFFECT_COPY : DROPEFFECT_NONE; + return wasWanted ? S_OK : S_FALSE; } - HRESULT __stdcall DragLeave() + JUCE_COMRESULT DragLeave() { owner->handleFileDragExit (files); return S_OK; } - HRESULT __stdcall DragOver (DWORD /*grfKeyState*/, POINTL mousePos, DWORD* pdwEffect) + JUCE_COMRESULT DragOver (DWORD /*grfKeyState*/, POINTL mousePos, DWORD* pdwEffect) { - owner->handleFileDragMove (files, owner->globalToLocal (Point (mousePos.x, mousePos.y))); - *pdwEffect = DROPEFFECT_COPY; - return S_OK; + const bool wasWanted = owner->handleFileDragMove (files, owner->globalToLocal (Point (mousePos.x, mousePos.y))); + *pdwEffect = wasWanted ? DROPEFFECT_COPY : DROPEFFECT_NONE; + return wasWanted ? S_OK : S_FALSE; } - HRESULT __stdcall Drop (IDataObject* pDataObject, DWORD /*grfKeyState*/, POINTL mousePos, DWORD* pdwEffect) + JUCE_COMRESULT Drop (IDataObject* pDataObject, DWORD /*grfKeyState*/, POINTL mousePos, DWORD* pdwEffect) { updateFileList (pDataObject); - owner->handleFileDragDrop (files, owner->globalToLocal (Point (mousePos.x, mousePos.y))); - *pdwEffect = DROPEFFECT_COPY; - return S_OK; + const bool wasWanted = owner->handleFileDragDrop (files, owner->globalToLocal (Point (mousePos.x, mousePos.y))); + *pdwEffect = wasWanted ? DROPEFFECT_COPY : DROPEFFECT_NONE; + return wasWanted ? S_OK : S_FALSE; } private: Win32ComponentPeer* const owner; StringArray files; + template + void parseFileList (const CharType* names, const SIZE_T totalLen) + { + unsigned int i = 0; + + for (;;) + { + unsigned int len = 0; + while (i + len < totalLen && names [i + len] != 0) + ++len; + + if (len == 0) + break; + + files.add (String (names + i, len)); + i += len + 1; + } + } + void updateFileList (IDataObject* const pDataObject) { files.clear(); @@ -1902,43 +1921,13 @@ private: if (pDataObject->GetData (&format, &medium) == S_OK) { const SIZE_T totalLen = GlobalSize (medium.hGlobal); - const LPDROPFILES pDropFiles = (const LPDROPFILES) GlobalLock (medium.hGlobal); - unsigned int i = 0; - - if (pDropFiles->fWide) - { - const WCHAR* const fname = (WCHAR*) addBytesToPointer (pDropFiles, sizeof (DROPFILES)); + const LPDROPFILES dropFiles = (const LPDROPFILES) GlobalLock (medium.hGlobal); + const void* const names = addBytesToPointer (dropFiles, sizeof (DROPFILES)); - for (;;) - { - unsigned int len = 0; - while (i + len < totalLen && fname [i + len] != 0) - ++len; - - if (len == 0) - break; - - files.add (String (fname + i, len)); - i += len + 1; - } - } + if (dropFiles->fWide) + parseFileList (static_cast (names), totalLen); else - { - const char* const fname = (const char*) addBytesToPointer (pDropFiles, sizeof (DROPFILES)); - - for (;;) - { - unsigned int len = 0; - while (i + len < totalLen && fname [i + len] != 0) - ++len; - - if (len == 0) - break; - - files.add (String (fname + i, len)); - i += len + 1; - } - } + parseFileList (static_cast (names), totalLen); GlobalUnlock (medium.hGlobal); } @@ -3127,7 +3116,7 @@ class JuceDropSource : public ComBaseClassHelper public: JuceDropSource() {} - HRESULT __stdcall QueryContinueDrag (BOOL escapePressed, DWORD keys) + JUCE_COMRESULT QueryContinueDrag (BOOL escapePressed, DWORD keys) { if (escapePressed) return DRAGDROP_S_CANCEL; @@ -3138,7 +3127,7 @@ public: return S_OK; } - HRESULT __stdcall GiveFeedback (DWORD) + JUCE_COMRESULT GiveFeedback (DWORD) { return DRAGDROP_S_USEDEFAULTCURSORS; } @@ -3154,7 +3143,7 @@ public: { } - HRESULT __stdcall Clone (IEnumFORMATETC** result) + JUCE_COMRESULT Clone (IEnumFORMATETC** result) { if (result == 0) return E_POINTER; @@ -3166,7 +3155,7 @@ public: return S_OK; } - HRESULT __stdcall Next (ULONG celt, LPFORMATETC lpFormatEtc, ULONG* pceltFetched) + JUCE_COMRESULT Next (ULONG celt, LPFORMATETC lpFormatEtc, ULONG* pceltFetched) { if (pceltFetched != nullptr) *pceltFetched = 0; @@ -3187,7 +3176,7 @@ public: return S_FALSE; } - HRESULT __stdcall Skip (ULONG celt) + JUCE_COMRESULT Skip (ULONG celt) { if (index + (int) celt >= 1) return S_FALSE; @@ -3196,7 +3185,7 @@ public: return S_OK; } - HRESULT __stdcall Reset() + JUCE_COMRESULT Reset() { index = 0; return S_OK; @@ -3237,7 +3226,7 @@ public: jassert (refCount == 0); } - HRESULT __stdcall GetData (FORMATETC* pFormatEtc, STGMEDIUM* pMedium) + JUCE_COMRESULT GetData (FORMATETC* pFormatEtc, STGMEDIUM* pMedium) { if ((pFormatEtc->tymed & format->tymed) != 0 && pFormatEtc->cfFormat == format->cfFormat @@ -3264,7 +3253,7 @@ public: return DV_E_FORMATETC; } - HRESULT __stdcall QueryGetData (FORMATETC* f) + JUCE_COMRESULT QueryGetData (FORMATETC* f) { if (f == 0) return E_INVALIDARG; @@ -3277,13 +3266,13 @@ public: return DV_E_FORMATETC; } - HRESULT __stdcall GetCanonicalFormatEtc (FORMATETC*, FORMATETC* pFormatEtcOut) + JUCE_COMRESULT GetCanonicalFormatEtc (FORMATETC*, FORMATETC* pFormatEtcOut) { pFormatEtcOut->ptd = 0; return E_NOTIMPL; } - HRESULT __stdcall EnumFormatEtc (DWORD direction, IEnumFORMATETC** result) + JUCE_COMRESULT EnumFormatEtc (DWORD direction, IEnumFORMATETC** result) { if (result == 0) return E_POINTER; @@ -3298,11 +3287,11 @@ public: return E_NOTIMPL; } - HRESULT __stdcall GetDataHere (FORMATETC*, STGMEDIUM*) { return DATA_E_FORMATETC; } - HRESULT __stdcall SetData (FORMATETC*, STGMEDIUM*, BOOL) { return E_NOTIMPL; } - HRESULT __stdcall DAdvise (FORMATETC*, DWORD, IAdviseSink*, DWORD*) { return OLE_E_ADVISENOTSUPPORTED; } - HRESULT __stdcall DUnadvise (DWORD) { return E_NOTIMPL; } - HRESULT __stdcall EnumDAdvise (IEnumSTATDATA**) { return OLE_E_ADVISENOTSUPPORTED; } + JUCE_COMRESULT GetDataHere (FORMATETC*, STGMEDIUM*) { return DATA_E_FORMATETC; } + JUCE_COMRESULT SetData (FORMATETC*, STGMEDIUM*, BOOL) { return E_NOTIMPL; } + JUCE_COMRESULT DAdvise (FORMATETC*, DWORD, IAdviseSink*, DWORD*) { return OLE_E_ADVISENOTSUPPORTED; } + JUCE_COMRESULT DUnadvise (DWORD) { return E_NOTIMPL; } + JUCE_COMRESULT EnumDAdvise (IEnumSTATDATA**) { return OLE_E_ADVISENOTSUPPORTED; } private: JuceDropSource* const dropSource; diff --git a/src/utilities/juce_WindowsRegistry.h b/src/utilities/juce_WindowsRegistry.h index 5dfeb3e8db..25fa78c7f2 100644 --- a/src/utilities/juce_WindowsRegistry.h +++ b/src/utilities/juce_WindowsRegistry.h @@ -34,6 +34,7 @@ */ class WindowsRegistry { +public: //============================================================================== /** Returns a string from the registry.