PluginContainerQt.cpp [plain text]
#include "config.h"
#include "PluginContainerQt.h"
#include "FocusController.h"
#include "Frame.h"
#include "FrameView.h"
#include "Page.h"
#include "PlatformKeyboardEvent.h"
#include "PlatformWheelEvent.h"
#include "PluginView.h"
#include <QApplication>
#include <QX11Info>
using namespace WebCore;
PluginClientWrapper::PluginClientWrapper(QWidget* parent, WId client)
: QWidget(0, Qt::Popup)
{
create(client, false, true);
m_parent = parent;
}
PluginClientWrapper::~PluginClientWrapper()
{
destroy(false, false);
}
bool PluginClientWrapper::x11Event(XEvent* event)
{
event->xany.window = m_parent->parentWidget()->winId();
static_cast<QApplication*>(QApplication::instance())->x11ProcessEvent(event);
return true;
}
PluginContainerQt::PluginContainerQt(PluginView* view, QWidget* parent)
: QX11EmbedContainer(parent)
, m_pluginView(view)
, m_clientWrapper(0)
{
connect(this, SIGNAL(clientClosed()), this, SLOT(on_clientClosed()));
connect(this, SIGNAL(clientIsEmbedded()), this, SLOT(on_clientIsEmbedded()));
}
PluginContainerQt::~PluginContainerQt()
{
delete m_clientWrapper;
m_pluginView->setPlatformPluginWidget(0);
}
void PluginContainerQt::on_clientClosed()
{
delete m_clientWrapper;
m_clientWrapper = 0;
}
void PluginContainerQt::on_clientIsEmbedded()
{
delete m_clientWrapper;
m_clientWrapper = 0;
if (!QWidget::find(clientWinId()))
m_clientWrapper = new PluginClientWrapper(this, clientWinId());
}
void PluginContainerQt::redirectWheelEventsToParent(bool enable)
{
for (int buttonNo = 4; buttonNo < 8; buttonNo++) {
if (enable)
XGrabButton(x11Info().display(), buttonNo, AnyModifier, clientWinId(),
false, ButtonPressMask, GrabModeAsync, GrabModeAsync, 0L, 0L);
else
XUngrabButton(x11Info().display(), buttonNo, AnyModifier, clientWinId());
}
}
bool PluginContainerQt::x11Event(XEvent* event)
{
switch (event->type) {
case EnterNotify:
redirectWheelEventsToParent(!hasFocus());
break;
case LeaveNotify:
redirectWheelEventsToParent(false);
break;
}
return QX11EmbedContainer::x11Event(event);
}
void PluginContainerQt::focusInEvent(QFocusEvent* event)
{
redirectWheelEventsToParent(false);
if (Page* page = m_pluginView->parentFrame()->page())
page->focusController()->setActive(true);
m_pluginView->focusPluginElement();
}
void PluginContainerQt::focusOutEvent(QFocusEvent*)
{
if (Page* page = m_pluginView->parentFrame()->page())
page->focusController()->setActive(false);
}