diff options
-rw-r--r-- | CMakeLists.txt | 43 | ||||
-rw-r--r-- | flashplayer_part.cpp | 55 | ||||
-rw-r--r-- | flashplayer_part.h | 44 | ||||
-rw-r--r-- | flashplayerpart.desktop | 9 | ||||
-rw-r--r-- | flashplayerwidget.cpp | 172 | ||||
-rw-r--r-- | flashplayerwidget.h | 46 |
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 + |