summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@gnome.org>2007-07-21 13:46:02 +0100
committerBenjamin Otte <otte@gnome.org>2007-07-21 13:46:02 +0100
commit928c322a8a92100c147d4c68712e0ad2e0f50aa8 (patch)
treed162d4c79e77f1526c9373b18690f1982485cc39
initial commitHEADmaster
-rw-r--r--CMakeLists.txt43
-rw-r--r--flashplayer_part.cpp55
-rw-r--r--flashplayer_part.h44
-rw-r--r--flashplayerpart.desktop9
-rw-r--r--flashplayerwidget.cpp172
-rw-r--r--flashplayerwidget.h46
6 files changed, 369 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..bef517a
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,43 @@
+
+project( flashplayer_kpart )
+
+# KDE 3
+find_package(Qt3 REQUIRED)
+find_package(KDE3 REQUIRED)
+add_definitions( ${QT_DEFINITIONS} ${KDE3_DEFINITIONS} )
+
+include_directories(${KDE3_INCLUDE_DIR} ${QT_INCLUDE_DIR})
+include_directories(${CMAKE_BINARY_DIR})
+
+include( UsePkgConfig )
+
+# GLib library setup
+ PKGCONFIG(glib-2.0 GLibIncludeDir GLibLibDir GLibLinkFlags GLibCFlags)
+
+# Cairo graphics library setup
+ PKGCONFIG(cairo CairoIncludeDir CairoLibDir CairoLinkFlags CairoCFlags)
+
+# swfdec flash player library setup
+ PKGCONFIG(swfdec-0.5 SWFDecIncludeDir SWFDecLibDir SWFDecLinkFlags SWFDecCFlags)
+
+# Flash Player KPart
+
+set( flashplayer_PART_SRCS
+ flashplayerwidget.cpp
+ flashplayer_part.cpp )
+
+kde3_automoc(${flashplayer_PART_SRCS})
+kde3_add_kpart(flashplayerpart WITH_PREFIX ${flashplayer_PART_SRCS} )
+
+# add link flags for Glib, Cairo, Swfdec
+set_target_properties( flashplayerpart PROPERTIES LINK_FLAGS "${GLibLinkFlags} ${CairoLinkFlags} ${SWFDecLinkFlags}" )
+# add compile flags for Glib, Cairo, Swfdec
+set_source_files_properties( ${flashplayer_PART_SRCS} PROPERTIES
+ COMPILE_FLAGS "${GLibCFlags} ${CairoCFlags} ${SWFDecCFlags}" )
+
+
+target_link_libraries( flashplayerpart ${KDE3_KPARTS_LIBS} swfdec-0.5 cairo )
+install(TARGETS flashplayerpart DESTINATION ${KDE3PREFIX}/lib/kde3 )
+
+# install .desktop file to associate part with Flash mimetype
+install( FILES flashplayerpart.desktop DESTINATION ${KDE3PREFIX}/share/services )
diff --git a/flashplayer_part.cpp b/flashplayer_part.cpp
new file mode 100644
index 0000000..f2ee16f
--- /dev/null
+++ b/flashplayer_part.cpp
@@ -0,0 +1,55 @@
+
+// Own
+#include "flashplayer_part.h"
+
+// Qt
+#include <qurl.h>
+
+// Local
+#include "flashplayerwidget.h"
+
+extern "C"
+{
+ // entry point for the swfdec-based flash player part library,
+ // returns a new factory which can be used to construct Konsole parts
+ KDE_EXPORT void* init_libflashplayerpart()
+ {
+ return new FlashPlayer::PartFactory;
+ }
+}
+
+using namespace FlashPlayer;
+
+KParts::Part* PartFactory::createPartObject( QWidget* parentWidget,
+ const char* /* something */,
+ QObject* parent,
+ const char* /*classname*/,
+ const char* /* something_2 */,
+ const QStringList& /*args*/)
+{
+ return new Part(parentWidget,parent);
+}
+
+class Part::Private
+{
+public:
+ FlashPlayerWidget* player;
+};
+
+Part::Part(QWidget* parentWidget , QObject* parent)
+ : KParts::ReadOnlyPart(parent)
+ , d(new Private)
+{
+ d->player = new FlashPlayerWidget(parentWidget);
+
+ setWidget(d->player);
+}
+bool Part::openFile()
+{
+ d->player->load( QUrl(url().path()) );
+ d->player->play();
+
+ return true;
+}
+
+#include "flashplayer_part.moc"
diff --git a/flashplayer_part.h b/flashplayer_part.h
new file mode 100644
index 0000000..ca1f010
--- /dev/null
+++ b/flashplayer_part.h
@@ -0,0 +1,44 @@
+#ifndef FLASHPLAYER_PART_H
+#define FLASHPLAYER_PART_H
+
+// KDE
+#include <kparts/factory.h>
+#include <kparts/part.h>
+
+
+class QStringList;
+
+namespace FlashPlayer
+{
+
+class PartFactory : public KParts::Factory
+{
+protected:
+ /** Reimplemented to create Konsole parts. */
+ virtual KParts::Part* createPartObject(QWidget* parentWidget = 0,
+ const char* something = 0,
+ QObject* parent = 0,
+ const char* classname = "KParts::Part",
+ const char* something_2 = 0,
+ const QStringList& args = QStringList());
+};
+
+class Part : public KParts::ReadOnlyPart
+{
+Q_OBJECT
+
+public:
+ Part(QWidget* parentWidget , QObject* parent = 0);
+
+protected:
+ /** Reimplemented from KParts::PartBase. */
+ virtual bool openFile();
+
+private:
+ class Private;
+ Private* d;
+};
+
+}
+
+#endif // FLASHPLAYER_PART_H
diff --git a/flashplayerpart.desktop b/flashplayerpart.desktop
new file mode 100644
index 0000000..544d9a8
--- /dev/null
+++ b/flashplayerpart.desktop
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=Flash Player
+MimeType=application/x-shockwave-flash
+ServiceTypes=KParts/ReadOnlyPart,Browser/View
+X-KDE-Library=libflashplayerpart
+Type=Service
+InitialPreference=1
+Icon=flashplayer
diff --git a/flashplayerwidget.cpp b/flashplayerwidget.cpp
new file mode 100644
index 0000000..847a130
--- /dev/null
+++ b/flashplayerwidget.cpp
@@ -0,0 +1,172 @@
+
+// Local
+#include "flashplayerwidget.h"
+
+// Qt
+#include "qapplication.h"
+#include "qpainter.h"
+#include "qpixmap.h"
+#include "qtimer.h"
+#include "qurl.h"
+
+// Cairo
+#include <X11/Xlib.h>
+#include <cairo/cairo.h>
+#include <cairo/cairo-xlib.h>
+
+// swfdec
+#include <libswfdec/swfdec.h>
+
+class FlashPlayerWidget::Private
+{
+public:
+ Private()
+ {
+ player = 0;
+ loader = 0;
+ backingPixmap = 0;
+ surface = 0;
+ timer = 0;
+ mouseButton = 0;
+ }
+
+ SwfdecPlayer* player;
+ SwfdecLoader* loader;
+
+ QPixmap backingPixmap;
+ cairo_surface_t* surface;
+
+ QTimer* timer;
+
+ int mouseButton;
+
+ static bool swfDecStarted;
+};
+
+bool FlashPlayerWidget::Private::swfDecStarted = false;
+
+FlashPlayerWidget::FlashPlayerWidget(QWidget* parent)
+ : QWidget(parent)
+ , d(new Private)
+{
+ // widget attributes
+ setWFlags( getWFlags() | Qt::WNoAutoErase );
+ setMouseTracking(true);
+
+ // load swfdec
+ if ( !Private::swfDecStarted )
+ {
+ swfdec_init();
+ Private::swfDecStarted = true;
+ }
+
+ // setup player
+ d->player = swfdec_player_new();
+
+ // setup timer to advance movie
+ d->timer = new QTimer(this);
+ d->timer->changeInterval(40);
+ connect( d->timer , SIGNAL(timeout()) , this , SLOT(advance()) );
+}
+FlashPlayerWidget::~FlashPlayerWidget()
+{
+ cairo_surface_destroy( d->surface );
+}
+void FlashPlayerWidget::resizeEvent( QResizeEvent* event )
+{
+ prepareSurface();
+}
+void FlashPlayerWidget::prepareSurface()
+{
+ // cairo surface
+ if ( d->surface )
+ cairo_surface_destroy( d->surface );
+
+ d->backingPixmap = QPixmap(width(),height());
+
+ // TODO - Find a way to get correct screen, visual rather
+ // than just the default ones
+ Display* display = d->backingPixmap.x11Display();
+ int screen = d->backingPixmap.x11Screen();
+ void* visual = d->backingPixmap.x11Visual();
+
+ d->surface = cairo_xlib_surface_create( display ,
+ d->backingPixmap.handle(),
+ (Visual*)visual,
+ width(),
+ height() );
+}
+void FlashPlayerWidget::paintEvent( QPaintEvent* event )
+{
+
+ // copy to screen
+ QPainter qtPainter(this);
+ qtPainter.drawPixmap(0,0,d->backingPixmap);
+}
+
+void FlashPlayerWidget::mousePressEvent( QMouseEvent* event )
+{
+ d->mouseButton = 1;
+ handleMouseEvent(event);
+}
+void FlashPlayerWidget::mouseMoveEvent( QMouseEvent* event )
+{
+ handleMouseEvent(event);
+}
+void FlashPlayerWidget::mouseReleaseEvent( QMouseEvent* event )
+{
+ d->mouseButton = 0;
+ handleMouseEvent(event);
+}
+void FlashPlayerWidget::handleMouseEvent( QMouseEvent* event )
+{
+ swfdec_player_handle_mouse( d->player , event->pos().x() , event->pos().y() ,
+ d->mouseButton );
+
+ event->accept();
+}
+void FlashPlayerWidget::advance()
+{
+ swfdec_player_advance( d->player , swfdec_player_get_next_event(d->player) );
+
+ render();
+ update();
+}
+void FlashPlayerWidget::render()
+{
+ // create cairo painter
+ cairo_t* painter = cairo_create(d->surface);
+
+ // render movie
+ swfdec_player_render( d->player , painter , 0 , 0 , width() , height() );
+
+ // cleanup
+ cairo_show_page(painter);
+ cairo_destroy(painter);
+}
+QSize FlashPlayerWidget::movieSize() const
+{
+ int width;
+ int height;
+
+ swfdec_player_get_image_size( d->player , &width , &height );
+
+ return QSize(width,height);
+}
+void FlashPlayerWidget::play()
+{
+ if ( !d->timer->isActive() )
+ d->timer->start(40,FALSE);
+}
+void FlashPlayerWidget::pause()
+{
+ d->timer->stop();
+}
+void FlashPlayerWidget::load(const QUrl& url)
+{
+ d->loader = swfdec_loader_new_from_file(url.path().utf8().data());
+ swfdec_player_set_loader(d->player,d->loader);
+}
+
+#include "flashplayerwidget.moc"
+
diff --git a/flashplayerwidget.h b/flashplayerwidget.h
new file mode 100644
index 0000000..99a2e1b
--- /dev/null
+++ b/flashplayerwidget.h
@@ -0,0 +1,46 @@
+
+#ifndef FLASHPLAYERWIDGET_H
+#define FLASHPLAYERWIDGET_H
+
+// Qt
+#include <qwidget.h>
+
+class QUrl;
+
+class FlashPlayerWidget : public QWidget
+{
+Q_OBJECT
+
+ public:
+ FlashPlayerWidget(QWidget* parent = 0);
+ virtual ~FlashPlayerWidget();
+
+ QSize movieSize() const;
+
+ public slots:
+ void play();
+ void pause();
+ void load(const QUrl& url);
+
+ protected:
+ virtual void paintEvent( QPaintEvent* event );
+ virtual void mousePressEvent( QMouseEvent* event );
+ virtual void mouseReleaseEvent( QMouseEvent* event );
+ virtual void mouseMoveEvent( QMouseEvent* event );
+ virtual void resizeEvent( QResizeEvent* event );
+
+ private slots:
+ void advance();
+
+ private:
+ void handleMouseEvent( QMouseEvent* event );
+ void prepareSurface();
+ void render();
+
+ private:
+ class Private;
+ Private* d;
+};
+
+#endif //FLASHPLAYERWIDGET_H
+