33 #include "symbols/arrowdown.xpm"
34 #include "symbols/arrowup.xpm"
35 #include "symbols/audio.xpm"
36 #include "symbols/audioleft.xpm"
37 #include "symbols/audioright.xpm"
38 #include "symbols/audiostereo.xpm"
39 #include "symbols/dolbydigital.xpm"
40 #include "symbols/encrypted.xpm"
41 #include "symbols/ffwd.xpm"
42 #include "symbols/ffwd1.xpm"
43 #include "symbols/ffwd2.xpm"
44 #include "symbols/ffwd3.xpm"
45 #include "symbols/frew.xpm"
46 #include "symbols/frew1.xpm"
47 #include "symbols/frew2.xpm"
48 #include "symbols/frew3.xpm"
49 #include "symbols/mute.xpm"
50 #include "symbols/pause.xpm"
51 #include "symbols/play.xpm"
52 #include "symbols/radio.xpm"
53 #include "symbols/recording.xpm"
54 #include "symbols/sfwd.xpm"
55 #include "symbols/sfwd1.xpm"
56 #include "symbols/sfwd2.xpm"
57 #include "symbols/sfwd3.xpm"
58 #include "symbols/srew.xpm"
59 #include "symbols/srew1.xpm"
60 #include "symbols/srew2.xpm"
61 #include "symbols/srew3.xpm"
62 #include "symbols/teletext.xpm"
63 #include "symbols/volume.xpm"
65 #define Gap (Setup.FontOsdSize / 5 & ~1) // must be even
66 #define TextFrame (Setup.FontOsdSize / TEXT_ALIGN_BORDER)
67 #define TextSpacing (2 * TextFrame)
68 #define SymbolSpacing TextSpacing
69 #define ShowSeenExtent (Setup.FontOsdSize / 5) // pixels by which the "seen" bar extends out of the frame
71 #define DISKUSAGEALERTLIMIT 95 // percent of disk usage above which the display goes into alert mode
72 #define SIGNALDISPLAYDELTA 2 // seconds between subsequent device signal displays
78 #define CLR_BACKGROUND 0x99000000
79 #define CLR_MAIN_FRAME 0xFFFF9966
80 #define CLR_CHANNEL_FRAME 0xFF8A9EC9
81 #define CLR_REPLAY_FRAME 0xFFCC6666
82 #define CLR_DATE 0xFF99CCFF
83 #define CLR_MENU_ITEMS 0xFF9999FF
84 #define CLR_TIMER 0xFF99CCFF
85 #define CLR_DEVICE 0xFFF1B1AF
86 #define CLR_CHANNEL_NAME 0xFF99CCFF
87 #define CLR_EVENT_TITLE 0xFF99CCFF
88 #define CLR_EVENT_TIME 0xFFFFCC66
89 #define CLR_EVENT_SHORTTEXT 0xFFFFCC66
90 #define CLR_TEXT 0xFF99CCFF
91 #define CLR_TRACK 0xFFFFCC66
92 #define CLR_SEEN 0xFFCC99CC
93 #define CLR_ALERT 0xFFFF0000
94 #define CLR_EXPOSED 0xFF990000
95 #define CLR_WHITE 0xFFFFFFFF
96 #define CLR_RED 0xFFCC6666
97 #define CLR_GREEN 0xFFA0FF99
98 #define CLR_YELLOW 0xFFF1DF60
99 #define CLR_BLUE 0xFF9A99FF
100 #define CLR_BLACK 0xFF000000
205 int Bpp[] = { 32, 8, 4, 2, 1 };
206 tArea Area = { x0, y0, x1, y1, 0 };
207 for (
unsigned int i = 0; i <
sizeof(Bpp) /
sizeof(
int); i++) {
221 int Height = LineHeight;
224 if (Height < 2 || TinyFont->Height() <= LineHeight)
231 static bool DrawDeviceData(
cOsd *Osd,
const cDevice *Device,
int x0,
int y0,
int x1,
int y1,
int &xs,
const cFont *TinyFont,
cString &LastDeviceType,
cCamSlot *&LastCamSlot,
bool Initial)
235 if (Initial || strcmp(DeviceType, LastDeviceType) || CamSlot != LastCamSlot) {
243 int w =
max(font->
Width(Nr), y1 - y0);
247 Osd->
DrawText(x, y0, DeviceType, ColorFg, ColorBg, TinyFont);
248 xs =
max(xs, x + TinyFont->
Width(DeviceType));
249 LastDeviceType = DeviceType;
253 Osd->
DrawText(x, y1 - TinyFont->
Height(), s, ColorFg, ColorBg, TinyFont);
254 xs =
max(xs, x + TinyFont->
Width(s));
256 LastCamSlot = CamSlot;
262 static void DrawDeviceSignal(
cOsd *Osd,
const cDevice *Device,
int x0,
int y0,
int x1,
int y1,
int &LastSignalStrength,
int &LastSignalQuality,
bool Initial)
266 int d =
max((y1 - y0) / 10, 1);
269 int h = (y1 - y0 - 3 * d) / 2;
275 if (SignalStrength >= 0 && (Initial || SignalStrength != LastSignalStrength)) {
276 int s = SignalStrength * w / 100;
279 LastSignalStrength = SignalStrength;
281 if (SignalQuality >= 0 && (Initial || SignalQuality != LastSignalQuality)) {
282 int q = SignalQuality * w / 100;
285 LastSignalQuality = SignalQuality;
294 int xc00,
xc01,
xc02,
xc03,
xc04,
xc05,
xc06,
xc07,
xc08,
xc09,
xc10,
xc11,
xc12,
xc13,
xc14,
xc15;
295 int yc00,
yc01,
yc02,
yc03,
yc04,
yc05,
yc06,
yc07,
yc08,
yc09,
yc10,
yc11,
yc12;
326 virtual void Flush(
void);
381 yc12 =
yc07 + 3 * lineHeight + Gap / 2;
461 if (
DrawDeviceData(
osd, Device,
xc10,
yc11,
xc11,
yc12,
xs,
tinyFont,
lastDeviceType,
lastCamSlot, Device->
DeviceNumber() !=
lastDeviceNumber)) {
472 time_t Now = time(NULL);
489 if (Channel && !Channel->
GroupSep()) {
499 if (Channel->
Vpid()) {
503 else if (Channel->
Apid(0)) {
511 ChName = Channel->
Name();
533 for (
int i = 0; i < 2; i++) {
534 const cEvent *e = !i ? Present : Following;
551 int x0, x1, y0, y1, y2;
588 time_t t = time(NULL);
607 int yc00,
yc01,
yc02,
yc03,
yc04,
yc05,
yc06,
yc07,
yc08,
yc09,
yc10,
yc11;
608 int yb00,
yb01,
yb02,
yb03,
yb04,
yb05,
yb06,
yb07,
yb08,
yb09,
yb10,
yb11,
yb12,
yb13,
yb14,
yb15;
611 int xs00,
xs01,
xs02,
xs03,
xs04,
xs05,
xs06,
xs07,
xs08,
xs09,
xs10,
xs11,
xs12,
xs13;
615 int xb00,
xb01,
xb02,
xb03,
xb04,
xb05,
xb06,
xb07,
xb08,
xb09,
xb10,
xb11,
xb12,
xb13,
xb14,
xb15;
657 void DrawScrollbar(
int Total,
int Offset,
int Shown,
bool CanScrollUp,
bool CanScrollDown);
672 virtual void Scroll(
bool Up,
bool Page);
674 virtual void Clear(
void);
676 virtual void SetTitle(
const char *Title);
677 virtual void SetButtons(
const char *Red,
const char *Green = NULL,
const char *Yellow = NULL,
const char *Blue = NULL);
679 virtual void SetItem(
const char *Text,
int Index,
bool Current,
bool Selectable);
683 virtual void SetText(
const char *Text,
bool FixedFont);
686 virtual void Flush(
void);
736 yc05 =
yc00 + 3 * lineHeight + Gap / 2;
747 yc11 =
yc06 + 3 * lineHeight + Gap / 2;
881 if (MenuCategory ==
mcMain) {
978 tColor lutBg[] = { clrButtonRedBg, clrButtonGreenBg, clrButtonYellowBg, clrButtonBlueBg };
993 const char *t = strrchr(s,
' ');
1007 tColor ColorFg = DiskAlert ? Theme.
Color(clrAlertFg) : Theme.
Color(clrMenuFrameFg);
1012 osd->
DrawText(
xa00,
yb03 -
lineHeight,
cString::sprintf(
"%02d:%02d",
cVideoDiskUsage::FreeMinutes() / 60,
cVideoDiskUsage::FreeMinutes() % 60), ColorFg, ColorBg, font,
xa02 -
xa00, 0,
taBottom |
taRight |
taBorder);
1026 if (getloadavg(&SystemLoad, 1) > 0) {
1092 ClearColor = Theme.
Color(clrMenuMainBracket);
1110 if (Total > 0 && Total > Shown) {
1112 int sh =
max(
int((tb - tt) *
double(Shown) / Total + 0.5), sw);
1113 int st =
min(
int(tt + (tb - tt) *
double(Offset) / Total + 0.5), tb - sh);
1114 int sb =
min(st + sh, tb);
1126 tColor ColorFg = Alert ? Theme.
Color(clrAlertFg) : Theme.
Color(clrTimerFg);
1127 tColor ColorBg = Alert ? Theme.
Color(clrAlertFg) : Theme.
Color(clrTimerBg);
1133 time_t Now = time(NULL);
1139 else if (strcmp(Day, Today) != 0)
1175 for (
int i = 0; i < SortedTimers.
Size(); i++) {
1178 if (
const cTimer *Timer = SortedTimers[i]) {
1179 if (Timer->Recording()) {
1181 if (!Device || Device == RecordControl->Device()) {
1185 Device = RecordControl->Device();
1191 FreeDeviceSlots.
Append(y);
1197 SortedTimers[i] = NULL;
1199 else if (!Device && Timer->HasFlags(
tfActive)) {
1201 FreeDeviceSlots.
Append(y);
1203 SortedTimers[i] = NULL;
1214 if (Device->NumProvidedSystems()) {
1216 if (Slot < FreeDeviceSlots.
Size()) {
1217 y = FreeDeviceSlots[Slot];
1247 if (
DrawDeviceData(
osd, Device,
xs08, y,
xs11, y +
lineHeight,
xs,
tinyFont,
lastDeviceType[dn],
lastCamSlot[dn],
initial)) {
1263 if (Device->NumProvidedSystems())
1274 if (!Device->
Replaying() || Transferring)
1286 int b = w * w + h * h;
1291 double f = sqrt(
double(c) / (2 * b));
1306 time_t Now = time(NULL);
1310 if (Device->NumProvidedSystems()) {
1338 if (
const cSchedule *Schedule = Schedules->GetSchedule(Channel)) {
1339 const cEvent *Event = Schedule->GetPresentEvent();
1348 time_t t = time(NULL);
1371 if (Control->
GetIndex(Current, Total))
1454 int w = font->
Width(Title);
1462 const char *lutText[] = { Red, Green, Yellow, Blue };
1463 tColor lutFg[] = { clrButtonRedFg, clrButtonGreenFg, clrButtonYellowFg, clrButtonBlueFg };
1464 tColor lutBg[] = { clrButtonRedBg, clrButtonGreenBg, clrButtonYellowBg, clrButtonBlueBg };
1496 ColorFg = Theme.
Color(clrMenuItemCurrentFg);
1497 ColorBg = Theme.
Color(clrMenuItemCurrentBg);
1504 ColorFg = Theme.
Color(Selectable ? clrMenuItemSelectable : clrMenuItemNonSelectable);
1510 for (
int i = 0; i <
MaxTabs; i++) {
1541 int w = font->Width(buffer);
1543 int yb = y + font->Height();
1551 int w = font->Width(buffer);
1553 int yb = y + font->Height();
1590 int w = font->Width(buffer);
1592 int yb = y + font->Height();
1597 const char *Title = Info->
Title();
1599 Title = Recording->
Name();
1659 int xp00,
xp01,
xp02,
xp03,
xp04,
xp05,
xp06,
xp07,
xp08,
xp09,
xp10,
xp11,
xp12,
xp13,
xp14,
xp15;
1673 virtual void SetTitle(
const char *Title);
1674 virtual void SetMode(
bool Play,
bool Forward,
int Speed);
1677 virtual void SetTotal(
const char *Total);
1678 virtual void SetJump(
const char *Jump);
1680 virtual void Flush(
void);
1714 yp09 =
yp04 + 3 * lineHeight + Gap / 2;
1784 { { pause_xpm, srew_xpm, srew1_xpm, srew2_xpm, srew3_xpm },
1785 { pause_xpm, sfwd_xpm, sfwd1_xpm, sfwd2_xpm, sfwd3_xpm }, },
1786 { { play_xpm, frew_xpm, frew1_xpm, frew2_xpm, frew3_xpm },
1787 { play_xpm, ffwd_xpm, ffwd1_xpm, ffwd2_xpm, ffwd3_xpm } }
1793 cBitmap bm(ReplaySymbols[Play][Forward][Speed + 1]);
1806 int w = font->
Width(Current);
1814 int w = font->
Width(Total) + 10;
1855 virtual void Flush(
void);
1861 int lineHeight = font->
Height();
1865 x1 = lineHeight / 2;
1869 x6 =
x7 - lineHeight / 2;
1870 x5 =
x6 - lineHeight / 2;
1900 cBitmap bm(Mute ? mute_xpm : volume_xpm);
1904 int w = (
y1 -
y0) / 3;
1906 int n = (xr - xl + d) / (w + d);
1907 int x = xr - n * (w + d);
1909 for (
int i = 0; i < n; i++) {
1910 if (Total * i >= Current * n)
1911 Color = Theme.
Color(clrVolumeBarUpper);
1928 int xt00,
xt01,
xt02,
xt03,
xt04,
xt05,
xt06,
xt07,
xt08,
xt09,
xt10,
xt11,
xt12;
1938 virtual void SetTrack(
int Index,
const char *
const *Tracks);
1940 virtual void Flush(
void);
1958 for (
int i = 0; i < NumTracks; i++)
1960 xt04 = xt02 + ItemsWidth;
1973 yt04 =
yt03 + NumTracks * lineHeight + (NumTracks - 1) * Gap;
1997 for (
int i = 0; i < NumTracks; i++)
2024 ColorFg = Theme.
Color(clrTrackItemCurrentFg);
2025 ColorBg = Theme.
Color(clrTrackItemCurrentBg);
2033 ColorFg = Theme.
Color(clrTrackItemFg);
2034 ColorBg = Theme.
Color(clrTrackItemBg);
2048 SetItem(Tracks[Index], Index,
true);
2054 switch (AudioChannel) {
2082 virtual void Flush(
void);
2088 int lineHeight = font->
Height();
2090 x1 = lineHeight / 2;
2094 x6 =
x7 - lineHeight / 2;
2095 x5 =
x6 - lineHeight / 2;
2109 tColor ColorFg = Theme.
Color(clrMessageStatusFg + 2 * Type);
2110 tColor ColorBg = Theme.
Color(clrMessageStatusBg + 2 * Type);
2129 :
cSkin(
"lcars", &::Theme)