vdr  2.7.6
skins.h
Go to the documentation of this file.
1 /*
2  * skins.h: The optical appearance of the OSD
3  *
4  * See the main source file 'vdr.c' for copyright information and
5  * how to reach the author.
6  *
7  * $Id: skins.h 5.8 2025/03/03 11:05:23 kls Exp $
8  */
9 
10 #ifndef __SKINS_H
11 #define __SKINS_H
12 
13 #include "channels.h"
14 #include "epg.h"
15 #include "keys.h"
16 #include "osd.h"
17 #include "positioner.h"
18 #include "recording.h"
19 #include "themes.h"
20 #include "thread.h"
21 #include "timers.h"
22 #include "tools.h"
23 
24 // Several member functions of the following classes are called with a pointer to
25 // an object from a global list (cTimer, cChannel, cRecording or cEvent). In these
26 // cases the core VDR code holds a lock on the respective list. While in general a
27 // plugin should only work with the objects and data that is explicitly given to it
28 // in the function call, the called function may itself set a read lock (not a write
29 // lock!) on this list, because read locks can be nested. It may also set read locks
30 // (not write locks!) on higher order lists.
31 // For instance, a function that is called with a cChannel may lock cRecordings and/or
32 // cSchedules (which contains cEvent objects), but not cTimers. If a plugin needs to
33 // set locks of its own (on mutexes defined inside the plugin code), it shall do so
34 // after setting any locks on VDR's global lists, and it shall always set these
35 // locks in the same sequence, to avoid deadlocks.
36 
37 enum eMessageType { mtStatus = 0, mtInfo, mtWarning, mtError }; // will be used to calculate color offsets!
38 
39 class cSkinDisplay {
40 private:
42  int editableWidth; //XXX this is not nice, but how else could we know this value?
43 public:
44  cSkinDisplay(void);
45  virtual ~cSkinDisplay();
46  static int AvgCharWidth(void) { return Setup.FontOsdSize * 4 / 6; }
48  int EditableWidth(void) { return editableWidth; }
49  void SetEditableWidth(int Width) { editableWidth = Width; }
53  virtual void SetButtons(const char *Red, const char *Green = NULL, const char *Yellow = NULL, const char *Blue = NULL) {}
56  virtual void SetMessage(eMessageType Type, const char *Text) {}
59  virtual void Flush(void) {}
61  static cSkinDisplay *Current(void) { return current; }
63  };
64 
69 private:
71 public:
72  cSkinDisplayChannel(void);
73  virtual void SetChannel(const cChannel *Channel, int Number) = 0;
77  virtual void SetEvents(const cEvent *Present, const cEvent *Following) = 0;
80  virtual void SetMessage(eMessageType Type, const char *Text) override = 0;
85  virtual void SetPositioner(const cPositioner *Positioner);
96  /*TODO
97  SetButtons
98  Red = Video options
99  Green = Info now
100  Yellow = Info next
101  */
102  };
103 
134  mcCam
135  };
136 
143  };
144 
148  };
149 
167 public:
168  enum { MaxTabs = 6 };
169 private:
171  int tabs[MaxTabs];
172 protected:
174  int Tab(int n) { return (n >= 0 && n < MaxTabs) ? tabs[n] : 0; }
177  const char *GetTabbedText(const char *s, int Tab);
181 public:
182  cSkinDisplayMenu(void);
183  eMenuCategory MenuCategory(void) const { return menuCategory; }
193  virtual void SetTabs(int Tab1, int Tab2 = 0, int Tab3 = 0, int Tab4 = 0, int Tab5 = 0);
196  virtual void SetMenuSortMode(eMenuSortMode MenuSortMode) {}
200  virtual eMenuOrientation MenuOrientation(void) { return moVertical; }
204  virtual void Scroll(bool Up, bool Page);
210  virtual int MaxItems(void) = 0;
212  virtual void Clear(void) = 0;
214  virtual void SetTitle(const char *Title) = 0;
216  virtual void SetButtons(const char *Red, const char *Green = NULL, const char *Yellow = NULL, const char *Blue = NULL) = 0;
219  virtual void SetMessage(eMessageType Type, const char *Text) override = 0;
224  virtual void SetItem(const char *Text, int Index, bool Current, bool Selectable) = 0;
236  virtual bool SetItemEvent(const cEvent *Event, int Index, bool Current, bool Selectable, const cChannel *Channel, bool WithDate, eTimerMatch TimerMatch, bool TimerActive) { return false; }
247  virtual bool SetItemEvent(const cEvent *Event, int Index, bool Current, bool Selectable, const cChannel *Channel, bool WithDate, eTimerMatch TimerMatch, const cTimer *Timer) {
248  return SetItemEvent(Event, Index, Current, Selectable, Channel, WithDate, TimerMatch, Timer && Timer->HasFlags(tfActive)); }
251  virtual bool SetItemTimer(const cTimer *Timer, int Index, bool Current, bool Selectable) { return false; }
258  virtual bool SetItemChannel(const cChannel *Channel, int Index, bool Current, bool Selectable, bool WithProvider) { return false; }
267  virtual bool SetItemRecording(const cRecording *Recording, int Index, bool Current, bool Selectable, int Level, int Total, int New) { return false; }
278  virtual void SetScrollbar(int Total, int Offset);
283  virtual void SetEvent(const cEvent *Event) = 0;
288  virtual void SetRecording(const cRecording *Recording) = 0;
293  virtual void SetText(const char *Text, bool FixedFont) = 0;
298  //XXX ??? virtual void SetHelp(const char *Help) = 0;
299  virtual int GetTextAreaWidth(void) const;
305  virtual const cFont *GetTextAreaFont(bool FixedFont) const;
311  };
312 
316 protected:
317  const cMarks *marks;
318  const cErrors *errors;
319  class cProgressBar : public cBitmap {
320  protected:
321  int total;
322  int Pos(int p) { return int(int64_t(p) * Width() / total); }
323  void Mark(int x, bool Start, bool Current, tColor ColorMark, tColor ColorCurrent);
324  void Error(int x, tColor ColorError);
325  public:
326  cProgressBar(int Width, int Height, int Current, int Total, const cMarks *Marks, tColor ColorSeen, tColor ColorRest, tColor ColorSelected, tColor ColorMark, tColor ColorCurrent); // for backwards compatibility
327  cProgressBar(int Width, int Height, int Current, int Total, const cMarks *Marks, const cErrors *Errors, tColor ColorSeen, tColor ColorRest, tColor ColorSelected, tColor ColorMark, tColor ColorCurrent, tColor ColorError);
328  };
329 public:
330  cSkinDisplayReplay(void);
331  virtual void SetMarks(const cMarks *Marks);
334  virtual void SetErrors(const cErrors *Errors);
337  virtual void SetRecording(const cRecording *Recording);
342  virtual void SetTitle(const char *Title) = 0;
344  virtual void SetMode(bool Play, bool Forward, int Speed) = 0;
348  virtual void SetProgress(int Current, int Total) = 0;
352  virtual void SetCurrent(const char *Current) = 0;
358  virtual void SetTotal(const char *Total) = 0;
361  virtual void SetJump(const char *Jump) = 0;
367  virtual void SetMessage(eMessageType Type, const char *Text) override = 0;
372  };
373 
376 public:
377  virtual void SetVolume(int Current, int Total, bool Mute) = 0;
381  };
382 
385 public:
386  virtual void SetTrack(int Index, const char * const *Tracks) = 0;
389  virtual void SetAudioChannel(int AudioChannel) = 0;
392  };
393 
396 public:
397  virtual void SetMessage(eMessageType Type, const char *Text) override = 0;
400  };
401 
402 class cSkin : public cListObject {
403 private:
404  char *name;
406 public:
407  cSkin(const char *Name, cTheme *Theme = NULL);
420  virtual ~cSkin() override;
421  const char *Name(void) { return name; }
422  cTheme *Theme(void) { return theme; }
423  virtual const char *Description(void) = 0;
429  virtual cSkinDisplayChannel *DisplayChannel(bool WithInfo) = 0;
435  virtual cSkinDisplayMenu *DisplayMenu(void) = 0;
438  virtual cSkinDisplayReplay *DisplayReplay(bool ModeOnly) = 0;
443  virtual cSkinDisplayVolume *DisplayVolume(void) = 0;
446  virtual cSkinDisplayTracks *DisplayTracks(const char *Title, int NumTracks, const char * const *Tracks) = 0;
455  };
456 
457 class cSkins : public cList<cSkin> {
458 private:
462 public:
463  cSkins(void);
464  ~cSkins();
465  bool SetCurrent(const char *Name = NULL);
468  cSkin *Current(void) { return current; }
470  bool IsOpen(void) { return cSkinDisplay::Current(); }
472  eKeys Message(eMessageType Type, const char *s, int Seconds = 0);
482  int QueueMessage(eMessageType Type, const char *s, int Seconds = 0, int Timeout = 0);
507  void ProcessQueuedMessages(void);
509  void Flush(void);
511  virtual void Clear(void) override;
513  };
514 
515 extern cSkins Skins;
516 
517 #endif //__SKINS_H
Definition: osd.h:169
int Height(void) const
Definition: osd.h:189
int Width(void) const
Definition: osd.h:188
Definition: epg.h:73
Definition: font.h:37
Definition: tools.h:631
Definition: thread.h:67
A steerable satellite dish generally points to the south on the northern hemisphere,...
Definition: positioner.h:31
int FontOsdSize
Definition: config.h:351
virtual void SetEvents(const cEvent *Present, const cEvent *Following)=0
Sets the Present and Following EPG events.
virtual void SetPositioner(const cPositioner *Positioner)
Sets the Positioner used to move the satellite dish.
Definition: skins.c:73
cSkinDisplayChannel(void)
Definition: skins.c:68
virtual void SetMessage(eMessageType Type, const char *Text) override=0
Sets a one line message Text, with the given Type.
const cPositioner * positioner
< This class is used to display the current channel, together with the present and following EPG even...
Definition: skins.h:70
virtual void SetChannel(const cChannel *Channel, int Number)=0
Sets the current channel to Channel.
virtual void SetMenuSortMode(eMenuSortMode MenuSortMode)
Sets the mode by which the items in this menu are sorted.
Definition: skins.h:196
virtual void SetRecording(const cRecording *Recording)=0
Sets the Recording that shall be displayed, using the entire central area of the menu.
eMenuCategory menuCategory
Definition: skins.h:170
virtual bool SetItemRecording(const cRecording *Recording, int Index, bool Current, bool Selectable, int Level, int Total, int New)
Sets the item at the given Index to Recording.
Definition: skins.h:267
virtual void Scroll(bool Up, bool Page)
If this menu contains a text area that can be scrolled, this function will be called to actually scro...
Definition: skins.c:107
virtual void SetMessage(eMessageType Type, const char *Text) override=0
Sets a one line message Text, with the given Type.
virtual int MaxItems(void)=0
Returns the maximum number of items the menu can display.
virtual void SetTabs(int Tab1, int Tab2=0, int Tab3=0, int Tab4=0, int Tab5=0)
Sets the tab columns to the given values, which are the number of characters in each column.
Definition: skins.c:95
virtual int GetTextAreaWidth(void) const
Returns the width in pixel of the area which is used to display text with SetText().
Definition: skins.c:137
virtual void SetButtons(const char *Red, const char *Green=NULL, const char *Yellow=NULL, const char *Blue=NULL)=0
Sets the color buttons to the given strings.
virtual eMenuOrientation MenuOrientation(void)
Asks the skin for the orientation of the displayed menu.
Definition: skins.h:200
cTextScroller textScroller
Definition: skins.h:173
int Tab(int n)
Returns the offset of the given tab from the left border of the item display area.
Definition: skins.h:174
virtual void SetItem(const char *Text, int Index, bool Current, bool Selectable)=0
Sets the item at the given Index to Text.
eMenuCategory MenuCategory(void) const
Returns the menu category, set by a previous call to SetMenuCategory().
Definition: skins.h:183
virtual bool SetItemEvent(const cEvent *Event, int Index, bool Current, bool Selectable, const cChannel *Channel, bool WithDate, eTimerMatch TimerMatch, const cTimer *Timer)
Like SetItemEvent(..., bool TimerActive), but with full access to the Timer.
Definition: skins.h:247
virtual void SetEvent(const cEvent *Event)=0
Sets the Event that shall be displayed, using the entire central area of the menu.
virtual void SetScrollbar(int Total, int Offset)
Sets the Total number of items in the currently displayed list, and the Offset of the first item that...
Definition: skins.c:133
virtual const cFont * GetTextAreaFont(bool FixedFont) const
Returns a pointer to the font which is used to display text with SetText().
Definition: skins.c:142
virtual void SetTitle(const char *Title)=0
Sets the title of this menu to Title.
cSkinDisplayMenu(void)
Definition: skins.c:84
virtual bool SetItemEvent(const cEvent *Event, int Index, bool Current, bool Selectable, const cChannel *Channel, bool WithDate, eTimerMatch TimerMatch, bool TimerActive)
Sets the item at the given Index to Event.
Definition: skins.h:236
virtual bool SetItemChannel(const cChannel *Channel, int Index, bool Current, bool Selectable, bool WithProvider)
Sets the item at the given Index to Channel.
Definition: skins.h:258
const char * GetTabbedText(const char *s, int Tab)
Returns the part of the given string that follows the given Tab (where 0 indicates the beginning of t...
Definition: skins.c:112
virtual void Clear(void)=0
Clears the entire central area of the menu.
virtual void SetMenuCategory(eMenuCategory MenuCategory)
Sets the current menu category.
Definition: skins.c:90
virtual bool SetItemTimer(const cTimer *Timer, int Index, bool Current, bool Selectable)
Sets the item at the given Index to Timer.
Definition: skins.h:251
int tabs[MaxTabs]
Definition: skins.h:171
virtual void SetText(const char *Text, bool FixedFont)=0
Sets the Text that shall be displayed, using the entire central area of the menu.
virtual void SetMessage(eMessageType Type, const char *Text) override=0
< This class implements a simple message display.
void Mark(int x, bool Start, bool Current, tColor ColorMark, tColor ColorCurrent)
Definition: skins.c:189
cProgressBar(int Width, int Height, int Current, int Total, const cMarks *Marks, tColor ColorSeen, tColor ColorRest, tColor ColorSelected, tColor ColorMark, tColor ColorCurrent)
Definition: skins.c:149
void Error(int x, tColor ColorError)
Definition: skins.c:199
virtual void SetErrors(const cErrors *Errors)
Sets the errors found in the recording to Errors, which shall be used to display the progress bar thr...
Definition: skins.c:230
virtual void SetJump(const char *Jump)=0
Sets the prompt that allows the user to enter a jump point.
virtual void SetMarks(const cMarks *Marks)
Sets the editing marks to Marks, which shall be used to display the progress bar through a cProgressB...
Definition: skins.c:225
virtual void SetTitle(const char *Title)=0
Sets the title of the recording.
virtual void SetRecording(const cRecording *Recording)
Sets the recording that is currently being played.
Definition: skins.c:220
virtual void SetCurrent(const char *Current)=0
Sets the current position within the recording, as a user readable string in the form "h:mm:ss....
virtual void SetMessage(eMessageType Type, const char *Text) override=0
Sets a one line message Text, with the given Type.
const cErrors * errors
Definition: skins.h:318
virtual void SetProgress(int Current, int Total)=0
This function will be called whenever the position in or the total length of the recording has change...
virtual void SetMode(bool Play, bool Forward, int Speed)=0
Sets the current replay mode, which can be used to display some indicator, showing the user whether w...
virtual void SetTotal(const char *Total)=0
Sets the total length of the recording, as a user readable string in the form "h:mm:ss".
cSkinDisplayReplay(void)
Definition: skins.c:214
const cMarks * marks
< This class implements the progress display used during replay of a recording.
Definition: skins.h:317
virtual void SetAudioChannel(int AudioChannel)=0
Sets the audio channel indicator.
virtual void SetTrack(int Index, const char *const *Tracks)=0
< This class implements the track display.
virtual void SetVolume(int Current, int Total, bool Mute)=0
< This class implements the volume/mute display.
int EditableWidth(void)
Definition: skins.h:48
static cSkinDisplay * current
Definition: skins.h:41
virtual void Flush(void)
Actually draws the OSD display to the output device.
Definition: skins.h:59
static cSkinDisplay * Current(void)
Returns the currently active cSkinDisplay.
Definition: skins.h:61
void SetEditableWidth(int Width)
If an item is set through a call to cSkinDisplayMenu::SetItem(), this function shall be called to set...
Definition: skins.h:49
cSkinDisplay(void)
Definition: skins.c:55
int editableWidth
Definition: skins.h:42
virtual ~cSkinDisplay()
Definition: skins.c:61
virtual void SetMessage(eMessageType Type, const char *Text)
Sets a one line message Text, with the given Type.
Definition: skins.h:56
virtual void SetButtons(const char *Red, const char *Green=NULL, const char *Yellow=NULL, const char *Blue=NULL)
Sets the color buttons to the given strings, provided this cSkinDisplay actually has a color button d...
Definition: skins.h:53
static int AvgCharWidth(void)
Returns the average width of a character in pixel (just a raw estimate).
Definition: skins.h:46
Definition: skins.h:402
cTheme * Theme(void)
Definition: skins.h:422
virtual cSkinDisplayVolume * DisplayVolume(void)=0
Creates and returns a new object for displaying the current volume.
cTheme * theme
Definition: skins.h:405
virtual cSkinDisplayReplay * DisplayReplay(bool ModeOnly)=0
Creates and returns a new object for displaying replay progress.
virtual cSkinDisplayMessage * DisplayMessage(void)=0
Creates and returns a new object for displaying a message.
virtual cSkinDisplayMenu * DisplayMenu(void)=0
Creates and returns a new object for displaying a menu.
const char * Name(void)
Definition: skins.h:421
virtual ~cSkin() override
Definition: skins.c:246
char * name
Definition: skins.h:404
cSkin(const char *Name, cTheme *Theme=NULL)
Creates a new skin class, with the given Name and Theme.
Definition: skins.c:237
virtual cSkinDisplayChannel * DisplayChannel(bool WithInfo)=0
Creates and returns a new object for displaying the current channel.
virtual cSkinDisplayTracks * DisplayTracks(const char *Title, int NumTracks, const char *const *Tracks)=0
Creates and returns a new object for displaying the available tracks.
virtual const char * Description(void)=0
Returns a user visible, single line description of this skin, which may consist of arbitrary text and...
Definition: skins.h:457
bool IsOpen(void)
Returns true if there is currently a skin display object active.
Definition: skins.h:470
bool SetCurrent(const char *Name=NULL)
Sets the current skin to the one indicated by name.
Definition: skins.c:265
eKeys Message(eMessageType Type, const char *s, int Seconds=0)
Displays the given message, either through a currently visible display object that is capable of doin...
Definition: skins.c:284
void Flush(void)
Flushes the currently active cSkinDisplay, if any.
Definition: skins.c:436
~cSkins()
Definition: skins.c:260
cSkin * Current(void)
Returns a pointer to the current skin.
Definition: skins.h:468
cSkin * current
Definition: skins.h:459
cMutex queueMessageMutex
Definition: skins.h:461
cSkinDisplayMessage * displayMessage
Definition: skins.h:460
void ProcessQueuedMessages(void)
Processes the first queued message, if any.
Definition: skins.c:386
cSkins(void)
Definition: skins.c:255
virtual void Clear(void) override
Free up all registered skins.
Definition: skins.c:442
int QueueMessage(eMessageType Type, const char *s, int Seconds=0, int Timeout=0)
Like Message(), but this function may be called from a background thread.
Definition: skins.c:330
Definition: themes.h:17
Definition: timers.h:31
bool HasFlags(uint Flags) const
Definition: timers.c:1075
cSetup Setup
Definition: config.c:372
uint32_t tColor
Definition: font.h:29
eKeys
Definition: keys.h:16
eMenuOrientation
Definition: skins.h:145
@ moHorizontal
Definition: skins.h:147
@ moVertical
Definition: skins.h:146
cSkins Skins
Definition: skins.c:253
eMenuCategory
Definition: skins.h:104
@ mcSetupMisc
Definition: skins.h:128
@ mcSetupOsd
Definition: skins.h:121
@ mcSetupLnb
Definition: skins.h:124
@ mcMain
Definition: skins.h:107
@ mcSetup
Definition: skins.h:120
@ mcChannel
Definition: skins.h:111
@ mcRecordingInfo
Definition: skins.h:116
@ mcSetupDvb
Definition: skins.h:123
@ mcPlugin
Definition: skins.h:118
@ mcSetupRecord
Definition: skins.h:126
@ mcCam
Definition: skins.h:134
@ mcSetupReplay
Definition: skins.h:127
@ mcPluginSetup
Definition: skins.h:119
@ mcChannelEdit
Definition: skins.h:112
@ mcCommand
Definition: skins.h:130
@ mcEvent
Definition: skins.h:131
@ mcUnknown
Definition: skins.h:106
@ mcSetupCam
Definition: skins.h:125
@ mcUndefined
Definition: skins.h:105
@ mcSchedule
Definition: skins.h:108
@ mcText
Definition: skins.h:132
@ mcRecording
Definition: skins.h:115
@ mcRecordingEdit
Definition: skins.h:117
@ mcTimerEdit
Definition: skins.h:114
@ mcScheduleNow
Definition: skins.h:109
@ mcSetupPlugins
Definition: skins.h:129
@ mcFolder
Definition: skins.h:133
@ mcSetupEpg
Definition: skins.h:122
@ mcTimer
Definition: skins.h:113
@ mcScheduleNext
Definition: skins.h:110
eMessageType
Definition: skins.h:37
@ mtWarning
Definition: skins.h:37
@ mtInfo
Definition: skins.h:37
@ mtError
Definition: skins.h:37
@ mtStatus
Definition: skins.h:37
eMenuSortMode
Definition: skins.h:137
@ msmProvider
Definition: skins.h:142
@ msmUnknown
Definition: skins.h:138
@ msmTime
Definition: skins.h:141
@ msmName
Definition: skins.h:140
@ msmNumber
Definition: skins.h:139
@ tfActive
Definition: timers.h:19
eTimerMatch
Definition: timers.h:27