<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<id>tag:old.nabble.com,2006:forum-3473</id>
	<title>Nabble - kaffeine-devel</title>
	<updated>2009-11-30T09:15:03Z</updated>
	<link rel="self" type="application/atom+xml" href="http://old.nabble.com/kaffeine-devel-f3473.xml" />
	<link rel="alternate" type="text/html" href="http://old.nabble.com/kaffeine-devel-f3473.html" />
	<subtitle type="html">Mailing list archive for kaffeine-devel</subtitle>
	
<entry>
	<id>tag:old.nabble.com,2006:post-26578311</id>
	<title>Re: dbus support for kaffeine</title>
	<published>2009-11-30T09:15:03Z</published>
	<updated>2009-11-30T09:15:03Z</updated>
	<author>
		<name>Bugzilla from christophpfister@gmail.com</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;&lt;br&gt;2009/11/24 Pascal &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26578311&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pascal@...&lt;/a&gt;&amp;gt;:
&lt;br&gt;&amp;gt; Hi Christoph,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; with my old patch the channel ui didn't get updated when the channel was set
&lt;br&gt;&amp;gt; using the SetNumber(int) function, i now fixed it. I also cleaned up a
&lt;br&gt;&amp;gt; little bit my code in dvbtab.cpp and fixed a possible segmentation fault
&lt;br&gt;&amp;gt; when the dbus function SetDvbChannel(Qstring) was called with an invalid
&lt;br&gt;&amp;gt; name. The patch is against rev. 1053875.
&lt;br&gt;&lt;br&gt;Finally I managed to review, overwork and commit your patch ...
&lt;br&gt;&lt;br&gt;&amp;gt; cheers,
&lt;br&gt;&amp;gt; pascal
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; +class MprisPlayerObject : public QObject
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +       Q_OBJECT
&lt;br&gt;&amp;gt; +       Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.freedesktop.MediaPlayer&amp;quot;)
&lt;br&gt;&amp;gt; +public:
&lt;br&gt;&amp;gt; +       explicit MprisPlayerObject(MediaWidget *mediaWidget_);
&lt;br&gt;&amp;gt; +       ~MprisPlayerObject();
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +public slots:
&lt;br&gt;&amp;gt; +       void Next();
&lt;br&gt;&amp;gt; +       void Prev();
&lt;br&gt;&amp;gt; +       void Play();
&lt;br&gt;&amp;gt; +       void Pause();
&lt;br&gt;&amp;gt; +       void Stop();
&lt;br&gt;&amp;gt; +       int  VolumeGet();
&lt;br&gt;&amp;gt; +       void VolumeSet(int volume);
&lt;br&gt;&amp;gt; +       int  PositionGet();
&lt;br&gt;&amp;gt; +       void PositionSet(int position);
&lt;br&gt;&amp;gt; +       void Repeat();
&lt;/div&gt;&lt;br&gt;You forgot the bool parameter.
&lt;br&gt;&lt;br&gt;&amp;gt; +       MprisStatusStruct GetStatus();
&lt;br&gt;&amp;gt; +       QVariantMap GetMetadata();
&lt;br&gt;&lt;br&gt;MPRIS metadata and Phonon metadata specifications aren't 100%
&lt;br&gt;compatible (&amp;quot;location&amp;quot; means url in mpris terms, while it means
&lt;br&gt;&amp;quot;location where track was recorded&amp;quot; in Phonon terms) ... I've left out
&lt;br&gt;the metadata part for the moment.
&lt;br&gt;&lt;br&gt;&amp;gt; +       int GetCaps();
&lt;br&gt;&lt;br&gt;All functions reordered into the order given by the spec.
&lt;br&gt;&lt;br&gt;&amp;gt; +       // this functions are not part of the MPRIS specs
&lt;br&gt;&amp;gt; +       void PlayPause();
&lt;br&gt;&lt;br&gt;Not needed, Pause() has the same behaviour than mediaWidget's playPause action.
&lt;br&gt;&lt;br&gt;&amp;gt; +       void VolumeIncrease();
&lt;br&gt;&amp;gt; +       void VolumeDecrease();
&lt;br&gt;&lt;br&gt;Renamed to &amp;quot;IncreaseVolume&amp;quot; and &amp;quot;DecreaseVolume&amp;quot;.
&lt;br&gt;&lt;br&gt;&amp;gt; +       void Play(const QString &amp;url);
&lt;br&gt;&lt;br&gt;Not needed, TrackList has an AddTrack() function.
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; +       void PlayAudioCd();
&lt;br&gt;&amp;gt; +       void PlayVideoCd();
&lt;br&gt;&amp;gt; +       void PlayDvd();
&lt;br&gt;&amp;gt; +       void ChangeAudioChannel(int index);
&lt;br&gt;&amp;gt; +       void ChangeSubtitle(int index);
&lt;br&gt;&amp;gt; +       void LongSkipBackward();
&lt;br&gt;&amp;gt; +       void SkipBackward();
&lt;br&gt;&amp;gt; +       void SkipForward();
&lt;br&gt;&amp;gt; +       void LongSkipForward();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; void TimeButtonClicked();
&lt;/div&gt;&lt;br&gt;Left out for the moment (this has much to do with my workflow, not
&lt;br&gt;with the actual content of the patch ... I'll think about those
&lt;br&gt;functions once I have some spare time again).
&lt;br&gt;&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; void ToggleMuted();
&lt;br&gt;&lt;br&gt;&amp;gt; +       void UpdateTimeButton();
&lt;br&gt;&lt;br&gt;Not needed, internal function.
&lt;br&gt;&lt;br&gt;&amp;gt; +signals:
&lt;br&gt;&amp;gt; +       void CapsChange( int );
&lt;br&gt;&amp;gt; +       void StatusChange( MprisStatusStruct );
&lt;br&gt;&amp;gt; +       void TrackChange( QVariantMap );
&lt;br&gt;&lt;br&gt;Reordered into the order given by the spec.
&lt;br&gt;&lt;br&gt;&amp;gt; +private:
&lt;br&gt;&amp;gt; +       MediaWidget *mediaWidget;
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; +class MprisTrackListObject : public QObject
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +       Q_OBJECT
&lt;br&gt;&amp;gt; +       Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.freedesktop.MediaPlayer&amp;quot;)
&lt;br&gt;&amp;gt; +public:
&lt;br&gt;&amp;gt; +       explicit MprisTrackListObject(MediaWidget *mediaWidget_);
&lt;br&gt;&amp;gt; +       ~MprisTrackListObject();
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +public slots:
&lt;br&gt;&amp;gt; +       QVariantMap GetMetadata();
&lt;br&gt;&amp;gt; +       int GetCurrentTrack();
&lt;br&gt;&amp;gt; +       int GetLength();
&lt;br&gt;&amp;gt; +       int AddTrack(QString track, bool play);
&lt;/div&gt;&lt;br&gt;Use &amp;quot;const QString &amp;&amp;quot;, not &amp;quot;QString&amp;quot;.
&lt;br&gt;&lt;br&gt;&amp;gt; +       void DelTrack(int position);
&lt;br&gt;&amp;gt; +       void SetLoop(bool loop);
&lt;br&gt;&amp;gt; +       void SetRandom(bool random);
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +signals:
&lt;br&gt;&amp;gt; +       void TrackListChange(int);
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +private:
&lt;br&gt;&amp;gt; +       MediaWidget *mediaWidget;
&lt;br&gt;&lt;br&gt;All those functions have a relation to PlaylistTab, not to MediaWidget.
&lt;br&gt;&lt;br&gt;&amp;gt; +class MprisDvbObject : public QObject
&lt;br&gt;&lt;br&gt;Renamed to &amp;quot;DBusTelevisionObject&amp;quot; (nothing to do with mpris).
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +       Q_OBJECT
&lt;br&gt;&amp;gt; +       Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.freedesktop.MediaPlayer&amp;quot;)
&lt;br&gt;&amp;gt; +public:
&lt;br&gt;&amp;gt; +       explicit MprisDvbObject(MediaWidget *mediaWidget_);
&lt;br&gt;&amp;gt; +       ~MprisDvbObject();
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +public slots:
&lt;br&gt;&amp;gt; +       void SetDvbChannel(const QString &amp;name);
&lt;br&gt;&amp;gt; +       void SetDvbChannelNumber(int number);
&lt;/div&gt;&lt;br&gt;Merged into a single function - playChannel(const QString &amp;nameOrNumber);
&lt;br&gt;&lt;br&gt;&amp;gt; +       void SetNumber(int number);
&lt;br&gt;&lt;br&gt;Not needed (what's the sense of this function?)
&lt;br&gt;Added a DigitPressed(int) function, for entering channel numbers via
&lt;br&gt;remote control.
&lt;br&gt;&lt;br&gt;&amp;gt; +       void SetDvbLastChannel();
&lt;br&gt;&lt;br&gt;Renamed to PlayLastChannel().
&lt;br&gt;&lt;br&gt;&amp;gt; +       void StopDvb();
&lt;br&gt;&lt;br&gt;Not needed, internal function.
&lt;br&gt;&lt;br&gt;&amp;gt; +       void ToggleInstantRecord();
&lt;br&gt;&amp;gt; +       void ToggleOsd();
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +private:
&lt;br&gt;&amp;gt; +       MediaWidget *mediaWidget;
&lt;br&gt;&lt;br&gt;All those functions have a relation to DvbTab, not to MediaWidget.
&lt;br&gt;&lt;br&gt;&amp;gt; +       void AspectRatioAuto();
&lt;br&gt;&amp;gt; +       void AspectRatio4_3();
&lt;br&gt;&amp;gt; +       void AspectRatio16_9();
&lt;br&gt;&amp;gt; +       void AspectRatioWidget();
&lt;br&gt;&lt;br&gt;Left out for the moment (this has much to do with my workflow, not
&lt;br&gt;with the actual content of the patch ... I'll think about those
&lt;br&gt;functions once I have some spare time again).
&lt;br&gt;&lt;br&gt;&amp;gt; +       void ToggleFullScreen();
&lt;br&gt;&lt;br&gt;Moved to the player object.
&lt;br&gt;&lt;br&gt;&amp;gt; +struct MprisStatusStruct
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +       quint16 play;
&lt;br&gt;&amp;gt; +       quint16 random;
&lt;br&gt;&amp;gt; +       quint16 repeatTrack;
&lt;br&gt;&amp;gt; +       quint16 repeatAll;
&lt;br&gt;&amp;gt; +};
&lt;br&gt;&lt;br&gt;The spec says 32 bit integers (= int).
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; +Q_DECLARE_METATYPE(MprisStatusStruct)
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +/**
&lt;br&gt;&amp;gt; +* The bit values for the capabilities flags
&lt;br&gt;&amp;gt; +*/
&lt;br&gt;&amp;gt; +enum Cap {
&lt;br&gt;&amp;gt; +       NO_CAPS                    = 0,
&lt;br&gt;&amp;gt; +       CAN_GO_NEXT                = 1 &amp;lt;&amp;lt; 0,
&lt;br&gt;&amp;gt; +       CAN_GO_PREV                = 1 &amp;lt;&amp;lt; 1,
&lt;br&gt;&amp;gt; +       CAN_PAUSE                        = 1 &amp;lt;&amp;lt; 2,
&lt;br&gt;&amp;gt; +       CAN_PLAY                          = 1 &amp;lt;&amp;lt; 3,
&lt;br&gt;&amp;gt; +       CAN_SEEK                          = 1 &amp;lt;&amp;lt; 4,
&lt;br&gt;&amp;gt; +       CAN_PROVIDE_METADATA  = 1 &amp;lt;&amp;lt; 5,
&lt;br&gt;&amp;gt; +       CAN_HAS_TRACKLIST        = 1 &amp;lt;&amp;lt; 6,
&lt;br&gt;&amp;gt; +       ALL_KNOWN_CAPS          = (1 &amp;lt;&amp;lt; 7) - 1
&lt;br&gt;&amp;gt; +};
&lt;br&gt;&amp;gt; +Q_DECLARE_FLAGS(Caps, Cap)
&lt;/div&gt;&lt;br&gt;Directly merged into GetCaps (because it is the only function that
&lt;br&gt;will use caps).
&lt;br&gt;&lt;br&gt;&amp;gt; +signals:
&lt;br&gt;&amp;gt; +       void updateDvbChannelUi(int number);
&lt;br&gt;&lt;br&gt;Solved that problem in a different way (ChannelModel returns the row,
&lt;br&gt;not the channel itself --&amp;gt; the proxy model can map that information to
&lt;br&gt;the correct view model index).
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; +void DvbTab::toggleInstantRecord()
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +       if (instantRecordAction-&amp;gt;isChecked()) {
&lt;br&gt;&amp;gt; +               instantRecordAction-&amp;gt;setChecked(false);
&lt;br&gt;&amp;gt; +               instantRecord(false);
&lt;br&gt;&amp;gt; +       }
&lt;br&gt;&amp;gt; +       else {
&lt;br&gt;&amp;gt; +               instantRecordAction-&amp;gt;setChecked(true);
&lt;br&gt;&amp;gt; +               instantRecord(true);
&lt;br&gt;&amp;gt; +       }
&lt;/div&gt;&lt;br&gt;Simply use instantRecordAction-&amp;gt;trigger();
&lt;br&gt;&lt;br&gt;&amp;gt; +}
&lt;br&gt;&lt;br&gt;&amp;gt; +bool MediaWidget::isPaused()
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +       if (playing &amp;&amp; mediaObject-&amp;gt;state() == Phonon::PausedState)
&lt;br&gt;&amp;gt; +       {
&lt;br&gt;&amp;gt; +               return true;
&lt;br&gt;&amp;gt; +       }
&lt;br&gt;&amp;gt; +       return false;
&lt;br&gt;&lt;br&gt;Query the playPauseAction.
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; +}
&lt;br&gt;&amp;gt; +int MediaWidget::getVolume()
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +       int volume = audioOutput-&amp;gt;volume() * 100;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +       if ( volume &amp;gt;= 0 &amp;&amp; volume &amp;lt;= 100 ) {
&lt;br&gt;&amp;gt; +               return volume;
&lt;br&gt;&amp;gt; +       }
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +       return 0;
&lt;/div&gt;&lt;br&gt;Query the volumeSlider.
&lt;br&gt;&lt;br&gt;&amp;gt; +}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt;  void MediaWidget::changeVolume(int volume)
&lt;br&gt;&amp;gt;  {
&lt;br&gt;&amp;gt;        audioOutput-&amp;gt;setVolume(volume * qreal(0.01));
&lt;br&gt;&amp;gt; @@ -915,6 +1014,16 @@
&lt;br&gt;&amp;gt;        mediaObject-&amp;gt;seek(mediaObject-&amp;gt;currentTime() + 1000 *
&lt;br&gt;&amp;gt; longSkipDuration);
&lt;br&gt;&amp;gt;  }
&lt;br&gt;&lt;br&gt;&amp;gt;  class MediaWidget : public QWidget
&lt;br&gt;&amp;gt;  {
&lt;br&gt;&amp;gt;        Q_OBJECT
&lt;br&gt;&amp;gt; +       friend class MprisPlayerObject;
&lt;br&gt;&amp;gt; +       friend class MprisTrackListObject;
&lt;br&gt;&amp;gt; +       friend class MprisDvbObject;
&lt;br&gt;&amp;gt; +       friend class MprisDisplayObject;
&lt;br&gt;&lt;br&gt;Do not use friend classes for this purpose because of two reasons:
&lt;br&gt;- there are internal functions that _really_ shouldn't be called from
&lt;br&gt;outside (e.g. volumeChanged or mutedChanged, because they don't update
&lt;br&gt;ui state)
&lt;br&gt;- private functions usually trust their arguments etc, but in this
&lt;br&gt;context more value checking is needed for calls from outside
&lt;br&gt;&lt;br&gt;So I've made the required functions public and rechecked that they
&lt;br&gt;work correctly in all situations.
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; +       bool hasMedia();
&lt;br&gt;&amp;gt; +       void setNumber(int number);
&lt;br&gt;&amp;gt; +       void changeDvbChannel(int number);
&lt;br&gt;&amp;gt; +       void changeDvbChannel(const QString &amp;name);
&lt;br&gt;&amp;gt; +       void toggleOsd();
&lt;br&gt;&amp;gt; +       void dvbLastChannel();
&lt;br&gt;&amp;gt; +       void toggleInstantRecord();
&lt;br&gt;&amp;gt; +       int getCurrentTrack();
&lt;br&gt;&amp;gt; +       void playPause();
&lt;br&gt;&amp;gt; +       void pause();
&lt;br&gt;&amp;gt; +       void setDvbChannel(int number);
&lt;br&gt;&amp;gt; +       void setDvbChannel(const QString &amp;name);
&lt;br&gt;&amp;gt; +       void setDvbLastChannel();
&lt;br&gt;&amp;gt; +       void fullScreen();
&lt;br&gt;&amp;gt; +       void delTrack(int position);
&lt;br&gt;&amp;gt; +       void setLoop(bool loop);
&lt;br&gt;&amp;gt; +       void setRandom(bool random);
&lt;/div&gt;&lt;br&gt;Removed all those functions because they are a) redundant (playPause,
&lt;br&gt;pause --&amp;gt; simplified to togglePause()) or b) don't belong here (the
&lt;br&gt;dbus objects call directly the needed functions from PlaylistTab or
&lt;br&gt;DvbTab).
&lt;br&gt;&lt;br&gt;I suggest the following steps to proceed:
&lt;br&gt;a) study the comments above a bit; the patches I've commited are [1];
&lt;br&gt;feel free to ask questions
&lt;br&gt;b) make your svn repo clean and update it
&lt;br&gt;c) continue hacking (if you need a task, you can try to create a
&lt;br&gt;kdelirc profile for kaffeine, that's an xml file which provides
&lt;br&gt;default associations between remote control buttons and kaffeine dbus
&lt;br&gt;interface [2])
&lt;br&gt;&lt;br&gt;Thanks a lot,
&lt;br&gt;&lt;br&gt;Christoph
&lt;br&gt;&lt;br&gt;&lt;br&gt;[1]
&lt;br&gt;&lt;a href=&quot;http://websvn.kde.org/?view=revision&amp;revision=1055907&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://websvn.kde.org/?view=revision&amp;revision=1055907&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;http://websvn.kde.org/?view=revision&amp;revision=1056261&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://websvn.kde.org/?view=revision&amp;revision=1056261&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;http://websvn.kde.org/?view=revision&amp;revision=1056694&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://websvn.kde.org/?view=revision&amp;revision=1056694&lt;/a&gt;&lt;br&gt;[2]
&lt;br&gt;the resulting file would be installed to
&lt;br&gt;/usr/share/kde4/apps/profiles/kaffeine.profile.xml
&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26578311&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/dbus-support-for-kaffeine-tp26128565p26578311.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26561418</id>
	<title>EPG view improvements</title>
	<published>2009-11-29T04:04:40Z</published>
	<updated>2009-11-29T04:04:40Z</updated>
	<author>
		<name>Bugzilla from dmitry.poplavsky@gmail.com</name>
	</author>
	<content type="html">Hello,
&lt;br&gt;&lt;br&gt;I changed programs list view to follow selection
&lt;br&gt;in the channels list, and program description to follow
&lt;br&gt;selection change in the programs list.
&lt;br&gt;It makes much easier to navigate EPG.
&lt;br&gt;&lt;br&gt;I also connected the EPG view to recordings manager,
&lt;br&gt;so scheduled for recording programs are marked in 
&lt;br&gt;the EPG programs list (nothing fancy yet, just the 'R'
&lt;br&gt;symbol in the extra column, it would be nice to replace it with
&lt;br&gt;corresponding icon, or draw the row with red color).
&lt;br&gt;It also changed &amp;quot;Schedule&amp;quot; &amp;nbsp;button to toggle program scheduling.
&lt;br&gt;&lt;br&gt;The implementation is not the most effective (the recording manager is queried 
&lt;br&gt;for each program in the list), but it seems to be sufficient in this case.
&lt;br&gt;&lt;br&gt;I attached the patch for the current kaffeine (svn revision 1056100).
&lt;br&gt;&lt;br&gt;Regards
&lt;br&gt;&amp;nbsp; Dmytro.
&lt;br&gt;&lt;br /&gt;&lt;tt&gt;[kaffeine_epg_recordings.diff]&lt;/tt&gt;&lt;br /&gt;&lt;hr align=&quot;left&quot; width=&quot;300&quot; /&gt;&lt;tt&gt;Index: src/dvb/dvbepg.h
&lt;br&gt;===================================================================
&lt;br&gt;--- src/dvb/dvbepg.h	(revision 1055919)
&lt;br&gt;+++ src/dvb/dvbepg.h	(working copy)
&lt;br&gt;@@ -53,10 +53,12 @@
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;};
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+class DvbRecordingManager;
&lt;br&gt;&amp;nbsp;class DvbEpgModel : public QAbstractTableModel
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;Q_OBJECT
&lt;br&gt;&amp;nbsp;public:
&lt;br&gt;-	explicit DvbEpgModel(QObject *parent);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;explicit DvbEpgModel(DvbRecordingManager *recordingManager, QObject *parent);
&lt;br&gt;&amp;nbsp;	~DvbEpgModel();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	int columnCount(const QModelIndex &amp;parent) const;
&lt;br&gt;@@ -71,9 +73,14 @@
&lt;br&gt;&amp;nbsp;	const DvbEpgEntry *getEntry(int row) const;
&lt;br&gt;&amp;nbsp;	QList&amp;lt;DvbEpgEntry&amp;gt; getCurrentNext(const QString &amp;channel) const;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+private slots:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void updateRecordings();
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;private:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;DvbRecordingManager *recordingManager;
&lt;br&gt;&amp;nbsp;	QList&amp;lt;DvbEpgEntry&amp;gt; allEntries;
&lt;br&gt;-	QList&amp;lt;const DvbEpgEntry *&amp;gt; filteredEntries;
&lt;br&gt;+	QList&amp;lt;const DvbEpgEntry *&amp;gt; filteredEntries; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;mutable QHash&amp;lt;const DvbEpgEntry *, bool&amp;gt; recordingsStatusCache;
&lt;br&gt;&amp;nbsp;};
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;class DvbEitFilter : public DvbSectionFilter
&lt;br&gt;Index: src/dvb/dvbrecording.h
&lt;br&gt;===================================================================
&lt;br&gt;--- src/dvb/dvbrecording.h	(revision 1055919)
&lt;br&gt;+++ src/dvb/dvbrecording.h	(working copy)
&lt;br&gt;@@ -36,8 +36,15 @@
&lt;br&gt;&amp;nbsp;	explicit DvbRecordingManager(DvbManager *manager_);
&lt;br&gt;&amp;nbsp;	~DvbRecordingManager();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;bool isScheduled(const QString &amp;channel, const QDateTime &amp;begin,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; const QTime &amp;duration) const;// begin must be local time!
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	void scheduleProgram(const QString &amp;name, const QString &amp;channel, const QDateTime &amp;begin,
&lt;br&gt;&amp;nbsp;		const QTime &amp;duration); // begin must be local time!
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;bool unscheduleProgram(const QString &amp;channel, const QDateTime &amp;begin,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; const QTime &amp;duration); // begin must be local time!
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	void startInstantRecording(const QString &amp;name, const QString &amp;channel);
&lt;br&gt;&amp;nbsp;	void stopInstantRecording(); // stops the last started instant recording
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -45,6 +52,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;signals:
&lt;br&gt;&amp;nbsp;	void instantRecordingRemoved(); // not emitted by stopInstantRecording()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void changed();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;private slots:
&lt;br&gt;&amp;nbsp;	void checkStatus();
&lt;br&gt;@@ -54,6 +62,8 @@
&lt;br&gt;&amp;nbsp;	void removeRecording();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;private:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;QModelIndex recordingIndex(const QString &amp;channel, const QDateTime &amp;begin,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; const QTime &amp;duration) const;
&lt;br&gt;&amp;nbsp;	DvbManager *manager;
&lt;br&gt;&amp;nbsp;	DvbRecordingModel *model;
&lt;br&gt;&amp;nbsp;	QTimer checkStatusTimer;
&lt;br&gt;Index: src/dvb/dvbmanager.cpp
&lt;br&gt;===================================================================
&lt;br&gt;--- src/dvb/dvbmanager.cpp	(revision 1055919)
&lt;br&gt;+++ src/dvb/dvbmanager.cpp	(working copy)
&lt;br&gt;@@ -227,9 +227,9 @@
&lt;br&gt;&amp;nbsp;	parent(parent_), mediaWidget(mediaWidget_), dvbDumpEnabled(false)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	channelModel = new DvbSqlChannelModel(this);
&lt;br&gt;-	epgModel = new DvbEpgModel(this);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;recordingManager = new DvbRecordingManager(this);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;epgModel = new DvbEpgModel(recordingManager, this);
&lt;br&gt;&amp;nbsp;	liveView = new DvbLiveView(this);
&lt;br&gt;-	recordingManager = new DvbRecordingManager(this);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	readDeviceConfigs();
&lt;br&gt;&amp;nbsp;	updateSourceMapping();
&lt;br&gt;Index: src/dvb/dvbepg.cpp
&lt;br&gt;===================================================================
&lt;br&gt;--- src/dvb/dvbepg.cpp	(revision 1055919)
&lt;br&gt;+++ src/dvb/dvbepg.cpp	(working copy)
&lt;br&gt;@@ -79,7 +79,8 @@
&lt;br&gt;&amp;nbsp;	return x &amp;lt; y.channel;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-DvbEpgModel::DvbEpgModel(QObject *parent) : QAbstractTableModel(parent)
&lt;br&gt;+DvbEpgModel::DvbEpgModel(DvbRecordingManager *recordingManager, QObject *parent)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;: QAbstractTableModel(parent), recordingManager(recordingManager)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	QFile file(KStandardDirs::locateLocal(&amp;quot;appdata&amp;quot;, &amp;quot;epgdata.dvb&amp;quot;));
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -124,6 +125,8 @@
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	qSort(allEntries);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;connect(recordingManager, SIGNAL(changed()), SLOT(updateRecordings()));
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;DvbEpgModel::~DvbEpgModel()
&lt;br&gt;@@ -163,7 +166,7 @@
&lt;br&gt;&amp;nbsp;		return 0;
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	return 3;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;return 4;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;int DvbEpgModel::rowCount(const QModelIndex &amp;parent) const
&lt;br&gt;@@ -186,11 +189,21 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	switch (index.column()) {
&lt;br&gt;&amp;nbsp;	case 0:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (recordingsStatusCache.contains(entry)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return recordingsStatusCache.value(entry) ? QString(&amp;quot;R&amp;quot;) : QString();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bool hasRecording = recordingManager-&amp;gt;isScheduled(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;entry-&amp;gt;channel, entry-&amp;gt;begin.toLocalTime(), entry-&amp;gt;duration);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;recordingsStatusCache.insert(entry, hasRecording);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return hasRecording ? QString(&amp;quot;R&amp;quot;) : QString();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 1:
&lt;br&gt;&amp;nbsp;		return KGlobal::locale()-&amp;gt;formatDateTime(entry-&amp;gt;begin.toLocalTime());
&lt;br&gt;-	case 1:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 2:
&lt;br&gt;&amp;nbsp;		return KGlobal::locale()-&amp;gt;formatTime(entry-&amp;gt;duration, false, true);
&lt;br&gt;-	case 2:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 3:
&lt;br&gt;&amp;nbsp;		return entry-&amp;gt;title;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	return QVariant();
&lt;br&gt;@@ -204,10 +217,12 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	switch (section) {
&lt;br&gt;&amp;nbsp;	case 0:
&lt;br&gt;-		return i18n(&amp;quot;Begin&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return i18n(&amp;quot;R&amp;quot;);
&lt;br&gt;&amp;nbsp;	case 1:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return i18n(&amp;quot;Begin&amp;quot;); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 2:
&lt;br&gt;&amp;nbsp;		return i18n(&amp;quot;Duration&amp;quot;);
&lt;br&gt;-	case 2:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 3:
&lt;br&gt;&amp;nbsp;		return i18n(&amp;quot;Title&amp;quot;);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -237,9 +252,16 @@
&lt;br&gt;&amp;nbsp;void DvbEpgModel::resetChannel()
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	filteredEntries.clear();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;recordingsStatusCache.clear();
&lt;br&gt;&amp;nbsp;	reset();
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+void DvbEpgModel::updateRecordings()
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;recordingsStatusCache.clear();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;emit dataChanged(index(0,0,QModelIndex()), index(allEntries.size(),1,QModelIndex()));
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void DvbEpgModel::setChannel(const QString &amp;channel)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	QList&amp;lt;DvbEpgEntry&amp;gt;::const_iterator it = qLowerBound(allEntries.constBegin(),
&lt;br&gt;@@ -415,11 +437,13 @@
&lt;br&gt;&amp;nbsp;	channelView = new QListView(widget);
&lt;br&gt;&amp;nbsp;	channelView-&amp;gt;setModel(channelModel);
&lt;br&gt;&amp;nbsp;	channelView-&amp;gt;setMaximumWidth(200);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;channelView-&amp;gt;setEditTriggers(QAbstractItemView::NoEditTriggers);
&lt;br&gt;&amp;nbsp;	connect(channelView, SIGNAL(activated(QModelIndex)),
&lt;br&gt;&amp;nbsp;		this, SLOT(channelActivated(QModelIndex)));
&lt;br&gt;&amp;nbsp;	boxLayout-&amp;gt;addWidget(channelView);
&lt;br&gt;&amp;nbsp;	mainLayout-&amp;gt;addLayout(boxLayout);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	boxLayout = new QVBoxLayout();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	KAction *scheduleAction = new KAction(KIcon(&amp;quot;media-record&amp;quot;),
&lt;br&gt;@@ -438,10 +462,18 @@
&lt;br&gt;&amp;nbsp;	epgView-&amp;gt;setContextMenuPolicy(Qt::ActionsContextMenu);
&lt;br&gt;&amp;nbsp;	epgView-&amp;gt;setMinimumWidth(450);
&lt;br&gt;&amp;nbsp;	epgView-&amp;gt;setModel(epgModel);
&lt;br&gt;-	epgView-&amp;gt;setRootIsDecorated(false);
&lt;br&gt;-	connect(epgView, SIGNAL(activated(QModelIndex)), this, SLOT(entryActivated(QModelIndex)));
&lt;br&gt;+	epgView-&amp;gt;setRootIsDecorated(false); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp;	boxLayout-&amp;gt;addWidget(epgView);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;QItemSelectionModel *programSelection = new QItemSelectionModel(epgModel, this);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;epgView-&amp;gt;setSelectionModel(programSelection);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;connect(programSelection, SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(entryActivated(QModelIndex)));
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;QItemSelectionModel *channelSelection = new QItemSelectionModel(channelModel, this);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;channelView-&amp;gt;setSelectionModel(channelSelection);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;connect(channelSelection, SIGNAL(currentChanged(QModelIndex,QModelIndex)),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this, SLOT(channelActivated(QModelIndex)));
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	contentLabel = new QLabel(widget);
&lt;br&gt;&amp;nbsp;	contentLabel-&amp;gt;setAlignment(Qt::AlignLeft | Qt::AlignTop);
&lt;br&gt;&amp;nbsp;	contentLabel-&amp;gt;setMargin(5);
&lt;br&gt;@@ -468,6 +500,7 @@
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	setMainWidget(widget);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;resize(800,600);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;DvbEpgDialog::~DvbEpgDialog()
&lt;br&gt;@@ -553,8 +586,21 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	const DvbEpgEntry *entry = epgModel-&amp;gt;getEntry(index.row());
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	manager-&amp;gt;getRecordingManager()-&amp;gt;scheduleProgram(entry-&amp;gt;title, entry-&amp;gt;channel,
&lt;br&gt;-		entry-&amp;gt;begin.toLocalTime().addSecs(-300), entry-&amp;gt;duration.addSecs(900));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;qDebug () &amp;lt;&amp;lt; &amp;quot;Schedule&amp;quot; &amp;lt;&amp;lt; entry-&amp;gt;title &amp;lt;&amp;lt; entry-&amp;gt;channel &amp;lt;&amp;lt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;entry-&amp;gt;begin &amp;lt;&amp;lt; entry-&amp;gt;duration;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	KMessageBox::information(this, i18nc(&amp;quot;program guide&amp;quot;, &amp;quot;Program successfully scheduled.&amp;quot;));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;DvbRecordingManager *recordingManager = manager-&amp;gt;getRecordingManager();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;bool hasRecording = recordingManager-&amp;gt;isScheduled(entry-&amp;gt;channel,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;entry-&amp;gt;begin.toLocalTime(), entry-&amp;gt;duration);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if (hasRecording) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;recordingManager-&amp;gt;unscheduleProgram(entry-&amp;gt;channel,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;entry-&amp;gt;begin.toLocalTime(), entry-&amp;gt;duration);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;recordingManager-&amp;gt;scheduleProgram(entry-&amp;gt;title, entry-&amp;gt;channel,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;entry-&amp;gt;begin.toLocalTime().addSecs(-120), entry-&amp;gt;duration.addSecs(180));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;//no need for message box, since the recording status is displayed in trable view.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;//KMessageBox::information(this, i18nc(&amp;quot;program guide&amp;quot;, &amp;quot;Program successfully scheduled.&amp;quot;));
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;Index: src/dvb/dvbrecording.cpp
&lt;br&gt;===================================================================
&lt;br&gt;--- src/dvb/dvbrecording.cpp	(revision 1055919)
&lt;br&gt;+++ src/dvb/dvbrecording.cpp	(working copy)
&lt;br&gt;@@ -271,6 +271,10 @@
&lt;br&gt;&amp;nbsp;	connect(model, SIGNAL(rowsRemoved(QModelIndex,int,int)),
&lt;br&gt;&amp;nbsp;		this, SLOT(checkInstantRecording()));
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;connect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SIGNAL(changed()));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;connect(model, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SIGNAL(changed()));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;connect(model, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SIGNAL(changed()));
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	// we regularly recheck the status of the recordings
&lt;br&gt;&amp;nbsp;	// this way we can keep retrying if the device was busy / tuning failed
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -337,6 +341,48 @@
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+QModelIndex DvbRecordingManager::recordingIndex(const QString &amp;channel, const QDateTime &amp;begin,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;const QTime &amp;duration) const
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;for (int i=0; i&amp;lt;model-&amp;gt;rowCount(QModelIndex()); i++) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;const DvbRecording *recording = model-&amp;gt;at(i);// recordings.at(i);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (recording-&amp;gt;repeat == 0 &amp;&amp; recording-&amp;gt;begin.date() != begin.date())
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (begin &amp;lt; recording-&amp;gt;begin)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (recording-&amp;gt;channelName != channel)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (recording-&amp;gt;repeat) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int dayOfWeek = begin.date().dayOfWeek();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ( !(recording-&amp;gt;repeat &amp; (1&amp;lt;&amp;lt;(dayOfWeek-1))) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//day is correct, check if the time interval is covered
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;QTime recordingTime = recording-&amp;gt;begin.time();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;QTime recordingEndTime = recordingTime.addSecs( QTime().secsTo(recording-&amp;gt;duration) );
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;QTime requestedTime = begin.time();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;QTime requestedEndTime = requestedTime.addSecs( QTime().secsTo(duration)-1 );
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (recordingTime &amp;lt;= requestedTime &amp;&amp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;recordingEndTime &amp;gt;= requestedEndTime) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return model-&amp;gt;index(i,0);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;return QModelIndex();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+bool DvbRecordingManager::isScheduled(const QString &amp;channel, const QDateTime &amp;begin,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;const QTime &amp;duration) const
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;return recordingIndex(channel,begin,duration).isValid();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void DvbRecordingManager::scheduleProgram(const QString &amp;name, const QString &amp;channel,
&lt;br&gt;&amp;nbsp;	const QDateTime &amp;begin, const QTime &amp;duration)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;@@ -352,6 +398,18 @@
&lt;br&gt;&amp;nbsp;	model-&amp;gt;append(recording);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+bool DvbRecordingManager::unscheduleProgram(const QString &amp;channel, const QDateTime &amp;begin,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;const QTime &amp;duration) // begin must be local time!
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;QModelIndex index = recordingIndex(channel, begin, duration);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if (index.isValid()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;model-&amp;gt;remove(index.row());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;return false;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void DvbRecordingManager::startInstantRecording(const QString &amp;name, const QString &amp;channel)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	DvbRecording *recording = new DvbRecording(manager);
&lt;br&gt;@@ -483,7 +541,7 @@
&lt;br&gt;&amp;nbsp;		}
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	checkingStatus = false;
&lt;br&gt;+	checkingStatus = false; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;void DvbRecordingManager::checkInstantRecording()
&lt;br&gt;&lt;/tt&gt;&lt;hr align=&quot;left&quot; width=&quot;300&quot; /&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26561418&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/EPG-view-improvements-tp26561418p26561418.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26553315</id>
	<title>Re: Request: kaffeine --dvb start parameter</title>
	<published>2009-11-28T05:46:21Z</published>
	<updated>2009-11-28T05:46:21Z</updated>
	<author>
		<name>Bugzilla from christophpfister@gmail.com</name>
	</author>
	<content type="html">2009/11/17 Boris Cuber &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26553315&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine@...&lt;/a&gt;&amp;gt;:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Hi kaffeine people,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; One feature i miss from the old versions is the possibilty
&lt;br&gt;&amp;gt; to start kaffeine from the cmdline in dvb mode with
&lt;br&gt;&amp;gt; the last tuned channel.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; This would also keep some compatability to ~kaffeine-0.8.x.
&lt;br&gt;&amp;gt; I dunno if this is really a &amp;quot;wanted&amp;quot; feature, but it improves my
&lt;br&gt;&amp;gt; tv/dvb watching experience. I'm sure this could also be done
&lt;br&gt;&amp;gt; by altering the --tv parameter, but i'm no qt/c++ programmer
&lt;br&gt;&amp;gt; and my tries ended up in segfaults when starting kaffeine.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Whatever, it'd be cool to have this feature back ;)
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; A simple patch (applies to trunk), adds a --dvb parameter:
&lt;/div&gt;&lt;br&gt;Applied (I've called the option &amp;quot;--lastchannel&amp;quot;).
&lt;br&gt;&lt;br&gt;Thanks,
&lt;br&gt;&lt;br&gt;Christoph
&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26553315&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Request%3A-kaffeine---dvb-start-parameter-tp26390411p26553315.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26504736</id>
	<title>Re: dbus support for kaffeine</title>
	<published>2009-11-24T14:54:54Z</published>
	<updated>2009-11-24T14:54:54Z</updated>
	<author>
		<name>Pascal Pollet</name>
	</author>
	<content type="html">Hi Christoph,
&lt;br&gt;&lt;br&gt;with my old patch the channel ui didn't get updated when the channel was 
&lt;br&gt;set using the SetNumber(int) function, i now fixed it. I also cleaned up 
&lt;br&gt;a little bit my code in dvbtab.cpp and fixed a possible segmentation 
&lt;br&gt;fault when the dbus function SetDvbChannel(Qstring) was called with an 
&lt;br&gt;invalid name. The patch is against rev. 1053875.
&lt;br&gt;&lt;br&gt;cheers,
&lt;br&gt;pascal
&lt;br&gt;&lt;br&gt;Pascal schrieb:
&lt;div class='shrinkable-quote'&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; I forgot to add a check if the parameter is a single digit integer in 
&lt;br&gt;&amp;gt; the MediaWidget::setNumber(int) function, here is the new patch, 
&lt;br&gt;&amp;gt; please forget the other one...
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; ciao,
&lt;br&gt;&amp;gt; Pascal
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Pascal schrieb:
&lt;br&gt;&amp;gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; I now added the SetNumber(int) function to enter numbers with 
&lt;br&gt;&amp;gt;&amp;gt; multiple digits, that was really easy, as the code to enter numbers 
&lt;br&gt;&amp;gt;&amp;gt; with the keyboard was already there. I didn't notice it before 
&lt;br&gt;&amp;gt;&amp;gt; because there is one problem left with this code: entering numbers 
&lt;br&gt;&amp;gt;&amp;gt; with the keyboard has no effect if the DvbChannelView has the focus, 
&lt;br&gt;&amp;gt;&amp;gt; in this case you have to click into the picture before to make it 
&lt;br&gt;&amp;gt;&amp;gt; work. Number-key events in the DvbChannelView should maybe be 
&lt;br&gt;&amp;gt;&amp;gt; redirected somehow to the MediaWidget class...
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; I also removed some debugging code that was still present in my last 
&lt;br&gt;&amp;gt;&amp;gt; patch, sorry...
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; The patch is against the actual svn trunk again (revision 1053111)
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; ciao,
&lt;br&gt;&amp;gt;&amp;gt; Pascal
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Pascal schrieb:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; ok, here is the actual state of things. The mpris methods are all 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; implemented, with a few stubs left: a few /TrackList methods still 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; need to be implemented, but I will try to do it soon. The /Player 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Repeat() function is also a stub, because the playlist does not 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; allow to repeat a single track yet. Also the GetCaps () function is 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; incomplete.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; I put much methods into the /Player object which are not part of the 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; mpris specs, because it wouldn't make much sense to make a separate 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; object for them. I think it should be ok, but if you don't agree, 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; please tell me, it' not difficult to change...
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; I made a DVB/ object for dvb-related stuff and a Display/ object for 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; methods like toggleFullScreen, I'm not sure if &amp;quot;Display&amp;quot; is the best 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; name for that...
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; There is still a need for a method that allows to enter channel 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; numbers with more than one digit with a remote control (or with the 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; keyboard), I will try to do this in the next time, as for me it's 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; the most important feature which is still missing.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; I changed all dbus functions to begin with a capital letter, to be 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; consistent with the mpris methods.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; All this isn't thoroughly tested at all and rather crude, and there 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; should certainly be more error checking, but I think this is true 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; for almost all the rest of the app also, so it should be ok for the 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; beginning ;)
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; changing the channel works, but I didn't manage to have the selection
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; changed to the new channel in the DvbChannelView tree. I don't 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; know how to
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; get a valid QModelIndex that points to the correct 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; DvbChannelModel. Please
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; look at the code and at my comments in DvbTab::setChannel(int 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; number). I
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; tried almost everything and thereby learned a lot about the model 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; / view
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; concept of Qt, but it didn't help me to find the solution... Maybe 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; you
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; already know this probem Christoph, because there is the same 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; issue when
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; kaffeine gets started with the &amp;quot;--tv &amp;lt;channel&amp;gt;&amp;quot; flag: it simply calls
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; DvbTab::playChannel(const QString &amp;name), but it does not select 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; the channel
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; in the DvbChannelView. The problem is that afterwards, calls to
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; MediaWidget::previous() and next() have no effect, because the 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; currently
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; selected channel is not known. I hope that someone more clever 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; than me will
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; solve this issue ;)
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Yes, this one is trickier. Note that there exists a similar problem
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; e.g. with playPause(): you also need to update the ui state.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; I now found a solution (although I don't know if it's the best), but 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; I don't recognize what should be updated when the playPause() method 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; is called, &amp;nbsp;you have a better overview for sure...
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; ciao,
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Pascal
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Christoph Pfister schrieb:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; 2009/11/6 Pascal Pollet &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26504736&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pascal@...&lt;/a&gt;&amp;gt;:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; &amp;nbsp;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; here is what I've done so far, I think it should add enough d-bus 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; to make
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; most users happy, including me :) Please look at it and tell me 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; what you
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; think of it...
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; It's a very good starting point. There exists a mediaplayer dbus
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; specification MPRIS [1], which I consider worth to implement (so that
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; we don't add yet another dbus interface for common functionality).
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; I've committed preliminary support to svn (the &amp;quot;root&amp;quot; object). Could
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; you please adapt your patch to that concept (i.e. add a tracklist and
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; player object; in case of need just method stubs)? I'm aware of the
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; fact that the actions defined in that specification don't 100% map
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Kaffeine's actions (e.g. Play() doing a rewind to the beginning of a
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; track), so you don't have to care about those details if you don't
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; want to do. I also know that not every mpris thing is possible
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; (especially the tracklist parts needs more work) and that there's not
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; a mpris thing for every action Kaffeine is able to perform (put them
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; in a separate object for now).
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; &amp;nbsp;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; There is one problem left, when selecting a new DVB-channel 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; directly by name
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; or by number, with the (new) functions:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; dvbTab::setChannel(const QString &amp;name)
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; and
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; DvbTab::setChannel(int number)
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; changing the channel works, but I didn't manage to have the selection
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; changed to the new channel in the DvbChannelView tree. I don't 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; know how to
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; get a valid QModelIndex that points to the correct 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; DvbChannelModel. Please
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; look at the code and at my comments in DvbTab::setChannel(int 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; number). I
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; tried almost everything and thereby learned a lot about the model 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; / view
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; concept of Qt, but it didn't help me to find the solution... Maybe 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; you
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; already know this probem Christoph, because there is the same 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; issue when
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; kaffeine gets started with the &amp;quot;--tv &amp;lt;channel&amp;gt;&amp;quot; flag: it simply calls
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; DvbTab::playChannel(const QString &amp;name), but it does not select 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; the channel
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; in the DvbChannelView. The problem is that afterwards, calls to
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; MediaWidget::previous() and next() have no effect, because the 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; currently
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; selected channel is not known. I hope that someone more clever 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; than me will
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; solve this issue ;)
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Yes, this one is trickier. Note that there exists a similar problem
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; e.g. with playPause(): you also need to update the ui state.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; &amp;nbsp;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; cheers,
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Pascal
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Thanks,
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Christoph
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; [1] &lt;a href=&quot;http://wiki.xmms2.xmms.se/wiki/MPRIS&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://wiki.xmms2.xmms.se/wiki/MPRIS&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;diff -Naur ../kaffeine/src/dbusobjects.cpp ./src/dbusobjects.cpp
&lt;br&gt;--- ../kaffeine/src/dbusobjects.cpp	2009-11-24 23:27:03.000000000 +0100
&lt;br&gt;+++ ./src/dbusobjects.cpp	2009-11-24 23:44:23.000000000 +0100
&lt;br&gt;@@ -23,6 +23,9 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;QDBusMetaType&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;KAboutData&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;KApplication&amp;gt;
&lt;br&gt;+#include &amp;lt;KUrl&amp;gt;
&lt;br&gt;+
&lt;br&gt;+#include &amp;quot;mediawidget.h&amp;quot;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;QDBusArgument &amp;operator&amp;lt;&amp;lt;(QDBusArgument &amp;argument, const MprisVersionStruct &amp;versionStruct)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;@@ -40,9 +43,27 @@
&lt;br&gt;&amp;nbsp;	return argument;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+QDBusArgument &amp;operator&amp;lt;&amp;lt;(QDBusArgument &amp;argument, const MprisStatusStruct &amp;statusStruct)
&lt;br&gt;+{
&lt;br&gt;+	argument.beginStructure();
&lt;br&gt;+	argument &amp;lt;&amp;lt; statusStruct.play &amp;lt;&amp;lt; statusStruct.random &amp;lt;&amp;lt; statusStruct.repeatTrack &amp;lt;&amp;lt; statusStruct.repeatAll;
&lt;br&gt;+	argument.endStructure();
&lt;br&gt;+	return argument;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+const QDBusArgument &amp;operator&amp;gt;&amp;gt;(const QDBusArgument &amp;argument, MprisStatusStruct &amp;statusStruct)
&lt;br&gt;+{
&lt;br&gt;+	argument.beginStructure();
&lt;br&gt;+	argument &amp;gt;&amp;gt; statusStruct.play &amp;gt;&amp;gt; statusStruct.random &amp;gt;&amp;gt; statusStruct.repeatTrack &amp;gt;&amp;gt; statusStruct.repeatAll;
&lt;br&gt;+	argument.endStructure();
&lt;br&gt;+	return argument;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;MprisRootObject::MprisRootObject(QObject *parent) : QObject(parent)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	 qDBusRegisterMetaType&amp;lt;MprisVersionStruct&amp;gt;();
&lt;br&gt;+	 qDBusRegisterMetaType&amp;lt;MprisStatusStruct&amp;gt;();
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;MprisRootObject::~MprisRootObject()
&lt;br&gt;@@ -67,3 +88,325 @@
&lt;br&gt;&amp;nbsp;	versionStruct.minor = 0;
&lt;br&gt;&amp;nbsp;	return versionStruct;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+MprisPlayerObject::MprisPlayerObject(MediaWidget *mediaWidget_): mediaWidget(mediaWidget_)
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+MprisPlayerObject::~MprisPlayerObject()
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Next()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;next();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Prev()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;previous();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::PlayPause()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;playPause();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Play()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;play();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Pause()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;pause();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisPlayerObject::VolumeGet()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getVolume();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::VolumeSet(int volume)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;changeVolume(volume);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::VolumeIncrease()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;increaseVolume();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::VolumeDecrease()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;decreaseVolume();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisPlayerObject::PositionGet()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getPosition();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::PositionSet(int position)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setPosition(position);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Repeat()
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+	//repeating a single track not implemented yet, only whole playlist
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisPlayerObject::GetCaps()
&lt;br&gt;+{
&lt;br&gt;+	int caps = NO_CAPS;
&lt;br&gt;+
&lt;br&gt;+	if ( mediaWidget-&amp;gt;hasMedia() ) 
&lt;br&gt;+	{
&lt;br&gt;+		if ( mediaWidget-&amp;gt;isPlaying() &amp;&amp; ! mediaWidget-&amp;gt;isPaused() )
&lt;br&gt;+		{
&lt;br&gt;+			caps |= CAN_PAUSE;
&lt;br&gt;+		}
&lt;br&gt;+		else 
&lt;br&gt;+		{
&lt;br&gt;+			caps |= CAN_PLAY;
&lt;br&gt;+		}
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	caps |= CAN_HAS_TRACKLIST;
&lt;br&gt;+
&lt;br&gt;+	//TODO: CAN_GO_NEXT &amp; CAN_GO_PREV &amp; CAN_PROVIDE_METADATA
&lt;br&gt;+
&lt;br&gt;+	return caps;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Stop()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;stop();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+MprisStatusStruct MprisPlayerObject::GetStatus()
&lt;br&gt;+{
&lt;br&gt;+	MprisStatusStruct statusStruct;
&lt;br&gt;+	if ( mediaWidget-&amp;gt;isPaused() )
&lt;br&gt;+	{
&lt;br&gt;+		statusStruct.play = 1;
&lt;br&gt;+	}
&lt;br&gt;+	else if ( mediaWidget-&amp;gt;isPlaying() )
&lt;br&gt;+	{
&lt;br&gt;+		statusStruct.play = 0;
&lt;br&gt;+	}
&lt;br&gt;+	else
&lt;br&gt;+	{
&lt;br&gt;+		statusStruct.play = 2;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	if ( mediaWidget-&amp;gt;isRepeat() )
&lt;br&gt;+	{
&lt;br&gt;+		statusStruct.repeatAll = 1;
&lt;br&gt;+	}
&lt;br&gt;+	else
&lt;br&gt;+	{
&lt;br&gt;+		statusStruct.repeatAll = 0;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	statusStruct.random = 0;
&lt;br&gt;+	statusStruct.repeatTrack = 0;
&lt;br&gt;+	
&lt;br&gt;+	return statusStruct;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+QVariantMap MprisPlayerObject::GetMetadata()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getMetadata();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Play(const QString &amp;url)
&lt;br&gt;+{
&lt;br&gt;+	KUrl kurl(url);
&lt;br&gt;+	if (kurl.isValid()) {
&lt;br&gt;+		mediaWidget-&amp;gt;play(kurl);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::PlayAudioCd()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;playAudioCd();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::PlayVideoCd()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;playVideoCd();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::PlayDvd()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;playDvd();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void &amp;nbsp;MprisPlayerObject::ChangeAudioChannel(int index)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;changeAudioChannel(index);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void &amp;nbsp;MprisPlayerObject::ChangeSubtitle(int index)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;changeSubtitle(index);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::ToggleMuted()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;toggleMuted();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::LongSkipBackward()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;longSkipBackward();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::SkipBackward()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;skipBackward();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::SkipForward()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;skipForward();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::LongSkipForward()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;longSkipForward();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::TimeButtonClicked()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;timeButtonClicked();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::UpdateTimeButton()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;updateTimeButton();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+MprisTrackListObject::MprisTrackListObject(MediaWidget *mediaWidget_): mediaWidget(mediaWidget_)
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+MprisTrackListObject::~MprisTrackListObject()
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+QVariantMap MprisTrackListObject::GetMetadata()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getMetadata();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisTrackListObject::GetCurrentTrack()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getCurrentTrack();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisTrackListObject::GetLength()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getLength();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisTrackListObject::AddTrack(QString track, bool play)
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;addTrack(track, play);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisTrackListObject::DelTrack(int position)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;delTrack(position);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisTrackListObject::SetLoop(bool loop)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setLoop(loop);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisTrackListObject::SetRandom(bool random)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setRandom(random);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+MprisDvbObject::MprisDvbObject(MediaWidget *mediaWidget_): mediaWidget(mediaWidget_)
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+MprisDvbObject::~MprisDvbObject()
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::SetDvbChannel(const QString &amp;name)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setDvbChannel(name);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::SetDvbChannelNumber(int number)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setDvbChannel(number);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::SetNumber(int number)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setNumber(number);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::SetDvbLastChannel()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setDvbLastChannel();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::StopDvb()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;stopDvb();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::ToggleInstantRecord()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;toggleInstantRecord();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::ToggleOsd()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;toggleOsd();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+MprisDisplayObject::MprisDisplayObject(MediaWidget *mediaWidget_): mediaWidget(mediaWidget_)
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+MprisDisplayObject::~MprisDisplayObject()
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+void MprisDisplayObject::ToggleFullScreen()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;fullScreen();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDisplayObject::AspectRatioAuto()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;aspectRatioAuto();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDisplayObject::AspectRatio4_3()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;aspectRatio4_3();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDisplayObject::AspectRatio16_9()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;aspectRatio16_9();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDisplayObject::AspectRatioWidget()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;aspectRatioWidget();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;diff -Naur ../kaffeine/src/dbusobjects.h ./src/dbusobjects.h
&lt;br&gt;--- ../kaffeine/src/dbusobjects.h	2009-11-24 23:27:03.000000000 +0100
&lt;br&gt;+++ ./src/dbusobjects.h	2009-11-24 23:44:27.000000000 +0100
&lt;br&gt;@@ -22,8 +22,12 @@
&lt;br&gt;&amp;nbsp;#define DBUSOBJECTS_H
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#include &amp;lt;QMetaType&amp;gt;
&lt;br&gt;+#include &amp;lt;QVariantMap&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;struct MprisVersionStruct;
&lt;br&gt;+struct MprisStatusStruct;
&lt;br&gt;+
&lt;br&gt;+class MediaWidget;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;class MprisRootObject : public QObject
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;@@ -39,6 +43,130 @@
&lt;br&gt;&amp;nbsp;	MprisVersionStruct MprisVersion();
&lt;br&gt;&amp;nbsp;};
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+
&lt;br&gt;+class MprisPlayerObject : public QObject
&lt;br&gt;+{
&lt;br&gt;+	Q_OBJECT
&lt;br&gt;+	Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.freedesktop.MediaPlayer&amp;quot;)
&lt;br&gt;+public:
&lt;br&gt;+	explicit MprisPlayerObject(MediaWidget *mediaWidget_);
&lt;br&gt;+	~MprisPlayerObject();
&lt;br&gt;+
&lt;br&gt;+public slots:
&lt;br&gt;+	void Next();
&lt;br&gt;+	void Prev();
&lt;br&gt;+	void Play();
&lt;br&gt;+	void Pause();
&lt;br&gt;+	void Stop();
&lt;br&gt;+	int &amp;nbsp;VolumeGet();
&lt;br&gt;+	void VolumeSet(int volume);
&lt;br&gt;+	int &amp;nbsp;PositionGet();
&lt;br&gt;+	void PositionSet(int position);
&lt;br&gt;+	void Repeat();
&lt;br&gt;+	MprisStatusStruct GetStatus();
&lt;br&gt;+	QVariantMap GetMetadata();
&lt;br&gt;+	int GetCaps();
&lt;br&gt;+
&lt;br&gt;+	// this functions are not part of the MPRIS specs
&lt;br&gt;+	void PlayPause();
&lt;br&gt;+	void VolumeIncrease();
&lt;br&gt;+	void VolumeDecrease();
&lt;br&gt;+	void Play(const QString &amp;url);
&lt;br&gt;+	void PlayAudioCd();
&lt;br&gt;+	void PlayVideoCd();
&lt;br&gt;+	void PlayDvd();
&lt;br&gt;+	void ChangeAudioChannel(int index);
&lt;br&gt;+	void ChangeSubtitle(int index);
&lt;br&gt;+	void ToggleMuted();
&lt;br&gt;+	void LongSkipBackward();
&lt;br&gt;+	void SkipBackward();
&lt;br&gt;+	void SkipForward();
&lt;br&gt;+	void LongSkipForward();
&lt;br&gt;+	void TimeButtonClicked();
&lt;br&gt;+	void UpdateTimeButton();
&lt;br&gt;+
&lt;br&gt;+signals:
&lt;br&gt;+	void CapsChange( int );
&lt;br&gt;+	void StatusChange( MprisStatusStruct );
&lt;br&gt;+	void TrackChange( QVariantMap );
&lt;br&gt;+
&lt;br&gt;+private:
&lt;br&gt;+	MediaWidget *mediaWidget;
&lt;br&gt;+
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+class MprisTrackListObject : public QObject
&lt;br&gt;+{
&lt;br&gt;+	Q_OBJECT
&lt;br&gt;+	Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.freedesktop.MediaPlayer&amp;quot;)
&lt;br&gt;+public:
&lt;br&gt;+	explicit MprisTrackListObject(MediaWidget *mediaWidget_);
&lt;br&gt;+	~MprisTrackListObject();
&lt;br&gt;+
&lt;br&gt;+public slots:
&lt;br&gt;+	QVariantMap GetMetadata();
&lt;br&gt;+	int GetCurrentTrack();
&lt;br&gt;+	int GetLength();
&lt;br&gt;+	int AddTrack(QString track, bool play);
&lt;br&gt;+	void DelTrack(int position);
&lt;br&gt;+	void SetLoop(bool loop);
&lt;br&gt;+	void SetRandom(bool random);
&lt;br&gt;+
&lt;br&gt;+signals:
&lt;br&gt;+	void TrackListChange(int);
&lt;br&gt;+
&lt;br&gt;+private:
&lt;br&gt;+	MediaWidget *mediaWidget;
&lt;br&gt;+
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+class MprisDvbObject : public QObject
&lt;br&gt;+{
&lt;br&gt;+	Q_OBJECT
&lt;br&gt;+	Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.freedesktop.MediaPlayer&amp;quot;)
&lt;br&gt;+public:
&lt;br&gt;+	explicit MprisDvbObject(MediaWidget *mediaWidget_);
&lt;br&gt;+	~MprisDvbObject();
&lt;br&gt;+
&lt;br&gt;+public slots:
&lt;br&gt;+	void SetDvbChannel(const QString &amp;name);
&lt;br&gt;+	void SetDvbChannelNumber(int number);
&lt;br&gt;+	void SetNumber(int number);
&lt;br&gt;+	void SetDvbLastChannel();
&lt;br&gt;+	void StopDvb();
&lt;br&gt;+	void ToggleInstantRecord();
&lt;br&gt;+	void ToggleOsd();
&lt;br&gt;+
&lt;br&gt;+private:
&lt;br&gt;+	MediaWidget *mediaWidget;
&lt;br&gt;+
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+class MprisDisplayObject : public QObject
&lt;br&gt;+{
&lt;br&gt;+	Q_OBJECT
&lt;br&gt;+	Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.freedesktop.MediaPlayer&amp;quot;)
&lt;br&gt;+public:
&lt;br&gt;+	explicit MprisDisplayObject(MediaWidget *mediaWidget_);
&lt;br&gt;+	~MprisDisplayObject();
&lt;br&gt;+
&lt;br&gt;+public slots:
&lt;br&gt;+	void AspectRatioAuto();
&lt;br&gt;+	void AspectRatio4_3();
&lt;br&gt;+	void AspectRatio16_9();
&lt;br&gt;+	void AspectRatioWidget();
&lt;br&gt;+	void ToggleFullScreen();
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+private:
&lt;br&gt;+	MediaWidget *mediaWidget;
&lt;br&gt;+
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;struct MprisVersionStruct
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	quint16 major;
&lt;br&gt;@@ -47,4 +175,30 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;Q_DECLARE_METATYPE(MprisVersionStruct)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+struct MprisStatusStruct
&lt;br&gt;+{
&lt;br&gt;+	quint16 play;
&lt;br&gt;+	quint16 random;
&lt;br&gt;+	quint16 repeatTrack;
&lt;br&gt;+	quint16 repeatAll;
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+Q_DECLARE_METATYPE(MprisStatusStruct)
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+* The bit values for the capabilities flags
&lt;br&gt;+*/
&lt;br&gt;+enum Cap {
&lt;br&gt;+	NO_CAPS			 &amp;nbsp; = 0,
&lt;br&gt;+	CAN_GO_NEXT		 &amp;nbsp; = 1 &amp;lt;&amp;lt; 0,
&lt;br&gt;+	CAN_GO_PREV		 &amp;nbsp; = 1 &amp;lt;&amp;lt; 1,
&lt;br&gt;+	CAN_PAUSE			 = 1 &amp;lt;&amp;lt; 2,
&lt;br&gt;+	CAN_PLAY			 &amp;nbsp;= 1 &amp;lt;&amp;lt; 3,
&lt;br&gt;+	CAN_SEEK			 &amp;nbsp;= 1 &amp;lt;&amp;lt; 4,
&lt;br&gt;+	CAN_PROVIDE_METADATA &amp;nbsp;= 1 &amp;lt;&amp;lt; 5,
&lt;br&gt;+	CAN_HAS_TRACKLIST	 = 1 &amp;lt;&amp;lt; 6,
&lt;br&gt;+	ALL_KNOWN_CAPS		= (1 &amp;lt;&amp;lt; 7) - 1
&lt;br&gt;+};
&lt;br&gt;+Q_DECLARE_FLAGS(Caps, Cap)
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;#endif /* DBUSOBJECTS_H */
&lt;br&gt;diff -Naur ../kaffeine/src/dvb/dvbliveview.cpp ./src/dvb/dvbliveview.cpp
&lt;br&gt;--- ../kaffeine/src/dvb/dvbliveview.cpp	2009-11-24 23:27:03.000000000 +0100
&lt;br&gt;+++ ./src/dvb/dvbliveview.cpp	2009-11-24 23:46:14.000000000 +0100
&lt;br&gt;@@ -440,6 +440,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	if (channel != NULL) {
&lt;br&gt;&amp;nbsp;		playChannel(channel);
&lt;br&gt;+		emit updateDvbChannelUi(channel.data()-&amp;gt;number);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;diff -Naur ../kaffeine/src/dvb/dvbliveview.h ./src/dvb/dvbliveview.h
&lt;br&gt;--- ../kaffeine/src/dvb/dvbliveview.h	2009-11-24 23:27:03.000000000 +0100
&lt;br&gt;+++ ./src/dvb/dvbliveview.h	2009-11-24 23:46:19.000000000 +0100
&lt;br&gt;@@ -44,6 +44,9 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	void playChannel(const QSharedDataPointer&amp;lt;DvbChannel&amp;gt; &amp;channel_);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+signals:
&lt;br&gt;+	void updateDvbChannelUi(int number);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;private slots:
&lt;br&gt;&amp;nbsp;	void pmtSectionChanged(const DvbPmtSection &amp;pmtSection);
&lt;br&gt;&amp;nbsp;	void insertPatPmt();
&lt;br&gt;diff -Naur ../kaffeine/src/dvb/dvbtab.cpp ./src/dvb/dvbtab.cpp
&lt;br&gt;--- ../kaffeine/src/dvb/dvbtab.cpp	2009-11-24 23:27:03.000000000 +0100
&lt;br&gt;+++ ./src/dvb/dvbtab.cpp	2009-11-24 23:46:14.000000000 +0100
&lt;br&gt;@@ -117,6 +117,10 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	connect(mediaWidget, SIGNAL(previousDvbChannel()), this, SLOT(previousChannel()));
&lt;br&gt;&amp;nbsp;	connect(mediaWidget, SIGNAL(nextDvbChannel()), this, SLOT(nextChannel()));
&lt;br&gt;+	connect(mediaWidget, SIGNAL(changeDvbChannel(const QString&amp;)), this, SLOT(setChannel(const QString&amp;)));
&lt;br&gt;+	connect(mediaWidget, SIGNAL(changeDvbChannel(int)), this, SLOT(setChannel(int)));
&lt;br&gt;+	connect(mediaWidget, SIGNAL(dvbLastChannel()), this, SLOT(setLastChannel()));
&lt;br&gt;+	connect(mediaWidget, SIGNAL(toggleInstantRecord()), this, SLOT(toggleInstantRecord()));
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	connect(manager-&amp;gt;getRecordingManager(), SIGNAL(instantRecordingRemoved()),
&lt;br&gt;&amp;nbsp;		this, SLOT(instantRecordingRemoved()));
&lt;br&gt;@@ -144,7 +148,7 @@
&lt;br&gt;&amp;nbsp;	channelView-&amp;gt;setRootIsDecorated(false);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	if (!channelView-&amp;gt;header()-&amp;gt;restoreState(QByteArray::fromBase64(
&lt;br&gt;-	 &amp;nbsp; &amp;nbsp;KGlobal::config()-&amp;gt;group(&amp;quot;DVB&amp;quot;).readEntry(&amp;quot;ChannelViewState&amp;quot;, QByteArray())))) {
&lt;br&gt;+		KGlobal::config()-&amp;gt;group(&amp;quot;DVB&amp;quot;).readEntry(&amp;quot;ChannelViewState&amp;quot;, QByteArray())))) {
&lt;br&gt;&amp;nbsp;		channelView-&amp;gt;sortByColumn(0, Qt::AscendingOrder);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -195,6 +199,8 @@
&lt;br&gt;&amp;nbsp;	QTimer *timer = new QTimer(this);
&lt;br&gt;&amp;nbsp;	timer-&amp;gt;start(30000);
&lt;br&gt;&amp;nbsp;	connect(timer, SIGNAL(timeout()), this, SLOT(cleanTimeShiftFiles()));
&lt;br&gt;+
&lt;br&gt;+	connect(manager-&amp;gt;getLiveView(), SIGNAL(updateDvbChannelUi(int)), this, SLOT(updateDvbChannelUi(int)));
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;DvbTab::~DvbTab()
&lt;br&gt;@@ -210,6 +216,11 @@
&lt;br&gt;&amp;nbsp;	playChannel(manager-&amp;gt;getChannelModel()-&amp;gt;channelForName(name));
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+void DvbTab::playChannel(int number)
&lt;br&gt;+{
&lt;br&gt;+	playChannel(manager-&amp;gt;getChannelModel()-&amp;gt;channelForNumber(number));
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void DvbTab::playLastChannel()
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	playChannel(KGlobal::config()-&amp;gt;group(&amp;quot;DVB&amp;quot;).readEntry(&amp;quot;LastChannel&amp;quot;));
&lt;br&gt;@@ -244,6 +255,19 @@
&lt;br&gt;&amp;nbsp;	dialog.exec();
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+void DvbTab::toggleInstantRecord()
&lt;br&gt;+{
&lt;br&gt;+	if (instantRecordAction-&amp;gt;isChecked()) {
&lt;br&gt;+		instantRecordAction-&amp;gt;setChecked(false);
&lt;br&gt;+		instantRecord(false);
&lt;br&gt;+	}
&lt;br&gt;+	else {
&lt;br&gt;+		instantRecordAction-&amp;gt;setChecked(true);
&lt;br&gt;+		instantRecord(true);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void DvbTab::instantRecord(bool checked)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	if (checked) {
&lt;br&gt;@@ -349,6 +373,49 @@
&lt;br&gt;&amp;nbsp;void DvbTab::playChannel(const QSharedDataPointer&amp;lt;DvbChannel&amp;gt; &amp;channel)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	if (channel != NULL) {
&lt;br&gt;+		updateDvbChannelUi(channel-&amp;gt;number);
&lt;br&gt;&amp;nbsp;		manager-&amp;gt;getLiveView()-&amp;gt;playChannel(channel);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+void DvbTab::setChannel(const QString &amp;name)
&lt;br&gt;+{
&lt;br&gt;+	QSharedDataPointer&amp;lt;DvbChannel&amp;gt; channel = manager-&amp;gt;getChannelModel()-&amp;gt;channelForName(name);
&lt;br&gt;+	if (channel != NULL) {
&lt;br&gt;+		updateDvbChannelUi(channel.data()-&amp;gt;number);
&lt;br&gt;+	}
&lt;br&gt;+	playChannel(name);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DvbTab::setChannel(int number)
&lt;br&gt;+{
&lt;br&gt;+	updateDvbChannelUi(number);
&lt;br&gt;+	playChannel(number);
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DvbTab::setLastChannel()
&lt;br&gt;+{
&lt;br&gt;+	playLastChannel();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DvbTab::updateDvbChannelUi(int number)
&lt;br&gt;+{
&lt;br&gt;+	QModelIndex index = channelView-&amp;gt;indexAt(QPoint(0,0));
&lt;br&gt;+
&lt;br&gt;+	if (!index.isValid()) {
&lt;br&gt;+		return;
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	DvbChannelModel *channelModel = (DvbChannelModel*) index.model();
&lt;br&gt;+
&lt;br&gt;+	QModelIndexList list = channelModel-&amp;gt;match(channelModel-&amp;gt;index(0, 1), Qt::DisplayRole, number, 1, Qt::MatchExactly);
&lt;br&gt;+	QModelIndex index_new = list.value(0);
&lt;br&gt;+
&lt;br&gt;+	if (!index_new.isValid()) {
&lt;br&gt;+		return;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	channelView-&amp;gt;setCurrentIndex(index_new);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;diff -Naur ../kaffeine/src/dvb/dvbtab.h ./src/dvb/dvbtab.h
&lt;br&gt;--- ../kaffeine/src/dvb/dvbtab.h	2009-11-24 23:27:03.000000000 +0100
&lt;br&gt;+++ ./src/dvb/dvbtab.h	2009-11-24 23:46:19.000000000 +0100
&lt;br&gt;@@ -38,11 +38,13 @@
&lt;br&gt;&amp;nbsp;class DvbTab : public TabBase
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	Q_OBJECT
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;public:
&lt;br&gt;&amp;nbsp;	DvbTab(KMenu *menu, KActionCollection *collection, MediaWidget *mediaWidget_);
&lt;br&gt;&amp;nbsp;	~DvbTab();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	void playChannel(const QString &amp;name);
&lt;br&gt;+	void playChannel(int number);
&lt;br&gt;&amp;nbsp;	void playLastChannel();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	void enableDvbDump();
&lt;br&gt;@@ -52,12 +54,17 @@
&lt;br&gt;&amp;nbsp;	void showEpgDialog();
&lt;br&gt;&amp;nbsp;	void showRecordingDialog();
&lt;br&gt;&amp;nbsp;	void instantRecord(bool checked);
&lt;br&gt;+	void toggleInstantRecord();
&lt;br&gt;&amp;nbsp;	void instantRecordingRemoved();
&lt;br&gt;&amp;nbsp;	void configureDvb();
&lt;br&gt;&amp;nbsp;	void playLive(const QModelIndex &amp;index);
&lt;br&gt;&amp;nbsp;	void previousChannel();
&lt;br&gt;&amp;nbsp;	void nextChannel();
&lt;br&gt;&amp;nbsp;	void cleanTimeShiftFiles();
&lt;br&gt;+	void setChannel(const QString &amp;name);
&lt;br&gt;+	void setChannel(int number);
&lt;br&gt;+	void setLastChannel();
&lt;br&gt;+	void updateDvbChannelUi(int number);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;private:
&lt;br&gt;&amp;nbsp;	void activate();
&lt;br&gt;diff -Naur ../kaffeine/src/kaffeine.cpp ./src/kaffeine.cpp
&lt;br&gt;--- ../kaffeine/src/kaffeine.cpp	2009-11-24 23:27:03.000000000 +0100
&lt;br&gt;+++ ./src/kaffeine.cpp	2009-11-24 23:44:23.000000000 +0100
&lt;br&gt;@@ -327,6 +327,15 @@
&lt;br&gt;&amp;nbsp;	// initialize dbus objects
&lt;br&gt;&amp;nbsp;	QDBusConnection::sessionBus().registerObject(&amp;quot;/&amp;quot;, new MprisRootObject(this),
&lt;br&gt;&amp;nbsp;		QDBusConnection::ExportAllContents);
&lt;br&gt;+	QDBusConnection::sessionBus().registerObject(&amp;quot;/Player&amp;quot;, new MprisPlayerObject(mediaWidget),
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;QDBusConnection::ExportAllContents);
&lt;br&gt;+	QDBusConnection::sessionBus().registerObject(&amp;quot;/TrackList&amp;quot;, new MprisTrackListObject(mediaWidget),
&lt;br&gt;+		QDBusConnection::ExportAllContents);
&lt;br&gt;+	QDBusConnection::sessionBus().registerObject(&amp;quot;/DVB&amp;quot;, new MprisDvbObject(mediaWidget),
&lt;br&gt;+		QDBusConnection::ExportAllContents);
&lt;br&gt;+	QDBusConnection::sessionBus().registerObject(&amp;quot;/Display&amp;quot;, new MprisDisplayObject(mediaWidget),
&lt;br&gt;+		QDBusConnection::ExportAllContents);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	QDBusConnection::sessionBus().registerService(&amp;quot;org.mpris.kaffeine&amp;quot;);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	show();
&lt;br&gt;diff -Naur ../kaffeine/src/mediawidget.cpp ./src/mediawidget.cpp
&lt;br&gt;--- ../kaffeine/src/mediawidget.cpp	2009-11-24 23:27:03.000000000 +0100
&lt;br&gt;+++ ./src/mediawidget.cpp	2009-11-24 23:44:23.000000000 +0100
&lt;br&gt;@@ -374,6 +374,8 @@
&lt;br&gt;&amp;nbsp;	connect(timer, SIGNAL(timeout()), this, SLOT(checkScreenSaver()));
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	stateChanged(Phonon::StoppedState);
&lt;br&gt;+
&lt;br&gt;+	setRepeat(false);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;MediaWidget::~MediaWidget()
&lt;br&gt;@@ -543,6 +545,67 @@
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+bool MediaWidget::isPaused()
&lt;br&gt;+{
&lt;br&gt;+	if (playing &amp;&amp; mediaObject-&amp;gt;state() == Phonon::PausedState)
&lt;br&gt;+	{
&lt;br&gt;+		return true;
&lt;br&gt;+	}
&lt;br&gt;+	return false;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+// also returns true when paused
&lt;br&gt;+bool MediaWidget::isPlaying()
&lt;br&gt;+{
&lt;br&gt;+	return playing;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setRepeat(bool repeat_)
&lt;br&gt;+{
&lt;br&gt;+	repeat = repeat_;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+bool MediaWidget::isRepeat()
&lt;br&gt;+{
&lt;br&gt;+	return repeat;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+bool MediaWidget::hasMedia()
&lt;br&gt;+{
&lt;br&gt;+	if ( mediaObject-&amp;gt;currentSource().type() != Phonon::MediaSource::Invalid ) {
&lt;br&gt;+		return true;
&lt;br&gt;+	}
&lt;br&gt;+	else {
&lt;br&gt;+		return false;
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setDvbChannel(int number)
&lt;br&gt;+{
&lt;br&gt;+	if (dvbFeed != NULL) {
&lt;br&gt;+		emit changeDvbChannel(number);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setDvbChannel(const QString &amp;name)
&lt;br&gt;+{
&lt;br&gt;+	if (dvbFeed != NULL) {
&lt;br&gt;+		emit changeDvbChannel(name);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setDvbLastChannel()
&lt;br&gt;+{
&lt;br&gt;+	if (dvbFeed != NULL) {
&lt;br&gt;+		emit dvbLastChannel();
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::fullScreen()
&lt;br&gt;+{
&lt;br&gt;+	emit toggleFullScreen();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void MediaWidget::stateChanged(Phonon::State state)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	bool newPlaying = false;
&lt;br&gt;@@ -655,6 +718,31 @@
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+void MediaWidget::playPause() {
&lt;br&gt;+	//if (actionPlayPause-&amp;gt;text() == textPlay) {
&lt;br&gt;+	if (isPaused()) {
&lt;br&gt;+		playPause(false);
&lt;br&gt;+	}
&lt;br&gt;+	else {
&lt;br&gt;+		playPause(true);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::play() {
&lt;br&gt;+	if (playing &amp;&amp; actionPlayPause-&amp;gt;text() == textPlay) {
&lt;br&gt;+		playPause(false);
&lt;br&gt;+	}
&lt;br&gt;+	else if (!playing) {
&lt;br&gt;+		emit playlistPlay();
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::pause() {
&lt;br&gt;+	if (playing &amp;&amp; actionPlayPause-&amp;gt;text() == textPause) {
&lt;br&gt;+		playPause(true);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void MediaWidget::stop()
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	mediaObject-&amp;gt;stop();
&lt;br&gt;@@ -726,6 +814,17 @@
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+int MediaWidget::getVolume()
&lt;br&gt;+{
&lt;br&gt;+	int volume = audioOutput-&amp;gt;volume() * 100;
&lt;br&gt;+
&lt;br&gt;+	if ( volume &amp;gt;= 0 &amp;&amp; volume &amp;lt;= 100 ) {
&lt;br&gt;+		return volume;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void MediaWidget::changeVolume(int volume)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	audioOutput-&amp;gt;setVolume(volume * qreal(0.01));
&lt;br&gt;@@ -915,6 +1014,16 @@
&lt;br&gt;&amp;nbsp;	mediaObject-&amp;gt;seek(mediaObject-&amp;gt;currentTime() + 1000 * longSkipDuration);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+void MediaWidget::setPosition(int position)
&lt;br&gt;+{
&lt;br&gt;+	mediaObject-&amp;gt;seek(position);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MediaWidget::getPosition()
&lt;br&gt;+{
&lt;br&gt;+	return mediaObject-&amp;gt;currentTime();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void MediaWidget::jumpToPosition()
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	JumpToPositionDialog dialog(QTime().addMSecs(mediaObject-&amp;gt;currentTime()), this);
&lt;br&gt;@@ -1150,3 +1259,64 @@
&lt;br&gt;&amp;nbsp;		subtitleBox-&amp;gt;setEnabled(false);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+QVariantMap MediaWidget::getMetadata()
&lt;br&gt;+{
&lt;br&gt;+	QVariantMap ret;
&lt;br&gt;+	QMultiMap&amp;lt;QString, QString&amp;gt; multiMap = mediaObject-&amp;gt;metaData();
&lt;br&gt;+	QMultiMap&amp;lt;QString, QString&amp;gt;::const_iterator i = multiMap.constBegin();
&lt;br&gt;+	
&lt;br&gt;+	while( i != multiMap.constEnd() )
&lt;br&gt;+	{
&lt;br&gt;+		ret[ i.key() ] = QVariant( i.value() );
&lt;br&gt;+		i++;
&lt;br&gt;+	}
&lt;br&gt;+	return ret;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int getNumberOfTracks()
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MediaWidget::getCurrentTrack()
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MediaWidget::getLength()
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MediaWidget::addTrack(QString track, bool play)
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::delTrack(int position)
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setLoop(bool loop)
&lt;br&gt;+{
&lt;br&gt;+	setRepeat(loop);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setRandom(bool random)
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setNumber(int number)
&lt;br&gt;+{
&lt;br&gt;+	if (number &amp;gt;= 0 &amp;&amp; number &amp;lt;= 9) {
&lt;br&gt;+		emit osdKeyPressed(number + Qt::Key_0);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;diff -Naur ../kaffeine/src/mediawidget.h ./src/mediawidget.h
&lt;br&gt;--- ../kaffeine/src/mediawidget.h	2009-11-24 23:27:03.000000000 +0100
&lt;br&gt;+++ ./src/mediawidget.h	2009-11-24 23:44:27.000000000 +0100
&lt;br&gt;@@ -48,9 +48,14 @@
&lt;br&gt;&amp;nbsp;class MediaWidget : public QWidget
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	Q_OBJECT
&lt;br&gt;+	friend class MprisPlayerObject;
&lt;br&gt;+	friend class MprisTrackListObject;
&lt;br&gt;+	friend class MprisDvbObject;
&lt;br&gt;+	friend class MprisDisplayObject;	
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;public:
&lt;br&gt;&amp;nbsp;	MediaWidget(KMenu *menu_, KAction *fullScreenAction, KToolBar *toolBar,
&lt;br&gt;-		 &amp;nbsp; &amp;nbsp;KActionCollection *collection, QWidget *parent);
&lt;br&gt;+			KActionCollection *collection, QWidget *parent);
&lt;br&gt;&amp;nbsp;	~MediaWidget();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	static QString extensionFilter(); // usable for KFileDialog::setFilter()
&lt;br&gt;@@ -78,6 +83,12 @@
&lt;br&gt;&amp;nbsp;	void setShortSkipDuration(int duration);
&lt;br&gt;&amp;nbsp;	void setLongSkipDuration(int duration);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+	void setRepeat(bool repeat_);
&lt;br&gt;+	bool isRepeat();
&lt;br&gt;+	bool hasMedia();
&lt;br&gt;+
&lt;br&gt;+	void setNumber(int number);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;public slots:
&lt;br&gt;&amp;nbsp;	void stop();
&lt;br&gt;&amp;nbsp;	void stopDvb();
&lt;br&gt;@@ -98,14 +109,35 @@
&lt;br&gt;&amp;nbsp;	void startDvbTimeShift();
&lt;br&gt;&amp;nbsp;	void changeDvbAudioChannel(int index);
&lt;br&gt;&amp;nbsp;	void changeDvbSubtitle(int index);
&lt;br&gt;+	void changeDvbChannel(int number);
&lt;br&gt;+	void changeDvbChannel(const QString &amp;name);
&lt;br&gt;&amp;nbsp;	void dvbStopped();
&lt;br&gt;&amp;nbsp;	void osdKeyPressed(int key);
&lt;br&gt;+	void toggleOsd();
&lt;br&gt;+
&lt;br&gt;+	void dvbLastChannel();
&lt;br&gt;+	void toggleInstantRecord();
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;private slots:
&lt;br&gt;+	bool isPlaying();
&lt;br&gt;+	bool isPaused();
&lt;br&gt;+
&lt;br&gt;+	int getPosition();
&lt;br&gt;+	int getCurrentTrack();
&lt;br&gt;+	int getLength();
&lt;br&gt;+	int addTrack(QString track, bool play);
&lt;br&gt;+	int getVolume();
&lt;br&gt;+
&lt;br&gt;+	QVariantMap getMetadata();
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	void stateChanged(Phonon::State state);
&lt;br&gt;&amp;nbsp;	void playbackFinished();
&lt;br&gt;&amp;nbsp;	void previous();
&lt;br&gt;&amp;nbsp;	void playPause(bool paused);
&lt;br&gt;+	void playPause();
&lt;br&gt;+	void play();
&lt;br&gt;+	void pause();
&lt;br&gt;&amp;nbsp;	void next();
&lt;br&gt;&amp;nbsp;	void changeAudioChannel(int index);
&lt;br&gt;&amp;nbsp;	void changeSubtitle(int index);
&lt;br&gt;@@ -132,6 +164,7 @@
&lt;br&gt;&amp;nbsp;	void skipForward();
&lt;br&gt;&amp;nbsp;	void longSkipForward();
&lt;br&gt;&amp;nbsp;	void jumpToPosition();
&lt;br&gt;+	void setPosition(int position);
&lt;br&gt;&amp;nbsp;	void timeButtonClicked();
&lt;br&gt;&amp;nbsp;	void updateTimeButton();
&lt;br&gt;&amp;nbsp;	void updateCaption();
&lt;br&gt;@@ -144,6 +177,17 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	void checkScreenSaver();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+	void setDvbChannel(int number);
&lt;br&gt;+	void setDvbChannel(const QString &amp;name);
&lt;br&gt;+	void setDvbLastChannel();
&lt;br&gt;+	
&lt;br&gt;+	void fullScreen();
&lt;br&gt;+
&lt;br&gt;+	void delTrack(int position);
&lt;br&gt;+	void setLoop(bool loop);
&lt;br&gt;+	void setRandom(bool random);
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;private:
&lt;br&gt;&amp;nbsp;	void contextMenuEvent(QContextMenuEvent *event);
&lt;br&gt;&amp;nbsp;	void mouseDoubleClickEvent(QMouseEvent *);
&lt;br&gt;@@ -204,6 +248,8 @@
&lt;br&gt;&amp;nbsp;	KAction *jumpToPositionAction;
&lt;br&gt;&amp;nbsp;	QPushButton *timeButton;
&lt;br&gt;&amp;nbsp;	bool showElapsedTime;
&lt;br&gt;+	bool repeat;
&lt;br&gt;+	int inputNumber;
&lt;br&gt;&amp;nbsp;};
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#endif /* MEDIAWIDGET_H */
&lt;br&gt;diff -Naur ../kaffeine/src/playlist/playlistmodel.cpp ./src/playlist/playlistmodel.cpp
&lt;br&gt;--- ../kaffeine/src/playlist/playlistmodel.cpp	2009-11-24 23:27:03.000000000 +0100
&lt;br&gt;+++ ./src/playlist/playlistmodel.cpp	2009-11-24 23:27:04.000000000 +0100
&lt;br&gt;@@ -48,6 +48,7 @@
&lt;br&gt;&amp;nbsp;	QAbstractTableModel(parent), mediaWidget(mediaWidget_), repeat(false)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	setSupportedDragActions(Qt::MoveAction);
&lt;br&gt;+	mediaWidget-&amp;gt;setRepeat(false);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	connect(mediaWidget, SIGNAL(playlistPrevious()), this, SLOT(playPreviousTrack()));
&lt;br&gt;&amp;nbsp;	connect(mediaWidget, SIGNAL(playlistPlay()), this, SLOT(playCurrentTrack()));
&lt;br&gt;@@ -351,6 +352,7 @@
&lt;br&gt;&amp;nbsp;void PlaylistModel::repeatPlaylist(bool repeat_)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	repeat = repeat_;
&lt;br&gt;+	mediaWidget-&amp;gt;setRepeat(repeat);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;static bool playlistIndexLess(const PlaylistTrack &amp;x, const PlaylistTrack &amp;y)
&lt;br&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26504736&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/dbus-support-for-kaffeine-tp26128565p26504736.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26476166</id>
	<title>Re: dbus support for kaffeine</title>
	<published>2009-11-23T03:14:28Z</published>
	<updated>2009-11-23T03:14:28Z</updated>
	<author>
		<name>Pascal Pollet</name>
	</author>
	<content type="html">I forgot to add a check if the parameter is a single digit integer in 
&lt;br&gt;the MediaWidget::setNumber(int) function, here is the new patch, please 
&lt;br&gt;forget the other one...
&lt;br&gt;&lt;br&gt;ciao,
&lt;br&gt;Pascal
&lt;br&gt;&lt;br&gt;Pascal schrieb:
&lt;div class='shrinkable-quote'&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I now added the SetNumber(int) function to enter numbers with multiple 
&lt;br&gt;&amp;gt; digits, that was really easy, as the code to enter numbers with the 
&lt;br&gt;&amp;gt; keyboard was already there. I didn't notice it before because there is 
&lt;br&gt;&amp;gt; one problem left with this code: entering numbers with the keyboard 
&lt;br&gt;&amp;gt; has no effect if the DvbChannelView has the focus, in this case you 
&lt;br&gt;&amp;gt; have to click into the picture before to make it work. Number-key 
&lt;br&gt;&amp;gt; events in the DvbChannelView should maybe be redirected somehow to the 
&lt;br&gt;&amp;gt; MediaWidget class...
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I also removed some debugging code that was still present in my last 
&lt;br&gt;&amp;gt; patch, sorry...
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; The patch is against the actual svn trunk again (revision 1053111)
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; ciao,
&lt;br&gt;&amp;gt; Pascal
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Pascal schrieb:
&lt;br&gt;&amp;gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; ok, here is the actual state of things. The mpris methods are all 
&lt;br&gt;&amp;gt;&amp;gt; implemented, with a few stubs left: a few /TrackList methods still 
&lt;br&gt;&amp;gt;&amp;gt; need to be implemented, but I will try to do it soon. The /Player 
&lt;br&gt;&amp;gt;&amp;gt; Repeat() function is also a stub, because the playlist does not allow 
&lt;br&gt;&amp;gt;&amp;gt; to repeat a single track yet. Also the GetCaps () function is 
&lt;br&gt;&amp;gt;&amp;gt; incomplete.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; I put much methods into the /Player object which are not part of the 
&lt;br&gt;&amp;gt;&amp;gt; mpris specs, because it wouldn't make much sense to make a separate 
&lt;br&gt;&amp;gt;&amp;gt; object for them. I think it should be ok, but if you don't agree, 
&lt;br&gt;&amp;gt;&amp;gt; please tell me, it' not difficult to change...
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; I made a DVB/ object for dvb-related stuff and a Display/ object for 
&lt;br&gt;&amp;gt;&amp;gt; methods like toggleFullScreen, I'm not sure if &amp;quot;Display&amp;quot; is the best 
&lt;br&gt;&amp;gt;&amp;gt; name for that...
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; There is still a need for a method that allows to enter channel 
&lt;br&gt;&amp;gt;&amp;gt; numbers with more than one digit with a remote control (or with the 
&lt;br&gt;&amp;gt;&amp;gt; keyboard), I will try to do this in the next time, as for me it's the 
&lt;br&gt;&amp;gt;&amp;gt; most important feature which is still missing.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; I changed all dbus functions to begin with a capital letter, to be 
&lt;br&gt;&amp;gt;&amp;gt; consistent with the mpris methods.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; All this isn't thoroughly tested at all and rather crude, and there 
&lt;br&gt;&amp;gt;&amp;gt; should certainly be more error checking, but I think this is true for 
&lt;br&gt;&amp;gt;&amp;gt; almost all the rest of the app also, so it should be ok for the 
&lt;br&gt;&amp;gt;&amp;gt; beginning ;)
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; changing the channel works, but I didn't manage to have the selection
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; changed to the new channel in the DvbChannelView tree. I don't know 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; how to
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; get a valid QModelIndex that points to the correct DvbChannelModel. 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Please
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; look at the code and at my comments in DvbTab::setChannel(int 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; number). I
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; tried almost everything and thereby learned a lot about the model / 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; view
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; concept of Qt, but it didn't help me to find the solution... Maybe you
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; already know this probem Christoph, because there is the same issue 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; when
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; kaffeine gets started with the &amp;quot;--tv &amp;lt;channel&amp;gt;&amp;quot; flag: it simply calls
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; DvbTab::playChannel(const QString &amp;name), but it does not select 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; the channel
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; in the DvbChannelView. The problem is that afterwards, calls to
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; MediaWidget::previous() and next() have no effect, because the 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; currently
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; selected channel is not known. I hope that someone more clever than 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; me will
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; solve this issue ;)
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Yes, this one is trickier. Note that there exists a similar problem
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; e.g. with playPause(): you also need to update the ui state.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt; I now found a solution (although I don't know if it's the best), but 
&lt;br&gt;&amp;gt;&amp;gt; I don't recognize what should be updated when the playPause() method 
&lt;br&gt;&amp;gt;&amp;gt; is called, &amp;nbsp;you have a better overview for sure...
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; ciao,
&lt;br&gt;&amp;gt;&amp;gt; Pascal
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Christoph Pfister schrieb:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; 2009/11/6 Pascal Pollet &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26476166&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pascal@...&lt;/a&gt;&amp;gt;:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; &amp;nbsp;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; here is what I've done so far, I think it should add enough d-bus 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; to make
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; most users happy, including me :) Please look at it and tell me 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; what you
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; think of it...
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; It's a very good starting point. There exists a mediaplayer dbus
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; specification MPRIS [1], which I consider worth to implement (so that
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; we don't add yet another dbus interface for common functionality).
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; I've committed preliminary support to svn (the &amp;quot;root&amp;quot; object). Could
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; you please adapt your patch to that concept (i.e. add a tracklist and
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; player object; in case of need just method stubs)? I'm aware of the
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; fact that the actions defined in that specification don't 100% map
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Kaffeine's actions (e.g. Play() doing a rewind to the beginning of a
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; track), so you don't have to care about those details if you don't
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; want to do. I also know that not every mpris thing is possible
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; (especially the tracklist parts needs more work) and that there's not
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; a mpris thing for every action Kaffeine is able to perform (put them
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; in a separate object for now).
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; &amp;nbsp;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; There is one problem left, when selecting a new DVB-channel 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; directly by name
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; or by number, with the (new) functions:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; dvbTab::setChannel(const QString &amp;name)
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; and
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; DvbTab::setChannel(int number)
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; changing the channel works, but I didn't manage to have the selection
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; changed to the new channel in the DvbChannelView tree. I don't know 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; how to
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; get a valid QModelIndex that points to the correct DvbChannelModel. 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Please
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; look at the code and at my comments in DvbTab::setChannel(int 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; number). I
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; tried almost everything and thereby learned a lot about the model / 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; view
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; concept of Qt, but it didn't help me to find the solution... Maybe you
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; already know this probem Christoph, because there is the same issue 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; when
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; kaffeine gets started with the &amp;quot;--tv &amp;lt;channel&amp;gt;&amp;quot; flag: it simply calls
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; DvbTab::playChannel(const QString &amp;name), but it does not select 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; the channel
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; in the DvbChannelView. The problem is that afterwards, calls to
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; MediaWidget::previous() and next() have no effect, because the 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; currently
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; selected channel is not known. I hope that someone more clever than 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; me will
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; solve this issue ;)
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Yes, this one is trickier. Note that there exists a similar problem
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; e.g. with playPause(): you also need to update the ui state.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; &amp;nbsp;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; cheers,
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Pascal
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Thanks,
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Christoph
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; [1] &lt;a href=&quot;http://wiki.xmms2.xmms.se/wiki/MPRIS&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://wiki.xmms2.xmms.se/wiki/MPRIS&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;diff -Naur ../kaffeine/src/dbusobjects.cpp ./src/dbusobjects.cpp
&lt;br&gt;--- ../kaffeine/src/dbusobjects.cpp	2009-11-23 11:06:04.000000000 +0100
&lt;br&gt;+++ ./src/dbusobjects.cpp	2009-11-23 12:09:12.000000000 +0100
&lt;br&gt;@@ -23,6 +23,9 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;QDBusMetaType&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;KAboutData&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;KApplication&amp;gt;
&lt;br&gt;+#include &amp;lt;KUrl&amp;gt;
&lt;br&gt;+
&lt;br&gt;+#include &amp;quot;mediawidget.h&amp;quot;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;QDBusArgument &amp;operator&amp;lt;&amp;lt;(QDBusArgument &amp;argument, const MprisVersionStruct &amp;versionStruct)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;@@ -40,9 +43,27 @@
&lt;br&gt;&amp;nbsp;	return argument;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+QDBusArgument &amp;operator&amp;lt;&amp;lt;(QDBusArgument &amp;argument, const MprisStatusStruct &amp;statusStruct)
&lt;br&gt;+{
&lt;br&gt;+	argument.beginStructure();
&lt;br&gt;+	argument &amp;lt;&amp;lt; statusStruct.play &amp;lt;&amp;lt; statusStruct.random &amp;lt;&amp;lt; statusStruct.repeatTrack &amp;lt;&amp;lt; statusStruct.repeatAll;
&lt;br&gt;+	argument.endStructure();
&lt;br&gt;+	return argument;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+const QDBusArgument &amp;operator&amp;gt;&amp;gt;(const QDBusArgument &amp;argument, MprisStatusStruct &amp;statusStruct)
&lt;br&gt;+{
&lt;br&gt;+	argument.beginStructure();
&lt;br&gt;+	argument &amp;gt;&amp;gt; statusStruct.play &amp;gt;&amp;gt; statusStruct.random &amp;gt;&amp;gt; statusStruct.repeatTrack &amp;gt;&amp;gt; statusStruct.repeatAll;
&lt;br&gt;+	argument.endStructure();
&lt;br&gt;+	return argument;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;MprisRootObject::MprisRootObject(QObject *parent) : QObject(parent)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	 qDBusRegisterMetaType&amp;lt;MprisVersionStruct&amp;gt;();
&lt;br&gt;+	 qDBusRegisterMetaType&amp;lt;MprisStatusStruct&amp;gt;();
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;MprisRootObject::~MprisRootObject()
&lt;br&gt;@@ -67,3 +88,325 @@
&lt;br&gt;&amp;nbsp;	versionStruct.minor = 0;
&lt;br&gt;&amp;nbsp;	return versionStruct;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+MprisPlayerObject::MprisPlayerObject(MediaWidget *mediaWidget_): mediaWidget(mediaWidget_)
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+MprisPlayerObject::~MprisPlayerObject()
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Next()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;next();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Prev()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;previous();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::PlayPause()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;playPause();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Play()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;play();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Pause()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;pause();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisPlayerObject::VolumeGet()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getVolume();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::VolumeSet(int volume)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;changeVolume(volume);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::VolumeIncrease()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;increaseVolume();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::VolumeDecrease()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;decreaseVolume();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisPlayerObject::PositionGet()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getPosition();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::PositionSet(int position)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setPosition(position);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Repeat()
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+	//repeating a single track not implemented yet, only whole playlist
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisPlayerObject::GetCaps()
&lt;br&gt;+{
&lt;br&gt;+	int caps = NO_CAPS;
&lt;br&gt;+
&lt;br&gt;+	if ( mediaWidget-&amp;gt;hasMedia() ) 
&lt;br&gt;+	{
&lt;br&gt;+		if ( mediaWidget-&amp;gt;isPlaying() &amp;&amp; ! mediaWidget-&amp;gt;isPaused() )
&lt;br&gt;+		{
&lt;br&gt;+			caps |= CAN_PAUSE;
&lt;br&gt;+		}
&lt;br&gt;+		else 
&lt;br&gt;+		{
&lt;br&gt;+			caps |= CAN_PLAY;
&lt;br&gt;+		}
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	caps |= CAN_HAS_TRACKLIST;
&lt;br&gt;+
&lt;br&gt;+	//TODO: CAN_GO_NEXT &amp; CAN_GO_PREV &amp; CAN_PROVIDE_METADATA
&lt;br&gt;+
&lt;br&gt;+	return caps;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Stop()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;stop();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+MprisStatusStruct MprisPlayerObject::GetStatus()
&lt;br&gt;+{
&lt;br&gt;+	MprisStatusStruct statusStruct;
&lt;br&gt;+	if ( mediaWidget-&amp;gt;isPaused() )
&lt;br&gt;+	{
&lt;br&gt;+		statusStruct.play = 1;
&lt;br&gt;+	}
&lt;br&gt;+	else if ( mediaWidget-&amp;gt;isPlaying() )
&lt;br&gt;+	{
&lt;br&gt;+		statusStruct.play = 0;
&lt;br&gt;+	}
&lt;br&gt;+	else
&lt;br&gt;+	{
&lt;br&gt;+		statusStruct.play = 2;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	if ( mediaWidget-&amp;gt;isRepeat() )
&lt;br&gt;+	{
&lt;br&gt;+		statusStruct.repeatAll = 1;
&lt;br&gt;+	}
&lt;br&gt;+	else
&lt;br&gt;+	{
&lt;br&gt;+		statusStruct.repeatAll = 0;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	statusStruct.random = 0;
&lt;br&gt;+	statusStruct.repeatTrack = 0;
&lt;br&gt;+	
&lt;br&gt;+	return statusStruct;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+QVariantMap MprisPlayerObject::GetMetadata()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getMetadata();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Play(const QString &amp;url)
&lt;br&gt;+{
&lt;br&gt;+	KUrl kurl(url);
&lt;br&gt;+	if (kurl.isValid()) {
&lt;br&gt;+		mediaWidget-&amp;gt;play(kurl);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::PlayAudioCd()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;playAudioCd();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::PlayVideoCd()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;playVideoCd();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::PlayDvd()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;playDvd();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void &amp;nbsp;MprisPlayerObject::ChangeAudioChannel(int index)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;changeAudioChannel(index);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void &amp;nbsp;MprisPlayerObject::ChangeSubtitle(int index)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;changeSubtitle(index);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::ToggleMuted()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;toggleMuted();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::LongSkipBackward()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;longSkipBackward();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::SkipBackward()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;skipBackward();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::SkipForward()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;skipForward();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::LongSkipForward()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;longSkipForward();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::TimeButtonClicked()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;timeButtonClicked();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::UpdateTimeButton()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;updateTimeButton();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+MprisTrackListObject::MprisTrackListObject(MediaWidget *mediaWidget_): mediaWidget(mediaWidget_)
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+MprisTrackListObject::~MprisTrackListObject()
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+QVariantMap MprisTrackListObject::GetMetadata()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getMetadata();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisTrackListObject::GetCurrentTrack()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getCurrentTrack();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisTrackListObject::GetLength()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getLength();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisTrackListObject::AddTrack(QString track, bool play)
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;addTrack(track, play);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisTrackListObject::DelTrack(int position)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;delTrack(position);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisTrackListObject::SetLoop(bool loop)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setLoop(loop);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisTrackListObject::SetRandom(bool random)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setRandom(random);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+MprisDvbObject::MprisDvbObject(MediaWidget *mediaWidget_): mediaWidget(mediaWidget_)
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+MprisDvbObject::~MprisDvbObject()
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::SetDvbChannel(const QString &amp;name)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setDvbChannel(name);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::SetDvbChannelNumber(int number)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setDvbChannel(number);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::SetNumber(int number)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setNumber(number);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::SetDvbLastChannel()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setDvbLastChannel();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::StopDvb()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;stopDvb();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::ToggleInstantRecord()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;toggleInstantRecord();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::ToggleOsd()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;toggleOsd();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+MprisDisplayObject::MprisDisplayObject(MediaWidget *mediaWidget_): mediaWidget(mediaWidget_)
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+MprisDisplayObject::~MprisDisplayObject()
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+void MprisDisplayObject::ToggleFullScreen()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;fullScreen();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDisplayObject::AspectRatioAuto()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;aspectRatioAuto();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDisplayObject::AspectRatio4_3()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;aspectRatio4_3();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDisplayObject::AspectRatio16_9()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;aspectRatio16_9();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDisplayObject::AspectRatioWidget()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;aspectRatioWidget();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;diff -Naur ../kaffeine/src/dbusobjects.h ./src/dbusobjects.h
&lt;br&gt;--- ../kaffeine/src/dbusobjects.h	2009-11-23 11:06:04.000000000 +0100
&lt;br&gt;+++ ./src/dbusobjects.h	2009-11-23 12:09:12.000000000 +0100
&lt;br&gt;@@ -22,8 +22,12 @@
&lt;br&gt;&amp;nbsp;#define DBUSOBJECTS_H
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#include &amp;lt;QMetaType&amp;gt;
&lt;br&gt;+#include &amp;lt;QVariantMap&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;struct MprisVersionStruct;
&lt;br&gt;+struct MprisStatusStruct;
&lt;br&gt;+
&lt;br&gt;+class MediaWidget;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;class MprisRootObject : public QObject
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;@@ -39,6 +43,130 @@
&lt;br&gt;&amp;nbsp;	MprisVersionStruct MprisVersion();
&lt;br&gt;&amp;nbsp;};
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+
&lt;br&gt;+class MprisPlayerObject : public QObject
&lt;br&gt;+{
&lt;br&gt;+	Q_OBJECT
&lt;br&gt;+	Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.freedesktop.MediaPlayer&amp;quot;)
&lt;br&gt;+public:
&lt;br&gt;+	explicit MprisPlayerObject(MediaWidget *mediaWidget_);
&lt;br&gt;+	~MprisPlayerObject();
&lt;br&gt;+
&lt;br&gt;+public slots:
&lt;br&gt;+	void Next();
&lt;br&gt;+	void Prev();
&lt;br&gt;+	void Play();
&lt;br&gt;+	void Pause();
&lt;br&gt;+	void Stop();
&lt;br&gt;+	int &amp;nbsp;VolumeGet();
&lt;br&gt;+	void VolumeSet(int volume);
&lt;br&gt;+	int &amp;nbsp;PositionGet();
&lt;br&gt;+	void PositionSet(int position);
&lt;br&gt;+	void Repeat();
&lt;br&gt;+	MprisStatusStruct GetStatus();
&lt;br&gt;+	QVariantMap GetMetadata();
&lt;br&gt;+	int GetCaps();
&lt;br&gt;+
&lt;br&gt;+	// this functions are not part of the MPRIS specs
&lt;br&gt;+	void PlayPause();
&lt;br&gt;+	void VolumeIncrease();
&lt;br&gt;+	void VolumeDecrease();
&lt;br&gt;+	void Play(const QString &amp;url);
&lt;br&gt;+	void PlayAudioCd();
&lt;br&gt;+	void PlayVideoCd();
&lt;br&gt;+	void PlayDvd();
&lt;br&gt;+	void ChangeAudioChannel(int index);
&lt;br&gt;+	void ChangeSubtitle(int index);
&lt;br&gt;+	void ToggleMuted();
&lt;br&gt;+	void LongSkipBackward();
&lt;br&gt;+	void SkipBackward();
&lt;br&gt;+	void SkipForward();
&lt;br&gt;+	void LongSkipForward();
&lt;br&gt;+	void TimeButtonClicked();
&lt;br&gt;+	void UpdateTimeButton();
&lt;br&gt;+
&lt;br&gt;+signals:
&lt;br&gt;+	void CapsChange( int );
&lt;br&gt;+	void StatusChange( MprisStatusStruct );
&lt;br&gt;+	void TrackChange( QVariantMap );
&lt;br&gt;+
&lt;br&gt;+private:
&lt;br&gt;+	MediaWidget *mediaWidget;
&lt;br&gt;+
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+class MprisTrackListObject : public QObject
&lt;br&gt;+{
&lt;br&gt;+	Q_OBJECT
&lt;br&gt;+	Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.freedesktop.MediaPlayer&amp;quot;)
&lt;br&gt;+public:
&lt;br&gt;+	explicit MprisTrackListObject(MediaWidget *mediaWidget_);
&lt;br&gt;+	~MprisTrackListObject();
&lt;br&gt;+
&lt;br&gt;+public slots:
&lt;br&gt;+	QVariantMap GetMetadata();
&lt;br&gt;+	int GetCurrentTrack();
&lt;br&gt;+	int GetLength();
&lt;br&gt;+	int AddTrack(QString track, bool play);
&lt;br&gt;+	void DelTrack(int position);
&lt;br&gt;+	void SetLoop(bool loop);
&lt;br&gt;+	void SetRandom(bool random);
&lt;br&gt;+
&lt;br&gt;+signals:
&lt;br&gt;+	void TrackListChange(int);
&lt;br&gt;+
&lt;br&gt;+private:
&lt;br&gt;+	MediaWidget *mediaWidget;
&lt;br&gt;+
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+class MprisDvbObject : public QObject
&lt;br&gt;+{
&lt;br&gt;+	Q_OBJECT
&lt;br&gt;+	Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.freedesktop.MediaPlayer&amp;quot;)
&lt;br&gt;+public:
&lt;br&gt;+	explicit MprisDvbObject(MediaWidget *mediaWidget_);
&lt;br&gt;+	~MprisDvbObject();
&lt;br&gt;+
&lt;br&gt;+public slots:
&lt;br&gt;+	void SetDvbChannel(const QString &amp;name);
&lt;br&gt;+	void SetDvbChannelNumber(int number);
&lt;br&gt;+	void SetNumber(int number);
&lt;br&gt;+	void SetDvbLastChannel();
&lt;br&gt;+	void StopDvb();
&lt;br&gt;+	void ToggleInstantRecord();
&lt;br&gt;+	void ToggleOsd();
&lt;br&gt;+
&lt;br&gt;+private:
&lt;br&gt;+	MediaWidget *mediaWidget;
&lt;br&gt;+
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+class MprisDisplayObject : public QObject
&lt;br&gt;+{
&lt;br&gt;+	Q_OBJECT
&lt;br&gt;+	Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.freedesktop.MediaPlayer&amp;quot;)
&lt;br&gt;+public:
&lt;br&gt;+	explicit MprisDisplayObject(MediaWidget *mediaWidget_);
&lt;br&gt;+	~MprisDisplayObject();
&lt;br&gt;+
&lt;br&gt;+public slots:
&lt;br&gt;+	void AspectRatioAuto();
&lt;br&gt;+	void AspectRatio4_3();
&lt;br&gt;+	void AspectRatio16_9();
&lt;br&gt;+	void AspectRatioWidget();
&lt;br&gt;+	void ToggleFullScreen();
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+private:
&lt;br&gt;+	MediaWidget *mediaWidget;
&lt;br&gt;+
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;struct MprisVersionStruct
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	quint16 major;
&lt;br&gt;@@ -47,4 +175,30 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;Q_DECLARE_METATYPE(MprisVersionStruct)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+struct MprisStatusStruct
&lt;br&gt;+{
&lt;br&gt;+	quint16 play;
&lt;br&gt;+	quint16 random;
&lt;br&gt;+	quint16 repeatTrack;
&lt;br&gt;+	quint16 repeatAll;
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+Q_DECLARE_METATYPE(MprisStatusStruct)
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+* The bit values for the capabilities flags
&lt;br&gt;+*/
&lt;br&gt;+enum Cap {
&lt;br&gt;+	NO_CAPS			 &amp;nbsp; = 0,
&lt;br&gt;+	CAN_GO_NEXT		 &amp;nbsp; = 1 &amp;lt;&amp;lt; 0,
&lt;br&gt;+	CAN_GO_PREV		 &amp;nbsp; = 1 &amp;lt;&amp;lt; 1,
&lt;br&gt;+	CAN_PAUSE			 = 1 &amp;lt;&amp;lt; 2,
&lt;br&gt;+	CAN_PLAY			 &amp;nbsp;= 1 &amp;lt;&amp;lt; 3,
&lt;br&gt;+	CAN_SEEK			 &amp;nbsp;= 1 &amp;lt;&amp;lt; 4,
&lt;br&gt;+	CAN_PROVIDE_METADATA &amp;nbsp;= 1 &amp;lt;&amp;lt; 5,
&lt;br&gt;+	CAN_HAS_TRACKLIST	 = 1 &amp;lt;&amp;lt; 6,
&lt;br&gt;+	ALL_KNOWN_CAPS		= (1 &amp;lt;&amp;lt; 7) - 1
&lt;br&gt;+};
&lt;br&gt;+Q_DECLARE_FLAGS(Caps, Cap)
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;#endif /* DBUSOBJECTS_H */
&lt;br&gt;diff -Naur ../kaffeine/src/dvb/dvbtab.cpp ./src/dvb/dvbtab.cpp
&lt;br&gt;--- ../kaffeine/src/dvb/dvbtab.cpp	2009-11-23 11:06:03.000000000 +0100
&lt;br&gt;+++ ./src/dvb/dvbtab.cpp	2009-11-23 12:09:12.000000000 +0100
&lt;br&gt;@@ -117,6 +117,10 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	connect(mediaWidget, SIGNAL(previousDvbChannel()), this, SLOT(previousChannel()));
&lt;br&gt;&amp;nbsp;	connect(mediaWidget, SIGNAL(nextDvbChannel()), this, SLOT(nextChannel()));
&lt;br&gt;+	connect(mediaWidget, SIGNAL(changeDvbChannel(const QString&amp;)), this, SLOT(setChannel(const QString&amp;)));
&lt;br&gt;+	connect(mediaWidget, SIGNAL(changeDvbChannel(int)), this, SLOT(setChannel(int)));
&lt;br&gt;+	connect(mediaWidget, SIGNAL(dvbLastChannel()), this, SLOT(setLastChannel()));
&lt;br&gt;+	connect(mediaWidget, SIGNAL(toggleInstantRecord()), this, SLOT(toggleInstantRecord()));
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	connect(manager-&amp;gt;getRecordingManager(), SIGNAL(instantRecordingRemoved()),
&lt;br&gt;&amp;nbsp;		this, SLOT(instantRecordingRemoved()));
&lt;br&gt;@@ -144,7 +148,7 @@
&lt;br&gt;&amp;nbsp;	channelView-&amp;gt;setRootIsDecorated(false);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	if (!channelView-&amp;gt;header()-&amp;gt;restoreState(QByteArray::fromBase64(
&lt;br&gt;-	 &amp;nbsp; &amp;nbsp;KGlobal::config()-&amp;gt;group(&amp;quot;DVB&amp;quot;).readEntry(&amp;quot;ChannelViewState&amp;quot;, QByteArray())))) {
&lt;br&gt;+		KGlobal::config()-&amp;gt;group(&amp;quot;DVB&amp;quot;).readEntry(&amp;quot;ChannelViewState&amp;quot;, QByteArray())))) {
&lt;br&gt;&amp;nbsp;		channelView-&amp;gt;sortByColumn(0, Qt::AscendingOrder);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -210,6 +214,11 @@
&lt;br&gt;&amp;nbsp;	playChannel(manager-&amp;gt;getChannelModel()-&amp;gt;channelForName(name));
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+void DvbTab::playChannel(int number)
&lt;br&gt;+{
&lt;br&gt;+	playChannel(manager-&amp;gt;getChannelModel()-&amp;gt;channelForNumber(number));
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void DvbTab::playLastChannel()
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	playChannel(KGlobal::config()-&amp;gt;group(&amp;quot;DVB&amp;quot;).readEntry(&amp;quot;LastChannel&amp;quot;));
&lt;br&gt;@@ -244,6 +253,19 @@
&lt;br&gt;&amp;nbsp;	dialog.exec();
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+void DvbTab::toggleInstantRecord()
&lt;br&gt;+{
&lt;br&gt;+	if (instantRecordAction-&amp;gt;isChecked()) {
&lt;br&gt;+		instantRecordAction-&amp;gt;setChecked(false);
&lt;br&gt;+		instantRecord(false);
&lt;br&gt;+	}
&lt;br&gt;+	else {
&lt;br&gt;+		instantRecordAction-&amp;gt;setChecked(true);
&lt;br&gt;+		instantRecord(true);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void DvbTab::instantRecord(bool checked)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	if (checked) {
&lt;br&gt;@@ -351,4 +373,73 @@
&lt;br&gt;&amp;nbsp;	if (channel != NULL) {
&lt;br&gt;&amp;nbsp;		manager-&amp;gt;getLiveView()-&amp;gt;playChannel(channel);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;+
&lt;br&gt;+	QModelIndex index = channelView-&amp;gt;indexAt(QPoint(0,0));
&lt;br&gt;+
&lt;br&gt;+	if (!index.isValid()) {
&lt;br&gt;+		return;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	DvbChannelModel *channelModel = (DvbChannelModel*) index.model();
&lt;br&gt;+
&lt;br&gt;+	QModelIndexList list = channelModel-&amp;gt;match(channelModel-&amp;gt;index(0, 0), Qt::DisplayRole, channel-&amp;gt;name, 1, Qt::MatchExactly);
&lt;br&gt;+	QModelIndex index_new = list.value(0);
&lt;br&gt;+
&lt;br&gt;+	if (!index_new.isValid()) {
&lt;br&gt;+		return;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	channelView-&amp;gt;setCurrentIndex(index_new);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+void DvbTab::setChannel(const QString &amp;name)
&lt;br&gt;+{
&lt;br&gt;+	QModelIndex index = channelView-&amp;gt;indexAt(QPoint(0,0));
&lt;br&gt;+
&lt;br&gt;+	if (!index.isValid()) {
&lt;br&gt;+		return;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	DvbChannelModel *channelModel = (DvbChannelModel*) index.model();
&lt;br&gt;+
&lt;br&gt;+	QModelIndexList list = channelModel-&amp;gt;match(channelModel-&amp;gt;index(0, 0), Qt::DisplayRole, name, 1, Qt::MatchExactly);
&lt;br&gt;+	QModelIndex index_new = list.value(0);
&lt;br&gt;+
&lt;br&gt;+	if (!index_new.isValid()) {
&lt;br&gt;+		return;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	channelView-&amp;gt;setCurrentIndex(index_new);
&lt;br&gt;+
&lt;br&gt;+	playChannel(name);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DvbTab::setChannel(int number)
&lt;br&gt;+{
&lt;br&gt;+
&lt;br&gt;+	QModelIndex index = channelView-&amp;gt;indexAt(QPoint(0,0));
&lt;br&gt;+
&lt;br&gt;+	if (!index.isValid()) {
&lt;br&gt;+		return;
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	DvbChannelModel *channelModel = (DvbChannelModel*) index.model();
&lt;br&gt;+
&lt;br&gt;+	QModelIndexList list = channelModel-&amp;gt;match(channelModel-&amp;gt;index(0, 1), Qt::DisplayRole, number, 1, Qt::MatchExactly);
&lt;br&gt;+	QModelIndex index_new = list.value(0);
&lt;br&gt;+
&lt;br&gt;+	if (!index_new.isValid()) {
&lt;br&gt;+		return;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	channelView-&amp;gt;setCurrentIndex(index_new);
&lt;br&gt;+	playChannel(number);
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DvbTab::setLastChannel()
&lt;br&gt;+{
&lt;br&gt;+	playLastChannel();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;diff -Naur ../kaffeine/src/dvb/dvbtab.h ./src/dvb/dvbtab.h
&lt;br&gt;--- ../kaffeine/src/dvb/dvbtab.h	2009-11-23 11:06:02.000000000 +0100
&lt;br&gt;+++ ./src/dvb/dvbtab.h	2009-11-23 12:09:12.000000000 +0100
&lt;br&gt;@@ -38,11 +38,13 @@
&lt;br&gt;&amp;nbsp;class DvbTab : public TabBase
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	Q_OBJECT
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;public:
&lt;br&gt;&amp;nbsp;	DvbTab(KMenu *menu, KActionCollection *collection, MediaWidget *mediaWidget_);
&lt;br&gt;&amp;nbsp;	~DvbTab();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	void playChannel(const QString &amp;name);
&lt;br&gt;+	void playChannel(int number);
&lt;br&gt;&amp;nbsp;	void playLastChannel();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	void enableDvbDump();
&lt;br&gt;@@ -52,12 +54,16 @@
&lt;br&gt;&amp;nbsp;	void showEpgDialog();
&lt;br&gt;&amp;nbsp;	void showRecordingDialog();
&lt;br&gt;&amp;nbsp;	void instantRecord(bool checked);
&lt;br&gt;+	void toggleInstantRecord();
&lt;br&gt;&amp;nbsp;	void instantRecordingRemoved();
&lt;br&gt;&amp;nbsp;	void configureDvb();
&lt;br&gt;&amp;nbsp;	void playLive(const QModelIndex &amp;index);
&lt;br&gt;&amp;nbsp;	void previousChannel();
&lt;br&gt;&amp;nbsp;	void nextChannel();
&lt;br&gt;&amp;nbsp;	void cleanTimeShiftFiles();
&lt;br&gt;+	void setChannel(const QString &amp;name);
&lt;br&gt;+	void setChannel(int number);
&lt;br&gt;+	void setLastChannel();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;private:
&lt;br&gt;&amp;nbsp;	void activate();
&lt;br&gt;diff -Naur ../kaffeine/src/kaffeine.cpp ./src/kaffeine.cpp
&lt;br&gt;--- ../kaffeine/src/kaffeine.cpp	2009-11-23 11:06:04.000000000 +0100
&lt;br&gt;+++ ./src/kaffeine.cpp	2009-11-23 12:09:12.000000000 +0100
&lt;br&gt;@@ -327,6 +327,15 @@
&lt;br&gt;&amp;nbsp;	// initialize dbus objects
&lt;br&gt;&amp;nbsp;	QDBusConnection::sessionBus().registerObject(&amp;quot;/&amp;quot;, new MprisRootObject(this),
&lt;br&gt;&amp;nbsp;		QDBusConnection::ExportAllContents);
&lt;br&gt;+	QDBusConnection::sessionBus().registerObject(&amp;quot;/Player&amp;quot;, new MprisPlayerObject(mediaWidget),
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;QDBusConnection::ExportAllContents);
&lt;br&gt;+	QDBusConnection::sessionBus().registerObject(&amp;quot;/TrackList&amp;quot;, new MprisTrackListObject(mediaWidget),
&lt;br&gt;+		QDBusConnection::ExportAllContents);
&lt;br&gt;+	QDBusConnection::sessionBus().registerObject(&amp;quot;/DVB&amp;quot;, new MprisDvbObject(mediaWidget),
&lt;br&gt;+		QDBusConnection::ExportAllContents);
&lt;br&gt;+	QDBusConnection::sessionBus().registerObject(&amp;quot;/Display&amp;quot;, new MprisDisplayObject(mediaWidget),
&lt;br&gt;+		QDBusConnection::ExportAllContents);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	QDBusConnection::sessionBus().registerService(&amp;quot;org.mpris.kaffeine&amp;quot;);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	show();
&lt;br&gt;diff -Naur ../kaffeine/src/mediawidget.cpp ./src/mediawidget.cpp
&lt;br&gt;--- ../kaffeine/src/mediawidget.cpp	2009-11-23 11:06:02.000000000 +0100
&lt;br&gt;+++ ./src/mediawidget.cpp	2009-11-23 12:09:12.000000000 +0100
&lt;br&gt;@@ -374,6 +374,8 @@
&lt;br&gt;&amp;nbsp;	connect(timer, SIGNAL(timeout()), this, SLOT(checkScreenSaver()));
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	stateChanged(Phonon::StoppedState);
&lt;br&gt;+
&lt;br&gt;+	setRepeat(false);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;MediaWidget::~MediaWidget()
&lt;br&gt;@@ -543,6 +545,67 @@
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+bool MediaWidget::isPaused()
&lt;br&gt;+{
&lt;br&gt;+	if (playing &amp;&amp; mediaObject-&amp;gt;state() == Phonon::PausedState)
&lt;br&gt;+	{
&lt;br&gt;+		return true;
&lt;br&gt;+	}
&lt;br&gt;+	return false;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+// also returns true when paused
&lt;br&gt;+bool MediaWidget::isPlaying()
&lt;br&gt;+{
&lt;br&gt;+	return playing;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setRepeat(bool repeat_)
&lt;br&gt;+{
&lt;br&gt;+	repeat = repeat_;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+bool MediaWidget::isRepeat()
&lt;br&gt;+{
&lt;br&gt;+	return repeat;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+bool MediaWidget::hasMedia()
&lt;br&gt;+{
&lt;br&gt;+	if ( mediaObject-&amp;gt;currentSource().type() != Phonon::MediaSource::Invalid ) {
&lt;br&gt;+		return true;
&lt;br&gt;+	}
&lt;br&gt;+	else {
&lt;br&gt;+		return false;
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setDvbChannel(int number)
&lt;br&gt;+{
&lt;br&gt;+	if (dvbFeed != NULL) {
&lt;br&gt;+		emit changeDvbChannel(number);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setDvbChannel(const QString &amp;name)
&lt;br&gt;+{
&lt;br&gt;+	if (dvbFeed != NULL) {
&lt;br&gt;+		emit changeDvbChannel(name);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setDvbLastChannel()
&lt;br&gt;+{
&lt;br&gt;+	if (dvbFeed != NULL) {
&lt;br&gt;+		emit dvbLastChannel();
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::fullScreen()
&lt;br&gt;+{
&lt;br&gt;+	emit toggleFullScreen();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void MediaWidget::stateChanged(Phonon::State state)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	bool newPlaying = false;
&lt;br&gt;@@ -551,6 +614,7 @@
&lt;br&gt;&amp;nbsp;		case Phonon::BufferingState:
&lt;br&gt;&amp;nbsp;		case Phonon::PlayingState:
&lt;br&gt;&amp;nbsp;		case Phonon::PausedState:
&lt;br&gt;+			paused = true;
&lt;br&gt;&amp;nbsp;			newPlaying = true;
&lt;br&gt;&amp;nbsp;			break;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -655,6 +719,31 @@
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+void MediaWidget::playPause() {
&lt;br&gt;+	//if (actionPlayPause-&amp;gt;text() == textPlay) {
&lt;br&gt;+	if (isPaused()) {
&lt;br&gt;+		playPause(false);
&lt;br&gt;+	}
&lt;br&gt;+	else {
&lt;br&gt;+		playPause(true);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::play() {
&lt;br&gt;+	if (playing &amp;&amp; actionPlayPause-&amp;gt;text() == textPlay) {
&lt;br&gt;+		playPause(false);
&lt;br&gt;+	}
&lt;br&gt;+	else if (!playing) {
&lt;br&gt;+		emit playlistPlay();
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::pause() {
&lt;br&gt;+	if (playing &amp;&amp; actionPlayPause-&amp;gt;text() == textPause) {
&lt;br&gt;+		playPause(true);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void MediaWidget::stop()
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	mediaObject-&amp;gt;stop();
&lt;br&gt;@@ -726,6 +815,17 @@
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+int MediaWidget::getVolume()
&lt;br&gt;+{
&lt;br&gt;+	int volume = audioOutput-&amp;gt;volume() * 100;
&lt;br&gt;+
&lt;br&gt;+	if ( volume &amp;gt;= 0 &amp;&amp; volume &amp;lt;= 100 ) {
&lt;br&gt;+		return volume;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void MediaWidget::changeVolume(int volume)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	audioOutput-&amp;gt;setVolume(volume * qreal(0.01));
&lt;br&gt;@@ -915,6 +1015,16 @@
&lt;br&gt;&amp;nbsp;	mediaObject-&amp;gt;seek(mediaObject-&amp;gt;currentTime() + 1000 * longSkipDuration);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+void MediaWidget::setPosition(int position)
&lt;br&gt;+{
&lt;br&gt;+	mediaObject-&amp;gt;seek(position);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MediaWidget::getPosition()
&lt;br&gt;+{
&lt;br&gt;+	return mediaObject-&amp;gt;currentTime();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void MediaWidget::jumpToPosition()
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	JumpToPositionDialog dialog(QTime().addMSecs(mediaObject-&amp;gt;currentTime()), this);
&lt;br&gt;@@ -1150,3 +1260,64 @@
&lt;br&gt;&amp;nbsp;		subtitleBox-&amp;gt;setEnabled(false);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+QVariantMap MediaWidget::getMetadata()
&lt;br&gt;+{
&lt;br&gt;+	QVariantMap ret;
&lt;br&gt;+	QMultiMap&amp;lt;QString, QString&amp;gt; multiMap = mediaObject-&amp;gt;metaData();
&lt;br&gt;+	QMultiMap&amp;lt;QString, QString&amp;gt;::const_iterator i = multiMap.constBegin();
&lt;br&gt;+	
&lt;br&gt;+	while( i != multiMap.constEnd() )
&lt;br&gt;+	{
&lt;br&gt;+		ret[ i.key() ] = QVariant( i.value() );
&lt;br&gt;+		i++;
&lt;br&gt;+	}
&lt;br&gt;+	return ret;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int getNumberOfTracks()
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MediaWidget::getCurrentTrack()
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MediaWidget::getLength()
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MediaWidget::addTrack(QString track, bool play)
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::delTrack(int position)
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setLoop(bool loop)
&lt;br&gt;+{
&lt;br&gt;+	setRepeat(loop);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setRandom(bool random)
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setNumber(int number)
&lt;br&gt;+{
&lt;br&gt;+	if (number &amp;gt;= 0 &amp;&amp; number &amp;lt;= 9) {
&lt;br&gt;+		emit osdKeyPressed(number + Qt::Key_0);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;diff -Naur ../kaffeine/src/mediawidget.h ./src/mediawidget.h
&lt;br&gt;--- ../kaffeine/src/mediawidget.h	2009-11-23 11:06:03.000000000 +0100
&lt;br&gt;+++ ./src/mediawidget.h	2009-11-23 12:09:12.000000000 +0100
&lt;br&gt;@@ -48,9 +48,14 @@
&lt;br&gt;&amp;nbsp;class MediaWidget : public QWidget
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	Q_OBJECT
&lt;br&gt;+	friend class MprisPlayerObject;
&lt;br&gt;+	friend class MprisTrackListObject;
&lt;br&gt;+	friend class MprisDvbObject;
&lt;br&gt;+	friend class MprisDisplayObject;	
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;public:
&lt;br&gt;&amp;nbsp;	MediaWidget(KMenu *menu_, KAction *fullScreenAction, KToolBar *toolBar,
&lt;br&gt;-		 &amp;nbsp; &amp;nbsp;KActionCollection *collection, QWidget *parent);
&lt;br&gt;+			KActionCollection *collection, QWidget *parent);
&lt;br&gt;&amp;nbsp;	~MediaWidget();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	static QString extensionFilter(); // usable for KFileDialog::setFilter()
&lt;br&gt;@@ -78,6 +83,12 @@
&lt;br&gt;&amp;nbsp;	void setShortSkipDuration(int duration);
&lt;br&gt;&amp;nbsp;	void setLongSkipDuration(int duration);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+	void setRepeat(bool repeat_);
&lt;br&gt;+	bool isRepeat();
&lt;br&gt;+	bool hasMedia();
&lt;br&gt;+
&lt;br&gt;+	void setNumber(int number);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;public slots:
&lt;br&gt;&amp;nbsp;	void stop();
&lt;br&gt;&amp;nbsp;	void stopDvb();
&lt;br&gt;@@ -98,14 +109,35 @@
&lt;br&gt;&amp;nbsp;	void startDvbTimeShift();
&lt;br&gt;&amp;nbsp;	void changeDvbAudioChannel(int index);
&lt;br&gt;&amp;nbsp;	void changeDvbSubtitle(int index);
&lt;br&gt;+	void changeDvbChannel(int number);
&lt;br&gt;+	void changeDvbChannel(const QString &amp;name);
&lt;br&gt;&amp;nbsp;	void dvbStopped();
&lt;br&gt;&amp;nbsp;	void osdKeyPressed(int key);
&lt;br&gt;+	void toggleOsd();
&lt;br&gt;+
&lt;br&gt;+	void dvbLastChannel();
&lt;br&gt;+	void toggleInstantRecord();
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;private slots:
&lt;br&gt;+	bool isPlaying();
&lt;br&gt;+	bool isPaused();
&lt;br&gt;+
&lt;br&gt;+	int getPosition();
&lt;br&gt;+	int getCurrentTrack();
&lt;br&gt;+	int getLength();
&lt;br&gt;+	int addTrack(QString track, bool play);
&lt;br&gt;+	int getVolume();
&lt;br&gt;+
&lt;br&gt;+	QVariantMap getMetadata();
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	void stateChanged(Phonon::State state);
&lt;br&gt;&amp;nbsp;	void playbackFinished();
&lt;br&gt;&amp;nbsp;	void previous();
&lt;br&gt;&amp;nbsp;	void playPause(bool paused);
&lt;br&gt;+	void playPause();
&lt;br&gt;+	void play();
&lt;br&gt;+	void pause();
&lt;br&gt;&amp;nbsp;	void next();
&lt;br&gt;&amp;nbsp;	void changeAudioChannel(int index);
&lt;br&gt;&amp;nbsp;	void changeSubtitle(int index);
&lt;br&gt;@@ -132,6 +164,7 @@
&lt;br&gt;&amp;nbsp;	void skipForward();
&lt;br&gt;&amp;nbsp;	void longSkipForward();
&lt;br&gt;&amp;nbsp;	void jumpToPosition();
&lt;br&gt;+	void setPosition(int position);
&lt;br&gt;&amp;nbsp;	void timeButtonClicked();
&lt;br&gt;&amp;nbsp;	void updateTimeButton();
&lt;br&gt;&amp;nbsp;	void updateCaption();
&lt;br&gt;@@ -144,6 +177,17 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	void checkScreenSaver();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+	void setDvbChannel(int number);
&lt;br&gt;+	void setDvbChannel(const QString &amp;name);
&lt;br&gt;+	void setDvbLastChannel();
&lt;br&gt;+	
&lt;br&gt;+	void fullScreen();
&lt;br&gt;+
&lt;br&gt;+	void delTrack(int position);
&lt;br&gt;+	void setLoop(bool loop);
&lt;br&gt;+	void setRandom(bool random);
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;private:
&lt;br&gt;&amp;nbsp;	void contextMenuEvent(QContextMenuEvent *event);
&lt;br&gt;&amp;nbsp;	void mouseDoubleClickEvent(QMouseEvent *);
&lt;br&gt;@@ -164,6 +208,7 @@
&lt;br&gt;&amp;nbsp;	Phonon::MediaController *mediaController;
&lt;br&gt;&amp;nbsp;	DvbFeed *dvbFeed;
&lt;br&gt;&amp;nbsp;	bool playing;
&lt;br&gt;+	bool paused;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	KAction *actionPrevious;
&lt;br&gt;&amp;nbsp;	KAction *actionPlayPause;
&lt;br&gt;@@ -204,6 +249,8 @@
&lt;br&gt;&amp;nbsp;	KAction *jumpToPositionAction;
&lt;br&gt;&amp;nbsp;	QPushButton *timeButton;
&lt;br&gt;&amp;nbsp;	bool showElapsedTime;
&lt;br&gt;+	bool repeat;
&lt;br&gt;+	int inputNumber;
&lt;br&gt;&amp;nbsp;};
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#endif /* MEDIAWIDGET_H */
&lt;br&gt;diff -Naur ../kaffeine/src/playlist/playlistmodel.cpp ./src/playlist/playlistmodel.cpp
&lt;br&gt;--- ../kaffeine/src/playlist/playlistmodel.cpp	2009-11-23 11:06:03.000000000 +0100
&lt;br&gt;+++ ./src/playlist/playlistmodel.cpp	2009-11-23 12:09:12.000000000 +0100
&lt;br&gt;@@ -48,6 +48,7 @@
&lt;br&gt;&amp;nbsp;	QAbstractTableModel(parent), mediaWidget(mediaWidget_), repeat(false)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	setSupportedDragActions(Qt::MoveAction);
&lt;br&gt;+	mediaWidget-&amp;gt;setRepeat(false);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	connect(mediaWidget, SIGNAL(playlistPrevious()), this, SLOT(playPreviousTrack()));
&lt;br&gt;&amp;nbsp;	connect(mediaWidget, SIGNAL(playlistPlay()), this, SLOT(playCurrentTrack()));
&lt;br&gt;@@ -351,6 +352,7 @@
&lt;br&gt;&amp;nbsp;void PlaylistModel::repeatPlaylist(bool repeat_)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	repeat = repeat_;
&lt;br&gt;+	mediaWidget-&amp;gt;setRepeat(repeat);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;static bool playlistIndexLess(const PlaylistTrack &amp;x, const PlaylistTrack &amp;y)
&lt;br&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26476166&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/dbus-support-for-kaffeine-tp26128565p26476166.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26475780</id>
	<title>Re: dbus support for kaffeine</title>
	<published>2009-11-23T02:43:09Z</published>
	<updated>2009-11-23T02:43:09Z</updated>
	<author>
		<name>Pascal Pollet</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;&lt;br&gt;I now added the SetNumber(int) function to enter numbers with multiple 
&lt;br&gt;digits, that was really easy, as the code to enter numbers with the 
&lt;br&gt;keyboard was already there. I didn't notice it before because there is 
&lt;br&gt;one problem left with this code: entering numbers with the keyboard has 
&lt;br&gt;no effect if the DvbChannelView has the focus, in this case you have to 
&lt;br&gt;click into the picture before to make it work. Number-key events in the 
&lt;br&gt;DvbChannelView should maybe be redirected somehow to the MediaWidget 
&lt;br&gt;class...
&lt;br&gt;&lt;br&gt;I also removed some debugging code that was still present in my last 
&lt;br&gt;patch, sorry...
&lt;br&gt;&lt;br&gt;The patch is against the actual svn trunk again (revision 1053111)
&lt;br&gt;&lt;br&gt;ciao,
&lt;br&gt;Pascal
&lt;br&gt;&lt;br&gt;&lt;br&gt;Pascal schrieb:
&lt;div class='shrinkable-quote'&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; ok, here is the actual state of things. The mpris methods are all 
&lt;br&gt;&amp;gt; implemented, with a few stubs left: a few /TrackList methods still 
&lt;br&gt;&amp;gt; need to be implemented, but I will try to do it soon. The /Player 
&lt;br&gt;&amp;gt; Repeat() function is also a stub, because the playlist does not allow 
&lt;br&gt;&amp;gt; to repeat a single track yet. Also the GetCaps () function is incomplete.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I put much methods into the /Player object which are not part of the 
&lt;br&gt;&amp;gt; mpris specs, because it wouldn't make much sense to make a separate 
&lt;br&gt;&amp;gt; object for them. I think it should be ok, but if you don't agree, 
&lt;br&gt;&amp;gt; please tell me, it' not difficult to change...
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I made a DVB/ object for dvb-related stuff and a Display/ object for 
&lt;br&gt;&amp;gt; methods like toggleFullScreen, I'm not sure if &amp;quot;Display&amp;quot; is the best 
&lt;br&gt;&amp;gt; name for that...
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; There is still a need for a method that allows to enter channel 
&lt;br&gt;&amp;gt; numbers with more than one digit with a remote control (or with the 
&lt;br&gt;&amp;gt; keyboard), I will try to do this in the next time, as for me it's the 
&lt;br&gt;&amp;gt; most important feature which is still missing.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I changed all dbus functions to begin with a capital letter, to be 
&lt;br&gt;&amp;gt; consistent with the mpris methods.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; All this isn't thoroughly tested at all and rather crude, and there 
&lt;br&gt;&amp;gt; should certainly be more error checking, but I think this is true for 
&lt;br&gt;&amp;gt; almost all the rest of the app also, so it should be ok for the 
&lt;br&gt;&amp;gt; beginning ;)
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; changing the channel works, but I didn't manage to have the selection
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; changed to the new channel in the DvbChannelView tree. I don't know 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; how to
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; get a valid QModelIndex that points to the correct DvbChannelModel. 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Please
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; look at the code and at my comments in DvbTab::setChannel(int 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; number). I
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; tried almost everything and thereby learned a lot about the model / 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; view
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; concept of Qt, but it didn't help me to find the solution... Maybe you
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; already know this probem Christoph, because there is the same issue 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; when
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; kaffeine gets started with the &amp;quot;--tv &amp;lt;channel&amp;gt;&amp;quot; flag: it simply calls
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; DvbTab::playChannel(const QString &amp;name), but it does not select the 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; channel
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; in the DvbChannelView. The problem is that afterwards, calls to
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; MediaWidget::previous() and next() have no effect, because the 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; currently
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; selected channel is not known. I hope that someone more clever than 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; me will
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; solve this issue ;)
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Yes, this one is trickier. Note that there exists a similar problem
&lt;br&gt;&amp;gt;&amp;gt; e.g. with playPause(): you also need to update the ui state.
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; 
&lt;br&gt;&amp;gt; I now found a solution (although I don't know if it's the best), but I 
&lt;br&gt;&amp;gt; don't recognize what should be updated when the playPause() method is 
&lt;br&gt;&amp;gt; called, &amp;nbsp;you have a better overview for sure...
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; ciao,
&lt;br&gt;&amp;gt; Pascal
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Christoph Pfister schrieb:
&lt;br&gt;&amp;gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; 2009/11/6 Pascal Pollet &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26475780&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pascal@...&lt;/a&gt;&amp;gt;:
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; here is what I've done so far, I think it should add enough d-bus to 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; make
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; most users happy, including me :) Please look at it and tell me what 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; you
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; think of it...
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; It's a very good starting point. There exists a mediaplayer dbus
&lt;br&gt;&amp;gt;&amp;gt; specification MPRIS [1], which I consider worth to implement (so that
&lt;br&gt;&amp;gt;&amp;gt; we don't add yet another dbus interface for common functionality).
&lt;br&gt;&amp;gt;&amp;gt; I've committed preliminary support to svn (the &amp;quot;root&amp;quot; object). Could
&lt;br&gt;&amp;gt;&amp;gt; you please adapt your patch to that concept (i.e. add a tracklist and
&lt;br&gt;&amp;gt;&amp;gt; player object; in case of need just method stubs)? I'm aware of the
&lt;br&gt;&amp;gt;&amp;gt; fact that the actions defined in that specification don't 100% map
&lt;br&gt;&amp;gt;&amp;gt; Kaffeine's actions (e.g. Play() doing a rewind to the beginning of a
&lt;br&gt;&amp;gt;&amp;gt; track), so you don't have to care about those details if you don't
&lt;br&gt;&amp;gt;&amp;gt; want to do. I also know that not every mpris thing is possible
&lt;br&gt;&amp;gt;&amp;gt; (especially the tracklist parts needs more work) and that there's not
&lt;br&gt;&amp;gt;&amp;gt; a mpris thing for every action Kaffeine is able to perform (put them
&lt;br&gt;&amp;gt;&amp;gt; in a separate object for now).
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; There is one problem left, when selecting a new DVB-channel directly 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; by name
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; or by number, with the (new) functions:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; dvbTab::setChannel(const QString &amp;name)
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; and
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; DvbTab::setChannel(int number)
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; changing the channel works, but I didn't manage to have the selection
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; changed to the new channel in the DvbChannelView tree. I don't know 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; how to
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; get a valid QModelIndex that points to the correct DvbChannelModel. 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Please
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; look at the code and at my comments in DvbTab::setChannel(int 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; number). I
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; tried almost everything and thereby learned a lot about the model / 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; view
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; concept of Qt, but it didn't help me to find the solution... Maybe you
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; already know this probem Christoph, because there is the same issue 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; when
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; kaffeine gets started with the &amp;quot;--tv &amp;lt;channel&amp;gt;&amp;quot; flag: it simply calls
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; DvbTab::playChannel(const QString &amp;name), but it does not select the 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; channel
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; in the DvbChannelView. The problem is that afterwards, calls to
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; MediaWidget::previous() and next() have no effect, because the 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; currently
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; selected channel is not known. I hope that someone more clever than 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; me will
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; solve this issue ;)
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Yes, this one is trickier. Note that there exists a similar problem
&lt;br&gt;&amp;gt;&amp;gt; e.g. with playPause(): you also need to update the ui state.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; cheers,
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Pascal
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Thanks,
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Christoph
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; [1] &lt;a href=&quot;http://wiki.xmms2.xmms.se/wiki/MPRIS&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://wiki.xmms2.xmms.se/wiki/MPRIS&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; 
&lt;br&gt;&amp;gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;diff -Naur ../kaffeine/src/dbusobjects.cpp ./src/dbusobjects.cpp
&lt;br&gt;--- ../kaffeine/src/dbusobjects.cpp	2009-11-23 11:06:04.000000000 +0100
&lt;br&gt;+++ ./src/dbusobjects.cpp	2009-11-23 11:18:25.000000000 +0100
&lt;br&gt;@@ -23,6 +23,9 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;QDBusMetaType&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;KAboutData&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;KApplication&amp;gt;
&lt;br&gt;+#include &amp;lt;KUrl&amp;gt;
&lt;br&gt;+
&lt;br&gt;+#include &amp;quot;mediawidget.h&amp;quot;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;QDBusArgument &amp;operator&amp;lt;&amp;lt;(QDBusArgument &amp;argument, const MprisVersionStruct &amp;versionStruct)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;@@ -40,9 +43,27 @@
&lt;br&gt;&amp;nbsp;	return argument;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+QDBusArgument &amp;operator&amp;lt;&amp;lt;(QDBusArgument &amp;argument, const MprisStatusStruct &amp;statusStruct)
&lt;br&gt;+{
&lt;br&gt;+	argument.beginStructure();
&lt;br&gt;+	argument &amp;lt;&amp;lt; statusStruct.play &amp;lt;&amp;lt; statusStruct.random &amp;lt;&amp;lt; statusStruct.repeatTrack &amp;lt;&amp;lt; statusStruct.repeatAll;
&lt;br&gt;+	argument.endStructure();
&lt;br&gt;+	return argument;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+const QDBusArgument &amp;operator&amp;gt;&amp;gt;(const QDBusArgument &amp;argument, MprisStatusStruct &amp;statusStruct)
&lt;br&gt;+{
&lt;br&gt;+	argument.beginStructure();
&lt;br&gt;+	argument &amp;gt;&amp;gt; statusStruct.play &amp;gt;&amp;gt; statusStruct.random &amp;gt;&amp;gt; statusStruct.repeatTrack &amp;gt;&amp;gt; statusStruct.repeatAll;
&lt;br&gt;+	argument.endStructure();
&lt;br&gt;+	return argument;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;MprisRootObject::MprisRootObject(QObject *parent) : QObject(parent)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	 qDBusRegisterMetaType&amp;lt;MprisVersionStruct&amp;gt;();
&lt;br&gt;+	 qDBusRegisterMetaType&amp;lt;MprisStatusStruct&amp;gt;();
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;MprisRootObject::~MprisRootObject()
&lt;br&gt;@@ -67,3 +88,325 @@
&lt;br&gt;&amp;nbsp;	versionStruct.minor = 0;
&lt;br&gt;&amp;nbsp;	return versionStruct;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+MprisPlayerObject::MprisPlayerObject(MediaWidget *mediaWidget_): mediaWidget(mediaWidget_)
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+MprisPlayerObject::~MprisPlayerObject()
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Next()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;next();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Prev()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;previous();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::PlayPause()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;playPause();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Play()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;play();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Pause()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;pause();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisPlayerObject::VolumeGet()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getVolume();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::VolumeSet(int volume)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;changeVolume(volume);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::VolumeIncrease()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;increaseVolume();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::VolumeDecrease()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;decreaseVolume();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisPlayerObject::PositionGet()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getPosition();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::PositionSet(int position)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setPosition(position);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Repeat()
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+	//repeating a single track not implemented yet, only whole playlist
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisPlayerObject::GetCaps()
&lt;br&gt;+{
&lt;br&gt;+	int caps = NO_CAPS;
&lt;br&gt;+
&lt;br&gt;+	if ( mediaWidget-&amp;gt;hasMedia() ) 
&lt;br&gt;+	{
&lt;br&gt;+		if ( mediaWidget-&amp;gt;isPlaying() &amp;&amp; ! mediaWidget-&amp;gt;isPaused() )
&lt;br&gt;+		{
&lt;br&gt;+			caps |= CAN_PAUSE;
&lt;br&gt;+		}
&lt;br&gt;+		else 
&lt;br&gt;+		{
&lt;br&gt;+			caps |= CAN_PLAY;
&lt;br&gt;+		}
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	caps |= CAN_HAS_TRACKLIST;
&lt;br&gt;+
&lt;br&gt;+	//TODO: CAN_GO_NEXT &amp; CAN_GO_PREV &amp; CAN_PROVIDE_METADATA
&lt;br&gt;+
&lt;br&gt;+	return caps;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Stop()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;stop();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+MprisStatusStruct MprisPlayerObject::GetStatus()
&lt;br&gt;+{
&lt;br&gt;+	MprisStatusStruct statusStruct;
&lt;br&gt;+	if ( mediaWidget-&amp;gt;isPaused() )
&lt;br&gt;+	{
&lt;br&gt;+		statusStruct.play = 1;
&lt;br&gt;+	}
&lt;br&gt;+	else if ( mediaWidget-&amp;gt;isPlaying() )
&lt;br&gt;+	{
&lt;br&gt;+		statusStruct.play = 0;
&lt;br&gt;+	}
&lt;br&gt;+	else
&lt;br&gt;+	{
&lt;br&gt;+		statusStruct.play = 2;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	if ( mediaWidget-&amp;gt;isRepeat() )
&lt;br&gt;+	{
&lt;br&gt;+		statusStruct.repeatAll = 1;
&lt;br&gt;+	}
&lt;br&gt;+	else
&lt;br&gt;+	{
&lt;br&gt;+		statusStruct.repeatAll = 0;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	statusStruct.random = 0;
&lt;br&gt;+	statusStruct.repeatTrack = 0;
&lt;br&gt;+	
&lt;br&gt;+	return statusStruct;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+QVariantMap MprisPlayerObject::GetMetadata()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getMetadata();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Play(const QString &amp;url)
&lt;br&gt;+{
&lt;br&gt;+	KUrl kurl(url);
&lt;br&gt;+	if (kurl.isValid()) {
&lt;br&gt;+		mediaWidget-&amp;gt;play(kurl);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::PlayAudioCd()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;playAudioCd();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::PlayVideoCd()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;playVideoCd();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::PlayDvd()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;playDvd();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void &amp;nbsp;MprisPlayerObject::ChangeAudioChannel(int index)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;changeAudioChannel(index);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void &amp;nbsp;MprisPlayerObject::ChangeSubtitle(int index)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;changeSubtitle(index);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::ToggleMuted()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;toggleMuted();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::LongSkipBackward()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;longSkipBackward();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::SkipBackward()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;skipBackward();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::SkipForward()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;skipForward();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::LongSkipForward()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;longSkipForward();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::TimeButtonClicked()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;timeButtonClicked();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::UpdateTimeButton()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;updateTimeButton();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+MprisTrackListObject::MprisTrackListObject(MediaWidget *mediaWidget_): mediaWidget(mediaWidget_)
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+MprisTrackListObject::~MprisTrackListObject()
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+QVariantMap MprisTrackListObject::GetMetadata()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getMetadata();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisTrackListObject::GetCurrentTrack()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getCurrentTrack();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisTrackListObject::GetLength()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getLength();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisTrackListObject::AddTrack(QString track, bool play)
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;addTrack(track, play);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisTrackListObject::DelTrack(int position)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;delTrack(position);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisTrackListObject::SetLoop(bool loop)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setLoop(loop);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisTrackListObject::SetRandom(bool random)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setRandom(random);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+MprisDvbObject::MprisDvbObject(MediaWidget *mediaWidget_): mediaWidget(mediaWidget_)
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+MprisDvbObject::~MprisDvbObject()
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::SetDvbChannel(const QString &amp;name)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setDvbChannel(name);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::SetDvbChannelNumber(int number)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setDvbChannel(number);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::SetNumber(int number)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setNumber(number);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::SetDvbLastChannel()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setDvbLastChannel();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::StopDvb()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;stopDvb();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::ToggleInstantRecord()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;toggleInstantRecord();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::ToggleOsd()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;toggleOsd();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+MprisDisplayObject::MprisDisplayObject(MediaWidget *mediaWidget_): mediaWidget(mediaWidget_)
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+MprisDisplayObject::~MprisDisplayObject()
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+void MprisDisplayObject::ToggleFullScreen()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;fullScreen();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDisplayObject::AspectRatioAuto()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;aspectRatioAuto();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDisplayObject::AspectRatio4_3()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;aspectRatio4_3();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDisplayObject::AspectRatio16_9()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;aspectRatio16_9();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDisplayObject::AspectRatioWidget()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;aspectRatioWidget();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;diff -Naur ../kaffeine/src/dbusobjects.h ./src/dbusobjects.h
&lt;br&gt;--- ../kaffeine/src/dbusobjects.h	2009-11-23 11:06:04.000000000 +0100
&lt;br&gt;+++ ./src/dbusobjects.h	2009-11-23 11:18:25.000000000 +0100
&lt;br&gt;@@ -22,8 +22,12 @@
&lt;br&gt;&amp;nbsp;#define DBUSOBJECTS_H
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#include &amp;lt;QMetaType&amp;gt;
&lt;br&gt;+#include &amp;lt;QVariantMap&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;struct MprisVersionStruct;
&lt;br&gt;+struct MprisStatusStruct;
&lt;br&gt;+
&lt;br&gt;+class MediaWidget;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;class MprisRootObject : public QObject
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;@@ -39,6 +43,130 @@
&lt;br&gt;&amp;nbsp;	MprisVersionStruct MprisVersion();
&lt;br&gt;&amp;nbsp;};
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+
&lt;br&gt;+class MprisPlayerObject : public QObject
&lt;br&gt;+{
&lt;br&gt;+	Q_OBJECT
&lt;br&gt;+	Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.freedesktop.MediaPlayer&amp;quot;)
&lt;br&gt;+public:
&lt;br&gt;+	explicit MprisPlayerObject(MediaWidget *mediaWidget_);
&lt;br&gt;+	~MprisPlayerObject();
&lt;br&gt;+
&lt;br&gt;+public slots:
&lt;br&gt;+	void Next();
&lt;br&gt;+	void Prev();
&lt;br&gt;+	void Play();
&lt;br&gt;+	void Pause();
&lt;br&gt;+	void Stop();
&lt;br&gt;+	int &amp;nbsp;VolumeGet();
&lt;br&gt;+	void VolumeSet(int volume);
&lt;br&gt;+	int &amp;nbsp;PositionGet();
&lt;br&gt;+	void PositionSet(int position);
&lt;br&gt;+	void Repeat();
&lt;br&gt;+	MprisStatusStruct GetStatus();
&lt;br&gt;+	QVariantMap GetMetadata();
&lt;br&gt;+	int GetCaps();
&lt;br&gt;+
&lt;br&gt;+	// this functions are not part of the MPRIS specs
&lt;br&gt;+	void PlayPause();
&lt;br&gt;+	void VolumeIncrease();
&lt;br&gt;+	void VolumeDecrease();
&lt;br&gt;+	void Play(const QString &amp;url);
&lt;br&gt;+	void PlayAudioCd();
&lt;br&gt;+	void PlayVideoCd();
&lt;br&gt;+	void PlayDvd();
&lt;br&gt;+	void ChangeAudioChannel(int index);
&lt;br&gt;+	void ChangeSubtitle(int index);
&lt;br&gt;+	void ToggleMuted();
&lt;br&gt;+	void LongSkipBackward();
&lt;br&gt;+	void SkipBackward();
&lt;br&gt;+	void SkipForward();
&lt;br&gt;+	void LongSkipForward();
&lt;br&gt;+	void TimeButtonClicked();
&lt;br&gt;+	void UpdateTimeButton();
&lt;br&gt;+
&lt;br&gt;+signals:
&lt;br&gt;+	void CapsChange( int );
&lt;br&gt;+	void StatusChange( MprisStatusStruct );
&lt;br&gt;+	void TrackChange( QVariantMap );
&lt;br&gt;+
&lt;br&gt;+private:
&lt;br&gt;+	MediaWidget *mediaWidget;
&lt;br&gt;+
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+class MprisTrackListObject : public QObject
&lt;br&gt;+{
&lt;br&gt;+	Q_OBJECT
&lt;br&gt;+	Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.freedesktop.MediaPlayer&amp;quot;)
&lt;br&gt;+public:
&lt;br&gt;+	explicit MprisTrackListObject(MediaWidget *mediaWidget_);
&lt;br&gt;+	~MprisTrackListObject();
&lt;br&gt;+
&lt;br&gt;+public slots:
&lt;br&gt;+	QVariantMap GetMetadata();
&lt;br&gt;+	int GetCurrentTrack();
&lt;br&gt;+	int GetLength();
&lt;br&gt;+	int AddTrack(QString track, bool play);
&lt;br&gt;+	void DelTrack(int position);
&lt;br&gt;+	void SetLoop(bool loop);
&lt;br&gt;+	void SetRandom(bool random);
&lt;br&gt;+
&lt;br&gt;+signals:
&lt;br&gt;+	void TrackListChange(int);
&lt;br&gt;+
&lt;br&gt;+private:
&lt;br&gt;+	MediaWidget *mediaWidget;
&lt;br&gt;+
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+class MprisDvbObject : public QObject
&lt;br&gt;+{
&lt;br&gt;+	Q_OBJECT
&lt;br&gt;+	Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.freedesktop.MediaPlayer&amp;quot;)
&lt;br&gt;+public:
&lt;br&gt;+	explicit MprisDvbObject(MediaWidget *mediaWidget_);
&lt;br&gt;+	~MprisDvbObject();
&lt;br&gt;+
&lt;br&gt;+public slots:
&lt;br&gt;+	void SetDvbChannel(const QString &amp;name);
&lt;br&gt;+	void SetDvbChannelNumber(int number);
&lt;br&gt;+	void SetNumber(int number);
&lt;br&gt;+	void SetDvbLastChannel();
&lt;br&gt;+	void StopDvb();
&lt;br&gt;+	void ToggleInstantRecord();
&lt;br&gt;+	void ToggleOsd();
&lt;br&gt;+
&lt;br&gt;+private:
&lt;br&gt;+	MediaWidget *mediaWidget;
&lt;br&gt;+
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+class MprisDisplayObject : public QObject
&lt;br&gt;+{
&lt;br&gt;+	Q_OBJECT
&lt;br&gt;+	Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.freedesktop.MediaPlayer&amp;quot;)
&lt;br&gt;+public:
&lt;br&gt;+	explicit MprisDisplayObject(MediaWidget *mediaWidget_);
&lt;br&gt;+	~MprisDisplayObject();
&lt;br&gt;+
&lt;br&gt;+public slots:
&lt;br&gt;+	void AspectRatioAuto();
&lt;br&gt;+	void AspectRatio4_3();
&lt;br&gt;+	void AspectRatio16_9();
&lt;br&gt;+	void AspectRatioWidget();
&lt;br&gt;+	void ToggleFullScreen();
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+private:
&lt;br&gt;+	MediaWidget *mediaWidget;
&lt;br&gt;+
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;struct MprisVersionStruct
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	quint16 major;
&lt;br&gt;@@ -47,4 +175,30 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;Q_DECLARE_METATYPE(MprisVersionStruct)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+struct MprisStatusStruct
&lt;br&gt;+{
&lt;br&gt;+	quint16 play;
&lt;br&gt;+	quint16 random;
&lt;br&gt;+	quint16 repeatTrack;
&lt;br&gt;+	quint16 repeatAll;
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+Q_DECLARE_METATYPE(MprisStatusStruct)
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+* The bit values for the capabilities flags
&lt;br&gt;+*/
&lt;br&gt;+enum Cap {
&lt;br&gt;+	NO_CAPS			 &amp;nbsp; = 0,
&lt;br&gt;+	CAN_GO_NEXT		 &amp;nbsp; = 1 &amp;lt;&amp;lt; 0,
&lt;br&gt;+	CAN_GO_PREV		 &amp;nbsp; = 1 &amp;lt;&amp;lt; 1,
&lt;br&gt;+	CAN_PAUSE			 = 1 &amp;lt;&amp;lt; 2,
&lt;br&gt;+	CAN_PLAY			 &amp;nbsp;= 1 &amp;lt;&amp;lt; 3,
&lt;br&gt;+	CAN_SEEK			 &amp;nbsp;= 1 &amp;lt;&amp;lt; 4,
&lt;br&gt;+	CAN_PROVIDE_METADATA &amp;nbsp;= 1 &amp;lt;&amp;lt; 5,
&lt;br&gt;+	CAN_HAS_TRACKLIST	 = 1 &amp;lt;&amp;lt; 6,
&lt;br&gt;+	ALL_KNOWN_CAPS		= (1 &amp;lt;&amp;lt; 7) - 1
&lt;br&gt;+};
&lt;br&gt;+Q_DECLARE_FLAGS(Caps, Cap)
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;#endif /* DBUSOBJECTS_H */
&lt;br&gt;diff -Naur ../kaffeine/src/dvb/dvbtab.cpp ./src/dvb/dvbtab.cpp
&lt;br&gt;--- ../kaffeine/src/dvb/dvbtab.cpp	2009-11-23 11:06:03.000000000 +0100
&lt;br&gt;+++ ./src/dvb/dvbtab.cpp	2009-11-23 11:18:25.000000000 +0100
&lt;br&gt;@@ -117,6 +117,10 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	connect(mediaWidget, SIGNAL(previousDvbChannel()), this, SLOT(previousChannel()));
&lt;br&gt;&amp;nbsp;	connect(mediaWidget, SIGNAL(nextDvbChannel()), this, SLOT(nextChannel()));
&lt;br&gt;+	connect(mediaWidget, SIGNAL(changeDvbChannel(const QString&amp;)), this, SLOT(setChannel(const QString&amp;)));
&lt;br&gt;+	connect(mediaWidget, SIGNAL(changeDvbChannel(int)), this, SLOT(setChannel(int)));
&lt;br&gt;+	connect(mediaWidget, SIGNAL(dvbLastChannel()), this, SLOT(setLastChannel()));
&lt;br&gt;+	connect(mediaWidget, SIGNAL(toggleInstantRecord()), this, SLOT(toggleInstantRecord()));
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	connect(manager-&amp;gt;getRecordingManager(), SIGNAL(instantRecordingRemoved()),
&lt;br&gt;&amp;nbsp;		this, SLOT(instantRecordingRemoved()));
&lt;br&gt;@@ -144,7 +148,7 @@
&lt;br&gt;&amp;nbsp;	channelView-&amp;gt;setRootIsDecorated(false);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	if (!channelView-&amp;gt;header()-&amp;gt;restoreState(QByteArray::fromBase64(
&lt;br&gt;-	 &amp;nbsp; &amp;nbsp;KGlobal::config()-&amp;gt;group(&amp;quot;DVB&amp;quot;).readEntry(&amp;quot;ChannelViewState&amp;quot;, QByteArray())))) {
&lt;br&gt;+		KGlobal::config()-&amp;gt;group(&amp;quot;DVB&amp;quot;).readEntry(&amp;quot;ChannelViewState&amp;quot;, QByteArray())))) {
&lt;br&gt;&amp;nbsp;		channelView-&amp;gt;sortByColumn(0, Qt::AscendingOrder);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -210,6 +214,11 @@
&lt;br&gt;&amp;nbsp;	playChannel(manager-&amp;gt;getChannelModel()-&amp;gt;channelForName(name));
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+void DvbTab::playChannel(int number)
&lt;br&gt;+{
&lt;br&gt;+	playChannel(manager-&amp;gt;getChannelModel()-&amp;gt;channelForNumber(number));
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void DvbTab::playLastChannel()
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	playChannel(KGlobal::config()-&amp;gt;group(&amp;quot;DVB&amp;quot;).readEntry(&amp;quot;LastChannel&amp;quot;));
&lt;br&gt;@@ -244,6 +253,19 @@
&lt;br&gt;&amp;nbsp;	dialog.exec();
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+void DvbTab::toggleInstantRecord()
&lt;br&gt;+{
&lt;br&gt;+	if (instantRecordAction-&amp;gt;isChecked()) {
&lt;br&gt;+		instantRecordAction-&amp;gt;setChecked(false);
&lt;br&gt;+		instantRecord(false);
&lt;br&gt;+	}
&lt;br&gt;+	else {
&lt;br&gt;+		instantRecordAction-&amp;gt;setChecked(true);
&lt;br&gt;+		instantRecord(true);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void DvbTab::instantRecord(bool checked)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	if (checked) {
&lt;br&gt;@@ -351,4 +373,73 @@
&lt;br&gt;&amp;nbsp;	if (channel != NULL) {
&lt;br&gt;&amp;nbsp;		manager-&amp;gt;getLiveView()-&amp;gt;playChannel(channel);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;+
&lt;br&gt;+	QModelIndex index = channelView-&amp;gt;indexAt(QPoint(0,0));
&lt;br&gt;+
&lt;br&gt;+	if (!index.isValid()) {
&lt;br&gt;+		return;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	DvbChannelModel *channelModel = (DvbChannelModel*) index.model();
&lt;br&gt;+
&lt;br&gt;+	QModelIndexList list = channelModel-&amp;gt;match(channelModel-&amp;gt;index(0, 0), Qt::DisplayRole, channel-&amp;gt;name, 1, Qt::MatchExactly);
&lt;br&gt;+	QModelIndex index_new = list.value(0);
&lt;br&gt;+
&lt;br&gt;+	if (!index_new.isValid()) {
&lt;br&gt;+		return;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	channelView-&amp;gt;setCurrentIndex(index_new);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+void DvbTab::setChannel(const QString &amp;name)
&lt;br&gt;+{
&lt;br&gt;+	QModelIndex index = channelView-&amp;gt;indexAt(QPoint(0,0));
&lt;br&gt;+
&lt;br&gt;+	if (!index.isValid()) {
&lt;br&gt;+		return;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	DvbChannelModel *channelModel = (DvbChannelModel*) index.model();
&lt;br&gt;+
&lt;br&gt;+	QModelIndexList list = channelModel-&amp;gt;match(channelModel-&amp;gt;index(0, 0), Qt::DisplayRole, name, 1, Qt::MatchExactly);
&lt;br&gt;+	QModelIndex index_new = list.value(0);
&lt;br&gt;+
&lt;br&gt;+	if (!index_new.isValid()) {
&lt;br&gt;+		return;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	channelView-&amp;gt;setCurrentIndex(index_new);
&lt;br&gt;+
&lt;br&gt;+	playChannel(name);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DvbTab::setChannel(int number)
&lt;br&gt;+{
&lt;br&gt;+
&lt;br&gt;+	QModelIndex index = channelView-&amp;gt;indexAt(QPoint(0,0));
&lt;br&gt;+
&lt;br&gt;+	if (!index.isValid()) {
&lt;br&gt;+		return;
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	DvbChannelModel *channelModel = (DvbChannelModel*) index.model();
&lt;br&gt;+
&lt;br&gt;+	QModelIndexList list = channelModel-&amp;gt;match(channelModel-&amp;gt;index(0, 1), Qt::DisplayRole, number, 1, Qt::MatchExactly);
&lt;br&gt;+	QModelIndex index_new = list.value(0);
&lt;br&gt;+
&lt;br&gt;+	if (!index_new.isValid()) {
&lt;br&gt;+		return;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	channelView-&amp;gt;setCurrentIndex(index_new);
&lt;br&gt;+	playChannel(number);
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DvbTab::setLastChannel()
&lt;br&gt;+{
&lt;br&gt;+	playLastChannel();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;diff -Naur ../kaffeine/src/dvb/dvbtab.h ./src/dvb/dvbtab.h
&lt;br&gt;--- ../kaffeine/src/dvb/dvbtab.h	2009-11-23 11:06:02.000000000 +0100
&lt;br&gt;+++ ./src/dvb/dvbtab.h	2009-11-23 11:18:24.000000000 +0100
&lt;br&gt;@@ -38,11 +38,13 @@
&lt;br&gt;&amp;nbsp;class DvbTab : public TabBase
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	Q_OBJECT
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;public:
&lt;br&gt;&amp;nbsp;	DvbTab(KMenu *menu, KActionCollection *collection, MediaWidget *mediaWidget_);
&lt;br&gt;&amp;nbsp;	~DvbTab();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	void playChannel(const QString &amp;name);
&lt;br&gt;+	void playChannel(int number);
&lt;br&gt;&amp;nbsp;	void playLastChannel();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	void enableDvbDump();
&lt;br&gt;@@ -52,12 +54,16 @@
&lt;br&gt;&amp;nbsp;	void showEpgDialog();
&lt;br&gt;&amp;nbsp;	void showRecordingDialog();
&lt;br&gt;&amp;nbsp;	void instantRecord(bool checked);
&lt;br&gt;+	void toggleInstantRecord();
&lt;br&gt;&amp;nbsp;	void instantRecordingRemoved();
&lt;br&gt;&amp;nbsp;	void configureDvb();
&lt;br&gt;&amp;nbsp;	void playLive(const QModelIndex &amp;index);
&lt;br&gt;&amp;nbsp;	void previousChannel();
&lt;br&gt;&amp;nbsp;	void nextChannel();
&lt;br&gt;&amp;nbsp;	void cleanTimeShiftFiles();
&lt;br&gt;+	void setChannel(const QString &amp;name);
&lt;br&gt;+	void setChannel(int number);
&lt;br&gt;+	void setLastChannel();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;private:
&lt;br&gt;&amp;nbsp;	void activate();
&lt;br&gt;diff -Naur ../kaffeine/src/kaffeine.cpp ./src/kaffeine.cpp
&lt;br&gt;--- ../kaffeine/src/kaffeine.cpp	2009-11-23 11:06:04.000000000 +0100
&lt;br&gt;+++ ./src/kaffeine.cpp	2009-11-23 11:18:25.000000000 +0100
&lt;br&gt;@@ -327,6 +327,15 @@
&lt;br&gt;&amp;nbsp;	// initialize dbus objects
&lt;br&gt;&amp;nbsp;	QDBusConnection::sessionBus().registerObject(&amp;quot;/&amp;quot;, new MprisRootObject(this),
&lt;br&gt;&amp;nbsp;		QDBusConnection::ExportAllContents);
&lt;br&gt;+	QDBusConnection::sessionBus().registerObject(&amp;quot;/Player&amp;quot;, new MprisPlayerObject(mediaWidget),
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;QDBusConnection::ExportAllContents);
&lt;br&gt;+	QDBusConnection::sessionBus().registerObject(&amp;quot;/TrackList&amp;quot;, new MprisTrackListObject(mediaWidget),
&lt;br&gt;+		QDBusConnection::ExportAllContents);
&lt;br&gt;+	QDBusConnection::sessionBus().registerObject(&amp;quot;/DVB&amp;quot;, new MprisDvbObject(mediaWidget),
&lt;br&gt;+		QDBusConnection::ExportAllContents);
&lt;br&gt;+	QDBusConnection::sessionBus().registerObject(&amp;quot;/Display&amp;quot;, new MprisDisplayObject(mediaWidget),
&lt;br&gt;+		QDBusConnection::ExportAllContents);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	QDBusConnection::sessionBus().registerService(&amp;quot;org.mpris.kaffeine&amp;quot;);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	show();
&lt;br&gt;diff -Naur ../kaffeine/src/mediawidget.cpp ./src/mediawidget.cpp
&lt;br&gt;--- ../kaffeine/src/mediawidget.cpp	2009-11-23 11:06:02.000000000 +0100
&lt;br&gt;+++ ./src/mediawidget.cpp	2009-11-23 11:18:24.000000000 +0100
&lt;br&gt;@@ -374,6 +374,8 @@
&lt;br&gt;&amp;nbsp;	connect(timer, SIGNAL(timeout()), this, SLOT(checkScreenSaver()));
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	stateChanged(Phonon::StoppedState);
&lt;br&gt;+
&lt;br&gt;+	setRepeat(false);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;MediaWidget::~MediaWidget()
&lt;br&gt;@@ -543,6 +545,67 @@
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+bool MediaWidget::isPaused()
&lt;br&gt;+{
&lt;br&gt;+	if (playing &amp;&amp; mediaObject-&amp;gt;state() == Phonon::PausedState)
&lt;br&gt;+	{
&lt;br&gt;+		return true;
&lt;br&gt;+	}
&lt;br&gt;+	return false;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+// also returns true when paused
&lt;br&gt;+bool MediaWidget::isPlaying()
&lt;br&gt;+{
&lt;br&gt;+	return playing;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setRepeat(bool repeat_)
&lt;br&gt;+{
&lt;br&gt;+	repeat = repeat_;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+bool MediaWidget::isRepeat()
&lt;br&gt;+{
&lt;br&gt;+	return repeat;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+bool MediaWidget::hasMedia()
&lt;br&gt;+{
&lt;br&gt;+	if ( mediaObject-&amp;gt;currentSource().type() != Phonon::MediaSource::Invalid ) {
&lt;br&gt;+		return true;
&lt;br&gt;+	}
&lt;br&gt;+	else {
&lt;br&gt;+		return false;
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setDvbChannel(int number)
&lt;br&gt;+{
&lt;br&gt;+	if (dvbFeed != NULL) {
&lt;br&gt;+		emit changeDvbChannel(number);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setDvbChannel(const QString &amp;name)
&lt;br&gt;+{
&lt;br&gt;+	if (dvbFeed != NULL) {
&lt;br&gt;+		emit changeDvbChannel(name);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setDvbLastChannel()
&lt;br&gt;+{
&lt;br&gt;+	if (dvbFeed != NULL) {
&lt;br&gt;+		emit dvbLastChannel();
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::fullScreen()
&lt;br&gt;+{
&lt;br&gt;+	emit toggleFullScreen();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void MediaWidget::stateChanged(Phonon::State state)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	bool newPlaying = false;
&lt;br&gt;@@ -551,6 +614,7 @@
&lt;br&gt;&amp;nbsp;		case Phonon::BufferingState:
&lt;br&gt;&amp;nbsp;		case Phonon::PlayingState:
&lt;br&gt;&amp;nbsp;		case Phonon::PausedState:
&lt;br&gt;+			paused = true;
&lt;br&gt;&amp;nbsp;			newPlaying = true;
&lt;br&gt;&amp;nbsp;			break;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -655,6 +719,31 @@
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+void MediaWidget::playPause() {
&lt;br&gt;+	//if (actionPlayPause-&amp;gt;text() == textPlay) {
&lt;br&gt;+	if (isPaused()) {
&lt;br&gt;+		playPause(false);
&lt;br&gt;+	}
&lt;br&gt;+	else {
&lt;br&gt;+		playPause(true);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::play() {
&lt;br&gt;+	if (playing &amp;&amp; actionPlayPause-&amp;gt;text() == textPlay) {
&lt;br&gt;+		playPause(false);
&lt;br&gt;+	}
&lt;br&gt;+	else if (!playing) {
&lt;br&gt;+		emit playlistPlay();
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::pause() {
&lt;br&gt;+	if (playing &amp;&amp; actionPlayPause-&amp;gt;text() == textPause) {
&lt;br&gt;+		playPause(true);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void MediaWidget::stop()
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	mediaObject-&amp;gt;stop();
&lt;br&gt;@@ -726,6 +815,17 @@
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+int MediaWidget::getVolume()
&lt;br&gt;+{
&lt;br&gt;+	int volume = audioOutput-&amp;gt;volume() * 100;
&lt;br&gt;+
&lt;br&gt;+	if ( volume &amp;gt;= 0 &amp;&amp; volume &amp;lt;= 100 ) {
&lt;br&gt;+		return volume;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void MediaWidget::changeVolume(int volume)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	audioOutput-&amp;gt;setVolume(volume * qreal(0.01));
&lt;br&gt;@@ -915,6 +1015,16 @@
&lt;br&gt;&amp;nbsp;	mediaObject-&amp;gt;seek(mediaObject-&amp;gt;currentTime() + 1000 * longSkipDuration);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+void MediaWidget::setPosition(int position)
&lt;br&gt;+{
&lt;br&gt;+	mediaObject-&amp;gt;seek(position);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MediaWidget::getPosition()
&lt;br&gt;+{
&lt;br&gt;+	return mediaObject-&amp;gt;currentTime();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void MediaWidget::jumpToPosition()
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	JumpToPositionDialog dialog(QTime().addMSecs(mediaObject-&amp;gt;currentTime()), this);
&lt;br&gt;@@ -1150,3 +1260,62 @@
&lt;br&gt;&amp;nbsp;		subtitleBox-&amp;gt;setEnabled(false);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+QVariantMap MediaWidget::getMetadata()
&lt;br&gt;+{
&lt;br&gt;+	QVariantMap ret;
&lt;br&gt;+	QMultiMap&amp;lt;QString, QString&amp;gt; multiMap = mediaObject-&amp;gt;metaData();
&lt;br&gt;+	QMultiMap&amp;lt;QString, QString&amp;gt;::const_iterator i = multiMap.constBegin();
&lt;br&gt;+	
&lt;br&gt;+	while( i != multiMap.constEnd() )
&lt;br&gt;+	{
&lt;br&gt;+		ret[ i.key() ] = QVariant( i.value() );
&lt;br&gt;+		i++;
&lt;br&gt;+	}
&lt;br&gt;+	return ret;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int getNumberOfTracks()
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MediaWidget::getCurrentTrack()
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MediaWidget::getLength()
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MediaWidget::addTrack(QString track, bool play)
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::delTrack(int position)
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setLoop(bool loop)
&lt;br&gt;+{
&lt;br&gt;+	setRepeat(loop);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setRandom(bool random)
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setNumber(int number)
&lt;br&gt;+{
&lt;br&gt;+	emit osdKeyPressed(number + Qt::Key_0);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;diff -Naur ../kaffeine/src/mediawidget.h ./src/mediawidget.h
&lt;br&gt;--- ../kaffeine/src/mediawidget.h	2009-11-23 11:06:03.000000000 +0100
&lt;br&gt;+++ ./src/mediawidget.h	2009-11-23 11:18:25.000000000 +0100
&lt;br&gt;@@ -48,9 +48,14 @@
&lt;br&gt;&amp;nbsp;class MediaWidget : public QWidget
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	Q_OBJECT
&lt;br&gt;+	friend class MprisPlayerObject;
&lt;br&gt;+	friend class MprisTrackListObject;
&lt;br&gt;+	friend class MprisDvbObject;
&lt;br&gt;+	friend class MprisDisplayObject;	
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;public:
&lt;br&gt;&amp;nbsp;	MediaWidget(KMenu *menu_, KAction *fullScreenAction, KToolBar *toolBar,
&lt;br&gt;-		 &amp;nbsp; &amp;nbsp;KActionCollection *collection, QWidget *parent);
&lt;br&gt;+			KActionCollection *collection, QWidget *parent);
&lt;br&gt;&amp;nbsp;	~MediaWidget();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	static QString extensionFilter(); // usable for KFileDialog::setFilter()
&lt;br&gt;@@ -78,6 +83,12 @@
&lt;br&gt;&amp;nbsp;	void setShortSkipDuration(int duration);
&lt;br&gt;&amp;nbsp;	void setLongSkipDuration(int duration);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+	void setRepeat(bool repeat_);
&lt;br&gt;+	bool isRepeat();
&lt;br&gt;+	bool hasMedia();
&lt;br&gt;+
&lt;br&gt;+	void setNumber(int number);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;public slots:
&lt;br&gt;&amp;nbsp;	void stop();
&lt;br&gt;&amp;nbsp;	void stopDvb();
&lt;br&gt;@@ -98,14 +109,35 @@
&lt;br&gt;&amp;nbsp;	void startDvbTimeShift();
&lt;br&gt;&amp;nbsp;	void changeDvbAudioChannel(int index);
&lt;br&gt;&amp;nbsp;	void changeDvbSubtitle(int index);
&lt;br&gt;+	void changeDvbChannel(int number);
&lt;br&gt;+	void changeDvbChannel(const QString &amp;name);
&lt;br&gt;&amp;nbsp;	void dvbStopped();
&lt;br&gt;&amp;nbsp;	void osdKeyPressed(int key);
&lt;br&gt;+	void toggleOsd();
&lt;br&gt;+
&lt;br&gt;+	void dvbLastChannel();
&lt;br&gt;+	void toggleInstantRecord();
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;private slots:
&lt;br&gt;+	bool isPlaying();
&lt;br&gt;+	bool isPaused();
&lt;br&gt;+
&lt;br&gt;+	int getPosition();
&lt;br&gt;+	int getCurrentTrack();
&lt;br&gt;+	int getLength();
&lt;br&gt;+	int addTrack(QString track, bool play);
&lt;br&gt;+	int getVolume();
&lt;br&gt;+
&lt;br&gt;+	QVariantMap getMetadata();
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	void stateChanged(Phonon::State state);
&lt;br&gt;&amp;nbsp;	void playbackFinished();
&lt;br&gt;&amp;nbsp;	void previous();
&lt;br&gt;&amp;nbsp;	void playPause(bool paused);
&lt;br&gt;+	void playPause();
&lt;br&gt;+	void play();
&lt;br&gt;+	void pause();
&lt;br&gt;&amp;nbsp;	void next();
&lt;br&gt;&amp;nbsp;	void changeAudioChannel(int index);
&lt;br&gt;&amp;nbsp;	void changeSubtitle(int index);
&lt;br&gt;@@ -132,6 +164,7 @@
&lt;br&gt;&amp;nbsp;	void skipForward();
&lt;br&gt;&amp;nbsp;	void longSkipForward();
&lt;br&gt;&amp;nbsp;	void jumpToPosition();
&lt;br&gt;+	void setPosition(int position);
&lt;br&gt;&amp;nbsp;	void timeButtonClicked();
&lt;br&gt;&amp;nbsp;	void updateTimeButton();
&lt;br&gt;&amp;nbsp;	void updateCaption();
&lt;br&gt;@@ -144,6 +177,17 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	void checkScreenSaver();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+	void setDvbChannel(int number);
&lt;br&gt;+	void setDvbChannel(const QString &amp;name);
&lt;br&gt;+	void setDvbLastChannel();
&lt;br&gt;+	
&lt;br&gt;+	void fullScreen();
&lt;br&gt;+
&lt;br&gt;+	void delTrack(int position);
&lt;br&gt;+	void setLoop(bool loop);
&lt;br&gt;+	void setRandom(bool random);
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;private:
&lt;br&gt;&amp;nbsp;	void contextMenuEvent(QContextMenuEvent *event);
&lt;br&gt;&amp;nbsp;	void mouseDoubleClickEvent(QMouseEvent *);
&lt;br&gt;@@ -164,6 +208,7 @@
&lt;br&gt;&amp;nbsp;	Phonon::MediaController *mediaController;
&lt;br&gt;&amp;nbsp;	DvbFeed *dvbFeed;
&lt;br&gt;&amp;nbsp;	bool playing;
&lt;br&gt;+	bool paused;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	KAction *actionPrevious;
&lt;br&gt;&amp;nbsp;	KAction *actionPlayPause;
&lt;br&gt;@@ -204,6 +249,8 @@
&lt;br&gt;&amp;nbsp;	KAction *jumpToPositionAction;
&lt;br&gt;&amp;nbsp;	QPushButton *timeButton;
&lt;br&gt;&amp;nbsp;	bool showElapsedTime;
&lt;br&gt;+	bool repeat;
&lt;br&gt;+	int inputNumber;
&lt;br&gt;&amp;nbsp;};
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#endif /* MEDIAWIDGET_H */
&lt;br&gt;diff -Naur ../kaffeine/src/playlist/playlistmodel.cpp ./src/playlist/playlistmodel.cpp
&lt;br&gt;--- ../kaffeine/src/playlist/playlistmodel.cpp	2009-11-23 11:06:03.000000000 +0100
&lt;br&gt;+++ ./src/playlist/playlistmodel.cpp	2009-11-23 11:18:25.000000000 +0100
&lt;br&gt;@@ -48,6 +48,7 @@
&lt;br&gt;&amp;nbsp;	QAbstractTableModel(parent), mediaWidget(mediaWidget_), repeat(false)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	setSupportedDragActions(Qt::MoveAction);
&lt;br&gt;+	mediaWidget-&amp;gt;setRepeat(false);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	connect(mediaWidget, SIGNAL(playlistPrevious()), this, SLOT(playPreviousTrack()));
&lt;br&gt;&amp;nbsp;	connect(mediaWidget, SIGNAL(playlistPlay()), this, SLOT(playCurrentTrack()));
&lt;br&gt;@@ -351,6 +352,7 @@
&lt;br&gt;&amp;nbsp;void PlaylistModel::repeatPlaylist(bool repeat_)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	repeat = repeat_;
&lt;br&gt;+	mediaWidget-&amp;gt;setRepeat(repeat);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;static bool playlistIndexLess(const PlaylistTrack &amp;x, const PlaylistTrack &amp;y)
&lt;br&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26475780&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/dbus-support-for-kaffeine-tp26128565p26475780.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26461092</id>
	<title>Re: dbus support for kaffeine</title>
	<published>2009-11-21T14:31:26Z</published>
	<updated>2009-11-21T14:31:26Z</updated>
	<author>
		<name>Pascal Pollet</name>
	</author>
	<content type="html">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;meta content=&quot;text/html;charset=UTF-8&quot; http-equiv=&quot;Content-Type&quot;&gt;
  &lt;title&gt;&lt;/title&gt;
&lt;/head&gt;
&lt;body bgcolor=&quot;#ffffff&quot; text=&quot;#000000&quot;&gt;
Hi,&lt;br&gt;
&lt;br&gt;
ok, here is the actual state of things. The mpris methods are all
implemented, with a few stubs left: a few /TrackList methods still need
to be implemented, but I will try to do it soon. The /Player Repeat()
function is also a stub, because the playlist does not allow to repeat
a single track yet. Also the GetCaps () function is incomplete. &lt;br&gt;
&lt;br&gt;
I put much methods into the /Player object which are not part of the
mpris specs, because it wouldn't make much sense to make a separate
object for them. I think it should be ok, but if you don't agree,
please tell me, it' not difficult to change...&lt;br&gt;
&lt;br&gt;
I made a DVB/ object for dvb-related stuff and a Display/ object for
methods like toggleFullScreen, I'm not sure if &quot;Display&quot; is the best
name for that...&lt;br&gt;
&lt;br&gt;
There is still a need for a method that allows to enter channel numbers
with more than one digit with a remote control (or with the keyboard),
I will try to do this in the next time, as for me it's the most
important feature which is still missing.&lt;br&gt;
&lt;br&gt;
I changed all dbus functions to begin with a capital letter, to be
consistent with the mpris methods.&lt;br&gt;
&lt;br&gt;
All this isn't thoroughly tested at all and rather crude, and there
should certainly be more error checking, but I think this is true for
almost all the rest of the app also, so it should be ok for the
beginning ;) &lt;br&gt;
&lt;br&gt;
&lt;blockquote type=&quot;cite&quot;&gt;
  &lt;blockquote type=&quot;cite&quot;&gt;
    &lt;pre wrap=&quot;&quot;&gt;changing the channel works, but I didn't manage to have the selection
changed to the new channel in the DvbChannelView tree. I don't know how to
get a valid QModelIndex that points to the correct DvbChannelModel. Please
look at the code and at my comments in DvbTab::setChannel(int number). I
tried almost everything and thereby learned a lot about the model / view
concept of Qt, but it didn't help me to find the solution... Maybe you
already know this probem Christoph, because there is the same issue when
kaffeine gets started with the &quot;--tv &amp;lt;channel&amp;gt;&quot; flag: it simply calls
DvbTab::playChannel(const QString &amp;amp;name), but it does not select the channel
in the DvbChannelView. The problem is that afterwards, calls to
MediaWidget::previous() and next() have no effect, because the currently
selected channel is not known. I hope that someone more clever than me will
solve this issue ;)&lt;/pre&gt;
  &lt;/blockquote&gt;
  &lt;pre wrap=&quot;&quot;&gt;&lt;!----&gt;
Yes, this one is trickier. Note that there exists a similar problem
e.g. with playPause(): you also need to update the ui state.
  &lt;/pre&gt;
&lt;/blockquote&gt;
I now found a solution (although I don't know if it's the best), but I
don't recognize what should be updated when the playPause() method is
called,  you have a better overview for sure...&lt;br&gt;
&lt;br&gt;
ciao,&lt;br&gt;
Pascal&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Christoph Pfister schrieb:
&lt;blockquote cite=&quot;mid:19a3b7a80911080946s5da4709ch9df30c45cc79b3ba@mail.gmail.com&quot; type=&quot;cite&quot;&gt;
  &lt;pre wrap=&quot;&quot;&gt;Hi,

2009/11/6 Pascal Pollet &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26461092&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pascal@...&lt;/a&gt;:
  &lt;/pre&gt;
  &lt;blockquote type=&quot;cite&quot;&gt;
    &lt;pre wrap=&quot;&quot;&gt;Hi,

here is what I've done so far, I think it should add enough d-bus to make
most users happy, including me :) Please look at it and tell me what you
think of it...
    &lt;/pre&gt;
  &lt;/blockquote&gt;
  &lt;pre wrap=&quot;&quot;&gt;&lt;!----&gt;
It's a very good starting point. There exists a mediaplayer dbus
specification MPRIS [1], which I consider worth to implement (so that
we don't add yet another dbus interface for common functionality).
I've committed preliminary support to svn (the &quot;root&quot; object). Could
you please adapt your patch to that concept (i.e. add a tracklist and
player object; in case of need just method stubs)? I'm aware of the
fact that the actions defined in that specification don't 100% map
Kaffeine's actions (e.g. Play() doing a rewind to the beginning of a
track), so you don't have to care about those details if you don't
want to do. I also know that not every mpris thing is possible
(especially the tracklist parts needs more work) and that there's not
a mpris thing for every action Kaffeine is able to perform (put them
in a separate object for now).

  &lt;/pre&gt;
  &lt;blockquote type=&quot;cite&quot;&gt;
    &lt;pre wrap=&quot;&quot;&gt;There is one problem left, when selecting a new DVB-channel directly by name
or by number, with the (new) functions:

dvbTab::setChannel(const QString &amp;amp;name)
and
DvbTab::setChannel(int number)

changing the channel works, but I didn't manage to have the selection
changed to the new channel in the DvbChannelView tree. I don't know how to
get a valid QModelIndex that points to the correct DvbChannelModel. Please
look at the code and at my comments in DvbTab::setChannel(int number). I
tried almost everything and thereby learned a lot about the model / view
concept of Qt, but it didn't help me to find the solution... Maybe you
already know this probem Christoph, because there is the same issue when
kaffeine gets started with the &quot;--tv &amp;lt;channel&amp;gt;&quot; flag: it simply calls
DvbTab::playChannel(const QString &amp;amp;name), but it does not select the channel
in the DvbChannelView. The problem is that afterwards, calls to
MediaWidget::previous() and next() have no effect, because the currently
selected channel is not known. I hope that someone more clever than me will
solve this issue ;)
    &lt;/pre&gt;
  &lt;/blockquote&gt;
  &lt;pre wrap=&quot;&quot;&gt;&lt;!----&gt;
Yes, this one is trickier. Note that there exists a similar problem
e.g. with playPause(): you also need to update the ui state.

  &lt;/pre&gt;
  &lt;blockquote type=&quot;cite&quot;&gt;
    &lt;pre wrap=&quot;&quot;&gt;cheers,
Pascal
    &lt;/pre&gt;
  &lt;/blockquote&gt;
  &lt;pre wrap=&quot;&quot;&gt;&lt;!----&gt;
Thanks,

Christoph


[1] &lt;a class=&quot;moz-txt-link-freetext&quot; href=&quot;http://wiki.xmms2.xmms.se/wiki/MPRIS&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://wiki.xmms2.xmms.se/wiki/MPRIS&lt;/a&gt;

  &lt;/pre&gt;
&lt;/blockquote&gt;
&lt;/body&gt;
&lt;/html&gt;
&lt;br /&gt;diff -Naur ../kaffeine/src/dbusobjects.cpp ./src/dbusobjects.cpp
&lt;br&gt;--- ../kaffeine/src/dbusobjects.cpp	2009-11-21 23:11:28.000000000 +0100
&lt;br&gt;+++ ./src/dbusobjects.cpp	2009-11-21 23:08:52.000000000 +0100
&lt;br&gt;@@ -23,6 +23,9 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;QDBusMetaType&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;KAboutData&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;KApplication&amp;gt;
&lt;br&gt;+#include &amp;lt;KUrl&amp;gt;
&lt;br&gt;+
&lt;br&gt;+#include &amp;quot;mediawidget.h&amp;quot;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;QDBusArgument &amp;operator&amp;lt;&amp;lt;(QDBusArgument &amp;argument, const MprisVersionStruct &amp;versionStruct)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;@@ -40,9 +43,27 @@
&lt;br&gt;&amp;nbsp;	return argument;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+QDBusArgument &amp;operator&amp;lt;&amp;lt;(QDBusArgument &amp;argument, const MprisStatusStruct &amp;statusStruct)
&lt;br&gt;+{
&lt;br&gt;+	argument.beginStructure();
&lt;br&gt;+	argument &amp;lt;&amp;lt; statusStruct.play &amp;lt;&amp;lt; statusStruct.random &amp;lt;&amp;lt; statusStruct.repeatTrack &amp;lt;&amp;lt; statusStruct.repeatAll;
&lt;br&gt;+	argument.endStructure();
&lt;br&gt;+	return argument;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+const QDBusArgument &amp;operator&amp;gt;&amp;gt;(const QDBusArgument &amp;argument, MprisStatusStruct &amp;statusStruct)
&lt;br&gt;+{
&lt;br&gt;+	argument.beginStructure();
&lt;br&gt;+	argument &amp;gt;&amp;gt; statusStruct.play &amp;gt;&amp;gt; statusStruct.random &amp;gt;&amp;gt; statusStruct.repeatTrack &amp;gt;&amp;gt; statusStruct.repeatAll;
&lt;br&gt;+	argument.endStructure();
&lt;br&gt;+	return argument;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;MprisRootObject::MprisRootObject(QObject *parent) : QObject(parent)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	 qDBusRegisterMetaType&amp;lt;MprisVersionStruct&amp;gt;();
&lt;br&gt;+	 qDBusRegisterMetaType&amp;lt;MprisStatusStruct&amp;gt;();
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;MprisRootObject::~MprisRootObject()
&lt;br&gt;@@ -67,3 +88,320 @@
&lt;br&gt;&amp;nbsp;	versionStruct.minor = 0;
&lt;br&gt;&amp;nbsp;	return versionStruct;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+MprisPlayerObject::MprisPlayerObject(MediaWidget *mediaWidget_): mediaWidget(mediaWidget_)
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+MprisPlayerObject::~MprisPlayerObject()
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Next()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;next();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Prev()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;previous();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::PlayPause()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;playPause();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Play()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;play();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Pause()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;pause();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisPlayerObject::VolumeGet()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getVolume();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::VolumeSet(int volume)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;changeVolume(volume);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::VolumeIncrease()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;increaseVolume();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::VolumeDecrease()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;decreaseVolume();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisPlayerObject::PositionGet()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getPosition();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::PositionSet(int position)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setPosition(position);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Repeat()
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+	//repeating a single track not implemented yet, only whole playlist
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisPlayerObject::GetCaps()
&lt;br&gt;+{
&lt;br&gt;+	int caps = NO_CAPS;
&lt;br&gt;+
&lt;br&gt;+	if ( mediaWidget-&amp;gt;hasMedia() ) 
&lt;br&gt;+	{
&lt;br&gt;+		if ( mediaWidget-&amp;gt;isPlaying() &amp;&amp; ! mediaWidget-&amp;gt;isPaused() )
&lt;br&gt;+		{
&lt;br&gt;+			caps |= CAN_PAUSE;
&lt;br&gt;+		}
&lt;br&gt;+		else 
&lt;br&gt;+		{
&lt;br&gt;+			caps |= CAN_PLAY;
&lt;br&gt;+		}
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	caps |= CAN_HAS_TRACKLIST;
&lt;br&gt;+
&lt;br&gt;+	//TODO: CAN_GO_NEXT &amp; CAN_GO_PREV &amp; CAN_PROVIDE_METADATA
&lt;br&gt;+
&lt;br&gt;+	return caps;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Stop()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;stop();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+MprisStatusStruct MprisPlayerObject::GetStatus()
&lt;br&gt;+{
&lt;br&gt;+	MprisStatusStruct statusStruct;
&lt;br&gt;+	if ( mediaWidget-&amp;gt;isPaused() )
&lt;br&gt;+	{
&lt;br&gt;+		statusStruct.play = 1;
&lt;br&gt;+	}
&lt;br&gt;+	else if ( mediaWidget-&amp;gt;isPlaying() )
&lt;br&gt;+	{
&lt;br&gt;+		statusStruct.play = 0;
&lt;br&gt;+	}
&lt;br&gt;+	else
&lt;br&gt;+	{
&lt;br&gt;+		statusStruct.play = 2;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	if ( mediaWidget-&amp;gt;isRepeat() )
&lt;br&gt;+	{
&lt;br&gt;+		statusStruct.repeatAll = 1;
&lt;br&gt;+	}
&lt;br&gt;+	else
&lt;br&gt;+	{
&lt;br&gt;+		statusStruct.repeatAll = 0;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	statusStruct.random = 0;
&lt;br&gt;+	statusStruct.repeatTrack = 0;
&lt;br&gt;+	
&lt;br&gt;+	return statusStruct;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+QVariantMap MprisPlayerObject::GetMetadata()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getMetadata();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::Play(const QString &amp;url)
&lt;br&gt;+{
&lt;br&gt;+	KUrl kurl(url);
&lt;br&gt;+	if (kurl.isValid()) {
&lt;br&gt;+		mediaWidget-&amp;gt;play(kurl);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::PlayAudioCd()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;playAudioCd();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::PlayVideoCd()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;playVideoCd();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::PlayDvd()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;playDvd();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void &amp;nbsp;MprisPlayerObject::ChangeAudioChannel(int index)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;changeAudioChannel(index);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void &amp;nbsp;MprisPlayerObject::ChangeSubtitle(int index)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;changeSubtitle(index);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::ToggleMuted()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;toggleMuted();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::LongSkipBackward()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;longSkipBackward();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::SkipBackward()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;skipBackward();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::SkipForward()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;skipForward();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::LongSkipForward()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;longSkipForward();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::TimeButtonClicked()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;timeButtonClicked();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisPlayerObject::UpdateTimeButton()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;updateTimeButton();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+MprisTrackListObject::MprisTrackListObject(MediaWidget *mediaWidget_): mediaWidget(mediaWidget_)
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+MprisTrackListObject::~MprisTrackListObject()
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+QVariantMap MprisTrackListObject::GetMetadata()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getMetadata();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisTrackListObject::GetCurrentTrack()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getCurrentTrack();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisTrackListObject::GetLength()
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;getLength();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MprisTrackListObject::AddTrack(QString track, bool play)
&lt;br&gt;+{
&lt;br&gt;+	return mediaWidget-&amp;gt;addTrack(track, play);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisTrackListObject::DelTrack(int position)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;delTrack(position);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisTrackListObject::SetLoop(bool loop)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setLoop(loop);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisTrackListObject::SetRandom(bool random)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setRandom(random);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+MprisDvbObject::MprisDvbObject(MediaWidget *mediaWidget_): mediaWidget(mediaWidget_)
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+MprisDvbObject::~MprisDvbObject()
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::SetDvbChannel(const QString &amp;name)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setDvbChannel(name);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::SetDvbChannelNumber(int number)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setDvbChannel(number);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::SetDvbLastChannel()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setDvbLastChannel();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::StopDvb()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;stopDvb();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::ToggleInstantRecord()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;toggleInstantRecord();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDvbObject::ToggleOsd()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;toggleOsd();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+MprisDisplayObject::MprisDisplayObject(MediaWidget *mediaWidget_): mediaWidget(mediaWidget_)
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+MprisDisplayObject::~MprisDisplayObject()
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+void MprisDisplayObject::ToggleFullScreen()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;fullScreen();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDisplayObject::AspectRatioAuto()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;aspectRatioAuto();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDisplayObject::AspectRatio4_3()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;aspectRatio4_3();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDisplayObject::AspectRatio16_9()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;aspectRatio16_9();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MprisDisplayObject::AspectRatioWidget()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;aspectRatioWidget();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;diff -Naur ../kaffeine/src/dbusobjects.h ./src/dbusobjects.h
&lt;br&gt;--- ../kaffeine/src/dbusobjects.h	2009-11-21 23:11:28.000000000 +0100
&lt;br&gt;+++ ./src/dbusobjects.h	2009-11-21 23:08:52.000000000 +0100
&lt;br&gt;@@ -22,8 +22,12 @@
&lt;br&gt;&amp;nbsp;#define DBUSOBJECTS_H
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#include &amp;lt;QMetaType&amp;gt;
&lt;br&gt;+#include &amp;lt;QVariantMap&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;struct MprisVersionStruct;
&lt;br&gt;+struct MprisStatusStruct;
&lt;br&gt;+
&lt;br&gt;+class MediaWidget;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;class MprisRootObject : public QObject
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;@@ -39,6 +43,129 @@
&lt;br&gt;&amp;nbsp;	MprisVersionStruct MprisVersion();
&lt;br&gt;&amp;nbsp;};
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+
&lt;br&gt;+class MprisPlayerObject : public QObject
&lt;br&gt;+{
&lt;br&gt;+	Q_OBJECT
&lt;br&gt;+	Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.freedesktop.MediaPlayer&amp;quot;)
&lt;br&gt;+public:
&lt;br&gt;+	explicit MprisPlayerObject(MediaWidget *mediaWidget_);
&lt;br&gt;+	~MprisPlayerObject();
&lt;br&gt;+
&lt;br&gt;+public slots:
&lt;br&gt;+	void Next();
&lt;br&gt;+	void Prev();
&lt;br&gt;+	void Play();
&lt;br&gt;+	void Pause();
&lt;br&gt;+	void Stop();
&lt;br&gt;+	int &amp;nbsp;VolumeGet();
&lt;br&gt;+	void VolumeSet(int volume);
&lt;br&gt;+	int &amp;nbsp;PositionGet();
&lt;br&gt;+	void PositionSet(int position);
&lt;br&gt;+	void Repeat();
&lt;br&gt;+	MprisStatusStruct GetStatus();
&lt;br&gt;+	QVariantMap GetMetadata();
&lt;br&gt;+	int GetCaps();
&lt;br&gt;+
&lt;br&gt;+	// this functions are not part of the MPRIS specs
&lt;br&gt;+	void PlayPause();
&lt;br&gt;+	void VolumeIncrease();
&lt;br&gt;+	void VolumeDecrease();
&lt;br&gt;+	void Play(const QString &amp;url);
&lt;br&gt;+	void PlayAudioCd();
&lt;br&gt;+	void PlayVideoCd();
&lt;br&gt;+	void PlayDvd();
&lt;br&gt;+	void ChangeAudioChannel(int index);
&lt;br&gt;+	void ChangeSubtitle(int index);
&lt;br&gt;+	void ToggleMuted();
&lt;br&gt;+	void LongSkipBackward();
&lt;br&gt;+	void SkipBackward();
&lt;br&gt;+	void SkipForward();
&lt;br&gt;+	void LongSkipForward();
&lt;br&gt;+	void TimeButtonClicked();
&lt;br&gt;+	void UpdateTimeButton();
&lt;br&gt;+
&lt;br&gt;+signals:
&lt;br&gt;+	void CapsChange( int );
&lt;br&gt;+	void StatusChange( MprisStatusStruct );
&lt;br&gt;+	void TrackChange( QVariantMap );
&lt;br&gt;+
&lt;br&gt;+private:
&lt;br&gt;+	MediaWidget *mediaWidget;
&lt;br&gt;+
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+class MprisTrackListObject : public QObject
&lt;br&gt;+{
&lt;br&gt;+	Q_OBJECT
&lt;br&gt;+	Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.freedesktop.MediaPlayer&amp;quot;)
&lt;br&gt;+public:
&lt;br&gt;+	explicit MprisTrackListObject(MediaWidget *mediaWidget_);
&lt;br&gt;+	~MprisTrackListObject();
&lt;br&gt;+
&lt;br&gt;+public slots:
&lt;br&gt;+	QVariantMap GetMetadata();
&lt;br&gt;+	int GetCurrentTrack();
&lt;br&gt;+	int GetLength();
&lt;br&gt;+	int AddTrack(QString track, bool play);
&lt;br&gt;+	void DelTrack(int position);
&lt;br&gt;+	void SetLoop(bool loop);
&lt;br&gt;+	void SetRandom(bool random);
&lt;br&gt;+
&lt;br&gt;+signals:
&lt;br&gt;+	void TrackListChange(int);
&lt;br&gt;+
&lt;br&gt;+private:
&lt;br&gt;+	MediaWidget *mediaWidget;
&lt;br&gt;+
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+class MprisDvbObject : public QObject
&lt;br&gt;+{
&lt;br&gt;+	Q_OBJECT
&lt;br&gt;+	Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.freedesktop.MediaPlayer&amp;quot;)
&lt;br&gt;+public:
&lt;br&gt;+	explicit MprisDvbObject(MediaWidget *mediaWidget_);
&lt;br&gt;+	~MprisDvbObject();
&lt;br&gt;+
&lt;br&gt;+public slots:
&lt;br&gt;+	void SetDvbChannel(const QString &amp;name);
&lt;br&gt;+	void SetDvbChannelNumber(int number);
&lt;br&gt;+	void SetDvbLastChannel();
&lt;br&gt;+	void StopDvb();
&lt;br&gt;+	void ToggleInstantRecord();
&lt;br&gt;+	void ToggleOsd();
&lt;br&gt;+
&lt;br&gt;+private:
&lt;br&gt;+	MediaWidget *mediaWidget;
&lt;br&gt;+
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+class MprisDisplayObject : public QObject
&lt;br&gt;+{
&lt;br&gt;+	Q_OBJECT
&lt;br&gt;+	Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.freedesktop.MediaPlayer&amp;quot;)
&lt;br&gt;+public:
&lt;br&gt;+	explicit MprisDisplayObject(MediaWidget *mediaWidget_);
&lt;br&gt;+	~MprisDisplayObject();
&lt;br&gt;+
&lt;br&gt;+public slots:
&lt;br&gt;+	void AspectRatioAuto();
&lt;br&gt;+	void AspectRatio4_3();
&lt;br&gt;+	void AspectRatio16_9();
&lt;br&gt;+	void AspectRatioWidget();
&lt;br&gt;+	void ToggleFullScreen();
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+private:
&lt;br&gt;+	MediaWidget *mediaWidget;
&lt;br&gt;+
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;struct MprisVersionStruct
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	quint16 major;
&lt;br&gt;@@ -47,4 +174,30 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;Q_DECLARE_METATYPE(MprisVersionStruct)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+struct MprisStatusStruct
&lt;br&gt;+{
&lt;br&gt;+	quint16 play;
&lt;br&gt;+	quint16 random;
&lt;br&gt;+	quint16 repeatTrack;
&lt;br&gt;+	quint16 repeatAll;
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+Q_DECLARE_METATYPE(MprisStatusStruct)
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+* The bit values for the capabilities flags
&lt;br&gt;+*/
&lt;br&gt;+enum Cap {
&lt;br&gt;+	NO_CAPS			 &amp;nbsp; = 0,
&lt;br&gt;+	CAN_GO_NEXT		 &amp;nbsp; = 1 &amp;lt;&amp;lt; 0,
&lt;br&gt;+	CAN_GO_PREV		 &amp;nbsp; = 1 &amp;lt;&amp;lt; 1,
&lt;br&gt;+	CAN_PAUSE			 = 1 &amp;lt;&amp;lt; 2,
&lt;br&gt;+	CAN_PLAY			 &amp;nbsp;= 1 &amp;lt;&amp;lt; 3,
&lt;br&gt;+	CAN_SEEK			 &amp;nbsp;= 1 &amp;lt;&amp;lt; 4,
&lt;br&gt;+	CAN_PROVIDE_METADATA &amp;nbsp;= 1 &amp;lt;&amp;lt; 5,
&lt;br&gt;+	CAN_HAS_TRACKLIST	 = 1 &amp;lt;&amp;lt; 6,
&lt;br&gt;+	ALL_KNOWN_CAPS		= (1 &amp;lt;&amp;lt; 7) - 1
&lt;br&gt;+};
&lt;br&gt;+Q_DECLARE_FLAGS(Caps, Cap)
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;#endif /* DBUSOBJECTS_H */
&lt;br&gt;diff -Naur ../kaffeine/src/dvb/dvbliveview.cpp ./src/dvb/dvbliveview.cpp
&lt;br&gt;--- ../kaffeine/src/dvb/dvbliveview.cpp	2009-11-21 23:11:27.000000000 +0100
&lt;br&gt;+++ ./src/dvb/dvbliveview.cpp	2009-11-21 23:08:52.000000000 +0100
&lt;br&gt;@@ -157,6 +157,7 @@
&lt;br&gt;&amp;nbsp;	connect(mediaWidget, SIGNAL(dvbStopped()), this, SLOT(liveStopped()));
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	connect(mediaWidget, SIGNAL(osdKeyPressed(int)), this, SLOT(osdKeyPressed(int)));
&lt;br&gt;+	connect(mediaWidget, SIGNAL(toggleOsd()), this, SLOT(toggleOsd()));
&lt;br&gt;&amp;nbsp;	connect(&amp;osdChannelTimer, SIGNAL(timeout()), this, SLOT(tuneOsdChannel()));
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;diff -Naur ../kaffeine/src/dvb/dvbtab.cpp ./src/dvb/dvbtab.cpp
&lt;br&gt;--- ../kaffeine/src/dvb/dvbtab.cpp	2009-11-21 23:11:27.000000000 +0100
&lt;br&gt;+++ ./src/dvb/dvbtab.cpp	2009-11-21 23:08:52.000000000 +0100
&lt;br&gt;@@ -117,6 +117,10 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	connect(mediaWidget, SIGNAL(previousDvbChannel()), this, SLOT(previousChannel()));
&lt;br&gt;&amp;nbsp;	connect(mediaWidget, SIGNAL(nextDvbChannel()), this, SLOT(nextChannel()));
&lt;br&gt;+	connect(mediaWidget, SIGNAL(changeDvbChannel(const QString&amp;)), this, SLOT(setChannel(const QString&amp;)));
&lt;br&gt;+	connect(mediaWidget, SIGNAL(changeDvbChannel(int)), this, SLOT(setChannel(int)));
&lt;br&gt;+	connect(mediaWidget, SIGNAL(dvbLastChannel()), this, SLOT(setLastChannel()));
&lt;br&gt;+	connect(mediaWidget, SIGNAL(toggleInstantRecord()), this, SLOT(toggleInstantRecord()));
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	connect(manager-&amp;gt;getRecordingManager(), SIGNAL(instantRecordingRemoved()),
&lt;br&gt;&amp;nbsp;		this, SLOT(instantRecordingRemoved()));
&lt;br&gt;@@ -144,7 +148,7 @@
&lt;br&gt;&amp;nbsp;	channelView-&amp;gt;setRootIsDecorated(false);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	if (!channelView-&amp;gt;header()-&amp;gt;restoreState(QByteArray::fromBase64(
&lt;br&gt;-	 &amp;nbsp; &amp;nbsp;KGlobal::config()-&amp;gt;group(&amp;quot;DVB&amp;quot;).readEntry(&amp;quot;ChannelViewState&amp;quot;, QByteArray())))) {
&lt;br&gt;+		KGlobal::config()-&amp;gt;group(&amp;quot;DVB&amp;quot;).readEntry(&amp;quot;ChannelViewState&amp;quot;, QByteArray())))) {
&lt;br&gt;&amp;nbsp;		channelView-&amp;gt;sortByColumn(0, Qt::AscendingOrder);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -210,6 +214,11 @@
&lt;br&gt;&amp;nbsp;	playChannel(manager-&amp;gt;getChannelModel()-&amp;gt;channelForName(name));
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+void DvbTab::playChannel(int number)
&lt;br&gt;+{
&lt;br&gt;+	playChannel(manager-&amp;gt;getChannelModel()-&amp;gt;channelForNumber(number));
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void DvbTab::playLastChannel()
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	playChannel(KGlobal::config()-&amp;gt;group(&amp;quot;DVB&amp;quot;).readEntry(&amp;quot;LastChannel&amp;quot;));
&lt;br&gt;@@ -244,6 +253,19 @@
&lt;br&gt;&amp;nbsp;	dialog.exec();
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+void DvbTab::toggleInstantRecord()
&lt;br&gt;+{
&lt;br&gt;+	if (instantRecordAction-&amp;gt;isChecked()) {
&lt;br&gt;+		instantRecordAction-&amp;gt;setChecked(false);
&lt;br&gt;+		instantRecord(false);
&lt;br&gt;+	}
&lt;br&gt;+	else {
&lt;br&gt;+		instantRecordAction-&amp;gt;setChecked(true);
&lt;br&gt;+		instantRecord(true);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void DvbTab::instantRecord(bool checked)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	if (checked) {
&lt;br&gt;@@ -351,4 +373,73 @@
&lt;br&gt;&amp;nbsp;	if (channel != NULL) {
&lt;br&gt;&amp;nbsp;		manager-&amp;gt;getLiveView()-&amp;gt;playChannel(channel);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;+
&lt;br&gt;+	QModelIndex index = channelView-&amp;gt;indexAt(QPoint(0,0));
&lt;br&gt;+
&lt;br&gt;+	if (!index.isValid()) {
&lt;br&gt;+		return;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	DvbChannelModel *channelModel = (DvbChannelModel*) index.model();
&lt;br&gt;+
&lt;br&gt;+	QModelIndexList list = channelModel-&amp;gt;match(channelModel-&amp;gt;index(0, 0), Qt::DisplayRole, channel-&amp;gt;name, 1, Qt::MatchExactly);
&lt;br&gt;+	QModelIndex index_new = list.value(0);
&lt;br&gt;+
&lt;br&gt;+	if (!index_new.isValid()) {
&lt;br&gt;+		return;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	channelView-&amp;gt;setCurrentIndex(index_new);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+void DvbTab::setChannel(const QString &amp;name)
&lt;br&gt;+{
&lt;br&gt;+	QModelIndex index = channelView-&amp;gt;indexAt(QPoint(0,0));
&lt;br&gt;+
&lt;br&gt;+	if (!index.isValid()) {
&lt;br&gt;+		return;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	DvbChannelModel *channelModel = (DvbChannelModel*) index.model();
&lt;br&gt;+
&lt;br&gt;+	QModelIndexList list = channelModel-&amp;gt;match(channelModel-&amp;gt;index(0, 0), Qt::DisplayRole, name, 1, Qt::MatchExactly);
&lt;br&gt;+	QModelIndex index_new = list.value(0);
&lt;br&gt;+
&lt;br&gt;+	if (!index_new.isValid()) {
&lt;br&gt;+		return;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	channelView-&amp;gt;setCurrentIndex(index_new);
&lt;br&gt;+
&lt;br&gt;+	playChannel(name);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DvbTab::setChannel(int number)
&lt;br&gt;+{
&lt;br&gt;+
&lt;br&gt;+	QModelIndex index = channelView-&amp;gt;indexAt(QPoint(0,0));
&lt;br&gt;+
&lt;br&gt;+	if (!index.isValid()) {
&lt;br&gt;+		return;
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	DvbChannelModel *channelModel = (DvbChannelModel*) index.model();
&lt;br&gt;+
&lt;br&gt;+	QModelIndexList list = channelModel-&amp;gt;match(channelModel-&amp;gt;index(0, 1), Qt::DisplayRole, number, 1, Qt::MatchExactly);
&lt;br&gt;+	QModelIndex index_new = list.value(0);
&lt;br&gt;+
&lt;br&gt;+	if (!index_new.isValid()) {
&lt;br&gt;+		return;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	channelView-&amp;gt;setCurrentIndex(index_new);
&lt;br&gt;+	playChannel(number);
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DvbTab::setLastChannel()
&lt;br&gt;+{
&lt;br&gt;+	playLastChannel();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;diff -Naur ../kaffeine/src/dvb/dvbtab.h ./src/dvb/dvbtab.h
&lt;br&gt;--- ../kaffeine/src/dvb/dvbtab.h	2009-11-21 23:11:27.000000000 +0100
&lt;br&gt;+++ ./src/dvb/dvbtab.h	2009-11-21 23:08:52.000000000 +0100
&lt;br&gt;@@ -38,11 +38,13 @@
&lt;br&gt;&amp;nbsp;class DvbTab : public TabBase
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	Q_OBJECT
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;public:
&lt;br&gt;&amp;nbsp;	DvbTab(KMenu *menu, KActionCollection *collection, MediaWidget *mediaWidget_);
&lt;br&gt;&amp;nbsp;	~DvbTab();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	void playChannel(const QString &amp;name);
&lt;br&gt;+	void playChannel(int number);
&lt;br&gt;&amp;nbsp;	void playLastChannel();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	void enableDvbDump();
&lt;br&gt;@@ -52,12 +54,16 @@
&lt;br&gt;&amp;nbsp;	void showEpgDialog();
&lt;br&gt;&amp;nbsp;	void showRecordingDialog();
&lt;br&gt;&amp;nbsp;	void instantRecord(bool checked);
&lt;br&gt;+	void toggleInstantRecord();
&lt;br&gt;&amp;nbsp;	void instantRecordingRemoved();
&lt;br&gt;&amp;nbsp;	void configureDvb();
&lt;br&gt;&amp;nbsp;	void playLive(const QModelIndex &amp;index);
&lt;br&gt;&amp;nbsp;	void previousChannel();
&lt;br&gt;&amp;nbsp;	void nextChannel();
&lt;br&gt;&amp;nbsp;	void cleanTimeShiftFiles();
&lt;br&gt;+	void setChannel(const QString &amp;name);
&lt;br&gt;+	void setChannel(int number);
&lt;br&gt;+	void setLastChannel();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;private:
&lt;br&gt;&amp;nbsp;	void activate();
&lt;br&gt;diff -Naur ../kaffeine/src/kaffeine.cpp ./src/kaffeine.cpp
&lt;br&gt;--- ../kaffeine/src/kaffeine.cpp	2009-11-21 23:11:28.000000000 +0100
&lt;br&gt;+++ ./src/kaffeine.cpp	2009-11-21 23:08:52.000000000 +0100
&lt;br&gt;@@ -327,6 +327,15 @@
&lt;br&gt;&amp;nbsp;	// initialize dbus objects
&lt;br&gt;&amp;nbsp;	QDBusConnection::sessionBus().registerObject(&amp;quot;/&amp;quot;, new MprisRootObject(this),
&lt;br&gt;&amp;nbsp;		QDBusConnection::ExportAllContents);
&lt;br&gt;+	QDBusConnection::sessionBus().registerObject(&amp;quot;/Player&amp;quot;, new MprisPlayerObject(mediaWidget),
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;QDBusConnection::ExportAllContents);
&lt;br&gt;+	QDBusConnection::sessionBus().registerObject(&amp;quot;/TrackList&amp;quot;, new MprisTrackListObject(mediaWidget),
&lt;br&gt;+		QDBusConnection::ExportAllContents);
&lt;br&gt;+	QDBusConnection::sessionBus().registerObject(&amp;quot;/DVB&amp;quot;, new MprisDvbObject(mediaWidget),
&lt;br&gt;+		QDBusConnection::ExportAllContents);
&lt;br&gt;+	QDBusConnection::sessionBus().registerObject(&amp;quot;/Display&amp;quot;, new MprisDisplayObject(mediaWidget),
&lt;br&gt;+		QDBusConnection::ExportAllContents);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	QDBusConnection::sessionBus().registerService(&amp;quot;org.mpris.kaffeine&amp;quot;);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	show();
&lt;br&gt;diff -Naur ../kaffeine/src/mediawidget.cpp ./src/mediawidget.cpp
&lt;br&gt;--- ../kaffeine/src/mediawidget.cpp	2009-11-21 23:11:27.000000000 +0100
&lt;br&gt;+++ ./src/mediawidget.cpp	2009-11-21 23:08:52.000000000 +0100
&lt;br&gt;@@ -45,6 +45,8 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;KToolBar&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;quot;osdwidget.h&amp;quot;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#include &amp;lt;iostream&amp;gt;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;class DvbFeed : public Phonon::AbstractMediaStream
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;public:
&lt;br&gt;@@ -374,6 +376,8 @@
&lt;br&gt;&amp;nbsp;	connect(timer, SIGNAL(timeout()), this, SLOT(checkScreenSaver()));
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	stateChanged(Phonon::StoppedState);
&lt;br&gt;+
&lt;br&gt;+	setRepeat(false);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;MediaWidget::~MediaWidget()
&lt;br&gt;@@ -543,6 +547,69 @@
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+bool MediaWidget::isPaused()
&lt;br&gt;+{
&lt;br&gt;+	if (playing &amp;&amp; mediaObject-&amp;gt;state() == Phonon::PausedState)
&lt;br&gt;+	{
&lt;br&gt;+		return true;
&lt;br&gt;+	}
&lt;br&gt;+	return false;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+// also returns true when paused
&lt;br&gt;+bool MediaWidget::isPlaying()
&lt;br&gt;+{
&lt;br&gt;+	return playing;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setRepeat(bool repeat_)
&lt;br&gt;+{
&lt;br&gt;+	repeat = repeat_;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+bool MediaWidget::isRepeat()
&lt;br&gt;+{
&lt;br&gt;+	return repeat;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+bool MediaWidget::hasMedia()
&lt;br&gt;+{
&lt;br&gt;+	if ( mediaObject-&amp;gt;currentSource().type() != Phonon::MediaSource::Invalid ) {
&lt;br&gt;+		std::cout &amp;lt;&amp;lt; &amp;quot;KAFFEINE: true&amp;quot; &amp;lt;&amp;lt; std::endl;
&lt;br&gt;+		return true;
&lt;br&gt;+	}
&lt;br&gt;+	else {
&lt;br&gt;+		std::cout &amp;lt;&amp;lt; &amp;quot;KAFFEINE: false&amp;quot; &amp;lt;&amp;lt; std::endl;
&lt;br&gt;+		return false;
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setDvbChannel(int number)
&lt;br&gt;+{
&lt;br&gt;+	if (dvbFeed != NULL) {
&lt;br&gt;+		emit changeDvbChannel(number);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setDvbChannel(const QString &amp;name)
&lt;br&gt;+{
&lt;br&gt;+	if (dvbFeed != NULL) {
&lt;br&gt;+		emit changeDvbChannel(name);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setDvbLastChannel()
&lt;br&gt;+{
&lt;br&gt;+	if (dvbFeed != NULL) {
&lt;br&gt;+		emit dvbLastChannel();
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::fullScreen()
&lt;br&gt;+{
&lt;br&gt;+	emit toggleFullScreen();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void MediaWidget::stateChanged(Phonon::State state)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	bool newPlaying = false;
&lt;br&gt;@@ -551,6 +618,7 @@
&lt;br&gt;&amp;nbsp;		case Phonon::BufferingState:
&lt;br&gt;&amp;nbsp;		case Phonon::PlayingState:
&lt;br&gt;&amp;nbsp;		case Phonon::PausedState:
&lt;br&gt;+			paused = true;
&lt;br&gt;&amp;nbsp;			newPlaying = true;
&lt;br&gt;&amp;nbsp;			break;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -655,6 +723,31 @@
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+void MediaWidget::playPause() {
&lt;br&gt;+	//if (actionPlayPause-&amp;gt;text() == textPlay) {
&lt;br&gt;+	if (isPaused()) {
&lt;br&gt;+		playPause(false);
&lt;br&gt;+	}
&lt;br&gt;+	else {
&lt;br&gt;+		playPause(true);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::play() {
&lt;br&gt;+	if (playing &amp;&amp; actionPlayPause-&amp;gt;text() == textPlay) {
&lt;br&gt;+		playPause(false);
&lt;br&gt;+	}
&lt;br&gt;+	else if (!playing) {
&lt;br&gt;+		emit playlistPlay();
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::pause() {
&lt;br&gt;+	if (playing &amp;&amp; actionPlayPause-&amp;gt;text() == textPause) {
&lt;br&gt;+		playPause(true);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void MediaWidget::stop()
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	mediaObject-&amp;gt;stop();
&lt;br&gt;@@ -726,6 +819,17 @@
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+int MediaWidget::getVolume()
&lt;br&gt;+{
&lt;br&gt;+	int volume = audioOutput-&amp;gt;volume() * 100;
&lt;br&gt;+
&lt;br&gt;+	if ( volume &amp;gt;= 0 &amp;&amp; volume &amp;lt;= 100 ) {
&lt;br&gt;+		return volume;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void MediaWidget::changeVolume(int volume)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	audioOutput-&amp;gt;setVolume(volume * qreal(0.01));
&lt;br&gt;@@ -915,6 +1019,16 @@
&lt;br&gt;&amp;nbsp;	mediaObject-&amp;gt;seek(mediaObject-&amp;gt;currentTime() + 1000 * longSkipDuration);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+void MediaWidget::setPosition(int position)
&lt;br&gt;+{
&lt;br&gt;+	mediaObject-&amp;gt;seek(position);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MediaWidget::getPosition()
&lt;br&gt;+{
&lt;br&gt;+	return mediaObject-&amp;gt;currentTime();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void MediaWidget::jumpToPosition()
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	JumpToPositionDialog dialog(QTime().addMSecs(mediaObject-&amp;gt;currentTime()), this);
&lt;br&gt;@@ -1150,3 +1264,57 @@
&lt;br&gt;&amp;nbsp;		subtitleBox-&amp;gt;setEnabled(false);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+QVariantMap MediaWidget::getMetadata()
&lt;br&gt;+{
&lt;br&gt;+	QVariantMap ret;
&lt;br&gt;+	QMultiMap&amp;lt;QString, QString&amp;gt; multiMap = mediaObject-&amp;gt;metaData();
&lt;br&gt;+	QMultiMap&amp;lt;QString, QString&amp;gt;::const_iterator i = multiMap.constBegin();
&lt;br&gt;+	
&lt;br&gt;+	while( i != multiMap.constEnd() )
&lt;br&gt;+	{
&lt;br&gt;+		ret[ i.key() ] = QVariant( i.value() );
&lt;br&gt;+		i++;
&lt;br&gt;+	}
&lt;br&gt;+	return ret;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int getNumberOfTracks()
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MediaWidget::getCurrentTrack()
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MediaWidget::getLength()
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int MediaWidget::addTrack(QString track, bool play)
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+	return 0;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::delTrack(int position)
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setLoop(bool loop)
&lt;br&gt;+{
&lt;br&gt;+	setRepeat(loop);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setRandom(bool random)
&lt;br&gt;+{
&lt;br&gt;+	//TODO
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;diff -Naur ../kaffeine/src/mediawidget.h ./src/mediawidget.h
&lt;br&gt;--- ../kaffeine/src/mediawidget.h	2009-11-21 23:11:27.000000000 +0100
&lt;br&gt;+++ ./src/mediawidget.h	2009-11-21 23:08:52.000000000 +0100
&lt;br&gt;@@ -21,6 +21,7 @@
&lt;br&gt;&amp;nbsp;#ifndef MEDIAWIDGET_H
&lt;br&gt;&amp;nbsp;#define MEDIAWIDGET_H
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#include &amp;lt;QVariantMap&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;QWidget&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;Phonon/Global&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;Phonon/ObjectDescription&amp;gt;
&lt;br&gt;@@ -48,9 +49,14 @@
&lt;br&gt;&amp;nbsp;class MediaWidget : public QWidget
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	Q_OBJECT
&lt;br&gt;+	friend class MprisPlayerObject;
&lt;br&gt;+	friend class MprisTrackListObject;
&lt;br&gt;+	friend class MprisDvbObject;
&lt;br&gt;+	friend class MprisDisplayObject;	
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;public:
&lt;br&gt;&amp;nbsp;	MediaWidget(KMenu *menu_, KAction *fullScreenAction, KToolBar *toolBar,
&lt;br&gt;-		 &amp;nbsp; &amp;nbsp;KActionCollection *collection, QWidget *parent);
&lt;br&gt;+			KActionCollection *collection, QWidget *parent);
&lt;br&gt;&amp;nbsp;	~MediaWidget();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	static QString extensionFilter(); // usable for KFileDialog::setFilter()
&lt;br&gt;@@ -78,6 +84,10 @@
&lt;br&gt;&amp;nbsp;	void setShortSkipDuration(int duration);
&lt;br&gt;&amp;nbsp;	void setLongSkipDuration(int duration);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+	void setRepeat(bool repeat_);
&lt;br&gt;+	bool isRepeat();
&lt;br&gt;+	bool hasMedia();
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;public slots:
&lt;br&gt;&amp;nbsp;	void stop();
&lt;br&gt;&amp;nbsp;	void stopDvb();
&lt;br&gt;@@ -98,14 +108,34 @@
&lt;br&gt;&amp;nbsp;	void startDvbTimeShift();
&lt;br&gt;&amp;nbsp;	void changeDvbAudioChannel(int index);
&lt;br&gt;&amp;nbsp;	void changeDvbSubtitle(int index);
&lt;br&gt;+	void changeDvbChannel(int number);
&lt;br&gt;+	void changeDvbChannel(const QString &amp;name);
&lt;br&gt;&amp;nbsp;	void dvbStopped();
&lt;br&gt;&amp;nbsp;	void osdKeyPressed(int key);
&lt;br&gt;+	void toggleOsd();
&lt;br&gt;+
&lt;br&gt;+	void dvbLastChannel();
&lt;br&gt;+	void toggleInstantRecord();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;private slots:
&lt;br&gt;+	bool isPlaying();
&lt;br&gt;+	bool isPaused();
&lt;br&gt;+
&lt;br&gt;+	int getPosition();
&lt;br&gt;+	int getCurrentTrack();
&lt;br&gt;+	int getLength();
&lt;br&gt;+	int addTrack(QString track, bool play);
&lt;br&gt;+	int getVolume();
&lt;br&gt;+
&lt;br&gt;+	QVariantMap getMetadata();
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	void stateChanged(Phonon::State state);
&lt;br&gt;&amp;nbsp;	void playbackFinished();
&lt;br&gt;&amp;nbsp;	void previous();
&lt;br&gt;&amp;nbsp;	void playPause(bool paused);
&lt;br&gt;+	void playPause();
&lt;br&gt;+	void play();
&lt;br&gt;+	void pause();
&lt;br&gt;&amp;nbsp;	void next();
&lt;br&gt;&amp;nbsp;	void changeAudioChannel(int index);
&lt;br&gt;&amp;nbsp;	void changeSubtitle(int index);
&lt;br&gt;@@ -132,6 +162,7 @@
&lt;br&gt;&amp;nbsp;	void skipForward();
&lt;br&gt;&amp;nbsp;	void longSkipForward();
&lt;br&gt;&amp;nbsp;	void jumpToPosition();
&lt;br&gt;+	void setPosition(int position);
&lt;br&gt;&amp;nbsp;	void timeButtonClicked();
&lt;br&gt;&amp;nbsp;	void updateTimeButton();
&lt;br&gt;&amp;nbsp;	void updateCaption();
&lt;br&gt;@@ -144,6 +175,16 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	void checkScreenSaver();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+	void setDvbChannel(int number);
&lt;br&gt;+	void setDvbChannel(const QString &amp;name);
&lt;br&gt;+	void setDvbLastChannel();
&lt;br&gt;+	
&lt;br&gt;+	void fullScreen();
&lt;br&gt;+
&lt;br&gt;+	void delTrack(int position);
&lt;br&gt;+	void setLoop(bool loop);
&lt;br&gt;+	void setRandom(bool random);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;private:
&lt;br&gt;&amp;nbsp;	void contextMenuEvent(QContextMenuEvent *event);
&lt;br&gt;&amp;nbsp;	void mouseDoubleClickEvent(QMouseEvent *);
&lt;br&gt;@@ -164,6 +205,7 @@
&lt;br&gt;&amp;nbsp;	Phonon::MediaController *mediaController;
&lt;br&gt;&amp;nbsp;	DvbFeed *dvbFeed;
&lt;br&gt;&amp;nbsp;	bool playing;
&lt;br&gt;+	bool paused;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	KAction *actionPrevious;
&lt;br&gt;&amp;nbsp;	KAction *actionPlayPause;
&lt;br&gt;@@ -204,6 +246,7 @@
&lt;br&gt;&amp;nbsp;	KAction *jumpToPositionAction;
&lt;br&gt;&amp;nbsp;	QPushButton *timeButton;
&lt;br&gt;&amp;nbsp;	bool showElapsedTime;
&lt;br&gt;+	bool repeat;
&lt;br&gt;&amp;nbsp;};
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#endif /* MEDIAWIDGET_H */
&lt;br&gt;diff -Naur ../kaffeine/src/playlist/playlistmodel.cpp ./src/playlist/playlistmodel.cpp
&lt;br&gt;--- ../kaffeine/src/playlist/playlistmodel.cpp	2009-11-21 23:11:27.000000000 +0100
&lt;br&gt;+++ ./src/playlist/playlistmodel.cpp	2009-11-21 23:08:52.000000000 +0100
&lt;br&gt;@@ -48,6 +48,7 @@
&lt;br&gt;&amp;nbsp;	QAbstractTableModel(parent), mediaWidget(mediaWidget_), repeat(false)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	setSupportedDragActions(Qt::MoveAction);
&lt;br&gt;+	mediaWidget-&amp;gt;setRepeat(false);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	connect(mediaWidget, SIGNAL(playlistPrevious()), this, SLOT(playPreviousTrack()));
&lt;br&gt;&amp;nbsp;	connect(mediaWidget, SIGNAL(playlistPlay()), this, SLOT(playCurrentTrack()));
&lt;br&gt;@@ -351,6 +352,7 @@
&lt;br&gt;&amp;nbsp;void PlaylistModel::repeatPlaylist(bool repeat_)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	repeat = repeat_;
&lt;br&gt;+	mediaWidget-&amp;gt;setRepeat(repeat);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;static bool playlistIndexLess(const PlaylistTrack &amp;x, const PlaylistTrack &amp;y)
&lt;br&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26461092&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/dbus-support-for-kaffeine-tp26128565p26461092.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26445509</id>
	<title>Re: dbus support for kaffeine</title>
	<published>2009-11-20T07:47:10Z</published>
	<updated>2009-11-20T07:47:10Z</updated>
	<author>
		<name>Pascal Pollet</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;&lt;br&gt;this e-mail is just to say that I didn't forget what I promised to do, I
&lt;br&gt;simply hadn't much time in the two last weeks. But I think that I will
&lt;br&gt;be able to send you a new patch in the next few days, if nothing gets in
&lt;br&gt;the way... Have a nice week-end!
&lt;br&gt;&lt;br&gt;cheers,
&lt;br&gt;Pascal
&lt;br&gt;&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26445509&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/dbus-support-for-kaffeine-tp26128565p26445509.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26390411</id>
	<title>Request: kaffeine --dvb start parameter</title>
	<published>2009-11-17T06:00:48Z</published>
	<updated>2009-11-17T06:00:48Z</updated>
	<author>
		<name>Boris Cuber-2</name>
	</author>
	<content type="html">Hi kaffeine people,
&lt;br&gt;&lt;br&gt;One feature i miss from the old versions is the possibilty
&lt;br&gt;to start kaffeine from the cmdline in dvb mode with 
&lt;br&gt;the last tuned channel.
&lt;br&gt;&lt;br&gt;This would also keep some compatability to ~kaffeine-0.8.x.
&lt;br&gt;I dunno if this is really a &amp;quot;wanted&amp;quot; feature, but it improves my
&lt;br&gt;tv/dvb watching experience. I'm sure this could also be done
&lt;br&gt;by altering the --tv parameter, but i'm no qt/c++ programmer
&lt;br&gt;and my tries ended up in segfaults when starting kaffeine.
&lt;br&gt;&lt;br&gt;Whatever, it'd be cool to have this feature back ;)
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;A simple patch (applies to trunk), adds a --dvb parameter:
&lt;br&gt;-------------------------------------
&lt;br&gt;diff -ur kaffeine-9999/src/kaffeine.cpp kaffeine-9999-new/src/kaffeine.cpp
&lt;br&gt;--- kaffeine-9999/src/kaffeine.cpp	2009-11-16 16:11:31.205787337 +0100
&lt;br&gt;+++ kaffeine-9999-new/src/kaffeine.cpp	2009-11-16 21:30:35.943537036 +0100
&lt;br&gt;@@ -345,6 +345,7 @@
&lt;br&gt;&amp;nbsp;	options.add(&amp;quot;audiocd&amp;quot;, ki18n(&amp;quot;Play Audio CD&amp;quot;));
&lt;br&gt;&amp;nbsp;	options.add(&amp;quot;videocd&amp;quot;, ki18n(&amp;quot;Play Video CD&amp;quot;));
&lt;br&gt;&amp;nbsp;	options.add(&amp;quot;dvd&amp;quot;, ki18n(&amp;quot;Play DVD&amp;quot;));
&lt;br&gt;+	options.add(&amp;quot;dvb&amp;quot;, ki18n(&amp;quot;Play TV (last tuned channel)&amp;quot;));	// compatibility 
&lt;br&gt;option to kaffeine-0.8.x
&lt;br&gt;&amp;nbsp;	options.add(&amp;quot;tv &amp;lt;channel&amp;gt;&amp;quot;, ki18n(&amp;quot;Play TV channel&amp;quot;));
&lt;br&gt;&amp;nbsp;	options.add(&amp;quot;dumpdvb&amp;quot;, ki18nc(&amp;quot;command line option&amp;quot;, &amp;quot;Dump dvb data (debug 
&lt;br&gt;option)&amp;quot;));
&lt;br&gt;&amp;nbsp;	options.add(&amp;quot;+[file]&amp;quot;, ki18n(&amp;quot;Files or URLs to play&amp;quot;));
&lt;br&gt;@@ -387,6 +388,16 @@
&lt;br&gt;&amp;nbsp;		return;
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+	if (args-&amp;gt;isSet(&amp;quot;dvb&amp;quot;)) {
&lt;br&gt;+		// Start kaffeine in dvb mode using last watched channel
&lt;br&gt;+
&lt;br&gt;+		activateTab(DvbTabId);
&lt;br&gt;+		dvbTab-&amp;gt;playLastChannel();
&lt;br&gt;+
&lt;br&gt;+		args-&amp;gt;clear();
&lt;br&gt;+		return;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	QString dvb = args-&amp;gt;getOption(&amp;quot;tv&amp;quot;);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	if (!dvb.isEmpty()) {
&lt;br&gt;&lt;br&gt;&lt;br&gt;-------------------------------------
&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26390411&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Request%3A-kaffeine---dvb-start-parameter-tp26390411p26390411.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26279905</id>
	<title>Re: dbus support for kaffeine</title>
	<published>2009-11-10T00:32:53Z</published>
	<updated>2009-11-10T00:32:53Z</updated>
	<author>
		<name>Pascal Pollet</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;&lt;br&gt;&amp;gt; There exists a mediaplayer dbus
&lt;br&gt;&amp;gt; specification MPRIS [1], which I consider worth to implement (so that
&lt;br&gt;&amp;gt; we don't add yet another dbus interface for common functionality).
&lt;br&gt;&lt;br&gt;I fully agree, it' good to have standards.
&lt;br&gt;&lt;br&gt;&amp;gt; I've committed preliminary support to svn (the &amp;quot;root&amp;quot; object).
&lt;br&gt;&lt;br&gt;nice, I'll take it as a starting point.
&lt;br&gt;&lt;br&gt;&amp;gt; Could you please adapt your patch to that concept (i.e. add a tracklist and
&lt;br&gt;&amp;gt; player object; in case of need just method stubs)? 
&lt;br&gt;ok, no problem :) Yes for the beginning I will for sure leave some stubs
&lt;br&gt;for the more difficult functions, which can be implemented later...
&lt;br&gt;&lt;br&gt;&amp;gt; I'm aware of the
&lt;br&gt;&amp;gt; fact that the actions defined in that specification don't 100% map
&lt;br&gt;&amp;gt; Kaffeine's actions (e.g. Play() doing a rewind to the beginning of a
&lt;br&gt;&amp;gt; track), so you don't have to care about those details if you don't
&lt;br&gt;&amp;gt; want to do. I also know that not every mpris thing is possible
&lt;br&gt;&amp;gt; (especially the tracklist parts needs more work) and that there's not
&lt;br&gt;&amp;gt; a mpris thing for every action Kaffeine is able to perform (put them
&lt;br&gt;&amp;gt; in a separate object for now).
&lt;br&gt;I'll see what I can do, I already began to port my stuff yesterday... I
&lt;br&gt;would put methods like playPause() or increaseVolume() into the /Player
&lt;br&gt;object even if they are not included in the mpris-specs, because
&lt;br&gt;everything else would be very confusing... All the methods related to
&lt;br&gt;the display (fullscreen, aspect-ratio) could come into an object named
&lt;br&gt;/Display, and all the DVB-related stuff into an object /DVB. This can be
&lt;br&gt;changed very easily later anyway......
&lt;br&gt;&lt;br&gt;In my last patch I forgot a function like the setNumber() function in
&lt;br&gt;kaffeine 0.8 (with a timer for the input of numbers with more than one
&lt;br&gt;digit), which is very important for the use with a remote control. I
&lt;br&gt;will add this, and also a dbus-function to show/hide EPG information,
&lt;br&gt;which I forgot too...
&lt;br&gt;&lt;br&gt;I must say it's really nice to work on kaffeine, because it's codebase
&lt;br&gt;is very well structured and comprehensible, I got into it very fast.
&lt;br&gt;I'll try to not mess it up too much ;)
&lt;br&gt;&lt;br&gt;&lt;br&gt;cheers,
&lt;br&gt;Pascal
&lt;br&gt;&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26279905&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/dbus-support-for-kaffeine-tp26128565p26279905.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26256027</id>
	<title>Re: dbus support for kaffeine</title>
	<published>2009-11-08T09:46:03Z</published>
	<updated>2009-11-08T09:46:03Z</updated>
	<author>
		<name>Bugzilla from christophpfister@gmail.com</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;&lt;br&gt;2009/11/6 Pascal Pollet &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26256027&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pascal@...&lt;/a&gt;&amp;gt;:
&lt;br&gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; here is what I've done so far, I think it should add enough d-bus to make
&lt;br&gt;&amp;gt; most users happy, including me :) Please look at it and tell me what you
&lt;br&gt;&amp;gt; think of it...
&lt;br&gt;&lt;br&gt;It's a very good starting point. There exists a mediaplayer dbus
&lt;br&gt;specification MPRIS [1], which I consider worth to implement (so that
&lt;br&gt;we don't add yet another dbus interface for common functionality).
&lt;br&gt;I've committed preliminary support to svn (the &amp;quot;root&amp;quot; object). Could
&lt;br&gt;you please adapt your patch to that concept (i.e. add a tracklist and
&lt;br&gt;player object; in case of need just method stubs)? I'm aware of the
&lt;br&gt;fact that the actions defined in that specification don't 100% map
&lt;br&gt;Kaffeine's actions (e.g. Play() doing a rewind to the beginning of a
&lt;br&gt;track), so you don't have to care about those details if you don't
&lt;br&gt;want to do. I also know that not every mpris thing is possible
&lt;br&gt;(especially the tracklist parts needs more work) and that there's not
&lt;br&gt;a mpris thing for every action Kaffeine is able to perform (put them
&lt;br&gt;in a separate object for now).
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; There is one problem left, when selecting a new DVB-channel directly by name
&lt;br&gt;&amp;gt; or by number, with the (new) functions:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; dvbTab::setChannel(const QString &amp;name)
&lt;br&gt;&amp;gt; and
&lt;br&gt;&amp;gt; DvbTab::setChannel(int number)
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; changing the channel works, but I didn't manage to have the selection
&lt;br&gt;&amp;gt; changed to the new channel in the DvbChannelView tree. I don't know how to
&lt;br&gt;&amp;gt; get a valid QModelIndex that points to the correct DvbChannelModel. Please
&lt;br&gt;&amp;gt; look at the code and at my comments in DvbTab::setChannel(int number). I
&lt;br&gt;&amp;gt; tried almost everything and thereby learned a lot about the model / view
&lt;br&gt;&amp;gt; concept of Qt, but it didn't help me to find the solution... Maybe you
&lt;br&gt;&amp;gt; already know this probem Christoph, because there is the same issue when
&lt;br&gt;&amp;gt; kaffeine gets started with the &amp;quot;--tv &amp;lt;channel&amp;gt;&amp;quot; flag: it simply calls
&lt;br&gt;&amp;gt; DvbTab::playChannel(const QString &amp;name), but it does not select the channel
&lt;br&gt;&amp;gt; in the DvbChannelView. The problem is that afterwards, calls to
&lt;br&gt;&amp;gt; MediaWidget::previous() and next() have no effect, because the currently
&lt;br&gt;&amp;gt; selected channel is not known. I hope that someone more clever than me will
&lt;br&gt;&amp;gt; solve this issue ;)
&lt;/div&gt;&lt;br&gt;Yes, this one is trickier. Note that there exists a similar problem
&lt;br&gt;e.g. with playPause(): you also need to update the ui state.
&lt;br&gt;&lt;br&gt;&amp;gt; cheers,
&lt;br&gt;&amp;gt; Pascal
&lt;br&gt;&lt;br&gt;Thanks,
&lt;br&gt;&lt;br&gt;Christoph
&lt;br&gt;&lt;br&gt;&lt;br&gt;[1] &lt;a href=&quot;http://wiki.xmms2.xmms.se/wiki/MPRIS&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://wiki.xmms2.xmms.se/wiki/MPRIS&lt;/a&gt;&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26256027&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/dbus-support-for-kaffeine-tp26128565p26256027.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26246925</id>
	<title>Re: dbus support for kaffeine</title>
	<published>2009-11-07T09:40:11Z</published>
	<updated>2009-11-07T09:40:11Z</updated>
	<author>
		<name>Bugzilla from christophpfister@gmail.com</name>
	</author>
	<content type="html">2009/11/6 Pascal Pollet &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26246925&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pascal@...&lt;/a&gt;&amp;gt;:
&lt;br&gt;&amp;lt;snip&amp;gt;
&lt;br&gt;&amp;gt; I don't think you need to care about this Christoph, I already reported this
&lt;br&gt;&amp;gt; bug to sourceforge : bug #6149
&lt;br&gt;&lt;br&gt;Thanks for the update.
&lt;br&gt;&lt;br&gt;&amp;gt; cheers,
&lt;br&gt;&amp;gt; Pascal
&lt;br&gt;&lt;br&gt;Christoph
&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26246925&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/dbus-support-for-kaffeine-tp26128565p26246925.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26230137</id>
	<title>Re: dbus support for kaffeine</title>
	<published>2009-11-06T03:03:03Z</published>
	<updated>2009-11-06T03:03:03Z</updated>
	<author>
		<name>Pascal Pollet</name>
	</author>
	<content type="html">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;meta content=&quot;text/html;charset=UTF-8&quot; http-equiv=&quot;Content-Type&quot;&gt;
&lt;/head&gt;
&lt;body bgcolor=&quot;#ffffff&quot; text=&quot;#000000&quot;&gt;
sorry, in my 2 last mails I forgot to respond to this:&lt;br&gt;
&lt;br&gt;
&lt;blockquote type=&quot;cite&quot;&gt;
  &lt;pre wrap=&quot;&quot;&gt;I sent an email to this mailing list with a patch attached one hour ago,
but now I looked at the mailing list archive
(&lt;a class=&quot;moz-txt-link-freetext&quot; href=&quot;http://sourceforge.net/mailarchive/forum.php?forum_name=kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://sourceforge.net/mailarchive/forum.php?forum_name=kaffeine-devel&lt;/a&gt;),
and it seems that only the patch reached the mailing list, and not the
body of the email.
    
      
  &lt;/pre&gt;
  &lt;blockquote type=&quot;cite&quot;&gt;
    &lt;pre wrap=&quot;&quot;&gt;Right, there seems to be a problem (I'll take care of it).&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;br&gt;
I don't think you need to care about this Christoph, I already reported
this bug to sourceforge : bug #6149&lt;br&gt;
&lt;br&gt;
cheers,&lt;br&gt;
Pascal&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Pascal Pollet schrieb:
&lt;blockquote cite=&quot;mid:4AF3F23A.4050907@bongosoft.de&quot; type=&quot;cite&quot;&gt;
  &lt;pre wrap=&quot;&quot;&gt;Hi,

here is what I've done so far, I think it should add enough d-bus to
make most users happy, including me :) Please look at it and tell me
what you think of it...

There is one problem left, when selecting a new DVB-channel directly by
name or by number, with the (new) functions:

dvbTab::setChannel(const QString &amp;amp;name)
and
DvbTab::setChannel(int number)

changing the channel works, but I didn't manage to have the selection
changed to the new channel in the DvbChannelView tree. I don't know how
to get a valid QModelIndex that points to the correct DvbChannelModel.
Please look at the code and at my comments in DvbTab::setChannel(int
number). I tried almost everything and thereby learned a lot about the
model / view concept of Qt, but it didn't help me to find the
solution... Maybe you already know this probem Christoph, because there
is the same issue when kaffeine gets started with the &quot;--tv &amp;lt;channel&amp;gt;&quot;
flag: it simply calls DvbTab::playChannel(const QString &amp;amp;name), but it
does not select the channel in the DvbChannelView. The problem is that
afterwards, calls to MediaWidget::previous() and next() have no effect,
because the currently selected channel is not known. I hope that someone
more clever than me will solve this issue ;)

cheers,
Pascal







Pascal Pollet schrieb:
  &lt;/pre&gt;
  &lt;blockquote type=&quot;cite&quot;&gt;
    &lt;pre wrap=&quot;&quot;&gt;Thank you for your feedback Christoph, I'll consider the points you
mentioned and try to implement the complete dbus-functionality in the
very near future. Maybe I'll come up with some questions if things are
unclear, we'll see :)

cheers,
Pascal


Christoph Pfister schrieb:
  
    &lt;/pre&gt;
    &lt;blockquote type=&quot;cite&quot;&gt;
      &lt;pre wrap=&quot;&quot;&gt;2009/10/30 Pascal Pollet &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26230137&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pascal@...&lt;/a&gt;:
  
    
      &lt;/pre&gt;
      &lt;blockquote type=&quot;cite&quot;&gt;
        &lt;pre wrap=&quot;&quot;&gt;Hi,

I sent an email to this mailing list with a patch attached one hour ago,
but now I looked at the mailing list archive
(&lt;a class=&quot;moz-txt-link-freetext&quot; href=&quot;http://sourceforge.net/mailarchive/forum.php?forum_name=kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://sourceforge.net/mailarchive/forum.php?forum_name=kaffeine-devel&lt;/a&gt;),
and it seems that only the patch reached the mailing list, and not the
body of the email.
    
      
        &lt;/pre&gt;
      &lt;/blockquote&gt;
      &lt;pre wrap=&quot;&quot;&gt;Right, there seems to be a problem (I'll take care of it).

  
    
      &lt;/pre&gt;
      &lt;blockquote type=&quot;cite&quot;&gt;
        &lt;pre wrap=&quot;&quot;&gt;Is this maybe a sourceforge bug? So I send the mail
again, without the patch this time:


Hello guys,

I am since the very beginning of kaffeine a great fan of this
application and use it for watching movies and TV. In the new version, I
miss a dbus interface to be able to use my remote control for watching
TV. As I know a little bit of C++ and Qt, I decided to implement the
dbus features for kaffeine, btw. giving me the occasion to learn how to
do this. Here is a small patch which makes two functions of dvbtab.cpp
available for dbus: previousChannel() and nextChannel(). It is just a
minimal proof of principle, to show you how I would implement the dbus
functionality. I would be really happy to contribute to this cool
project, so if you are interested in my code, please tell me. I would
add dbus support for all functions which should be accessible from the
outside world.
    
      
        &lt;/pre&gt;
      &lt;/blockquote&gt;
      &lt;pre wrap=&quot;&quot;&gt;I appreciate contributions (I have to code less; you learn something
;-). See below for a (short, I'm sorry) feedback.

  
    
      &lt;/pre&gt;
      &lt;blockquote type=&quot;cite&quot;&gt;
        &lt;pre wrap=&quot;&quot;&gt;For my developer background, I like to contribute with mostly small
patches to various open-source projects, and I am the guy from this
project: &lt;a class=&quot;moz-txt-link-freetext&quot; href=&quot;http://www.bongosoft.de&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.bongosoft.de&lt;/a&gt; (german page!).
Newly, I also started this one:
&lt;a class=&quot;moz-txt-link-freetext&quot; href=&quot;http://www.kde-look.org/content/show.php/Babeleo+translator?content=110491&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.kde-look.org/content/show.php/Babeleo+translator?content=110491&lt;/a&gt;
In &quot;real life&quot; I am about to finalize a Ph.D. in bioinformatics in the
nice town of Freiburg/Germany...

I am both French and German, so you can talk to me in any of these
languages, naturally also in English.

The patch is against revision 1042616 of the SVN tree.

greetings,
Pascal
    
      
        &lt;/pre&gt;
      &lt;/blockquote&gt;
      &lt;pre wrap=&quot;&quot;&gt;  
    
      &lt;/pre&gt;
      &lt;blockquote type=&quot;cite&quot;&gt;
        &lt;pre wrap=&quot;&quot;&gt;diff -Naur ../kaffeine_ori/src/CMakeLists.txt ./src/CMakeLists.txt
--- ../kaffeine_ori/src/CMakeLists.txt  2009-10-30 10:34:30.000000000 +0100
+++ ./src/CMakeLists.txt        2009-10-30 11:08:47.000000000 +0100
@@ -2,6 +2,7 @@
    dvb/dvbchannel.cpp
    dvb/dvbchannelui.cpp
    dvb/dvbconfigdialog.cpp
+    dvb/dvbdbusadaptor.cpp
    
      
        &lt;/pre&gt;
      &lt;/blockquote&gt;
      &lt;pre wrap=&quot;&quot;&gt;please place the file in the src/ directory and call it dbusadaptor.cpp

  
    
      &lt;/pre&gt;
      &lt;blockquote type=&quot;cite&quot;&gt;
        &lt;pre wrap=&quot;&quot;&gt;    dvb/dvbdevice.cpp
    dvb/dvbepg.cpp
    dvb/dvbmanager.cpp
diff -Naur ../kaffeine_ori/src/dvb/dvbdbusadaptor.h ./src/dvb/dvbdbusadaptor.h
--- ../kaffeine_ori/src/dvb/dvbdbusadaptor.h    1970-01-01 01:00:00.000000000 +0100
+++ ./src/dvb/dvbdbusadaptor.h  2009-10-30 11:08:47.000000000 +0100
@@ -0,0 +1,19 @@
    
      
        &lt;/pre&gt;
      &lt;/blockquote&gt;
      &lt;pre wrap=&quot;&quot;&gt;use a header include guard =
#ifndef DBUSADAPTOR_H
#define DBUSADAPTOR_H

...

#endif

  
    
      &lt;/pre&gt;
      &lt;blockquote type=&quot;cite&quot;&gt;
        &lt;pre wrap=&quot;&quot;&gt;+#include &amp;lt;QDBusAbstractAdaptor&amp;gt;
+
+class DvbTab;
+
+class dvbdbusadaptor: public QDBusAbstractAdaptor
+{
+       Q_OBJECT
+       Q_CLASSINFO(&quot;D-Bus Interface&quot;, &quot;org.kde.kaffeine&quot;)
+
+private:
+       DvbTab* dtab;
+
+public:
+       dvbdbusadaptor(QWidget* dvbTab);
+
+public slots:
+       void nextTvChannel();
+       void previousTvChannel();
    
      
        &lt;/pre&gt;
      &lt;/blockquote&gt;
      &lt;pre wrap=&quot;&quot;&gt;please call those slots previous() and next()

  
    
      &lt;/pre&gt;
      &lt;blockquote type=&quot;cite&quot;&gt;
        &lt;pre wrap=&quot;&quot;&gt;+};
diff -Naur ../kaffeine_ori/src/dvb/dvbdbusadaptor.cpp ./src/dvb/dvbdbusadaptor.cpp
--- ../kaffeine_ori/src/dvb/dvbdbusadaptor.cpp  1970-01-01 01:00:00.000000000 +0100
+++ ./src/dvb/dvbdbusadaptor.cpp        2009-10-30 11:08:47.000000000 +0100
@@ -0,0 +1,19 @@
+#include &quot;dvbdbusadaptor.h&quot;
+#include &quot;dvbtab.h&quot;
+
+
+dvbdbusadaptor::dvbdbusadaptor(QWidget* dvbtab)
+: QDBusAbstractAdaptor(dvbtab)
+{
+       dtab = dynamic_cast&amp;lt;DvbTab*&amp;gt;(dvbtab);
    
      
        &lt;/pre&gt;
      &lt;/blockquote&gt;
      &lt;pre wrap=&quot;&quot;&gt;avoid dynamic casts

  
    
      &lt;/pre&gt;
      &lt;blockquote type=&quot;cite&quot;&gt;
        &lt;pre wrap=&quot;&quot;&gt;+}
+
+Q_NOREPLY void dvbdbusadaptor::previousTvChannel()
+{
+       dtab-&amp;gt;previousChannel();
    
      
        &lt;/pre&gt;
      &lt;/blockquote&gt;
      &lt;pre wrap=&quot;&quot;&gt;call mediaWidget-&amp;gt;previous()

  
    
      &lt;/pre&gt;
      &lt;blockquote type=&quot;cite&quot;&gt;
        &lt;pre wrap=&quot;&quot;&gt;+}
+
+Q_NOREPLY void dvbdbusadaptor::nextTvChannel()
+{
+       dtab-&amp;gt;nextChannel();
    
      
        &lt;/pre&gt;
      &lt;/blockquote&gt;
      &lt;pre wrap=&quot;&quot;&gt;call mediaWidget-&amp;gt;next()

  
    
      &lt;/pre&gt;
      &lt;blockquote type=&quot;cite&quot;&gt;
        &lt;pre wrap=&quot;&quot;&gt;+}
diff -Naur ../kaffeine_ori/src/dvb/dvbtab.cpp ./src/dvb/dvbtab.cpp
--- ../kaffeine_ori/src/dvb/dvbtab.cpp  2009-10-30 10:34:30.000000000 +0100
+++ ./src/dvb/dvbtab.cpp        2009-10-30 11:08:47.000000000 +0100
@@ -21,6 +21,7 @@
 #include &quot;dvbtab.h&quot;

 #include &amp;lt;QBoxLayout&amp;gt;
+#include &amp;lt;QDBusConnection&amp;gt;
 #include &amp;lt;QDir&amp;gt;
 #include &amp;lt;QHeaderView&amp;gt;
 #include &amp;lt;QPainter&amp;gt;
@@ -37,6 +38,7 @@
 #include &quot;../osdwidget.h&quot;
 #include &quot;dvbchannelui.h&quot;
 #include &quot;dvbconfigdialog.h&quot;
+#include &quot;dvbdbusadaptor.h&quot;
 #include &quot;dvbepg.h&quot;
 #include &quot;dvbmanager.h&quot;
 #include &quot;dvbrecording.h&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26230137&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;@...&lt;/a&gt;/DVB&quot;, this);
+       QDBusConnection::sessionBus().registerService(&quot;org.kde.kaffeine&quot;);
    
      
        &lt;/pre&gt;
      &lt;/blockquote&gt;
      &lt;pre wrap=&quot;&quot;&gt;initialise the adapter from Kaffeine::Kaffeine()

  
    
      &lt;/pre&gt;
      &lt;blockquote type=&quot;cite&quot;&gt;
        &lt;pre wrap=&quot;&quot;&gt; }

 DvbTab::~DvbTab()
diff -Naur ../kaffeine_ori/src/dvb/dvbtab.h ./src/dvb/dvbtab.h
--- ../kaffeine_ori/src/dvb/dvbtab.h    2009-10-30 10:34:30.000000000 +0100
+++ ./src/dvb/dvbtab.h  2009-10-30 11:08:47.000000000 +0100
@@ -42,6 +42,8 @@
 class DvbTab : public TabBase
 {
       Q_OBJECT
+       friend class dvbdbusadaptor;
+
 public:
       DvbTab(KMenu *menu, KActionCollection *collection, MediaWidget *mediaWidget_);
       ~DvbTab();
    
      
        &lt;/pre&gt;
      &lt;/blockquote&gt;
      &lt;pre wrap=&quot;&quot;&gt;Thanks,

Christoph

  
    
      &lt;/pre&gt;
    &lt;/blockquote&gt;
    &lt;pre wrap=&quot;&quot;&gt;  
    &lt;/pre&gt;
  &lt;/blockquote&gt;
  &lt;pre wrap=&quot;&quot;&gt;&lt;!----&gt;
  &lt;/pre&gt;
&lt;/blockquote&gt;
&lt;/body&gt;
&lt;/html&gt;
&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26230137&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/dbus-support-for-kaffeine-tp26128565p26230137.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26229329</id>
	<title>Re: dbus support for kaffeine</title>
	<published>2009-11-06T01:54:02Z</published>
	<updated>2009-11-06T01:54:02Z</updated>
	<author>
		<name>Pascal Pollet</name>
	</author>
	<content type="html">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;meta content=&quot;text/html;charset=UTF-8&quot; http-equiv=&quot;Content-Type&quot;&gt;
&lt;/head&gt;
&lt;body bgcolor=&quot;#ffffff&quot; text=&quot;#000000&quot;&gt;
Hi,&lt;br&gt;
&lt;br&gt;
here is what I've done so far, I think it should add enough d-bus to
make most users happy, including me :) Please look at it and tell me
what you think of it...&lt;br&gt;
&lt;br&gt;
There is one problem left, when selecting a new DVB-channel directly by
name or by number, with the (new) functions:&lt;br&gt;
&lt;br&gt;
dvbTab::setChannel(const QString &amp;amp;name)&lt;br&gt;
and&lt;br&gt;
DvbTab::setChannel(int number)&lt;br&gt;
&lt;br&gt;
changing the channel works, but I didn't manage to have the selection
changed to the new channel in the DvbChannelView tree. I don't know how
to get a valid QModelIndex that points to the correct DvbChannelModel.
Please look at the code and at my comments in DvbTab::setChannel(int
number). I tried almost everything and thereby learned a lot about the
model / view concept of Qt, but it didn't help me to find the
solution... Maybe you already know this probem Christoph, because there
is the same issue when kaffeine gets started with the &quot;--tv
&amp;lt;channel&amp;gt;&quot; flag: it simply calls DvbTab::playChannel(const
QString &amp;amp;name), but it does not select the channel in the
DvbChannelView. The problem is that afterwards, calls to
MediaWidget::previous() and next() have no effect, because the
currently selected channel is not known. I hope that someone more
clever than me will solve this issue ;)&lt;br&gt;
&lt;br&gt;
cheers,&lt;br&gt;
Pascal&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Pascal Pollet schrieb:
&lt;blockquote cite=&quot;mid:4AEEA8D4.4060408@bongosoft.de&quot; type=&quot;cite&quot;&gt;
  &lt;pre wrap=&quot;&quot;&gt;Thank you for your feedback Christoph, I'll consider the points you
mentioned and try to implement the complete dbus-functionality in the
very near future. Maybe I'll come up with some questions if things are
unclear, we'll see :)

cheers,
Pascal


Christoph Pfister schrieb:
  &lt;/pre&gt;
  &lt;blockquote type=&quot;cite&quot;&gt;
    &lt;pre wrap=&quot;&quot;&gt;2009/10/30 Pascal Pollet &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26229329&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pascal@...&lt;/a&gt;:
  
    &lt;/pre&gt;
    &lt;blockquote type=&quot;cite&quot;&gt;
      &lt;pre wrap=&quot;&quot;&gt;Hi,

I sent an email to this mailing list with a patch attached one hour ago,
but now I looked at the mailing list archive
(&lt;a class=&quot;moz-txt-link-freetext&quot; href=&quot;http://sourceforge.net/mailarchive/forum.php?forum_name=kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://sourceforge.net/mailarchive/forum.php?forum_name=kaffeine-devel&lt;/a&gt;),
and it seems that only the patch reached the mailing list, and not the
body of the email.
    
      &lt;/pre&gt;
    &lt;/blockquote&gt;
    &lt;pre wrap=&quot;&quot;&gt;Right, there seems to be a problem (I'll take care of it).

  
    &lt;/pre&gt;
    &lt;blockquote type=&quot;cite&quot;&gt;
      &lt;pre wrap=&quot;&quot;&gt;Is this maybe a sourceforge bug? So I send the mail
again, without the patch this time:


Hello guys,

I am since the very beginning of kaffeine a great fan of this
application and use it for watching movies and TV. In the new version, I
miss a dbus interface to be able to use my remote control for watching
TV. As I know a little bit of C++ and Qt, I decided to implement the
dbus features for kaffeine, btw. giving me the occasion to learn how to
do this. Here is a small patch which makes two functions of dvbtab.cpp
available for dbus: previousChannel() and nextChannel(). It is just a
minimal proof of principle, to show you how I would implement the dbus
functionality. I would be really happy to contribute to this cool
project, so if you are interested in my code, please tell me. I would
add dbus support for all functions which should be accessible from the
outside world.
    
      &lt;/pre&gt;
    &lt;/blockquote&gt;
    &lt;pre wrap=&quot;&quot;&gt;I appreciate contributions (I have to code less; you learn something
;-). See below for a (short, I'm sorry) feedback.

  
    &lt;/pre&gt;
    &lt;blockquote type=&quot;cite&quot;&gt;
      &lt;pre wrap=&quot;&quot;&gt;For my developer background, I like to contribute with mostly small
patches to various open-source projects, and I am the guy from this
project: &lt;a class=&quot;moz-txt-link-freetext&quot; href=&quot;http://www.bongosoft.de&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.bongosoft.de&lt;/a&gt; (german page!).
Newly, I also started this one:
&lt;a class=&quot;moz-txt-link-freetext&quot; href=&quot;http://www.kde-look.org/content/show.php/Babeleo+translator?content=110491&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.kde-look.org/content/show.php/Babeleo+translator?content=110491&lt;/a&gt;
In &quot;real life&quot; I am about to finalize a Ph.D. in bioinformatics in the
nice town of Freiburg/Germany...

I am both French and German, so you can talk to me in any of these
languages, naturally also in English.

The patch is against revision 1042616 of the SVN tree.

greetings,
Pascal
    
      &lt;/pre&gt;
    &lt;/blockquote&gt;
    &lt;pre wrap=&quot;&quot;&gt;  
    &lt;/pre&gt;
    &lt;blockquote type=&quot;cite&quot;&gt;
      &lt;pre wrap=&quot;&quot;&gt;diff -Naur ../kaffeine_ori/src/CMakeLists.txt ./src/CMakeLists.txt
--- ../kaffeine_ori/src/CMakeLists.txt  2009-10-30 10:34:30.000000000 +0100
+++ ./src/CMakeLists.txt        2009-10-30 11:08:47.000000000 +0100
@@ -2,6 +2,7 @@
    dvb/dvbchannel.cpp
    dvb/dvbchannelui.cpp
    dvb/dvbconfigdialog.cpp
+    dvb/dvbdbusadaptor.cpp
    
      &lt;/pre&gt;
    &lt;/blockquote&gt;
    &lt;pre wrap=&quot;&quot;&gt;please place the file in the src/ directory and call it dbusadaptor.cpp

  
    &lt;/pre&gt;
    &lt;blockquote type=&quot;cite&quot;&gt;
      &lt;pre wrap=&quot;&quot;&gt;    dvb/dvbdevice.cpp
    dvb/dvbepg.cpp
    dvb/dvbmanager.cpp
diff -Naur ../kaffeine_ori/src/dvb/dvbdbusadaptor.h ./src/dvb/dvbdbusadaptor.h
--- ../kaffeine_ori/src/dvb/dvbdbusadaptor.h    1970-01-01 01:00:00.000000000 +0100
+++ ./src/dvb/dvbdbusadaptor.h  2009-10-30 11:08:47.000000000 +0100
@@ -0,0 +1,19 @@
    
      &lt;/pre&gt;
    &lt;/blockquote&gt;
    &lt;pre wrap=&quot;&quot;&gt;use a header include guard =
#ifndef DBUSADAPTOR_H
#define DBUSADAPTOR_H

...

#endif

  
    &lt;/pre&gt;
    &lt;blockquote type=&quot;cite&quot;&gt;
      &lt;pre wrap=&quot;&quot;&gt;+#include &amp;lt;QDBusAbstractAdaptor&amp;gt;
+
+class DvbTab;
+
+class dvbdbusadaptor: public QDBusAbstractAdaptor
+{
+       Q_OBJECT
+       Q_CLASSINFO(&quot;D-Bus Interface&quot;, &quot;org.kde.kaffeine&quot;)
+
+private:
+       DvbTab* dtab;
+
+public:
+       dvbdbusadaptor(QWidget* dvbTab);
+
+public slots:
+       void nextTvChannel();
+       void previousTvChannel();
    
      &lt;/pre&gt;
    &lt;/blockquote&gt;
    &lt;pre wrap=&quot;&quot;&gt;please call those slots previous() and next()

  
    &lt;/pre&gt;
    &lt;blockquote type=&quot;cite&quot;&gt;
      &lt;pre wrap=&quot;&quot;&gt;+};
diff -Naur ../kaffeine_ori/src/dvb/dvbdbusadaptor.cpp ./src/dvb/dvbdbusadaptor.cpp
--- ../kaffeine_ori/src/dvb/dvbdbusadaptor.cpp  1970-01-01 01:00:00.000000000 +0100
+++ ./src/dvb/dvbdbusadaptor.cpp        2009-10-30 11:08:47.000000000 +0100
@@ -0,0 +1,19 @@
+#include &quot;dvbdbusadaptor.h&quot;
+#include &quot;dvbtab.h&quot;
+
+
+dvbdbusadaptor::dvbdbusadaptor(QWidget* dvbtab)
+: QDBusAbstractAdaptor(dvbtab)
+{
+       dtab = dynamic_cast&amp;lt;DvbTab*&amp;gt;(dvbtab);
    
      &lt;/pre&gt;
    &lt;/blockquote&gt;
    &lt;pre wrap=&quot;&quot;&gt;avoid dynamic casts

  
    &lt;/pre&gt;
    &lt;blockquote type=&quot;cite&quot;&gt;
      &lt;pre wrap=&quot;&quot;&gt;+}
+
+Q_NOREPLY void dvbdbusadaptor::previousTvChannel()
+{
+       dtab-&amp;gt;previousChannel();
    
      &lt;/pre&gt;
    &lt;/blockquote&gt;
    &lt;pre wrap=&quot;&quot;&gt;call mediaWidget-&amp;gt;previous()

  
    &lt;/pre&gt;
    &lt;blockquote type=&quot;cite&quot;&gt;
      &lt;pre wrap=&quot;&quot;&gt;+}
+
+Q_NOREPLY void dvbdbusadaptor::nextTvChannel()
+{
+       dtab-&amp;gt;nextChannel();
    
      &lt;/pre&gt;
    &lt;/blockquote&gt;
    &lt;pre wrap=&quot;&quot;&gt;call mediaWidget-&amp;gt;next()

  
    &lt;/pre&gt;
    &lt;blockquote type=&quot;cite&quot;&gt;
      &lt;pre wrap=&quot;&quot;&gt;+}
diff -Naur ../kaffeine_ori/src/dvb/dvbtab.cpp ./src/dvb/dvbtab.cpp
--- ../kaffeine_ori/src/dvb/dvbtab.cpp  2009-10-30 10:34:30.000000000 +0100
+++ ./src/dvb/dvbtab.cpp        2009-10-30 11:08:47.000000000 +0100
@@ -21,6 +21,7 @@
 #include &quot;dvbtab.h&quot;

 #include &amp;lt;QBoxLayout&amp;gt;
+#include &amp;lt;QDBusConnection&amp;gt;
 #include &amp;lt;QDir&amp;gt;
 #include &amp;lt;QHeaderView&amp;gt;
 #include &amp;lt;QPainter&amp;gt;
@@ -37,6 +38,7 @@
 #include &quot;../osdwidget.h&quot;
 #include &quot;dvbchannelui.h&quot;
 #include &quot;dvbconfigdialog.h&quot;
+#include &quot;dvbdbusadaptor.h&quot;
 #include &quot;dvbepg.h&quot;
 #include &quot;dvbmanager.h&quot;
 #include &quot;dvbrecording.h&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26229329&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;@...&lt;/a&gt;/DVB&quot;, this);
+       QDBusConnection::sessionBus().registerService(&quot;org.kde.kaffeine&quot;);
    
      &lt;/pre&gt;
    &lt;/blockquote&gt;
    &lt;pre wrap=&quot;&quot;&gt;initialise the adapter from Kaffeine::Kaffeine()

  
    &lt;/pre&gt;
    &lt;blockquote type=&quot;cite&quot;&gt;
      &lt;pre wrap=&quot;&quot;&gt; }

 DvbTab::~DvbTab()
diff -Naur ../kaffeine_ori/src/dvb/dvbtab.h ./src/dvb/dvbtab.h
--- ../kaffeine_ori/src/dvb/dvbtab.h    2009-10-30 10:34:30.000000000 +0100
+++ ./src/dvb/dvbtab.h  2009-10-30 11:08:47.000000000 +0100
@@ -42,6 +42,8 @@
 class DvbTab : public TabBase
 {
       Q_OBJECT
+       friend class dvbdbusadaptor;
+
 public:
       DvbTab(KMenu *menu, KActionCollection *collection, MediaWidget *mediaWidget_);
       ~DvbTab();
    
      &lt;/pre&gt;
    &lt;/blockquote&gt;
    &lt;pre wrap=&quot;&quot;&gt;Thanks,

Christoph

  
    &lt;/pre&gt;
  &lt;/blockquote&gt;
  &lt;pre wrap=&quot;&quot;&gt;&lt;!----&gt;
  &lt;/pre&gt;
&lt;/blockquote&gt;
&lt;/body&gt;
&lt;/html&gt;
&lt;br /&gt;diff -Naur ../kaffeine_ori/src/CMakeLists.txt ./src/CMakeLists.txt
&lt;br&gt;--- ../kaffeine_ori/src/CMakeLists.txt	2009-11-05 09:13:12.000000000 +0100
&lt;br&gt;+++ ./src/CMakeLists.txt	2009-11-05 23:26:07.000000000 +0100
&lt;br&gt;@@ -14,6 +14,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;playlist/playlistmodel.cpp
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;playlist/playlisttab.cpp
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;datetimeedit.cpp
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;dbusadaptor.cpp
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;kaffeine.cpp
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;main.cpp
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;mediawidget.cpp
&lt;br&gt;diff -Naur ../kaffeine_ori/src/dbusadaptor.cpp ./src/dbusadaptor.cpp
&lt;br&gt;--- ../kaffeine_ori/src/dbusadaptor.cpp	1970-01-01 01:00:00.000000000 +0100
&lt;br&gt;+++ ./src/dbusadaptor.cpp	2009-11-05 23:26:08.000000000 +0100
&lt;br&gt;@@ -0,0 +1,171 @@
&lt;br&gt;+#include &amp;quot;dbusadaptor.h&amp;quot;
&lt;br&gt;+#include &amp;quot;mediawidget.h&amp;quot;
&lt;br&gt;+
&lt;br&gt;+#include &amp;lt;KUrl&amp;gt;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+DbusAdaptor::DbusAdaptor(MediaWidget *mediaWidget_)
&lt;br&gt;+: QDBusAbstractAdaptor(mediaWidget_), mediaWidget(mediaWidget_)
&lt;br&gt;+{ }
&lt;br&gt;+
&lt;br&gt;+DbusAdaptor::~DbusAdaptor() { }
&lt;br&gt;+ 
&lt;br&gt;+void DbusAdaptor::previous()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;previous();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::playPause()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;playPause();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::next()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;next();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::toggleMuted()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;toggleMuted();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::increaseVolume()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;increaseVolume();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::decreaseVolume()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;decreaseVolume();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void &amp;nbsp;DbusAdaptor::changeAudioChannel(int index)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;changeAudioChannel(index);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void &amp;nbsp;DbusAdaptor::changeSubtitle(int index)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;changeSubtitle(index);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void &amp;nbsp;DbusAdaptor::changeVolume(int volume)
&lt;br&gt;+{
&lt;br&gt;+	if ( volume &amp;gt;= 0 &amp;&amp; volume &amp;lt;= 100 ) {
&lt;br&gt;+		mediaWidget-&amp;gt;changeVolume(volume);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::setDvbChannel(const QString &amp;name)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setDvbChannel(name);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::setDvbChannelNumber(int number)
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setDvbChannel(number);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::setDvbLastChannel()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;setDvbLastChannel();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::aspectRatioAuto()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;aspectRatioAuto();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::aspectRatio4_3()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;aspectRatio4_3();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::aspectRatio16_9()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;aspectRatio16_9();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::aspectRatioWidget()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;aspectRatioWidget();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::longSkipBackward()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;longSkipBackward();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::skipBackward()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;skipBackward();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::skipForward()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;skipForward();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::longSkipForward()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;longSkipForward();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::jumpToPosition()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;jumpToPosition();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::timeButtonClicked()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;timeButtonClicked();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::updateTimeButton()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;updateTimeButton();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::play(const QString &amp;url)
&lt;br&gt;+{
&lt;br&gt;+	KUrl kurl(url);
&lt;br&gt;+	if (kurl.isValid()) {
&lt;br&gt;+		mediaWidget-&amp;gt;play(kurl);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::playAudioCd()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;playAudioCd();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::playVideoCd()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;playVideoCd();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::playDvd()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;playDvd();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::stop()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;stop();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::stopDvb()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;stopDvb();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::toggleFullScreen()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;fullScreen();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DbusAdaptor::toggleInstantRecord()
&lt;br&gt;+{
&lt;br&gt;+	mediaWidget-&amp;gt;toggleInstantRecord();
&lt;br&gt;+}
&lt;br&gt;diff -Naur ../kaffeine_ori/src/dbusadaptor.h ./src/dbusadaptor.h
&lt;br&gt;--- ../kaffeine_ori/src/dbusadaptor.h	1970-01-01 01:00:00.000000000 +0100
&lt;br&gt;+++ ./src/dbusadaptor.h	2009-11-05 23:26:07.000000000 +0100
&lt;br&gt;@@ -0,0 +1,56 @@
&lt;br&gt;+#ifndef DBUSADAPTOR_H
&lt;br&gt;+#define DBUSADAPTOR_H
&lt;br&gt;+
&lt;br&gt;+#include &amp;lt;QDBusAbstractAdaptor&amp;gt;
&lt;br&gt;+#include &amp;lt;QString&amp;gt;
&lt;br&gt;+
&lt;br&gt;+class MediaWidget;
&lt;br&gt;+//class KUrl;
&lt;br&gt;+
&lt;br&gt;+class DbusAdaptor: public QDBusAbstractAdaptor
&lt;br&gt;+{
&lt;br&gt;+	Q_OBJECT
&lt;br&gt;+	Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.kde.kaffeine&amp;quot;)
&lt;br&gt;+
&lt;br&gt;+private:
&lt;br&gt;+	MediaWidget *mediaWidget;
&lt;br&gt;+
&lt;br&gt;+public:
&lt;br&gt;+	DbusAdaptor(MediaWidget *mediaWidget_);
&lt;br&gt;+	~DbusAdaptor();
&lt;br&gt;+ &amp;nbsp; 
&lt;br&gt;+public slots:
&lt;br&gt;+	void next();
&lt;br&gt;+	void previous();
&lt;br&gt;+	void playPause();
&lt;br&gt;+	void changeAudioChannel(int index);
&lt;br&gt;+	void changeSubtitle(int index);
&lt;br&gt;+	void setDvbChannel(const QString &amp;name);
&lt;br&gt;+	void setDvbChannelNumber(int number);
&lt;br&gt;+	void setDvbLastChannel();
&lt;br&gt;+	void toggleMuted();
&lt;br&gt;+	void changeVolume(int volume);
&lt;br&gt;+	void increaseVolume();
&lt;br&gt;+	void decreaseVolume();
&lt;br&gt;+	void aspectRatioAuto();
&lt;br&gt;+	void aspectRatio4_3();
&lt;br&gt;+	void aspectRatio16_9();
&lt;br&gt;+	void aspectRatioWidget();
&lt;br&gt;+	void longSkipBackward();
&lt;br&gt;+	void skipBackward();
&lt;br&gt;+	void skipForward();
&lt;br&gt;+	void longSkipForward();
&lt;br&gt;+	void jumpToPosition();
&lt;br&gt;+	void timeButtonClicked();
&lt;br&gt;+	void updateTimeButton();
&lt;br&gt;+	void play(const QString &amp;url);
&lt;br&gt;+	void playAudioCd();
&lt;br&gt;+	void playVideoCd();
&lt;br&gt;+	void playDvd();
&lt;br&gt;+	void stop();
&lt;br&gt;+	void stopDvb();
&lt;br&gt;+	void toggleFullScreen();
&lt;br&gt;+	void toggleInstantRecord();
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+#endif /* DBUSADAPTOR_H */
&lt;br&gt;diff -Naur ../kaffeine_ori/src/dvb/dvbtab.cpp ./src/dvb/dvbtab.cpp
&lt;br&gt;--- ../kaffeine_ori/src/dvb/dvbtab.cpp	2009-11-05 09:13:12.000000000 +0100
&lt;br&gt;+++ ./src/dvb/dvbtab.cpp	2009-11-05 23:26:07.000000000 +0100
&lt;br&gt;@@ -117,6 +117,10 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	connect(mediaWidget, SIGNAL(previousDvbChannel()), this, SLOT(previousChannel()));
&lt;br&gt;&amp;nbsp;	connect(mediaWidget, SIGNAL(nextDvbChannel()), this, SLOT(nextChannel()));
&lt;br&gt;+	connect(mediaWidget, SIGNAL(changeDvbChannel(const QString&amp;)), this, SLOT(setChannel(const QString&amp;)));
&lt;br&gt;+	connect(mediaWidget, SIGNAL(changeDvbChannel(int)), this, SLOT(setChannel(int)));
&lt;br&gt;+	connect(mediaWidget, SIGNAL(dvbLastChannel()), this, SLOT(setLastChannel()));
&lt;br&gt;+	connect(mediaWidget, SIGNAL(toggleInstantRecord()), this, SLOT(toggleInstantRecord()));
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	connect(manager-&amp;gt;getRecordingModel(), SIGNAL(instantRecordingRemoved()),
&lt;br&gt;&amp;nbsp;		this, SLOT(instantRecordingRemoved()));
&lt;br&gt;@@ -144,7 +148,7 @@
&lt;br&gt;&amp;nbsp;	channelView-&amp;gt;setRootIsDecorated(false);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	if (!channelView-&amp;gt;header()-&amp;gt;restoreState(QByteArray::fromBase64(
&lt;br&gt;-	 &amp;nbsp; &amp;nbsp;KGlobal::config()-&amp;gt;group(&amp;quot;DVB&amp;quot;).readEntry(&amp;quot;ChannelViewState&amp;quot;, QByteArray())))) {
&lt;br&gt;+		KGlobal::config()-&amp;gt;group(&amp;quot;DVB&amp;quot;).readEntry(&amp;quot;ChannelViewState&amp;quot;, QByteArray())))) {
&lt;br&gt;&amp;nbsp;		channelView-&amp;gt;sortByColumn(0, Qt::AscendingOrder);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -210,6 +214,11 @@
&lt;br&gt;&amp;nbsp;	playChannel(manager-&amp;gt;getChannelModel()-&amp;gt;channelForName(name));
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+void DvbTab::playChannel(int number)
&lt;br&gt;+{
&lt;br&gt;+	playChannel(manager-&amp;gt;getChannelModel()-&amp;gt;channelForNumber(number));
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void DvbTab::playLastChannel()
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	playChannel(KGlobal::config()-&amp;gt;group(&amp;quot;DVB&amp;quot;).readEntry(&amp;quot;LastChannel&amp;quot;));
&lt;br&gt;@@ -245,6 +254,19 @@
&lt;br&gt;&amp;nbsp;	dialog.exec();
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+void DvbTab::toggleInstantRecord()
&lt;br&gt;+{
&lt;br&gt;+	if (instantRecordAction-&amp;gt;isChecked()) {
&lt;br&gt;+		instantRecordAction-&amp;gt;setChecked(false);
&lt;br&gt;+		instantRecord(false);
&lt;br&gt;+	}
&lt;br&gt;+	else {
&lt;br&gt;+		instantRecordAction-&amp;gt;setChecked(true);
&lt;br&gt;+		instantRecord(true);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void DvbTab::instantRecord(bool checked)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	if (checked) {
&lt;br&gt;@@ -353,3 +375,35 @@
&lt;br&gt;&amp;nbsp;		manager-&amp;gt;getLiveView()-&amp;gt;playChannel(channel);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+void DvbTab::setChannel(const QString &amp;name)
&lt;br&gt;+{
&lt;br&gt;+	playChannel(name);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DvbTab::setChannel(int number)
&lt;br&gt;+{
&lt;br&gt;+	// with this way to get QModelIndex, the later setCurrentIndex(index) call does not work:
&lt;br&gt;+	//QModelIndex index = manager-&amp;gt;getChannelModel()-&amp;gt;index(number, 0);
&lt;br&gt;+
&lt;br&gt;+	// another way to obtain the QModelIndex, but doesn't work too:
&lt;br&gt;+	DvbChannelModel *channelModel = (DvbChannelModel*) channelView-&amp;gt;getModel();
&lt;br&gt;+	QModelIndex index = channelModel-&amp;gt;index(number, 0);
&lt;br&gt;+
&lt;br&gt;+	// for testing purposes, returns this runtime error (why?):
&lt;br&gt;+	// QSortFilterProxyModel: index from wrong model passed to mapToSource
&lt;br&gt;+	channelView-&amp;gt;mapToSource(index);
&lt;br&gt;+
&lt;br&gt;+	// Has no effect (index from wrong model?):
&lt;br&gt;+	channelView-&amp;gt;setCurrentIndex(index);
&lt;br&gt;+
&lt;br&gt;+	// at least this works
&lt;br&gt;+	playChannel(number);
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void DvbTab::setLastChannel()
&lt;br&gt;+{
&lt;br&gt;+	playLastChannel();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;diff -Naur ../kaffeine_ori/src/dvb/dvbtab.h ./src/dvb/dvbtab.h
&lt;br&gt;--- ../kaffeine_ori/src/dvb/dvbtab.h	2009-11-05 09:13:12.000000000 +0100
&lt;br&gt;+++ ./src/dvb/dvbtab.h	2009-11-05 23:26:07.000000000 +0100
&lt;br&gt;@@ -38,11 +38,13 @@
&lt;br&gt;&amp;nbsp;class DvbTab : public TabBase
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	Q_OBJECT
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;public:
&lt;br&gt;&amp;nbsp;	DvbTab(KMenu *menu, KActionCollection *collection, MediaWidget *mediaWidget_);
&lt;br&gt;&amp;nbsp;	~DvbTab();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	void playChannel(const QString &amp;name);
&lt;br&gt;+	void playChannel(int number);
&lt;br&gt;&amp;nbsp;	void playLastChannel();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	void enableDvbDump();
&lt;br&gt;@@ -52,12 +54,16 @@
&lt;br&gt;&amp;nbsp;	void showEpgDialog();
&lt;br&gt;&amp;nbsp;	void showRecordingDialog();
&lt;br&gt;&amp;nbsp;	void instantRecord(bool checked);
&lt;br&gt;+	void toggleInstantRecord();
&lt;br&gt;&amp;nbsp;	void instantRecordingRemoved();
&lt;br&gt;&amp;nbsp;	void configureDvb();
&lt;br&gt;&amp;nbsp;	void playLive(const QModelIndex &amp;index);
&lt;br&gt;&amp;nbsp;	void previousChannel();
&lt;br&gt;&amp;nbsp;	void nextChannel();
&lt;br&gt;&amp;nbsp;	void cleanTimeShiftFiles();
&lt;br&gt;+	void setChannel(const QString &amp;name);
&lt;br&gt;+	void setChannel(int number);
&lt;br&gt;+	void setLastChannel();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;private:
&lt;br&gt;&amp;nbsp;	void activate();
&lt;br&gt;diff -Naur ../kaffeine_ori/src/kaffeine.cpp ./src/kaffeine.cpp
&lt;br&gt;--- ../kaffeine_ori/src/kaffeine.cpp	2009-11-05 09:13:12.000000000 +0100
&lt;br&gt;+++ ./src/kaffeine.cpp	2009-11-05 23:26:08.000000000 +0100
&lt;br&gt;@@ -20,6 +20,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#include &amp;quot;kaffeine.h&amp;quot;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#include &amp;lt;QDBusConnection&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;QHoverEvent&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;QLabel&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;QSpinBox&amp;gt;
&lt;br&gt;@@ -38,6 +39,7 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;KToolBar&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;quot;dvb/dvbtab.h&amp;quot;
&lt;br&gt;&amp;nbsp;#include &amp;quot;playlist/playlisttab.h&amp;quot;
&lt;br&gt;+#include &amp;quot;dbusadaptor.h&amp;quot;
&lt;br&gt;&amp;nbsp;#include &amp;quot;mediawidget.h&amp;quot;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;class StartTab : public TabBase
&lt;br&gt;@@ -322,6 +324,11 @@
&lt;br&gt;&amp;nbsp;	// initialize random number generator
&lt;br&gt;&amp;nbsp;	qsrand(QTime().msecsTo(QTime::currentTime()));
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+	// initialize the dbus-adaptor 
&lt;br&gt;+	new DbusAdaptor(mediaWidget);
&lt;br&gt;+	QDBusConnection::sessionBus().registerObject(&amp;quot;/Player&amp;quot;, mediaWidget);
&lt;br&gt;+	QDBusConnection::sessionBus().registerService(&amp;quot;org.kde.kaffeine&amp;quot;);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	show();
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;diff -Naur ../kaffeine_ori/src/mediawidget.cpp ./src/mediawidget.cpp
&lt;br&gt;--- ../kaffeine_ori/src/mediawidget.cpp	2009-11-05 09:13:12.000000000 +0100
&lt;br&gt;+++ ./src/mediawidget.cpp	2009-11-05 23:26:08.000000000 +0100
&lt;br&gt;@@ -543,6 +543,32 @@
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+void MediaWidget::setDvbChannel(int number)
&lt;br&gt;+{
&lt;br&gt;+	if (dvbFeed != NULL) {
&lt;br&gt;+		emit changeDvbChannel(number);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setDvbChannel(const QString &amp;name)
&lt;br&gt;+{
&lt;br&gt;+	if (dvbFeed != NULL) {
&lt;br&gt;+		emit changeDvbChannel(name);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::setDvbLastChannel()
&lt;br&gt;+{
&lt;br&gt;+	if (dvbFeed != NULL) {
&lt;br&gt;+		emit dvbLastChannel();
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+void MediaWidget::fullScreen()
&lt;br&gt;+{
&lt;br&gt;+	emit toggleFullScreen();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void MediaWidget::stateChanged(Phonon::State state)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	bool newPlaying = false;
&lt;br&gt;@@ -655,6 +681,15 @@
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+void MediaWidget::playPause() {
&lt;br&gt;+	if (actionPlayPause-&amp;gt;text() == textPlay) {
&lt;br&gt;+		playPause(false);
&lt;br&gt;+	}
&lt;br&gt;+	else {
&lt;br&gt;+		playPause(true);
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void MediaWidget::stop()
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	mediaObject-&amp;gt;stop();
&lt;br&gt;@@ -679,7 +714,9 @@
&lt;br&gt;&amp;nbsp;		if ((dvbFeed != NULL) &amp;&amp; !dvbFeed-&amp;gt;audioChannels.isEmpty()) {
&lt;br&gt;&amp;nbsp;			emit changeDvbAudioChannel(index);
&lt;br&gt;&amp;nbsp;		} else {
&lt;br&gt;-			mediaController-&amp;gt;setCurrentAudioChannel(audioChannels.at(index));
&lt;br&gt;+			if ( index &amp;gt;= 0 &amp;&amp; index &amp;lt; audioChannels.size() ) {
&lt;br&gt;+				mediaController-&amp;gt;setCurrentAudioChannel(audioChannels.at(index));
&lt;br&gt;+			}
&lt;br&gt;&amp;nbsp;		}
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;@@ -690,7 +727,9 @@
&lt;br&gt;&amp;nbsp;		if ((dvbFeed != NULL) &amp;&amp; !dvbFeed-&amp;gt;subtitles.isEmpty()) {
&lt;br&gt;&amp;nbsp;			emit changeDvbSubtitle(index);
&lt;br&gt;&amp;nbsp;		} else {
&lt;br&gt;-			mediaController-&amp;gt;setCurrentSubtitle(subtitles.at(index));
&lt;br&gt;+			if ( index &amp;gt;= 0 &amp;&amp; index &amp;lt; subtitles.size() ) {
&lt;br&gt;+				mediaController-&amp;gt;setCurrentSubtitle(subtitles.at(index));
&lt;br&gt;+			}
&lt;br&gt;&amp;nbsp;		}
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;diff -Naur ../kaffeine_ori/src/mediawidget.h ./src/mediawidget.h
&lt;br&gt;--- ../kaffeine_ori/src/mediawidget.h	2009-11-05 09:13:12.000000000 +0100
&lt;br&gt;+++ ./src/mediawidget.h	2009-11-05 23:26:07.000000000 +0100
&lt;br&gt;@@ -48,9 +48,11 @@
&lt;br&gt;&amp;nbsp;class MediaWidget : public QWidget
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	Q_OBJECT
&lt;br&gt;+	friend class DbusAdaptor;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;public:
&lt;br&gt;&amp;nbsp;	MediaWidget(KMenu *menu_, KAction *fullScreenAction, KToolBar *toolBar,
&lt;br&gt;-		 &amp;nbsp; &amp;nbsp;KActionCollection *collection, QWidget *parent);
&lt;br&gt;+			KActionCollection *collection, QWidget *parent);
&lt;br&gt;&amp;nbsp;	~MediaWidget();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	static QString extensionFilter(); // usable for KFileDialog::setFilter()
&lt;br&gt;@@ -98,14 +100,19 @@
&lt;br&gt;&amp;nbsp;	void startDvbTimeShift();
&lt;br&gt;&amp;nbsp;	void changeDvbAudioChannel(int index);
&lt;br&gt;&amp;nbsp;	void changeDvbSubtitle(int index);
&lt;br&gt;+	void changeDvbChannel(int number);
&lt;br&gt;+	void changeDvbChannel(const QString &amp;name);
&lt;br&gt;&amp;nbsp;	void dvbStopped();
&lt;br&gt;&amp;nbsp;	void osdKeyPressed(int key);
&lt;br&gt;+	void dvbLastChannel();
&lt;br&gt;+	void toggleInstantRecord();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;private slots:
&lt;br&gt;&amp;nbsp;	void stateChanged(Phonon::State state);
&lt;br&gt;&amp;nbsp;	void playbackFinished();
&lt;br&gt;&amp;nbsp;	void previous();
&lt;br&gt;&amp;nbsp;	void playPause(bool paused);
&lt;br&gt;+	void playPause();
&lt;br&gt;&amp;nbsp;	void next();
&lt;br&gt;&amp;nbsp;	void changeAudioChannel(int index);
&lt;br&gt;&amp;nbsp;	void changeSubtitle(int index);
&lt;br&gt;@@ -135,6 +142,11 @@
&lt;br&gt;&amp;nbsp;	void timeButtonClicked();
&lt;br&gt;&amp;nbsp;	void updateTimeButton();
&lt;br&gt;&amp;nbsp;	void updateCaption();
&lt;br&gt;+	void setDvbChannel(int number);
&lt;br&gt;+	void setDvbChannel(const QString &amp;name);
&lt;br&gt;+	void setDvbLastChannel();
&lt;br&gt;+	void fullScreen();
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	void titleCountChanged(int count);
&lt;br&gt;&amp;nbsp;	void chapterCountChanged(int count);
&lt;br&gt;diff -Naur ../kaffeine_ori/src/proxytreeview.cpp ./src/proxytreeview.cpp
&lt;br&gt;--- ../kaffeine_ori/src/proxytreeview.cpp	2009-11-05 09:13:12.000000000 +0100
&lt;br&gt;+++ ./src/proxytreeview.cpp	2009-11-05 23:26:07.000000000 +0100
&lt;br&gt;@@ -85,6 +85,11 @@
&lt;br&gt;&amp;nbsp;	proxyModel-&amp;gt;setSourceModel(model);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+QAbstractItemModel* ProxyTreeView::getModel()
&lt;br&gt;+{
&lt;br&gt;+	return proxyModel-&amp;gt;sourceModel();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void ProxyTreeView::contextMenuEvent(QContextMenuEvent *event)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	if (!currentIndex().isValid()) {
&lt;br&gt;diff -Naur ../kaffeine_ori/src/proxytreeview.h ./src/proxytreeview.h
&lt;br&gt;--- ../kaffeine_ori/src/proxytreeview.h	2009-11-05 09:13:12.000000000 +0100
&lt;br&gt;+++ ./src/proxytreeview.h	2009-11-05 23:26:08.000000000 +0100
&lt;br&gt;@@ -36,6 +36,7 @@
&lt;br&gt;&amp;nbsp;	QList&amp;lt;int&amp;gt; selectedRows() const;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	void setModel(QAbstractItemModel *model);
&lt;br&gt;+	QAbstractItemModel* getModel();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;protected:
&lt;br&gt;&amp;nbsp;	void contextMenuEvent(QContextMenuEvent *event);
&lt;br&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26229329&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/dbus-support-for-kaffeine-tp26128565p26229329.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26161077</id>
	<title>Re: dbus support for kaffeine</title>
	<published>2009-11-02T01:39:32Z</published>
	<updated>2009-11-02T01:39:32Z</updated>
	<author>
		<name>Pascal Pollet</name>
	</author>
	<content type="html">Thank you for your feedback Christoph, I'll consider the points you
&lt;br&gt;mentioned and try to implement the complete dbus-functionality in the
&lt;br&gt;very near future. Maybe I'll come up with some questions if things are
&lt;br&gt;unclear, we'll see :)
&lt;br&gt;&lt;br&gt;cheers,
&lt;br&gt;Pascal
&lt;br&gt;&lt;br&gt;&lt;br&gt;Christoph Pfister schrieb:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; 2009/10/30 Pascal Pollet &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26161077&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pascal@...&lt;/a&gt;&amp;gt;:
&lt;br&gt;&amp;gt; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; I sent an email to this mailing list with a patch attached one hour ago,
&lt;br&gt;&amp;gt;&amp;gt; but now I looked at the mailing list archive
&lt;br&gt;&amp;gt;&amp;gt; (&lt;a href=&quot;http://sourceforge.net/mailarchive/forum.php?forum_name=kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://sourceforge.net/mailarchive/forum.php?forum_name=kaffeine-devel&lt;/a&gt;),
&lt;br&gt;&amp;gt;&amp;gt; and it seems that only the patch reached the mailing list, and not the
&lt;br&gt;&amp;gt;&amp;gt; body of the email.
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Right, there seems to be a problem (I'll take care of it).
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt; Is this maybe a sourceforge bug? So I send the mail
&lt;br&gt;&amp;gt;&amp;gt; again, without the patch this time:
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Hello guys,
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; I am since the very beginning of kaffeine a great fan of this
&lt;br&gt;&amp;gt;&amp;gt; application and use it for watching movies and TV. In the new version, I
&lt;br&gt;&amp;gt;&amp;gt; miss a dbus interface to be able to use my remote control for watching
&lt;br&gt;&amp;gt;&amp;gt; TV. As I know a little bit of C++ and Qt, I decided to implement the
&lt;br&gt;&amp;gt;&amp;gt; dbus features for kaffeine, btw. giving me the occasion to learn how to
&lt;br&gt;&amp;gt;&amp;gt; do this. Here is a small patch which makes two functions of dvbtab.cpp
&lt;br&gt;&amp;gt;&amp;gt; available for dbus: previousChannel() and nextChannel(). It is just a
&lt;br&gt;&amp;gt;&amp;gt; minimal proof of principle, to show you how I would implement the dbus
&lt;br&gt;&amp;gt;&amp;gt; functionality. I would be really happy to contribute to this cool
&lt;br&gt;&amp;gt;&amp;gt; project, so if you are interested in my code, please tell me. I would
&lt;br&gt;&amp;gt;&amp;gt; add dbus support for all functions which should be accessible from the
&lt;br&gt;&amp;gt;&amp;gt; outside world.
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I appreciate contributions (I have to code less; you learn something
&lt;br&gt;&amp;gt; ;-). See below for a (short, I'm sorry) feedback.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt; For my developer background, I like to contribute with mostly small
&lt;br&gt;&amp;gt;&amp;gt; patches to various open-source projects, and I am the guy from this
&lt;br&gt;&amp;gt;&amp;gt; project: &lt;a href=&quot;http://www.bongosoft.de&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.bongosoft.de&lt;/a&gt;&amp;nbsp;(german page!).
&lt;br&gt;&amp;gt;&amp;gt; Newly, I also started this one:
&lt;br&gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://www.kde-look.org/content/show.php/Babeleo+translator?content=110491&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.kde-look.org/content/show.php/Babeleo+translator?content=110491&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt; In &amp;quot;real life&amp;quot; I am about to finalize a Ph.D. in bioinformatics in the
&lt;br&gt;&amp;gt;&amp;gt; nice town of Freiburg/Germany...
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; I am both French and German, so you can talk to me in any of these
&lt;br&gt;&amp;gt;&amp;gt; languages, naturally also in English.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; The patch is against revision 1042616 of the SVN tree.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; greetings,
&lt;br&gt;&amp;gt;&amp;gt; Pascal
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt; diff -Naur ../kaffeine_ori/src/CMakeLists.txt ./src/CMakeLists.txt
&lt;br&gt;&amp;gt;&amp;gt; --- ../kaffeine_ori/src/CMakeLists.txt &amp;nbsp;2009-10-30 10:34:30.000000000 +0100
&lt;br&gt;&amp;gt;&amp;gt; +++ ./src/CMakeLists.txt &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2009-10-30 11:08:47.000000000 +0100
&lt;br&gt;&amp;gt;&amp;gt; @@ -2,6 +2,7 @@
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; dvb/dvbchannel.cpp
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; dvb/dvbchannelui.cpp
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; dvb/dvbconfigdialog.cpp
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp;dvb/dvbdbusadaptor.cpp
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; please place the file in the src/ directory and call it dbusadaptor.cpp
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; dvb/dvbdevice.cpp
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; dvb/dvbepg.cpp
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; dvb/dvbmanager.cpp
&lt;br&gt;&amp;gt;&amp;gt; diff -Naur ../kaffeine_ori/src/dvb/dvbdbusadaptor.h ./src/dvb/dvbdbusadaptor.h
&lt;br&gt;&amp;gt;&amp;gt; --- ../kaffeine_ori/src/dvb/dvbdbusadaptor.h &amp;nbsp; &amp;nbsp;1970-01-01 01:00:00.000000000 +0100
&lt;br&gt;&amp;gt;&amp;gt; +++ ./src/dvb/dvbdbusadaptor.h &amp;nbsp;2009-10-30 11:08:47.000000000 +0100
&lt;br&gt;&amp;gt;&amp;gt; @@ -0,0 +1,19 @@
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; use a header include guard =
&lt;br&gt;&amp;gt; #ifndef DBUSADAPTOR_H
&lt;br&gt;&amp;gt; #define DBUSADAPTOR_H
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; ...
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; #endif
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt; +#include &amp;lt;QDBusAbstractAdaptor&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; +
&lt;br&gt;&amp;gt;&amp;gt; +class DvbTab;
&lt;br&gt;&amp;gt;&amp;gt; +
&lt;br&gt;&amp;gt;&amp;gt; +class dvbdbusadaptor: public QDBusAbstractAdaptor
&lt;br&gt;&amp;gt;&amp;gt; +{
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; Q_OBJECT
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.kde.kaffeine&amp;quot;)
&lt;br&gt;&amp;gt;&amp;gt; +
&lt;br&gt;&amp;gt;&amp;gt; +private:
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; DvbTab* dtab;
&lt;br&gt;&amp;gt;&amp;gt; +
&lt;br&gt;&amp;gt;&amp;gt; +public:
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; dvbdbusadaptor(QWidget* dvbTab);
&lt;br&gt;&amp;gt;&amp;gt; +
&lt;br&gt;&amp;gt;&amp;gt; +public slots:
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; void nextTvChannel();
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; void previousTvChannel();
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; please call those slots previous() and next()
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt; +};
&lt;br&gt;&amp;gt;&amp;gt; diff -Naur ../kaffeine_ori/src/dvb/dvbdbusadaptor.cpp ./src/dvb/dvbdbusadaptor.cpp
&lt;br&gt;&amp;gt;&amp;gt; --- ../kaffeine_ori/src/dvb/dvbdbusadaptor.cpp &amp;nbsp;1970-01-01 01:00:00.000000000 +0100
&lt;br&gt;&amp;gt;&amp;gt; +++ ./src/dvb/dvbdbusadaptor.cpp &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2009-10-30 11:08:47.000000000 +0100
&lt;br&gt;&amp;gt;&amp;gt; @@ -0,0 +1,19 @@
&lt;br&gt;&amp;gt;&amp;gt; +#include &amp;quot;dvbdbusadaptor.h&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; +#include &amp;quot;dvbtab.h&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; +
&lt;br&gt;&amp;gt;&amp;gt; +
&lt;br&gt;&amp;gt;&amp;gt; +dvbdbusadaptor::dvbdbusadaptor(QWidget* dvbtab)
&lt;br&gt;&amp;gt;&amp;gt; +: QDBusAbstractAdaptor(dvbtab)
&lt;br&gt;&amp;gt;&amp;gt; +{
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; dtab = dynamic_cast&amp;lt;DvbTab*&amp;gt;(dvbtab);
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; avoid dynamic casts
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt; +}
&lt;br&gt;&amp;gt;&amp;gt; +
&lt;br&gt;&amp;gt;&amp;gt; +Q_NOREPLY void dvbdbusadaptor::previousTvChannel()
&lt;br&gt;&amp;gt;&amp;gt; +{
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; dtab-&amp;gt;previousChannel();
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; call mediaWidget-&amp;gt;previous()
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt; +}
&lt;br&gt;&amp;gt;&amp;gt; +
&lt;br&gt;&amp;gt;&amp;gt; +Q_NOREPLY void dvbdbusadaptor::nextTvChannel()
&lt;br&gt;&amp;gt;&amp;gt; +{
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; dtab-&amp;gt;nextChannel();
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; call mediaWidget-&amp;gt;next()
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt; +}
&lt;br&gt;&amp;gt;&amp;gt; diff -Naur ../kaffeine_ori/src/dvb/dvbtab.cpp ./src/dvb/dvbtab.cpp
&lt;br&gt;&amp;gt;&amp;gt; --- ../kaffeine_ori/src/dvb/dvbtab.cpp &amp;nbsp;2009-10-30 10:34:30.000000000 +0100
&lt;br&gt;&amp;gt;&amp;gt; +++ ./src/dvb/dvbtab.cpp &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2009-10-30 11:08:47.000000000 +0100
&lt;br&gt;&amp;gt;&amp;gt; @@ -21,6 +21,7 @@
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp;#include &amp;quot;dvbtab.h&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp;#include &amp;lt;QBoxLayout&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; +#include &amp;lt;QDBusConnection&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp;#include &amp;lt;QDir&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp;#include &amp;lt;QHeaderView&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp;#include &amp;lt;QPainter&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; @@ -37,6 +38,7 @@
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp;#include &amp;quot;../osdwidget.h&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp;#include &amp;quot;dvbchannelui.h&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp;#include &amp;quot;dvbconfigdialog.h&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; +#include &amp;quot;dvbdbusadaptor.h&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp;#include &amp;quot;dvbepg.h&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp;#include &amp;quot;dvbmanager.h&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp;#include &amp;quot;dvbrecording.h&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; @@ -424,6 +426,10 @@
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dvbOsdTimer = new QTimer(this);
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;connect(dvbOsdTimer, SIGNAL(timeout()), this, SLOT(osdTimeout()));
&lt;br&gt;&amp;gt;&amp;gt; +
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; new dvbdbusadaptor(this);
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; QDBusConnection::sessionBus().registerObject(&amp;quot;/DVB&amp;quot;, this);
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; QDBusConnection::sessionBus().registerService(&amp;quot;org.kde.kaffeine&amp;quot;);
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; initialise the adapter from Kaffeine::Kaffeine()
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp;}
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp;DvbTab::~DvbTab()
&lt;br&gt;&amp;gt;&amp;gt; diff -Naur ../kaffeine_ori/src/dvb/dvbtab.h ./src/dvb/dvbtab.h
&lt;br&gt;&amp;gt;&amp;gt; --- ../kaffeine_ori/src/dvb/dvbtab.h &amp;nbsp; &amp;nbsp;2009-10-30 10:34:30.000000000 +0100
&lt;br&gt;&amp;gt;&amp;gt; +++ ./src/dvb/dvbtab.h &amp;nbsp;2009-10-30 11:08:47.000000000 +0100
&lt;br&gt;&amp;gt;&amp;gt; @@ -42,6 +42,8 @@
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp;class DvbTab : public TabBase
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp;{
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Q_OBJECT
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; friend class dvbdbusadaptor;
&lt;br&gt;&amp;gt;&amp;gt; +
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp;public:
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DvbTab(KMenu *menu, KActionCollection *collection, MediaWidget *mediaWidget_);
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;~DvbTab();
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Thanks,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Christoph
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; 
&lt;/div&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Come build with us! The BlackBerry(R) Developer Conference in SF, CA
&lt;br&gt;is the only developer event you need to attend this year. Jumpstart your
&lt;br&gt;developing skills, take BlackBerry mobile applications to market and stay 
&lt;br&gt;ahead of the curve. Join us from November 9 - 12, 2009. Register now!
&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/devconference&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/devconference&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26161077&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/dbus-support-for-kaffeine-tp26128565p26161077.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26160366</id>
	<title>Re: dbus support for kaffeine</title>
	<published>2009-11-02T01:00:39Z</published>
	<updated>2009-11-02T01:00:39Z</updated>
	<author>
		<name>Bugzilla from christophpfister@gmail.com</name>
	</author>
	<content type="html">2009/10/30 Pascal Pollet &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26160366&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pascal@...&lt;/a&gt;&amp;gt;:
&lt;br&gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I sent an email to this mailing list with a patch attached one hour ago,
&lt;br&gt;&amp;gt; but now I looked at the mailing list archive
&lt;br&gt;&amp;gt; (&lt;a href=&quot;http://sourceforge.net/mailarchive/forum.php?forum_name=kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://sourceforge.net/mailarchive/forum.php?forum_name=kaffeine-devel&lt;/a&gt;),
&lt;br&gt;&amp;gt; and it seems that only the patch reached the mailing list, and not the
&lt;br&gt;&amp;gt; body of the email.
&lt;br&gt;&lt;br&gt;Right, there seems to be a problem (I'll take care of it).
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Is this maybe a sourceforge bug? So I send the mail
&lt;br&gt;&amp;gt; again, without the patch this time:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Hello guys,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I am since the very beginning of kaffeine a great fan of this
&lt;br&gt;&amp;gt; application and use it for watching movies and TV. In the new version, I
&lt;br&gt;&amp;gt; miss a dbus interface to be able to use my remote control for watching
&lt;br&gt;&amp;gt; TV. As I know a little bit of C++ and Qt, I decided to implement the
&lt;br&gt;&amp;gt; dbus features for kaffeine, btw. giving me the occasion to learn how to
&lt;br&gt;&amp;gt; do this. Here is a small patch which makes two functions of dvbtab.cpp
&lt;br&gt;&amp;gt; available for dbus: previousChannel() and nextChannel(). It is just a
&lt;br&gt;&amp;gt; minimal proof of principle, to show you how I would implement the dbus
&lt;br&gt;&amp;gt; functionality. I would be really happy to contribute to this cool
&lt;br&gt;&amp;gt; project, so if you are interested in my code, please tell me. I would
&lt;br&gt;&amp;gt; add dbus support for all functions which should be accessible from the
&lt;br&gt;&amp;gt; outside world.
&lt;/div&gt;&lt;br&gt;I appreciate contributions (I have to code less; you learn something
&lt;br&gt;;-). See below for a (short, I'm sorry) feedback.
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; For my developer background, I like to contribute with mostly small
&lt;br&gt;&amp;gt; patches to various open-source projects, and I am the guy from this
&lt;br&gt;&amp;gt; project: &lt;a href=&quot;http://www.bongosoft.de&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.bongosoft.de&lt;/a&gt;&amp;nbsp;(german page!).
&lt;br&gt;&amp;gt; Newly, I also started this one:
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://www.kde-look.org/content/show.php/Babeleo+translator?content=110491&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.kde-look.org/content/show.php/Babeleo+translator?content=110491&lt;/a&gt;&lt;br&gt;&amp;gt; In &amp;quot;real life&amp;quot; I am about to finalize a Ph.D. in bioinformatics in the
&lt;br&gt;&amp;gt; nice town of Freiburg/Germany...
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I am both French and German, so you can talk to me in any of these
&lt;br&gt;&amp;gt; languages, naturally also in English.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; The patch is against revision 1042616 of the SVN tree.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; greetings,
&lt;br&gt;&amp;gt; Pascal
&lt;/div&gt;&lt;br&gt;&amp;gt; diff -Naur ../kaffeine_ori/src/CMakeLists.txt ./src/CMakeLists.txt
&lt;br&gt;&amp;gt; --- ../kaffeine_ori/src/CMakeLists.txt  2009-10-30 10:34:30.000000000 +0100
&lt;br&gt;&amp;gt; +++ ./src/CMakeLists.txt        2009-10-30 11:08:47.000000000 +0100
&lt;br&gt;&amp;gt; @@ -2,6 +2,7 @@
&lt;br&gt;&amp;gt;     dvb/dvbchannel.cpp
&lt;br&gt;&amp;gt;     dvb/dvbchannelui.cpp
&lt;br&gt;&amp;gt;     dvb/dvbconfigdialog.cpp
&lt;br&gt;&amp;gt; +    dvb/dvbdbusadaptor.cpp
&lt;br&gt;&lt;br&gt;please place the file in the src/ directory and call it dbusadaptor.cpp
&lt;br&gt;&lt;br&gt;&amp;gt;     dvb/dvbdevice.cpp
&lt;br&gt;&amp;gt;     dvb/dvbepg.cpp
&lt;br&gt;&amp;gt;     dvb/dvbmanager.cpp
&lt;br&gt;&amp;gt; diff -Naur ../kaffeine_ori/src/dvb/dvbdbusadaptor.h ./src/dvb/dvbdbusadaptor.h
&lt;br&gt;&amp;gt; --- ../kaffeine_ori/src/dvb/dvbdbusadaptor.h &amp;nbsp; &amp;nbsp;1970-01-01 01:00:00.000000000 +0100
&lt;br&gt;&amp;gt; +++ ./src/dvb/dvbdbusadaptor.h &amp;nbsp;2009-10-30 11:08:47.000000000 +0100
&lt;br&gt;&amp;gt; @@ -0,0 +1,19 @@
&lt;br&gt;&lt;br&gt;use a header include guard =
&lt;br&gt;#ifndef DBUSADAPTOR_H
&lt;br&gt;#define DBUSADAPTOR_H
&lt;br&gt;&lt;br&gt;...
&lt;br&gt;&lt;br&gt;#endif
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; +#include &amp;lt;QDBusAbstractAdaptor&amp;gt;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +class DvbTab;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +class dvbdbusadaptor: public QDBusAbstractAdaptor
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; Q_OBJECT
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.kde.kaffeine&amp;quot;)
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +private:
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; DvbTab* dtab;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +public:
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; dvbdbusadaptor(QWidget* dvbTab);
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +public slots:
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; void nextTvChannel();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; void previousTvChannel();
&lt;/div&gt;&lt;br&gt;please call those slots previous() and next()
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; +};
&lt;br&gt;&amp;gt; diff -Naur ../kaffeine_ori/src/dvb/dvbdbusadaptor.cpp ./src/dvb/dvbdbusadaptor.cpp
&lt;br&gt;&amp;gt; --- ../kaffeine_ori/src/dvb/dvbdbusadaptor.cpp  1970-01-01 01:00:00.000000000 +0100
&lt;br&gt;&amp;gt; +++ ./src/dvb/dvbdbusadaptor.cpp        2009-10-30 11:08:47.000000000 +0100
&lt;br&gt;&amp;gt; @@ -0,0 +1,19 @@
&lt;br&gt;&amp;gt; +#include &amp;quot;dvbdbusadaptor.h&amp;quot;
&lt;br&gt;&amp;gt; +#include &amp;quot;dvbtab.h&amp;quot;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +dvbdbusadaptor::dvbdbusadaptor(QWidget* dvbtab)
&lt;br&gt;&amp;gt; +: QDBusAbstractAdaptor(dvbtab)
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +       dtab = dynamic_cast&amp;lt;DvbTab*&amp;gt;(dvbtab);
&lt;/div&gt;&lt;br&gt;avoid dynamic casts
&lt;br&gt;&lt;br&gt;&amp;gt; +}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +Q_NOREPLY void dvbdbusadaptor::previousTvChannel()
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +       dtab-&amp;gt;previousChannel();
&lt;br&gt;&lt;br&gt;call mediaWidget-&amp;gt;previous()
&lt;br&gt;&lt;br&gt;&amp;gt; +}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +Q_NOREPLY void dvbdbusadaptor::nextTvChannel()
&lt;br&gt;&amp;gt; +{
&lt;br&gt;&amp;gt; +       dtab-&amp;gt;nextChannel();
&lt;br&gt;&lt;br&gt;call mediaWidget-&amp;gt;next()
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; +}
&lt;br&gt;&amp;gt; diff -Naur ../kaffeine_ori/src/dvb/dvbtab.cpp ./src/dvb/dvbtab.cpp
&lt;br&gt;&amp;gt; --- ../kaffeine_ori/src/dvb/dvbtab.cpp  2009-10-30 10:34:30.000000000 +0100
&lt;br&gt;&amp;gt; +++ ./src/dvb/dvbtab.cpp        2009-10-30 11:08:47.000000000 +0100
&lt;br&gt;&amp;gt; @@ -21,6 +21,7 @@
&lt;br&gt;&amp;gt;  #include &amp;quot;dvbtab.h&amp;quot;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;  #include &amp;lt;QBoxLayout&amp;gt;
&lt;br&gt;&amp;gt; +#include &amp;lt;QDBusConnection&amp;gt;
&lt;br&gt;&amp;gt;  #include &amp;lt;QDir&amp;gt;
&lt;br&gt;&amp;gt;  #include &amp;lt;QHeaderView&amp;gt;
&lt;br&gt;&amp;gt;  #include &amp;lt;QPainter&amp;gt;
&lt;br&gt;&amp;gt; @@ -37,6 +38,7 @@
&lt;br&gt;&amp;gt;  #include &amp;quot;../osdwidget.h&amp;quot;
&lt;br&gt;&amp;gt;  #include &amp;quot;dvbchannelui.h&amp;quot;
&lt;br&gt;&amp;gt;  #include &amp;quot;dvbconfigdialog.h&amp;quot;
&lt;br&gt;&amp;gt; +#include &amp;quot;dvbdbusadaptor.h&amp;quot;
&lt;br&gt;&amp;gt;  #include &amp;quot;dvbepg.h&amp;quot;
&lt;br&gt;&amp;gt;  #include &amp;quot;dvbmanager.h&amp;quot;
&lt;br&gt;&amp;gt;  #include &amp;quot;dvbrecording.h&amp;quot;
&lt;br&gt;&amp;gt; @@ -424,6 +426,10 @@
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;        dvbOsdTimer = new QTimer(this);
&lt;br&gt;&amp;gt;        connect(dvbOsdTimer, SIGNAL(timeout()), this, SLOT(osdTimeout()));
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; +       new dvbdbusadaptor(this);
&lt;br&gt;&amp;gt; +       QDBusConnection::sessionBus().registerObject(&amp;quot;/DVB&amp;quot;, this);
&lt;br&gt;&amp;gt; +       QDBusConnection::sessionBus().registerService(&amp;quot;org.kde.kaffeine&amp;quot;);
&lt;/div&gt;&lt;br&gt;initialise the adapter from Kaffeine::Kaffeine()
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt;  }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;  DvbTab::~DvbTab()
&lt;br&gt;&amp;gt; diff -Naur ../kaffeine_ori/src/dvb/dvbtab.h ./src/dvb/dvbtab.h
&lt;br&gt;&amp;gt; --- ../kaffeine_ori/src/dvb/dvbtab.h    2009-10-30 10:34:30.000000000 +0100
&lt;br&gt;&amp;gt; +++ ./src/dvb/dvbtab.h  2009-10-30 11:08:47.000000000 +0100
&lt;br&gt;&amp;gt; @@ -42,6 +42,8 @@
&lt;br&gt;&amp;gt;  class DvbTab : public TabBase
&lt;br&gt;&amp;gt;  {
&lt;br&gt;&amp;gt;        Q_OBJECT
&lt;br&gt;&amp;gt; +       friend class dvbdbusadaptor;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt;  public:
&lt;br&gt;&amp;gt;        DvbTab(KMenu *menu, KActionCollection *collection, MediaWidget *mediaWidget_);
&lt;br&gt;&amp;gt;        ~DvbTab();
&lt;/div&gt;&lt;br&gt;Thanks,
&lt;br&gt;&lt;br&gt;Christoph
&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Come build with us! The BlackBerry(R) Developer Conference in SF, CA
&lt;br&gt;is the only developer event you need to attend this year. Jumpstart your
&lt;br&gt;developing skills, take BlackBerry mobile applications to market and stay 
&lt;br&gt;ahead of the curve. Join us from November 9 - 12, 2009. Register now!
&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/devconference&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/devconference&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26160366&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/dbus-support-for-kaffeine-tp26128565p26160366.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26154457</id>
	<title>Re: Kaffeine (almost) successful build on mswindows</title>
	<published>2009-11-01T12:25:03Z</published>
	<updated>2009-11-01T12:25:03Z</updated>
	<author>
		<name>Bugzilla from christophpfister@gmail.com</name>
	</author>
	<content type="html">2009/11/1 Devin Heitmueller &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26154457&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;devin.heitmueller@...&lt;/a&gt;&amp;gt;:
&lt;br&gt;&amp;lt;snip&amp;gt;
&lt;br&gt;&amp;gt; Andrius,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Pretty neat.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; It might make sense for you to propose a patch that includes a stub
&lt;br&gt;&amp;gt; class for the dvb stuff, so that it builds cleanly on platforms that
&lt;br&gt;&amp;gt; don't have Linux DVB.
&lt;br&gt;&lt;br&gt;You don't need a stub class; removing the kaffeinedvb target from
&lt;br&gt;CMakeLists.txt (or making it conditional) is enough.
&lt;br&gt;&lt;br&gt;&amp;gt; Devin
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; --
&lt;br&gt;&amp;gt; Devin J. Heitmueller
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://www.devinheitmueller.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.devinheitmueller.com&lt;/a&gt;&lt;br&gt;&amp;gt; AIM: devinheitmueller
&lt;br&gt;&lt;br&gt;Christoph
&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Come build with us! The BlackBerry(R) Developer Conference in SF, CA
&lt;br&gt;is the only developer event you need to attend this year. Jumpstart your
&lt;br&gt;developing skills, take BlackBerry mobile applications to market and stay 
&lt;br&gt;ahead of the curve. Join us from November 9 - 12, 2009. Register now!
&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/devconference&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/devconference&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26154457&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A-Kaffeine-%28almost%29-successful-build-on-mswindows-tp26153833p26154457.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26154426</id>
	<title>Re: Kaffeine (almost) successful build on mswindows</title>
	<published>2009-11-01T12:20:55Z</published>
	<updated>2009-11-01T12:20:55Z</updated>
	<author>
		<name>Bugzilla from devin.heitmueller@gmail.com</name>
	</author>
	<content type="html">On Sun, Nov 1, 2009 at 2:12 PM, Andrius da Costa Ribas
&lt;br&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26154426&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;andriusmao@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Including  kaffeine-devel list
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; --
&lt;br&gt;&amp;gt; Andrius
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; 2009/11/1 Andrius da Costa Ribas &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26154426&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;andriusmao@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; I've just tried building Kaffeine on MSWindows and I've got surprised!!!
&lt;br&gt;&amp;gt;&amp;gt; no code changes to build successfuly all targets ( except linux-specific dvb
&lt;br&gt;&amp;gt;&amp;gt; parts )
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; screenshot of kaffeine playing windows vista sample video butterfly.wmv
&lt;br&gt;&amp;gt;&amp;gt; (using mplayer backend):
&lt;br&gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://imagebin.ca/view/xHr9jvlF.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://imagebin.ca/view/xHr9jvlF.html&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; screenshot of about screen:
&lt;br&gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://imagebin.ca/view/6E6q1LIC.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://imagebin.ca/view/6E6q1LIC.html&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; It's a mingw build, I've not tried it with msvc. Somehow I've got no
&lt;br&gt;&amp;gt;&amp;gt; directshow backend in phonon installation  ( KDE 4.3.2 - mingw4 - binary
&lt;br&gt;&amp;gt;&amp;gt; packages from installer )
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; @Christoph, is it time to change last question of FAQ? ;)
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; some issues:
&lt;br&gt;&amp;gt;&amp;gt; - when trying to open a dvd: &amp;quot;No stream found to handle url dvd://1&amp;quot;,
&lt;br&gt;&amp;gt;&amp;gt; similar for audio cd etc.. (I believe it's kde-windows issue)
&lt;br&gt;&amp;gt;&amp;gt; - a small delay before starting video ( longer delay on first use ) ( I
&lt;br&gt;&amp;gt;&amp;gt; believe it's backend issue )
&lt;br&gt;&amp;gt;&amp;gt; - I'm not sure about konqueror and firefox kaffeine plugin
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Many thanks for all people who helped :)
&lt;/div&gt;&lt;br&gt;Andrius,
&lt;br&gt;&lt;br&gt;Pretty neat.
&lt;br&gt;&lt;br&gt;It might make sense for you to propose a patch that includes a stub
&lt;br&gt;class for the dvb stuff, so that it builds cleanly on platforms that
&lt;br&gt;don't have Linux DVB.
&lt;br&gt;&lt;br&gt;Devin
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;Devin J. Heitmueller
&lt;br&gt;&lt;a href=&quot;http://www.devinheitmueller.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.devinheitmueller.com&lt;/a&gt;&lt;br&gt;AIM: devinheitmueller
&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Come build with us! The BlackBerry(R) Developer Conference in SF, CA
&lt;br&gt;is the only developer event you need to attend this year. Jumpstart your
&lt;br&gt;developing skills, take BlackBerry mobile applications to market and stay 
&lt;br&gt;ahead of the curve. Join us from November 9 - 12, 2009. Register now!
&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/devconference&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/devconference&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26154426&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A-Kaffeine-%28almost%29-successful-build-on-mswindows-tp26153833p26154426.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26153833</id>
	<title>Re: Kaffeine (almost) successful build on mswindows</title>
	<published>2009-11-01T11:12:17Z</published>
	<updated>2009-11-01T11:12:17Z</updated>
	<author>
		<name>Andrius da Costa Ribas</name>
	</author>
	<content type="html">Including  kaffeine-devel list&lt;br&gt;&lt;br&gt;--&lt;br&gt;Andrius&lt;br&gt;&lt;br&gt;&lt;div class=&quot;gmail_quote&quot;&gt;2009/11/1 Andrius da Costa Ribas &lt;span dir=&quot;ltr&quot;&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26153833&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;andriusmao@...&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;

I&amp;#39;ve just tried building Kaffeine on MSWindows and I&amp;#39;ve got surprised!!! no code changes to build successfuly all targets ( except linux-specific dvb parts )&lt;br&gt;&lt;br&gt;screenshot of kaffeine playing windows vista sample video butterfly.wmv (using mplayer backend):&lt;br&gt;


&lt;a href=&quot;http://imagebin.ca/view/xHr9jvlF.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://imagebin.ca/view/xHr9jvlF.html&lt;/a&gt;&lt;br&gt;&lt;br&gt;screenshot of about screen:&lt;br&gt;&lt;a href=&quot;http://imagebin.ca/view/6E6q1LIC.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://imagebin.ca/view/6E6q1LIC.html&lt;/a&gt;&lt;br&gt;


&lt;br&gt;It&amp;#39;s a mingw build, I&amp;#39;ve not tried it with msvc. Somehow I&amp;#39;ve got no directshow backend in phonon installation  ( KDE 4.3.2 - mingw4 - binary packages from installer )&lt;br&gt;&lt;br&gt;@Christoph, is it time to change last question of FAQ? ;)&lt;br&gt;


&lt;br&gt;some issues:&lt;br&gt;- when trying to open a dvd: &amp;quot;No stream found to handle url dvd://1&amp;quot;, similar for audio cd etc.. (I believe it&amp;#39;s kde-windows issue)&lt;br&gt;- a small delay before starting video ( longer delay on first use ) ( I believe it&amp;#39;s backend issue )&lt;br&gt;


- I&amp;#39;m not sure about konqueror and firefox kaffeine plugin&lt;br&gt;&lt;br&gt;Many thanks for all people who helped :)&lt;br&gt;&lt;br&gt;build log:&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\build&amp;gt;mingw32-make -k&lt;br&gt;[  0%] Built target kaffeine_automoc&lt;br&gt;


[  4%] Building CXX object src/CMakeFiles/kaffeine.dir/dvb/dvbdevice.obj&lt;br&gt;[  8%] Building CXX object src/CMakeFiles/kaffeine.dir/dvb/dvbepg.obj&lt;br&gt;[ 13%] Building CXX object src/CMakeFiles/kaffeine.dir/dvb/dvbliveview.obj&lt;br&gt;


[ 17%] Building CXX object src/CMakeFiles/kaffeine.dir/dvb/dvbmanager.obj&lt;br&gt;[ 21%] Building CXX object src/CMakeFiles/kaffeine.dir/dvb/dvbrecording.obj&lt;br&gt;[ 26%] Building CXX object src/CMakeFiles/kaffeine.dir/dvb/dvbscan.obj&lt;br&gt;


[ 30%] Building CXX object src/CMakeFiles/kaffeine.dir/dvb/dvbscandialog.obj&lt;br&gt;[ 34%] Building CXX object src/CMakeFiles/kaffeine.dir/dvb/dvbsi.obj&lt;br&gt;[ 39%] Building CXX object src/CMakeFiles/kaffeine.dir/dvb/dvbtab.obj&lt;br&gt;


[ 43%] Building CXX object src/CMakeFiles/kaffeine.dir/playlist/playlistmodel.ob&lt;br&gt;j&lt;br&gt;[ 47%] Building CXX object src/CMakeFiles/kaffeine.dir/playlist/playlisttab.obj&lt;br&gt;[ 52%] Building CXX object src/CMakeFiles/kaffeine.dir/datetimeedit.obj&lt;br&gt;


[ 56%] Building CXX object src/CMakeFiles/kaffeine.dir/kaffeine.obj&lt;br&gt;[ 60%] Building CXX object src/CMakeFiles/kaffeine.dir/main.obj&lt;br&gt;[ 65%] Building CXX object src/CMakeFiles/kaffeine.dir/mediawidget.obj&lt;br&gt;[ 69%] Building CXX object src/CMakeFiles/kaffeine.dir/osdwidget.obj&lt;br&gt;


[ 73%] Building CXX object src/CMakeFiles/kaffeine.dir/proxytreeview.obj&lt;br&gt;Linking CXX executable ..\bin\kaffeine.exe&lt;br&gt;[ 91%] Built target kaffeine&lt;br&gt;[ 91%] Built target kaffeinedvb_automoc&lt;br&gt;[ 95%] Building CXX object src/CMakeFiles/kaffeinedvb.dir/kaffeinedvb_automoc.ob&lt;br&gt;


j&lt;br&gt;[100%] Building CXX object src/CMakeFiles/kaffeinedvb.dir/dvb/dvbdevice_linux.ob&lt;br&gt;j&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:27:18: err&lt;br&gt;or: poll.h: No such file or directory&lt;br&gt;In file included from C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevic&lt;br&gt;


e_linux.cpp:23:&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/dmx.h:95: error: &amp;#39;__u8&amp;#39; does n&lt;br&gt;ot name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/dmx.h:96: error: &amp;#39;__u8&amp;#39; does n&lt;br&gt;


ot name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/dmx.h:97: error: &amp;#39;__u8&amp;#39; does n&lt;br&gt;ot name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/dmx.h:103: error: &amp;#39;__u16&amp;#39; does&lt;br&gt;

 not name a type&lt;br&gt;
C:\Users\Andrius\Desktop\kdetest\kaffeine\include/dmx.h:105: error: &amp;#39;__u32&amp;#39; does&lt;br&gt; not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/dmx.h:106: error: &amp;#39;__u32&amp;#39; does&lt;br&gt; not name a type&lt;br&gt;


C:\Users\Andrius\Desktop\kdetest\kaffeine\include/dmx.h:116: error: &amp;#39;__u16&amp;#39; does&lt;br&gt; not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/dmx.h:120: error: &amp;#39;__u32&amp;#39; does&lt;br&gt; not name a type&lt;br&gt;


C:\Users\Andrius\Desktop\kdetest\kaffeine\include/dmx.h:124: error: &amp;#39;__u32&amp;#39; does&lt;br&gt; not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/dmx.h:142: error: &amp;#39;__u64&amp;#39; does&lt;br&gt; not name a type&lt;br&gt;


In file included from C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevic&lt;br&gt;e_linux.cpp:26:&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:79: error: &amp;#39;__u32&amp;#39;&lt;br&gt;does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:80: error: &amp;#39;__u32&amp;#39;&lt;br&gt;


does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:81: error: &amp;#39;__u32&amp;#39;&lt;br&gt;does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:82: error: &amp;#39;__u32&amp;#39;&lt;br&gt;


does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:83: error: &amp;#39;__u32&amp;#39;&lt;br&gt;does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:84: error: &amp;#39;__u32&amp;#39;&lt;br&gt;


does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:85: error: &amp;#39;__u32&amp;#39;&lt;br&gt;does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:86: error: &amp;#39;__u32&amp;#39;&lt;br&gt;


does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:96: error: &amp;#39;__u8&amp;#39; d&lt;br&gt;oes not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:97: error: &amp;#39;__u8&amp;#39; d&lt;br&gt;


oes not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:102: error: &amp;#39;__u8&amp;#39;&lt;br&gt;does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:103: error: &amp;#39;__u8&amp;#39;&lt;br&gt;


does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:211: error: &amp;#39;__u32&amp;#39;&lt;br&gt; does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:216: error: &amp;#39;__u32&amp;#39;&lt;br&gt;


 does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:237: error: &amp;#39;__u32&amp;#39;&lt;br&gt; does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:348: error: &amp;#39;__u32&amp;#39;&lt;br&gt;


 does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:351: error: &amp;#39;__u32&amp;#39;&lt;br&gt; does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:352: error: &amp;#39;__u32&amp;#39;&lt;br&gt;


 does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:353: error: &amp;#39;__u32&amp;#39;&lt;br&gt; does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:357: error: &amp;#39;__u32&amp;#39;&lt;br&gt;


 does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:358: error: &amp;#39;__u32&amp;#39;&lt;br&gt; does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:360: error: &amp;#39;__u32&amp;#39;&lt;br&gt;


 does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:362: error: &amp;#39;__u8&amp;#39;&lt;br&gt;does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:363: error: &amp;#39;__u32&amp;#39;&lt;br&gt;


 does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:364: error: &amp;#39;__u32&amp;#39;&lt;br&gt; does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\include/frontend.h:375: error: &amp;#39;__u32&amp;#39;&lt;br&gt;


 does not name a type&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp: In member&lt;br&gt; function &amp;#39;virtual void DvbDeviceThread::run()&amp;#39;:&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:107: error&lt;br&gt;


: &amp;#39;pollfd&amp;#39; was not declared in this scope&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:107: error&lt;br&gt;: expected &amp;#39;;&amp;#39; before &amp;#39;pfds&amp;#39;&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:108: error&lt;br&gt;


: &amp;#39;pfds&amp;#39; was not declared in this scope&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:111: error&lt;br&gt;: &amp;#39;POLLIN&amp;#39; was not declared in this scope&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:119: error&lt;br&gt;


: &amp;#39;poll&amp;#39; was not declared in this scope&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp: In member&lt;br&gt; function &amp;#39;virtual bool DvbLinuxDevice::setTone(DvbBackendDevice::SecTone)&amp;#39;:&lt;br&gt;


C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:313: error&lt;br&gt;: &amp;#39;ioctl&amp;#39; was not declared in this scope&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp: In member&lt;br&gt;

 function &amp;#39;virtual bool DvbLinuxDevice::setVoltage(DvbBackendDevice::SecVoltage)&lt;br&gt;
&amp;#39;:&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:326: error&lt;br&gt;: &amp;#39;ioctl&amp;#39; was not declared in this scope&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp: In member&lt;br&gt;


 function &amp;#39;virtual bool DvbLinuxDevice::sendMessage(const char*, int)&amp;#39;:&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:340: error&lt;br&gt;: &amp;#39;struct dvb_diseqc_master_cmd&amp;#39; has no member named &amp;#39;msg&amp;#39;&lt;br&gt;


C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:341: error&lt;br&gt;: &amp;#39;struct dvb_diseqc_master_cmd&amp;#39; has no member named &amp;#39;msg_len&amp;#39;&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:343: error&lt;br&gt;


: &amp;#39;ioctl&amp;#39; was not declared in this scope&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp: In member&lt;br&gt; function &amp;#39;virtual bool DvbLinuxDevice::sendBurst(DvbBackendDevice::SecBurst)&amp;#39;:&lt;br&gt;


C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:356: error&lt;br&gt;: &amp;#39;ioctl&amp;#39; was not declared in this scope&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp: In member&lt;br&gt;

 function &amp;#39;virtual bool DvbLinuxDevice::tune(const DvbTransponder&amp;amp;)&amp;#39;:&lt;br&gt;
C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:511: error&lt;br&gt;: &amp;#39;struct dvb_frontend_parameters&amp;#39; has no member named &amp;#39;frequency&amp;#39;&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:513: error&lt;br&gt;


: &amp;#39;struct dvb_qam_parameters&amp;#39; has no member named &amp;#39;symbol_rate&amp;#39;&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:522: error&lt;br&gt;: &amp;#39;struct dvb_frontend_parameters&amp;#39; has no member named &amp;#39;frequency&amp;#39;&lt;br&gt;


C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:524: error&lt;br&gt;: &amp;#39;struct dvb_qpsk_parameters&amp;#39; has no member named &amp;#39;symbol_rate&amp;#39;&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:535: error&lt;br&gt;


: &amp;#39;struct dtv_property&amp;#39; has no member named &amp;#39;cmd&amp;#39;&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:536: error&lt;br&gt;: &amp;#39;union dtv_property::&amp;lt;anonymous&amp;gt;&amp;#39; has no member named &amp;#39;data&amp;#39;&lt;br&gt;


C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:537: error&lt;br&gt;: &amp;#39;struct dtv_property&amp;#39; has no member named &amp;#39;cmd&amp;#39;&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:538: error&lt;br&gt;


: &amp;#39;union dtv_property::&amp;lt;anonymous&amp;gt;&amp;#39; has no member named &amp;#39;data&amp;#39;&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:539: error&lt;br&gt;: &amp;#39;struct dtv_property&amp;#39; has no member named &amp;#39;cmd&amp;#39;&lt;br&gt;


C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:540: error&lt;br&gt;: &amp;#39;union dtv_property::&amp;lt;anonymous&amp;gt;&amp;#39; has no member named &amp;#39;data&amp;#39;&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:541: error&lt;br&gt;


: &amp;#39;struct dtv_property&amp;#39; has no member named &amp;#39;cmd&amp;#39;&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:542: error&lt;br&gt;: &amp;#39;union dtv_property::&amp;lt;anonymous&amp;gt;&amp;#39; has no member named &amp;#39;data&amp;#39;&lt;br&gt;


C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:543: error&lt;br&gt;: &amp;#39;struct dtv_property&amp;#39; has no member named &amp;#39;cmd&amp;#39;&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:544: error&lt;br&gt;


: &amp;#39;union dtv_property::&amp;lt;anonymous&amp;gt;&amp;#39; has no member named &amp;#39;data&amp;#39;&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:545: error&lt;br&gt;: &amp;#39;struct dtv_property&amp;#39; has no member named &amp;#39;cmd&amp;#39;&lt;br&gt;


C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:546: error&lt;br&gt;: &amp;#39;union dtv_property::&amp;lt;anonymous&amp;gt;&amp;#39; has no member named &amp;#39;data&amp;#39;&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:547: error&lt;br&gt;


: &amp;#39;struct dtv_property&amp;#39; has no member named &amp;#39;cmd&amp;#39;&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:548: error&lt;br&gt;: &amp;#39;union dtv_property::&amp;lt;anonymous&amp;gt;&amp;#39; has no member named &amp;#39;data&amp;#39;&lt;br&gt;


C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:549: error&lt;br&gt;: &amp;#39;struct dtv_property&amp;#39; has no member named &amp;#39;cmd&amp;#39;&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:550: error&lt;br&gt;


: &amp;#39;union dtv_property::&amp;lt;anonymous&amp;gt;&amp;#39; has no member named &amp;#39;data&amp;#39;&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:551: error&lt;br&gt;: &amp;#39;struct dtv_property&amp;#39; has no member named &amp;#39;cmd&amp;#39;&lt;br&gt;


C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:556: error&lt;br&gt;: &amp;#39;struct dtv_properties&amp;#39; has no member named &amp;#39;num&amp;#39;&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:559: error&lt;br&gt;


: &amp;#39;ioctl&amp;#39; was not declared in this scope&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:572: error&lt;br&gt;: &amp;#39;struct dvb_frontend_parameters&amp;#39; has no member named &amp;#39;frequency&amp;#39;&lt;br&gt;


C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:590: error&lt;br&gt;: &amp;#39;struct dvb_frontend_parameters&amp;#39; has no member named &amp;#39;frequency&amp;#39;&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:601: error&lt;br&gt;


: &amp;#39;ioctl&amp;#39; was not declared in this scope&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp: In member&lt;br&gt; function &amp;#39;virtual int DvbLinuxDevice::getSignal()&amp;#39;:&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:617: error&lt;br&gt;


: &amp;#39;__u16&amp;#39; was not declared in this scope&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:617: error&lt;br&gt;: &amp;#39;ioctl&amp;#39; was not declared in this scope&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp: In member&lt;br&gt;


 function &amp;#39;virtual int DvbLinuxDevice::getSnr()&amp;#39;:&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:636: error&lt;br&gt;: &amp;#39;__u16&amp;#39; was not declared in this scope&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:636: error&lt;br&gt;


: &amp;#39;ioctl&amp;#39; was not declared in this scope&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp: In member&lt;br&gt; function &amp;#39;virtual bool DvbLinuxDevice::isTuned()&amp;#39;:&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:656: error&lt;br&gt;


: &amp;#39;ioctl&amp;#39; was not declared in this scope&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp: In member&lt;br&gt; function &amp;#39;virtual bool DvbLinuxDevice::addPidFilter(int)&amp;#39;:&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:683: error&lt;br&gt;


: &amp;#39;struct dmx_pes_filter_params&amp;#39; has no member named &amp;#39;pid&amp;#39;&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:687: error&lt;br&gt;: &amp;#39;struct dmx_pes_filter_params&amp;#39; has no member named &amp;#39;flags&amp;#39;&lt;br&gt;


C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:689: error&lt;br&gt;: &amp;#39;ioctl&amp;#39; was not declared in this scope&lt;br&gt;C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp: In member&lt;br&gt;

 function &amp;#39;bool DvbLinuxDevice::identifyDevice()&amp;#39;:&lt;br&gt;
C:\Users\Andrius\Desktop\kdetest\kaffeine\src\dvb\dvbdevice_linux.cpp:747: error&lt;br&gt;: &amp;#39;ioctl&amp;#39; was not declared in this scope&lt;br&gt;mingw32-make[2]: *** [src/CMakeFiles/kaffeinedvb.dir/dvb/dvbdevice_linux.obj] Er&lt;br&gt;

ror 1&lt;br&gt;
mingw32-make[2]: Target `src/CMakeFiles/kaffeinedvb.dir/build&amp;#39; not remade becaus&lt;br&gt;e of errors.&lt;br&gt;mingw32-make[1]: *** [src/CMakeFiles/kaffeinedvb.dir/all] Error 2&lt;br&gt;mingw32-make[1]: Target `all&amp;#39; not remade because of errors.&lt;br&gt;


mingw32-make: *** [all] Error 2&lt;br&gt;mingw32-make: Target `default_target&amp;#39; not remade because of errors.&lt;br&gt;&lt;br&gt;&lt;br&gt;Thanks again,&lt;br&gt;&lt;font color=&quot;#888888&quot;&gt;Andrius.&lt;br&gt;
&lt;/font&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;
&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Come build with us! The BlackBerry(R) Developer Conference in SF, CA
&lt;br&gt;is the only developer event you need to attend this year. Jumpstart your
&lt;br&gt;developing skills, take BlackBerry mobile applications to market and stay 
&lt;br&gt;ahead of the curve. Join us from November 9 - 12, 2009. Register now!
&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/devconference&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/devconference&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26153833&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A-Kaffeine-%28almost%29-successful-build-on-mswindows-tp26153833p26153833.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26128565</id>
	<title>dbus support for kaffeine</title>
	<published>2009-10-30T04:36:49Z</published>
	<updated>2009-10-30T04:36:49Z</updated>
	<author>
		<name>Pascal Pollet</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;&lt;br&gt;I sent an email to this mailing list with a patch attached one hour ago,
&lt;br&gt;but now I looked at the mailing list archive
&lt;br&gt;(&lt;a href=&quot;http://sourceforge.net/mailarchive/forum.php?forum_name=kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://sourceforge.net/mailarchive/forum.php?forum_name=kaffeine-devel&lt;/a&gt;),
&lt;br&gt;and it seems that only the patch reached the mailing list, and not the
&lt;br&gt;body of the email. Is this maybe a sourceforge bug? So I send the mail
&lt;br&gt;again, without the patch this time:
&lt;br&gt;&lt;br&gt;&lt;br&gt;Hello guys,
&lt;br&gt;&lt;br&gt;I am since the very beginning of kaffeine a great fan of this
&lt;br&gt;application and use it for watching movies and TV. In the new version, I
&lt;br&gt;miss a dbus interface to be able to use my remote control for watching
&lt;br&gt;TV. As I know a little bit of C++ and Qt, I decided to implement the
&lt;br&gt;dbus features for kaffeine, btw. giving me the occasion to learn how to
&lt;br&gt;do this. Here is a small patch which makes two functions of dvbtab.cpp
&lt;br&gt;available for dbus: previousChannel() and nextChannel(). It is just a
&lt;br&gt;minimal proof of principle, to show you how I would implement the dbus
&lt;br&gt;functionality. I would be really happy to contribute to this cool
&lt;br&gt;project, so if you are interested in my code, please tell me. I would
&lt;br&gt;add dbus support for all functions which should be accessible from the
&lt;br&gt;outside world.
&lt;br&gt;&lt;br&gt;For my developer background, I like to contribute with mostly small
&lt;br&gt;patches to various open-source projects, and I am the guy from this
&lt;br&gt;project: &lt;a href=&quot;http://www.bongosoft.de&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.bongosoft.de&lt;/a&gt;&amp;nbsp;(german page!).
&lt;br&gt;Newly, I also started this one:
&lt;br&gt;&lt;a href=&quot;http://www.kde-look.org/content/show.php/Babeleo+translator?content=110491&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.kde-look.org/content/show.php/Babeleo+translator?content=110491&lt;/a&gt;&lt;br&gt;In &amp;quot;real life&amp;quot; I am about to finalize a Ph.D. in bioinformatics in the
&lt;br&gt;nice town of Freiburg/Germany...
&lt;br&gt;&lt;br&gt;I am both French and German, so you can talk to me in any of these
&lt;br&gt;languages, naturally also in English.
&lt;br&gt;&lt;br&gt;The patch is against revision 1042616 of the SVN tree.
&lt;br&gt;&lt;br&gt;greetings,
&lt;br&gt;Pascal
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br /&gt;diff -Naur ../kaffeine_ori/src/CMakeLists.txt ./src/CMakeLists.txt
&lt;br&gt;--- ../kaffeine_ori/src/CMakeLists.txt	2009-10-30 10:34:30.000000000 +0100
&lt;br&gt;+++ ./src/CMakeLists.txt	2009-10-30 11:08:47.000000000 +0100
&lt;br&gt;@@ -2,6 +2,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;dvb/dvbchannel.cpp
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;dvb/dvbchannelui.cpp
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;dvb/dvbconfigdialog.cpp
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;dvb/dvbdbusadaptor.cpp
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;dvb/dvbdevice.cpp
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;dvb/dvbepg.cpp
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;dvb/dvbmanager.cpp
&lt;br&gt;diff -Naur ../kaffeine_ori/src/dvb/dvbdbusadaptor.cpp ./src/dvb/dvbdbusadaptor.cpp
&lt;br&gt;--- ../kaffeine_ori/src/dvb/dvbdbusadaptor.cpp	1970-01-01 01:00:00.000000000 +0100
&lt;br&gt;+++ ./src/dvb/dvbdbusadaptor.cpp	2009-10-30 11:08:47.000000000 +0100
&lt;br&gt;@@ -0,0 +1,19 @@
&lt;br&gt;+#include &amp;quot;dvbdbusadaptor.h&amp;quot;
&lt;br&gt;+#include &amp;quot;dvbtab.h&amp;quot;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+dvbdbusadaptor::dvbdbusadaptor(QWidget* dvbtab)
&lt;br&gt;+: QDBusAbstractAdaptor(dvbtab)
&lt;br&gt;+{
&lt;br&gt;+	dtab = dynamic_cast&amp;lt;DvbTab*&amp;gt;(dvbtab);
&lt;br&gt;+}
&lt;br&gt;+ 
&lt;br&gt;+Q_NOREPLY void dvbdbusadaptor::previousTvChannel()
&lt;br&gt;+{
&lt;br&gt;+	dtab-&amp;gt;previousChannel();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+Q_NOREPLY void dvbdbusadaptor::nextTvChannel()
&lt;br&gt;+{
&lt;br&gt;+	dtab-&amp;gt;nextChannel();
&lt;br&gt;+}
&lt;br&gt;diff -Naur ../kaffeine_ori/src/dvb/dvbdbusadaptor.h ./src/dvb/dvbdbusadaptor.h
&lt;br&gt;--- ../kaffeine_ori/src/dvb/dvbdbusadaptor.h	1970-01-01 01:00:00.000000000 +0100
&lt;br&gt;+++ ./src/dvb/dvbdbusadaptor.h	2009-10-30 11:08:47.000000000 +0100
&lt;br&gt;@@ -0,0 +1,19 @@
&lt;br&gt;+#include &amp;lt;QDBusAbstractAdaptor&amp;gt;
&lt;br&gt;+
&lt;br&gt;+class DvbTab;
&lt;br&gt;+
&lt;br&gt;+class dvbdbusadaptor: public QDBusAbstractAdaptor
&lt;br&gt;+{
&lt;br&gt;+	Q_OBJECT
&lt;br&gt;+	Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.kde.kaffeine&amp;quot;)
&lt;br&gt;+
&lt;br&gt;+private:
&lt;br&gt;+	DvbTab* dtab;
&lt;br&gt;+
&lt;br&gt;+public:
&lt;br&gt;+	dvbdbusadaptor(QWidget* dvbTab);
&lt;br&gt;+ &amp;nbsp; 
&lt;br&gt;+public slots:
&lt;br&gt;+	void nextTvChannel();
&lt;br&gt;+	void previousTvChannel();
&lt;br&gt;+};
&lt;br&gt;diff -Naur ../kaffeine_ori/src/dvb/dvbtab.cpp ./src/dvb/dvbtab.cpp
&lt;br&gt;--- ../kaffeine_ori/src/dvb/dvbtab.cpp	2009-10-30 10:34:30.000000000 +0100
&lt;br&gt;+++ ./src/dvb/dvbtab.cpp	2009-10-30 11:08:47.000000000 +0100
&lt;br&gt;@@ -21,6 +21,7 @@
&lt;br&gt;&amp;nbsp;#include &amp;quot;dvbtab.h&amp;quot;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#include &amp;lt;QBoxLayout&amp;gt;
&lt;br&gt;+#include &amp;lt;QDBusConnection&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;QDir&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;QHeaderView&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;QPainter&amp;gt;
&lt;br&gt;@@ -37,6 +38,7 @@
&lt;br&gt;&amp;nbsp;#include &amp;quot;../osdwidget.h&amp;quot;
&lt;br&gt;&amp;nbsp;#include &amp;quot;dvbchannelui.h&amp;quot;
&lt;br&gt;&amp;nbsp;#include &amp;quot;dvbconfigdialog.h&amp;quot;
&lt;br&gt;+#include &amp;quot;dvbdbusadaptor.h&amp;quot;
&lt;br&gt;&amp;nbsp;#include &amp;quot;dvbepg.h&amp;quot;
&lt;br&gt;&amp;nbsp;#include &amp;quot;dvbmanager.h&amp;quot;
&lt;br&gt;&amp;nbsp;#include &amp;quot;dvbrecording.h&amp;quot;
&lt;br&gt;@@ -424,6 +426,10 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	dvbOsdTimer = new QTimer(this);
&lt;br&gt;&amp;nbsp;	connect(dvbOsdTimer, SIGNAL(timeout()), this, SLOT(osdTimeout()));
&lt;br&gt;+
&lt;br&gt;+	new dvbdbusadaptor(this);
&lt;br&gt;+	QDBusConnection::sessionBus().registerObject(&amp;quot;/DVB&amp;quot;, this);
&lt;br&gt;+	QDBusConnection::sessionBus().registerService(&amp;quot;org.kde.kaffeine&amp;quot;);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;DvbTab::~DvbTab()
&lt;br&gt;diff -Naur ../kaffeine_ori/src/dvb/dvbtab.h ./src/dvb/dvbtab.h
&lt;br&gt;--- ../kaffeine_ori/src/dvb/dvbtab.h	2009-10-30 10:34:30.000000000 +0100
&lt;br&gt;+++ ./src/dvb/dvbtab.h	2009-10-30 11:08:47.000000000 +0100
&lt;br&gt;@@ -42,6 +42,8 @@
&lt;br&gt;&amp;nbsp;class DvbTab : public TabBase
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	Q_OBJECT
&lt;br&gt;+	friend class dvbdbusadaptor;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;public:
&lt;br&gt;&amp;nbsp;	DvbTab(KMenu *menu, KActionCollection *collection, MediaWidget *mediaWidget_);
&lt;br&gt;&amp;nbsp;	~DvbTab();
&lt;br&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Come build with us! The BlackBerry(R) Developer Conference in SF, CA
&lt;br&gt;is the only developer event you need to attend this year. Jumpstart your
&lt;br&gt;developing skills, take BlackBerry mobile applications to market and stay 
&lt;br&gt;ahead of the curve. Join us from November 9 - 12, 2009. Register now!
&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/devconference&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/devconference&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26128565&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/dbus-support-for-kaffeine-tp26128565p26128565.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26128219</id>
	<title>[patch] dbus support for kaffeine</title>
	<published>2009-10-30T03:49:26Z</published>
	<updated>2009-10-30T03:49:26Z</updated>
	<author>
		<name>Pascal Pollet</name>
	</author>
	<content type="html">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&gt;
&lt;html&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body bgcolor=&quot;#ffffff&quot; text=&quot;#000000&quot;&gt;
Hello guys,&lt;br&gt;
&lt;br&gt;
I am since the very beginning of kaffeine a great fan of this
application and use it for watching movies and TV. In the new version,
I miss a dbus interface to be able to use my remote control for
watching TV. As I know a little bit of C++ and Qt, I decided to
implement the dbus features for kaffeine, btw. giving me the occasion
to learn how to do this. Here is a small patch which makes two
functions of dvbtab.cpp available for dbus: previousChannel() and
nextChannel(). It is just a minimal proof of principle, to show you how
I would implement the dbus functionality. I would be really happy to
contribute to this cool project, so if you are interested in my code,
please tell me. I would add dbus support for all functions which should
be accessible from the outside world.&lt;br&gt;
&lt;br&gt;
For my developer background, I like to contribute with mostly small
patches to various open-source projects, and I am the guy from this
project: &lt;a href=&quot;http://www.bongosoft.de&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.bongosoft.de&lt;/a&gt;
(german page!). &lt;br&gt;
Newly, I also started this one:&lt;a href=&quot;http://www.kde-look.org/content/show.php/Babeleo+translator?content=110491&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;
http://www.kde-look.org/content/show.php/Babeleo+translator?content=110491&lt;/a&gt;&lt;br&gt;
In &quot;real life&quot; I am about to finalize a Ph.D. in bioinformatics in the
nice town of Freiburg/Germany...&lt;br&gt;
&lt;br&gt;
I am both French and German, so you can talk to me in any of these
languages, naturally also in English.&lt;br&gt;
&lt;br&gt;
The patch is against revision 1042616 of the SVN tree.&lt;br&gt;
&lt;br&gt;
greetings,&lt;br&gt;
Pascal&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;/body&gt;
&lt;/html&gt;
&lt;br /&gt;diff -Naur ../kaffeine_ori/src/CMakeLists.txt ./src/CMakeLists.txt
&lt;br&gt;--- ../kaffeine_ori/src/CMakeLists.txt	2009-10-30 10:34:30.000000000 +0100
&lt;br&gt;+++ ./src/CMakeLists.txt	2009-10-30 11:08:47.000000000 +0100
&lt;br&gt;@@ -2,6 +2,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;dvb/dvbchannel.cpp
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;dvb/dvbchannelui.cpp
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;dvb/dvbconfigdialog.cpp
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;dvb/dvbdbusadaptor.cpp
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;dvb/dvbdevice.cpp
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;dvb/dvbepg.cpp
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;dvb/dvbmanager.cpp
&lt;br&gt;diff -Naur ../kaffeine_ori/src/dvb/dvbdbusadaptor.cpp ./src/dvb/dvbdbusadaptor.cpp
&lt;br&gt;--- ../kaffeine_ori/src/dvb/dvbdbusadaptor.cpp	1970-01-01 01:00:00.000000000 +0100
&lt;br&gt;+++ ./src/dvb/dvbdbusadaptor.cpp	2009-10-30 11:08:47.000000000 +0100
&lt;br&gt;@@ -0,0 +1,19 @@
&lt;br&gt;+#include &amp;quot;dvbdbusadaptor.h&amp;quot;
&lt;br&gt;+#include &amp;quot;dvbtab.h&amp;quot;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+dvbdbusadaptor::dvbdbusadaptor(QWidget* dvbtab)
&lt;br&gt;+: QDBusAbstractAdaptor(dvbtab)
&lt;br&gt;+{
&lt;br&gt;+	dtab = dynamic_cast&amp;lt;DvbTab*&amp;gt;(dvbtab);
&lt;br&gt;+}
&lt;br&gt;+ 
&lt;br&gt;+Q_NOREPLY void dvbdbusadaptor::previousTvChannel()
&lt;br&gt;+{
&lt;br&gt;+	dtab-&amp;gt;previousChannel();
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+Q_NOREPLY void dvbdbusadaptor::nextTvChannel()
&lt;br&gt;+{
&lt;br&gt;+	dtab-&amp;gt;nextChannel();
&lt;br&gt;+}
&lt;br&gt;diff -Naur ../kaffeine_ori/src/dvb/dvbdbusadaptor.h ./src/dvb/dvbdbusadaptor.h
&lt;br&gt;--- ../kaffeine_ori/src/dvb/dvbdbusadaptor.h	1970-01-01 01:00:00.000000000 +0100
&lt;br&gt;+++ ./src/dvb/dvbdbusadaptor.h	2009-10-30 11:08:47.000000000 +0100
&lt;br&gt;@@ -0,0 +1,19 @@
&lt;br&gt;+#include &amp;lt;QDBusAbstractAdaptor&amp;gt;
&lt;br&gt;+
&lt;br&gt;+class DvbTab;
&lt;br&gt;+
&lt;br&gt;+class dvbdbusadaptor: public QDBusAbstractAdaptor
&lt;br&gt;+{
&lt;br&gt;+	Q_OBJECT
&lt;br&gt;+	Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;org.kde.kaffeine&amp;quot;)
&lt;br&gt;+
&lt;br&gt;+private:
&lt;br&gt;+	DvbTab* dtab;
&lt;br&gt;+
&lt;br&gt;+public:
&lt;br&gt;+	dvbdbusadaptor(QWidget* dvbTab);
&lt;br&gt;+ &amp;nbsp; 
&lt;br&gt;+public slots:
&lt;br&gt;+	void nextTvChannel();
&lt;br&gt;+	void previousTvChannel();
&lt;br&gt;+};
&lt;br&gt;diff -Naur ../kaffeine_ori/src/dvb/dvbtab.cpp ./src/dvb/dvbtab.cpp
&lt;br&gt;--- ../kaffeine_ori/src/dvb/dvbtab.cpp	2009-10-30 10:34:30.000000000 +0100
&lt;br&gt;+++ ./src/dvb/dvbtab.cpp	2009-10-30 11:08:47.000000000 +0100
&lt;br&gt;@@ -21,6 +21,7 @@
&lt;br&gt;&amp;nbsp;#include &amp;quot;dvbtab.h&amp;quot;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#include &amp;lt;QBoxLayout&amp;gt;
&lt;br&gt;+#include &amp;lt;QDBusConnection&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;QDir&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;QHeaderView&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;QPainter&amp;gt;
&lt;br&gt;@@ -37,6 +38,7 @@
&lt;br&gt;&amp;nbsp;#include &amp;quot;../osdwidget.h&amp;quot;
&lt;br&gt;&amp;nbsp;#include &amp;quot;dvbchannelui.h&amp;quot;
&lt;br&gt;&amp;nbsp;#include &amp;quot;dvbconfigdialog.h&amp;quot;
&lt;br&gt;+#include &amp;quot;dvbdbusadaptor.h&amp;quot;
&lt;br&gt;&amp;nbsp;#include &amp;quot;dvbepg.h&amp;quot;
&lt;br&gt;&amp;nbsp;#include &amp;quot;dvbmanager.h&amp;quot;
&lt;br&gt;&amp;nbsp;#include &amp;quot;dvbrecording.h&amp;quot;
&lt;br&gt;@@ -424,6 +426,10 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	dvbOsdTimer = new QTimer(this);
&lt;br&gt;&amp;nbsp;	connect(dvbOsdTimer, SIGNAL(timeout()), this, SLOT(osdTimeout()));
&lt;br&gt;+
&lt;br&gt;+	new dvbdbusadaptor(this);
&lt;br&gt;+	QDBusConnection::sessionBus().registerObject(&amp;quot;/DVB&amp;quot;, this);
&lt;br&gt;+	QDBusConnection::sessionBus().registerService(&amp;quot;org.kde.kaffeine&amp;quot;);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;DvbTab::~DvbTab()
&lt;br&gt;diff -Naur ../kaffeine_ori/src/dvb/dvbtab.h ./src/dvb/dvbtab.h
&lt;br&gt;--- ../kaffeine_ori/src/dvb/dvbtab.h	2009-10-30 10:34:30.000000000 +0100
&lt;br&gt;+++ ./src/dvb/dvbtab.h	2009-10-30 11:08:47.000000000 +0100
&lt;br&gt;@@ -42,6 +42,8 @@
&lt;br&gt;&amp;nbsp;class DvbTab : public TabBase
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	Q_OBJECT
&lt;br&gt;+	friend class dvbdbusadaptor;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;public:
&lt;br&gt;&amp;nbsp;	DvbTab(KMenu *menu, KActionCollection *collection, MediaWidget *mediaWidget_);
&lt;br&gt;&amp;nbsp;	~DvbTab();
&lt;br&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Come build with us! The BlackBerry(R) Developer Conference in SF, CA
&lt;br&gt;is the only developer event you need to attend this year. Jumpstart your
&lt;br&gt;developing skills, take BlackBerry mobile applications to market and stay 
&lt;br&gt;ahead of the curve. Join us from November 9 - 12, 2009. Register now!
&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/devconference&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/devconference&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26128219&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-patch--dbus-support-for-kaffeine-tp26128219p26128219.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26049874</id>
	<title>Re: Review Request: Fix some potential crashes suggested by EBN</title>
	<published>2009-10-25T10:18:41Z</published>
	<updated>2009-10-25T10:18:41Z</updated>
	<author>
		<name>Bugzilla from christophpfister@gmail.com</name>
	</author>
	<content type="html">2009/8/11 Travis &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26049874&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;wordsizzle@...&lt;/a&gt;&amp;gt;:
&lt;br&gt;&amp;gt; Forwarded this from a reviewboard post i made (maybe kaffeine should have a
&lt;br&gt;&amp;gt; group?):
&lt;br&gt;&lt;br&gt;Sorry for not responding to your patches (but that's not your problem;
&lt;br&gt;the suggested solution is ugly). Anyway, a kaffeine group has been
&lt;br&gt;added to reviewboard.
&lt;br&gt;&lt;br&gt;Thanks,
&lt;br&gt;&lt;br&gt;Christoph
&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Come build with us! The BlackBerry(R) Developer Conference in SF, CA
&lt;br&gt;is the only developer event you need to attend this year. Jumpstart your
&lt;br&gt;developing skills, take BlackBerry mobile applications to market and stay 
&lt;br&gt;ahead of the curve. Join us from November 9 - 12, 2009. Register now!
&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/devconference&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/devconference&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26049874&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Review-Request%3A-Fix-some-potential-crashes-suggested-by-EBN-tp24911428p26049874.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-25418878</id>
	<title>Re: Kaffeine as Movie Database manager</title>
	<published>2009-09-12T15:41:14Z</published>
	<updated>2009-09-12T15:41:14Z</updated>
	<author>
		<name>Milot Shala-2</name>
	</author>
	<content type="html">&lt;br&gt;&lt;br&gt;&lt;div class=&quot;gmail_quote&quot;&gt;On Sat, Sep 12, 2009 at 7:35 PM, Christoph Pfister &lt;span dir=&quot;ltr&quot;&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=25418878&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;christophpfister@...&lt;/a&gt;&amp;gt;&lt;/span&gt; wrote:&lt;br&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;
Hi guys,&lt;br&gt;
&lt;br&gt;
There is a relatively simple possibility to integrate such stuff into&lt;br&gt;
Kaffeine: you could create an additional tab (in itws own&lt;br&gt;
subdirectory). Tabs in Kaffeine are quite autonomous, so you can&lt;br&gt;
basically do what you want inside it, and you could use the kaffeine&lt;br&gt;
playback engine (you don&amp;#39;t have to care about subtitles, volume,&lt;br&gt;
fullscreen, etc). Personally I&amp;#39;m not too interested in that feature&lt;br&gt;
(and for example don&amp;#39;t know how it should look like); so that tab&lt;br&gt;
would largely be your responsibility ...&lt;br&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;br&gt;This will be a movie list, user can register a movie in which case the user can add description of a video, rating of that video if it&amp;#39;s a movie maybe a trailer link from youtube and/or information from imdb (this can be automatically when the movie name is entered) and of course the path to the video, then information about how many times the user has watched that video, favorites.&lt;br&gt;
&lt;br&gt;Also we can have a KaffeineSpace which can be a web service that user share their likeness of videos or movies, rate them and recommend them to other people (this idea just popped out :)).&lt;br&gt; &lt;/div&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;

&lt;br&gt;
What do you think about that?&lt;br&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;br&gt;I would like to work on that, because I am already working on my own player that is used only by me personally, why create something that is used only by one person, unless we can work together and bring such features to the masses.&lt;br&gt;
&lt;br&gt;&lt;/div&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;
&lt;br&gt;
Christoph&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
2009/9/12 Milot Shala &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=25418878&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;milot.shala@...&lt;/a&gt;&amp;gt;:&lt;br&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class=&quot;h5&quot;&gt;&amp;gt; Hi Andreas,&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; I was interested in working on Kaffeine, I also wrote my own personal video&lt;br&gt;
&amp;gt; player and it contains personal video management which then creates a simple&lt;br&gt;
&amp;gt; playlist in which the user can have access to their video content and play&lt;br&gt;
&amp;gt; them.&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; If you need any help from my side, feel free to write to me and we can&lt;br&gt;
&amp;gt; arrange a meeting on IRC.&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; On Fri, Sep 11, 2009 at 10:38 PM, Andreas Marschke &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=25418878&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;xxtjaxx@...&lt;/a&gt;&amp;gt;&lt;br&gt;
&amp;gt; wrote:&lt;br&gt;
&amp;gt;&amp;gt;&lt;br&gt;
&amp;gt;&amp;gt; Hi everyone,&lt;br&gt;
&amp;gt;&amp;gt;&lt;br&gt;
&amp;gt;&amp;gt; I want to start to work on Kaffeine. I already started to comment the&lt;br&gt;
&amp;gt;&amp;gt; source&lt;br&gt;
&amp;gt;&amp;gt; code so that it has atleast some basic documentation.&lt;br&gt;
&amp;gt;&amp;gt; This comes especially handy if you use an editor like Emacs/KDevelop when&lt;br&gt;
&amp;gt;&amp;gt; you&lt;br&gt;
&amp;gt;&amp;gt; look at the headers simultanously to development or just want a quick&lt;br&gt;
&amp;gt;&amp;gt; information about what a function actually does.&lt;br&gt;
&amp;gt;&amp;gt;&lt;br&gt;
&amp;gt;&amp;gt; I would like to enhance Kaffeine to a video database application that can&lt;br&gt;
&amp;gt;&amp;gt; manage a big list of movies on the harddrive. Some of the goodness I would&lt;br&gt;
&amp;gt;&amp;gt; like to introduce would be ratings, coments, tags, movie information&lt;br&gt;
&amp;gt;&amp;gt; wikipages&lt;br&gt;
&amp;gt;&amp;gt; and so on and so forth.&lt;br&gt;
&amp;gt;&amp;gt;&lt;br&gt;
&amp;gt;&amp;gt; What do you think about it?&lt;br&gt;
&amp;gt;&amp;gt;&lt;br&gt;
&amp;gt;&amp;gt; Cheers ,&lt;br&gt;
&amp;gt;&amp;gt;&lt;br&gt;
&amp;gt;&amp;gt; Andreas Marschke.&lt;br&gt;
&amp;gt;&amp;gt;&lt;br&gt;
&amp;gt;&amp;gt; ---&lt;br&gt;
&amp;gt;&amp;gt; My blog :&lt;br&gt;
&amp;gt;&amp;gt; &lt;a href=&quot;http://adreasdevblog.wordpress.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://adreasdevblog.wordpress.com&lt;/a&gt;&lt;br&gt;
&amp;gt;&amp;gt;&lt;br&gt;
&amp;gt;&amp;gt; I work with the head developer on this one:&lt;br&gt;
&amp;gt;&amp;gt; &lt;a href=&quot;http://techbase.kde.org/Projects/Aki&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://techbase.kde.org/Projects/Aki&lt;/a&gt;&lt;br&gt;
&amp;gt;&amp;gt;&lt;br&gt;
&amp;gt;&amp;gt; My code repository on github:&lt;br&gt;
&amp;gt;&amp;gt; &lt;a href=&quot;https://github.com/xxtjaxx/xxtjaxxRepository/tree&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://github.com/xxtjaxx/xxtjaxxRepository/tree&lt;/a&gt;&lt;br&gt;
&amp;gt;&amp;gt;&lt;br&gt;
&amp;gt;&amp;gt;&lt;br&gt;
&amp;gt;&amp;gt; ------------------------------------------------------------------------------&lt;br&gt;
&amp;gt;&amp;gt; Let Crystal Reports handle the reporting - Free Crystal Reports 2008&lt;br&gt;
&amp;gt;&amp;gt; 30-Day&lt;br&gt;
&amp;gt;&amp;gt; trial. Simplify your report design, integration and deployment - and focus&lt;br&gt;
&amp;gt;&amp;gt; on&lt;br&gt;
&amp;gt;&amp;gt; what you do best, core application coding. Discover what&amp;#39;s new with&lt;br&gt;
&amp;gt;&amp;gt; Crystal Reports now.  &lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br&gt;
&amp;gt;&amp;gt; _______________________________________________&lt;br&gt;
&amp;gt;&amp;gt; kaffeine-devel mailing list&lt;br&gt;
&amp;gt;&amp;gt; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=25418878&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;&lt;br&gt;
&amp;gt;&amp;gt; &lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; --&lt;br&gt;
&amp;gt; Milot Shala&lt;br&gt;
&amp;gt; gtalk: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=25418878&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;milot.shala@...&lt;/a&gt;&lt;br&gt;
&amp;gt; blog: &lt;a href=&quot;http://www.codespartan.org/blog/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://www.codespartan.org/blog/&lt;/a&gt;&lt;br&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;&lt;br clear=&quot;all&quot;&gt;&lt;br&gt;-- &lt;br&gt;Milot Shala&lt;br&gt;gtalk: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=25418878&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;milot.shala@...&lt;/a&gt;&lt;br&gt;blog: &lt;a href=&quot;http://www.codespartan.org/blog/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.codespartan.org/blog/&lt;/a&gt;&lt;br&gt;

&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with 
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=25418878&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Kaffeine-as-Movie-Database-manager-tp25407973p25418878.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-25416594</id>
	<title>Re: Kaffeine as Movie Database manager</title>
	<published>2009-09-12T10:35:27Z</published>
	<updated>2009-09-12T10:35:27Z</updated>
	<author>
		<name>Bugzilla from christophpfister@gmail.com</name>
	</author>
	<content type="html">Hi guys,
&lt;br&gt;&lt;br&gt;There is a relatively simple possibility to integrate such stuff into
&lt;br&gt;Kaffeine: you could create an additional tab (in itws own
&lt;br&gt;subdirectory). Tabs in Kaffeine are quite autonomous, so you can
&lt;br&gt;basically do what you want inside it, and you could use the kaffeine
&lt;br&gt;playback engine (you don't have to care about subtitles, volume,
&lt;br&gt;fullscreen, etc). Personally I'm not too interested in that feature
&lt;br&gt;(and for example don't know how it should look like); so that tab
&lt;br&gt;would largely be your responsibility ...
&lt;br&gt;&lt;br&gt;What do you think about that?
&lt;br&gt;&lt;br&gt;Christoph
&lt;br&gt;&lt;br&gt;&lt;br&gt;2009/9/12 Milot Shala &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=25416594&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;milot.shala@...&lt;/a&gt;&amp;gt;:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Hi Andreas,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I was interested in working on Kaffeine, I also wrote my own personal video
&lt;br&gt;&amp;gt; player and it contains personal video management which then creates a simple
&lt;br&gt;&amp;gt; playlist in which the user can have access to their video content and play
&lt;br&gt;&amp;gt; them.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; If you need any help from my side, feel free to write to me and we can
&lt;br&gt;&amp;gt; arrange a meeting on IRC.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; On Fri, Sep 11, 2009 at 10:38 PM, Andreas Marschke &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=25416594&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;xxtjaxx@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Hi everyone,
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; I want to start to work on Kaffeine. I already started to comment the
&lt;br&gt;&amp;gt;&amp;gt; source
&lt;br&gt;&amp;gt;&amp;gt; code so that it has atleast some basic documentation.
&lt;br&gt;&amp;gt;&amp;gt; This comes especially handy if you use an editor like Emacs/KDevelop when
&lt;br&gt;&amp;gt;&amp;gt; you
&lt;br&gt;&amp;gt;&amp;gt; look at the headers simultanously to development or just want a quick
&lt;br&gt;&amp;gt;&amp;gt; information about what a function actually does.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; I would like to enhance Kaffeine to a video database application that can
&lt;br&gt;&amp;gt;&amp;gt; manage a big list of movies on the harddrive. Some of the goodness I would
&lt;br&gt;&amp;gt;&amp;gt; like to introduce would be ratings, coments, tags, movie information
&lt;br&gt;&amp;gt;&amp;gt; wikipages
&lt;br&gt;&amp;gt;&amp;gt; and so on and so forth.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; What do you think about it?
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Cheers ,
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Andreas Marschke.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; ---
&lt;br&gt;&amp;gt;&amp;gt; My blog :
&lt;br&gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://adreasdevblog.wordpress.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://adreasdevblog.wordpress.com&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; I work with the head developer on this one:
&lt;br&gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://techbase.kde.org/Projects/Aki&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://techbase.kde.org/Projects/Aki&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; My code repository on github:
&lt;br&gt;&amp;gt;&amp;gt; &lt;a href=&quot;https://github.com/xxtjaxx/xxtjaxxRepository/tree&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://github.com/xxtjaxx/xxtjaxxRepository/tree&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; ------------------------------------------------------------------------------
&lt;br&gt;&amp;gt;&amp;gt; Let Crystal Reports handle the reporting - Free Crystal Reports 2008
&lt;br&gt;&amp;gt;&amp;gt; 30-Day
&lt;br&gt;&amp;gt;&amp;gt; trial. Simplify your report design, integration and deployment - and focus
&lt;br&gt;&amp;gt;&amp;gt; on
&lt;br&gt;&amp;gt;&amp;gt; what you do best, core application coding. Discover what's new with
&lt;br&gt;&amp;gt;&amp;gt; Crystal Reports now.  &lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt; _______________________________________________
&lt;br&gt;&amp;gt;&amp;gt; kaffeine-devel mailing list
&lt;br&gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=25416594&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt; &lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; --
&lt;br&gt;&amp;gt; Milot Shala
&lt;br&gt;&amp;gt; gtalk: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=25416594&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;milot.shala@...&lt;/a&gt;
&lt;br&gt;&amp;gt; blog: &lt;a href=&quot;http://www.codespartan.org/blog/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.codespartan.org/blog/&lt;/a&gt;&lt;/div&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with 
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=25416594&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Kaffeine-as-Movie-Database-manager-tp25407973p25416594.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-25409755</id>
	<title>Re: Kaffeine as Movie Database manager</title>
	<published>2009-09-11T16:16:06Z</published>
	<updated>2009-09-11T16:16:06Z</updated>
	<author>
		<name>Milot Shala-2</name>
	</author>
	<content type="html">Hi Andreas,&lt;br&gt;&lt;br&gt;I was interested in working on Kaffeine, I also wrote my own personal video player and it contains personal video management which then creates a simple playlist in which the user can have access to their video content and play them.&lt;br&gt;
&lt;br&gt;If you need any help from my side, feel free to write to me and we can arrange a meeting on IRC.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class=&quot;gmail_quote&quot;&gt;On Fri, Sep 11, 2009 at 10:38 PM, Andreas Marschke &lt;span dir=&quot;ltr&quot;&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=25409755&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;xxtjaxx@...&lt;/a&gt;&amp;gt;&lt;/span&gt; wrote:&lt;br&gt;
&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;Hi everyone,&lt;br&gt;
&lt;br&gt;
I want to start to work on Kaffeine. I already started to comment the source&lt;br&gt;
code so that it has atleast some basic documentation.&lt;br&gt;
This comes especially handy if you use an editor like Emacs/KDevelop when you&lt;br&gt;
look at the headers simultanously to development or just want a quick&lt;br&gt;
information about what a function actually does.&lt;br&gt;
&lt;br&gt;
I would like to enhance Kaffeine to a video database application that can&lt;br&gt;
manage a big list of movies on the harddrive. Some of the goodness I would&lt;br&gt;
like to introduce would be ratings, coments, tags, movie information wikipages&lt;br&gt;
and so on and so forth.&lt;br&gt;
&lt;br&gt;
What do you think about it?&lt;br&gt;
&lt;br&gt;
Cheers ,&lt;br&gt;
&lt;br&gt;
Andreas Marschke.&lt;br&gt;
&lt;br&gt;
---&lt;br&gt;
My blog :&lt;br&gt;
&lt;a href=&quot;http://adreasdevblog.wordpress.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://adreasdevblog.wordpress.com&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
I work with the head developer on this one:&lt;br&gt;
&lt;a href=&quot;http://techbase.kde.org/Projects/Aki&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://techbase.kde.org/Projects/Aki&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
My code repository on github:&lt;br&gt;
&lt;a href=&quot;https://github.com/xxtjaxx/xxtjaxxRepository/tree&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://github.com/xxtjaxx/xxtjaxxRepository/tree&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
------------------------------------------------------------------------------&lt;br&gt;
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day&lt;br&gt;
trial. Simplify your report design, integration and deployment - and focus on&lt;br&gt;
what you do best, core application coding. Discover what&amp;#39;s new with&lt;br&gt;
Crystal Reports now.  &lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br&gt;
_______________________________________________&lt;br&gt;
kaffeine-devel mailing list&lt;br&gt;
&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=25409755&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;
&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;&lt;br clear=&quot;all&quot;&gt;&lt;br&gt;-- &lt;br&gt;Milot Shala&lt;br&gt;gtalk: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=25409755&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;milot.shala@...&lt;/a&gt;&lt;br&gt;blog: &lt;a href=&quot;http://www.codespartan.org/blog/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.codespartan.org/blog/&lt;/a&gt;&lt;br&gt;

&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with 
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=25409755&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Kaffeine-as-Movie-Database-manager-tp25407973p25409755.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-25407973</id>
	<title>Kaffeine as Movie Database manager</title>
	<published>2009-09-11T13:38:01Z</published>
	<updated>2009-09-11T13:38:01Z</updated>
	<author>
		<name>Andreas Marschke</name>
	</author>
	<content type="html">Hi everyone,
&lt;br&gt;&lt;br&gt;I want to start to work on Kaffeine. I already started to comment the source 
&lt;br&gt;code so that it has atleast some basic documentation. 
&lt;br&gt;This comes especially handy if you use an editor like Emacs/KDevelop when you 
&lt;br&gt;look at the headers simultanously to development or just want a quick 
&lt;br&gt;information about what a function actually does.
&lt;br&gt;&lt;br&gt;I would like to enhance Kaffeine to a video database application that can 
&lt;br&gt;manage a big list of movies on the harddrive. Some of the goodness I would 
&lt;br&gt;like to introduce would be ratings, coments, tags, movie information wikipages 
&lt;br&gt;and so on and so forth.
&lt;br&gt;&lt;br&gt;What do you think about it? 
&lt;br&gt;&lt;br&gt;Cheers ,
&lt;br&gt;&lt;br&gt;Andreas Marschke.
&lt;br&gt;&lt;br&gt;---
&lt;br&gt;My blog :
&lt;br&gt;&lt;a href=&quot;http://adreasdevblog.wordpress.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://adreasdevblog.wordpress.com&lt;/a&gt;&lt;br&gt;&lt;br&gt;I work with the head developer on this one:
&lt;br&gt;&lt;a href=&quot;http://techbase.kde.org/Projects/Aki&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://techbase.kde.org/Projects/Aki&lt;/a&gt;&lt;br&gt;&lt;br&gt;My code repository on github:
&lt;br&gt;&lt;a href=&quot;https://github.com/xxtjaxx/xxtjaxxRepository/tree&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://github.com/xxtjaxx/xxtjaxxRepository/tree&lt;/a&gt;&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with 
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=25407973&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Kaffeine-as-Movie-Database-manager-tp25407973p25407973.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-24911428</id>
	<title>Review Request: Fix some potential crashes suggested by EBN</title>
	<published>2009-08-10T21:18:00Z</published>
	<updated>2009-08-10T21:18:00Z</updated>
	<author>
		<name>Bugzilla from wordsizzle@gmail.com</name>
	</author>
	<content type="html">Forwarded this from a reviewboard post i made (maybe kaffeine should have a 
&lt;br&gt;group?):
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; -----------------------------------------------------------
&lt;br&gt;&amp;gt; This is an automatically generated e-mail. To reply, visit:
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://reviewboard.kde.org/r/1263/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://reviewboard.kde.org/r/1263/&lt;/a&gt;&lt;br&gt;&amp;gt; -----------------------------------------------------------
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Review request for Travis McHenry.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Summary
&lt;br&gt;&amp;gt; -------
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; This fixes the 5 krazy2 issues found on EBN in kaffeine.
&lt;br&gt;&amp;gt;&lt;a href=&quot;http://www.englishbreakfastnetwork.org/krazy/reports/extragear/multimedia/kaffeine/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.englishbreakfastnetwork.org/krazy/reports/extragear/multimedia/kaffeine/&lt;/a&gt;&amp;nbsp;
&lt;br&gt;&amp;gt; Four of them are to avoid crashing with the dialogs (discussed here:
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://www.kdedevelopers.org/node/3919&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.kdedevelopers.org/node/3919&lt;/a&gt;&amp;nbsp;) and the last one is to add the
&lt;br&gt;&amp;gt; Q_OBJECT macro to dvbdevice_linux.h
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I'm putting it up here instead of committing it because I don't want to
&lt;br&gt;&amp;gt; step on anybody's toes. :)
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I put just myself as the reviewer because there isn't a kaffeine group and
&lt;br&gt;&amp;gt; I didn't want to send it to the wrong people. :-/ I'll be forwarding
&lt;br&gt;&amp;gt; whatever mail I get to kaffeine-devel.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Diffs
&lt;br&gt;&amp;gt; -----
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; /trunk/extragear/multimedia/kaffeine/src/dvb/dvbchannelui.cpp 1009874
&lt;br&gt;&amp;gt; &amp;nbsp; /trunk/extragear/multimedia/kaffeine/src/dvb/dvbdevice_linux.h 1009874
&lt;br&gt;&amp;gt; &amp;nbsp; /trunk/extragear/multimedia/kaffeine/src/dvb/dvbrecording.cpp 1009874
&lt;br&gt;&amp;gt; &amp;nbsp; /trunk/extragear/multimedia/kaffeine/src/mediawidget.cpp 1009874
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Diff: &lt;a href=&quot;http://reviewboard.kde.org/r/1263/diff&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://reviewboard.kde.org/r/1263/diff&lt;/a&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Testing
&lt;br&gt;&amp;gt; -------
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; It builds and I tested what dialogs I could. I'm not sure how to get to all
&lt;br&gt;&amp;gt; of them without having a dvb setup.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Thanks,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Travis
&lt;/div&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with 
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=24911428&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Review-Request%3A-Fix-some-potential-crashes-suggested-by-EBN-tp24911428p24911428.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-24138672</id>
	<title>Re: navigation bar orientation (patch)</title>
	<published>2009-06-21T13:48:08Z</published>
	<updated>2009-06-21T13:48:08Z</updated>
	<author>
		<name>Bugzilla from jgoday@gmail.com</name>
	</author>
	<content type="html">Thanks a lot for commit it :)&lt;br&gt;&lt;br&gt;
&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Are you an open source citizen? Join us for the Open Source Bridge conference!
&lt;br&gt;Portland, OR, June 17-19. Two days of sessions, one day of unconference: $250.
&lt;br&gt;Need another reason to go? 24-hour hacker lounge. Register today!
&lt;br&gt;&lt;a href=&quot;http://ad.doubleclick.net/clk;215844324;13503038;v?http://opensourcebridge.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://ad.doubleclick.net/clk;215844324;13503038;v?http://opensourcebridge.org&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=24138672&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/navigation-bar-orientation-%28patch%29-tp24134367p24138672.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-24138504</id>
	<title>Re: navigation bar orientation (patch)</title>
	<published>2009-06-21T13:27:22Z</published>
	<updated>2009-06-21T13:27:22Z</updated>
	<author>
		<name>Bugzilla from christophpfister@gmail.com</name>
	</author>
	<content type="html">Hi Javier,
&lt;br&gt;&lt;br&gt;2009/6/21 Javier Goday &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=24138504&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;jgoday@...&lt;/a&gt;&amp;gt;:
&lt;br&gt;&amp;gt; Hi, i attach a patch to automatic change the navigation bar tabs orientation
&lt;br&gt;&amp;gt; (North or west), depending of the areas in the main window.
&lt;br&gt;&lt;br&gt;Applied (after some beautification), thanks!
&lt;br&gt;&lt;br&gt;&amp;gt; Regards.
&lt;br&gt;&lt;br&gt;Christoph
&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Are you an open source citizen? Join us for the Open Source Bridge conference!
&lt;br&gt;Portland, OR, June 17-19. Two days of sessions, one day of unconference: $250.
&lt;br&gt;Need another reason to go? 24-hour hacker lounge. Register today!
&lt;br&gt;&lt;a href=&quot;http://ad.doubleclick.net/clk;215844324;13503038;v?http://opensourcebridge.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://ad.doubleclick.net/clk;215844324;13503038;v?http://opensourcebridge.org&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=24138504&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/navigation-bar-orientation-%28patch%29-tp24134367p24138504.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-24134367</id>
	<title>navigation bar orientation (patch)</title>
	<published>2009-06-21T05:56:27Z</published>
	<updated>2009-06-21T05:56:27Z</updated>
	<author>
		<name>Bugzilla from jgoday@gmail.com</name>
	</author>
	<content type="html">Hi, i attach a patch to automatic change the navigation bar tabs orientation (North or west), depending of the areas in the main window.&lt;br&gt;&lt;br&gt;Regards.&lt;br&gt;
&lt;br /&gt;&lt;tt&gt;[kaffeine-tabs-orientation.patch]&lt;/tt&gt;&lt;br /&gt;&lt;hr align=&quot;left&quot; width=&quot;300&quot; /&gt;&lt;tt&gt;Index: src/kaffeine.cpp
&lt;br&gt;===================================================================
&lt;br&gt;--- src/kaffeine.cpp	(revision 984709)
&lt;br&gt;+++ src/kaffeine.cpp	(working copy)
&lt;br&gt;@@ -182,6 +182,8 @@
&lt;br&gt;&amp;nbsp;	// navigation bar - keep in sync with TabIndex enum!
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	navigationBar = new KToolBar(&amp;quot;navigation_bar&amp;quot;, this, Qt::LeftToolBarArea);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;connect(navigationBar, SIGNAL(orientationChanged(Qt::Orientation)),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this, SLOT(navigationBarOrientationChanged(Qt::Orientation)));
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	tabBar = new KTabBar(navigationBar);
&lt;br&gt;&amp;nbsp;	tabBar-&amp;gt;addTab(KIcon(&amp;quot;start-here-kde&amp;quot;), i18n(&amp;quot;Start&amp;quot;));
&lt;br&gt;@@ -465,6 +467,16 @@
&lt;br&gt;&amp;nbsp;	setCursor(Qt::BlankCursor);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+void Kaffeine::navigationBarOrientationChanged(Qt::Orientation orientation)
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if (orientation == Qt::Horizontal) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tabBar-&amp;gt;setShape(KTabBar::RoundedNorth);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tabBar-&amp;gt;setShape(KTabBar::RoundedWest);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;bool Kaffeine::event(QEvent *event)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	bool retVal = KMainWindow::event(event); // this has to be done before calling setVisible()
&lt;br&gt;@@ -520,4 +532,4 @@
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	KMainWindow::leaveEvent(event);
&lt;br&gt;-}
&lt;br&gt;+}
&lt;br&gt;\ No newline at end of file
&lt;br&gt;Index: src/kaffeine.h
&lt;br&gt;===================================================================
&lt;br&gt;--- src/kaffeine.h	(revision 984709)
&lt;br&gt;+++ src/kaffeine.h	(working copy)
&lt;br&gt;@@ -61,6 +61,8 @@
&lt;br&gt;&amp;nbsp;	void activateTab(int tabIndex);
&lt;br&gt;&amp;nbsp;	void hideCursor();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void navigationBarOrientationChanged(Qt::Orientation orientation);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;private:
&lt;br&gt;&amp;nbsp;	enum TabIndex {
&lt;br&gt;&amp;nbsp;		StartTabId = 0,
&lt;br&gt;&lt;/tt&gt;&lt;hr align=&quot;left&quot; width=&quot;300&quot; /&gt;&lt;br /&gt; &lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Are you an open source citizen? Join us for the Open Source Bridge conference!
&lt;br&gt;Portland, OR, June 17-19. Two days of sessions, one day of unconference: $250.
&lt;br&gt;Need another reason to go? 24-hour hacker lounge. Register today!
&lt;br&gt;&lt;a href=&quot;http://ad.doubleclick.net/clk;215844324;13503038;v?http://opensourcebridge.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://ad.doubleclick.net/clk;215844324;13503038;v?http://opensourcebridge.org&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=24134367&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;&lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;snapshot66.png&lt;/strong&gt; (90K) &lt;a href=&quot;http://old.nabble.com/attachment/24134367/0/snapshot66.png&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/navigation-bar-orientation-%28patch%29-tp24134367p24134367.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-23245991</id>
	<title>Kaffeine 1.0-pre1 released</title>
	<published>2009-04-26T13:02:02Z</published>
	<updated>2009-04-26T13:02:02Z</updated>
	<author>
		<name>Bugzilla from christophpfister@gmail.com</name>
	</author>
	<content type="html">This is a pre-release of the KDE4 version mainly intended as a preview
&lt;br&gt;(there are still main features missing). A release more suitable for
&lt;br&gt;end users is planned 1 - 1.5 months later. See the full announcement
&lt;br&gt;at &lt;a href=&quot;http://kaffeine.kde.org/?q=node/22&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://kaffeine.kde.org/?q=node/22&lt;/a&gt;.
&lt;br&gt;&lt;br&gt;Christoph
&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Crystal Reports &amp;#45; New Free Runtime and 30 Day Trial
&lt;br&gt;Check out the new simplified licensign option that enables unlimited
&lt;br&gt;royalty&amp;#45;free distribution of the report engine for externally facing 
&lt;br&gt;server and web deployment.
&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/businessobjects&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/businessobjects&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23245991&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Kaffeine-1.0-pre1-released-tp23245991p23245991.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-21408754</id>
	<title>Proposal for Kaffeine.</title>
	<published>2009-01-11T21:34:06Z</published>
	<updated>2009-01-11T21:34:06Z</updated>
	<author>
		<name>Garrymar</name>
	</author>
	<content type="html">Hello, Kaffeine's developers. Sorry for disturb and my bad English.
&lt;br&gt;I think Kaffeine's &amp;quot;Channels&amp;quot; window can be more useful, if it will have
&lt;br&gt;a checkbox that allow to speak current Signal/SNR value to the line-out.
&lt;br&gt;It will help peoples in fine tuning Satellite dishes. Yesterday, I used
&lt;br&gt;Kaffeine's channels window for this reason. I'm ask for help my friend,
&lt;br&gt;and we used mobile phones for tuning Satellite dish. This method not so
&lt;br&gt;flexible as speaking values to line-out.
&lt;br&gt;&amp;nbsp;It is only proposal. I think this may be really useful thing in
&lt;br&gt;Kaffeine. Again, sorry for disturb. Thank you!
&lt;br&gt;&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Check out the new SourceForge.net Marketplace.
&lt;br&gt;It is the best place to buy or sell services for
&lt;br&gt;just about anything Open Source.
&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/Xq1LFB&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/Xq1LFB&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21408754&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Proposal-for-Kaffeine.-tp21408754p21408754.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-20583187</id>
	<title>dvbOSDSkip does not work propertly when &quot;the next channel&quot; does not have a current_channel-&gt;num+1</title>
	<published>2008-11-19T08:12:13Z</published>
	<updated>2008-11-19T08:12:13Z</updated>
	<author>
		<name>Leo Iannacone</name>
	</author>
	<content type="html">Hello everyone,
&lt;br&gt;&lt;br&gt;my name is Leo Iannacone and I just started using kaffeine to see
&lt;br&gt;satellite TV on my PC.
&lt;br&gt;&lt;br&gt;I immediately found a problem:
&lt;br&gt;&lt;br&gt;while displaying the OSD informations of a channel, I wanted to go to
&lt;br&gt;the next channel informations, if the channel had not a
&lt;br&gt;`current_channel-&amp;gt;num= (+/-) 1` number, so I couldn't watch OSD infos of
&lt;br&gt;the channel that I was looking for.
&lt;br&gt;&lt;br&gt;To better explain:
&lt;br&gt;I'm watching channel num. 301.
&lt;br&gt;Read OSD infos, skip to the next channel (302), and skip to the next too
&lt;br&gt;(304).
&lt;br&gt;The last channel (304) has not the `current_ch-&amp;gt;num+1` (I don't have in
&lt;br&gt;channels list a channel-&amp;gt;num=303), so OSD is locked on the
&lt;br&gt;current_channel (302) infos, unable to jump to channel 304.
&lt;br&gt;&lt;br&gt;I modified the function dvbOSDSkip file kaffeine/src/input/dvbpanel.cpp
&lt;br&gt;just adding a simple `while`. Now the OSD is displayed properly.
&lt;br&gt;&lt;br&gt;The changes are very simple, see the attachment. I've tried it in
&lt;br&gt;extreme cases (as jumping from channel 900 to channel 10090) and seems
&lt;br&gt;to work fine.
&lt;br&gt;&lt;br&gt;Regards,
&lt;br&gt;Leo.
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;GPG Key ID: 1024D/D59257A9
&lt;br&gt;Key fingerprint: DC75 469F 4831 4293 81A4 423C 6884 31F6 D592 57A9
&lt;br&gt;More info: &lt;a href=&quot;http://wiki.ubuntu.com/LeoIannacone&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://wiki.ubuntu.com/LeoIannacone&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br /&gt;--- kaffeine/src/input/dvb/dvbpanel.cpp	2008-11-19 14:26:25.000000000 +0100
&lt;br&gt;+++ kaffeine/src/input/dvb/dvbpanel.new.cpp	2008-11-19 14:26:22.000000000 +0100
&lt;br&gt;@@ -812,26 +812,32 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	int mychan = -1;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	if (browseDvbStream == -1)
&lt;br&gt;-		mychan = dvbConfig-&amp;gt;lastChannel;
&lt;br&gt;-	else
&lt;br&gt;-		mychan = browseDvbStream + skip;
&lt;br&gt;-
&lt;br&gt;-	if (mychan &amp;lt; minChannelNumber)
&lt;br&gt;-		mychan = maxChannelNumber;
&lt;br&gt;-	else if (mychan &amp;gt; maxChannelNumber)
&lt;br&gt;-		mychan = minChannelNumber;
&lt;br&gt;+	while(!chan)
&lt;br&gt;+	{
&lt;br&gt;+		if (browseDvbStream == -1)
&lt;br&gt;+			mychan = dvbConfig-&amp;gt;lastChannel;
&lt;br&gt;+		else
&lt;br&gt;+			mychan = browseDvbStream + skip;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	for (int i = 0; i &amp;lt; (int)channels.count(); i ++) {
&lt;br&gt;-		if ((int) channels.at(i)-&amp;gt;num == mychan) {
&lt;br&gt;-			chan = channels.at(i);
&lt;br&gt;-			break;
&lt;br&gt;+		if (mychan &amp;lt; minChannelNumber)
&lt;br&gt;+			mychan = maxChannelNumber;
&lt;br&gt;+		else if (mychan &amp;gt; maxChannelNumber)
&lt;br&gt;+			mychan = minChannelNumber;
&lt;br&gt;+
&lt;br&gt;+		for (int i = 0; i &amp;lt; (int)channels.count(); i ++) {
&lt;br&gt;+			if ((int) channels.at(i)-&amp;gt;num == mychan) {
&lt;br&gt;+				chan = channels.at(i);
&lt;br&gt;+				break;
&lt;br&gt;+			}	
&lt;br&gt;&amp;nbsp;		}
&lt;br&gt;+	
&lt;br&gt;+		if(skip &amp;lt; 0)
&lt;br&gt;+			skip --;
&lt;br&gt;+		if (skip &amp;gt; 0) 
&lt;br&gt;+			skip ++;
&lt;br&gt;+		
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	if (!chan)
&lt;br&gt;-		return;
&lt;br&gt;-
&lt;br&gt;&amp;nbsp;	for (int j = 0; j &amp;lt; (int)dvb.count(); j ++) {
&lt;br&gt;&amp;nbsp;		if (dvb.at(j)-&amp;gt;canSource(chan)) {
&lt;br&gt;&amp;nbsp;			d = dvb.at(j);
&lt;br&gt;&lt;br /&gt;-------------------------------------------------------------------------
&lt;br&gt;This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
&lt;br&gt;Build the coolest Linux based applications with Moblin SDK &amp; win great prizes
&lt;br&gt;Grand prize is a trip for two to an Open Source event anywhere in the world
&lt;br&gt;&lt;a href=&quot;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=20583187&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/dvbOSDSkip-does-not-work-propertly-when-%22the-next-channel%22-does-not-have-a-current_channel-%3Enum%2B1-tp20583187p20583187.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-19941206</id>
	<title>Re: How to write visualization plugin for kaffeine?</title>
	<published>2008-10-12T05:25:36Z</published>
	<updated>2008-10-12T05:25:36Z</updated>
	<author>
		<name>Bugzilla from christophpfister@gmail.com</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;&lt;br&gt;2008/10/12 Tsing Yue &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=19941206&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;waywardson@...&lt;/a&gt;&amp;gt;:
&lt;br&gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; I'm a greenhand on programming, and I want to begin my linux programing with a visualization plugin for kaffeine. &amp;nbsp;But I don't know where to start. Could you tell me some stuff such as the interface between kaffeine and it's visualization plugins?
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; Thanks.
&lt;br&gt;&lt;br&gt;The visualization plugins are part of xine-lib (xine-lib is a
&lt;br&gt;multimedia library responsible for the actual playback in kaffeine).
&lt;br&gt;&lt;br&gt;Christoph
&lt;br&gt;&lt;br&gt;-------------------------------------------------------------------------
&lt;br&gt;This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
&lt;br&gt;Build the coolest Linux based applications with Moblin SDK &amp; win great prizes
&lt;br&gt;Grand prize is a trip for two to an Open Source event anywhere in the world
&lt;br&gt;&lt;a href=&quot;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=19941206&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/How-to-write-visualization-plugin-for-kaffeine--tp19938129p19941206.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-19938129</id>
	<title>How to write visualization plugin for kaffeine?</title>
	<published>2008-10-11T18:31:50Z</published>
	<updated>2008-10-11T18:31:50Z</updated>
	<author>
		<name>gfdice</name>
	</author>
	<content type="html">Hi,&lt;br&gt;  &amp;nbsp; I'm&amp;nbsp;a&amp;nbsp;greenhand&amp;nbsp;on&amp;nbsp;programming,&amp;nbsp;and&amp;nbsp;I&amp;nbsp;want&amp;nbsp;to&amp;nbsp;begin&amp;nbsp;my&amp;nbsp;linux&amp;nbsp;programing&amp;nbsp;with&amp;nbsp;a&amp;nbsp;visualization&amp;nbsp;plugin&amp;nbsp;for&amp;nbsp;kaffeine.  But&amp;nbsp;I&amp;nbsp;don't&amp;nbsp;know&amp;nbsp;where&amp;nbsp;to&amp;nbsp;start.&amp;nbsp;Could&amp;nbsp;you&amp;nbsp;tell&amp;nbsp;me&amp;nbsp;some&amp;nbsp;stuff&amp;nbsp;such&amp;nbsp;as&amp;nbsp;the&amp;nbsp;interface&amp;nbsp;between&amp;nbsp;kaffeine&amp;nbsp;and&amp;nbsp;it's&amp;nbsp;visualization&amp;nbsp;plugins?&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thanks.&lt;br /&gt;-------------------------------------------------------------------------
&lt;br&gt;This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
&lt;br&gt;Build the coolest Linux based applications with Moblin SDK &amp; win great prizes
&lt;br&gt;Grand prize is a trip for two to an Open Source event anywhere in the world
&lt;br&gt;&lt;a href=&quot;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;kaffeine-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=19938129&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kaffeine-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/kaffeine-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/How-to-write-visualization-plugin-for-kaffeine--tp19938129p19938129.html" />
</entry>

</feed>
