summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--HISTORY9
-rw-r--r--PLUGINS/src/skincurses/HISTORY5
-rw-r--r--PLUGINS/src/skincurses/skincurses.c20
-rw-r--r--menu.c67
-rw-r--r--menu.h3
-rw-r--r--skinclassic.c20
-rw-r--r--skinsttng.c20
-rw-r--r--videodir.c42
-rw-r--r--videodir.h40
9 files changed, 147 insertions, 79 deletions
diff --git a/HISTORY b/HISTORY
index d5f264c0..eae8d412 100644
--- a/HISTORY
+++ b/HISTORY
@@ -7052,7 +7052,7 @@ Video Disk Recorder Revision History
- Fixed handling IDLEPRIORITY in cDvbDevice::ProvidesChannel() (thanks to Frank
Schmirler).
-2012-04-15: Version 1.7.28
+2012-04-23: Version 1.7.28
- Fixed cPixmapMemory::DrawEllipse() for quadrants -1 and -4.
- Fixed getting the maximum short channel name length in case there are no short names
@@ -7072,3 +7072,10 @@ Video Disk Recorder Revision History
variations of the DVB standard (thanks to Rolf Ahrenberg). Currently there is "DVB"
(for the original DVB standard) and "ANSI/SCTE", which is used to properly handle
certain private stream types.
+- The disk usage is no longer automatically added to the title of the main and
+ "Recordings" menus. This has always been a mekeshift solution and it is now up
+ to the individual skin if, where and how it wants to display this information.
+ A skin can use the new cVideoDiskUsage class to implement such a display. For
+ compatibility, the default skins "Classic VDR", "ST:TNG Panels" and "Text mode"
+ (i.e. curses) have been changed to behave like before. Other skins may want to
+ display the disk usage in totally different ways.
diff --git a/PLUGINS/src/skincurses/HISTORY b/PLUGINS/src/skincurses/HISTORY
index 0ba892ea..deb011b5 100644
--- a/PLUGINS/src/skincurses/HISTORY
+++ b/PLUGINS/src/skincurses/HISTORY
@@ -96,3 +96,8 @@ VDR Plugin 'skincurses' Revision History
2012-03-11: Version 0.1.11
- Adapted menu column widths of 'skincurses' to the wider HD OSD sizes.
+
+2012-04-23: Version 0.1.12
+
+- Now displaying disk usage in the title of the main and "Recordings" menu,
+ which is no longer done by the VDR core.
diff --git a/PLUGINS/src/skincurses/skincurses.c b/PLUGINS/src/skincurses/skincurses.c
index 1f120c7c..587d0b97 100644
--- a/PLUGINS/src/skincurses/skincurses.c
+++ b/PLUGINS/src/skincurses/skincurses.c
@@ -3,15 +3,16 @@
*
* See the README file for copyright information and how to reach the author.
*
- * $Id: skincurses.c 2.8 2012/03/11 14:42:52 kls Exp $
+ * $Id: skincurses.c 2.9 2012/04/23 08:53:13 kls Exp $
*/
#include <ncurses.h>
#include <vdr/osd.h>
#include <vdr/plugin.h>
#include <vdr/skins.h>
+#include <vdr/videodir.h>
-static const char *VERSION = "0.1.11";
+static const char *VERSION = "0.1.12";
static const char *DESCRIPTION = trNOOP("A text only skin");
static const char *MAINMENUENTRY = NULL;
@@ -262,6 +263,9 @@ void cSkinCursesDisplayChannel::Flush(void)
class cSkinCursesDisplayMenu : public cSkinDisplayMenu {
private:
cOsd *osd;
+ cString title;
+ int lastDiskUsageState;
+ void DrawTitle(void);
void DrawScrollbar(int Total, int Offset, int Shown, int Top, int Height, bool CanScrollUp, bool CanScrollDown);
void SetTextScrollbar(void);
public:
@@ -285,6 +289,7 @@ public:
cSkinCursesDisplayMenu::cSkinCursesDisplayMenu(void)
{
osd = new cCursesOsd(0, 0);
+ lastDiskUsageState = -1;
osd->DrawRectangle(0, 0, ScOsdWidth - 1, ScOsdHeight - 1, clrBackground);
}
@@ -332,9 +337,16 @@ void cSkinCursesDisplayMenu::Clear(void)
textScroller.Reset();
}
+void cSkinCursesDisplayMenu::DrawTitle(void)
+{
+ bool WithDisk = MenuCategory() == mcMain || MenuCategory() == mcRecording;
+ osd->DrawText(0, 0, WithDisk ? cString::sprintf("%s - %s", *title, *cVideoDiskUsage::String()) : title, clrBlack, clrCyan, &Font, ScOsdWidth);
+}
+
void cSkinCursesDisplayMenu::SetTitle(const char *Title)
{
- osd->DrawText(0, 0, Title, clrBlack, clrCyan, &Font, ScOsdWidth);
+ title = Title;
+ DrawTitle();
}
void cSkinCursesDisplayMenu::SetButtons(const char *Red, const char *Green, const char *Yellow, const char *Blue)
@@ -475,6 +487,8 @@ void cSkinCursesDisplayMenu::SetText(const char *Text, bool FixedFont)
void cSkinCursesDisplayMenu::Flush(void)
{
+ if (cVideoDiskUsage::HasChanged(lastDiskUsageState))
+ DrawTitle();
cString date = DayDateTime();
osd->DrawText(ScOsdWidth - Utf8StrLen(date) - 2, 0, date, clrBlack, clrCyan, &Font);
osd->Flush();
diff --git a/menu.c b/menu.c
index 6fe8bbfa..c6208e1d 100644
--- a/menu.c
+++ b/menu.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: menu.c 2.49 2012/04/22 10:44:20 kls Exp $
+ * $Id: menu.c 2.50 2012/04/22 15:13:14 kls Exp $
*/
#include "menu.h"
@@ -34,7 +34,6 @@
#define MAXWAIT4EPGINFO 3 // seconds
#define MODETIMEOUT 3 // seconds
-#define DISKSPACECHEK 5 // seconds between disk space checks
#define NEWTIMERLIMIT 120 // seconds until the start time of a new timer created from the Schedule menu,
// within which it will go directly into the "Edit timer" menu to allow
// further parameter settings
@@ -52,47 +51,6 @@
#define CHNUMWIDTH (numdigits(Channels.MaxNumber()) + 1)
#define CHNAMWIDTH (min(MAXCHNAMWIDTH, Channels.MaxShortChannelNameLength() + 1))
-// --- cFreeDiskSpace --------------------------------------------------------
-
-#define MB_PER_MINUTE 25.75 // this is just an estimate!
-
-class cFreeDiskSpace {
-private:
- static time_t lastDiskSpaceCheck;
- static int lastFreeMB;
- static cString freeDiskSpaceString;
-public:
- static bool HasChanged(bool ForceCheck = false);
- static const char *FreeDiskSpaceString(void) { HasChanged(); return freeDiskSpaceString; }
- };
-
-time_t cFreeDiskSpace::lastDiskSpaceCheck = 0;
-int cFreeDiskSpace::lastFreeMB = 0;
-cString cFreeDiskSpace::freeDiskSpaceString;
-
-cFreeDiskSpace FreeDiskSpace;
-
-bool cFreeDiskSpace::HasChanged(bool ForceCheck)
-{
- if (ForceCheck || time(NULL) - lastDiskSpaceCheck > DISKSPACECHEK) {
- int FreeMB;
- int Percent = VideoDiskSpace(&FreeMB);
- lastDiskSpaceCheck = time(NULL);
- if (ForceCheck || FreeMB != lastFreeMB) {
- int MBperMinute = Recordings.MBperMinute();
- if (MBperMinute <= 0)
- MBperMinute = MB_PER_MINUTE;
- int Minutes = int(double(FreeMB) / MBperMinute);
- int Hours = Minutes / 60;
- Minutes %= 60;
- freeDiskSpaceString = cString::sprintf("%s %d%% - %2d:%02d %s", tr("Disk"), Percent, Hours, Minutes, tr("free"));
- lastFreeMB = FreeMB;
- return true;
- }
- }
- return false;
-}
-
// --- cMenuEditCaItem -------------------------------------------------------
class cMenuEditCaItem : public cMenuEditIntItem {
@@ -2234,7 +2192,6 @@ cMenuRecordings::cMenuRecordings(const char *Base, int Level, bool OpenSubMenus)
helpKeys = -1;
Display(); // this keeps the higher level menus from showing up briefly when pressing 'Back' during replay
Set();
- SetFreeDiskDisplay(true);
if (Current() < 0)
SetCurrent(First());
else if (OpenSubMenus && cReplayControl::LastReplayed() && Open(true))
@@ -2249,16 +2206,6 @@ cMenuRecordings::~cMenuRecordings()
free(base);
}
-bool cMenuRecordings::SetFreeDiskDisplay(bool Force)
-{
- if (FreeDiskSpace.HasChanged(Force)) {
- //XXX -> skin function!!!
- SetTitle(cString::sprintf("%s - %s", base ? base : tr("Recordings"), FreeDiskSpace.FreeDiskSpaceString()));
- return true;
- }
- return false;
-}
-
void cMenuRecordings::SetHelpKeys(void)
{
cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current());
@@ -2321,7 +2268,6 @@ void cMenuRecordings::Set(bool Refresh)
}
}
free(LastItemText);
- Refresh |= SetFreeDiskDisplay(Refresh);
if (Refresh)
Display();
}
@@ -2427,7 +2373,7 @@ eOSState cMenuRecordings::Delete(void)
Recordings.DelByName(ri->FileName());
cOsdMenu::Del(Current());
SetHelpKeys();
- SetFreeDiskDisplay(true);
+ cVideoDiskUsage::ForceCheck();
Display();
if (!Count())
return osBack;
@@ -2500,8 +2446,6 @@ eOSState cMenuRecordings::ProcessKey(eKeys Key)
Display();
}
if (!HasSubMenu()) {
- if (HadSubMenu)
- SetFreeDiskDisplay();
if (Key != kNone)
SetHelpKeys();
}
@@ -3416,13 +3360,6 @@ bool cMenuMain::Update(bool Force)
{
bool result = false;
- // Title with disk usage:
- if (FreeDiskSpace.HasChanged(Force)) {
- //XXX -> skin function!!!
- SetTitle(cString::sprintf("%s - %s", tr("VDR"), FreeDiskSpace.FreeDiskSpaceString()));
- result = true;
- }
-
bool NewReplaying = cControl::Control() != NULL;
if (Force || NewReplaying != replaying) {
replaying = NewReplaying;
diff --git a/menu.h b/menu.h
index 2baf75a0..52db721c 100644
--- a/menu.h
+++ b/menu.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: menu.h 2.6 2012/04/19 14:28:37 kls Exp $
+ * $Id: menu.h 2.7 2012/04/22 15:08:58 kls Exp $
*/
#ifndef __MENU_H
@@ -196,7 +196,6 @@ private:
int level;
int recordingsState;
int helpKeys;
- bool SetFreeDiskDisplay(bool Force = false);
void SetHelpKeys(void);
void Set(bool Refresh = false);
bool Open(bool OpenSubMenus = false);
diff --git a/skinclassic.c b/skinclassic.c
index 49f0bcb5..64944ded 100644
--- a/skinclassic.c
+++ b/skinclassic.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: skinclassic.c 2.6 2011/08/21 11:02:06 kls Exp $
+ * $Id: skinclassic.c 2.7 2012/04/23 08:48:03 kls Exp $
*/
#include "skinclassic.h"
@@ -12,6 +12,7 @@
#include "i18n.h"
#include "osd.h"
#include "themes.h"
+#include "videodir.h"
#define ScrollWidth (Setup.FontOsdSize / 4)
#define TextFrame (Setup.FontOsdSize / 10)
@@ -170,7 +171,10 @@ private:
int y0, y1, y2, y3, y4, y5;
int lineHeight;
int dateWidth;
+ cString title;
cString lastDate;
+ int lastDiskUsageState;
+ void DrawTitle(void);
void DrawScrollbar(int Total, int Offset, int Shown, int Top, int Height, bool CanScrollUp, bool CanScrollDown);
void SetTextScrollbar(void);
public:
@@ -196,6 +200,7 @@ cSkinClassicDisplayMenu::cSkinClassicDisplayMenu(void)
{
const cFont *font = cFont::GetFont(fontOsd);
lineHeight = font->Height();
+ lastDiskUsageState = -1;
dateWidth = 0;
x0 = 0;
x1 = x0 + 2 * TextSpacing;
@@ -270,10 +275,17 @@ void cSkinClassicDisplayMenu::Clear(void)
osd->DrawRectangle(x0, y1, x3 - 1, y4 - 1, Theme.Color(clrBackground));
}
-void cSkinClassicDisplayMenu::SetTitle(const char *Title)
+void cSkinClassicDisplayMenu::DrawTitle(void)
{
const cFont *font = cFont::GetFont(fontOsd);
- osd->DrawText(x0, y0, Title, Theme.Color(clrMenuTitleFg), Theme.Color(clrMenuTitleBg), font, x3 - x0 - dateWidth);
+ bool WithDisk = MenuCategory() == mcMain || MenuCategory() == mcRecording;
+ osd->DrawText(x0, y0, WithDisk ? cString::sprintf("%s - %s", *title, *cVideoDiskUsage::String()) : title, Theme.Color(clrMenuTitleFg), Theme.Color(clrMenuTitleBg), font, x3 - x0 - dateWidth);
+}
+
+void cSkinClassicDisplayMenu::SetTitle(const char *Title)
+{
+ title = Title;
+ DrawTitle();
}
void cSkinClassicDisplayMenu::SetButtons(const char *Red, const char *Green, const char *Yellow, const char *Blue)
@@ -422,6 +434,8 @@ const cFont *cSkinClassicDisplayMenu::GetTextAreaFont(bool FixedFont) const
void cSkinClassicDisplayMenu::Flush(void)
{
+ if (cVideoDiskUsage::HasChanged(lastDiskUsageState))
+ DrawTitle();
cString date = DayDateTime();
if (!*lastDate || strcmp(date, lastDate)) {
const cFont *font = cFont::GetFont(fontOsd);
diff --git a/skinsttng.c b/skinsttng.c
index ff579a7c..d9855388 100644
--- a/skinsttng.c
+++ b/skinsttng.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: skinsttng.c 2.14 2012/03/11 13:32:00 kls Exp $
+ * $Id: skinsttng.c 2.15 2012/04/23 08:39:11 kls Exp $
*/
// "Star Trek: The Next Generation"(R) is a registered trademark of Paramount Pictures
@@ -16,6 +16,7 @@
#include "osd.h"
#include "menu.h"
#include "themes.h"
+#include "videodir.h"
#include "symbols/arrowdown.xpm"
#include "symbols/arrowup.xpm"
@@ -401,8 +402,11 @@ private:
int lineHeight;
tColor frameColor;
int currentIndex;
+ cString title;
bool message;
cString lastDate;
+ int lastDiskUsageState;
+ void DrawTitle(void);
void DrawScrollbar(int Total, int Offset, int Shown, int Top, int Height, bool CanScrollUp, bool CanScrollDown);
void SetTextScrollbar(void);
public:
@@ -429,6 +433,7 @@ cSkinSTTNGDisplayMenu::cSkinSTTNGDisplayMenu(void)
const cFont *font = cFont::GetFont(fontOsd);
lineHeight = font->Height();
frameColor = Theme.Color(clrMenuFrame);
+ lastDiskUsageState = -1;
currentIndex = -1;
message = false;
x0 = 0;
@@ -548,15 +553,22 @@ void cSkinSTTNGDisplayMenu::Clear(void)
osd->DrawRectangle(x1, y3, x7 - 1, y4 - 1, Theme.Color(clrBackground));
}
-void cSkinSTTNGDisplayMenu::SetTitle(const char *Title)
+void cSkinSTTNGDisplayMenu::DrawTitle(void)
{
const cFont *font = cFont::GetFont(fontOsd);
const char *VDR = " VDR";
+ bool WithDisk = MenuCategory() == mcMain || MenuCategory() == mcRecording;
int w = font->Width(VDR);
- osd->DrawText(x3 + TextSpacing, y0, Title, Theme.Color(clrMenuTitle), frameColor, font, x4 - w - x3 - TextSpacing);
+ osd->DrawText(x3 + TextSpacing, y0, WithDisk ? cString::sprintf("%s - %s", *title, *cVideoDiskUsage::String()) : title, Theme.Color(clrMenuTitle), frameColor, font, x4 - w - x3 - TextSpacing);
osd->DrawText(x4 - w, y0, VDR, frameColor, clrBlack, font, w, lineHeight);
}
+void cSkinSTTNGDisplayMenu::SetTitle(const char *Title)
+{
+ title = Title;
+ DrawTitle();
+}
+
void cSkinSTTNGDisplayMenu::SetButtons(const char *Red, const char *Green, const char *Yellow, const char *Blue)
{
cString date = DayDateTime();
@@ -749,6 +761,8 @@ const cFont *cSkinSTTNGDisplayMenu::GetTextAreaFont(bool FixedFont) const
void cSkinSTTNGDisplayMenu::Flush(void)
{
+ if (cVideoDiskUsage::HasChanged(lastDiskUsageState))
+ DrawTitle();
if (!message) {
cString date = DayDateTime();
if (!*lastDate || strcmp(date, lastDate)) {
diff --git a/videodir.c b/videodir.c
index e61e3cbc..870b4cba 100644
--- a/videodir.c
+++ b/videodir.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: videodir.c 1.15 2008/02/16 13:00:03 kls Exp $
+ * $Id: videodir.c 2.1 2012/04/22 15:03:10 kls Exp $
*/
#include "videodir.h"
@@ -241,3 +241,43 @@ bool IsOnVideoDirectoryFileSystem(const char *FileName)
} while (Dir.Next());
return false;
}
+
+// --- cVideoDiskUsage -------------------------------------------------------
+
+#define DISKSPACECHEK 5 // seconds between disk space checks
+#define MB_PER_MINUTE 25.75 // this is just an estimate!
+
+int cVideoDiskUsage::state = 0;
+time_t cVideoDiskUsage::lastChecked = 0;
+int cVideoDiskUsage::usedPercent = 0;
+int cVideoDiskUsage::freeMB = 0;
+int cVideoDiskUsage::freeMinutes = 0;
+
+bool cVideoDiskUsage::HasChanged(int &State)
+{
+ if (time(NULL) - lastChecked > DISKSPACECHEK) {
+ int FreeMB;
+ int UsedPercent = VideoDiskSpace(&FreeMB);
+ if (FreeMB != freeMB) {
+ usedPercent = UsedPercent;
+ freeMB = FreeMB;
+ int MBperMinute = Recordings.MBperMinute();
+ if (MBperMinute <= 0)
+ MBperMinute = MB_PER_MINUTE;
+ freeMinutes = int(double(FreeMB) / MBperMinute);
+ state++;
+ }
+ lastChecked = time(NULL);
+ }
+ if (State != state) {
+ State = state;
+ return true;
+ }
+ return false;
+}
+
+cString cVideoDiskUsage::String(void)
+{
+ HasChanged(state);
+ return cString::sprintf("%s %d%% - %2d:%02d %s", tr("Disk"), usedPercent, freeMinutes / 60, freeMinutes % 60, tr("free"));
+}
diff --git a/videodir.h b/videodir.h
index 253e07b0..0a0587a6 100644
--- a/videodir.h
+++ b/videodir.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: videodir.h 1.7 2008/02/16 12:53:11 kls Exp $
+ * $Id: videodir.h 2.1 2012/04/22 15:07:56 kls Exp $
*/
#ifndef __VIDEODIR_H
@@ -25,4 +25,42 @@ cString PrefixVideoFileName(const char *FileName, char Prefix);
void RemoveEmptyVideoDirectories(void);
bool IsOnVideoDirectoryFileSystem(const char *FileName);
+class cVideoDiskUsage {
+private:
+ static int state;
+ static time_t lastChecked;
+ static int usedPercent;
+ static int freeMB;
+ static int freeMinutes;
+public:
+ static bool HasChanged(int &State);
+ ///< Returns true if the usage of the video disk space has changed since the last
+ ///< call to this function with the given State variable. The caller should
+ ///< initialize State to -1, and it will be set to the current internal state
+ ///< value of the video disk usage checker upon return. Future calls with the same
+ ///< State variable can then quickly check for changes.
+ static void ForceCheck(void) { lastChecked = 0; }
+ ///< To avoid unnecessary load, the video disk usage is only actually checked
+ ///< every DISKSPACECHEK seconds. Calling ForceCheck() makes sure that the next call
+ ///< to HasChanged() will check the disk usage immediately. This is useful in case
+ ///< some files have been deleted and the result shall be displayed instantly.
+ static cString String(void);
+ ///< Returns a localized string of the form "Disk nn% - hh:mm free".
+ ///< This function is mainly for use in skins that want to retain the display of the
+ ///< free disk space in the menu title, as was the case until VDR version 1.7.27.
+ ///< An implicit call to HasChanged() is done in this function, to make sure the
+ ///< returned value is up to date.
+ static int UsedPercent(void) { return usedPercent; }
+ ///< Returns the used space of the video disk in percent.
+ ///< The caller should call HasChanged() first, to make sure the value is up to date.
+ static int FreeMB(void) { return freeMB; }
+ ///< Returns the amount of free space on the video disk in MB.
+ ///< The caller should call HasChanged() first, to make sure the value is up to date.
+ static int FreeMinutes(void) { return freeMinutes; }
+ ///< Returns the number of minutes that can still be recorded on the video disk.
+ ///< This is an estimate and depends on the data rate of the existing recordings.
+ ///< There is no guarantee that this value will actually be met.
+ ///< The caller should call HasChanged() first, to make sure the value is up to date.
+ };
+
#endif //__VIDEODIR_H