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 #include #include #include +#include -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