/** * Copyright (C) 2002-2003 by Koos Vriezen * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License version 2 as published by the Free Software Foundation. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, * Boston, MA 02110-1301, USA. **/ #include #include #include // include files for TQt #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "kmplayerview.h" #include "kmplayercontrolpanel.h" #include "kmplayersource.h" #include "playlistview.h" #include "viewarea.h" #include #include #include #include static const int XKeyPress = KeyPress; #undef KeyPress #undef Always #undef Never #undef tqStatus #undef Unsorted #undef Bool extern const char * normal_window_xpm[]; extern const char * playlist_xpm[]; /* mouse invisible: define the time (in 1/1000 seconds) before mouse goes invisible */ using namespace KMPlayer; //------------------------------------------------------------------------- namespace KMPlayer { class KMPlayerPictureWidget : public TQWidget { View * m_view; public: KDE_NO_CDTOR_EXPORT KMPlayerPictureWidget (TQWidget * tqparent, View * view) : TQWidget (tqparent), m_view (view) {} KDE_NO_CDTOR_EXPORT ~KMPlayerPictureWidget () {} protected: void mousePressEvent (TQMouseEvent *); }; } // namespace KDE_NO_EXPORT void KMPlayerPictureWidget::mousePressEvent (TQMouseEvent *) { m_view->emitPictureClicked (); } //----------------------------------------------------------------------------- KDE_NO_CDTOR_EXPORT TextEdit::TextEdit (TQWidget * tqparent, View * view) : TQTextEdit (tqparent, "kde_kmplayer_console"), m_view (view) { setReadOnly (true); setPaper (TQBrush (TQColor (0, 0, 0))); setColor (TQColor (0xB2, 0xB2, 0xB2)); } KDE_NO_EXPORT void TextEdit::contextMenuEvent (TQContextMenuEvent * e) { m_view->controlPanel ()->popupMenu ()->exec (e->globalPos ()); } //----------------------------------------------------------------------------- KDE_NO_CDTOR_EXPORT InfoWindow::InfoWindow (TQWidget * tqparent, View * view) : TQTextEdit (tqparent, "kde_kmplayer_console"), m_view (view) { setReadOnly (true); setLinkUnderline (false); } KDE_NO_EXPORT void InfoWindow::contextMenuEvent (TQContextMenuEvent * e) { m_view->controlPanel ()->popupMenu ()->exec (e->globalPos ()); } //----------------------------------------------------------------------------- KDE_NO_CDTOR_EXPORT View::View (TQWidget *tqparent, const char *name) : KMediaPlayer::View (tqparent, name), m_image (0L), m_control_panel (0L), m_status_bar (0L), m_volume_slider (0L), m_mixer_object ("kicker"), m_controlpanel_mode (CP_Show), m_old_controlpanel_mode (CP_Show), m_statusbar_mode (SB_Hide), controlbar_timer (0), infopanel_timer (0), m_keepsizeratio (false), m_playing (false), m_mixer_init (false), m_inVolumeUpdate (false), m_tmplog_needs_eol (false), m_revert_fullscreen (false), m_no_info (false), m_edit_mode (false) {} KDE_NO_EXPORT void View::dropEvent (TQDropEvent * de) { KURL::List sl; if (KURLDrag::canDecode (de)) { KURLDrag::decode (de, sl); } else if (TQTextDrag::canDecode (de)) { TQString text; TQTextDrag::decode (de, text); sl.push_back (KURL (text)); } if (sl.size () > 0) { for (unsigned i = 0; i < sl.size (); i++) sl [i] = KURL::decode_string (sl [i].url ()); m_widgetstack->visibleWidget ()->setFocus (); emit urlDropped (sl); de->accept (); } } KDE_NO_EXPORT void View::dragEnterEvent (TQDragEnterEvent* dee) { if (isDragValid (dee)) dee->accept (); } KDE_NO_EXPORT void View::init (KActionCollection * action_collection) { setBackgroundMode(TQt::NoBackground); // prevents flashing //m_dockarea->setEraseColor (TQColor (0, 0, 0)); TQPalette pal (TQColor (64, 64,64), TQColor (32, 32, 32)); TQVBoxLayout * viewbox = new TQVBoxLayout (this, 0, 0); m_dockarea = new KDockArea (this, "kde_kmplayer_dock_area"); m_dock_video = new KDockWidget (m_dockarea->manager (), 0, KGlobal::iconLoader ()->loadIcon (TQString ("kmplayer"), KIcon::Small), m_dockarea); m_dock_video->setEraseColor (TQColor (0, 0, 255)); m_dock_video->setDockSite (KDockWidget::DockLeft | KDockWidget::DockBottom | KDockWidget::DockRight | KDockWidget::DockTop); m_dock_video->setEnableDocking(KDockWidget::DockNone); m_view_area = new ViewArea (m_dock_video, this); m_dock_video->setWidget (m_view_area); m_dockarea->setMainDockWidget (m_dock_video); m_dock_playlist = m_dockarea->createDockWidget (i18n ("Play List"), KGlobal::iconLoader ()->loadIcon (TQString ("player_playlist"), KIcon::Small)); m_playlist = new PlayListView (m_dock_playlist, this, action_collection); m_dock_playlist->setWidget (m_playlist); viewbox->addWidget (m_dockarea); m_widgetstack = new TQWidgetStack (m_view_area); m_control_panel = new ControlPanel (m_view_area, this); m_control_panel->setMaximumSize (2500, controlPanel ()->tqmaximumSize ().height ()); m_status_bar = new StatusBar (m_view_area); m_status_bar->insertItem (TQString (""), 0); TQSize sbsize = m_status_bar->tqsizeHint (); m_status_bar->hide (); m_status_bar->setMaximumSize (2500, sbsize.height ()); m_viewer = new Viewer (m_widgetstack, this); m_widgettypes [WT_Video] = m_viewer; #if KDE_IS_VERSION(3,1,90) setVideoWidget (m_view_area); #endif m_multiedit = new TextEdit (m_widgetstack, this); m_multiedit->setTextFormat (TQt::PlainText); TQFont fnt = KGlobalSettings::fixedFont (); m_multiedit->setFont (fnt); m_widgettypes[WT_Console] = m_multiedit; m_widgettypes[WT_Picture] = new KMPlayerPictureWidget (m_widgetstack, this); m_dock_infopanel = m_dockarea->createDockWidget ("infopanel", KGlobal::iconLoader ()->loadIcon (TQString ("info"), KIcon::Small)); m_infopanel = new InfoWindow (m_dock_infopanel, this); m_dock_infopanel->setWidget (m_infopanel); m_widgetstack->addWidget (m_viewer); m_widgetstack->addWidget (m_multiedit); m_widgetstack->addWidget (m_widgettypes[WT_Picture]); setFocusPolicy (TQ_ClickFocus); setAcceptDrops (true); m_view_area->resizeEvent (0L); kapp->installX11EventFilter (this); } KDE_NO_CDTOR_EXPORT View::~View () { delete m_image; if (TQT_BASE_OBJECT(m_view_area->tqparent ()) != TQT_BASE_OBJECT(this)) delete m_view_area; } KDE_NO_EXPORT void View::setEraseColor (const TQColor & color) { KMediaPlayer::View::setEraseColor (color); if (statusBar ()) { statusBar ()->setEraseColor (color); controlPanel ()->setEraseColor (color); } } void View::setInfoMessage (const TQString & msg) { bool ismain = m_dockarea->getMainDockWidget () == m_dock_infopanel; if (msg.isEmpty ()) { if (!ismain && !m_edit_mode && !infopanel_timer) infopanel_timer = startTimer (0); m_infopanel->clear (); } else if (ismain || !m_no_info) { if (!m_edit_mode && m_dock_infopanel->mayBeShow ()) m_dock_infopanel->manualDock(m_dock_video,KDockWidget::DockBottom,80); m_infopanel->setText (msg); } } void View::setStatusMessage (const TQString & msg) { if (m_statusbar_mode != SB_Hide) m_status_bar->changeItem (msg, 0); } void View::toggleShowPlaylist () { if (m_controlpanel_mode == CP_Only) return; if (m_dock_playlist->mayBeShow ()) { if (m_dock_playlist->isDockBackPossible ()) m_dock_playlist->dockBack (); else { bool horz = true; TQStyle & style = m_playlist->tqstyle (); int h = style.tqpixelMetric (TQStyle::PM_ScrollBarExtent, m_playlist); h += style.tqpixelMetric(TQStyle::PM_DockWindowFrameWidth, m_playlist); h +=style.tqpixelMetric(TQStyle::PM_DockWindowHandleExtent,m_playlist); for (TQListViewItem *i=m_playlist->firstChild();i;i=i->itemBelow()) { h += i->height (); if (h > int (0.25 * height ())) { horz = false; break; } } int perc = 30; if (horz && 100 * h / height () < perc) perc = 100 * h / height (); m_dock_playlist->manualDock (m_dock_video, horz ? KDockWidget::DockTop : KDockWidget::DockLeft, perc); } } else m_dock_playlist->undock (); } void View::setViewOnly () { if (m_dock_playlist->mayBeHide ()) m_dock_playlist->undock (); if (m_dock_infopanel->mayBeHide ()) m_dock_infopanel->undock (); } void View::setInfoPanelOnly () { if (m_dock_playlist->mayBeHide ()) m_dock_playlist->undock (); m_dock_video->setEnableDocking (KDockWidget::DockCenter); m_dock_video->undock (); m_dock_infopanel->setEnableDocking (KDockWidget::DockNone); m_dockarea->setMainDockWidget (m_dock_infopanel); } void View::setPlaylistOnly () { if (m_dock_infopanel->mayBeHide ()) m_dock_infopanel->undock (); m_dock_video->setEnableDocking (KDockWidget::DockCenter); m_dock_video->undock (); m_dock_playlist->setEnableDocking (KDockWidget::DockNone); m_dockarea->setMainDockWidget (m_dock_playlist); } void View::setEditMode (RootPlayListItem *ri, bool enable) { m_edit_mode = enable; m_infopanel->setReadOnly (!m_edit_mode); m_infopanel->setTextFormat (enable ? TQt::PlainText : TQt::AutoText); if (m_edit_mode && m_dock_infopanel->mayBeShow ()) m_dock_infopanel->manualDock(m_dock_video,KDockWidget::DockBottom,50); m_playlist->showAllNodes (ri, m_edit_mode); } bool View::setPicture (const TQString & path) { delete m_image; if (path.isEmpty ()) m_image = 0L; else { m_image = new TQPixmap (path); if (m_image->isNull ()) { delete m_image; m_image = 0L; kdDebug() << "View::setPicture failed " << path << endl; } } if (!m_image) { m_widgetstack->raiseWidget (m_viewer); } else { m_widgettypes[WT_Picture]->setPaletteBackgroundPixmap (*m_image); m_widgetstack->raiseWidget (m_widgettypes[WT_Picture]); setControlPanelMode (CP_AutoHide); } return m_image; } KDE_NO_EXPORT void View::updateVolume () { if (m_mixer_init && !m_volume_slider) return; TQByteArray data, replydata; TQCString replyType; int volume; bool has_mixer = kapp->dcopClient ()->call (m_mixer_object, "Mixer0", "masterVolume()", data, replyType, replydata); if (!has_mixer) { m_mixer_object = "kmix"; has_mixer = kapp->dcopClient ()->call (m_mixer_object, "Mixer0", "masterVolume()", data, replyType, replydata); } if (has_mixer) { TQDataStream replystream (replydata, IO_ReadOnly); replystream >> volume; if (!m_mixer_init) { TQLabel * mixer_label = new TQLabel (i18n ("Volume:"), m_control_panel->popupMenu ()); m_control_panel->popupMenu ()->insertItem (mixer_label, -1, 4); m_volume_slider = new TQSlider (0, 100, 10, volume, Qt::Horizontal, m_control_panel->popupMenu ()); connect(m_volume_slider, TQT_SIGNAL(valueChanged(int)), this,TQT_SLOT(setVolume(int))); m_control_panel->popupMenu ()->insertItem (m_volume_slider, ControlPanel::menu_volume, 5); m_control_panel->popupMenu ()->insertSeparator (6); } else { m_inVolumeUpdate = true; m_volume_slider->setValue (volume); m_inVolumeUpdate = false; } } else if (m_volume_slider) { m_control_panel->popupMenu ()->removeItemAt (6); m_control_panel->popupMenu ()->removeItemAt (5); m_control_panel->popupMenu ()->removeItemAt (4); m_volume_slider = 0L; } m_mixer_init = true; } void View::showWidget (WidgetType wt) { m_widgetstack->raiseWidget (m_widgettypes [wt]); if (m_widgetstack->visibleWidget () == m_widgettypes[WT_Console]) { addText (TQString (""), false); if (m_controlpanel_mode == CP_AutoHide && m_playing) m_control_panel->show(); } else delayedShowButtons (false); updateLayout (); } void View::toggleVideoConsoleWindow () { WidgetType wt = WT_Console; if (m_widgetstack->visibleWidget () == m_widgettypes[WT_Console]) { wt = WT_Video; m_control_panel->popupMenu ()->changeItem (ControlPanel::menu_video, KGlobal::iconLoader ()->loadIconSet (TQString ("konsole"), KIcon::Small, 0, true), i18n ("Con&sole")); } else m_control_panel->popupMenu ()->changeItem (ControlPanel::menu_video, KGlobal::iconLoader ()->loadIconSet (TQString ("video"), KIcon::Small, 0, true), i18n ("V&ideo")); showWidget (wt); emit windowVideoConsoleToggled (int (wt)); } void View::setControlPanelMode (ControlPanelMode m) { killTimer (controlbar_timer); controlbar_timer = 0L; m_old_controlpanel_mode = m_controlpanel_mode = m; if (m_playing && isFullScreen()) m_controlpanel_mode = CP_AutoHide; if ((m_controlpanel_mode == CP_Show || m_controlpanel_mode == CP_Only) && !m_control_panel->isVisible ()) { m_control_panel->show (); m_view_area->resizeEvent (0L); } else if (m_controlpanel_mode == CP_AutoHide) { if ((m_playing && m_widgetstack->visibleWidget () != m_widgettypes[WT_Console])) delayedShowButtons (false); else if (!m_control_panel->isVisible ()) { m_control_panel->show (); m_view_area->resizeEvent (0L); } } else if (m_controlpanel_mode == CP_Hide && m_control_panel->isVisible()) { m_control_panel->hide (); m_view_area->resizeEvent (0L); } } void View::setStatusBarMode (StatusBarMode m) { m_statusbar_mode = m; if (m == SB_Hide) m_status_bar->hide (); else m_status_bar->show (); m_view_area->resizeEvent (0L); } KDE_NO_EXPORT void View::delayedShowButtons (bool show) { if ((show && m_control_panel->isVisible ()) || (!show && !m_control_panel->isVisible ())) { if (controlbar_timer) { killTimer (controlbar_timer); controlbar_timer = 0; } if (!show) m_control_panel->hide (); // for initial race } else if (m_controlpanel_mode == CP_AutoHide && (m_playing || m_widgetstack->visibleWidget () == m_widgettypes[WT_Picture]) && m_widgetstack->visibleWidget () != m_widgettypes[WT_Console] && !controlbar_timer) { controlbar_timer = startTimer (500); } } KDE_NO_EXPORT void View::setVolume (int vol) { if (m_inVolumeUpdate) return; TQByteArray data; TQDataStream arg( data, IO_WriteOnly ); arg << vol; if (!kapp->dcopClient()->send (m_mixer_object, "Mixer0", "setMasterVolume(int)", data)) kdWarning() << "Failed to update volume" << endl; } KDE_NO_EXPORT void View::updateLayout () { if (m_controlpanel_mode == CP_Only) m_control_panel->setMaximumSize (2500, height ()); m_view_area->resizeEvent (0L); } void View::setKeepSizeRatio (bool b) { if (m_keepsizeratio != b) { m_keepsizeratio = b; updateLayout (); m_view_area->update (); } } KDE_NO_EXPORT void View::timerEvent (TQTimerEvent * e) { if (e->timerId () == controlbar_timer) { controlbar_timer = 0; if (m_playing || m_widgetstack->visibleWidget () == m_widgettypes[WT_Picture]) { int vert_buttons_pos = m_view_area->height()-statusBarHeight (); TQPoint mouse_pos = m_view_area->mapFromGlobal (TQCursor::pos ()); int cp_height = m_control_panel->tqmaximumSize ().height (); bool mouse_on_buttons = (//m_view_area->hasMouse () && mouse_pos.y () >= vert_buttons_pos-cp_height && mouse_pos.y ()<= vert_buttons_pos && mouse_pos.x () > 0 && mouse_pos.x () < m_control_panel->width()); if (mouse_on_buttons && !m_control_panel->isVisible ()) { m_control_panel->show (); m_view_area->resizeEvent (0L); } else if (!mouse_on_buttons && m_control_panel->isVisible ()) { m_control_panel->hide (); m_view_area->resizeEvent (0L); } } } else if (e->timerId () == infopanel_timer) { if (m_infopanel->text ().isEmpty ()) m_dock_infopanel->undock (); infopanel_timer = 0; } killTimer (e->timerId ()); } void View::addText (const TQString & str, bool eol) { if (m_tmplog_needs_eol) tmplog += TQChar ('\n'); tmplog += str; m_tmplog_needs_eol = eol; if (m_widgetstack->visibleWidget () != m_widgettypes[WT_Console] && tmplog.length () < 7500) return; if (eol) { m_multiedit->append (tmplog); tmplog.truncate (0); m_tmplog_needs_eol = false; } else { int pos = tmplog.tqfindRev (TQChar ('\n')); if (pos >= 0) { m_multiedit->append (tmplog.left (pos)); tmplog = tmplog.mid (pos+1); } } int p = m_multiedit->paragraphs (); if (5000 < p) { m_multiedit->setSelection (0, 0, p - 4499, 0); m_multiedit->removeSelectedText (); } m_multiedit->setCursorPosition (m_multiedit->paragraphs () - 1, 0); } /* void View::print (TQPrinter *pPrinter) { TQPainter printpainter; printpainter.begin (pPrinter); // TODO: add your printing code here printpainter.end (); }*/ KDE_NO_EXPORT void View::videoStart () { if (m_dockarea->getMainDockWidget () != m_dock_video) { // restore from an info or playlist only setting KDockWidget * dw = m_dockarea->getMainDockWidget (); dw->setEnableDocking (KDockWidget::DockCenter); dw->undock (); m_dock_video->setEnableDocking (KDockWidget::DockNone); m_dockarea->setMainDockWidget (m_dock_video); m_view_area->resizeEvent (0L); } if (m_controlpanel_mode == CP_Only) { m_control_panel->setMaximumSize(2500, controlPanel()->preferedHeight()); setControlPanelMode (CP_Show); } } KDE_NO_EXPORT void View::playingStart () { if (m_playing) return; //FIXME: make symetric with playingStop if (m_widgetstack->visibleWidget () == m_widgettypes[WT_Picture]) m_widgetstack->raiseWidget (m_viewer); m_playing = true; m_revert_fullscreen = !isFullScreen(); setControlPanelMode (m_old_controlpanel_mode); } KDE_NO_EXPORT void View::playingStop () { if (m_controlpanel_mode == CP_AutoHide && m_widgetstack->visibleWidget () != m_widgettypes[WT_Picture]) { m_control_panel->show (); //m_view_area->setMouseTracking (false); } killTimer (controlbar_timer); controlbar_timer = 0; m_playing = false; WId w = m_viewer->embeddedWinId (); if (w) XClearWindow (qt_xdisplay(), w); m_view_area->resizeEvent (0L); } KDE_NO_EXPORT void View::leaveEvent (TQEvent *) { delayedShowButtons (false); } KDE_NO_EXPORT void View::reset () { if (m_revert_fullscreen && isFullScreen()) m_control_panel->popupMenu ()->activateItemAt (m_control_panel->popupMenu ()->indexOf (ControlPanel::menu_fullscreen)); //m_view_area->fullScreen (); playingStop (); m_viewer->show (); } bool View::isFullScreen () const { return m_view_area->isFullScreen (); } void View::fullScreen () { if (!m_view_area->isFullScreen()) { m_sreensaver_disabled = false; TQByteArray data, replydata; TQCString replyType; if (kapp->dcopClient ()->call ("kdesktop", "KScreensaverIface", "isEnabled()", data, replyType, replydata)) { bool enabled; TQDataStream replystream (replydata, IO_ReadOnly); replystream >> enabled; if (enabled) m_sreensaver_disabled = kapp->dcopClient()->send ("kdesktop", "KScreensaverIface", "enable(bool)", TQString("false")); } //if (m_keepsizeratio && m_viewer->aspect () < 0.01) // m_viewer->setAspect (1.0 * m_viewer->width() / m_viewer->height()); m_view_area->fullScreen(); m_control_panel->popupMenu ()->setItemVisible (ControlPanel::menu_zoom, false); m_widgetstack->visibleWidget ()->setFocus (); } else { if (m_sreensaver_disabled) m_sreensaver_disabled = !kapp->dcopClient()->send ("kdesktop", "KScreensaverIface", "enable(bool)", TQString("true")); m_view_area->fullScreen(); m_control_panel->popupMenu ()->setItemVisible (ControlPanel::menu_zoom, true); } setControlPanelMode (m_old_controlpanel_mode); emit fullScreenChanged (); } KDE_NO_EXPORT int View::statusBarHeight () const { if (statusBar()->isVisible () && !viewArea()->isFullScreen ()) { if (statusBarMode () == SB_Only) return height (); else return statusBar()->tqmaximumSize ().height (); } return 0; } bool View::x11Event (XEvent * e) { switch (e->type) { case UnmapNotify: if (e->xunmap.event == m_viewer->embeddedWinId ()) { videoStart (); //hide(); } break; case XKeyPress: if (e->xkey.window == m_viewer->embeddedWinId ()) { KeySym ksym; char kbuf[16]; XLookupString (&e->xkey, kbuf, sizeof(kbuf), &ksym, NULL); switch (ksym) { case XK_f: case XK_F: //fullScreen (); break; }; } break; /*case ColormapNotify: fprintf (stderr, "colormap notify\n"); return true;*/ case MotionNotify: if (e->xmotion.window == m_viewer->embeddedWinId ()) delayedShowButtons (e->xmotion.y > m_view_area->height () - statusBarHeight () - m_control_panel->tqmaximumSize ().height ()); m_view_area->mouseMoved (); break; case MapNotify: if (e->xmap.event == m_viewer->embeddedWinId ()) { show (); TQTimer::singleShot (10, m_viewer, TQT_SLOT (sendConfigureEvent ())); } break; /*case ConfigureNotify: break; //return true;*/ default: break; } return false; } //---------------------------------------------------------------------- KDE_NO_CDTOR_EXPORT Viewer::Viewer (TQWidget *tqparent, View * view) : QXEmbed (tqparent), m_plain_window (0), m_bgcolor (0), m_aspect (0.0), m_view (view) { /*XWindowAttributes xwa; XGetWindowAttributes (qt_xdisplay(), winId (), &xwa); XSetWindowAttributes xswa; xswa.background_pixel = 0; xswa.border_pixel = 0; xswa.colormap = xwa.colormap; create (XCreateWindow (qt_xdisplay (), tqparent->winId (), 0, 0, 10, 10, 0, x11Depth (), InputOutput, (Visual*)x11Visual (), CWBackPixel | CWBorderPixel | CWColormap, &xswa));*/ setAcceptDrops (true); initialize (); //setProtocol (QXEmbed::XPLAIN); } KDE_NO_CDTOR_EXPORT Viewer::~Viewer () { } KDE_NO_EXPORT void Viewer::changeProtocol (QXEmbed::Protocol p) { kdDebug () << "changeProtocol " << (int)protocol () << "->" << p << endl; if (!embeddedWinId () || p != protocol ()) { if (p == QXEmbed::XPLAIN) { setProtocol (p); if (!m_plain_window) { int scr = DefaultScreen (qt_xdisplay ()); m_plain_window = XCreateSimpleWindow ( qt_xdisplay(), m_view->winId (), 0, 0, width(), height(), 1, BlackPixel (qt_xdisplay(), scr), BlackPixel (qt_xdisplay(), scr)); embed (m_plain_window); } XClearWindow (qt_xdisplay(), m_plain_window); } else { if (m_plain_window) { XDestroyWindow (qt_xdisplay(), m_plain_window); m_plain_window = 0; XSync (qt_xdisplay (), false); } //setProtocol (p); setProtocol (QXEmbed::XPLAIN); } } } KDE_NO_EXPORT void Viewer::windowChanged (WId w) { kdDebug () << "windowChanged " << (int)w << endl; if (w /*&& m_plain_window*/) XSelectInput (qt_xdisplay (), w, //KeyPressMask | KeyReleaseMask | KeyPressMask | //EnterWindowMask | LeaveWindowMask | //FocusChangeMask | ExposureMask | StructureNotifyMask | PointerMotionMask); } KDE_NO_EXPORT void Viewer::mouseMoveEvent (TQMouseEvent * e) { if (e->state () == Qt::NoButton) { int cp_height = m_view->controlPanel ()->tqmaximumSize ().height (); m_view->delayedShowButtons (e->y () > height () - cp_height); } m_view->viewArea ()->mouseMoved (); } void Viewer::setAspect (float a) { m_aspect = a; } KDE_NO_EXPORT int Viewer::heightForWidth (int w) const { if (m_aspect <= 0.01) return 0; return int (w/m_aspect); } KDE_NO_EXPORT void Viewer::dropEvent (TQDropEvent * de) { m_view->dropEvent (de); } KDE_NO_EXPORT void Viewer::dragEnterEvent (TQDragEnterEvent* dee) { m_view->dragEnterEvent (dee); } /* */ void Viewer::sendKeyEvent (int key) { WId w = embeddedWinId (); if (w) { char buf[2] = { char (key), '\0' }; KeySym keysym = XStringToKeysym (buf); XKeyEvent event = { XKeyPress, 0, true, qt_xdisplay (), w, qt_xrootwin(), w, /*time*/ 0, 0, 0, 0, 0, 0, XKeysymToKeycode (qt_xdisplay (), keysym), true }; XSendEvent (qt_xdisplay(), w, false, KeyPressMask, (XEvent *) &event); XFlush (qt_xdisplay ()); } } KDE_NO_EXPORT void Viewer::sendConfigureEvent () { WId w = embeddedWinId (); if (w) { XConfigureEvent c = { ConfigureNotify, 0UL, True, qt_xdisplay (), w, winId (), x (), y (), width (), height (), 0, None, False }; XSendEvent(qt_xdisplay(),c.event,true,StructureNotifyMask,(XEvent*)&c); XFlush (qt_xdisplay ()); } } KDE_NO_EXPORT void Viewer::contextMenuEvent (TQContextMenuEvent * e) { m_view->controlPanel ()->popupMenu ()->exec (e->globalPos ()); } KDE_NO_EXPORT void Viewer::setBackgroundColor (const TQColor & c) { if (m_bgcolor != c.rgb ()) { m_bgcolor = c.rgb (); setCurrentBackgroundColor (c); } } KDE_NO_EXPORT void Viewer::resetBackgroundColor () { setCurrentBackgroundColor (m_bgcolor); } KDE_NO_EXPORT void Viewer::setCurrentBackgroundColor (const TQColor & c) { setPaletteBackgroundColor (c); WId w = embeddedWinId (); if (w) { XSetWindowBackground (qt_xdisplay (), w, c.rgb ()); XFlush (qt_xdisplay ()); } } #include "kmplayerview.moc"