summaryrefslogtreecommitdiff
path: root/patch
diff options
context:
space:
mode:
Diffstat (limited to 'patch')
-rw-r--r--patch/epgsearch-0.9.24.diff71
-rw-r--r--patch/extrecmenu-1.1.diff20
-rw-r--r--patch/mailbox-0.5.0-mailcount.diff78
-rw-r--r--patch/mp3-0.9.15pre14_graphtft-cover-file.diff119
-rw-r--r--patch/muggle-0.0.8_graphtft_cover_file.diff103
-rw-r--r--patch/remotetimers.patch52
-rw-r--r--patch/vdr-2.2.0_graphtftng.diff157
-rw-r--r--patch/vdr-2.3.1_graphtftng.diff157
-rw-r--r--patch/xsnow-gtftng.patch66
9 files changed, 823 insertions, 0 deletions
diff --git a/patch/epgsearch-0.9.24.diff b/patch/epgsearch-0.9.24.diff
new file mode 100644
index 0000000..b1e2f25
--- /dev/null
+++ b/patch/epgsearch-0.9.24.diff
@@ -0,0 +1,71 @@
+--- ../plain.0/epgsearch-0.9.24//menu_main.c 2008-04-13 20:53:44.000000000 +0200
++++ menu_main.c 2008-09-27 14:05:23.000000000 +0200
+@@ -73,6 +73,23 @@
+ }
+ }
+
++#ifdef USE_GRAPHTFT
++void cMenuSearchMain::Display(void)
++{
++ cOsdMenu::Display();
++
++ if (Count() > 0)
++ {
++ int i = 0;
++
++ for (cOsdItem *item = First(); item; item = Next(item))
++ cStatus::MsgOsdEventItem(!item->Selectable() ? 0 :
++ ((cMenuMyScheduleItem*)item)->event,
++ item->Text(), i++, Count());
++ }
++}
++#endif /* GRAPHTFT */
++
+ cMenuSearchMain::~cMenuSearchMain()
+ {
+ cMenuWhatsOnSearch::ScheduleChannel(); // makes sure any posted data is cleared
+--- ../plain.0/epgsearch-0.9.24//menu_main.h 2008-04-13 20:53:43.000000000 +0200
++++ menu_main.h 2008-09-09 21:43:40.000000000 +0200
+@@ -57,6 +57,7 @@
+ void UpdateCurrent();
+ #ifdef USE_GRAPHTFT
+ virtual const char* MenuKind() { return "MenuEpgsSchedule"; }
++ virtual void Display(void);
+ #endif
+ };
+
+--- ../plain.0/epgsearch-0.9.24//menu_whatson.c 2008-04-22 19:18:24.000000000 +0200
++++ menu_whatson.c 2008-09-27 14:05:47.000000000 +0200
+@@ -296,7 +296,22 @@
+ if (currentShowMode > showNext) return "MenuEpgsWhatsOnElse";
+ else return "MenuWhatsOnElse";
+ }
+-#endif
++
++void cMenuWhatsOnSearch::Display(void)
++{
++ cOsdMenu::Display();
++
++ if (Count() > 0)
++ {
++ int i = 0;
++
++ for (cOsdItem *item = First(); item; item = Next(item))
++ cStatus::MsgOsdEventItem(!item->Selectable() ? 0 :
++ ((cMenuMyScheduleItem*)item)->event,
++ item->Text(), i++, Count());
++ }
++}
++#endif /* GRAPHTFT */
+
+ int cMenuWhatsOnSearch::GetTab(int Tab)
+ {
+--- ../plain.0/epgsearch-0.9.24//menu_whatson.h 2008-04-13 20:53:42.000000000 +0200
++++ menu_whatson.h 2008-09-09 21:43:12.000000000 +0200
+@@ -79,6 +79,7 @@
+ void UpdateCurrent();
+ #ifdef USE_GRAPHTFT
+ virtual const char* MenuKind();
++ virtual void Display(void);
+ #endif
+ };
diff --git a/patch/extrecmenu-1.1.diff b/patch/extrecmenu-1.1.diff
new file mode 100644
index 0000000..fb71096
--- /dev/null
+++ b/patch/extrecmenu-1.1.diff
@@ -0,0 +1,20 @@
+--- ../plain.0/extrecmenu-1.1//./mymenurecordings.c 2007-10-24 19:29:46.000000000 +0200
++++ ./mymenurecordings.c 2007-11-18 18:14:50.000000000 +0100
+@@ -51,6 +54,10 @@
+ {
+ cOsdMenu::Display();
+
++#ifdef USE_GRAPHTFT
++ cStatus::MsgOsdSetRecording(recording);
++#endif
++
+ if(mysetup.UseVDRsRecInfoMenu)
+ {
+ DisplayMenu()->SetRecording(recording);
+@@ -93,6 +100,7 @@
+ text << tr("Lifetime") << ": " << recording->lifetime << "\n";
+
+ DisplayMenu()->SetText(text.str().c_str(),false);
++ cStatus::MsgOsdTextItem(text.str().c_str());
+ }
+ }
diff --git a/patch/mailbox-0.5.0-mailcount.diff b/patch/mailbox-0.5.0-mailcount.diff
new file mode 100644
index 0000000..0f13dab
--- /dev/null
+++ b/patch/mailbox-0.5.0-mailcount.diff
@@ -0,0 +1,78 @@
+--- ../plain.0/mailbox-0.5.0/AxMailBoxServiceTypes.h 2006-03-03 15:52:16.000000000 +0100
++++ AxMailBoxServiceTypes.h 2007-11-17 15:43:24.000000000 +0100
+@@ -31,6 +31,7 @@
+ // Service-Names (ID)
+ //=============================================================================
+ #define MailBox_HasNewMail_v1_0_NAME "MailBox-HasNewMail-1.0"
++#define MailBox_GetTotalUnseen_v1_0_NAME "MailBox-GetTotalUnseen-1.0"
+
+ //=============================================================================
+ // service MailBox-HasNewMail-1.0
+--- ../plain.0/mailbox-0.5.0/AxMailChecker.cpp 2006-06-09 19:16:00.000000000 +0200
++++ AxMailChecker.cpp 2007-11-17 15:40:47.000000000 +0100
+@@ -209,6 +209,7 @@
+ unsigned long aSumUnread = 0;
+ unsigned long aSumSIF = 0;
+ bool fAbort = false;
++ int unseen = 0;
+
+ //----- iterate over Mail-Accounts -----
+ for (Mail::MailBoxList::const_iterator anIter = myPlugin->getMailBoxCltn().begin();
+@@ -230,6 +231,7 @@
+ anAppendix = anAppendix + std::string("/");
+ } // if
+ anAppendix = anAppendix + std::string(itoa(aMB->getCurrentFolder()->getCountUnseen()));
++ unseen += aMB->getCurrentFolder()->getCountUnseen();
+ } // if
+
+ if ((aMB->getSetup().getBGCheckMode() & Mail::BG_SIF_MASK) == Mail::BG_SIF_ON)
+@@ -262,6 +264,7 @@
+ } // if
+
+ myPlugin->setMainMenuAppendix(aSumSIF != 0, anAppendix);
++ myPlugin->setTotalUnseen(unseen);
+
+ fFirst = false;
+ aTimeOutMS = myPluginSettings.BGCheckDelay * 60 * 1000;
+--- ../plain.0/mailbox-0.5.0/AxPluginMailBox.cpp 2007-10-21 10:43:27.000000000 +0200
++++ AxPluginMailBox.cpp 2007-11-17 16:30:27.000000000 +0100
+@@ -108,6 +108,7 @@
+ , myInitialMailBox(0)
+ , myHasNewMail (false)
+ , myMainMenuEntryAppendix("")
++ , totalUnseen(0)
+ {
+ #if HAVE_AXLIB
+ Ax::Tools::Trace::setLogFunc(syslog_with_tid);
+@@ -426,6 +427,11 @@
+ wsdebug(("- AxPluginMailBox::Service() Id: '%s' supported", Id));
+ } // if
+ }
++ else if (strcmp(Id, MailBox_GetTotalUnseen_v1_0_NAME) == 0)
++ {
++ if (Data != 0)
++ *((int*)Data) = totalUnseen;
++ }
+ else
+ {
+ fHandled = false;
+--- ../plain.0/mailbox-0.5.0/AxPluginMailBox.h 2006-05-01 18:49:21.000000000 +0200
++++ AxPluginMailBox.h 2007-11-17 15:41:51.000000000 +0100
+@@ -497,6 +497,8 @@
+ */
+ void setMainMenuAppendix(bool fHasNewMail = false, const std::string &theMenuText = std::string(""));
+
++ void setTotalUnseen(int i) { totalUnseen = i; }
++
+ //-------------------------------------------------------------------------
+ // copyMainMenuEntry()
+ //-------------------------------------------------------------------------
+@@ -552,7 +554,7 @@
+ bool myHasNewMail;
+ std::string myMainMenuEntryAppendix;
+ cMutex myMainMenuEntryAppendixMutex;
+-
++ int totalUnseen;
+ }; // class AxPluginMailBox
+
+ #endif // __AxPluginMaiBox_H__
diff --git a/patch/mp3-0.9.15pre14_graphtft-cover-file.diff b/patch/mp3-0.9.15pre14_graphtft-cover-file.diff
new file mode 100644
index 0000000..7e22852
--- /dev/null
+++ b/patch/mp3-0.9.15pre14_graphtft-cover-file.diff
@@ -0,0 +1,119 @@
+--- ../mp3-0.9.15pre14.save//player-mp3.c 2006-11-04 15:44:33.000000000 +0100
++++ player-mp3.c 2007-07-01 16:53:27.000000000 +0200
+@@ -1583,6 +1583,7 @@
+ cNormalize norm;
+ bool haslevel=false;
+ const unsigned char *p=0;
++ const char *coverName=0;
+ int pc=0, readindex=0;
+ bool imageValid=true;
+ int imageCheck=0;
+@@ -1751,6 +1752,16 @@
+ if(si->HasInfo())
+ total=SecondsToFrames(si->Total);
+ }
++ // First remove the old cover, when exist
++ RemoveOldCover();
++ coverName=GetCover(playing->FullPath());
++ if(coverName) {
++ // if a cover exist, copy it to the /tmp directory
++ if(CopyCover(coverName)){
++ d(isyslog("mp3: found and copy cover %s to /tmp/graphTFT.cover",coverName));
++ }
++ }
++
+ d(printf("mp3: isStream=%d levelgood=%d haslevel=%d\n",isStream,levelgood,haslevel))
+ output->Init();
+ level.Init();
+@@ -2027,3 +2038,79 @@
+ Speed=-1;
+ return true;
+ }
++
++char *cMP3Player::GetCover(const char* fullname)
++{
++ static char imageFile[1024];
++ FILE* fp;
++
++ // track cover file ?
++
++ strcpy(imageFile, fullname);
++ strcpy(strrchr(imageFile, '.'), ".jpg");
++
++ d(isyslog("cov: Checking '%s' for track cover file", imageFile));
++
++ if ((fp = fopen(imageFile, "rb")))
++ {
++ fclose(fp);
++ d(isyslog("cov: Track specific cover file '%s' found", basename(imageFile)));
++
++ return imageFile;
++ }
++
++ // directory cover file ?
++
++ strcpy(strrchr(imageFile, '/'), "/Cover.jpg");
++
++ d(isyslog("cov: Checking '%s' for directory cover file ", imageFile));
++
++ if ((fp = fopen(imageFile, "rb")))
++ {
++ fclose (fp);
++ d(isyslog("cov: Cover file Cover.jpg found"));
++
++ return imageFile;
++ }
++
++ strcpy(strrchr(imageFile, '/'), "/cover.jpg");
++
++ d(isyslog("cov: Checking '%s' for directory cover file ", imageFile));
++
++ if ((fp = fopen(imageFile, "rb")))
++ {
++ fclose (fp);
++ d(isyslog("cov: Cover file cover.jpg found"));
++
++ return imageFile;
++ }
++
++ d(isyslog("cov: No cover found :("));
++
++ return 0;
++}
++
++bool cMP3Player::CopyCover(const char* coverName)
++{
++ char commandString[1024];
++ bool result = false;
++ int ret = false;
++
++ sprintf((char*)commandString, "echo %s > /tmp/graphTFT.cover", coverName);
++ ret = system((const char*)commandString);
++
++ if (ret) result = true;
++
++ return result;
++}
++
++void cMP3Player::RemoveOldCover(void)
++{
++ FILE* fp;
++
++ if ((fp = fopen("/tmp/graphTFT.cover", "rb")))
++ {
++ fclose (fp);
++ system("rm /tmp/graphTFT.cover");
++ }
++}
+--- ../mp3-0.9.15pre14.save//player-mp3.h 2006-11-04 15:44:33.000000000 +0100
++++ player-mp3.h 2007-07-01 16:05:48.000000000 +0200
+@@ -177,6 +177,9 @@
+ virtual bool GetReplayMode(bool &Play, bool &Forward, int &Speed);
+ bool Active(void) { return active; }
+ bool IsStream(void) { return isStream; }
++ char *GetCover(const char *maskFilename);
++ bool CopyCover(const char *coverName);
++ void RemoveOldCover(void);
+ };
+
+ #endif //___DVB_MP3_H
diff --git a/patch/muggle-0.0.8_graphtft_cover_file.diff b/patch/muggle-0.0.8_graphtft_cover_file.diff
new file mode 100644
index 0000000..22f8302
--- /dev/null
+++ b/patch/muggle-0.0.8_graphtft_cover_file.diff
@@ -0,0 +1,103 @@
+diff -Nru muggle-0.0.8-orig/vdr_player.c muggle-0.0.8/vdr_player.c
+--- muggle-0.0.8-orig/vdr_player.c 2004-11-28 18:07:59.403969080 +0100
++++ muggle-0.0.8/vdr_player.c 2004-11-28 18:09:47.448543808 +0100
+@@ -194,6 +194,10 @@
+ void Play();
+ void Forward();
+ void Backward();
++ char * GetCover(const char *fullname);
++ bool CopyCover(const char *coverName);
++ void RemoveOldCover(void);
++
+
+ void Goto(int Index, bool Still=false);
+ void SkipSeconds(int secs);
+@@ -326,6 +330,63 @@
+ }
+ }
+
++char *mgPCMPlayer::GetCover(const char *fullname)
++{
++ static char imageFile[1024];
++ char *result = NULL;
++ FILE *fp;
++
++ printf( "cov: checking %s for specific cover\n", fullname);
++ strcpy (imageFile, fullname);
++
++ strcpy (strrchr (imageFile, '.'), ".jpg");
++ if ((fp=fopen(imageFile, "rb")))
++ {
++ // found specific cover
++ printf( "cov: specific cover file %s found\n", basename(imageFile));
++ fclose (fp);
++ result = imageFile;
++ }
++ else
++ {
++ strcpy (strrchr (imageFile, '/'), "/Cover.jpg");
++ if ((fp = fopen (imageFile, "rb")))
++ {
++ fclose (fp);
++ result = imageFile;
++ printf( "cov: cover file Cover.jpg found\n");
++ } else {
++ printf( "cov: no cover found\n" );
++ }
++ }
++ return result;
++}
++
++bool mgPCMPlayer::CopyCover(const char *coverName)
++{
++ char commandString[1024];
++ bool result=false;
++ int ret = false;
++
++ sprintf((char*) commandString, "echo %s > /tmp/graphTFT.cover", coverName );
++ ret=system((const char*)commandString);
++
++ if (ret) result=true;
++ return result;
++}
++
++void mgPCMPlayer::RemoveOldCover(void)
++{
++ FILE *fp;
++
++ if ((fp=fopen("/tmp/graphTFT.cover", "rb")))
++ {
++ fclose (fp);
++ system( "rm /tmp/graphTFT.cover");
++ printf( "cov: old cover removed\n" );
++ }
++}
++
+ void mgPCMPlayer::Action(void)
+ {
+ MGLOG( "mgPCMPlayer::Action" );
+@@ -335,6 +396,7 @@
+ cResample resample[2];
+ unsigned int nsamples[2];
+ const mad_fixed_t *data[2];
++ const char *coverName=0;
+ cScale scale;
+ cLevel level;
+ cNormalize norm;
+@@ -388,6 +450,16 @@
+ {
+ std::string filename = m_playing->getSourceFile();
+ // mgDebug( 1, "mgPCMPlayer::Action: music file is %s", filename.c_str() );
++ // First remove the old cover, when exist
++ RemoveOldCover();
++ coverName=GetCover(filename.c_str());
++ if(coverName) {
++ // if a cover exist, copy it to the /tmp directory
++ if(CopyCover(coverName)){
++ printf( "cov: found and copy cover %s to /tmp/graphTFT.cover\n",coverName );
++ }
++ }
++
+
+ if( ( m_decoder = mgDecoders::findDecoder( m_playing ) ) && m_decoder->start() )
+ {
diff --git a/patch/remotetimers.patch b/patch/remotetimers.patch
new file mode 100644
index 0000000..5d4073c
--- /dev/null
+++ b/patch/remotetimers.patch
@@ -0,0 +1,52 @@
+Description: <short summary of the patch>
+ TODO: Put a short summary on the line above and replace this paragraph
+ with a longer explanation of this change. Complete the meta-information
+ with other relevant fields (see below for details). To make it easier, the
+ information below has been extracted from the changelog. Adjust it or drop
+ it.
+ .
+ vdr-plugin-remotetimers (1.0.1-2yavdr1~precise) precise; urgency=medium
+ .
+ * automatic rebuild
+Author: yavdr package builder <release@yavdr.org>
+
+---
+The information above should follow the Patch Tagging Guidelines, please
+checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
+are templates for supplementary fields that you might want to add:
+
+Origin: <vendor|upstream|other>, <url of original patch>
+Bug: <url in upstream bugtracker>
+Bug-Debian: http://bugs.debian.org/<bugnumber>
+Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber>
+Forwarded: <no|not-needed|url proving that it has been forwarded>
+Reviewed-By: <name and email of someone who approved the patch>
+Last-Update: <YYYY-MM-DD>
+
+--- vdr-plugin-remotetimers-1.0.1.orig/Makefile
++++ vdr-plugin-remotetimers-1.0.1/Makefile
+@@ -51,6 +51,9 @@ INCLUDES +=
+
+ DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
+
++# uncomment this to enable support for the graphtft plugin.
++#DEFINES += -DUSE_GRAPHTFT
++
+ ### The object files (add further files here):
+
+ OBJS = $(PLUGIN).o svdrp.o conflict.o menu.o menuitems.o setup.o moverec.o watcher.o
+--- vdr-plugin-remotetimers-1.0.1.orig/menu.h
++++ vdr-plugin-remotetimers-1.0.1/menu.h
+--- vdr-plugin-remotetimers-1.0.1.orig/menu.c
++++ vdr-plugin-remotetimers-1.0.1/menu.c
+@@ -877,6 +877,10 @@ void cMenuEvent::Display(void)
+ {
+ cOsdMenu::Display();
+ DisplayMenu()->SetEvent(event);
++#ifdef USE_GRAPHTFT
++ cStatus::MsgOsdSetEvent(event);
++#endif
++
+ if (event->Description())
+ cStatus::MsgOsdTextItem(event->Description());
+ }
diff --git a/patch/vdr-2.2.0_graphtftng.diff b/patch/vdr-2.2.0_graphtftng.diff
new file mode 100644
index 0000000..186b553
--- /dev/null
+++ b/patch/vdr-2.2.0_graphtftng.diff
@@ -0,0 +1,157 @@
+--- vdr-2.2.0.plain/menu.c 2015-02-10 13:37:06.000000000 +0100
++++ vdr-2.2.0.gtft/menu.c 2016-02-01 10:35:04.592774218 +0100
+@@ -1302,6 +1302,7 @@
+ {
+ cOsdMenu::Display();
+ DisplayMenu()->SetEvent(event);
++ cStatus::MsgOsdSetEvent(event);
+ if (event->Description())
+ cStatus::MsgOsdTextItem(event->Description());
+ }
+@@ -1432,6 +1433,7 @@
+ static void SetCurrentChannel(int ChannelNr) { currentChannel = ChannelNr; }
+ static const cEvent *ScheduleEvent(void);
+ virtual eOSState ProcessKey(eKeys Key);
++ virtual void Display(void);
+ };
+
+ int cMenuWhatsOn::currentChannel = 0;
+@@ -1461,6 +1463,18 @@
+ SetHelpKeys();
+ }
+
++void cMenuWhatsOn::Display(void)
++{
++ cOsdMenu::Display();
++
++ if (Count() > 0) {
++ int ni = 0;
++ for (cOsdItem *item = First(); item; item = Next(item)) {
++ cStatus::MsgOsdEventItem(((cMenuScheduleItem*)item)->event, item->Text(), ni++, Count());
++ }
++ }
++}
++
+ bool cMenuWhatsOn::Update(void)
+ {
+ bool result = false;
+@@ -1614,6 +1628,7 @@
+ cMenuSchedule(void);
+ virtual ~cMenuSchedule();
+ virtual eOSState ProcessKey(eKeys Key);
++ virtual void Display(void);
+ };
+
+ cMenuSchedule::cMenuSchedule(void)
+@@ -1640,6 +1655,18 @@
+ cMenuWhatsOn::ScheduleEvent(); // makes sure any posted data is cleared
+ }
+
++void cMenuSchedule::Display(void)
++{
++ cOsdMenu::Display();
++
++ if (Count() > 0) {
++ int ni = 0;
++ for (cOsdItem *item = First(); item; item = Next(item)) {
++ cStatus::MsgOsdEventItem(((cMenuScheduleItem*)item)->event, item->Text(), ni++, Count());
++ }
++ }
++}
++
+ void cMenuSchedule::PrepareScheduleAllThis(const cEvent *Event, const cChannel *Channel)
+ {
+ Clear();
+@@ -2561,6 +2588,7 @@
+ }
+ cOsdMenu::Display();
+ DisplayMenu()->SetRecording(recording);
++ cStatus::MsgOsdSetRecording(recording);
+ if (recording->Info()->Description())
+ cStatus::MsgOsdTextItem(recording->Info()->Description());
+ }
+--- vdr-2.2.0.plain/osdbase.c 2015-01-15 11:11:11.000000000 +0100
++++ vdr-2.2.0.gtft/osdbase.c 2015-10-16 14:48:22.000000000 +0200
+@@ -106,6 +106,7 @@
+ free(status);
+ displayMenu->Clear();
+ cStatus::MsgOsdClear();
++ cStatus::MsgOsdMenuDestroy();
+ if (!--displayMenuCount)
+ DELETENULL(displayMenu);
+ }
+@@ -234,6 +235,7 @@
+ displayMenuItems = displayMenu->MaxItems();
+ displayMenu->SetTabs(cols[0], cols[1], cols[2], cols[3], cols[4]);//XXX
+ displayMenu->SetTitle(title);
++ cStatus::MsgOsdMenuDisplay(menuCategory);
+ cStatus::MsgOsdTitle(title);
+ DisplayHelp(true);
+ int count = Count();
+--- vdr-2.2.0.plain/status.c 2014-01-25 11:47:39.000000000 +0100
++++ vdr-2.2.0.gtft/status.c 2015-10-16 14:46:28.000000000 +0200
+@@ -130,3 +130,32 @@
+ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
+ sm->OsdProgramme(PresentTime, PresentTitle, PresentSubtitle, FollowingTime, FollowingTitle, FollowingSubtitle);
+ }
++
++void cStatus::MsgOsdSetEvent(const cEvent* event)
++{
++ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
++ sm->OsdSetEvent(event);
++}
++
++void cStatus::MsgOsdSetRecording(const cRecording* recording)
++{
++ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
++ sm->OsdSetRecording(recording);
++}
++
++void cStatus::MsgOsdMenuDisplay(eMenuCategory menuCategory)
++{
++ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
++ sm->OsdMenuDisplay(menuCategory);
++}
++
++void cStatus::MsgOsdMenuDestroy()
++{
++ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
++ sm->OsdMenuDestroy();
++}
++void cStatus::MsgOsdEventItem(const cEvent* Event, const char *Text, int Index, int Count)
++{
++ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
++ sm->OsdEventItem(Event, Text, Index, Count);
++}
+--- vdr-2.2.0.plain/status.h 2014-01-25 11:47:39.000000000 +0100
++++ vdr-2.2.0.gtft/status.h 2015-10-16 14:46:28.000000000 +0200
+@@ -84,6 +84,17 @@
+ // The OSD displays the single line Text with the current channel information.
+ virtual void OsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle) {}
+ // The OSD displays the given programme information.
++ virtual void OsdSetRecording(const cRecording* recording) {}
++ // The OSD displays the recording information.
++ virtual void OsdSetEvent(const cEvent* event) {}
++ // The OSD displays the event information.
++ virtual void OsdMenuDisplay(eMenuCategory menuCategory) {}
++ // report menu creation
++ virtual void OsdMenuDestroy() {}
++ // report menu destruvtion
++ virtual void OsdEventItem(const cEvent* Event, const char *Text, int Index, int Count) {}
++ // The OSD displays the given single line Event as menu item at Index.
++
+ public:
+ cStatus(void);
+ virtual ~cStatus();
+@@ -106,6 +117,11 @@
+ static void MsgOsdTextItem(const char *Text, bool Scroll = false);
+ static void MsgOsdChannel(const char *Text);
+ static void MsgOsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle);
++ static void MsgOsdSetEvent(const cEvent* event);
++ static void MsgOsdSetRecording(const cRecording* recording);
++ static void MsgOsdMenuDisplay(eMenuCategory menuCategory);
++ static void MsgOsdMenuDestroy();
++ static void MsgOsdEventItem(const cEvent* Event, const char *Text, int Index, int Count);
+ };
+
+ #endif //__STATUS_H
diff --git a/patch/vdr-2.3.1_graphtftng.diff b/patch/vdr-2.3.1_graphtftng.diff
new file mode 100644
index 0000000..b60c885
--- /dev/null
+++ b/patch/vdr-2.3.1_graphtftng.diff
@@ -0,0 +1,157 @@
+--- vdr-2.3.1.plain//menu.c 2015-09-14 15:22:49.000000000 +0200
++++ vdr-2.3.1.gtft//menu.c 2016-02-01 10:37:00.688774779 +0100
+@@ -1465,6 +1465,7 @@
+ {
+ cOsdMenu::Display();
+ DisplayMenu()->SetEvent(event);
++ cStatus::MsgOsdSetEvent(event);
+ if (event->Description())
+ cStatus::MsgOsdTextItem(event->Description());
+ }
+@@ -1594,6 +1595,7 @@
+ static void SetCurrentChannel(int ChannelNr) { currentChannel = ChannelNr; }
+ static const cEvent *ScheduleEvent(void);
+ virtual eOSState ProcessKey(eKeys Key);
++ virtual void Display(void);
+ };
+
+ int cMenuWhatsOn::currentChannel = 0;
+@@ -1619,6 +1621,18 @@
+ SetHelpKeys();
+ }
+
++void cMenuWhatsOn::Display(void)
++{
++ cOsdMenu::Display();
++
++ if (Count() > 0) {
++ int ni = 0;
++ for (cOsdItem *item = First(); item; item = Next(item)) {
++ cStatus::MsgOsdEventItem(((cMenuScheduleItem*)item)->event, item->Text(), ni++, Count());
++ }
++ }
++}
++
+ bool cMenuWhatsOn::Update(void)
+ {
+ bool result = false;
+@@ -1788,6 +1802,7 @@
+ cMenuSchedule(void);
+ virtual ~cMenuSchedule();
+ virtual eOSState ProcessKey(eKeys Key);
++ virtual void Display(void);
+ };
+
+ cMenuSchedule::cMenuSchedule(void)
+@@ -1846,6 +1861,18 @@
+ }
+ }
+
++void cMenuSchedule::Display(void)
++{
++ cOsdMenu::Display();
++
++ if (Count() > 0) {
++ int ni = 0;
++ for (cOsdItem *item = First(); item; item = Next(item)) {
++ cStatus::MsgOsdEventItem(((cMenuScheduleItem*)item)->event, item->Text(), ni++, Count());
++ }
++ }
++}
++
+ bool cMenuSchedule::PrepareScheduleAllThis(const cTimers *Timers, const cSchedules *Schedules, const cEvent *Event, const cChannel *Channel)
+ {
+ if (const cSchedule *Schedule = Schedules->GetSchedule(Channel)) {
+@@ -2793,6 +2820,7 @@
+ }
+ cOsdMenu::Display();
+ DisplayMenu()->SetRecording(recording);
++ cStatus::MsgOsdSetRecording(recording);
+ if (recording->Info()->Description())
+ cStatus::MsgOsdTextItem(recording->Info()->Description());
+ }
+--- vdr-2.3.1.plain//osdbase.c 2015-09-10 13:23:07.000000000 +0200
++++ vdr-2.3.1.gtft//osdbase.c 2015-10-23 08:30:06.000000000 +0200
+@@ -107,6 +107,7 @@
+ free(status);
+ displayMenu->Clear();
+ cStatus::MsgOsdClear();
++ cStatus::MsgOsdMenuDestroy();
+ if (!--displayMenuCount)
+ DELETENULL(displayMenu);
+ }
+@@ -236,6 +237,7 @@
+ displayMenuItems = displayMenu->MaxItems();
+ displayMenu->SetTabs(cols[0], cols[1], cols[2], cols[3], cols[4]);//XXX
+ displayMenu->SetTitle(title);
++ cStatus::MsgOsdMenuDisplay(menuCategory);
+ cStatus::MsgOsdTitle(title);
+ DisplayHelp(true);
+ int count = Count();
+--- vdr-2.3.1.plain//status.c 2014-01-25 11:47:39.000000000 +0100
++++ vdr-2.3.1.gtft//status.c 2015-10-23 08:30:06.000000000 +0200
+@@ -130,3 +130,32 @@
+ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
+ sm->OsdProgramme(PresentTime, PresentTitle, PresentSubtitle, FollowingTime, FollowingTitle, FollowingSubtitle);
+ }
++
++void cStatus::MsgOsdSetEvent(const cEvent* event)
++{
++ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
++ sm->OsdSetEvent(event);
++}
++
++void cStatus::MsgOsdSetRecording(const cRecording* recording)
++{
++ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
++ sm->OsdSetRecording(recording);
++}
++
++void cStatus::MsgOsdMenuDisplay(eMenuCategory menuCategory)
++{
++ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
++ sm->OsdMenuDisplay(menuCategory);
++}
++
++void cStatus::MsgOsdMenuDestroy()
++{
++ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
++ sm->OsdMenuDestroy();
++}
++void cStatus::MsgOsdEventItem(const cEvent* Event, const char *Text, int Index, int Count)
++{
++ for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
++ sm->OsdEventItem(Event, Text, Index, Count);
++}
+--- vdr-2.3.1.plain//status.h 2015-08-02 12:34:44.000000000 +0200
++++ vdr-2.3.1.gtft//status.h 2015-10-23 08:30:06.000000000 +0200
+@@ -81,6 +81,17 @@
+ // The OSD displays the single line Text with the current channel information.
+ virtual void OsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle) {}
+ // The OSD displays the given programme information.
++ virtual void OsdSetRecording(const cRecording* recording) {}
++ // The OSD displays the recording information.
++ virtual void OsdSetEvent(const cEvent* event) {}
++ // The OSD displays the event information.
++ virtual void OsdMenuDisplay(eMenuCategory menuCategory) {}
++ // report menu creation
++ virtual void OsdMenuDestroy() {}
++ // report menu destruvtion
++ virtual void OsdEventItem(const cEvent* Event, const char *Text, int Index, int Count) {}
++ // The OSD displays the given single line Event as menu item at Index.
++
+ public:
+ cStatus(void);
+ virtual ~cStatus();
+@@ -103,6 +114,11 @@
+ static void MsgOsdTextItem(const char *Text, bool Scroll = false);
+ static void MsgOsdChannel(const char *Text);
+ static void MsgOsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle);
++ static void MsgOsdSetEvent(const cEvent* event);
++ static void MsgOsdSetRecording(const cRecording* recording);
++ static void MsgOsdMenuDisplay(eMenuCategory menuCategory);
++ static void MsgOsdMenuDestroy();
++ static void MsgOsdEventItem(const cEvent* Event, const char *Text, int Index, int Count);
+ };
+
+ #endif //__STATUS_H
diff --git a/patch/xsnow-gtftng.patch b/patch/xsnow-gtftng.patch
new file mode 100644
index 0000000..bfd70bb
--- /dev/null
+++ b/patch/xsnow-gtftng.patch
@@ -0,0 +1,66 @@
+--- ../../xsnow.org/xsnow-1.42/toon_root.c 2001-12-16 00:09:39.000000000 +0100
++++ ./toon_root.c 2013-11-08 16:37:09.075742684 +0100
+@@ -224,6 +224,45 @@
+ return winreturn;
+ }
+
++static Window __ToonGetWindowByName(Display *display, int screen, Window window, int depth, const char* useName)
++{
++ Window rootReturn, parentReturn, *children;
++ Window winreturn = (Window)0;
++ unsigned int nChildren;
++ char* name = NULL;
++
++ if (depth > 5)
++ return (Window)0;
++
++ if (XQueryTree(display, window, &rootReturn, &parentReturn, &children, &nChildren))
++ {
++ int i;
++
++ for (i = 0; i < nChildren; ++i)
++ {
++ XWindowAttributes attributes;
++
++ if (XFetchName(display, children[i], &name))
++ {
++ if (strcasecmp(name, useName) == 0)
++ {
++ winreturn = children[i];
++ break;
++ }
++ }
++
++ winreturn = __ToonGetWindowByName(display, screen, children[i], depth+1, useName);
++
++ if (winreturn)
++ break;
++ }
++
++ XFree((char *) children);
++ }
++
++ return winreturn;
++}
++
+
+ /*
+ * Returns the window ID of the `background' window on to which the
+@@ -253,7 +292,16 @@
+
+ *clientparent = root;
+
+- if (XGetWindowProperty(display, root,
++ if (background = __ToonGetWindowByName(display, screen, root, 0, "graphtft-fe"))
++ {
++ *clientparent = background;
++ snprintf(toon_message, TOON_MESSAGE_LENGTH,
++ _("Drawing to graphtft-fe"));
++ toon_message[TOON_MESSAGE_LENGTH-1] = '\0';
++ }
++
++ if (!background
++ && XGetWindowProperty(display, root,
+ NAUTILUS_DESKTOP_WINDOW_ID,
+ 0, 1, False, XA_WINDOW,
+ &actual_type, &actual_format,