/*************************************************************************** kplayerwidget.cpp ----------------- begin : Sun Dec 01 2002 copyright : (C) 2002-2007 by kiriuja email : http://kplayer.sourceforge.net/email.html ***************************************************************************/ /*************************************************************************** * 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 3 of the License, or * * (at your option) any later version. * ***************************************************************************/ #include #include #include #include #ifdef DEBUG #define DEBUG_KPLAYER_WIDGET #define DEBUG_KPLAYER_WORKSPACE #endif #include "kplayerwidget.h" #include "kplayerwidget.moc" #include "kplayerengine.h" #include "kplayerprocess.h" #include "kplayersettings.h" void KPlayerX11SetInputFocus (uint id); void KPlayerX11MapWindow (uint id); void KPlayerX11UnmapWindow (uint id); void KPlayerX11ClearExposeWindow (uint id); void KPlayerX11SendConfigureEvent (uint id, int w, int h); void KPlayerSetX11EventFilter (void); void KPlayerResetX11EventFilter (void); // WM_NORMAL_HINTS, XSizeHints, XSetWMNormalHints() ??? void KPlayerWidgetResizeHandler (bool resizing) { if ( kPlayerWorkspace() ) kPlayerWorkspace() -> resizeHandler (resizing); } void KPlayerWidgetMapHandler (uint wid) { if ( kPlayerWidget() ) kPlayerWidget() -> mapHandler (wid); } void KPlayerWidgetUnmapHandler (uint wid) { if ( kPlayerWidget() ) kPlayerWidget() -> unmapHandler (wid); } KPlayerWidget::KPlayerWidget (TQWidget *parent, const char *name) : TQWidget (parent, name) { #ifdef DEBUG_KPLAYER_WIDGET kdDebugTime() << "Creating widget\n"; #endif connect (kPlayerProcess(), TQ_SIGNAL (stateChanged (KPlayerProcess::State, KPlayerProcess::State)), TQ_SLOT (playerStateChanged (KPlayerProcess::State, KPlayerProcess::State))); TQWhatsThis::add (this, i18n("Video area is the central part of KPlayer. When playing a file that has video, it will display the video and optionally subtitles. Normally it will be hidden when playing an audio only file.")); setFocusPolicy (TQWidget::NoFocus); //setEnabled (false); setEraseColor (TQColor (0, 0, 0)); setMinimumSize (TQSize (0, 0)); KPlayerSetX11EventFilter(); } KPlayerWidget::~KPlayerWidget() { #ifdef DEBUG_KPLAYER_WIDGET kdDebugTime() << "Destroying widget\n"; #endif KPlayerResetX11EventFilter(); } void KPlayerWidget::sendConfigureEvent (void) { KPlayerX11SendConfigureEvent (winId(), width(), height()); } void KPlayerWidget::mapHandler (uint wid) { if ( wid == winId() ) { #ifdef DEBUG_KPLAYER_WIDGET kdDebugTime() << "Mapping; process state " << kPlayerProcess() -> state() << "\n"; #endif //if ( ! kPlayerProcess() -> is09Version() ) KPlayerX11UnmapWindow (winId()); show(); //if ( ! kPlayerProcess() -> is09Version() ) KPlayerX11MapWindow (winId()); } } void KPlayerWidget::unmapHandler (uint wid) { if ( wid == winId() ) { #ifdef DEBUG_KPLAYER_WIDGET kdDebugTime() << "Unmapping " << wid << "; process state " << kPlayerProcess() -> state() << "\n"; #endif hide(); KPlayerX11MapWindow (winId()); //if ( false && kPlayerProcess() -> is09Version() ) // KPlayerX11ClearExposeWindow (winId()); sendConfigureEvent(); } } void KPlayerWidget::showEvent (TQShowEvent* event) { TQWidget::showEvent (event); //if ( kPlayerProcess() -> is09Version() ) sendConfigureEvent(); } void KPlayerWidget::resizeEvent (TQResizeEvent* event) { #ifdef DEBUG_KPLAYER_WIDGET kdDebugTime() << "Widget " << event -> oldSize().width() << "x" << event -> oldSize().height() << " => " << event -> size().width() << "x" << event -> size().height() << "\n"; #endif TQWidget::resizeEvent (event); /*if ( kPlayerProcess() -> is09Version() ) { KPlayerX11UnmapWindow (winId()); KPlayerX11MapWindow (winId()); }*/ /*if ( false && kPlayerProcess() -> is09Version() ) { KPlayerX11UnmapWindow (winId()); KPlayerX11MapWindow (winId()); KPlayerX11ClearExposeWindow (winId()); KPlayerX11SendConfigureEvent (winId(), event -> size().width(), event -> size().height()); }*/ #ifdef DEBUG_KPLAYER_WIDGET kdDebugTime() << "Widget resize; process state " << kPlayerProcess() -> state() << "\n"; #endif } void KPlayerWidget::mouseMoveEvent (TQMouseEvent* event) { TQWidget::mouseMoveEvent (event); event -> ignore(); } void KPlayerWidget::mousePressEvent (TQMouseEvent* event) { #ifdef DEBUG_KPLAYER_WIDGET kdDebugTime() << "KPlayerWidget mouse press event\n"; #endif TQWidget::mousePressEvent (event); event -> ignore(); } void KPlayerWidget::mouseReleaseEvent (TQMouseEvent* event) { #ifdef DEBUG_KPLAYER_WIDGET kdDebugTime() << "KPlayerWidget mouse release event\n"; #endif TQWidget::mouseReleaseEvent (event); event -> ignore(); } void KPlayerWidget::mouseDoubleClickEvent (TQMouseEvent* event) { #ifdef DEBUG_KPLAYER_WIDGET kdDebugTime() << "KPlayerWidget mouse double click\n"; #endif TQWidget::mouseDoubleClickEvent (event); event -> ignore(); } void KPlayerWidget::contextMenuEvent (TQContextMenuEvent* event) { #ifdef DEBUG_KPLAYER_WIDGET kdDebugTime() << "KPlayerWidget context menu event\n"; #endif TQWidget::contextMenuEvent (event); event -> ignore(); } void KPlayerWidget::wheelEvent (TQWheelEvent* event) { #ifdef DEBUG_KPLAYER_WIDGET kdDebugTime() << "Widget wheel event: delta " << event -> delta() << " position " << event -> x() << "x" << event -> y() << " global " << event -> globalX() << "x" << event -> globalY() << " state " << event -> state() << " orientation " << event -> orientation() << " accepted " << event -> isAccepted() << " spontaneous " << event -> spontaneous() << "\n"; #endif TQWidget::wheelEvent (event); event -> ignore(); } void KPlayerWidget::focusInEvent (TQFocusEvent* event) { #ifdef DEBUG_KPLAYER_WIDGET kdDebugTime() << "Widget focus in event\n"; #endif TQWidget::focusInEvent (event); } void KPlayerWidget::focusOutEvent (TQFocusEvent* event) { #ifdef DEBUG_KPLAYER_WIDGET kdDebugTime() << "Widget focus out event\n"; #endif TQWidget::focusOutEvent (event); } void KPlayerWidget::playerStateChanged (KPlayerProcess::State state, KPlayerProcess::State) { #ifdef DEBUG_KPLAYER_WIDGET kdDebugTime() << "State change received by the widget: " << state << "\n"; #endif /*if ( false && kPlayerProcess() -> is09Version() && state == KPlayerProcess::Playing ) { KPlayerX11MapWindow (winId()); KPlayerX11ClearExposeWindow (winId()); }*/ if ( kPlayerProcess() -> is09Version() && state == KPlayerProcess::Playing ) KPlayerX11ClearExposeWindow (winId()); sendConfigureEvent(); } KPlayerWorkspace::KPlayerWorkspace (TQWidget* parent, const char* name) : TQWidget (parent, name), m_timer (this) { #ifdef DEBUG_KPLAYER_WORKSPACE kdDebugTime() << "Creating workspace\n"; #endif m_mouse_activity = m_resizing = false; m_widget = new KPlayerWidget (this); connect (&m_timer, TQ_SIGNAL (timeout()), TQ_SLOT (cursorTimeout())); connect (kPlayerProcess(), TQ_SIGNAL (stateChanged (KPlayerProcess::State, KPlayerProcess::State)), TQ_SLOT (playerStateChanged (KPlayerProcess::State, KPlayerProcess::State))); connect (kPlayerProcess(), TQ_SIGNAL (sizeAvailable()), TQ_SLOT (setMouseCursorTracking())); TQWhatsThis::add (this, i18n("Video area is the central part of KPlayer. When playing a file that has video, it will display the video and optionally subtitles. Normally it will be hidden when playing an audio only file.")); setEraseColor (TQColor (0, 0, 0)); setMinimumSize (TQSize (0, 0)); setFocusPolicy (TQWidget::StrongFocus); TQWidget* proxy = new TQWidget (parent); proxy -> setEraseColor (TQColor (0, 0, 0)); proxy -> setFocusPolicy (TQWidget::StrongFocus); proxy -> setGeometry (-4, -4, 1, 1); proxy -> lower(); proxy -> show(); setFocusProxy (proxy); m_hidden_widget = new TQWidget (this); m_hidden_widget -> setGeometry (-10, -10, 5, 5); } void KPlayerWorkspace::setDisplaySize (TQSize size) { #ifdef DEBUG_KPLAYER_WORKSPACE kdDebugTime() << "Workspace::setDisplaySize (" << size.width() << "x" << size.height() << ")\n"; kdDebugTime() << "Workspace::Widget size " << m_widget -> width() << "x" << m_widget -> height() << "\n"; #endif //if ( m_widget -> size() != size ) m_widget -> setGeometry ((width() - size.width()) / 2, (height() - size.height()) / 2, size.width(), size.height()); } void KPlayerWorkspace::resizeHandler (bool resizing) { if ( m_resizing == resizing ) return; m_resizing = resizing; if ( ! resizing ) TQTimer::singleShot (0, this, TQ_SIGNAL(userResize())); } void KPlayerWorkspace::resizeEvent (TQResizeEvent* event) { static bool recursion = false; #ifdef DEBUG_KPLAYER_WORKSPACE kdDebugTime() << "WSpace " << event -> oldSize(). width() << "x" << event -> oldSize(). height() << " => " << event -> size(). width() << "x" << event -> size(). height() << "\n"; #endif TQWidget::resizeEvent (event); if ( ! recursion && ! m_resizing ) { recursion = true; emit resized(); recursion = false; } } void KPlayerWorkspace::mouseMoveEvent (TQMouseEvent* event) { TQWidget::mouseMoveEvent (event); mouseActivity(); } void KPlayerWorkspace::contextMenuEvent (TQContextMenuEvent* event) { #ifdef DEBUG_KPLAYER_WORKSPACE kdDebugTime() << "KPlayerWorkspace context menu\n"; #endif emit contextMenu (event -> globalPos()); event -> accept(); } void KPlayerWorkspace::mousePressEvent (TQMouseEvent* event) { #ifdef DEBUG_KPLAYER_WIDGET kdDebugTime() << "KPlayerWorkspace mouse press event\n"; #endif TQWidget::mousePressEvent (event); if ( kPlayerEngine() -> light() && event -> button() == TQt::RightButton ) { emit contextMenu (event -> globalPos()); event -> accept(); } else event -> ignore(); mouseActivity(); } void KPlayerWorkspace::mouseReleaseEvent (TQMouseEvent* event) { #ifdef DEBUG_KPLAYER_WIDGET kdDebugTime() << "KPlayerWorkspace mouse release event\n"; #endif TQWidget::mouseReleaseEvent (event); event -> ignore(); mouseActivity(); } void KPlayerWorkspace::mouseDoubleClickEvent (TQMouseEvent* event) { #ifdef DEBUG_KPLAYER_WORKSPACE kdDebugTime() << "KPlayerWorkspace mouse double click\n"; #endif TQWidget::mouseDoubleClickEvent (event); kPlayerEngine() -> doubleClick(); event -> accept(); mouseActivity(); } void KPlayerWorkspace::wheelEvent (TQWheelEvent* event) { #ifdef DEBUG_KPLAYER_WORKSPACE kdDebugTime() << "Workspace wheel event: delta " << event -> delta() << " position " << event -> x() << "x" << event -> y() << " global " << event -> globalX() << "x" << event -> globalY() << " state " << event -> state() << " orientation " << event -> orientation() << " accepted " << event -> isAccepted() << " spontaneous " << event -> spontaneous() << "\n"; #endif TQWidget::wheelEvent (event); kPlayerEngine() -> wheel (event -> delta(), event -> state()); event -> accept(); mouseActivity(); } void KPlayerWorkspace::windowActivationChange (bool old) { TQWidget::windowActivationChange (old); bool active = isActiveWindow(); #ifdef DEBUG_KPLAYER_WORKSPACE kdDebugTime() << "Workspace activation " << old << " -> " << active << "\n"; #endif if ( active && focusProxy() ) KPlayerX11SetInputFocus (focusProxy() -> winId()); #ifdef DEBUG_KPLAYER_WORKSPACE else if ( active ) kdDebugTime() << " no focus proxy\n"; #endif } void KPlayerWorkspace::focusInEvent (TQFocusEvent* event) { #ifdef DEBUG_KPLAYER_WORKSPACE kdDebugTime() << "Workspace focus in event\n"; #endif TQWidget::focusInEvent (event); } void KPlayerWorkspace::focusOutEvent (TQFocusEvent* event) { #ifdef DEBUG_KPLAYER_WORKSPACE kdDebugTime() << "Workspace focus out event\n"; #endif TQWidget::focusOutEvent (event); } void KPlayerWorkspace::mouseActivity (void) { m_mouse_activity = true; setMouseCursor(); m_timer.start (1000, true); } void KPlayerWorkspace::setMouseCursor (void) { if ( ! m_mouse_activity && kPlayerEngine() -> process() -> state() == KPlayerProcess::Playing && kPlayerEngine() -> properties() -> hasVideo() ) { setCursor (KCursor::blankCursor()); widget() -> setCursor (KCursor::blankCursor()); } else { unsetCursor(); widget() -> unsetCursor(); } } void KPlayerWorkspace::cursorTimeout (void) { m_mouse_activity = false; setMouseCursor(); } void KPlayerWorkspace::setMouseCursorTracking (void) { setMouseCursor(); bool track = kPlayerProcess() -> state() == KPlayerProcess::Playing && kPlayerEngine() -> properties() -> hasVideo(); setMouseTracking (track); widget() -> setMouseTracking (track); } void KPlayerWorkspace::playerStateChanged (KPlayerProcess::State, KPlayerProcess::State) { setMouseCursorTracking(); }