mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
Fixes for AU hosting and Button Value reference handling. Minor clean-ups.
This commit is contained in:
parent
52a90374df
commit
638a93d639
10 changed files with 58 additions and 64 deletions
|
|
@ -1031,6 +1031,8 @@ public:
|
|||
{
|
||||
const bool wasValid = isValid();
|
||||
|
||||
wrapper.setVisible (false);
|
||||
removeChildComponent (&wrapper);
|
||||
wrapper.setView (nil);
|
||||
|
||||
if (wasValid)
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@
|
|||
|
||||
BEGIN_JUCE_NAMESPACE
|
||||
|
||||
//==============================================================================
|
||||
bool NamedPipe::openExisting (const String& pipeName)
|
||||
{
|
||||
currentPipeName = pipeName;
|
||||
|
|
|
|||
|
|
@ -26,8 +26,6 @@
|
|||
#ifndef __JUCE_NAMEDPIPE_JUCEHEADER__
|
||||
#define __JUCE_NAMEDPIPE_JUCEHEADER__
|
||||
|
||||
#include "../threads/juce_CriticalSection.h"
|
||||
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
|
|
@ -102,7 +100,6 @@ private:
|
|||
class Pimpl;
|
||||
ScopedPointer<Pimpl> pimpl;
|
||||
String currentPipeName;
|
||||
CriticalSection lock;
|
||||
|
||||
bool openInternal (const String& pipeName, const bool createPipe);
|
||||
|
||||
|
|
|
|||
|
|
@ -132,8 +132,8 @@ void Button::setToggleState (const bool shouldBeOn,
|
|||
{
|
||||
if (shouldBeOn != lastToggleState)
|
||||
{
|
||||
if (isOn != shouldBeOn) // this test means that if the value is void rather than explicitly set to
|
||||
isOn = shouldBeOn; // false, it won't be changed unless the required value is true.
|
||||
if (getToggleState() != shouldBeOn) // this test means that if the value is void rather than explicitly set to
|
||||
isOn = shouldBeOn; // false, it won't be changed unless the required value is true.
|
||||
|
||||
lastToggleState = shouldBeOn;
|
||||
repaint();
|
||||
|
|
|
|||
|
|
@ -346,11 +346,13 @@ Image juce_createIconForFile (const File& file)
|
|||
//==============================================================================
|
||||
void SystemClipboard::copyTextToClipboard (const String& text)
|
||||
{
|
||||
[[NSPasteboard generalPasteboard] declareTypes: [NSArray arrayWithObject: NSStringPboardType]
|
||||
owner: nil];
|
||||
NSPasteboard* pb = [NSPasteboard generalPasteboard];
|
||||
|
||||
[[NSPasteboard generalPasteboard] setString: juceStringToNS (text)
|
||||
forType: NSStringPboardType];
|
||||
[pb declareTypes: [NSArray arrayWithObject: NSStringPboardType]
|
||||
owner: nil];
|
||||
|
||||
[pb setString: juceStringToNS (text)
|
||||
forType: NSStringPboardType];
|
||||
}
|
||||
|
||||
String SystemClipboard::getTextFromClipboard()
|
||||
|
|
|
|||
|
|
@ -108,19 +108,13 @@ public:
|
|||
//==============================================================================
|
||||
/** @internal */
|
||||
void paint (Graphics& g);
|
||||
/** @internal */
|
||||
void* originalWndProc;
|
||||
|
||||
private:
|
||||
class Pimpl;
|
||||
friend class Pimpl;
|
||||
friend class ScopedPointer <Pimpl>;
|
||||
ScopedPointer <Pimpl> control;
|
||||
bool mouseEventsAllowed;
|
||||
|
||||
void setControlBounds (const Rectangle<int>& bounds) const;
|
||||
void setControlVisible (bool b) const;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ActiveXControlComponent);
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -84,5 +84,4 @@ private:
|
|||
};
|
||||
|
||||
#endif
|
||||
|
||||
#endif // __JUCE_UIVIEWCOMPONENT_JUCEHEADER__
|
||||
|
|
|
|||
|
|
@ -75,9 +75,9 @@ public:
|
|||
if (wrapperWindow == 0)
|
||||
{
|
||||
Rect r;
|
||||
r.left = getScreenX();
|
||||
r.top = getScreenY();
|
||||
r.right = r.left + getWidth();
|
||||
r.left = getScreenX();
|
||||
r.top = getScreenY();
|
||||
r.right = r.left + getWidth();
|
||||
r.bottom = r.top + getHeight();
|
||||
|
||||
CreateNewWindow (kDocumentWindowClass,
|
||||
|
|
@ -101,10 +101,10 @@ public:
|
|||
{ kEventClassWindow, kEventWindowGetClickActivation },
|
||||
{ kEventClassWindow, kEventWindowHandleDeactivate },
|
||||
{ kEventClassWindow, kEventWindowBoundsChanging },
|
||||
{ kEventClassMouse, kEventMouseDown },
|
||||
{ kEventClassMouse, kEventMouseMoved },
|
||||
{ kEventClassMouse, kEventMouseDragged },
|
||||
{ kEventClassMouse, kEventMouseUp},
|
||||
{ kEventClassMouse, kEventMouseDown },
|
||||
{ kEventClassMouse, kEventMouseMoved },
|
||||
{ kEventClassMouse, kEventMouseDragged },
|
||||
{ kEventClassMouse, kEventMouseUp},
|
||||
{ kEventClassWindow, kEventWindowDrawContent },
|
||||
{ kEventClassWindow, kEventWindowShown },
|
||||
{ kEventClassWindow, kEventWindowHidden }
|
||||
|
|
@ -179,7 +179,7 @@ public:
|
|||
HIRect r;
|
||||
r.origin.x = 0;
|
||||
r.origin.y = 0;
|
||||
r.size.width = (float) getWidth();
|
||||
r.size.width = (float) getWidth();
|
||||
r.size.height = (float) getHeight();
|
||||
HIViewSetFrame (embeddedView, &r);
|
||||
}
|
||||
|
|
@ -187,9 +187,9 @@ public:
|
|||
if (wrapperWindow != 0)
|
||||
{
|
||||
Rect wr;
|
||||
wr.left = getScreenX();
|
||||
wr.top = getScreenY();
|
||||
wr.right = wr.left + getWidth();
|
||||
wr.left = getScreenX();
|
||||
wr.top = getScreenY();
|
||||
wr.right = wr.left + getWidth();
|
||||
wr.bottom = wr.top + getHeight();
|
||||
|
||||
SetWindowBounds (wrapperWindow, kWindowContentRgn, &wr);
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ public:
|
|||
|
||||
~Pimpl()
|
||||
{
|
||||
[view removeFromSuperview];
|
||||
removeFromParent();
|
||||
[view release];
|
||||
}
|
||||
|
||||
|
|
@ -77,10 +77,7 @@ public:
|
|||
|
||||
if (currentPeer != peer)
|
||||
{
|
||||
if ([view superview] != nil)
|
||||
[view removeFromSuperview]; // Must be careful not to call this unless it's required - e.g. some Apple AU views
|
||||
// override the call and use it as a sign that they're being deleted, which breaks everything..
|
||||
|
||||
removeFromParent();
|
||||
currentPeer = peer;
|
||||
|
||||
if (peer != nullptr)
|
||||
|
|
@ -111,6 +108,13 @@ private:
|
|||
Component& owner;
|
||||
ComponentPeer* currentPeer;
|
||||
|
||||
void removeFromParent()
|
||||
{
|
||||
if ([view superview] != nil)
|
||||
[view removeFromSuperview]; // Must be careful not to call this unless it's required - e.g. some Apple AU views
|
||||
// override the call and use it as a sign that they're being deleted, which breaks everything..
|
||||
}
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Pimpl);
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -205,14 +205,14 @@ namespace ActiveXHelpers
|
|||
class ActiveXControlComponent::Pimpl : public ComponentMovementWatcher
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
Pimpl (HWND hwnd, ActiveXControlComponent& owner_)
|
||||
: ComponentMovementWatcher (&owner_),
|
||||
owner (owner_),
|
||||
controlHWND (0),
|
||||
storage (new ActiveXHelpers::JuceIStorage()),
|
||||
clientSite (new ActiveXHelpers::JuceIOleClientSite (hwnd)),
|
||||
control (nullptr)
|
||||
control (nullptr),
|
||||
originalWndProc (0)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -228,16 +228,25 @@ public:
|
|||
storage->Release();
|
||||
}
|
||||
|
||||
void setControlBounds (const Rectangle<int>& bounds) const
|
||||
{
|
||||
if (controlHWND != 0)
|
||||
MoveWindow (controlHWND, bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight(), TRUE);
|
||||
}
|
||||
|
||||
void setControlVisible (bool shouldBeVisible) const
|
||||
{
|
||||
if (controlHWND != 0)
|
||||
ShowWindow (controlHWND, shouldBeVisible ? SW_SHOWNA : SW_HIDE);
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
void componentMovedOrResized (bool /*wasMoved*/, bool /*wasResized*/)
|
||||
{
|
||||
Component* const topComp = owner.getTopLevelComponent();
|
||||
|
||||
if (topComp->getPeer() != nullptr)
|
||||
{
|
||||
const Point<int> pos (topComp->getLocalPoint (&owner, Point<int>()));
|
||||
owner.setControlBounds (Rectangle<int> (pos.getX(), pos.getY(), owner.getWidth(), owner.getHeight()));
|
||||
}
|
||||
setControlBounds (topComp->getLocalArea (&owner, owner.getLocalBounds()));
|
||||
}
|
||||
|
||||
void componentPeerChanged()
|
||||
|
|
@ -247,7 +256,7 @@ public:
|
|||
|
||||
void componentVisibilityChanged()
|
||||
{
|
||||
owner.setControlVisible (owner.isShowing());
|
||||
setControlVisible (owner.isShowing());
|
||||
componentPeerChanged();
|
||||
}
|
||||
|
||||
|
|
@ -290,7 +299,7 @@ public:
|
|||
break;
|
||||
}
|
||||
|
||||
return CallWindowProc ((WNDPROC) ax->originalWndProc, hwnd, message, wParam, lParam);
|
||||
return CallWindowProc (ax->control->originalWndProc, hwnd, message, wParam, lParam);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -305,12 +314,13 @@ public:
|
|||
IStorage* storage;
|
||||
IOleClientSite* clientSite;
|
||||
IOleObject* control;
|
||||
WNDPROC originalWndProc;
|
||||
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
ActiveXControlComponent::ActiveXControlComponent()
|
||||
: originalWndProc (0),
|
||||
mouseEventsAllowed (true)
|
||||
: mouseEventsAllowed (true)
|
||||
{
|
||||
ActiveXHelpers::activeXComps.add (this);
|
||||
}
|
||||
|
|
@ -337,7 +347,7 @@ bool ActiveXControlComponent::createControl (const void* controlIID)
|
|||
|
||||
if (peer != nullptr)
|
||||
{
|
||||
const Point<int> pos (getTopLevelComponent()->getLocalPoint (this, Point<int>()));
|
||||
const Rectangle<int> bounds (getTopLevelComponent()->getLocalArea (this, getLocalBounds()));
|
||||
HWND hwnd = (HWND) peer->getNativeHandle();
|
||||
|
||||
ScopedPointer<Pimpl> newControl (new Pimpl (hwnd, *this));
|
||||
|
|
@ -352,21 +362,21 @@ bool ActiveXControlComponent::createControl (const void* controlIID)
|
|||
if (OleSetContainedObject (newControl->control, TRUE) == S_OK)
|
||||
{
|
||||
RECT rect;
|
||||
rect.left = pos.getX();
|
||||
rect.top = pos.getY();
|
||||
rect.right = pos.getX() + getWidth();
|
||||
rect.bottom = pos.getY() + getHeight();
|
||||
rect.left = bounds.getX();
|
||||
rect.top = bounds.getY();
|
||||
rect.right = bounds.getRight();
|
||||
rect.bottom = bounds.getBottom();
|
||||
|
||||
if (newControl->control->DoVerb (OLEIVERB_SHOW, 0, newControl->clientSite, 0, hwnd, &rect) == S_OK)
|
||||
{
|
||||
control = newControl;
|
||||
setControlBounds (Rectangle<int> (pos.getX(), pos.getY(), getWidth(), getHeight()));
|
||||
|
||||
control->controlHWND = ActiveXHelpers::getHWND (this);
|
||||
|
||||
if (control->controlHWND != 0)
|
||||
{
|
||||
originalWndProc = (void*) (pointer_sized_int) GetWindowLongPtr ((HWND) control->controlHWND, GWLP_WNDPROC);
|
||||
control->setControlBounds (bounds);
|
||||
|
||||
control->originalWndProc = (void*) (pointer_sized_int) GetWindowLongPtr ((HWND) control->controlHWND, GWLP_WNDPROC);
|
||||
SetWindowLongPtr ((HWND) control->controlHWND, GWLP_WNDPROC, (LONG_PTR) Pimpl::activeXHookWndProc);
|
||||
}
|
||||
|
||||
|
|
@ -382,7 +392,6 @@ bool ActiveXControlComponent::createControl (const void* controlIID)
|
|||
void ActiveXControlComponent::deleteControl()
|
||||
{
|
||||
control = nullptr;
|
||||
originalWndProc = 0;
|
||||
}
|
||||
|
||||
void* ActiveXControlComponent::queryInterface (const void* iid) const
|
||||
|
|
@ -396,18 +405,6 @@ void* ActiveXControlComponent::queryInterface (const void* iid) const
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
void ActiveXControlComponent::setControlBounds (const Rectangle<int>& newBounds) const
|
||||
{
|
||||
if (control->controlHWND != 0)
|
||||
MoveWindow (control->controlHWND, newBounds.getX(), newBounds.getY(), newBounds.getWidth(), newBounds.getHeight(), TRUE);
|
||||
}
|
||||
|
||||
void ActiveXControlComponent::setControlVisible (const bool shouldBeVisible) const
|
||||
{
|
||||
if (control->controlHWND != 0)
|
||||
ShowWindow (control->controlHWND, shouldBeVisible ? SW_SHOWNA : SW_HIDE);
|
||||
}
|
||||
|
||||
void ActiveXControlComponent::setMouseEventsAllowed (const bool eventsCanReachControl)
|
||||
{
|
||||
mouseEventsAllowed = eventsCanReachControl;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue