extern "C" NPError
NPP_SetWindow(NPP instance, NPWindow* window)
{
    if (!instance)
	return NPERR_INVALID_INSTANCE_ERROR;

    QtNPInstance* This = (QtNPInstance*) instance->pdata;
    extern void qtns_setGeometry(QtNPInstance*, const QRect &, const QRect &);

    const QRect clipRect(window->clipRect.left, window->clipRect.top,
                         window->clipRect.right - window->clipRect.left,
                         window->clipRect.bottom - window->clipRect.top);
    if (window)
        This->geometry = QRect(window->x, window->y, window->width, window->height);

    // take a shortcut if all that was changed is the geometry
    if (qobject_cast<QWidget*>(This->qt.object) && window && This->window == (QtNPInstance::Widget)window->window) {
        qtns_setGeometry(This, This->geometry, clipRect);
	return NPERR_NO_ERROR;
    }

	delete This->qt.object;
	This->qt.object = 0;
	extern void qtns_destroy(QtNPInstance *This);
	qtns_destroy(This);

    if (!window) {
        This->window = 0;
	return NPERR_NO_ERROR;
    }

    This->window = (QtNPInstance::Widget)window->window;
#ifdef Q_WS_X11
    //This->display = ((NPSetWindowCallbackStruct *)window->ws_info)->display;
#endif

    extern void qtns_initialize(QtNPInstance*);
    qtns_initialize(This);

    next_pi = This;
    This->qt.object = qtNPFactory()->createObject(This->mimetype);
    next_pi = 0;

    if (!This->qt.object)
        return NPERR_NO_ERROR;

    if (!This->htmlID.isEmpty())
        This->qt.object->setObjectName(QLatin1String(This->htmlID));

    This->filter = new QtSignalForwarder(This);
    QStatusBar *statusbar = qFindChild<QStatusBar*>(This->qt.object);
    if (statusbar) {
        int statusSignal = statusbar->metaObject()->indexOfSignal("messageChanged(QString)");
        if (statusSignal != -1) {
            QMetaObject::connect(statusbar, statusSignal, This->filter, -1);
            statusbar->hide();
        }
    }

    const QMetaObject *mo = This->qt.object->metaObject();
    for (int p = 0; p < mo->propertyCount(); ++p) {
        const QMetaProperty property = mo->property(p);
        QByteArray name(property.name());
        QVariant value = This->parameters.value(name.toLower());
        if (value.isValid())
            property.write(This->qt.object, value);
    }
    for (int methodIndex = 0; methodIndex < mo->methodCount(); ++methodIndex) {
        const QMetaMethod method = mo->method(methodIndex);
        if (method.methodType() == QMetaMethod::Signal)
            QMetaObject::connect(This->qt.object, methodIndex, This->filter, methodIndex);
    }

    if (This->pendingStream) {
        This->pendingStream->finish(This->bindable);
        This->pendingStream = 0;
    }

    if (!qobject_cast<QWidget*>(This->qt.object))
	return NPERR_NO_ERROR;

    extern void qtns_embed(QtNPInstance*);
    qtns_embed(This);

    QEvent e(QEvent::EmbeddingControl);
    QApplication::sendEvent(This->qt.widget, &e);

    if (!This->qt.widget->testAttribute(Qt::WA_PaintOnScreen))
        This->qt.widget->setAutoFillBackground(true);
    This->qt.widget->raise();
    qtns_setGeometry(This, This->geometry, clipRect);
    This->qt.widget->show();

    return NPERR_NO_ERROR;
}