summaryrefslogtreecommitdiff
path: root/osdbase.h
diff options
context:
space:
mode:
authorKlaus Schmidinger <kls (at) cadsoft (dot) de>2004-05-16 18:00:00 +0200
committerKlaus Schmidinger <kls (at) cadsoft (dot) de>2004-05-16 18:00:00 +0200
commitc80a53ff6ea22aa14d1f9772b310b77ea0da7c42 (patch)
treec2c6d9dc5c939765abc61fb0f19de00f988aecc9 /osdbase.h
parent9384e56566f56e77d577319a42929e708936e7c7 (diff)
downloadvdr-patch-lnbsharing-c80a53ff6ea22aa14d1f9772b310b77ea0da7c42.tar.gz
vdr-patch-lnbsharing-c80a53ff6ea22aa14d1f9772b310b77ea0da7c42.tar.bz2
Version 1.3.7vdr-1.3.7
- Fixed a memory leak in thread handling when using NPTL (thanks to Jon Burgess). - Fixed handling Setup.RecordDolbyDigital, which was broken since version 1.1.6. - Fixed handling text lengths for itemized EPG texts (thanks to Marcel Wiesweg). - Fixed the help for LSTE and LSTR (was broken in 1.3.6). - Improved iso8859-7 fonts (thanks to Dimitrios Dimitrakos). - Added some 3-letter language codes (thanks to Marcus Mönnig). - Added language code handling to the subtitling descriptor in 'libsi' (thanks to Pekka Virtanen). - Moved several menu item classes from menu.c to menuitems.[hc] to make them available for plugins. - The epg2html.pl script now handles '|' in description texts. - The new setup option "OSD/Use small font" can be used to control the use of the small font (see MANUAL for details). - Swapped osd.[hc] and osdbase.[hc] to have the virtual OSD base class named cOsd. Plugins may need to adjust their #include statements. - Colors are now given as AARRGGBB instead of AABBGGRR. The values are mapped to the driver's (wrong) sequence in dvbosd.c (this should really be fixed in the driver, together with the endian problem). - The new OSD setup parameters "Left" and "Top" can be used to define the top left corner of the OSD. - The OSD size parameters are now in pixel (as opposed to formerly characters). When reading a 'setup.conf' file from an older version of VDR, the OSDwidth and OSDheight values will be converted to pixel automatically. - The OSD is now fully device independent. See the comments in VDR/osd.h and the description in PLUGINS.html for information on how a plugin can implement an OSD display on arbitrary hardware. - The OSD (actually its cBitmap class) can now handle XPM files. There are several XPM files in the VDR/symbols directory which can be used by skins (some of these have been taken from the "elchi" patch). See VDR/skinsttng.c for examples on how to use these. - Due to the changes in the OSD handling the DEBUG_OSD option for a textual OSD has been dropped. There will be a plugin that implements a skin with this functionality later. - The entire OSD display can now be implemented via "skins". See VDR/skins.[hc], VDR/skinclassic.[hc], VDR/skinsttng.[hc] and PLUGINS.html for information on how a plugin can implement its own skin. By default VDR comes with a "Classic" skin that implements the OSD display known from previous versions, and the new skin named "ST:TNG Panels", which is also the default skin now. The actual skin can be selected through "Setup/OSD/Skin". - The colors used in a skin can now be configured using "themes". See PLUGINS.html for information on how a skin can make use of themes, and man vdr(5) for the structure of a theme file. The actual theme to use can be selected through "Setup/OSD/Theme". - Added Croatian language texts (thanks to Drazen Dupor). NOTE: there is apparently a problem with the newly introduced iso8859-2 font, because as soon as Setup/OSD/Language is set to Croatian (currently the last one in the list) everything freezes and the vdr processes have to be killed with -9 and the driver needs to be reloaded. Maybe somebody else can find out what's going wrong here... - Added missing NULL checks when accessing sectionHandler in device.c (thanks to Pekka Virtanen). - Fixed setting the time from the DVB data stream (thanks to Helmut Auer for pointing out a frequency/transponder handling mixup). This now also takes the actual source (sat, cable etc.) into account. Please go into "Setup/EPG" and set the "Set system time" and "Use time from transponder" parameters accordingly (this is necessary even if you have already set them before!).
Diffstat (limited to 'osdbase.h')
-rw-r--r--osdbase.h296
1 files changed, 101 insertions, 195 deletions
diff --git a/osdbase.h b/osdbase.h
index 3277d82..53fbf6b 100644
--- a/osdbase.h
+++ b/osdbase.h
@@ -4,221 +4,127 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: osdbase.h 1.9 2004/01/31 10:28:49 kls Exp $
+ * $Id: osdbase.h 1.10 2004/04/30 13:40:11 kls Exp $
*/
#ifndef __OSDBASE_H
#define __OSDBASE_H
-#include <stdio.h>
-#include "font.h"
+#include "config.h"
+#include "osd.h"
+#include "skins.h"
+#include "tools.h"
-#define MAXNUMCOLORS 256
+enum eOSState { osUnknown,
+ osContinue,
+ osSchedule,
+ osChannels,
+ osTimers,
+ osRecordings,
+ osPlugin,
+ osSetup,
+ osCommands,
+ osPause,
+ 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,
+ };
-enum eDvbColor {
-#ifdef DEBUG_OSD
- clrBackground,
- clrTransparent = clrBackground,
- clrBlack = clrBackground,
- clrRed,
- clrGreen,
- clrYellow,
- clrBlue,
- clrMagenta,
- clrCyan,
- clrWhite,
-#else
- clrTransparent = 0x00000000,
- clrBackground = 0x7F000000, // 50% gray
- clrBlack = 0xFF000000,
- clrRed = 0xFF1414FC,
- clrGreen = 0xFF24FC24,
- clrYellow = 0xFF24C0FC,
- clrMagenta = 0xFFFC00B0,
- clrBlue = 0xFFFC0000,
- clrCyan = 0xFFFCFC00,
- clrWhite = 0xFFFCFCFC,
-#endif
- };
-
-class cPalette {
+class cOsdItem : public cListObject {
private:
- eDvbColor color[MAXNUMCOLORS];
- int maxColors, numColors;
- bool used[MAXNUMCOLORS];
- bool fetched[MAXNUMCOLORS];
- bool full;
+ char *text;
+ int offset;
+ eOSState state;
+ bool selectable;
protected:
- typedef u_char tIndexes[MAXNUMCOLORS];
+ bool fresh;
public:
- cPalette(int Bpp);
- int Index(eDvbColor Color);
- void Reset(void);
- void SetColor(int Index, eDvbColor Color);
- eDvbColor GetColor(int Index) { return Index < maxColors ? color[Index] : clrBlack; }
- const eDvbColor *NewColors(int &FirstColor, int &LastColor);
- // With every call this function returns a consecutive range of
- // color entries that have been added since the last call. The
- // return value is the address of the first new color, and the
- // index of the first and last new color are returned in the given
- // int parameters. If there are no new color entries, NULL will
- // be returned.
- const eDvbColor *AllColors(int &NumColors);
- // Returns a pointer to the complete color table and stores the
- // number of valid entries in NumColors. If no colors have been
- // stored yet, NumColors will be set to 0 and the function will
- // return NULL.
- void Take(const cPalette &Palette, tIndexes *Indexes = NULL);
+ cOsdItem(eOSState State = osUnknown);
+ cOsdItem(const char *Text, eOSState State = osUnknown);
+ virtual ~cOsdItem();
+ bool Selectable(void) { return selectable; }
+ void SetText(const char *Text, bool Copy = true);
+ void SetSelectable(bool Selectable);
+ void SetFresh(bool Fresh);
+ const char *Text(void) { return text; }
+ virtual void Set(void) {}
+ virtual eOSState ProcessKey(eKeys Key);
};
-class cBitmap : public cPalette {
+class cOsdObject {
+ friend class cOsdMenu;
private:
- const cFont *font;
- eDvbFont fontType;
- u_char *bitmap;
- bool clearWithBackground;
+ bool isMenu;
protected:
- int width, height;
- int dirtyX1, dirtyY1, dirtyX2, dirtyY2;
+ bool needsFastResponse;
public:
- cBitmap(int Width, int Height, int Bpp, bool ClearWithBackground = true);
- virtual ~cBitmap();
- bool ClearWithBackground(void) { return clearWithBackground; }
- eDvbFont SetFont(eDvbFont Font);
- bool Dirty(int &x1, int &y1, int &x2, int &y2);
- void SetIndex(int x, int y, u_char Index);
- void SetPixel(int x, int y, eDvbColor Color);
- void SetBitmap(int x, int y, const cBitmap &Bitmap);
- int Width(void) { return width; }
- int Width(unsigned char c);
- int Width(const char *s);
- int Height(void) { return height; }
- void Text(int x, int y, const char *s, eDvbColor ColorFg = clrWhite, eDvbColor ColorBg = clrBackground);
- void Fill(int x1, int y1, int x2, int y2, eDvbColor Color);
- void Clean(void);
- void Clear(void);
- const u_char *Data(int x, int y);
+ cOsdObject(bool FastResponse = false) { isMenu = false; needsFastResponse = FastResponse; }
+ virtual ~cOsdObject() {}
+ bool NeedsFastResponse(void) { return needsFastResponse; }
+ bool IsMenu(void) { return isMenu; }
+ virtual void Show(void) {}
+ virtual eOSState ProcessKey(eKeys Key) { return osUnknown; }
};
-#define MAXNUMWINDOWS 7 // OSD windows are counted 1...7
-
-class cWindow : public cBitmap {
-private:
- int handle; // the index within the OSD's window array (0...MAXNUMWINDOWS - 1)
- int x0, y0;
- int bpp;
- bool tiled;
- bool shown;
-public:
- cWindow(int Handle, int x, int y, int w, int h, int Bpp, bool ClearWithBackground, bool Tiled);
- int X0(void) { return x0; }
- int Y0(void) { return y0; }
- int Bpp(void) { return bpp; }
- bool Tiled(void) { return tiled; }
- bool Shown(void) { bool s = shown; shown = true; return s; }
- int Handle(void) { return handle; }
- bool Contains(int x, int y);
- void Relocate(int x, int y);
- void Fill(int x1, int y1, int x2, int y2, eDvbColor Color);
- void SetBitmap(int x, int y, const cBitmap &Bitmap);
- void Text(int x, int y, const char *s, eDvbColor ColorFg = clrWhite, eDvbColor ColorBg = clrBackground);
- const u_char *Data(int x, int y);
- };
-
-typedef int tWindowHandle;
-
-// '-1' is used as an error return value!
-#define ALL_WINDOWS (-2)
-#define ALL_TILED_WINDOWS (-3)
-#define LAST_CREATED_WINDOW (-4)
-
-class cOsdBase {
+class cOsdMenu : public cOsdObject, public cList<cOsdItem> {
private:
- int numWindows;
- int x0, y0;
- cWindow *window[MAXNUMWINDOWS];
- cWindow *GetWindow(int x, int y);
- cWindow *GetWindow(tWindowHandle Window);
+ static cSkinDisplayMenu *displayMenu;
+ static int displayMenuCount;
+ static int displayMenuItems;
+ char *title;
+ int cols[cSkinDisplayMenu::MaxTabs];
+ int first, current, marked;
+ cOsdMenu *subMenu;
+ const char *helpRed, *helpGreen, *helpYellow, *helpBlue;
+ char *status;
+ int digit;
+ bool hasHotkeys;
protected:
- cWindow *GetWindowNr(int i) { return i < MAXNUMWINDOWS ? window[i] : NULL; }
- int NumWindows(void) { return numWindows; }
- int X0(void) { return x0; }
- int Y0(void) { return y0; }
- virtual bool OpenWindow(cWindow *Window) = 0;
- // Opens the window on the OSD hardware, without actually showing it (the
- // initial state shall be "hidden").
- virtual void CommitWindow(cWindow *Window) = 0;
- // Write any modified data and color definitions to the OSD hardware.
- // Use the window's Dirty() function to find out which area of data
- // actually needs to be transferred. If the window has not yet been explicitly
- // shown through a call to ShowWindow(), no visible activity shall take place.
- virtual void ShowWindow(cWindow *Window) = 0;
- // Make the window actually visible on the OSD hardware.
- virtual void HideWindow(cWindow *Window, bool Hide) = 0;
- // Temporarily hide the window (if 'Hide' is 'true') or make a previously
- // hidden window visible again (if 'Hide' is 'false').
- virtual void MoveWindow(cWindow *Window, int x, int y) = 0;
- // Move the window to a new location.
- virtual void CloseWindow(cWindow *Window) = 0;
- // Close the window and release any OSD hardware resources allocated for it.
+ cSkinDisplayMenu *DisplayMenu(void) { return displayMenu; }
+ const char *hk(const char *s);
+ void SetHasHotkeys(void);
+ virtual void Clear(void);
+ bool SelectableItem(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);
+ void SetHelp(const char *Red, const char *Green = NULL, const char *Yellow = NULL, const char *Blue = NULL);
+ virtual void Del(int Index);
public:
- cOsdBase(int x, int y);
- // Initializes the OSD, starting at screen coordinates (x, y).
- virtual ~cOsdBase();
- // Destroys all windows and shuts down the OSD.
- tWindowHandle Create(int x, int y, int w, int h, int Bpp, bool ClearWithBackground = true, bool Tiled = true);
- // Creates a window at coordinates (x, y), which are relative to the OSD's
- // origin given in the constructor, with the given width, height and color
- // depth. ClearWithBackground controls whether the window will be filled with
- // clrBackground when it is cleared. Setting this to 'false' may be useful
- // for windows that don't need clrBackground but want to save this color
- // palette entry for a different color. Tiled controls whether this will
- // be part of a multi section OSD (with several windows that all have
- // different color depths and palettes and form one large OSD area), or
- // whether this is a "standalone" window that will be drawn "in front"
- // of any windows defined *after* this one (this can be used for highlighting
- // certain parts of the OSD, as would be done in a 'cursor').
- // Returns a handle that can be used to identify this window.
- void AddColor(eDvbColor Color, tWindowHandle Window = LAST_CREATED_WINDOW);
- // Adds the Color to the color palette of the given window if it is not
- // already contained in the palette (and if the palette still has free
- // slots for new colors). The default value LAST_CREATED_WINDOW will
- // access the most recently created window, without the need of explicitly
- // using a window handle.
- void Flush(void);
- // Actually commits all data of all windows to the OSD.
- void Clear(tWindowHandle Window = ALL_TILED_WINDOWS);
- // Clears the given window. If ALL_TILED_WINDOWS is given, only the tiled
- // windows will be cleared, leaving the standalone windows untouched. If
- // ALL_WINDOWS is given, the standalone windows will also be cleared.
- void Fill(int x1, int y1, int x2, int y2, eDvbColor Color, tWindowHandle Window = ALL_TILED_WINDOWS);
- // Fills the rectangle defined by the upper left (x1, y2) and lower right
- // (x2, y2) corners with the given Color. If a specific window is given,
- // the coordinates are relative to that window's upper left corner.
- // Otherwise they are relative to the upper left corner of the entire OSD.
- // If all tiled windows are selected, only that window which contains the
- // point (x1, y1) will actually be filled.
- void SetBitmap(int x, int y, const cBitmap &Bitmap, tWindowHandle Window = ALL_TILED_WINDOWS);
- // Sets the pixels within the given window with the data from the given
- // Bitmap. See Fill() for details about the coordinates.
- int Width(unsigned char c);
- // Returns the width (in pixels) of the given character in the current font.
- int Width(const char *s);
- // Returns the width (in pixels) of the given string in the current font.
- eDvbFont SetFont(eDvbFont Font);
- // Sets the current font for subsequent Width() and Text() operations.
- void Text(int x, int y, const char *s, eDvbColor ColorFg = clrWhite, eDvbColor ColorBg = clrBackground, tWindowHandle Window = ALL_TILED_WINDOWS);
- // Writes the given string at coordinates (x, y) with the given foreground
- // and background color into the given window (see Fill() for details
- // about the coordinates).
- void Relocate(tWindowHandle Window, int x, int y, int NewWidth = -1, int NewHeight = -1);
- // Moves the given window to the new location at (x, y). If NewWidth and
- // NewHeight are also given, the window will also be resized to the new
- // width and height.
- void Hide(tWindowHandle Window);
- // Hides the given window.
- void Show(tWindowHandle Window);
- // Shows the given window.
+ 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);
+ virtual void Display(void);
+ virtual eOSState ProcessKey(eKeys Key);
};
#endif //__OSDBASE_H