vdr/osd.h
Klaus Schmidinger fe9499ba90 Version 1.1.17
- Added new entries to 'ca.conf'.
- Fixed closing unused PID handles (thanks to Stefan Schluenss for reporting this
  one).
- Added more examples to 'diseqc.conf' (thanks to Oliver Endriss).
- Fixed disabling multiple recordings on a single DVB card (comment out the definition
  of the macros DO_REC_AND_PLAY_ON_PRIMARY_DEVICE and DO_MULTIPLE_RECORDINGS in
  dvbdevice.c).
- Plugins can now have their very own OSD setup in the object they return from
  a call to cPlugin::MainMenuAction(). In order to implement this, the return type
  of cPlugin::MainMenuAction() had to be changed from (cOsdMenu *) to (cOsdObject *).
  So in case you are compiling an existing plugin with this version of VDR and you
  get an error message, simply change cOsdMenu to cOsdObject in the plugin's source
  for the MainMenuAction() function.
  Plugin authors who have so far (ab)used the cControl mechanism to implement their
  own raw OSD should take a look at the new demo plugin 'osddemo'. It implements
  a very primitive game that shows how a plugin can have its own raw OSD. Especially
  look into cLineGame and see how it implements the Show() function. See also
  the chapter on "User interaction" in PLUGINS.html.
- Added three new fields to the lines in 'channels.conf': NID, TID and RID. NID and
  TID are the Network and Transport Stream IDs, respectively. RID is an additional ID
  that can be used to tell apart channels that would otherwise be indistinguishable.
  This is typically the case with radio channels, which may have the same NID, TID
  and SID, but different "radio IDs". This new field is therefore called RID ("radio
  ID"). Currently NID and TID are not yet used by VDR and should always be 0. The
  RID is actually used when building the "unique channel ID", so if you have channels
  in your 'channels.conf' file that cause error messages when loading, you can set
  the RIDs of these channels to different values.
  When reading an old 'channels.conf' these new fields will be automatically
  initialized to 0 and once the file is written back to disk they will be appended
  to the channel definitions.
  Thanks to Régis Bossut for pointing out that with some providers the channels can
  only be distinguished through the RID.
- The "unique channel ID" now contains an optional 5th part (the RID). See man vdr(5).
- Updated 'channels.conf.cable' and made some channels unique using the new RID
  (thanks to Andreas Kool for pointing out the problems).
- Made some channels unique in 'channels.conf.terr' using the new RID.
- Extended the '-l' option to allow logging to LOG_LOCALn (n=0..7) by writing, for
  instance, '-l 3.7' (suggested by Jürgen Schmidt).
- Now deleting stale lock files if they have a time stamp that is outside the window
  'now +/- LOCKFILESTALETIME'. This improves things in cases where the system time
  makes far jumps, so that a lock file might end up with a time stamp that lies
  in the distant future (thanks to Oliver Endriss).
2002-11-24 18:00:00 +01:00

172 lines
5.1 KiB
C++

/*
* osd.h: Abstract On Screen Display layer
*
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: osd.h 1.37 2002/11/24 10:32:29 kls Exp $
*/
#ifndef __OSD_H
#define __OSD_H
#if defined(DEBUG_OSD) || defined(REMOTE_KBD)
#include <ncurses.h>
#endif
#include "config.h"
#include "osdbase.h"
#include "interface.h"
#include "osdbase.h"
#include "tools.h"
#define MAXOSDITEMS (Setup.OSDheight - 4)
enum eOSState { osUnknown,
osContinue,
osSchedule,
osChannels,
osTimers,
osRecordings,
osPlugin,
osSetup,
osCommands,
osRecord,
osReplay,
osStopRecord,
osStopReplay,
osCancelEdit,
osSwitchDvb,
osBack,
osEnd,
os_User, // the following values can be used locally
osUser1,
osUser2,
osUser3,
osUser4,
osUser5,
osUser6,
osUser7,
osUser8,
osUser9,
osUser10,
};
class cOsd {
private:
enum { charWidth = 12, // average character width
lineHeight = 27 // smallest text height
};
#ifdef DEBUG_OSD
static WINDOW *window;
enum { MaxColorPairs = 16 };
static int colorPairs[MaxColorPairs];
static void SetColor(eDvbColor colorFg, eDvbColor colorBg = clrBackground);
#else
static cOsdBase *osd;
#endif
static int cols, rows;
public:
static void Initialize(void);
static void Shutdown(void);
static cOsdBase *OpenRaw(int x, int y);
// Returns a raw OSD without any predefined windows or colors.
// If the "normal" OSD is currently in use, NULL will be returned.
// The caller must delete this object before the "normal" OSD is used again!
static void Open(int w, int h);
static void Close(void);
static void Clear(void);
static void Fill(int x, int y, int w, int h, eDvbColor color = clrBackground);
static void SetBitmap(int x, int y, const cBitmap &Bitmap);
static void ClrEol(int x, int y, eDvbColor color = clrBackground);
static int CellWidth(void);
static int LineHeight(void);
static int Width(unsigned char c);
static int WidthInCells(const char *s);
static eDvbFont SetFont(eDvbFont Font);
static void Text(int x, int y, const char *s, eDvbColor colorFg = clrWhite, eDvbColor colorBg = clrBackground);
static void Flush(void);
};
class cOsdItem : public cListObject {
private:
char *text;
int offset;
eOSState state;
protected:
bool fresh;
bool userColor;
eDvbColor fgColor, bgColor;
public:
cOsdItem(eOSState State = osUnknown);
cOsdItem(const char *Text, eOSState State = osUnknown);
virtual ~cOsdItem();
bool HasUserColor(void) { return userColor; }
void SetText(const char *Text, bool Copy = true);
void SetColor(eDvbColor FgColor, eDvbColor BgColor = clrBackground);
const char *Text(void) { return text; }
virtual void Display(int Offset = -1, eDvbColor FgColor = clrWhite, eDvbColor BgColor = clrBackground);
virtual void Set(void) {}
virtual eOSState ProcessKey(eKeys Key);
};
class cOsdObject {
friend class cOsdMenu;
private:
bool isMenu;
protected:
bool needsFastResponse;
public:
cOsdObject(bool FastResponse = false) { isMenu = false; needsFastResponse = FastResponse; }
virtual ~cOsdObject() {}
int Width(void) { return Interface->Width(); }
int Height(void) { return Interface->Height(); }
bool NeedsFastResponse(void) { return needsFastResponse; }
bool IsMenu(void) { return isMenu; }
virtual void Show(void) {}
virtual eOSState ProcessKey(eKeys Key) { return osUnknown; }
};
class cOsdMenu : public cOsdObject, public cList<cOsdItem> {
private:
char *title;
int cols[cInterface::MaxCols];
int first, current, marked;
cOsdMenu *subMenu;
const char *helpRed, *helpGreen, *helpYellow, *helpBlue;
char *status;
int digit;
bool hasHotkeys;
protected:
bool visible;
const char *hk(const char *s);
void SetHasHotkeys(void);
virtual void Clear(void);
bool SpecialItem(int idx);
void SetCurrent(cOsdItem *Item);
void RefreshCurrent(void);
void DisplayCurrent(bool Current);
void CursorUp(void);
void CursorDown(void);
void PageUp(void);
void PageDown(void);
void Mark(void);
eOSState HotKey(eKeys Key);
eOSState AddSubMenu(cOsdMenu *SubMenu);
eOSState CloseSubMenu();
bool HasSubMenu(void) { return subMenu; }
void SetStatus(const char *s);
void SetTitle(const char *Title, bool ShowDate = true);
void SetHelp(const char *Red, const char *Green = NULL, const char *Yellow = NULL, const char *Blue = NULL);
virtual void Del(int Index);
public:
cOsdMenu(const char *Title, int c0 = 0, int c1 = 0, int c2 = 0, int c3 = 0, int c4 = 0);
virtual ~cOsdMenu();
int Current(void) { return current; }
void Add(cOsdItem *Item, bool Current = false, cOsdItem *After = NULL);
void Ins(cOsdItem *Item, bool Current = false, cOsdItem *Before = NULL);
void Display(void);
virtual eOSState ProcessKey(eKeys Key);
};
#endif //__OSD_H