rpms/kdebase/F-8 kdebase-3.5.8-flash.patch, 1.1, 1.2 kdebase.spec, 1.285, 1.286

Lukas Tinkl (ltinkl) fedora-extras-commits at redhat.com
Tue Jan 29 15:03:41 UTC 2008


Author: ltinkl

Update of /cvs/extras/rpms/kdebase/F-8
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv21343/F-8

Modified Files:
	kdebase-3.5.8-flash.patch kdebase.spec 
Log Message:
update nsplugins patch (64 bit support)


kdebase-3.5.8-flash.patch:

Index: kdebase-3.5.8-flash.patch
===================================================================
RCS file: /cvs/extras/rpms/kdebase/F-8/kdebase-3.5.8-flash.patch,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- kdebase-3.5.8-flash.patch	14 Dec 2007 18:47:54 -0000	1.1
+++ kdebase-3.5.8-flash.patch	29 Jan 2008 15:03:32 -0000	1.2
@@ -1,17 +1,37 @@
-diff -up kdebase-3.5.8/nsplugins/nspluginloader.cpp.flash kdebase-3.5.8/nsplugins/nspluginloader.cpp
---- kdebase-3.5.8/nsplugins/nspluginloader.cpp.flash	2006-10-01 12:31:58.000000000 -0500
-+++ kdebase-3.5.8/nsplugins/nspluginloader.cpp	2007-12-14 11:30:19.000000000 -0600
-@@ -54,11 +54,16 @@ NSPluginLoader *NSPluginLoader::s_instan
+diff -ur kdebase-orig/nsplugins/NSPluginCallbackIface.h kdebase-3.5.8/nsplugins/NSPluginCallbackIface.h
+--- kdebase-orig/nsplugins/NSPluginCallbackIface.h	2005-10-10 17:04:05.000000000 +0200
++++ kdebase-3.5.8/nsplugins/NSPluginCallbackIface.h	2008-01-29 15:51:20.000000000 +0100
+@@ -37,7 +37,7 @@
+   virtual ASYNC requestURL(QString url, QString target) = 0;
+   virtual ASYNC postURL(QString url, QString target, QByteArray data, QString mime) = 0;
+   virtual ASYNC statusMessage( QString msg ) = 0;
+-  virtual ASYNC evalJavaScript( int id, QString script ) = 0;
++  virtual ASYNC evalJavaScript( Q_INT32 id, QString script ) = 0;
+ 
+ };
+ 
+diff -ur kdebase-orig/nsplugins/nspluginloader.cpp kdebase-3.5.8/nsplugins/nspluginloader.cpp
+--- kdebase-orig/nsplugins/nspluginloader.cpp	2006-10-01 19:31:58.000000000 +0200
++++ kdebase-3.5.8/nsplugins/nspluginloader.cpp	2008-01-29 15:51:20.000000000 +0100
+@@ -41,6 +41,7 @@
+ #include <qpushbutton.h>
+ #include <qxembed.h>
+ #include <qtextstream.h>
++#include <qtimer.h>
+ #include <qregexp.h>
+ 
+ #include "nspluginloader.h"
+@@ -54,11 +55,14 @@
  int NSPluginLoader::s_refCount = 0;
  
  
 -NSPluginInstance::NSPluginInstance(QWidget *parent, const QCString& app, const QCString& id)
 -  : DCOPStub(app, id), NSPluginInstanceIface_stub(app, id), EMBEDCLASS(parent)
 +NSPluginInstance::NSPluginInstance(QWidget *parent)
-+  : EMBEDCLASS(parent), stub( NULL )
++  : EMBEDCLASS(parent), _loader( NULL ), shown( false ), inited( false ), resize_count( 0 ), stub( NULL )
  {
-     _loader = 0L;
-     shown = false;
+-    _loader = 0L;
+-    shown = false;
 +}
 +
 +void NSPluginInstance::init(const QCString& app, const QCString& obj)
@@ -20,7 +40,27 @@
      QGridLayout *_layout = new QGridLayout(this, 1, 1);
      KConfig cfg("kcmnspluginrc", false);
      cfg.setGroup("Misc");
-@@ -80,12 +85,19 @@ void NSPluginInstance::doLoadPlugin() {
+@@ -69,23 +73,37 @@
+         show();
+     } else {
+         _button = 0L;
+-        doLoadPlugin();
++        // Protection against repeated NPSetWindow() - Flash v9,0,115,0 doesn't handle
++        // repeated NPSetWindow() calls properly, which happens when NSPluginInstance is first
++        // shown and then resized. Which is what happens with KHTML. Therefore use 'shown'
++        // to detect whether the widget is shown and drop all resize events before that,
++        // and use 'resize_count' to wait for that one more resize to come (plus a timer
++        // for a possible timeout). Only then flash is actually initialized ('inited' is true).
++        resize_count = 1;
++        QTimer::singleShot( 1000, this, SLOT( doLoadPlugin()));
+     }
+ }
+ 
+ 
+ void NSPluginInstance::doLoadPlugin() {
+-    if (!_loader) {
++    if (!inited) {
+         delete _button;
          _button = 0L;
          _loader = NSPluginLoader::instance();
          setBackgroundMode(QWidget::NoBackground);
@@ -34,24 +74,80 @@
 +            setProtocol(QXEmbed::XEMBED);
 +        }
 +        // resize before showing, some plugins are stupid and can't handle repeated
-+        // NPSetWindow() calls very well
++        // NPSetWindow() calls very well (viewer will avoid the call if not shown yet)
 +        resizePlugin(width(), height());
          displayPlugin();
          show();
-         shown = true;
+-        shown = true;
 -        if (isVisible()) resizePlugin(width(), height());
++        inited = true;
      }
  }
  
-@@ -97,6 +109,7 @@ NSPluginInstance::~NSPluginInstance()
+@@ -93,10 +111,13 @@
+ NSPluginInstance::~NSPluginInstance()
+ {
+    kdDebug() << "-> NSPluginInstance::~NSPluginInstance" << endl;
+-   shutdown();
++   if( inited )
++     shutdown();
     kdDebug() << "release" << endl;
-    _loader->release();
+-   _loader->release();
++   if(_loader)
++     _loader->release();
     kdDebug() << "<- NSPluginInstance::~NSPluginInstance" << endl;
 +   delete stub;
  }
  
  
-@@ -445,19 +458,19 @@ NSPluginInstance *NSPluginLoader::newIns
+@@ -112,8 +133,14 @@
+ 
+ void NSPluginInstance::resizeEvent(QResizeEvent *event)
+ {
+-  if (shown == false)
++  if (shown == false) // ignore all resizes before being shown
+      return;
++  if( !inited && resize_count > 0 ) {
++      if( --resize_count == 0 )
++        doLoadPlugin();
++      else
++        return;
++  }
+   EMBEDCLASS::resizeEvent(event);
+   if (isVisible()) {
+     resizePlugin(width(), height());
+@@ -124,7 +151,29 @@
+ void NSPluginInstance::showEvent(QShowEvent *event)
+ {
+   EMBEDCLASS::showEvent(event);
+-  resizePlugin(width(), height());
++  shown = true;
++  if(!inited && resize_count == 0 )
++      doLoadPlugin();
++  if(inited)
++    resizePlugin(width(), height());
++}
++
++void NSPluginInstance::displayPlugin()
++{
++  qApp->syncX(); // process pending X commands
++  stub->displayPlugin();
++}
++
++void NSPluginInstance::resizePlugin( int w, int h )
++{
++  qApp->syncX();
++  stub->resizePlugin( w, h );
++}
++
++void NSPluginInstance::shutdown()
++{
++  if( stub )
++    stub->shutdown();
+ }
+ 
+ /*******************************************************************************/
+@@ -445,19 +494,19 @@
     if ( mime=="application/x-shockwave-flash" )
         embed = true; // flash doesn't work in full mode :(
  
@@ -76,556 +172,147 @@
  
     return plugin;
  }
-diff -up /dev/null kdebase-3.5.8/nsplugins/configure.in.in
---- /dev/null	2007-12-13 13:41:14.965729569 -0600
-+++ kdebase-3.5.8/nsplugins/configure.in.in	2007-12-14 11:30:19.000000000 -0600
-@@ -0,0 +1 @@
-+KDE_PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 0.21 )
-diff -up /dev/null kdebase-3.5.8/nsplugins/viewer/glibevents.h
---- /dev/null	2007-12-13 13:41:14.965729569 -0600
-+++ kdebase-3.5.8/nsplugins/viewer/glibevents.h	2007-12-14 11:30:19.000000000 -0600
-@@ -0,0 +1,41 @@
-+/*
-+  Copyright (c) 2007 Lubos Lunak <l.lunak at suse.cz>
-+ 
-+  This program is free software; you can redistribute it and/or modify
-+  it under the terms of the GNU General Public License as published by
-+  the Free Software Foundation; either version 2 of the License, or
-+  (at your option) any later version.
-+ 
-+  This program 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.
-+ 
-+  You should have received a copy of the GNU General Public License
-+  along with this program; if not, write to the Free Software
-+  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-+ 
-+*/                                                                            
-+
-+#ifndef GLIBEVENTS_H
-+#define GLIBEVENTS_H
-+
-+#include <qwidget.h>
-+#include <qtimer.h>
-+
-+#include <glib.h>
-+
-+class GlibEvents
-+    : public QWidget
-+    {
-+    Q_OBJECT
-+    public:
-+        GlibEvents();
-+        virtual ~GlibEvents();
-+    private slots:
-+        void process();
-+    private:
-+        QTimer timer;
-+    };
-+
-+#endif
-diff -up kdebase-3.5.8/nsplugins/viewer/Makefile.am.flash kdebase-3.5.8/nsplugins/viewer/Makefile.am
---- kdebase-3.5.8/nsplugins/viewer/Makefile.am.flash	2005-09-10 03:25:39.000000000 -0500
-+++ kdebase-3.5.8/nsplugins/viewer/Makefile.am	2007-12-14 11:30:19.000000000 -0600
-@@ -1,12 +1,12 @@
--INCLUDES = -I$(top_srcdir)/nsplugins -I$(top_builddir)/nsplugins $(all_includes)
-+INCLUDES = -I$(top_srcdir)/nsplugins -I$(top_builddir)/nsplugins $(all_includes) $(GTK_CFLAGS)
- METASOURCES = AUTO
+diff -ur kdebase-orig/nsplugins/nspluginloader.h kdebase-3.5.8/nsplugins/nspluginloader.h
+--- kdebase-orig/nsplugins/nspluginloader.h	2006-10-01 19:31:58.000000000 +0200
++++ kdebase-3.5.8/nsplugins/nspluginloader.h	2008-01-29 15:51:20.000000000 +0100
+@@ -43,13 +43,16 @@
+ class QPushButton;
+ class QGridLayout;
  
- bin_PROGRAMS = nspluginviewer 
+-class NSPluginInstance : public EMBEDCLASS, virtual public NSPluginInstanceIface_stub
++class NSPluginInstance : public EMBEDCLASS
+ {
+   Q_OBJECT
  
- nspluginviewer_SOURCES = NSPluginCallbackIface.stub NSPluginClassIface.skel \
--	nsplugin.cpp viewer.cpp kxt.cpp qxteventloop.cpp
-+	nsplugin.cpp viewer.cpp kxt.cpp qxteventloop.cpp glibevents.cpp
- nspluginviewer_LDFLAGS = $(all_libraries) $(KDE_RPATH) -export-dynamic
--nspluginviewer_LDADD = $(LIB_KIO) $(LIB_KPARTS) -lXt
-+nspluginviewer_LDADD = $(LIB_KIO) $(LIB_KPARTS) -lXt $(GTK_LIBS)
+ public:
+-    NSPluginInstance(QWidget *parent, const QCString& app, const QCString& id);
++    NSPluginInstance(QWidget *parent);
++    void init( const QCString& app, const QCString& obj );
+     ~NSPluginInstance();
++public: // wrappers
++    void javascriptResult( int id, QString result ) { stub->javascriptResult( id, result ); }
  
- NSPluginCallbackIface_DIR = $(srcdir)/..
+ private slots:
+     void doLoadPlugin();
+@@ -60,8 +63,15 @@
+     void windowChanged(WId w);
+     class NSPluginLoader *_loader;
+     bool shown;
++    bool inited;
++    int resize_count;
+     QPushButton *_button;
+     QGridLayout *_layout;
++    NSPluginInstanceIface_stub* stub;
++private: // wrappers
++    void displayPlugin();
++    void resizePlugin( int w, int h );
++    void shutdown();
+ };
  
-diff -up kdebase-3.5.8/nsplugins/viewer/viewer.cpp.flash kdebase-3.5.8/nsplugins/viewer/viewer.cpp
---- kdebase-3.5.8/nsplugins/viewer/viewer.cpp.flash	2006-01-19 11:01:49.000000000 -0600
-+++ kdebase-3.5.8/nsplugins/viewer/viewer.cpp	2007-12-14 11:32:58.000000000 -0600
-@@ -52,8 +52,13 @@
- #include <X11/Shell.h>
- #else
- #include "qxteventloop.h"
-+#include "glibevents.h"
- #endif
  
-+// FIXME: this is just for calling gtk_init and fix the buggy flash player
-+// initialization
-+#include <gtk/gtkmain.h>
-+
- /**
-  *  Use RLIMIT_DATA on systems that don't define RLIMIT_AS,
-  *  such as FreeBSD 4.
-@@ -215,6 +220,10 @@ bool qt_set_socket_handler( int sockfd, 
+diff -ur kdebase-orig/nsplugins/sdk/jni_md.h kdebase-3.5.8/nsplugins/sdk/jni_md.h
+--- kdebase-orig/nsplugins/sdk/jni_md.h	2007-10-08 11:51:23.000000000 +0200
++++ kdebase-3.5.8/nsplugins/sdk/jni_md.h	2008-01-29 15:51:20.000000000 +0100
+@@ -1,23 +1,40 @@
+ /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+  *
+- * The contents of this file are subject to the Netscape Public
+- * License Version 1.1 (the "License"); you may not use this file
+- * except in compliance with the License. You may obtain a copy of
+- * the License at http://www.mozilla.org/NPL/
+- *
+- * Software distributed under the License is distributed on an "AS
+- * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+- * implied. See the License for the specific language governing
+- * rights and limitations under the License.
++ * ***** BEGIN LICENSE BLOCK *****
++ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
++ *
++ * The contents of this file are subject to the Mozilla Public License Version
++ * 1.1 (the "License"); you may not use this file except in compliance with
++ * the License. You may obtain a copy of the License at
++ * http://www.mozilla.org/MPL/
++ *
++ * Software distributed under the License is distributed on an "AS IS" basis,
++ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
++ * for the specific language governing rights and limitations under the
++ * License.
+  *
+  * The Original Code is mozilla.org code.
+  *
+- * The Initial Developer of the Original Code is Netscape
+- * Communications Corporation.  Portions created by Netscape are
+- * Copyright (C) 1998 Netscape Communications Corporation. All
+- * Rights Reserved.
++ * The Initial Developer of the Original Code is
++ * Netscape Communications Corporation.
++ * Portions created by the Initial Developer are Copyright (C) 1998
++ * the Initial Developer. All Rights Reserved.
++ *
++ * Contributor(s):
++ *
++ * Alternatively, the contents of this file may be used under the terms of
++ * either the GNU General Public License Version 2 or later (the "GPL"), or
++ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
++ * in which case the provisions of the GPL or the LGPL are applicable instead
++ * of those above. If you wish to allow use of your version of this file only
++ * under the terms of either the GPL or the LGPL, and not to allow others to
++ * use your version of this file under the terms of the MPL, indicate your
++ * decision by deleting the provisions above and replace them with the notice
++ * and other provisions required by the GPL or the LGPL. If you do not delete
++ * the provisions above, a recipient may use your version of this file under
++ * the terms of any one of the MPL, the GPL or the LGPL.
+  *
+- * Contributor(s): 
++ * ***** END LICENSE BLOCK *****
+  *
+  *
+  * This Original Code has been modified by IBM Corporation.
+diff -ur kdebase-orig/nsplugins/sdk/npapi.h kdebase-3.5.8/nsplugins/sdk/npapi.h
+--- kdebase-orig/nsplugins/sdk/npapi.h	2007-10-08 11:51:23.000000000 +0200
++++ kdebase-3.5.8/nsplugins/sdk/npapi.h	2008-01-29 15:51:20.000000000 +0100
+@@ -38,7 +38,7 @@
  
- int main(int argc, char** argv)
- {
-+    // FIXME; the gtk_init() call is here to fix a bug in flash player that does
-+    // not call it properly, or call it in a wrong place
-+    gtk_init(&argc, &argv);
-+
-     // nspluginviewer is a helper app, it shouldn't do session management at all
-    setenv( "SESSION_MANAGER", "", 1 );
  
-@@ -249,6 +258,7 @@ int main(int argc, char** argv)
+ /*
+- *  npapi.h $Revision$
++ *  npapi.h
+  *  Netscape client plug-in API spec
+  */
  
-    kdDebug(1430) << "4 - create KApplication" << endl;
-    KApplication app( argc,  argv, "nspluginviewer" );
-+   GlibEvents glibevents;
- #endif
+@@ -126,11 +126,11 @@
+ /*----------------------------------------------------------------------*/
  
-    {
-diff -up kdebase-3.5.8/nsplugins/viewer/nsplugin.cpp.flash kdebase-3.5.8/nsplugins/viewer/nsplugin.cpp
---- kdebase-3.5.8/nsplugins/viewer/nsplugin.cpp.flash	2006-10-01 12:31:58.000000000 -0500
-+++ kdebase-3.5.8/nsplugins/viewer/nsplugin.cpp	2007-12-14 11:30:19.000000000 -0600
-@@ -180,6 +180,12 @@ NPError g_NPN_GetValue(NPP /*instance*/,
-          // Offline browsing - no thanks
-          *(bool*)value = false;
-          return NPERR_NO_ERROR;
-+      case 13: // NPNVToolkit
-+         *(int*)value = 2; // (NPNToolkitType)NPNVGtk2
-+         return NPERR_NO_ERROR;
-+      case 14: // NPNVSupportsXEmbedBool
-+         *(bool*)value = true;
-+         return NPERR_NO_ERROR;
-       default:
-          return NPERR_INVALID_PARAM;
-    }
-@@ -484,6 +490,8 @@ const char *g_NPN_UserAgent(NPP /*instan
-     KProtocolManager kpm;
-     QString agent = kpm.userAgentForHost("nspluginviewer");
-     kdDebug(1431) << "g_NPN_UserAgent() = " << agent << endl;
-+    // flash crashes without Firefox UA
-+    agent = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.10) Gecko/2007101500 Firefox/2.0.0.10";
-     return agent.latin1();
- }
+ #define NP_VERSION_MAJOR 0
+-#define NP_VERSION_MINOR 11
++#define NP_VERSION_MINOR 13
  
-@@ -583,7 +591,7 @@ NSPluginInstance::NSPluginInstance(NPP p
-                                    KLibrary *handle, int width, int height,
-                                    QString src, QString /*mime*/,
-                                    QString appId, QString callbackId,
--                                   bool embed,
-+                                   bool embed, WId xembed,
-                                    QObject *parent, const char* name )
-    : DCOPObject(), QObject( parent, name ) 
- {
-@@ -599,6 +607,8 @@ NSPluginInstance::NSPluginInstance(NPP p
-    _streams.setAutoDelete( true );
-    _waitingRequests.setAutoDelete( true );
-    _callback = new NSPluginCallbackIface_stub( appId.latin1(), callbackId.latin1() );
-+   _xembed_window = xembed;
-+   _toplevel = _form = 0;
  
-    KURL base(src);
-    base.setFileName( QString::null );
-@@ -619,51 +629,53 @@ NSPluginInstance::NSPluginInstance(NPP p
-    if (height == 0)
-       height = 1200;
+ /* The OS/2 version of Netscape uses RC_DATA to define the
+-   mime types, file extentions, etc that are required.
++   mime types, file extensions, etc that are required.
+    Use a vertical bar to separate types, end types with \0.
+    FileVersion and ProductVersion are 32bit ints, all other
+    entries are strings the MUST be terminated wwith a \0.
+@@ -387,7 +387,8 @@
  
--   // create drawing area
--   Arg args[7];
--   Cardinal nargs = 0;
--   XtSetArg(args[nargs], XtNwidth, width); nargs++;
--   XtSetArg(args[nargs], XtNheight, height); nargs++;
--   XtSetArg(args[nargs], XtNborderWidth, 0); nargs++;
--
--   String n, c;
--   XtGetApplicationNameAndClass(qt_xdisplay(), &n, &c);
--
--   _toplevel = XtAppCreateShell("drawingArea", c, applicationShellWidgetClass,
--                                qt_xdisplay(), args, nargs);
--
--   // What exactly does widget mapping mean? Without this call the widget isn't
--   // embedded correctly. With it the viewer doesn't show anything in standalone mode.
--   //if (embed)
--      XtSetMappedWhenManaged(_toplevel, False);
--   XtRealizeWidget(_toplevel);
--
--   // Create form window that is searched for by flash plugin
--   _form = XtVaCreateWidget("form", compositeWidgetClass, _toplevel, NULL);
--   XtSetArg(args[nargs], XtNvisual, QPaintDevice::x11AppVisual()); nargs++;
--   XtSetArg(args[nargs], XtNdepth, QPaintDevice::x11AppDepth()); nargs++;
--   XtSetArg(args[nargs], XtNcolormap, QPaintDevice::x11AppColormap()); nargs++;
--   XtSetValues(_form, args, nargs);
--   XSync(qt_xdisplay(), false);
-+   if( _xembed_window == 0 ) {
-+      // create drawing area
-+      Arg args[7];
-+      Cardinal nargs = 0;
-+      XtSetArg(args[nargs], XtNwidth, width); nargs++;
-+      XtSetArg(args[nargs], XtNheight, height); nargs++;
-+      XtSetArg(args[nargs], XtNborderWidth, 0); nargs++;
-+
-+      String n, c;
-+      XtGetApplicationNameAndClass(qt_xdisplay(), &n, &c);
-+
-+      _toplevel = XtAppCreateShell("drawingArea", c, applicationShellWidgetClass,
-+                                   qt_xdisplay(), args, nargs);
-+
-+      // What exactly does widget mapping mean? Without this call the widget isn't
-+      // embedded correctly. With it the viewer doesn't show anything in standalone mode.
-+      //if (embed)
-+         XtSetMappedWhenManaged(_toplevel, False);
-+      XtRealizeWidget(_toplevel);
-+
-+      // Create form window that is searched for by flash plugin
-+      _form = XtVaCreateWidget("form", compositeWidgetClass, _toplevel, NULL);
-+      XtSetArg(args[nargs], XtNvisual, QPaintDevice::x11AppVisual()); nargs++;
-+      XtSetArg(args[nargs], XtNdepth, QPaintDevice::x11AppDepth()); nargs++;
-+      XtSetArg(args[nargs], XtNcolormap, QPaintDevice::x11AppColormap()); nargs++;
-+      XtSetValues(_form, args, nargs);
-+      XSync(qt_xdisplay(), false);
+   /* 12 and over are available on Mozilla builds starting with 0.9.9 */
+   NPPVjavascriptPushCallerBool = 12,
+-  NPPVpluginKeepLibraryInMemory = 13   /* available in Mozilla 1.0 */
++  NPPVpluginKeepLibraryInMemory = 13,   /* available in Mozilla 1.0 */
++  NPPVpluginNeedsXEmbed         = 14
+ } NPPVariable;
  
--   // From mozilla - not sure if it's needed yet, nor what to use for embedder
-+      // From mozilla - not sure if it's needed yet, nor what to use for embedder
- #if 0
--   /* this little trick seems to finish initializing the widget */
-+      /* this little trick seems to finish initializing the widget */
- #if XlibSpecificationRelease >= 6
--   XtRegisterDrawable(qt_xdisplay(), embedderid, _toplevel);
-+      XtRegisterDrawable(qt_xdisplay(), embedderid, _toplevel);
- #else
--   _XtRegisterWindow(embedderid, _toplevel);
-+      _XtRegisterWindow(embedderid, _toplevel);
- #endif
- #endif
--   XtRealizeWidget(_form);
--   XtManageChild(_form);
-+      XtRealizeWidget(_form);
-+      XtManageChild(_form);
- 
--   // Register forwarder
--   XtAddEventHandler(_toplevel, (KeyPressMask|KeyReleaseMask), 
--                     False, forwarder, (XtPointer)this );
--   XtAddEventHandler(_form, (KeyPressMask|KeyReleaseMask), 
--                     False, forwarder, (XtPointer)this );
--   XSync(qt_xdisplay(), false);
-+      // Register forwarder
-+      XtAddEventHandler(_toplevel, (KeyPressMask|KeyReleaseMask), 
-+                        False, forwarder, (XtPointer)this );
-+      XtAddEventHandler(_form, (KeyPressMask|KeyReleaseMask), 
-+                        False, forwarder, (XtPointer)this );
-+      XSync(qt_xdisplay(), false);
-+   }
- }
- 
- NSPluginInstance::~NSPluginInstance()
-@@ -714,14 +726,16 @@ void NSPluginInstance::destroy()
-         if (saved)
-           g_NPN_MemFree(saved);
- 
--        XtRemoveEventHandler(_form, (KeyPressMask|KeyReleaseMask), 
--                             False, forwarder, (XtPointer)this);
--        XtRemoveEventHandler(_toplevel, (KeyPressMask|KeyReleaseMask), 
--                             False, forwarder, (XtPointer)this);
--        XtDestroyWidget(_form);
--	_form = 0;
--        XtDestroyWidget(_toplevel);
--	_toplevel = 0;
-+        if( _form != 0 ) {
-+            XtRemoveEventHandler(_form, (KeyPressMask|KeyReleaseMask), 
-+                                 False, forwarder, (XtPointer)this);
-+            XtRemoveEventHandler(_toplevel, (KeyPressMask|KeyReleaseMask), 
-+                                 False, forwarder, (XtPointer)this);
-+            XtDestroyWidget(_form);
-+    	    _form = 0;
-+            XtDestroyWidget(_toplevel);
-+	    _toplevel = 0;
-+        }
- 
-         if (_npp) {
-             ::free(_npp);   // matched with malloc() in newInstance
-@@ -902,7 +916,6 @@ void NSPluginInstance::streamFinished( N
-    _timer->start( 100, true );
- }
- 
--
- int NSPluginInstance::setWindow(int remove)
- {
-    if (remove)
-@@ -926,14 +939,24 @@ int NSPluginInstance::setWindow(int remo
-    _win.clipRect.bottom = _height;
-    _win.clipRect.right = _width;
- 
--   _win.window = (void*) XtWindow(_form);
--   kdDebug(1431) << "Window ID = " << _win.window << endl;
-+   if( _xembed_window ) {
-+      _win.window = (void*) _xembed_window;
-+      _win_info.type = NP_SETWINDOW;
-+      _win_info.display = qt_xdisplay();
-+      _win_info.visual = DefaultVisualOfScreen(DefaultScreenOfDisplay(qt_xdisplay()));
-+      _win_info.colormap = DefaultColormapOfScreen(DefaultScreenOfDisplay(qt_xdisplay()));
-+      _win_info.depth = DefaultDepthOfScreen(DefaultScreenOfDisplay(qt_xdisplay()));
-+   } else {
-+      _win.window = (void*) XtWindow(_form);
- 
--   _win_info.type = NP_SETWINDOW;
--   _win_info.display = XtDisplay(_form);
--   _win_info.visual = DefaultVisualOfScreen(XtScreen(_form));
--   _win_info.colormap = DefaultColormapOfScreen(XtScreen(_form));
--   _win_info.depth = DefaultDepthOfScreen(XtScreen(_form));
-+      _win_info.type = NP_SETWINDOW;
-+      _win_info.display = XtDisplay(_form);
-+      _win_info.visual = DefaultVisualOfScreen(XtScreen(_form));
-+      _win_info.colormap = DefaultColormapOfScreen(XtScreen(_form));
-+      _win_info.depth = DefaultDepthOfScreen(XtScreen(_form));
-+   }
-+
-+   kdDebug(1431) << "Window ID = " << _win.window << endl;
- 
-    _win.ws_info = &_win_info;
- 
-@@ -959,9 +982,6 @@ static void resizeWidgets(Window w, int 
- 
- void NSPluginInstance::resizePlugin(int w, int h)
- {
--   if (!_visible)
--      return;
--
-    if (w == _width && h == _height)
-       return;
- 
-@@ -970,22 +990,30 @@ void NSPluginInstance::resizePlugin(int 
-    _width = w;
-    _height = h;
- 
--   XResizeWindow(qt_xdisplay(), XtWindow(_form), w, h);
--   XResizeWindow(qt_xdisplay(), XtWindow(_toplevel), w, h);
--
--   Arg args[7];
--   Cardinal nargs = 0;
--   XtSetArg(args[nargs], XtNwidth, _width); nargs++;
--   XtSetArg(args[nargs], XtNheight, _height); nargs++;
--   XtSetArg(args[nargs], XtNvisual, QPaintDevice::x11AppVisual()); nargs++;
--   XtSetArg(args[nargs], XtNdepth, QPaintDevice::x11AppDepth()); nargs++;
--   XtSetArg(args[nargs], XtNcolormap, QPaintDevice::x11AppColormap()); nargs++;
--   XtSetArg(args[nargs], XtNborderWidth, 0); nargs++;
--
--   XtSetValues(_toplevel, args, nargs);
--   XtSetValues(_form, args, nargs);
--
--   resizeWidgets(XtWindow(_form), _width, _height);
-+   if( _form != 0 ) {
-+      XResizeWindow(qt_xdisplay(), XtWindow(_form), w, h);
-+      XResizeWindow(qt_xdisplay(), XtWindow(_toplevel), w, h);
-+
-+      Arg args[7];
-+      Cardinal nargs = 0;
-+      XtSetArg(args[nargs], XtNwidth, _width); nargs++;
-+      XtSetArg(args[nargs], XtNheight, _height); nargs++;
-+      XtSetArg(args[nargs], XtNvisual, QPaintDevice::x11AppVisual()); nargs++;
-+      XtSetArg(args[nargs], XtNdepth, QPaintDevice::x11AppDepth()); nargs++;
-+      XtSetArg(args[nargs], XtNcolormap, QPaintDevice::x11AppColormap()); nargs++;
-+      XtSetArg(args[nargs], XtNborderWidth, 0); nargs++;
-+ 
-+      XtSetValues(_toplevel, args, nargs);
-+      XtSetValues(_form, args, nargs);
-+
-+      resizeWidgets(XtWindow(_form), _width, _height);
-+   }
-+
-+   // If not visible yet, displayWindow() will call setWindow() again anyway, so avoid this.
-+   // This also handled plugins that are broken and cannot handle repeated setWindow() calls
-+   // very well.
-+   if (!_visible)
-+      return;
- 
-    setWindow();
- 
-@@ -1405,7 +1433,7 @@ void NSPluginClass::shutdown()
- DCOPRef NSPluginClass::newInstance( QString url, QString mimeType, bool embed,
-                                     QStringList argn, QStringList argv,
-                                     QString appId, QString callbackId,
--                                    bool reload, bool doPost, QByteArray postData )
-+                                    bool reload, bool doPost, QByteArray postData, long xembed )
- {
-    kdDebug(1431) << "-> NSPluginClass::NewInstance" << endl;
- 
-@@ -1449,16 +1477,25 @@ DCOPRef NSPluginClass::newInstance( QStr
-    memset(npp, 0, sizeof(NPP_t));
-    npp->ndata = NULL;
- 
--   // Create plugin instance object
--   NSPluginInstance *inst = new NSPluginInstance( npp, &_pluginFuncs, _handle,
--                                                  width, height, baseURL, mimeType,
--                                                  appId, callbackId, embed, this );
--
-    // create plugin instance
-    NPError error = _pluginFuncs.newp(mime, npp, embed ? NP_EMBED : NP_FULL,
-                                      argc, _argn, _argv, 0);
-    kdDebug(1431) << "NPP_New = " << (int)error << endl;
- 
-+   // don't use bool here, it can be 1 byte, but some plugins write it as int, and I can't find what the spec says
-+   int wants_xembed = false;
-+   if (_pluginFuncs.getvalue) {
-+      NPError error = _pluginFuncs.getvalue(npp, (NPPVariable)14/*NPPVpluginNeedsXEmbed*/, &wants_xembed );
-+      if( error != NPERR_NO_ERROR )
-+         wants_xembed = false;
-+   }
-+   kdDebug(1431) << "Plugin requires XEmbed:" << (bool)wants_xembed << endl;
-+
-+   // Create plugin instance object
-+   NSPluginInstance *inst = new NSPluginInstance( npp, &_pluginFuncs, _handle,
-+                                                  width, height, baseURL, mimeType,
-+                                                  appId, callbackId, embed, wants_xembed ? xembed : 0, this );
-+
-    // free arrays with arguments
-    delete [] _argn;
-    delete [] _argv;
-@@ -1493,7 +1530,6 @@ void NSPluginClass::destroyInstance( NSP
-     timer(); //_timer->start( 0, TRUE );
- }
- 
--
- /****************************************************************************/
- 
- NSPluginStreamBase::NSPluginStreamBase( NSPluginInstance *instance )
-diff -up kdebase-3.5.8/nsplugins/viewer/NSPluginClassIface.h.flash kdebase-3.5.8/nsplugins/viewer/NSPluginClassIface.h
---- kdebase-3.5.8/nsplugins/viewer/NSPluginClassIface.h.flash	2005-11-19 05:08:29.000000000 -0600
-+++ kdebase-3.5.8/nsplugins/viewer/NSPluginClassIface.h	2007-12-14 11:30:19.000000000 -0600
-@@ -50,7 +50,7 @@ k_dcop:
-   virtual DCOPRef newInstance(QString url, QString mimeType, bool embed,
-                               QStringList argn, QStringList argv,
-                               QString appId, QString callbackId, bool reload,
--                              bool doPost, QByteArray postData) = 0;
-+                              bool doPost, QByteArray postData, long xembed) = 0;
-   virtual QString getMIMEDescription() = 0;
- 
- };
-diff -up /dev/null kdebase-3.5.8/nsplugins/viewer/glibevents.cpp
---- /dev/null	2007-12-13 13:41:14.965729569 -0600
-+++ kdebase-3.5.8/nsplugins/viewer/glibevents.cpp	2007-12-14 11:30:19.000000000 -0600
-@@ -0,0 +1,43 @@
-+/*
-+  Copyright (c) 2007 Lubos Lunak <l.lunak at suse.cz>
-+ 
-+  This program is free software; you can redistribute it and/or modify
-+  it under the terms of the GNU General Public License as published by
-+  the Free Software Foundation; either version 2 of the License, or
-+  (at your option) any later version.
-+ 
-+  This program 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.
-+ 
-+  You should have received a copy of the GNU General Public License
-+  along with this program; if not, write to the Free Software
-+  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-+ 
-+*/                                                                            
-+
-+#include "glibevents.h"
-+
-+#include <qapplication.h>
-+
-+GlibEvents::GlibEvents()
-+    {
-+    g_main_context_ref( g_main_context_default());
-+    connect( &timer, SIGNAL( timeout()), SLOT( process()));
-+    // TODO Poll for now
-+    timer.start( 10 );
-+    }
-+
-+GlibEvents::~GlibEvents()
-+    {
-+    g_main_context_unref( g_main_context_default());
-+    }
-+
-+void GlibEvents::process()
-+    {
-+    while( g_main_context_pending( g_main_context_default()))
-+        g_main_context_iteration( g_main_context_default(), false );
-+    }
-+
-+#include "glibevents.moc"
-diff -up kdebase-3.5.8/nsplugins/viewer/nsplugin.h.flash kdebase-3.5.8/nsplugins/viewer/nsplugin.h
---- kdebase-3.5.8/nsplugins/viewer/nsplugin.h.flash	2007-10-08 04:51:23.000000000 -0500
-+++ kdebase-3.5.8/nsplugins/viewer/nsplugin.h	2007-12-14 11:30:19.000000000 -0600
-@@ -165,13 +165,13 @@ public:
-   // constructor, destructor
-   NSPluginInstance( NPP privateData, NPPluginFuncs *pluginFuncs, KLibrary *handle,
- 		    int width, int height, QString src, QString mime,
--                    QString appId, QString callbackId, bool embed,
-+                    QString appId, QString callbackId, bool embed, WId xembed,
- 		    QObject *parent, const char* name=0 );
-   ~NSPluginInstance();
- 
-   // DCOP functions
-   void shutdown();
--  int winId() { return XtWindow(_form); }
-+  int winId() { return _form != 0 ? XtWindow(_form) : 0; }
-   int setWindow(int remove=0);
-   void resizePlugin(int w, int h);
-   void javascriptResult(int id, QString result);
-@@ -232,6 +232,7 @@ private:
-   NPPluginFuncs _pluginFuncs;
- 
-   Widget _area, _form, _toplevel;
-+  WId _xembed_window;
-   QString _baseURL;
-   int _width, _height;
- 
-@@ -281,7 +282,7 @@ public:
-   DCOPRef newInstance(QString url, QString mimeType, bool embed,
-                       QStringList argn, QStringList argv,
-                       QString appId, QString callbackId, bool reload, bool post,
--                      QByteArray postData );
-+                      QByteArray postData, long xembed );
-   void destroyInstance( NSPluginInstance* inst );
-   bool error() { return _error; }
- 
-diff -up kdebase-3.5.8/nsplugins/sdk/npapi.h.flash kdebase-3.5.8/nsplugins/sdk/npapi.h
---- kdebase-3.5.8/nsplugins/sdk/npapi.h.flash	2007-10-08 04:51:23.000000000 -0500
-+++ kdebase-3.5.8/nsplugins/sdk/npapi.h	2007-12-14 11:30:19.000000000 -0600
-@@ -38,7 +38,7 @@
- 
- 
- /*
-- *  npapi.h $Revision$
-+ *  npapi.h $Revision$
-  *  Netscape client plug-in API spec
-  */
- 
-@@ -126,11 +126,11 @@
- /*----------------------------------------------------------------------*/
- 
- #define NP_VERSION_MAJOR 0
--#define NP_VERSION_MINOR 11
-+#define NP_VERSION_MINOR 13
- 
- 
- /* The OS/2 version of Netscape uses RC_DATA to define the
--   mime types, file extentions, etc that are required.
-+   mime types, file extensions, etc that are required.
-    Use a vertical bar to separate types, end types with \0.
-    FileVersion and ProductVersion are 32bit ints, all other
-    entries are strings the MUST be terminated wwith a \0.
-@@ -387,7 +387,8 @@ typedef enum {
- 
-   /* 12 and over are available on Mozilla builds starting with 0.9.9 */
-   NPPVjavascriptPushCallerBool = 12,
--  NPPVpluginKeepLibraryInMemory = 13   /* available in Mozilla 1.0 */
-+  NPPVpluginKeepLibraryInMemory = 13,   /* available in Mozilla 1.0 */
-+  NPPVpluginNeedsXEmbed         = 14
- } NPPVariable;
- 
- /*
-@@ -404,10 +405,20 @@ typedef enum {
-   /* 10 and over are available on Mozilla builds starting with 0.9.4 */
-   NPNVserviceManager = (10 | NP_ABI_MASK),
-   NPNVDOMElement     = (11 | NP_ABI_MASK),   /* available in Mozilla 1.2 */
--  NPNVDOMWindow      = (12 | NP_ABI_MASK)
-+  NPNVDOMWindow      = (12 | NP_ABI_MASK),
-+  NPNVToolkit        = (13 | NP_ABI_MASK),
-+  NPNVSupportsXEmbedBool = 14
- } NPNVariable;
+ /*
+@@ -404,10 +405,20 @@
+   /* 10 and over are available on Mozilla builds starting with 0.9.4 */
+   NPNVserviceManager = (10 | NP_ABI_MASK),
+   NPNVDOMElement     = (11 | NP_ABI_MASK),   /* available in Mozilla 1.2 */
+-  NPNVDOMWindow      = (12 | NP_ABI_MASK)
++  NPNVDOMWindow      = (12 | NP_ABI_MASK),
++  NPNVToolkit        = (13 | NP_ABI_MASK),
++  NPNVSupportsXEmbedBool = 14
+ } NPNVariable;
  
  /*
 + * The type of Tookkit the widgets use
@@ -639,7 +326,7 @@
   * The type of a NPWindow - it specifies the type of the data structure
   * returned in the window field.
   */
-@@ -428,7 +439,7 @@ typedef struct _NPWindow
+@@ -428,7 +439,7 @@
    NPRect clipRect; /* Clipping rectangle in port coordinates */
                     /* Used by MAC only.			  */
  #if defined(XP_UNIX) && !defined(XP_MACOSX)
@@ -648,414 +335,12 @@
  #endif /* XP_UNIX */
    NPWindowType type; /* Is this a window or a drawable? */
  } NPWindow;
-diff -up /dev/null kdebase-3.5.8/nsplugins/sdk/npruntime.h
---- /dev/null	2007-12-13 13:41:14.965729569 -0600
-+++ kdebase-3.5.8/nsplugins/sdk/npruntime.h	2007-12-14 11:30:19.000000000 -0600
-@@ -0,0 +1,399 @@
-+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-+/*
-+ * Copyright � 2004, Apple Computer, Inc. and The Mozilla Foundation. 
-+ * All rights reserved.
-+ * 
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions are
-+ * met:
-+ * 
-+ * 1. Redistributions of source code must retain the above copyright
-+ * notice, this list of conditions and the following disclaimer.
-+ * 2. Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ * 3. Neither the names of Apple Computer, Inc. ("Apple") or The Mozilla
-+ * Foundation ("Mozilla") nor the names of their contributors may be used
-+ * to endorse or promote products derived from this software without
-+ * specific prior written permission.
-+ * 
-+ * THIS SOFTWARE IS PROVIDED BY APPLE, MOZILLA AND THEIR CONTRIBUTORS "AS
-+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE, MOZILLA OR
-+ * THEIR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ * Revision 1 (March 4, 2004):
-+ * Initial proposal.
-+ *
-+ * Revision 2 (March 10, 2004):
-+ * All calls into script were made asynchronous.  Results are
-+ * provided via the NPScriptResultFunctionPtr callback.
-+ *
-+ * Revision 3 (March 10, 2004):
-+ * Corrected comments to not refer to class retain/release FunctionPtrs.
-+ *
-+ * Revision 4 (March 11, 2004):
-+ * Added additional convenience NPN_SetExceptionWithUTF8().
-+ * Changed NPHasPropertyFunctionPtr and NPHasMethodFunctionPtr to take NPClass
-+ * pointers instead of NPObject pointers.
-+ * Added NPIsValidIdentifier().
-+ *
-+ * Revision 5 (March 17, 2004):
-+ * Added context parameter to result callbacks from ScriptObject functions.
-+ *
-+ * Revision 6 (March 29, 2004):
-+ * Renamed functions implemented by user agent to NPN_*.  Removed _ from
-+ * type names.
-+ * Renamed "JavaScript" types to "Script".
-+ *
-+ * Revision 7 (April 21, 2004):
-+ * NPIdentifier becomes a void*, was int32_t
-+ * Remove NP_IsValidIdentifier, renamed NP_IdentifierFromUTF8 to NP_GetIdentifier
-+ * Added NPVariant and modified functions to use this new type.
-+ *
-+ * Revision 8 (July 9, 2004):
-+ * Updated to joint Apple-Mozilla license.
-+ *
-+ */
-+#ifndef _NP_RUNTIME_H_
-+#define _NP_RUNTIME_H_
-+
-+#include <qglobal.h>
-+typedef Q_UINT32 uint32_t;
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+
-+/*
-+    This API is used to facilitate binding code written in C to script
-+    objects.  The API in this header does not assume the presence of a
-+    user agent.  That is, it can be used to bind C code to scripting
-+    environments outside of the context of a user agent.
-+    
-+    However, the normal use of the this API is in the context of a
-+    scripting environment running in a browser or other user agent.
-+    In particular it is used to support the extended Netscape
-+    script-ability API for plugins (NP-SAP).  NP-SAP is an extension
-+    of the Netscape plugin API.  As such we have adopted the use of
-+    the "NP" prefix for this API.
-+
-+    The following NP{N|P}Variables were added to the Netscape plugin
-+    API (in npapi.h):
-+
-+    NPNVWindowNPObject
-+    NPNVPluginElementNPObject
-+    NPPVpluginScriptableNPObject
-+
-+    These variables are exposed through NPN_GetValue() and
-+    NPP_GetValue() (respectively) and are used to establish the
-+    initial binding between the user agent and native code.  The DOM
-+    objects in the user agent can be examined and manipulated using
-+    the NPN_ functions that operate on NPObjects described in this
-+    header.
-+
-+    To the extent possible the assumptions about the scripting
-+    language used by the scripting environment have been minimized.
-+*/
-+
-+#define NP_BEGIN_MACRO  do {
-+#define NP_END_MACRO    } while (0)
-+
-+/*
-+    Objects (non-primitive data) passed between 'C' and script is
-+    always wrapped in an NPObject.  The 'interface' of an NPObject is
-+    described by an NPClass.
-+*/
-+typedef struct NPObject NPObject;
-+typedef struct NPClass NPClass;
-+
-+typedef char NPUTF8;
-+typedef struct _NPString {
-+    const NPUTF8 *utf8characters;
-+    uint32_t utf8length;
-+} NPString;
-+
-+typedef enum {
-+    NPVariantType_Void,
-+    NPVariantType_Null,
-+    NPVariantType_Bool,
-+    NPVariantType_Int32,
-+    NPVariantType_Double,
-+    NPVariantType_String,
-+    NPVariantType_Object
-+} NPVariantType;
-+
-+typedef struct _NPVariant {
-+    NPVariantType type;
-+    union {
-+        bool boolValue;
-+        uint32_t intValue;
-+        double doubleValue;
-+        NPString stringValue;
-+        NPObject *objectValue;
-+    } value;
-+} NPVariant;
-+
-+/*
-+    NPN_ReleaseVariantValue is called on all 'out' parameters
-+    references.  Specifically it is to be called on variants that own
-+    their value, as is the case with all non-const NPVariant*
-+    arguments after a successful call to any methods (except this one)
-+    in this API.
-+
-+    After calling NPN_ReleaseVariantValue, the type of the variant
-+    will be NPVariantType_Void.
-+*/
-+void NPN_ReleaseVariantValue(NPVariant *variant);
-+
-+#define NPVARIANT_IS_VOID(_v)    ((_v).type == NPVariantType_Void)
-+#define NPVARIANT_IS_NULL(_v)    ((_v).type == NPVariantType_Null)
-+#define NPVARIANT_IS_BOOLEAN(_v) ((_v).type == NPVariantType_Bool)
-+#define NPVARIANT_IS_INT32(_v)   ((_v).type == NPVariantType_Int32)
-+#define NPVARIANT_IS_DOUBLE(_v)  ((_v).type == NPVariantType_Double)
-+#define NPVARIANT_IS_STRING(_v)  ((_v).type == NPVariantType_String)
-+#define NPVARIANT_IS_OBJECT(_v)  ((_v).type == NPVariantType_Object)
-+
-+#define NPVARIANT_TO_BOOLEAN(_v) ((_v).value.boolValue)
-+#define NPVARIANT_TO_INT32(_v)   ((_v).value.intValue)
-+#define NPVARIANT_TO_DOUBLE(_v)  ((_v).value.doubleValue)
-+#define NPVARIANT_TO_STRING(_v)  ((_v).value.stringValue)
-+#define NPVARIANT_TO_OBJECT(_v)  ((_v).value.objectValue)
-+
-+#define VOID_TO_NPVARIANT(_v)                                                 \
-+NP_BEGIN_MACRO                                                                \
-+    (_v).type = NPVariantType_Void;                                           \
-+    (_v).value.objectValue = NULL;                                            \
-+NP_END_MACRO
-+
-+#define NULL_TO_NPVARIANT(_v)                                                 \
-+NP_BEGIN_MACRO                                                                \
-+    (_v).type = NPVariantType_Null;                                           \
-+    (_v).value.objectValue = NULL;                                            \
-+NP_END_MACRO
-+
-+#define BOOLEAN_TO_NPVARIANT(_val, _v)                                        \
-+NP_BEGIN_MACRO                                                                \
-+    (_v).type = NPVariantType_Bool;                                           \
-+    (_v).value.boolValue = !!(_val);                                          \
-+NP_END_MACRO
-+
-+#define INT32_TO_NPVARIANT(_val, _v)                                          \
-+NP_BEGIN_MACRO                                                                \
-+    (_v).type = NPVariantType_Int32;                                          \
-+    (_v).value.intValue = _val;                                               \
-+NP_END_MACRO
-+
-+#define DOUBLE_TO_NPVARIANT(_val, _v)                                         \
-+NP_BEGIN_MACRO                                                                \
-+    (_v).type = NPVariantType_Double;                                         \
-+    (_v).value.doubleValue = _val;                                            \
-+NP_END_MACRO
-+
-+#define STRINGZ_TO_NPVARIANT(_val, _v)                                        \
-+NP_BEGIN_MACRO                                                                \
-+    (_v).type = NPVariantType_String;                                         \
-+    NPString str = { _val, strlen(_val) };                                    \
-+    (_v).value.stringValue = str;                                             \
-+NP_END_MACRO
-+
-+#define STRINGN_TO_NPVARIANT(_val, _len, _v)                                  \
-+NP_BEGIN_MACRO                                                                \
-+    (_v).type = NPVariantType_String;                                         \
-+    NPString str = { _val, _len };                                            \
-+    (_v).value.stringValue = str;                                             \
-+NP_END_MACRO
-+
-+#define OBJECT_TO_NPVARIANT(_val, _v)                                         \
-+NP_BEGIN_MACRO                                                                \
-+    (_v).type = NPVariantType_Object;                                         \
-+    (_v).value.objectValue = _val;                                            \
-+NP_END_MACRO
-+
-+
-+/*
-+	Type mappings (JavaScript types have been used for illustration
-+    purposes):
-+
-+	JavaScript       to             C (NPVariant with type:)
-+	undefined                       NPVariantType_Void
-+	null                            NPVariantType_Null
-+	Boolean                         NPVariantType_Bool
-+	Number                          NPVariantType_Double or NPVariantType_Int32
-+	String                          NPVariantType_String
-+	Object                          NPVariantType_Object
-+
-+	C (NPVariant with type:)   to   JavaScript
-+	NPVariantType_Void              undefined
-+	NPVariantType_Null              null
-+	NPVariantType_Bool              Boolean	
-+	NPVariantType_Int32             Number
-+	NPVariantType_Double            Number
-+	NPVariantType_String            String
-+	NPVariantType_Object            Object
-+*/
-+
-+typedef void *NPIdentifier;
-+
-+/*
-+    NPObjects have methods and properties.  Methods and properties are
-+    identified with NPIdentifiers.  These identifiers may be reflected
-+    in script.  NPIdentifiers can be either strings or integers, IOW,
-+    methods and properties can be identified by either strings or
-+    integers (i.e. foo["bar"] vs foo[1]). NPIdentifiers can be
-+    compared using ==.  In case of any errors, the requested
-+    NPIdentifier(s) will be NULL.
-+*/
-+NPIdentifier NPN_GetStringIdentifier(const NPUTF8 *name);
-+void NPN_GetStringIdentifiers(const NPUTF8 **names, int32_t nameCount,
-+                              NPIdentifier *identifiers);
-+NPIdentifier NPN_GetIntIdentifier(int32_t intid);
-+bool NPN_IdentifierIsString(NPIdentifier identifier);
-+
-+/*
-+    The NPUTF8 returned from NPN_UTF8FromIdentifier SHOULD be freed.
-+*/
-+NPUTF8 *NPN_UTF8FromIdentifier(NPIdentifier identifier);
-+
-+/*
-+    Get the integer represented by identifier. If identifier is not an
-+    integer identifier, the behaviour is undefined.
-+*/
-+int32_t NPN_IntFromIdentifier(NPIdentifier identifier);
-+
-+/*
-+    NPObject behavior is implemented using the following set of
-+    callback functions.
-+
-+    The NPVariant *result argument of these functions (where
-+    applicable) should be released using NPN_ReleaseVariantValue().
-+*/
-+typedef NPObject *(*NPAllocateFunctionPtr)(NPP npp, NPClass *aClass);
-+typedef void (*NPDeallocateFunctionPtr)(NPObject *npobj);
-+typedef void (*NPInvalidateFunctionPtr)(NPObject *npobj);
-+typedef bool (*NPHasMethodFunctionPtr)(NPObject *npobj, NPIdentifier name);
-+typedef bool (*NPInvokeFunctionPtr)(NPObject *npobj, NPIdentifier name,
-+                                    const NPVariant *args, uint32_t argCount,
-+                                    NPVariant *result);
-+typedef bool (*NPInvokeDefaultFunctionPtr)(NPObject *npobj,
-+                                           const NPVariant *args,
-+                                           uint32_t argCount,
-+                                           NPVariant *result);
-+typedef bool (*NPHasPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name);
-+typedef bool (*NPGetPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name,
-+                                         NPVariant *result);
-+typedef bool (*NPSetPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name,
-+                                         const NPVariant *value);
-+typedef bool (*NPRemovePropertyFunctionPtr)(NPObject *npobj,
-+                                            NPIdentifier name);
-+
-+/*
-+    NPObjects returned by create, retain, invoke, and getProperty pass
-+    a reference count to the caller.  That is, the callee adds a
-+    reference count which passes to the caller.  It is the caller's
-+    responsibility to release the returned object.
-+
-+    NPInvokeFunctionPtr function may return 0 to indicate a void
-+    result.
-+
-+    NPInvalidateFunctionPtr is called by the scripting environment
-+    when the native code is shutdown.  Any attempt to message a
-+    NPObject instance after the invalidate callback has been
-+    called will result in undefined behavior, even if the native code
-+    is still retaining those NPObject instances.  (The runtime
-+    will typically return immediately, with 0 or NULL, from an attempt
-+    to dispatch to a NPObject, but this behavior should not be
-+    depended upon.)
-+*/
-+struct NPClass
-+{
-+    uint32_t structVersion;
-+    NPAllocateFunctionPtr allocate;
-+    NPDeallocateFunctionPtr deallocate;
-+    NPInvalidateFunctionPtr invalidate;
-+    NPHasMethodFunctionPtr hasMethod;
-+    NPInvokeFunctionPtr invoke;
-+    NPInvokeDefaultFunctionPtr invokeDefault;
-+    NPHasPropertyFunctionPtr hasProperty;
-+    NPGetPropertyFunctionPtr getProperty;
-+    NPSetPropertyFunctionPtr setProperty;
-+    NPRemovePropertyFunctionPtr removeProperty;
-+};
-+
-+#define NP_CLASS_STRUCT_VERSION 1
-+
-+struct NPObject {
-+    NPClass *_class;
-+    uint32_t referenceCount;
-+    /*
-+     * Additional space may be allocated here by types of NPObjects
-+     */
-+};
-+
-+/*
-+    If the class has an allocate function, NPN_CreateObject invokes
-+    that function, otherwise a NPObject is allocated and
-+    returned. This method will initialize the referenceCount member of
-+    the NPObject to 1.
-+*/
-+NPObject *NPN_CreateObject(NPP npp, NPClass *aClass);
-+
-+/*
-+    Increment the NPObject's reference count.
-+*/
-+NPObject *NPN_RetainObject(NPObject *npobj);
-+
-+/*
-+    Decremented the NPObject's reference count.  If the reference
-+    count goes to zero, the class's destroy function is invoke if
-+    specified, otherwise the object is freed directly.
-+*/
-+void NPN_ReleaseObject(NPObject *npobj);
-+
-+/*
-+    Functions to access script objects represented by NPObject.
-+
-+    Calls to script objects are synchronous.  If a function returns a
-+    value, it will be supplied via the result NPVariant
-+    argument. Successful calls will return true, false will be
-+    returned in case of an error.
-+    
-+    Calls made from plugin code to script must be made from the thread
-+    on which the plugin was initialized.
-+*/
-+
-+bool NPN_Invoke(NPP npp, NPObject *npobj, NPIdentifier methodName,
-+                const NPVariant *args, uint32_t argCount, NPVariant *result);
-+bool NPN_InvokeDefault(NPP npp, NPObject *npobj, const NPVariant *args,
-+                       uint32_t argCount, NPVariant *result);
-+bool NPN_Evaluate(NPP npp, NPObject *npobj, NPString *script,
-+                  NPVariant *result);
-+bool NPN_GetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName,
-+                     NPVariant *result);
-+bool NPN_SetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName,
-+                     const NPVariant *value);
-+bool NPN_RemoveProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName);
-+bool NPN_HasProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName);
-+bool NPN_HasMethod(NPP npp, NPObject *npobj, NPIdentifier methodName);
-+
-+/*
-+    NPN_SetException may be called to trigger a script exception upon
-+    return from entry points into NPObjects.  Typical usage:
-+
-+    NPN_SetException (npobj, message);
-+*/
-+void NPN_SetException(NPObject *npobj, const NPUTF8 *message);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif
-diff -up kdebase-3.5.8/nsplugins/sdk/npupp.h.flash kdebase-3.5.8/nsplugins/sdk/npupp.h
---- kdebase-3.5.8/nsplugins/sdk/npupp.h.flash	2007-10-08 04:51:23.000000000 -0500
-+++ kdebase-3.5.8/nsplugins/sdk/npupp.h	2007-12-14 11:30:19.000000000 -0600
-@@ -1,11 +1,11 @@
--/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+Pouze v kdebase-3.5.8/nsplugins/sdk: npruntime.h
+diff -ur kdebase-orig/nsplugins/sdk/npupp.h kdebase-3.5.8/nsplugins/sdk/npupp.h
+--- kdebase-orig/nsplugins/sdk/npupp.h	2007-10-08 11:51:23.000000000 +0200
++++ kdebase-3.5.8/nsplugins/sdk/npupp.h	2008-01-29 15:51:20.000000000 +0100
+@@ -1,11 +1,11 @@
+-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
  /* ***** BEGIN LICENSE BLOCK *****
 - * Version: NPL 1.1/GPL 2.0/LGPL 2.1
@@ -1104,7 +389,7 @@
  
  /*
 - *  npupp.h $Revision$
-+ *  npupp.h $Revision$
++ *  npupp.h
   *  function call mecahnics needed by platform specific glue code.
   */
  
@@ -1125,7 +410,7 @@
  #define _NPUPP_USE_UPP_ 0
  
  #if _NPUPP_USE_UPP_
-@@ -488,8 +488,6 @@ typedef NPError	(* NP_LOADDS NPP_SetValu
+@@ -488,8 +488,6 @@
  #endif
  
  
@@ -1134,7 +419,7 @@
  /*
   *  Netscape entry points
   */
-@@ -1063,6 +1061,584 @@ typedef void (* NP_LOADDS NPN_ForceRedra
+@@ -1063,6 +1061,584 @@
  
  #endif
  
@@ -1719,7 +1004,7 @@
  
  /******************************************************************************************
   * The actual plugin function table definitions
-@@ -1117,6 +1693,27 @@ typedef struct _NPNetscapeFuncs {
+@@ -1117,6 +1693,27 @@
      NPN_InvalidateRectUPP invalidaterect;
      NPN_InvalidateRegionUPP invalidateregion;
      NPN_ForceRedrawUPP forceredraw;
@@ -1747,9 +1032,9 @@
  } NPNetscapeFuncs;
  
  #ifdef XP_MAC
-diff -up kdebase-3.5.8/nsplugins/sdk/prcpucfg.h.flash kdebase-3.5.8/nsplugins/sdk/prcpucfg.h
---- kdebase-3.5.8/nsplugins/sdk/prcpucfg.h.flash	2007-10-08 04:51:23.000000000 -0500
-+++ kdebase-3.5.8/nsplugins/sdk/prcpucfg.h	2007-12-14 11:30:19.000000000 -0600
+diff -ur kdebase-orig/nsplugins/sdk/prcpucfg.h kdebase-3.5.8/nsplugins/sdk/prcpucfg.h
+--- kdebase-orig/nsplugins/sdk/prcpucfg.h	2007-10-08 11:51:23.000000000 +0200
++++ kdebase-3.5.8/nsplugins/sdk/prcpucfg.h	2008-01-29 15:51:20.000000000 +0100
 @@ -276,7 +276,7 @@
  #define PR_BYTES_PER_WORD_LOG2   2
  #define PR_BYTES_PER_DWORD_LOG2  3
@@ -1768,37 +1053,546 @@
  
  #define IS_LITTLE_ENDIAN 1
  #undef  IS_BIG_ENDIAN
-diff -up kdebase-3.5.8/nsplugins/nspluginloader.h.flash kdebase-3.5.8/nsplugins/nspluginloader.h
---- kdebase-3.5.8/nsplugins/nspluginloader.h.flash	2006-10-01 12:31:58.000000000 -0500
-+++ kdebase-3.5.8/nsplugins/nspluginloader.h	2007-12-14 11:30:19.000000000 -0600
-@@ -43,13 +43,16 @@ class KProcess;
- class QPushButton;
- class QGridLayout;
+@@ -629,7 +629,9 @@
+ #define BITS_PER_SHORT		PR_BITS_PER_SHORT
+ #define BITS_PER_INT		PR_BITS_PER_INT
+ #define BITS_PER_INT64		PR_BITS_PER_INT64
++#ifndef BITS_PER_LONG
+ #define BITS_PER_LONG		PR_BITS_PER_LONG
++#endif
+ #define BITS_PER_FLOAT		PR_BITS_PER_FLOAT
+ #define BITS_PER_DOUBLE		PR_BITS_PER_DOUBLE
+ #define BITS_PER_WORD		PR_BITS_PER_WORD
+Pouze v kdebase-3.5.8/nsplugins/viewer: glibevents.cpp
+Pouze v kdebase-3.5.8/nsplugins/viewer: glibevents.h
+diff -ur kdebase-orig/nsplugins/viewer/Makefile.am kdebase-3.5.8/nsplugins/viewer/Makefile.am
+--- kdebase-orig/nsplugins/viewer/Makefile.am	2005-09-10 10:25:39.000000000 +0200
++++ kdebase-3.5.8/nsplugins/viewer/Makefile.am	2008-01-29 15:51:20.000000000 +0100
+@@ -1,12 +1,11 @@
+-INCLUDES = -I$(top_srcdir)/nsplugins -I$(top_builddir)/nsplugins $(all_includes)
++INCLUDES = -I$(top_srcdir)/nsplugins -I$(top_builddir)/nsplugins $(all_includes) $(GTK_CFLAGS) `pkg-config --cflags glib-2.0`
+ METASOURCES = AUTO
  
--class NSPluginInstance : public EMBEDCLASS, virtual public NSPluginInstanceIface_stub
-+class NSPluginInstance : public EMBEDCLASS
- {
-   Q_OBJECT
+ bin_PROGRAMS = nspluginviewer 
  
- public:
--    NSPluginInstance(QWidget *parent, const QCString& app, const QCString& id);
-+    NSPluginInstance(QWidget *parent);
-+    void init( const QCString& app, const QCString& obj );
-     ~NSPluginInstance();
-+public: // wrappers
-+    void javascriptResult( int id, QString result ) { stub->javascriptResult( id, result ); }
+ nspluginviewer_SOURCES = NSPluginCallbackIface.stub NSPluginClassIface.skel \
+-	nsplugin.cpp viewer.cpp kxt.cpp qxteventloop.cpp
+-nspluginviewer_LDFLAGS = $(all_libraries) $(KDE_RPATH) -export-dynamic
+-nspluginviewer_LDADD = $(LIB_KIO) $(LIB_KPARTS) -lXt
++	nsplugin.cpp viewer.cpp kxt.cpp qxteventloop.cpp glibevents.cpp
++nspluginviewer_LDFLAGS = $(all_libraries) $(KDE_RPATH) -export-dynamic `pkg-config --libs glib-2.0`
++nspluginviewer_LDADD = $(LIB_KIO) $(LIB_KPARTS) -lXt $(GTK_LIBS)
  
- private slots:
-     void doLoadPlugin();
-@@ -62,6 +65,11 @@ protected:
-     bool shown;
-     QPushButton *_button;
-     QGridLayout *_layout;
-+    NSPluginInstanceIface_stub* stub;
-+private: // wrappers
-+    void displayPlugin() { stub->displayPlugin(); }
-+    void resizePlugin( int w, int h ) { stub->resizePlugin( w, h ); }
-+    void shutdown() { if( stub ) stub->shutdown(); }
+ NSPluginCallbackIface_DIR = $(srcdir)/..
+-
+diff -ur kdebase-orig/nsplugins/viewer/NSPluginClassIface.h kdebase-3.5.8/nsplugins/viewer/NSPluginClassIface.h
+--- kdebase-orig/nsplugins/viewer/NSPluginClassIface.h	2005-11-19 12:08:29.000000000 +0100
++++ kdebase-3.5.8/nsplugins/viewer/NSPluginClassIface.h	2008-01-29 15:51:20.000000000 +0100
+@@ -47,10 +47,10 @@
+ 
+ k_dcop:
+ 
+-  virtual DCOPRef newInstance(QString url, QString mimeType, bool embed,
++  virtual DCOPRef newInstance(QString url, QString mimeType, Q_INT8 embed,
+                               QStringList argn, QStringList argv,
+-                              QString appId, QString callbackId, bool reload,
+-                              bool doPost, QByteArray postData) = 0;
++                              QString appId, QString callbackId, Q_INT8 reload,
++                              Q_INT8 doPost, QByteArray postData, Q_UINT32 xembed) = 0;
+   virtual QString getMIMEDescription() = 0;
+ 
+ };
+@@ -66,11 +66,11 @@
+ 
+   virtual int winId() = 0;
+ 
+-  virtual int setWindow(int remove=0) = 0;
++  virtual int setWindow(Q_INT8 remove=0) = 0;
+ 
+-  virtual void resizePlugin(int w, int h) = 0;
++  virtual void resizePlugin(Q_INT32 w, Q_INT32 h) = 0;
+ 
+-  virtual void javascriptResult(int id, QString result) = 0;
++  virtual void javascriptResult(Q_INT32 id, QString result) = 0;
+ 
+   virtual void displayPlugin() = 0;
  };
+diff -ur kdebase-orig/nsplugins/viewer/nsplugin.cpp kdebase-3.5.8/nsplugins/viewer/nsplugin.cpp
+--- kdebase-orig/nsplugins/viewer/nsplugin.cpp	2006-10-01 19:31:58.000000000 +0200
++++ kdebase-3.5.8/nsplugins/viewer/nsplugin.cpp	2008-01-29 15:51:21.000000000 +0100
+@@ -180,6 +180,12 @@
+          // Offline browsing - no thanks
+          *(bool*)value = false;
+          return NPERR_NO_ERROR;
++      case NPNVToolkit:
++         *(NPNToolkitType*)value = NPNVGtk2;
++         return NPERR_NO_ERROR;
++      case NPNVSupportsXEmbedBool:
++         *(bool*)value = true;
++         return NPERR_NO_ERROR;
+       default:
+          return NPERR_INVALID_PARAM;
+    }
+@@ -484,6 +490,8 @@
+     KProtocolManager kpm;
+     QString agent = kpm.userAgentForHost("nspluginviewer");
+     kdDebug(1431) << "g_NPN_UserAgent() = " << agent << endl;
++    // flash crashes without Firefox UA
++    agent = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.10) Gecko/2007101500 Firefox/2.0.0.10";
+     return agent.latin1();
+ }
+ 
+@@ -583,7 +591,7 @@
+                                    KLibrary *handle, int width, int height,
+                                    QString src, QString /*mime*/,
+                                    QString appId, QString callbackId,
+-                                   bool embed,
++                                   bool embed, WId xembed,
+                                    QObject *parent, const char* name )
+    : DCOPObject(), QObject( parent, name ) 
+ {
+@@ -599,6 +607,8 @@
+    _streams.setAutoDelete( true );
+    _waitingRequests.setAutoDelete( true );
+    _callback = new NSPluginCallbackIface_stub( appId.latin1(), callbackId.latin1() );
++   _xembed_window = xembed;
++   _toplevel = _form = 0;
  
+    KURL base(src);
+    base.setFileName( QString::null );
+@@ -619,51 +629,53 @@
+    if (height == 0)
+       height = 1200;
  
+-   // create drawing area
+-   Arg args[7];
+-   Cardinal nargs = 0;
+-   XtSetArg(args[nargs], XtNwidth, width); nargs++;
+-   XtSetArg(args[nargs], XtNheight, height); nargs++;
+-   XtSetArg(args[nargs], XtNborderWidth, 0); nargs++;
+-
+-   String n, c;
+-   XtGetApplicationNameAndClass(qt_xdisplay(), &n, &c);
+-
+-   _toplevel = XtAppCreateShell("drawingArea", c, applicationShellWidgetClass,
+-                                qt_xdisplay(), args, nargs);
+-
+-   // What exactly does widget mapping mean? Without this call the widget isn't
+-   // embedded correctly. With it the viewer doesn't show anything in standalone mode.
+-   //if (embed)
+-      XtSetMappedWhenManaged(_toplevel, False);
+-   XtRealizeWidget(_toplevel);
+-
+-   // Create form window that is searched for by flash plugin
+-   _form = XtVaCreateWidget("form", compositeWidgetClass, _toplevel, NULL);
+-   XtSetArg(args[nargs], XtNvisual, QPaintDevice::x11AppVisual()); nargs++;
+-   XtSetArg(args[nargs], XtNdepth, QPaintDevice::x11AppDepth()); nargs++;
+-   XtSetArg(args[nargs], XtNcolormap, QPaintDevice::x11AppColormap()); nargs++;
+-   XtSetValues(_form, args, nargs);
+-   XSync(qt_xdisplay(), false);
++   if( _xembed_window == 0 ) {
++      // create drawing area
++      Arg args[7];
++      Cardinal nargs = 0;
++      XtSetArg(args[nargs], XtNwidth, width); nargs++;
++      XtSetArg(args[nargs], XtNheight, height); nargs++;
++      XtSetArg(args[nargs], XtNborderWidth, 0); nargs++;
++
++      String n, c;
++      XtGetApplicationNameAndClass(qt_xdisplay(), &n, &c);
++
++      _toplevel = XtAppCreateShell("drawingArea", c, applicationShellWidgetClass,
++                                   qt_xdisplay(), args, nargs);
++
++      // What exactly does widget mapping mean? Without this call the widget isn't
++      // embedded correctly. With it the viewer doesn't show anything in standalone mode.
++      //if (embed)
++         XtSetMappedWhenManaged(_toplevel, False);
++      XtRealizeWidget(_toplevel);
++
++      // Create form window that is searched for by flash plugin
++      _form = XtVaCreateWidget("form", compositeWidgetClass, _toplevel, NULL);
++      XtSetArg(args[nargs], XtNvisual, QPaintDevice::x11AppVisual()); nargs++;
++      XtSetArg(args[nargs], XtNdepth, QPaintDevice::x11AppDepth()); nargs++;
++      XtSetArg(args[nargs], XtNcolormap, QPaintDevice::x11AppColormap()); nargs++;
++      XtSetValues(_form, args, nargs);
++      XSync(qt_xdisplay(), false);
+ 
+-   // From mozilla - not sure if it's needed yet, nor what to use for embedder
++      // From mozilla - not sure if it's needed yet, nor what to use for embedder
+ #if 0
+-   /* this little trick seems to finish initializing the widget */
++      /* this little trick seems to finish initializing the widget */
+ #if XlibSpecificationRelease >= 6
+-   XtRegisterDrawable(qt_xdisplay(), embedderid, _toplevel);
++      XtRegisterDrawable(qt_xdisplay(), embedderid, _toplevel);
+ #else
+-   _XtRegisterWindow(embedderid, _toplevel);
++      _XtRegisterWindow(embedderid, _toplevel);
+ #endif
+ #endif
+-   XtRealizeWidget(_form);
+-   XtManageChild(_form);
++      XtRealizeWidget(_form);
++      XtManageChild(_form);
+ 
+-   // Register forwarder
+-   XtAddEventHandler(_toplevel, (KeyPressMask|KeyReleaseMask), 
+-                     False, forwarder, (XtPointer)this );
+-   XtAddEventHandler(_form, (KeyPressMask|KeyReleaseMask), 
+-                     False, forwarder, (XtPointer)this );
+-   XSync(qt_xdisplay(), false);
++      // Register forwarder
++      XtAddEventHandler(_toplevel, (KeyPressMask|KeyReleaseMask), 
++                        False, forwarder, (XtPointer)this );
++      XtAddEventHandler(_form, (KeyPressMask|KeyReleaseMask), 
++                        False, forwarder, (XtPointer)this );
++      XSync(qt_xdisplay(), false);
++   }
+ }
+ 
+ NSPluginInstance::~NSPluginInstance()
+@@ -714,14 +726,16 @@
+         if (saved)
+           g_NPN_MemFree(saved);
+ 
+-        XtRemoveEventHandler(_form, (KeyPressMask|KeyReleaseMask), 
+-                             False, forwarder, (XtPointer)this);
+-        XtRemoveEventHandler(_toplevel, (KeyPressMask|KeyReleaseMask), 
+-                             False, forwarder, (XtPointer)this);
+-        XtDestroyWidget(_form);
+-	_form = 0;
+-        XtDestroyWidget(_toplevel);
+-	_toplevel = 0;
++        if( _form != 0 ) {
++            XtRemoveEventHandler(_form, (KeyPressMask|KeyReleaseMask), 
++                                 False, forwarder, (XtPointer)this);
++            XtRemoveEventHandler(_toplevel, (KeyPressMask|KeyReleaseMask), 
++                                 False, forwarder, (XtPointer)this);
++            XtDestroyWidget(_form);
++    	    _form = 0;
++            XtDestroyWidget(_toplevel);
++	    _toplevel = 0;
++        }
+ 
+         if (_npp) {
+             ::free(_npp);   // matched with malloc() in newInstance
+@@ -806,7 +820,7 @@
+                     s->post( url, req.data, req.mime, req.notify, req.args );
+                 } else if (url.lower().startsWith("javascript:")){
+                     if (_callback) {
+-                        static int _jsrequestid = 0;
++                        static Q_INT32 _jsrequestid = 0;
+ 			_jsrequests.insert(_jsrequestid, new Request(req));
+                         _callback->evalJavaScript(_jsrequestid++, url.mid(11));
+                     } else {
+@@ -902,8 +916,7 @@
+    _timer->start( 100, true );
+ }
+ 
+-
+-int NSPluginInstance::setWindow(int remove)
++int NSPluginInstance::setWindow(Q_INT8 remove)
+ {
+    if (remove)
+    {
+@@ -926,14 +939,24 @@
+    _win.clipRect.bottom = _height;
+    _win.clipRect.right = _width;
+ 
+-   _win.window = (void*) XtWindow(_form);
+-   kdDebug(1431) << "Window ID = " << _win.window << endl;
++   if( _xembed_window ) {
++      _win.window = (void*) _xembed_window;
++      _win_info.type = NP_SETWINDOW;
++      _win_info.display = qt_xdisplay();
++      _win_info.visual = DefaultVisualOfScreen(DefaultScreenOfDisplay(qt_xdisplay()));
++      _win_info.colormap = DefaultColormapOfScreen(DefaultScreenOfDisplay(qt_xdisplay()));
++      _win_info.depth = DefaultDepthOfScreen(DefaultScreenOfDisplay(qt_xdisplay()));
++   } else {
++      _win.window = (void*) XtWindow(_form);
+ 
+-   _win_info.type = NP_SETWINDOW;
+-   _win_info.display = XtDisplay(_form);
+-   _win_info.visual = DefaultVisualOfScreen(XtScreen(_form));
+-   _win_info.colormap = DefaultColormapOfScreen(XtScreen(_form));
+-   _win_info.depth = DefaultDepthOfScreen(XtScreen(_form));
++      _win_info.type = NP_SETWINDOW;
++      _win_info.display = XtDisplay(_form);
++      _win_info.visual = DefaultVisualOfScreen(XtScreen(_form));
++      _win_info.colormap = DefaultColormapOfScreen(XtScreen(_form));
++      _win_info.depth = DefaultDepthOfScreen(XtScreen(_form));
++   }
++
++   kdDebug(1431) << "Window ID = " << _win.window << endl;
+ 
+    _win.ws_info = &_win_info;
+ 
+@@ -957,11 +980,8 @@
+ }
+ 
+ 
+-void NSPluginInstance::resizePlugin(int w, int h)
++void NSPluginInstance::resizePlugin(Q_INT32 w, Q_INT32 h)
+ {
+-   if (!_visible)
+-      return;
+-
+    if (w == _width && h == _height)
+       return;
+ 
+@@ -970,22 +990,30 @@
+    _width = w;
+    _height = h;
+ 
+-   XResizeWindow(qt_xdisplay(), XtWindow(_form), w, h);
+-   XResizeWindow(qt_xdisplay(), XtWindow(_toplevel), w, h);
+-
+-   Arg args[7];
+-   Cardinal nargs = 0;
+-   XtSetArg(args[nargs], XtNwidth, _width); nargs++;
+-   XtSetArg(args[nargs], XtNheight, _height); nargs++;
+-   XtSetArg(args[nargs], XtNvisual, QPaintDevice::x11AppVisual()); nargs++;
+-   XtSetArg(args[nargs], XtNdepth, QPaintDevice::x11AppDepth()); nargs++;
+-   XtSetArg(args[nargs], XtNcolormap, QPaintDevice::x11AppColormap()); nargs++;
+-   XtSetArg(args[nargs], XtNborderWidth, 0); nargs++;
+-
+-   XtSetValues(_toplevel, args, nargs);
+-   XtSetValues(_form, args, nargs);
+-
+-   resizeWidgets(XtWindow(_form), _width, _height);
++   if( _form != 0 ) {
++      XResizeWindow(qt_xdisplay(), XtWindow(_form), w, h);
++      XResizeWindow(qt_xdisplay(), XtWindow(_toplevel), w, h);
++
++      Arg args[7];
++      Cardinal nargs = 0;
++      XtSetArg(args[nargs], XtNwidth, _width); nargs++;
++      XtSetArg(args[nargs], XtNheight, _height); nargs++;
++      XtSetArg(args[nargs], XtNvisual, QPaintDevice::x11AppVisual()); nargs++;
++      XtSetArg(args[nargs], XtNdepth, QPaintDevice::x11AppDepth()); nargs++;
++      XtSetArg(args[nargs], XtNcolormap, QPaintDevice::x11AppColormap()); nargs++;
++      XtSetArg(args[nargs], XtNborderWidth, 0); nargs++;
++ 
++      XtSetValues(_toplevel, args, nargs);
++      XtSetValues(_form, args, nargs);
++
++      resizeWidgets(XtWindow(_form), _width, _height);
++   }
++
++   // If not visible yet, displayWindow() will call setWindow() again anyway, so avoid this.
++   // This also handled plugins that are broken and cannot handle repeated setWindow() calls
++   // very well.
++   if (!_visible)
++      return;
+ 
+    setWindow();
+ 
+@@ -993,7 +1021,7 @@
+ }
+ 
+ 
+-void NSPluginInstance::javascriptResult(int id, QString result) {
++void NSPluginInstance::javascriptResult(Q_INT32 id, QString result) {
+     QMap<int, Request*>::iterator i = _jsrequests.find( id );
+     if (i != _jsrequests.end()) {
+         Request *req = i.data();
+@@ -1402,10 +1430,10 @@
+ }
+ 
+ 
+-DCOPRef NSPluginClass::newInstance( QString url, QString mimeType, bool embed,
++DCOPRef NSPluginClass::newInstance( QString url, QString mimeType, Q_INT8 embed,
+                                     QStringList argn, QStringList argv,
+                                     QString appId, QString callbackId,
+-                                    bool reload, bool doPost, QByteArray postData )
++                                    Q_INT8 reload, Q_INT8 doPost, QByteArray postData, Q_UINT32 xembed )
+ {
+    kdDebug(1431) << "-> NSPluginClass::NewInstance" << endl;
+ 
+@@ -1449,16 +1477,25 @@
+    memset(npp, 0, sizeof(NPP_t));
+    npp->ndata = NULL;
+ 
+-   // Create plugin instance object
+-   NSPluginInstance *inst = new NSPluginInstance( npp, &_pluginFuncs, _handle,
+-                                                  width, height, baseURL, mimeType,
+-                                                  appId, callbackId, embed, this );
+-
+    // create plugin instance
+    NPError error = _pluginFuncs.newp(mime, npp, embed ? NP_EMBED : NP_FULL,
+                                      argc, _argn, _argv, 0);
+    kdDebug(1431) << "NPP_New = " << (int)error << endl;
+ 
++   // don't use bool here, it can be 1 byte, but some plugins write it as int, and I can't find what the spec says
++   int wants_xembed = false;
++   if (_pluginFuncs.getvalue) {
++      NPError error = _pluginFuncs.getvalue(npp, (NPPVariable)14/*NPPVpluginNeedsXEmbed*/, &wants_xembed );
++      if( error != NPERR_NO_ERROR )
++         wants_xembed = false;
++   }
++   kdDebug(1431) << "Plugin requires XEmbed:" << (bool)wants_xembed << endl;
++
++   // Create plugin instance object
++   NSPluginInstance *inst = new NSPluginInstance( npp, &_pluginFuncs, _handle,
++                                                  width, height, baseURL, mimeType,
++                                                  appId, callbackId, embed, wants_xembed ? xembed : 0, this );
++
+    // free arrays with arguments
+    delete [] _argn;
+    delete [] _argv;
+@@ -1493,7 +1530,6 @@
+     timer(); //_timer->start( 0, TRUE );
+ }
+ 
+-
+ /****************************************************************************/
+ 
+ NSPluginStreamBase::NSPluginStreamBase( NSPluginInstance *instance )
+@@ -1516,8 +1552,6 @@
+ 
+    delete _tempFile;
+    _tempFile = 0;
+-   delete _queue;
+-   _queue = 0;
+ }
+ 
+ 
+diff -ur kdebase-orig/nsplugins/viewer/nsplugin.h kdebase-3.5.8/nsplugins/viewer/nsplugin.h
+--- kdebase-orig/nsplugins/viewer/nsplugin.h	2007-10-08 11:51:23.000000000 +0200
++++ kdebase-3.5.8/nsplugins/viewer/nsplugin.h	2008-01-29 15:51:21.000000000 +0100
+@@ -165,16 +165,16 @@
+   // constructor, destructor
+   NSPluginInstance( NPP privateData, NPPluginFuncs *pluginFuncs, KLibrary *handle,
+ 		    int width, int height, QString src, QString mime,
+-                    QString appId, QString callbackId, bool embed,
++                    QString appId, QString callbackId, bool embed, WId xembed,
+ 		    QObject *parent, const char* name=0 );
+   ~NSPluginInstance();
+ 
+   // DCOP functions
+   void shutdown();
+-  int winId() { return XtWindow(_form); }
+-  int setWindow(int remove=0);
+-  void resizePlugin(int w, int h);
+-  void javascriptResult(int id, QString result);
++  int winId() { return _form != 0 ? XtWindow(_form) : 0; }
++  int setWindow(Q_INT8 remove=0);
++  void resizePlugin(Q_INT32 w, Q_INT32 h);
++  void javascriptResult(Q_INT32 id, QString result);
+   void displayPlugin();
+ 
+   // value handling
+@@ -232,6 +232,7 @@
+   NPPluginFuncs _pluginFuncs;
+ 
+   Widget _area, _form, _toplevel;
++  WId _xembed_window;
+   QString _baseURL;
+   int _width, _height;
+ 
+@@ -278,10 +279,10 @@
+   ~NSPluginClass();
+ 
+   QString getMIMEDescription();
+-  DCOPRef newInstance(QString url, QString mimeType, bool embed,
++  DCOPRef newInstance(QString url, QString mimeType, Q_INT8 embed,
+                       QStringList argn, QStringList argv,
+-                      QString appId, QString callbackId, bool reload, bool post,
+-                      QByteArray postData );
++                      QString appId, QString callbackId, Q_INT8 reload, Q_INT8 post,
++                      QByteArray postData, Q_UINT32 xembed );
+   void destroyInstance( NSPluginInstance* inst );
+   bool error() { return _error; }
+ 
+diff -ur kdebase-orig/nsplugins/viewer/qxteventloop.cpp kdebase-3.5.8/nsplugins/viewer/qxteventloop.cpp
+--- kdebase-orig/nsplugins/viewer/qxteventloop.cpp	2007-05-14 09:55:42.000000000 +0200
++++ kdebase-3.5.8/nsplugins/viewer/qxteventloop.cpp	2008-01-29 15:51:21.000000000 +0100
+@@ -72,7 +72,7 @@
+ 
+     QIntDict<QSocketNotifier> socknotDict;
+     bool activate_timers;
+-    int timerid;
++    XtIntervalId timerid;
+ 
+     // arguments for Xt display initialization
+     const char* applicationClass;
+@@ -110,7 +110,7 @@
+ 
+ QXtEventLoopPrivate::QXtEventLoopPrivate()
+     : appContext(NULL), ownContext(NULL),
+-      activate_timers(FALSE), timerid(-1)
++      activate_timers(FALSE), timerid(0)
+ {
+ }
+ 
+@@ -416,7 +416,7 @@
+ void qmotif_timeout_handler( XtPointer, XtIntervalId * )
+ {
+     static_d->activate_timers = TRUE;
+-    static_d->timerid = -1;
++    static_d->timerid = 0;
+ }
+ 
+ /*! \reimp
+@@ -429,10 +429,10 @@
+ 
+     // make sure we fire off Qt's timers
+     int ttw = timeToWait();
+-    if ( d->timerid != -1 ) {
++    if ( d->timerid != 0 ) {
+ 	XtRemoveTimeOut( d->timerid );
+     }
+-    d->timerid = -1;
++    d->timerid = 0;
+     if ( ttw != -1 ) {
+ 	d->timerid =
+ 	    XtAppAddTimeOut( d->appContext, ttw,
+diff -ur kdebase-orig/nsplugins/viewer/resolve.h kdebase-3.5.8/nsplugins/viewer/resolve.h
+--- kdebase-orig/nsplugins/viewer/resolve.h	2005-10-10 17:04:05.000000000 +0200
++++ kdebase-3.5.8/nsplugins/viewer/resolve.h	2008-01-29 15:51:21.000000000 +0100
+@@ -40,7 +40,7 @@
+ 
+ 
+ #define CHECK(fname,error)                    \
+-  kdDebug() << "Result of " << endl;          \
++  kdDebug() << "Result of " << #fname << ":" << error << endl;          \
+   return error;
+ 
+ 
+diff -ur kdebase-orig/nsplugins/viewer/viewer.cpp kdebase-3.5.8/nsplugins/viewer/viewer.cpp
+--- kdebase-orig/nsplugins/viewer/viewer.cpp	2006-01-19 18:01:49.000000000 +0100
++++ kdebase-3.5.8/nsplugins/viewer/viewer.cpp	2008-01-29 15:51:04.000000000 +0100
+@@ -52,8 +52,13 @@
+ #include <X11/Shell.h>
+ #else
+ #include "qxteventloop.h"
++#include "glibevents.h"
+ #endif
+ 
++// FIXME: this is just for calling gtk_init and fix the buggy flash player
++// initialization
++#include <gtk/gtkmain.h>
++
+ /**
+  *  Use RLIMIT_DATA on systems that don't define RLIMIT_AS,
+  *  such as FreeBSD 4.
+@@ -215,6 +220,10 @@
+ 
+ int main(int argc, char** argv)
+ {
++    // FIXME; the gtk_init() call is here to fix a bug in flash player that does
++    // not call it properly, or call it in a wrong place
++    gtk_init(&argc, &argv);
++
+     // nspluginviewer is a helper app, it shouldn't do session management at all
+    setenv( "SESSION_MANAGER", "", 1 );
+ 
+@@ -249,6 +258,7 @@
+ 
+    kdDebug(1430) << "4 - create KApplication" << endl;
+    KApplication app( argc,  argv, "nspluginviewer" );
++   GlibEvents glibevents;
+ #endif
+ 
+    {


Index: kdebase.spec
===================================================================
RCS file: /cvs/extras/rpms/kdebase/F-8/kdebase.spec,v
retrieving revision 1.285
retrieving revision 1.286
diff -u -r1.285 -r1.286
--- kdebase.spec	28 Jan 2008 12:37:06 -0000	1.285
+++ kdebase.spec	29 Jan 2008 15:03:32 -0000	1.286
@@ -22,7 +22,7 @@
 %endif
 
 Version: 3.5.8
-Release: 31%{?dist}
+Release: 32%{?dist}
 
 %if 0%{?fedora} > 8
 Name: kdebase3
@@ -814,6 +814,9 @@
 
 
 %changelog
+* Tue Jan 29 2008 Lukas Tinkl <lukas at kde.org> - 3.5.8-32
+- updated flash patch to support 64 bit platforms
+
 * Mon Jan 28 2008 Than Ngo <than at redhat.com> 3.5.8-31
 - kdm: local DoS vulnerability, CVE-2007-5963
 




More information about the fedora-extras-commits mailing list