Hello community,

here is the log from the commit of package vdr for openSUSE:Factory checked in 
at 2019-03-10 09:32:11
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/vdr (Old)
 and      /work/SRC/openSUSE:Factory/.vdr.new.28833 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "vdr"

Sun Mar 10 09:32:11 2019 rev:51 rq:680779 version:2.4.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/vdr/vdr.changes  2018-12-04 20:54:19.932852699 
+0100
+++ /work/SRC/openSUSE:Factory/.vdr.new.28833/vdr.changes       2019-03-10 
09:32:13.372222473 +0100
@@ -1,0 +2,41 @@
+Tue Feb 12 09:06:59 UTC 2019 - Jan Engelhardt <[email protected]>
+
+- Do not ignore errors from useradd.
+- Replace overly strong PreReq by Requires(pre)/Requires,
+  or in case of documentation, drop it.
+
+-------------------------------------------------------------------
+Mon Jan  7 10:20:52 UTC 2019 - [email protected]
+
+- require pkg-config from vdr-devel
+- vdr does not provide vdr-devel
+
+-------------------------------------------------------------------
+Sat Dec 29 21:21:35 UTC 2018 - [email protected]
+
+- add official after-release-patches from
+  ftp://ftp.tvdr.de/vdr/Developer/Patches/vdr-2.4/:
+  - vdr-2.4.0-01-fix-svdrp-modt-recflag.diff
+  - vdr-2.4.0-02-fix-invalid-locking-sequence.diff
+  - vdr-2.4.0-03-fix-locking-channel-display.diff
+  - vdr-2.4.0-04-fix-locking-channel-display-2.diff
+  - vdr-2.4.0-05-fix-shutdown.diff
+  - vdr-2.4.0-06-fix-channel-switch.diff
+  - vdr-2.4.0-07-fix-disabling-mtd.diff
+
+-------------------------------------------------------------------
+Wed Dec 26 20:49:41 UTC 2018 - Stefan Seyfried <[email protected]>
+
+- own /etc/vdr/plugins, which is needed by almost every plugin
+
+-------------------------------------------------------------------
+Wed Dec 26 13:45:21 UTC 2018 - Stefan Seyfried <[email protected]>
+
+- update to stable vdr-2.4.0 release
+  - see HISTORY file for detailed changelog
+- renamed / rebased patch:
+  - vdr-2.3.9-use-ncurses5.diff -> vdr-2.4.0-use-ncurses5.diff
+- removed dvbhddevice hack from specfile (plugin no longer in
+  vdr tarball)
+
+-------------------------------------------------------------------
@@ -7,0 +49,15 @@
+
+-------------------------------------------------------------------
+Wed Mar 21 12:43:09 UTC 2018 - [email protected]
+
+- update to unstable vdr-2.3.9 release
+- removed obsoleted patches:
+  - vdr-2.0.6-wareagle-fix.patch
+  - vdr-1.7.36-wareagle.patch
+- renamed / rebased patches:
+  - vdr-1.7.29-menuselection.patch -> vdr-2.3.9-menuselection.patch
+  - vdr-2.0.4-MainMenuHooks-v1_0_1.patch -> 
vdr-2.3.9-MainMenuHooks-v1_0_1.patch
+  - vdr-2.2.0-gcc7.diff -> vdr-2.3.9-gcc7.diff
+  - vdr-2.2.0-use-ncurses5.diff -> vdr-2.3.9-use-ncurses5.diff
+- added  16_vdr_wareagleicon.patch (from minidvblinux.de git)
+- disabled vdr-2.2.0-dynamite.diff for now

Old:
----
  vdr-1.7.29-menuselection.patch
  vdr-1.7.36-wareagle.patch
  vdr-2.0.4-MainMenuHooks-v1_0_1.patch
  vdr-2.0.6-wareagle-fix.patch
  vdr-2.2.0-dynamite.diff
  vdr-2.2.0-gcc7.diff
  vdr-2.2.0-use-ncurses5.diff
  vdr-2.2.0.tar.bz2

New:
----
  16_vdr_wareagleicon.patch
  vdr-2.3.9-MainMenuHooks-v1_0_1.patch
  vdr-2.3.9-gcc7.diff
  vdr-2.3.9-menuselection.patch
  vdr-2.4.0-01-fix-svdrp-modt-recflag.diff
  vdr-2.4.0-02-fix-invalid-locking-sequence.diff
  vdr-2.4.0-03-fix-locking-channel-display.diff
  vdr-2.4.0-04-fix-locking-channel-display-2.diff
  vdr-2.4.0-05-fix-shutdown.diff
  vdr-2.4.0-06-fix-channel-switch.diff
  vdr-2.4.0-07-fix-disabling-mtd.diff
  vdr-2.4.0-use-ncurses5.diff
  vdr-2.4.0.tar.bz2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ vdr.spec ++++++
--- /var/tmp/diff_new_pack.x9cwpf/_old  2019-03-10 09:32:14.164222274 +0100
+++ /var/tmp/diff_new_pack.x9cwpf/_new  2019-03-10 09:32:14.164222274 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package vdr
 #
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,24 +17,8 @@
 
 
 Name:           vdr
-BuildRequires:  doxygen
-BuildRequires:  fdupes
-BuildRequires:  fontconfig-devel
-BuildRequires:  freetype2-devel
-BuildRequires:  gcc-c++
-BuildRequires:  graphviz
-BuildRequires:  libcap-devel
-BuildRequires:  libjpeg-devel
-BuildRequires:  linux-glibc-devel
-BuildRequires:  ncurses-devel
-%if 0%{?suse_version} >= 1330
-BuildRequires:  ncurses5-devel
-%endif
-BuildRequires:  pkg-config
-BuildRequires:  systemd-devel
-#
 %define vdrname         vdr
-%define vdr_apiversion  2.2.0
+%define vdr_apiversion  2.4.0
 %define vdr_localedir   %{_datadir}/vdr/locale
 %define vdr_libdir      %{_libdir}/vdr
 %define vdr_includedir  %{_includedir}/vdr
@@ -42,8 +26,7 @@
 %define vdr_sysconfdir  /etc/vdr
 #
 Url:            http://www.tvdr.de/
-PreReq:         /usr/sbin/useradd
-Version:        2.2.0
+Version:        2.4.0
 Release:        0
 Summary:        Video Disk Recorder
 License:        GPL-2.0-or-later
@@ -58,17 +41,41 @@
 Source92:       greenish.css
 Source95:       vdr-doc.desktop
 #
-Patch1:         vdr-1.7.29-menuselection.patch
+Patch1:         vdr-2.3.9-menuselection.patch
 Patch2:         vdr-1.7.21-pluginmissing.patch
-Patch3:         vdr-1.7.36-wareagle.patch
-Patch4:         vdr-2.2.0-dynamite.diff
-Patch5:         vdr-2.0.4-MainMenuHooks-v1_0_1.patch
-Patch6:         vdr-2.0.6-wareagle-fix.patch
-Patch7:         vdr-2.2.0-use-ncurses5.diff
-Patch8:         vdr-2.2.0-gcc7.diff
+# from 
https://www.minidvblinux.de/git/?a=blob&p=vdr&h=6c20bf469703971cadd14f723265042968e38d24&n=16_vdr_wareagleicon.patch
+# 
https://www.minidvblinux.de/git/?a=tree&p=vdr&h=d6462aa15f34fc9de0b74e4f7a4e9e84e56823e4&hb=d2650f877373711350e837aede55a0b0f87904e9
+Patch3:         16_vdr_wareagleicon.patch
+#Patch4:         vdr-2.2.0-dynamite.diff
+Patch5:         vdr-2.3.9-MainMenuHooks-v1_0_1.patch
+Patch7:         vdr-2.4.0-use-ncurses5.diff
+Patch8:         vdr-2.3.9-gcc7.diff
+# "official" patches after release of tarball:
+Patch101:       
ftp://ftp.tvdr.de/vdr/Developer/Patches/vdr-2.4/vdr-2.4.0-01-fix-svdrp-modt-recflag.diff
+Patch102:       
ftp://ftp.tvdr.de/vdr/Developer/Patches/vdr-2.4/vdr-2.4.0-02-fix-invalid-locking-sequence.diff
+Patch103:       
ftp://ftp.tvdr.de/vdr/Developer/Patches/vdr-2.4/vdr-2.4.0-03-fix-locking-channel-display.diff
+Patch104:       
ftp://ftp.tvdr.de/vdr/Developer/Patches/vdr-2.4/vdr-2.4.0-04-fix-locking-channel-display-2.diff
+Patch105:       
ftp://ftp.tvdr.de/vdr/Developer/Patches/vdr-2.4/vdr-2.4.0-05-fix-shutdown.diff
+Patch106:       
ftp://ftp.tvdr.de/vdr/Developer/Patches/vdr-2.4/vdr-2.4.0-06-fix-channel-switch.diff
+Patch107:       
ftp://ftp.tvdr.de/vdr/Developer/Patches/vdr-2.4/vdr-2.4.0-07-fix-disabling-mtd.diff
 
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
-Provides:       vdr-devel
+BuildRequires:  doxygen
+BuildRequires:  fdupes
+BuildRequires:  fontconfig-devel
+BuildRequires:  freetype2-devel
+BuildRequires:  gcc-c++
+BuildRequires:  graphviz
+BuildRequires:  libcap-devel
+BuildRequires:  libjpeg-devel
+BuildRequires:  linux-glibc-devel
+BuildRequires:  ncurses-devel
+%if 0%{?suse_version} >= 1330
+BuildRequires:  ncurses5-devel
+%endif
+BuildRequires:  pkg-config
+BuildRequires:  systemd-devel
+Requires(pre):  /usr/sbin/useradd
 Provides:       vdr(abi) = %vdr_apiversion
 Obsoletes:      vdr(abi) < %vdr_apiversion
 Provides:       vdrapi = %vdr_apiversion
@@ -80,14 +87,14 @@
 %endif
 
 %package devel
-Summary:        Video Disk Recorder
+Summary:        Header files for the Video Disk Recorder
 Group:          Hardware/TV
-PreReq:         vdr = %version
+Requires:       pkg-config
+Requires:       vdr = %version
 
 %package devel-doc
-Summary:        Video Disk Recorder
+Summary:        Developer documentation for the Video Disk Recorder
 Group:          Hardware/TV
-PreReq:         vdr-devel = %version
 BuildArch:      noarch
 
 %description
@@ -106,12 +113,20 @@
 %prep
 %setup -q -n vdr-%{version}
 #
+# official patches are applied first...
+%patch101 -p0
+%patch102 -p0
+%patch103 -p0
+%patch104 -p0
+%patch105 -p0
+%patch106 -p0
+%patch107 -p0
+#
 %patch1 -p1
 %patch2 -p1
 %patch3 -p1
-%patch4 -p1
+#patch4 -p1
 %patch5 -p1
-%patch6 -p1
 #
 ## hack to apply patch7 either in rpmbuild if ncurses6 or during "quilt setup"
 case "`rpm -q ncurses-devel`" in
@@ -131,8 +146,8 @@
 #
 cat > Make.config <<EOF
 ### The C compiler options:
-CFLAGS   = $RPM_OPT_FLAGS -pie -fPIE -fPIC -Wall
-CXXFLAGS = $RPM_OPT_FLAGS -pie -fPIE -fPIC -Wall -Werror=overloaded-virtual 
-Wparentheses
+CFLAGS   = %{optflags} -pie -fPIE -fPIC -Wall
+CXXFLAGS = %{optflags} -pie -fPIE -fPIC -Wall -Werror=overloaded-virtual 
-Wparentheses
 ### The directory environment:
 PREFIX   = %{_prefix}
 BINDIR   = %{_bindir}
@@ -163,20 +178,14 @@
 cp -a %{SOURCE42} .
 chmod 0755 msgmerge
 
-# kernel 4.19+ does not have needed APIs / drivers anymore...
-%if 0%{?suse_version} >= 1550
-rm -rf PLUGINS/src/dvbhddevice/
-%endif
-
 %build
 # to use msgmerge script
 export PATH=`pwd`:$PATH
 make %{?jobs:-j%jobs}
-make plugins
-make srcdoc
+make plugins srcdoc
 
 %install
-%makeinstall
+%make_install
 install -m 644 *.conf %{buildroot}%{vdr_sysconfdir}
 install -m 644 Make.config %{buildroot}%{vdr_includedir}
 install -d -m 755 %{buildroot}%{_localstatedir}/cache/vdr
@@ -228,9 +237,13 @@
 #
 # firewall config
 install -m 644 -D %{SOURCE11} 
%{buildroot}/%{_sysconfdir}/sysconfig/SuSEfirewall2.d/services/%{name}
+#
+# empty directory for plugins
+install -m 0755 -d %{buildroot}%{vdr_sysconfdir}/plugins
 
 %pre
-/usr/sbin/useradd -r -d %{vdr_videodir} -s /bin/false -c "Video Disk Recorder" 
-g video vdr 2> /dev/null || :
+getent passwd vdr >/dev/null || /usr/sbin/useradd -r -d %{vdr_videodir} \
+       -s /bin/false -c "Video Disk Recorder" -g video vdr
 
 %files
 %defattr(-,root,root)
@@ -241,6 +254,7 @@
 %license COPYING
 %attr(755,vdr,root) %dir %{vdr_videodir}
 %attr(755,vdr,root) %dir %{vdr_sysconfdir}
+%attr(755,vdr,root) %dir %{vdr_sysconfdir}/plugins
 %attr(755,vdr,root) %dir %{_localstatedir}/cache/vdr
 %dir %{vdr_libdir}
 %dir %{_datadir}/vdr

++++++ 16_vdr_wareagleicon.patch ++++++
--- vdr-2.3.8.orig/config.c
+++ vdr-2.3.8/config.c
@@ -376,6 +376,7 @@ cSetup::cSetup(void)
   strcpy(OSDLanguage, ""); // default is taken from environment
   strcpy(OSDSkin, "lcars");
   strcpy(OSDTheme, "default");
+  WarEagleIcons = 1;
   PrimaryDVB = 1;
   ShowInfoOnChSwitch = 1;
   TimeoutRequChInfo = 1;
@@ -608,6 +609,7 @@ bool cSetup::Parse(const char *Name, con
   if      (!strcasecmp(Name, "OSDLanguage"))       { strn0cpy(OSDLanguage, 
Value, sizeof(OSDLanguage)); I18nSetLocale(OSDLanguage); }
   else if (!strcasecmp(Name, "OSDSkin"))             Utf8Strn0Cpy(OSDSkin, 
Value, MaxSkinName);
   else if (!strcasecmp(Name, "OSDTheme"))            Utf8Strn0Cpy(OSDTheme, 
Value, MaxThemeName);
+  else if (!strcasecmp(Name, "WarEagleIcons"))       WarEagleIcons      = 
atoi(Value);
   else if (!strcasecmp(Name, "PrimaryDVB"))          PrimaryDVB         = 
atoi(Value);
   else if (!strcasecmp(Name, "ShowInfoOnChSwitch"))  ShowInfoOnChSwitch = 
atoi(Value);
   else if (!strcasecmp(Name, "TimeoutRequChInfo"))   TimeoutRequChInfo  = 
atoi(Value);
@@ -744,6 +746,7 @@ bool cSetup::Save(void)
   Store("OSDLanguage",        OSDLanguage);
   Store("OSDSkin",            OSDSkin);
   Store("OSDTheme",           OSDTheme);
+  Store("WarEagleIcons",      WarEagleIcons);
   Store("PrimaryDVB",         PrimaryDVB);
   Store("ShowInfoOnChSwitch", ShowInfoOnChSwitch);
   Store("TimeoutRequChInfo",  TimeoutRequChInfo);
--- vdr-2.3.8.orig/config.h
+++ vdr-2.3.8/config.h
@@ -258,6 +258,7 @@ public:
   char OSDLanguage[I18N_MAX_LOCALE_LEN];
   char OSDSkin[MaxSkinName];
   char OSDTheme[MaxThemeName];
+  int WarEagleIcons;
   int PrimaryDVB;
   int ShowInfoOnChSwitch;
   int TimeoutRequChInfo;
--- /dev/null
+++ vdr-2.3.8/iconpatch.c
@@ -0,0 +1,28 @@
+
+#include "iconpatch.h"
+
+#include <langinfo.h>
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+bool IsLangUtf8(void)
+{
+  char *CodeSet = NULL;
+  if (setlocale(LC_CTYPE, ""))
+     CodeSet = nl_langinfo(CODESET);
+  else {
+     char *LangEnv = getenv("LANG"); // last resort in case locale stuff isn't 
installed
+     if (LangEnv) {
+        CodeSet = strchr(LangEnv, '.');
+        if (CodeSet)
+           CodeSet++; // skip the dot
+        }
+     }
+
+  if (CodeSet && strcasestr(CodeSet, "UTF-8") != 0)
+     return true;
+
+  return false;
+}
--- /dev/null
+++ vdr-2.3.8/iconpatch.h
@@ -0,0 +1,74 @@
+/*
+ * iconpatch.h: Information of iconpatch
+ *
+ * Diese Datei ist die Übersichtsdatei für den Iconpatch.
+ * Hier werden kleine Infos abgelegt.
+ * Der Iconpatch ändert die Dateien:
+ *   iconpatch.h
+ *   menu.c
+ *   recording.c
+ *   fontosd.c
+ *
+ */
+
+// Iconpatch-Variablen - Anfang
+#define ICON_NUMBERSIGN        "\x23"
+#define ICON_ASTERISK          "\x2A"
+#define ICON_GREATER           "\x3E"
+#define ICON_EXCLAM            "\x21"
+#define ICON_PLUSMINUS         "\xB1"
+
+#define ICON_RESUME            "\x80"
+#define ICON_DVD               "\x81"
+#define ICON_FOLDER            "\x82"
+#define ICON_BLANK             "\x83"
+#define ICON_CUTTING           "\x84"
+#define ICON_MOVE_FILE         "\x85"
+#define ICON_MOVE_FOLDER       "\x86"
+#define ICON_BAR_START         "\x87"
+#define ICON_BAR_FILLED        "\x88"
+#define ICON_BAR_CLEAR         "\x89"
+#define ICON_BAR_END           "\x8A"
+#define ICON_REC               "\x8B"
+#define ICON_CLOCK             "\x8C"
+#define ICON_TV_CRYPTED        "\x8D"
+#define ICON_RADIO             "\x8E"
+#define ICON_TV                "\x8F"
+#define ICON_NEW               "\x90"
+#define ICON_ARROW             "\x91"
+#define ICON_RUNNING           "\x92"
+#define ICON_VPS               "\x93"
+#define ICON_CLOCK_UH          "\x94"
+#define ICON_CLOCK_LH          "\x95"
+#define ICON_TIMER_INACT       "\x96"
+
+// UTF-8 Icons
+#define ICON_RESUME_UTF8       "\uE000"
+#define ICON_DVD_UTF8          "\uE001"
+#define ICON_FOLDER_UTF8       "\uE002"
+#define ICON_BLANK_UTF8        "\uE003"
+#define ICON_CUTTING_UTF8      "\uE004"
+#define ICON_MOVE_FILE_UTF8    "\uE005"
+#define ICON_MOVE_FOLDER_UTF8  "\uE006"
+#define ICON_BAR_START_UTF8    "\uE007"
+#define ICON_BAR_FILLED_UTF8   "\uE008"
+#define ICON_BAR_EMPTY_UTF8    "\uE009"
+#define ICON_BAR_CLOSE_UTF8    "\uE00A"
+#define ICON_REC_UTF8          "\uE00B"
+#define ICON_CLOCK_UTF8        "\uE00C"
+#define ICON_TV_CRYPTED_UTF8   "\uE00D"
+#define ICON_RADIO_UTF8        "\uE00E"
+#define ICON_TV_UTF8           "\uE00F"
+#define ICON_NEW_UTF8          "\uE010"
+#define ICON_ARROW_UTF8        "\uE011"
+#define ICON_RUNNING_UTF8      "\uE012"
+#define ICON_VPS_UTF8          "\uE013"
+#define ICON_CLOCK_UH_UTF8     "\uE014"
+#define ICON_CLOCK_LH_UTF8     "\uE015"
+#define ICON_TIMER_INACT_UTF8  "\uE016"
+
+// Iconpatch-Variablen - Ende
+
+bool IsLangUtf8(void);
+
+
--- vdr-2.3.8.orig/menu.c
+++ vdr-2.3.8/menu.c
@@ -8,6 +8,7 @@
  */

 #include "menu.h"
+#include "iconpatch.h"
 #include <ctype.h>
 #include <limits.h>
 #include <math.h>
@@ -331,6 +332,14 @@ void cMenuChannelItem::Set(void)
      const char *R = !channel->Vpid() && (*channel->Apids() || 
*channel->Dpids()) ? "R" : "";
      if (sortMode == csmProvider)
         buffer = cString::sprintf("%d\t%s%s\t%s - %s", channel->Number(), X, 
R, channel->Provider(), channel->Name());
+        else if (Setup.WarEagleIcons) {
+           if (channel->Vpid() == 1 || channel->Vpid() == 0)
+              buffer = cString::sprintf("%d\t%s %-30s", channel->Number(), 
IsLangUtf8() ? ICON_RADIO_UTF8 : ICON_RADIO, channel->Name());
+           else if (channel->Ca() == 0)
+              buffer = cString::sprintf("%d\t%s %-30s", channel->Number(), 
IsLangUtf8() ? ICON_TV_UTF8 : ICON_TV, channel->Name());
+        else
+           buffer = cString::sprintf("%d\t%s %-30s", channel->Number(), 
IsLangUtf8() ? ICON_TV_CRYPTED_UTF8 : ICON_TV_CRYPTED, channel->Name());
+        }
      else
         buffer = cString::sprintf("%d\t%s%s\t%s", channel->Number(), X, R, 
channel->Name());
      }
@@ -1224,8 +1233,8 @@ void cMenuTimerItem::Set(void)
      File++;
   else
      File = timer->File();
-  SetText(cString::sprintf("%c\t%d\t%s%s%s\t%02d:%02d\t%02d:%02d\t%s%s",
-                    !(timer->HasFlags(tfActive)) ? ' ' : timer->FirstDay() ? 
'!' : timer->Recording() ? '#' : '>',
+  SetText(cString::sprintf("%s\t%d\t%s%s%s\t%02d:%02d\t%02d:%02d\t%s%s",
+                    !(timer->HasFlags(tfActive)) ? " " : timer->FirstDay() ? 
Setup.WarEagleIcons ? IsLangUtf8() ? ICON_ARROW_UTF8 : ICON_ARROW : "!" : 
timer->Recording() ? Setup.WarEagleIcons ? IsLangUtf8() ? ICON_REC_UTF8 : 
ICON_REC : "#" : Setup.WarEagleIcons ? IsLangUtf8() ? ICON_CLOCK_UTF8 : 
ICON_CLOCK : ">",
                     timer->Channel()->Number(),
                     *name,
                     *name && **name ? " " : "",
@@ -1552,7 +1561,15 @@ int cMenuScheduleItem::Compare(const cLi
   return r;
 }

-static const char *TimerMatchChars = " tT iI";
+static const char *TimerMatchChars[18] =
+{
+  " ", "t", "T",
+  " ", "i", "I",
+  ICON_BLANK, ICON_CLOCK_UH, ICON_CLOCK,
+  ICON_BLANK, ICON_BLANK, ICON_TIMER_INACT,                    // Zeichen für 
leer, kleines i, grosses I
+  ICON_BLANK_UTF8, ICON_CLOCK_UH_UTF8, ICON_CLOCK_UTF8,
+  ICON_BLANK_UTF8, ICON_BLANK_UTF8, ICON_TIMER_INACT_UTF8      // Zeichen utf8 
für leer, kleines i, grosses I
+};

 bool cMenuScheduleItem::Update(const cTimers *Timers, bool Force)
 {
@@ -1562,17 +1579,17 @@ bool cMenuScheduleItem::Update(const cTi
   timerActive = Timer && Timer->HasFlags(tfActive);
   if (Force || timerMatch != OldTimerMatch || timerActive != OldTimerActive) {
      cString buffer;
-     char t = TimerMatchChars[timerMatch + (timerActive ? 0 : 3)];
-     char v = event->Vps() && (event->Vps() - event->StartTime()) ? 'V' : ' ';
-     char r = event->SeenWithin(30) && event->IsRunning() ? '*' : ' ';
+     const char *t = Setup.WarEagleIcons ? IsLangUtf8() ? 
TimerMatchChars[timerMatch + (timerActive ? 12 : 15)] : 
TimerMatchChars[timerMatch + (timerActive ? 6 : 9)] : 
TimerMatchChars[timerMatch + (timerActive ? 0 : 3)];
+     const char *v = event->Vps() && (event->Vps() - event->StartTime()) ? 
Setup.WarEagleIcons ? IsLangUtf8() ? ICON_VPS_UTF8 : ICON_VPS : "V" : " ";
+     const char *r = event->SeenWithin(30) && event->IsRunning() ? 
Setup.WarEagleIcons ? IsLangUtf8() ? ICON_RUNNING_UTF8 : ICON_RUNNING : "*" : " 
";
      const char *csn = channel ? channel->ShortName(true) : NULL;
      cString eds = event->GetDateString();
      if (channel && withDate)
-        buffer = cString::sprintf("%d\t%.*s\t%.*s\t%s\t%c%c%c\t%s", 
channel->Number(), Utf8SymChars(csn, 999), csn, Utf8SymChars(eds, 6), *eds, 
*event->GetTimeString(), t, v, r, event->Title());
+        buffer = cString::sprintf("%d\t%.*s\t%.*s\t%s\t%s%s%s\t%s", 
channel->Number(), Utf8SymChars(csn, 999), csn, Utf8SymChars(eds, 6), *eds, 
*event->GetTimeString(), t, v, r, event->Title());
      else if (channel)
-        buffer = cString::sprintf("%d\t%.*s\t%s\t%c%c%c\t%s", 
channel->Number(), Utf8SymChars(csn, 999), csn, *event->GetTimeString(), t, v, 
r, event->Title());
+        buffer = cString::sprintf("%d\t%.*s\t%s\t%s%s%s\t%s", 
channel->Number(), Utf8SymChars(csn, 999), csn, *event->GetTimeString(), t, v, 
r, event->Title());
      else
-        buffer = cString::sprintf("%.*s\t%s\t%c%c%c\t%s", Utf8SymChars(eds, 
6), *eds, *event->GetTimeString(), t, v, r, event->Title());
+        buffer = cString::sprintf("%.*s\t%s\t%s%s%s\t%s", Utf8SymChars(eds, 
6), *eds, *event->GetTimeString(), t, v, r, event->Title());
      SetText(buffer);
      return true;
      }
@@ -3406,6 +3423,7 @@ void cMenuSetupOSD::Set(void)
   Add(new cMenuEditStraItem(tr("Setup.OSD$Skin"),                   
&skinIndex, numSkins, skinDescriptions));
   if (themes.NumThemes())
   Add(new cMenuEditStraItem(tr("Setup.OSD$Theme"),                  
&themeIndex, themes.NumThemes(), themes.Descriptions()));
+  Add(new cMenuEditBoolItem(tr("Setup.OSD$WarEagle icons"),         
&data.WarEagleIcons));
   Add(new cMenuEditPrcItem( tr("Setup.OSD$Left (%)"),               
&data.OSDLeftP, 0.0, 0.5));
   Add(new cMenuEditPrcItem( tr("Setup.OSD$Top (%)"),                
&data.OSDTopP, 0.0, 0.5));
   Add(new cMenuEditPrcItem( tr("Setup.OSD$Width (%)"),              
&data.OSDWidthP, 0.5, 1.0));
--- vdr-2.3.8.orig/recording.c
+++ vdr-2.3.8/recording.c
@@ -8,6 +8,7 @@
  */

 #include "recording.h"
+#include "iconpatch.h"
 #include <ctype.h>
 #include <dirent.h>
 #include <errno.h>
@@ -1065,7 +1066,7 @@ const char *cRecording::FileName(void) c

 const char *cRecording::Title(char Delimiter, bool NewIndicator, int Level) 
const
 {
-  char New = NewIndicator && IsNew() ? '*' : ' ';
+  const char *New = NewIndicator && IsNew() ? Setup.WarEagleIcons ? 
IsLangUtf8() ? ICON_NEW_UTF8 : ICON_NEW : "*" : " ";
   free(titleBuffer);
   titleBuffer = NULL;
   if (Level < 0 || Level == HierarchyLevels()) {
@@ -1085,7 +1086,7 @@ const char *cRecording::Title(char Delim
                    Minutes % 60
                    );
         }
-     titleBuffer = strdup(cString::sprintf("%02d.%02d.%02d%c%02d:%02d%s%c%c%s",
+     titleBuffer = strdup(cString::sprintf("%02d.%02d.%02d%c%02d:%02d%s%s%c%s",
                             t->tm_mday,
                             t->tm_mon + 1,
                             t->tm_year % 100,
--- vdr-2.3.8.orig/Makefile
+++ vdr-2.3.8/Makefile
@@ -83,6 +83,8 @@ OBJS = args.o audio.o channels.o ci.o co
        skinclassic.o skinlcars.o skins.o skinsttng.o sourceparams.o sources.o 
spu.o status.o svdrp.o themes.o thread.o\
        timers.o tools.o transfer.o vdr.o videodir.o

+OBJS += iconpatch.o
+
 DEFINES  += $(CDEFINES)
 INCLUDES += $(CINCLUDES)

++++++ vdr-2.0.4-MainMenuHooks-v1_0_1.patch -> 
vdr-2.3.9-MainMenuHooks-v1_0_1.patch ++++++
--- /work/SRC/openSUSE:Factory/vdr/vdr-2.0.4-MainMenuHooks-v1_0_1.patch 
2014-04-22 17:09:21.000000000 +0200
+++ 
/work/SRC/openSUSE:Factory/.vdr.new.28833/vdr-2.3.9-MainMenuHooks-v1_0_1.patch  
    2019-03-10 09:32:12.764222625 +0100
@@ -70,10 +70,11 @@
 authors first or at least use a service id which differs in more than
 just the version number.
 
-diff -ru vdr.orig/menu.c vdr/menu.c
---- vdr.orig/menu.c    2013-03-18 09:11:48.000000000 +0000
-+++ vdr/menu.c 2013-03-27 17:29:58.767375783 +0000
-@@ -3379,15 +3379,31 @@
+Index: b/menu.c
+===================================================================
+--- a/menu.c
++++ b/menu.c
+@@ -4391,15 +4391,31 @@ cMenuMain::cMenuMain(eOSState State, boo
  
    // Initial submenus:
  
@@ -111,7 +112,7 @@
  }
  
  cOsdObject *cMenuMain::PluginOsdObject(void)
-@@ -3495,13 +3511,34 @@
+@@ -4507,13 +4523,34 @@ eOSState cMenuMain::ProcessKey(eKeys Key
    eOSState state = cOsdMenu::ProcessKey(Key);
    HadSubMenu |= HasSubMenu();
  
@@ -150,9 +151,9 @@
 +    case osSetup:      menu = new cMenuSetup; break;
 +    case osCommands:   menu = new cMenuCommands(tr("Commands"), &Commands); 
break;
      case osStopRecord: if (Interface->Confirm(tr("Stop recording?"))) {
-                           cOsdItem *item = Get(Current());
-                           if (item) {
-@@ -3553,6 +3590,12 @@
+                           if (cOsdItem *item = Get(Current())) {
+                              cRecordControls::Stop(item->Text() + 
strlen(tr(STOP_RECORDING)));
+@@ -4564,6 +4601,12 @@ eOSState cMenuMain::ProcessKey(eKeys Key
                 default:      break;
                 }
      }
@@ -165,9 +166,10 @@
    if (!HasSubMenu() && Update(HadSubMenu))
       Display();
    if (Key != kNone) {
-diff -ru vdr.orig/config.h vdr/config.h
---- vdr.orig/config.h  2013-03-16 15:12:14.000000000 +0000
-+++ vdr/config.h       2013-03-27 17:50:05.204415063 +0000
+Index: b/config.h
+===================================================================
+--- a/config.h
++++ b/config.h
 @@ -36,6 +36,10 @@
  // plugins to work with newer versions of the core VDR as long as no
  // VDR header files have changed.
@@ -179,4 +181,3 @@
  #define MAXPRIORITY       99
  #define MINPRIORITY       (-MAXPRIORITY)
  #define LIVEPRIORITY      0                  // priority used when selecting 
a device for live viewing
-

++++++ vdr-2.2.0-gcc7.diff -> vdr-2.3.9-gcc7.diff ++++++
--- /work/SRC/openSUSE:Factory/vdr/vdr-2.2.0-gcc7.diff  2017-06-07 
09:55:10.480792044 +0200
+++ /work/SRC/openSUSE:Factory/.vdr.new.28833/vdr-2.3.9-gcc7.diff       
2019-03-10 09:32:12.804222615 +0100
@@ -1,37 +1,8 @@
-Index: b/dvbdevice.c
-===================================================================
---- a/dvbdevice.c
-+++ b/dvbdevice.c
-@@ -819,13 +819,13 @@ bool cDvbTuner::SetFrontend(void)
- 
-   SETCMD(DTV_DELIVERY_SYSTEM, frontendType);
-   if (frontendType == SYS_DVBS || frontendType == SYS_DVBS2) {
--     unsigned int frequency = channel.Frequency();
-+     int frequency = channel.Frequency();
-      if (Setup.DiSEqC) {
-         if (const cDiseqc *diseqc = Diseqcs.Get(device->CardIndex() + 1, 
channel.Source(), frequency, dtp.Polarization(), &scr)) {
-            frequency -= diseqc->Lof();
-            if (diseqc != lastDiseqc || diseqc->IsScr() || diseqc->Position() 
>= 0 && channel.Source() != lastSource) {
-               if (IsBondedMaster()) {
--                 ExecuteDiseqc(diseqc, &frequency);
-+                 ExecuteDiseqc(diseqc, (unsigned int *)&frequency);
-                  if (frequency == 0)
-                     return false;
-                  }
-@@ -842,7 +842,7 @@ bool cDvbTuner::SetFrontend(void)
-         }
-      else {
-         int tone = SEC_TONE_OFF;
--        if (frequency < (unsigned int)Setup.LnbSLOF) {
-+        if (frequency < Setup.LnbSLOF) {
-            frequency -= Setup.LnbFrequLo;
-            tone = SEC_TONE_OFF;
-            }
 Index: b/osdbase.c
 ===================================================================
 --- a/osdbase.c
 +++ b/osdbase.c
-@@ -506,7 +506,7 @@ eOSState cOsdMenu::HotKey(eKeys Key)
+@@ -518,7 +518,7 @@ eOSState cOsdMenu::HotKey(eKeys Key)
        const char *s = item->Text();
        i = 0;
        item_nr = 0;
@@ -44,12 +15,12 @@
 ===================================================================
 --- a/remux.c
 +++ b/remux.c
-@@ -1552,11 +1552,11 @@ int cFrameDetector::Analyze(const uchar
-                        uint32_t Delta = ptsValues[0] / Div;
-                        // determine frame info:
+@@ -1729,11 +1729,11 @@ int cFrameDetector::Analyze(const uchar
                         if (isVideo) {
--                          if (abs(Delta - 3600) <= 1)
-+                          if (abs((int32_t)Delta - 3600) <= 1)
+                           if (Delta == 3753)
+                              framesPerSecond = 24.0 / 1.001;
+-                          else if (abs(Delta - 3600) <= 1)
++                          else if (abs((int32_t)Delta - 3600) <= 1)
                               framesPerSecond = 25.0;
                            else if (Delta % 3003 == 0)
                               framesPerSecond = 30.0 / 1.001;

++++++ vdr-1.7.29-menuselection.patch -> vdr-2.3.9-menuselection.patch ++++++
--- /work/SRC/openSUSE:Factory/vdr/vdr-1.7.29-menuselection.patch       
2014-04-22 17:09:21.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.vdr.new.28833/vdr-2.3.9-menuselection.patch     
2019-03-10 09:32:12.852222604 +0100
@@ -1,7 +1,8 @@
-diff -Nru vdr-1.7.29-vanilla/osdbase.c vdr-1.7.29-menuselection/osdbase.c
---- vdr-1.7.29-vanilla/osdbase.c       2012-07-17 22:37:09.000000000 +0300
-+++ vdr-1.7.29-menuselection/osdbase.c 2012-07-17 22:44:15.000000000 +0300
-@@ -77,6 +77,7 @@
+Index: b/osdbase.c
+===================================================================
+--- a/osdbase.c
++++ b/osdbase.c
+@@ -83,6 +83,7 @@ cOsdMenu::cOsdMenu(const char *Title, in
  {
    isMenu = true;
    digit = 0;
@@ -9,7 +10,7 @@
    hasHotkeys = false;
    displayMenuItems = 0;
    title = NULL;
-@@ -126,7 +127,7 @@
+@@ -142,7 +143,7 @@ const char *cOsdMenu::hk(const char *s)
          digit = -1; // prevents automatic hotkeys - input already has them
       if (digit >= 0) {
          digit++;
@@ -18,7 +19,7 @@
          s = buffer;
          }
       }
-@@ -472,20 +473,60 @@
+@@ -496,20 +497,60 @@ void cOsdMenu::Mark(void)
       }
  }
  
@@ -82,7 +83,7 @@
    return osContinue;
  }
  
-@@ -524,8 +565,8 @@
+@@ -550,8 +591,8 @@ eOSState cOsdMenu::ProcessKey(eKeys Key)
          }
       }
    switch (int(Key)) {
@@ -91,12 +92,13 @@
 +    case kNone:
 +    case k0...k9: return hasHotkeys ? HotKey(Key) : osUnknown;
      case kUp|k_Repeat:
-     case kUp:   CursorUp();   break;
+     case kUp:     if (menuOrientation == moHorizontal) PageUp();     else 
CursorUp(); break;
      case kDown|k_Repeat:
-diff -Nru vdr-1.7.29-vanilla/osdbase.h vdr-1.7.29-menuselection/osdbase.h
---- vdr-1.7.29-vanilla/osdbase.h       2012-07-17 22:37:09.000000000 +0300
-+++ vdr-1.7.29-menuselection/osdbase.h 2012-07-17 22:44:15.000000000 +0300
-@@ -97,6 +97,8 @@
+Index: b/osdbase.h
+===================================================================
+--- a/osdbase.h
++++ b/osdbase.h
+@@ -101,6 +101,8 @@ private:
    char *status;
    int digit;
    bool hasHotkeys;

++++++ vdr-2.4.0-01-fix-svdrp-modt-recflag.diff ++++++
# This patch fixes a bug in handling the tfRecording flag in the SVDRP commands 
MODT
# and UPDT. The tfRecording flag must only be handled by the VDR that actually 
hosts
# and processes the timer.
#
--- svdrp.c     2018/03/19 12:16:33     5.0
+++ svdrp.c     2018/04/19 09:45:08
@@ -2036,6 +2036,7 @@
         LOCK_TIMERS_WRITE;
         Timers->SetExplicitModify();
         if (cTimer *Timer = Timers->GetById(Id)) {
+           bool IsRecording = Timer->HasFlags(tfRecording);
            cTimer t = *Timer;
            if (strcasecmp(tail, "ON") == 0)
               t.SetFlags(tfActive);
@@ -2046,6 +2047,10 @@
               return;
               }
            *Timer = t;
+           if (IsRecording)
+              Timer->SetFlags(tfRecording);
+           else
+              Timer->ClrFlags(tfRecording);
            Timers->SetModified();
            isyslog("SVDRP %s < %s modified timer %s (%s)", 
Setup.SVDRPHostName, *clientName, *Timer->ToDescr(), Timer->HasFlags(tfActive) 
? "active" : "inactive");
            Reply(250, "%d %s", Timer->Id(), *Timer->ToText(true));
@@ -2478,12 +2483,18 @@
      if (Timer->Parse(Option)) {
         LOCK_TIMERS_WRITE;
         if (cTimer *t = Timers->GetTimer(Timer)) {
+           bool IsRecording = t->HasFlags(tfRecording);
            t->Parse(Option);
            delete Timer;
            Timer = t;
+           if (IsRecording)
+              Timer->SetFlags(tfRecording);
+           else
+              Timer->ClrFlags(tfRecording);
            isyslog("SVDRP %s < %s updated timer %s", Setup.SVDRPHostName, 
*clientName, *Timer->ToDescr());
            }
         else {
+           Timer->ClrFlags(tfRecording);
            Timers->Add(Timer);
            isyslog("SVDRP %s < %s added timer %s", Setup.SVDRPHostName, 
*clientName, *Timer->ToDescr());
            }
++++++ vdr-2.4.0-02-fix-invalid-locking-sequence.diff ++++++
# This patch fixes a possible invalid locking sequence in case a remote timer 
handling error message
# is displayed on the OSD and the skin tries to lock the Recordings or 
DeletedRecordings
# list in its Flush() function (for instance by calling 
cVideoDiskUsage::HasChanged()).
# To do this, the call to Skins.Message() in menu.c's 
HandleRemoteModifications() has
# been changed to Skins.QueueMessage(), and cSkins::ProcessQueuedMessages() is 
now called
# unconditionally in the main loop, and checks whether the current cSkinDisplay 
object
# (if any) implements SetMessage().
#
--- ./menu.c    2018/04/14 10:24:41     5.0
+++ ./menu.c    2018/04/28 12:09:45
@@ -1075,7 +1075,7 @@
 {
   cString ErrorMessage;
   if (!HandleRemoteTimerModifications(NewTimer, OldTimer, &ErrorMessage)) {
-     Skins.Message(mtError, ErrorMessage);
+     Skins.QueueMessage(mtError, ErrorMessage);
      return false;
      }
   return true;
--- ./skins.c   2013/08/18 12:07:22     5.0
+++ ./skins.c   2018/04/28 12:13:01
@@ -352,6 +352,14 @@
      dsyslog("cSkins::ProcessQueuedMessages() called from background thread - 
ignored!");
      return;
      }
+  // Check whether there is a cSkinDisplay object (if any) that implements 
SetMessage():
+  if (cSkinDisplay *sd = cSkinDisplay::Current()) {
+     if (!(dynamic_cast<cSkinDisplayChannel *>(sd) ||
+           dynamic_cast<cSkinDisplayMenu *>(sd) ||
+           dynamic_cast<cSkinDisplayReplay *>(sd) ||
+           dynamic_cast<cSkinDisplayMessage *>(sd)))
+        return;
+     }
   cSkinQueuedMessage *msg = NULL;
   // Get the first waiting message:
   queueMessageMutex.Lock();
--- ./vdr.c     2018/04/10 13:24:43     5.0
+++ ./vdr.c     2018/04/28 11:27:48
@@ -1176,8 +1176,7 @@
         if (!Menu && !cOsd::IsOpen())
            Menu = CamControl();
         // Queued messages:
-        if (!Skins.IsOpen())
-           Skins.ProcessQueuedMessages();
+        Skins.ProcessQueuedMessages();
         // User Input:
         cOsdObject *Interact = Menu ? Menu : cControl::Control();
         eKeys key = Interface->GetKey(!Interact || 
!Interact->NeedsFastResponse());
++++++ vdr-2.4.0-03-fix-locking-channel-display.diff ++++++
# Fixed locking the Channels list in cDisplayChannel, where the lock was still 
held
# when Flush() was called.
#
--- menu.c      2018/04/28 12:09:45     5.1
+++ menu.c      2018/05/06 09:30:11
@@ -4626,14 +4626,17 @@
   cOsdProvider::OsdSizeChanged(osdState); // just to get the current state
   positioner = NULL;
   channel = NULL;
-  LOCK_CHANNELS_READ;
-  channel = Channels->GetByNumber(Number);
-  lastPresent = lastFollowing = NULL;
-  if (channel) {
-     DisplayChannel();
-     DisplayInfo();
+  {
+    LOCK_CHANNELS_READ;
+    channel = Channels->GetByNumber(Number);
+    lastPresent = lastFollowing = NULL;
+    if (channel) {
+       DisplayChannel();
+       DisplayInfo();
+       }
+  }
+  if (channel)
      displayChannel->Flush();
-     }
   lastTime.Set();
 }
 
@@ -4868,31 +4871,33 @@
             }
     };
   if (positioner || !timeout || lastTime.Elapsed() < 
(uint64_t)(Setup.ChannelInfoTime * 1000)) {
-     LOCK_CHANNELS_READ;
-     if (Key == kNone && !number && group < 0 && !NewChannel && channel && 
channel->Number() != cDevice::CurrentChannel()) {
-        // makes sure a channel switch through the SVDRP CHAN command is 
displayed
-        channel = Channels->GetByNumber(cDevice::CurrentChannel());
-        Refresh();
-        lastTime.Set();
-        }
-     DisplayInfo();
-     if (NewChannel) {
-        SetTrackDescriptions(NewChannel->Number()); // to make them 
immediately visible in the channel display
-        Channels->SwitchTo(NewChannel->Number());
-        SetTrackDescriptions(NewChannel->Number()); // switching the channel 
has cleared them
-        channel = NewChannel;
-        }
-     const cPositioner *Positioner = cDevice::ActualDevice()->Positioner();
-     bool PositionerMoving = Positioner && Positioner->IsMoving();
-     SetNeedsFastResponse(PositionerMoving);
-     if (!PositionerMoving) {
-        if (positioner)
-           lastTime.Set(); // to keep the channel display up a few seconds 
after the target position has been reached
-        Positioner = NULL;
-        }
-     if (Positioner || positioner) // making sure we call SetPositioner(NULL) 
if there is a switch from "with" to "without" positioner
-        displayChannel->SetPositioner(Positioner);
-     positioner = Positioner;
+     {
+       LOCK_CHANNELS_READ;
+       if (Key == kNone && !number && group < 0 && !NewChannel && channel && 
channel->Number() != cDevice::CurrentChannel()) {
+          // makes sure a channel switch through the SVDRP CHAN command is 
displayed
+          channel = Channels->GetByNumber(cDevice::CurrentChannel());
+          Refresh();
+          lastTime.Set();
+          }
+       DisplayInfo();
+       if (NewChannel) {
+          SetTrackDescriptions(NewChannel->Number()); // to make them 
immediately visible in the channel display
+          Channels->SwitchTo(NewChannel->Number());
+          SetTrackDescriptions(NewChannel->Number()); // switching the channel 
has cleared them
+          channel = NewChannel;
+          }
+       const cPositioner *Positioner = cDevice::ActualDevice()->Positioner();
+       bool PositionerMoving = Positioner && Positioner->IsMoving();
+       SetNeedsFastResponse(PositionerMoving);
+       if (!PositionerMoving) {
+          if (positioner)
+             lastTime.Set(); // to keep the channel display up a few seconds 
after the target position has been reached
+          Positioner = NULL;
+          }
+       if (Positioner || positioner) // making sure we call 
SetPositioner(NULL) if there is a switch from "with" to "without" positioner
+          displayChannel->SetPositioner(Positioner);
+       positioner = Positioner;
+     }
      displayChannel->Flush();
      return osContinue;
      }
++++++ vdr-2.4.0-04-fix-locking-channel-display-2.diff ++++++
# Fixed locking the Channels list in cDisplayChannel, where the lock was still 
held
# when Flush() was called (cont'd).
#
--- menu.c      2018/05/06 09:30:11     5.2
+++ menu.c      2018/05/27 09:51:56     5.3
@@ -4654,8 +4654,10 @@
   displayChannel = Skins.Current()->DisplayChannel(withInfo);
   positioner = NULL;
   channel = NULL;
-  LOCK_CHANNELS_READ;
-  channel = Channels->GetByNumber(cDevice::CurrentChannel());
+  {
+    LOCK_CHANNELS_READ;
+    channel = Channels->GetByNumber(cDevice::CurrentChannel());
+  }
   ProcessKey(FirstKey);
 }
 
++++++ vdr-2.4.0-05-fix-shutdown.diff ++++++
# Fixed shutdown after user inactivity in case a plugin is keeping the OSD open.
#
--- vdr.c       2018/04/28 11:27:48     5.1
+++ vdr.c       2018/07/16 08:52:40     5.2
@@ -1514,9 +1514,7 @@
               ShutdownHandler.countdown.Cancel();
            }
 
-        if ((Now - LastInteract) > ACTIVITYTIMEOUT && 
!cRecordControls::Active() && !RecordingsHandler.Active() && (Now - 
cRemote::LastActivity()) > ACTIVITYTIMEOUT) {
-           // Handle housekeeping tasks
-
+        if (!cRecordControls::Active() && !RecordingsHandler.Active() && (Now 
- cRemote::LastActivity()) > ACTIVITYTIMEOUT) {
            // Shutdown:
            // Check whether VDR will be ready for shutdown in SHUTDOWNWAIT 
seconds:
            time_t Soon = Now + SHUTDOWNWAIT;
@@ -1535,7 +1533,8 @@
               // Do this again a bit later:
               ShutdownHandler.SetRetry(SHUTDOWNRETRY);
               }
-
+           // Handle housekeeping tasks
+           if ((Now - LastInteract) > ACTIVITYTIMEOUT) {
            // Disk housekeeping:
            RemoveDeletedRecordings();
            ListGarbageCollector.Purge();
@@ -1543,6 +1542,7 @@
            // Plugins housekeeping:
            PluginManager.Housekeeping();
            }
+           }
 
         ReportEpgBugFixStats();
 
++++++ vdr-2.4.0-06-fix-channel-switch.diff ++++++
# Fixed switching through encrypted channels with the Up/Down keys
#
--- device.c    2018/03/24 09:49:14     5.0
+++ device.c    2018/07/16 09:29:57
@@ -787,6 +787,7 @@
   if (LiveView) {
      isyslog("switching to channel %d %s (%s)", Channel->Number(), 
*Channel->GetChannelID().ToString(), Channel->Name());
      cControl::Shutdown(); // prevents old channel from being shown too long 
if GetDevice() takes longer
+                           // and, if decrypted, this removes the now 
superflous PIDs from the CAM, too
      }
   for (int i = 3; i--;) {
       switch (SetChannel(Channel, LiveView)) {
@@ -809,6 +810,7 @@
   Direction = sgn(Direction);
   if (Direction) {
      cControl::Shutdown(); // prevents old channel from being shown too long 
if GetDevice() takes longer
+                           // and, if decrypted, this removes the now 
superflous PIDs from the CAM, too
      int n = CurrentChannel() + Direction;
      int first = n;
      LOCK_CHANNELS_READ;
--- menu.c      2018/05/27 09:51:56     5.3
+++ menu.c      2018/07/16 09:29:57
@@ -4704,6 +4704,8 @@
 const cChannel *cDisplayChannel::NextAvailableChannel(const cChannel *Channel, 
int Direction)
 {
   if (Direction) {
+     cControl::Shutdown(); // prevents old channel from being shown too long 
if GetDevice() takes longer
+                           // and, if decrypted, this removes the now 
superflous PIDs from the CAM, too
      LOCK_CHANNELS_READ;
      while (Channel) {
            Channel = Direction > 0 ? Channels->Next(Channel) : 
Channels->Prev(Channel);
++++++ vdr-2.4.0-07-fix-disabling-mtd.diff ++++++
# Now deactivating MTD support if a non MCD capable CAM is inserted after 
removing
# a previously used CAM that is MCD capable.
#
--- ci.c        2018/03/19 16:37:03     5.0
+++ ci.c        2018/09/23 10:17:20
@@ -1213,6 +1213,7 @@
         }
      else {
         dsyslog("CAM %d: doesn't reply to QUERY - only a single channel can be 
decrypted", CamSlot()->SlotNumber());
+        CamSlot()->MtdActivate(false);
         state = 4; // normal operation
         }
      }
++++++ vdr-2.2.0-use-ncurses5.diff -> vdr-2.4.0-use-ncurses5.diff ++++++
--- /work/SRC/openSUSE:Factory/vdr/vdr-2.2.0-use-ncurses5.diff  2015-10-06 
13:25:26.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.vdr.new.28833/vdr-2.4.0-use-ncurses5.diff       
2019-03-10 09:32:13.272222498 +0100
@@ -3,7 +3,7 @@
 --- a/PLUGINS/src/skincurses/skincurses.c
 +++ b/PLUGINS/src/skincurses/skincurses.c
 @@ -6,7 +6,7 @@
-  * $Id: skincurses.c 3.3 2015/02/17 13:13:17 kls Exp $
+  * $Id: skincurses.c 4.3 2018/04/10 13:01:00 kls Exp $
   */
  
 -#include <ncurses.h>

++++++ vdr-2.2.0.tar.bz2 -> vdr-2.4.0.tar.bz2 ++++++
++++ 46679 lines of diff (skipped)


Reply via email to