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
207 int Bpp[] = { 32, 8, 4, 2, 1 };
208 tArea Area = { x0, y0, x1, y1, 0 };
209 for (
unsigned int i = 0; i <
sizeof(Bpp) /
sizeof(
int); i++) {
214 TwoColors = Area.
bpp == 1;
225 int Height = LineHeight;
228 if (Height < 2 || TinyFont->Height() <= LineHeight)
235 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)
239 if (Initial || strcmp(DeviceType, LastDeviceType) || CamSlot != LastCamSlot) {
247 int w =
max(font->
Width(Nr), y1 - y0);
251 Osd->
DrawText(x, y0, DeviceType, ColorFg, ColorBg, TinyFont);
252 xs =
max(xs, x + TinyFont->
Width(DeviceType));
253 LastDeviceType = DeviceType;
257 Osd->
DrawText(x, y1 - TinyFont->
Height(), s, ColorFg, ColorBg, TinyFont);
258 xs =
max(xs, x + TinyFont->
Width(s));
260 LastCamSlot = CamSlot;
266 static void DrawDeviceSignal(
cOsd *Osd,
const cDevice *Device,
int x0,
int y0,
int x1,
int y1,
int &LastSignalStrength,
int &LastSignalQuality,
bool Initial)
270 int d =
max((y1 - y0) / 10, 1);
273 int h = (y1 - y0 - 3 * d) / 2;
279 tColor ColorSignalValue, ColorSignalRest;
282 ColorSignalRest = Theme.
Color(clrMenuFrameBg);
285 ColorSignalValue = Theme.
Color(clrSignalValue);
286 ColorSignalRest = Theme.
Color(clrSignalRest);
288 if (SignalStrength >= 0 && (Initial || SignalStrength != LastSignalStrength)) {
289 int s = SignalStrength * w / 100;
290 Osd->
DrawRectangle(x00, y00, x00 + s - 1, y01 - 1, ColorSignalValue);
291 Osd->
DrawRectangle(x00 + s, y00, x01 - 1, y01 - 1, ColorSignalRest);
292 LastSignalStrength = SignalStrength;
294 if (SignalQuality >= 0 && (Initial || SignalQuality != LastSignalQuality)) {
295 int q = SignalQuality * w / 100;
296 Osd->
DrawRectangle(x00, y02, x00 + q - 1, y03 - 1, ColorSignalValue);
297 Osd->
DrawRectangle(x00 + q, y02, x01 - 1, y03 - 1, ColorSignalRest);
298 LastSignalQuality = SignalQuality;
307 int xc00,
xc01,
xc02,
xc03,
xc04,
xc05,
xc06,
xc07,
xc08,
xc09,
xc10,
xc11,
xc12,
xc13,
xc14,
xc15;
308 int yc00,
yc01,
yc02,
yc03,
yc04,
yc05,
yc06,
yc07,
yc08,
yc09,
yc10,
yc11,
yc12;
339 virtual void Flush(
void);
394 yc12 =
yc07 + 3 * lineHeight + Gap / 2;
461 int Seen = (Total > 0) ?
min(
xc07 -
xc06,
int((
xc07 -
xc06) *
double(Current) / Total)) : 0;
474 if (
DrawDeviceData(
osd, Device,
xc10,
yc11,
xc11,
yc12,
xs,
tinyFont,
lastDeviceType,
lastCamSlot, Device->
DeviceNumber() !=
lastDeviceNumber)) {
485 time_t Now = time(NULL);
502 if (Channel && !Channel->
GroupSep()) {
512 if (Channel->
Vpid()) {
516 else if (Channel->
Apid(0)) {
524 ChName = Channel->
Name();
546 for (
int i = 0; i < 2; i++) {
547 const cEvent *e = !i ? Present : Following;
564 int x0, x1, y0, y1, y2;
601 time_t t = time(NULL);
620 int yc00,
yc01,
yc02,
yc03,
yc04,
yc05,
yc06,
yc07,
yc08,
yc09,
yc10,
yc11;
621 int yb00,
yb01,
yb02,
yb03,
yb04,
yb05,
yb06,
yb07,
yb08,
yb09,
yb10,
yb11,
yb12,
yb13,
yb14,
yb15;
624 int xs00,
xs01,
xs02,
xs03,
xs04,
xs05,
xs06,
xs07,
xs08,
xs09,
xs10,
xs11,
xs12,
xs13;
628 int xb00,
xb01,
xb02,
xb03,
xb04,
xb05,
xb06,
xb07,
xb08,
xb09,
xb10,
xb11,
xb12,
xb13,
xb14,
xb15;
670 void DrawScrollbar(
int Total,
int Offset,
int Shown,
bool CanScrollUp,
bool CanScrollDown);
685 virtual void Scroll(
bool Up,
bool Page);
687 virtual void Clear(
void);
689 virtual void SetTitle(
const char *Title);
690 virtual void SetButtons(
const char *Red,
const char *Green = NULL,
const char *Yellow = NULL,
const char *Blue = NULL);
692 virtual void SetItem(
const char *Text,
int Index,
bool Current,
bool Selectable);
696 virtual void SetText(
const char *Text,
bool FixedFont);
699 virtual void Flush(
void);
749 yc05 =
yc00 + 3 * lineHeight + Gap / 2;
760 yc11 =
yc06 + 3 * lineHeight + Gap / 2;
894 if (MenuCategory ==
mcMain) {
991 tColor lutBg[] = { clrButtonRedBg, clrButtonGreenBg, clrButtonYellowBg, clrButtonBlueBg };
1006 const char *t = strrchr(s,
' ');
1020 tColor ColorFg = DiskAlert ? Theme.
Color(clrAlertFg) : Theme.
Color(clrMenuFrameFg);
1025 osd->
DrawText(
xa00,
yb03 -
lineHeight,
cString::sprintf(
"%02d:%02d",
cVideoDiskUsage::FreeMinutes() / 60,
cVideoDiskUsage::FreeMinutes() % 60), ColorFg, ColorBg, font,
xa02 -
xa00, 0,
taBottom |
taRight |
taBorder);
1039 if (getloadavg(&SystemLoad, 1) > 0) {
1105 ClearColor = Theme.
Color(clrMenuMainBracket);
1123 if (Total > 0 && Total > Shown) {
1125 int sh =
max(
int((tb - tt) *
double(Shown) / Total + 0.5), sw);
1126 int st =
min(
int(tt + (tb - tt) *
double(Offset) / Total + 0.5), tb - sh);
1127 int sb =
min(st + sh, tb);
1139 tColor ColorFg = Alert ? Theme.
Color(clrAlertFg) : Theme.
Color(clrTimerFg);
1140 tColor ColorBg = Alert ? Theme.
Color(clrAlertBg) : Theme.
Color(clrTimerBg);
1146 time_t Now = time(NULL);
1152 else if (strcmp(Day, Today) != 0)
1188 for (
int i = 0; i < SortedTimers.
Size(); i++) {
1191 if (
const cTimer *Timer = SortedTimers[i]) {
1192 if (Timer->Recording()) {
1194 if (!Device || Device == RecordControl->Device()) {
1198 Device = RecordControl->Device();
1204 FreeDeviceSlots.
Append(y);
1210 SortedTimers[i] = NULL;
1212 else if (!Device && Timer->HasFlags(
tfActive)) {
1214 FreeDeviceSlots.
Append(y);
1216 SortedTimers[i] = NULL;
1227 if (Device->NumProvidedSystems()) {
1229 if (Slot < FreeDeviceSlots.
Size()) {
1230 y = FreeDeviceSlots[Slot];
1260 if (
DrawDeviceData(
osd, Device,
xs08, y,
xs11, y +
lineHeight,
xs,
tinyFont,
lastDeviceType[dn],
lastCamSlot[dn],
initial)) {
1276 if (Device->NumProvidedSystems())
1287 if (!Device->
Replaying() || Transferring)
1299 int b = w * w + h * h;
1304 double f = sqrt(
double(c) / (2 * b));
1319 time_t Now = time(NULL);
1323 if (Device->NumProvidedSystems()) {
1354 if (
const cSchedule *Schedule = Schedules->GetSchedule(Channel)) {
1355 const cEvent *Event = Schedule->GetPresentEvent();
1364 time_t t = time(NULL);
1387 if (Control->
GetIndex(Current, Total))
1430 int Seen = (Total > 0) ?
min(
xm08 -
xm02,
int((
xm08 -
xm02) *
double(Current) / Total)) : 0;
1470 int w = font->
Width(Title);
1478 const char *lutText[] = { Red, Green, Yellow, Blue };
1479 tColor lutFg[] = { clrButtonRedFg, clrButtonGreenFg, clrButtonYellowFg, clrButtonBlueFg };
1480 tColor lutBg[] = { clrButtonRedBg, clrButtonGreenBg, clrButtonYellowBg, clrButtonBlueBg };
1514 ColorBg = Theme.
Color(clrMenuFrameBg);
1517 ColorFg = Theme.
Color(clrMenuItemCurrentFg);
1518 ColorBg = Theme.
Color(clrMenuItemCurrentBg);
1526 ColorFg = Theme.
Color(Selectable ? clrMenuItemSelectable : clrMenuItemNonSelectable);
1532 for (
int i = 0; i <
MaxTabs; i++) {
1563 int w = font->Width(buffer);
1565 int yb = y + font->Height();
1573 int w = font->Width(buffer);
1575 int yb = y + font->Height();
1611 int w = font->Width(buffer);
1613 int yb = y + font->Height();
1618 const char *Title = Info->
Title();
1620 Title = Recording->
Name();
1680 int xp00,
xp01,
xp02,
xp03,
xp04,
xp05,
xp06,
xp07,
xp08,
xp09,
xp10,
xp11,
xp12,
xp13,
xp14,
xp15;
1695 virtual void SetTitle(
const char *Title);
1696 virtual void SetMode(
bool Play,
bool Forward,
int Speed);
1699 virtual void SetTotal(
const char *Total);
1700 virtual void SetJump(
const char *Jump);
1702 virtual void Flush(
void);
1737 yp09 =
yp04 + 3 * lineHeight + Gap / 2;
1807 { { pause_xpm, srew_xpm, srew1_xpm, srew2_xpm, srew3_xpm },
1808 { pause_xpm, sfwd_xpm, sfwd1_xpm, sfwd2_xpm, sfwd3_xpm }, },
1809 { { play_xpm, frew_xpm, frew1_xpm, frew2_xpm, frew3_xpm },
1810 { play_xpm, ffwd_xpm, ffwd1_xpm, ffwd2_xpm, ffwd3_xpm } }
1816 cBitmap bm(ReplaySymbols[Play][Forward][Speed + 1]);
1829 int w = font->
Width(Current);
1837 int w = font->
Width(Total);
1879 virtual void Flush(
void);
1885 int lineHeight = font->
Height();
1889 x1 = lineHeight / 2;
1893 x6 =
x7 - lineHeight / 2;
1894 x5 =
x6 - lineHeight / 2;
1924 cBitmap bm(Mute ? mute_xpm : volume_xpm);
1928 int w = (
y1 -
y0) / 3;
1930 int n = (xr - xl + d) / (w + d);
1931 int x = xr - n * (w + d);
1933 for (
int i = 0; i < n; i++) {
1934 if (Total * i >= Current * n)
1935 Color = Theme.
Color(clrVolumeBarUpper);
1952 int xt00,
xt01,
xt02,
xt03,
xt04,
xt05,
xt06,
xt07,
xt08,
xt09,
xt10,
xt11,
xt12;
1962 virtual void SetTrack(
int Index,
const char *
const *Tracks);
1964 virtual void Flush(
void);
1982 for (
int i = 0; i < NumTracks; i++)
1984 xt04 = xt02 + ItemsWidth;
1997 yt04 =
yt03 + NumTracks * lineHeight + (NumTracks - 1) * Gap;
2021 for (
int i = 0; i < NumTracks; i++)
2048 ColorFg = Theme.
Color(clrTrackItemCurrentFg);
2049 ColorBg = Theme.
Color(clrTrackItemCurrentBg);
2057 ColorFg = Theme.
Color(clrTrackItemFg);
2058 ColorBg = Theme.
Color(clrTrackItemBg);
2072 SetItem(Tracks[Index], Index,
true);
2078 switch (AudioChannel) {
2106 virtual void Flush(
void);
2112 int lineHeight = font->
Height();
2114 x1 = lineHeight / 2;
2118 x6 =
x7 - lineHeight / 2;
2119 x5 =
x6 - lineHeight / 2;
2133 tColor ColorFg = Theme.
Color(clrMessageStatusFg + 2 * Type);
2134 tColor ColorBg = Theme.
Color(clrMessageStatusBg + 2 * Type);
2153 :
cSkin(
"lcars", &::Theme)