summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--COPYING340
-rw-r--r--HISTORY33
-rw-r--r--Makefile135
-rw-r--r--README41
-rw-r--r--lcarsng.c2397
-rw-r--r--lcarsng.h27
-rw-r--r--po/de_DE.po55
-rw-r--r--skinlcarsng.c133
-rw-r--r--symbols/arrowdown.xpm29
-rw-r--r--symbols/arrowup.xpm29
-rw-r--r--symbols/audio.xpm41
-rw-r--r--symbols/audioleft.xpm41
-rw-r--r--symbols/audioright.xpm41
-rw-r--r--symbols/audiostereo.xpm41
-rw-r--r--symbols/dolbydigital.xpm41
-rw-r--r--symbols/encrypted.xpm41
-rw-r--r--symbols/ffwd.xpm57
-rw-r--r--symbols/ffwd1.xpm57
-rw-r--r--symbols/ffwd2.xpm57
-rw-r--r--symbols/ffwd3.xpm57
-rw-r--r--symbols/frew.xpm57
-rw-r--r--symbols/frew1.xpm57
-rw-r--r--symbols/frew2.xpm57
-rw-r--r--symbols/frew3.xpm57
-rw-r--r--symbols/mute-1.xpm45
-rw-r--r--symbols/mute.xpm41
-rw-r--r--symbols/pause.xpm57
-rw-r--r--symbols/play.xpm57
-rw-r--r--symbols/radio.xpm41
-rw-r--r--symbols/recording.xpm41
-rw-r--r--symbols/sfwd.xpm57
-rw-r--r--symbols/sfwd1.xpm57
-rw-r--r--symbols/sfwd2.xpm57
-rw-r--r--symbols/sfwd3.xpm57
-rw-r--r--symbols/srew.xpm57
-rw-r--r--symbols/srew1.xpm57
-rw-r--r--symbols/srew2.xpm57
-rw-r--r--symbols/srew3.xpm57
-rw-r--r--symbols/teletext.xpm41
-rw-r--r--symbols/volume.xpm33
-rw-r--r--themes/lcarsng-390Lb.theme110
-rw-r--r--themes/lcarsng-BlueGlass.theme104
-rw-r--r--themes/lcarsng-LbSense.theme105
-rw-r--r--themes/lcarsng-default.theme75
-rw-r--r--themes/lcarsng-mein.theme75
-rw-r--r--themes/lcarsng-meins.theme75
46 files changed, 5277 insertions, 0 deletions
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..f90922e
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/HISTORY b/HISTORY
new file mode 100644
index 0000000..fa9f931
--- /dev/null
+++ b/HISTORY
@@ -0,0 +1,33 @@
+VDR Plugin 'skinflat' Revision History
+---------------------------------------
+
+2013-22-09: Version 0.1.1
+- [add] show disk usage in topbar @ menu recordings & timer
+- [add] support text progressbar in menu
+- [update] bigger replay progress bar & marks
+- [update] diplay message - position at bottom of screen
+- [update] Makefile, imageloader - use ResourceDirectory instead of ConfigDirectory
+- [update] themes less transparency
+- [update] item padding = 5 pixel (before: 2 pixel)
+
+2013-09-08: Version 0.1.0
+- [add] parameter to set channel logos path (-l --logo)
+- [add] 3 new themes - green, gold, red (include icons)
+- [update] themes - color values
+- [update] top bar - 2 rows date, separate color for date, background color
+- [update] display tracks - text margin, background color
+- [update] display volume - text margin, new mute logo, progressbar color
+- [update] display message - position (middle of screen), text margin
+- [update] display replay - marks, progressbar, colors, position, speed color
+- [update] epg/rec info - title color, text margin, position
+- [update] dipslay menu - scrollbar width, colors
+- [update] display channel - separate color for following epg, progressbar color, background color logo
+- [fix] many, many fixes
+
+2013-30-07: Version 0.0.2
+- [add] replay marks
+- [change] colors
+- [change] progressbar
+
+2013-29-07: Version 0.0.1
+- Erste Version
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..0f7b0d9
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,135 @@
+#
+# Makefile for a Video Disk Recorder plugin
+#
+# $Id$
+
+# The official name of this plugin.
+# This name will be used in the '-P...' option of VDR to load the plugin.
+# By default the main source file also carries this name.
+# IMPORTANT: the presence of this macro is important for the Make.config
+# file. So it must be defined, even if it is not used here!
+#
+PLUGIN = skinlcarsng
+
+### The version number of this plugin (taken from the main source file):
+
+VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
+
+### The directory environment:
+
+# Use package data if installed...otherwise assume we're under the VDR source directory:
+PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell pkg-config --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
+LIBDIR = $(call PKGCFG,libdir)
+LOCDIR = $(call PKGCFG,locdir)
+PLGCFG = $(call PKGCFG,plgcfg)
+VDRCONFDIR = $(call PKGCFG,configdir)
+PLGRESDIR = $(call PKGCFG,resdir)/plugins/$(PLUGIN)
+TMPDIR ?= /tmp
+
+### The compiler options:
+export CFLAGS = $(call PKGCFG,cflags)
+export CXXFLAGS = $(call PKGCFG,cxxflags)
+
+### Allow user defined options to overwrite defaults:
+
+-include $(PLGCFG)
+
+### The version number of VDR's plugin API:
+APIVERSION = $(call PKGCFG,apiversion)
+
+### The name of the distribution archive:
+
+ARCHIVE = $(PLUGIN)-$(VERSION)
+PACKAGE = vdr-$(ARCHIVE)
+
+### The name of the shared object file:
+
+SOFILE = libvdr-$(PLUGIN).so
+
+### Includes and Defines and Dependencies (add further entries here):
+
+INCLUDES += $(shell pkg-config --cflags Magick++)
+
+DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
+
+LIBS += $(shell pkg-config --libs Magick++)
+
+### The object files (add further files here):
+
+OBJS = lcarsng.o $(PLUGIN).o
+#OBJS = config.o imageloader.o baserender.o displaychannel.o displaymenu.o displaymessage.o \
+ displayreplay.o displaytracks.o displayvolume.o flat.o $(PLUGIN).o
+
+### The main target:
+
+all: $(SOFILE) i18n
+
+### Implicit rules:
+
+%.o: %.c
+ $(CXX) -Wall $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
+
+### Dependencies:
+
+MAKEDEP = $(CXX) -MM -MG
+DEPFILE = .dependencies
+$(DEPFILE): Makefile
+ @$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
+
+-include $(DEPFILE)
+
+### Internationalization (I18N):
+
+PODIR = po
+I18Npo = $(wildcard $(PODIR)/*.po)
+I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
+I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
+I18Npot = $(PODIR)/$(PLUGIN).pot
+
+%.mo: %.po
+ msgfmt -c -o $@ $<
+
+$(I18Npot): $(wildcard *.c)
+ xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
+
+%.po: $(I18Npot)
+ msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
+ @touch $@
+
+$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
+ install -D -m644 $< $@
+
+.PHONY: i18n
+i18n: $(I18Nmo) $(I18Npot)
+
+install-i18n: $(I18Nmsgs)
+
+### Targets:
+
+$(SOFILE): $(OBJS)
+ $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) $(LIBS) -o $@
+
+install-lib: $(SOFILE)
+ install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
+
+install-themes:
+ mkdir -p $(DESTDIR)$(VDRCONFDIR)/themes
+ cp themes/* $(DESTDIR)$(VDRCONFDIR)/themes
+
+install-icons:
+ mkdir -p $(DESTDIR)$(PLGRESDIR)/icons
+ cp -r icons/* $(DESTDIR)$(PLGRESDIR)/icons
+
+install: install-lib install-i18n install-themes install-icons
+
+dist: $(I18Npo) clean
+ @-rm -rf $(TMPDIR)/$(ARCHIVE)
+ @mkdir $(TMPDIR)/$(ARCHIVE)
+ @cp -a * $(TMPDIR)/$(ARCHIVE)
+ @tar czf $(PACKAGE).tgz --exclude .git* --exclude *.o --exclude *.rej --exclude *.orig -C $(TMPDIR) $(ARCHIVE)
+ @-rm -rf $(TMPDIR)/$(ARCHIVE)
+ @echo Distribution package created as $(PACKAGE).tgz
+
+clean:
+ @-rm -f $(PODIR)/*.mo $(PODIR)/*.pot
+ @-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
diff --git a/README b/README
new file mode 100644
index 0000000..4d03923
--- /dev/null
+++ b/README
@@ -0,0 +1,41 @@
+This is a "plugin" for the Video Disk Recorder (VDR).
+
+Written by: Mase <vdr.skinlcarsng@test.test>
+Thanks to: LCARS-Skin from Klaus Schmiedinger
+
+Project's homepage:
+
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+See the file COPYING for more information.
+
+Requirements
+------------
+
+- VDR version >= 1.7.34
+
+Description
+-----------
+skinlcarsng ist ein Skin für den VDR aufbauend auf dem Skin LCARS, der dem VDR original beiliegt.
+Der Skin ist ohne Konfiguration.
+
+Installation
+------------
+Installation wie bei allen VDR Plugins.
+ make
+ make install
+
+Der Skin muss im Menü unter Einstellungen -> OSD ausgewählt werden.
+
+
+Themes
+-------------------------------
+Der Skin ist weitestgehend über Themes anpassbar.
+
+Alle dem VDR beiliegenden LCARS-Themes können hier parallel benutzt werden, z.B. durch verlinken:
+
+ln -s lcars-default.theme lcarsng-default.theme
+
diff --git a/lcarsng.c b/lcarsng.c
new file mode 100644
index 0000000..b1d17e0
--- /dev/null
+++ b/lcarsng.c
@@ -0,0 +1,2397 @@
+/*
+ * skinlcars.c: A VDR skin with Star Trek's "LCARS" layout
+ *
+ * See the main source file 'vdr.c' for copyright information and
+ * how to reach the author.
+ *
+ * $Id: skinlcars.c 3.3 2013/08/18 13:45:36 kls Exp $
+ */
+
+// "Star Trek: The Next Generation"(R) is a registered trademark of Paramount Pictures,
+// registered in the United States Patent and Trademark Office, all rights reserved.
+// The LCARS system is based upon the designs of Michael Okuda and his Okudagrams.
+//
+// "LCARS" is short for "Library Computer Access and Retrieval System".
+// Some resources used for writing this skin can be found at
+// http://www.lcars.org.uk
+// http://www.lcarsdeveloper.com
+// http://www.lcarscom.net
+// http://lds-jedi.deviantart.com/art/LCARS-Swept-Tutorial-213936938
+// http://lds-jedi.deviantart.com/art/LCARS-Button-Tutorial-210783437
+// http://zelldenver.deviantart.com/art/LCARS-Color-Standard-179565780
+// http://www.lcars47.com
+// http://www.bracercom.com/tutorial/content/CoherentLCARSInterface/LCARSCoherentInterface.html
+// http://www.bracercom.com/tutorial/content/lcars_manifesto/the_lcars_manifesto.html
+
+#include "lcarsng.h"
+#include <vdr/font.h>
+#include <vdr/menu.h>
+#include <vdr/osd.h>
+#include <vdr/positioner.h>
+#include <vdr/themes.h>
+#include <vdr/videodir.h>
+
+#include "symbols/arrowdown.xpm"
+#include "symbols/arrowup.xpm"
+#include "symbols/audio.xpm"
+#include "symbols/audioleft.xpm"
+#include "symbols/audioright.xpm"
+#include "symbols/audiostereo.xpm"
+#include "symbols/dolbydigital.xpm"
+#include "symbols/encrypted.xpm"
+#include "symbols/ffwd.xpm"
+#include "symbols/ffwd1.xpm"
+#include "symbols/ffwd2.xpm"
+#include "symbols/ffwd3.xpm"
+#include "symbols/frew.xpm"
+#include "symbols/frew1.xpm"
+#include "symbols/frew2.xpm"
+#include "symbols/frew3.xpm"
+#include "symbols/mute.xpm"
+#include "symbols/pause.xpm"
+#include "symbols/play.xpm"
+#include "symbols/radio.xpm"
+#include "symbols/recording.xpm"
+#include "symbols/sfwd.xpm"
+#include "symbols/sfwd1.xpm"
+#include "symbols/sfwd2.xpm"
+#include "symbols/sfwd3.xpm"
+#include "symbols/srew.xpm"
+#include "symbols/srew1.xpm"
+#include "symbols/srew2.xpm"
+#include "symbols/srew3.xpm"
+#include "symbols/teletext.xpm"
+#include "symbols/volume.xpm"
+
+#define Gap (Setup.FontOsdSize / 5 & ~1) // must be even
+#define TextFrame (Setup.FontOsdSize / TEXT_ALIGN_BORDER)
+#define TextSpacing (2 * TextFrame)
+#define SymbolSpacing TextSpacing
+#define ShowSeenExtent (Setup.FontOsdSize / 5) // pixels by which the "seen" bar extends out of the frame
+
+#define DISKUSAGEALERTLIMIT 95 // percent of disk usage above which the display goes into alert mode
+#define SIGNALDISPLAYDELTA 2 // seconds between subsequent device signal displays
+
+static cTheme Theme;
+cRect availableRect;
+cRect videoWindowRect;
+
+// Color domains:
+
+#define CLR_BACKGROUND 0x99000000
+#define CLR_MAIN_FRAME 0xFFFF9966
+#define CLR_CHANNEL_FRAME 0xFF8A9EC9
+#define CLR_REPLAY_FRAME 0xFFCC6666
+#define CLR_DATE 0xFF99CCFF
+#define CLR_MENU_ITEMS 0xFF9999FF
+#define CLR_TIMER 0xFF99CCFF
+#define CLR_DEVICE 0xFFF1B1AF
+#define CLR_CHANNEL_NAME 0xFF99CCFF
+#define CLR_EVENT_TITLE 0xFF99CCFF
+#define CLR_EVENT_TIME 0xFFFFCC66
+#define CLR_EVENT_SHORTTEXT 0xFFFFCC66
+#define CLR_TEXT 0xFF99CCFF
+#define CLR_TRACK 0xFFFFCC66
+#define CLR_SEEN 0xFFCC99CC
+#define CLR_ALERT 0xFFFF0000
+#define CLR_EXPOSED 0xFF990000
+#define CLR_WHITE 0xFFFFFFFF
+#define CLR_RED 0xFFCC6666
+#define CLR_GREEN 0xFFA0FF99
+#define CLR_YELLOW 0xFFF1DF60
+#define CLR_BLUE 0xFF9A99FF
+#define CLR_BLACK 0xFF000000
+
+// General colors:
+
+THEME_CLR(Theme, clrBackground, CLR_BACKGROUND);
+THEME_CLR(Theme, clrDateFg, CLR_BLACK);
+THEME_CLR(Theme, clrDateBg, CLR_DATE);
+THEME_CLR(Theme, clrTimerFg, CLR_BLACK);
+THEME_CLR(Theme, clrTimerBg, CLR_TIMER);
+THEME_CLR(Theme, clrDeviceFg, CLR_BLACK);
+THEME_CLR(Theme, clrDeviceBg, CLR_DEVICE);
+THEME_CLR(Theme, clrSignalValue, CLR_GREEN);
+THEME_CLR(Theme, clrSignalRest, CLR_RED);
+THEME_CLR(Theme, clrSeen, CLR_SEEN);
+THEME_CLR(Theme, clrTrackName, CLR_TRACK);
+THEME_CLR(Theme, clrAlertFg, CLR_WHITE);
+THEME_CLR(Theme, clrAlertBg, CLR_ALERT);
+THEME_CLR(Theme, clrChannelName, CLR_CHANNEL_NAME);
+THEME_CLR(Theme, clrEventTitle, CLR_EVENT_TITLE);
+THEME_CLR(Theme, clrEventTime, CLR_EVENT_TIME);
+THEME_CLR(Theme, clrEventShortText, CLR_EVENT_SHORTTEXT);
+THEME_CLR(Theme, clrEventDescription, CLR_TEXT);
+
+// Buttons:
+
+THEME_CLR(Theme, clrButtonRedFg, CLR_BLACK);
+THEME_CLR(Theme, clrButtonRedBg, CLR_RED);
+THEME_CLR(Theme, clrButtonGreenFg, CLR_BLACK);
+THEME_CLR(Theme, clrButtonGreenBg, CLR_GREEN);
+THEME_CLR(Theme, clrButtonYellowFg, CLR_BLACK);
+THEME_CLR(Theme, clrButtonYellowBg, CLR_YELLOW);
+THEME_CLR(Theme, clrButtonBlueFg, CLR_BLACK);
+THEME_CLR(Theme, clrButtonBlueBg, CLR_BLUE);
+
+// Messages:
+
+THEME_CLR(Theme, clrMessageStatusFg, CLR_BLACK);
+THEME_CLR(Theme, clrMessageStatusBg, CLR_BLUE);
+THEME_CLR(Theme, clrMessageInfoFg, CLR_BLACK);
+THEME_CLR(Theme, clrMessageInfoBg, CLR_GREEN);
+THEME_CLR(Theme, clrMessageWarningFg, CLR_BLACK);
+THEME_CLR(Theme, clrMessageWarningBg, CLR_YELLOW);
+THEME_CLR(Theme, clrMessageErrorFg, CLR_BLACK);
+THEME_CLR(Theme, clrMessageErrorBg, CLR_RED);
+
+// Volume:
+
+THEME_CLR(Theme, clrVolumeFrame, CLR_MAIN_FRAME);
+THEME_CLR(Theme, clrVolumeSymbol, CLR_BLACK);
+THEME_CLR(Theme, clrVolumeBarUpper, RgbShade(CLR_MAIN_FRAME, -0.2));
+THEME_CLR(Theme, clrVolumeBarLower, CLR_GREEN);
+
+// Channel display:
+
+THEME_CLR(Theme, clrChannelFrameFg, CLR_BLACK);
+THEME_CLR(Theme, clrChannelFrameBg, CLR_CHANNEL_FRAME);
+THEME_CLR(Theme, clrChannelSymbolOn, CLR_BLACK);
+THEME_CLR(Theme, clrChannelSymbolOff, RgbShade(CLR_CHANNEL_FRAME, -0.2));
+THEME_CLR(Theme, clrChannelSymbolRecFg, CLR_WHITE);
+THEME_CLR(Theme, clrChannelSymbolRecBg, CLR_RED);
+
+// Menu:
+
+THEME_CLR(Theme, clrMenuFrameFg, CLR_BLACK);
+THEME_CLR(Theme, clrMenuFrameBg, CLR_MAIN_FRAME);
+THEME_CLR(Theme, clrMenuTitle, CLR_MAIN_FRAME);
+THEME_CLR(Theme, clrMenuMainBracket, CLR_MENU_ITEMS);
+THEME_CLR(Theme, clrMenuTimerRecording, CLR_DEVICE);
+THEME_CLR(Theme, clrMenuDeviceRecording, CLR_TIMER);
+THEME_CLR(Theme, clrMenuItemCurrentFg, CLR_MAIN_FRAME);
+THEME_CLR(Theme, clrMenuItemCurrentBg, RgbShade(CLR_MENU_ITEMS, -0.5));
+THEME_CLR(Theme, clrMenuItemSelectable, CLR_MENU_ITEMS);
+THEME_CLR(Theme, clrMenuItemNonSelectable, CLR_TEXT);
+THEME_CLR(Theme, clrMenuScrollbarTotal, RgbShade(CLR_MAIN_FRAME, 0.2));
+THEME_CLR(Theme, clrMenuScrollbarShown, CLR_SEEN);
+THEME_CLR(Theme, clrMenuScrollbarArrow, CLR_BLACK);
+THEME_CLR(Theme, clrMenuText, CLR_TEXT);
+
+// Replay display:
+
+THEME_CLR(Theme, clrReplayFrameFg, CLR_BLACK);
+THEME_CLR(Theme, clrReplayFrameBg, CLR_REPLAY_FRAME);
+THEME_CLR(Theme, clrReplayPosition, CLR_SEEN);
+THEME_CLR(Theme, clrReplayJumpFg, CLR_BLACK);
+THEME_CLR(Theme, clrReplayJumpBg, CLR_SEEN);
+THEME_CLR(Theme, clrReplayProgressSeen, CLR_SEEN);
+THEME_CLR(Theme, clrReplayProgressRest, RgbShade(CLR_WHITE, -0.2));
+THEME_CLR(Theme, clrReplayProgressSelected, CLR_EXPOSED);
+THEME_CLR(Theme, clrReplayProgressMark, CLR_BLACK);
+THEME_CLR(Theme, clrReplayProgressCurrent, CLR_EXPOSED);
+
+// Track display:
+
+THEME_CLR(Theme, clrTrackFrameFg, CLR_BLACK);
+THEME_CLR(Theme, clrTrackFrameBg, CLR_TRACK);
+THEME_CLR(Theme, clrTrackItemFg, CLR_BLACK);
+THEME_CLR(Theme, clrTrackItemBg, RgbShade(CLR_TRACK, 0.5));
+THEME_CLR(Theme, clrTrackItemCurrentFg, CLR_BLACK);
+THEME_CLR(Theme, clrTrackItemCurrentBg, CLR_TRACK);
+
+// --- Helper functions ------------------------------------------------------
+
+static bool TwoColors = false;
+
+static cOsd *CreateOsd(int Left, int Top, int x0, int y0, int x1, int y1)
+{
+ cOsd *Osd = cOsdProvider::NewOsd(Left, Top);
+ int Bpp[] = { 32, 8, 4, 2, 1 };
+ tArea Area = { x0, y0, x1, y1, 0 };
+ for (unsigned int i = 0; i < sizeof(Bpp) / sizeof(int); i++) {
+ Area.bpp = Bpp[i];
+ if (Osd->CanHandleAreas(&Area, 1) == oeOk) {
+ Osd->SetAreas(&Area, 1);
+ Osd->SetAntiAliasGranularity(20, 16);
+ TwoColors = Area.bpp == 1;
+ break;
+ }
+ }
+ return Osd;
+}
+
+static cFont *CreateTinyFont(int LineHeight)
+{
+ // Creates a font that is not higher than half of LineHeight.
+ LineHeight /= 1.75;
+ int Height = LineHeight;
+ for (;;) {
+ cFont *TinyFont = cFont::CreateFont(Setup.FontOsd, Height);
+ if (Height < 2 || TinyFont->Height() <= LineHeight)
+ return TinyFont;
+ delete TinyFont;
+ Height -= 1;
+ }
+}
+
+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)
+{
+ cString DeviceType = Device->DeviceType();
+ cCamSlot *CamSlot = Device->CamSlot();
+ if (Initial || strcmp(DeviceType, LastDeviceType) || CamSlot != LastCamSlot) {
+ const cFont *font = cFont::GetFont(fontOsd);
+ tColor ColorFg = Theme.Color(clrDeviceFg);
+ tColor ColorBg = Theme.Color(clrDeviceBg);
+ Osd->DrawRectangle(x0, y0, x1 - 1, y1 - 1, ColorBg);
+ int x = x0;
+ // Device number:
+ cString Nr = itoa(Device->DeviceNumber() + 1);
+ int w = max(font->Width(Nr), y1 - y0);
+ Osd->DrawText(x, y0, Nr, ColorFg, ColorBg, font, w, y1 - y0, taCenter);
+ x += w;
+ // Device type:
+ Osd->DrawText(x, y0, DeviceType, ColorFg, ColorBg, TinyFont);
+ xs = max(xs, x + TinyFont->Width(DeviceType));
+ LastDeviceType = DeviceType;
+ // CAM:
+ if (CamSlot) {
+ cString s = cString::sprintf("CAM %d", CamSlot->SlotNumber());
+ Osd->DrawText(x, y1 - TinyFont->Height(), s, ColorFg, ColorBg, TinyFont);
+ xs = max(xs, x + TinyFont->Width(s));
+ }
+ LastCamSlot = CamSlot;
+ return true;
+ }
+ return false;
+}
+
+static void DrawDeviceSignal(cOsd *Osd, const cDevice *Device, int x0, int y0, int x1, int y1, int &LastSignalStrength, int &LastSignalQuality, bool Initial)
+{
+ int SignalStrength = Device->SignalStrength();
+ int SignalQuality = Device->SignalQuality();
+ int d = max((y1 - y0) / 10, 1);
+ int x00 = x0 + d;
+ int x01 = x1 - d;
+ int h = (y1 - y0 - 3 * d) / 2;
+ int w = x01 - x00;
+ int y00 = y0 + d;
+ int y01 = y00 + h;
+ int y03 = y1 - d;
+ int y02 = y03 - h;
+ tColor ColorSignalValue, ColorSignalRest;
+ if (TwoColors) {
+ ColorSignalValue = Theme.Color(clrBackground);
+ ColorSignalRest = Theme.Color(clrMenuFrameBg);
+ }
+ else {
+ ColorSignalValue = Theme.Color(clrSignalValue);
+ ColorSignalRest = Theme.Color(clrSignalRest);
+ }
+ if (SignalStrength >= 0 && (Initial || SignalStrength != LastSignalStrength)) {
+ int s = SignalStrength * w / 100;
+ Osd->DrawRectangle(x00, y00, x00 + s - 1, y01 - 1, ColorSignalValue);
+ Osd->DrawRectangle(x00 + s, y00, x01 - 1, y01 - 1, ColorSignalRest);
+ LastSignalStrength = SignalStrength;
+ }
+ if (SignalQuality >= 0 && (Initial || SignalQuality != LastSignalQuality)) {
+ int q = SignalQuality * w / 100;
+ Osd->DrawRectangle(x00, y02, x00 + q - 1, y03 - 1, ColorSignalValue);
+ Osd->DrawRectangle(x00 + q, y02, x01 - 1, y03 - 1, ColorSignalRest);
+ LastSignalQuality = SignalQuality;
+ }
+}
+
+static void DrawDevicePosition(cOsd *Osd, const cPositioner *Positioner, int x0, int y0, int x1, int y1, int &LastCurrent)
+{
+ int HorizonLeft = Positioner->HorizonLongitude(cPositioner::pdLeft);
+ int HorizonRight = Positioner->HorizonLongitude(cPositioner::pdRight);
+ int HardLimitLeft = cPositioner::NormalizeAngle(HorizonLeft - Positioner->HardLimitLongitude(cPositioner::pdLeft));
+ int HardLimitRight = cPositioner::NormalizeAngle(Positioner->HardLimitLongitude(cPositioner::pdRight) - HorizonRight);
+ int HorizonDelta = cPositioner::NormalizeAngle(HorizonLeft - HorizonRight);
+ int Current = cPositioner::NormalizeAngle(HorizonLeft - Positioner->CurrentLongitude());
+ int Target = cPositioner::NormalizeAngle(HorizonLeft - Positioner->TargetLongitude());
+ int d = (y1 - y0) / 2;
+ int w = x1 - x0 - 2 * d;
+ int l = max(x0 + d, x0 + d + w * HardLimitLeft / HorizonDelta);
+ int r = min(x1 - d, x1 - d - w * HardLimitRight / HorizonDelta) - 1;
+ int c = constrain(x0 + d + w * Current / HorizonDelta, l, r);
+ int t = constrain(x0 + d + w * Target / HorizonDelta, l, r);
+ if (c == LastCurrent)
+ return;
+ if (c > t)
+ swap(c, t);
+ tColor ColorRange, ColorMove;
+ if (TwoColors) {
+ ColorRange = Theme.Color(clrChannelFrameBg);
+ ColorMove = Theme.Color(clrBackground);
+ }
+ else {
+ ColorRange = Theme.Color(clrChannelFrameBg);
+ ColorMove = Theme.Color(clrDeviceBg);
+ }
+ Osd->DrawRectangle(x0, y0, x1 - 1, y1 - 1, Theme.Color(clrBackground));
+ Osd->DrawEllipse(l - d, y0, l, y1 - 1, ColorRange, 7);
+ Osd->DrawRectangle(l, y0, r, y1 - 1, ColorRange);
+ Osd->DrawEllipse(r, y0, r + d, y1 - 1, ColorRange, 5);
+ Osd->DrawEllipse(c - d, y0, c, y1 - 1, ColorMove, 7);
+ Osd->DrawRectangle(c, y0, t, y1 - 1, ColorMove);
+ Osd->DrawEllipse(t, y0, t + d, y1 - 1, ColorMove, 5);
+ LastCurrent = c;
+}
+
+// --- cLCARSNGDisplayChannel ----------------------------------------------
+
+class cLCARSNGDisplayChannel : public cSkinDisplayChannel {
+private:
+ cOsd *osd;
+ int xc00, xc01, xc02, xc03, xc04, xc05, xc06, xc07, xc08, xc09, xc10, xc11, xc12, xc13, xc14, xc15;
+ int yc00, yc01, yc02, yc03, yc04, yc05, yc06, yc07, yc08, yc09, yc10, yc11, yc12;
+ int xs; // starting column for signal display
+ bool withInfo;
+ int lineHeight;
+ cFont *tinyFont;
+ cFont *tallFont;
+ tColor frameColor;
+ bool message;
+ const cEvent *present;
+ bool initial;
+ cString lastDate;
+ int lastSeen;
+ int lastCurrentPosition;
+ int lastDeviceNumber;
+ cString lastDeviceType;
+ cCamSlot *lastCamSlot;
+ int lastSignalStrength;
+ int lastSignalQuality;
+ time_t lastSignalDisplay;
+ tTrackId lastTrackId;
+ static cBitmap bmTeletext, bmRadio, bmAudio, bmDolbyDigital, bmEncrypted, bmRecording;
+ void DrawDate(void);
+ void DrawTrack(void);
+ void DrawSeen(int Current, int Total);
+ void DrawDevice(void);
+ void DrawSignal(void);
+public:
+ cLCARSNGDisplayChannel(bool WithInfo);
+ virtual ~cLCARSNGDisplayChannel();
+ virtual void SetChannel(const cChannel *Channel, int Number);
+ virtual void SetEvents(const cEvent *Present, const cEvent *Following);
+ virtual void SetMessage(eMessageType Type, const char *Text);
+ virtual void SetPositioner(const cPositioner *Positioner);
+ virtual void Flush(void);
+ };
+
+cBitmap cLCARSNGDisplayChannel::bmTeletext(teletext_xpm);
+cBitmap cLCARSNGDisplayChannel::bmRadio(radio_xpm);
+cBitmap cLCARSNGDisplayChannel::bmAudio(audio_xpm);
+cBitmap cLCARSNGDisplayChannel::bmDolbyDigital(dolbydigital_xpm);
+cBitmap cLCARSNGDisplayChannel::bmEncrypted(encrypted_xpm);
+cBitmap cLCARSNGDisplayChannel::bmRecording(recording_xpm);
+
+cLCARSNGDisplayChannel::cLCARSNGDisplayChannel(bool WithInfo)
+{
+ tallFont = cFont::CreateFont(Setup.FontOsd, Setup.FontOsdSize * 1.8);
+ initial = true;
+ present = NULL;
+ lastSeen = -1;
+ lastCurrentPosition = -1;
+ lastDeviceNumber = -1;
+ lastCamSlot = NULL;
+ lastSignalStrength = -1;
+ lastSignalQuality = -1;
+ lastSignalDisplay = 0;
+ memset(&lastTrackId, 0, sizeof(lastTrackId));
+ const cFont *font = cFont::GetFont(fontOsd);
+ withInfo = WithInfo;
+ lineHeight = font->Height();
+ tinyFont = CreateTinyFont(lineHeight);
+ frameColor = Theme.Color(clrChannelFrameBg);
+ message = false;
+ int d = 5 * lineHeight;
+ xc00 = 0;
+ xc01 = xc00 + d / 2;
+ xc02 = xc00 + d;
+ xc03 = xc02 + lineHeight;
+ xc04 = xc02 + d / 4;
+ xc05 = xc02 + d;
+ xc06 = xc05 + Gap;
+ xc15 = cOsd::OsdWidth();
+ xc14 = xc15 - lineHeight;
+ xc13 = xc14 - Gap;
+ xc07 = (xc15 + xc00) / 2;
+ xc08 = xc07 + Gap;
+ xc09 = xc08 + lineHeight;
+ xc10 = xc09 + Gap;
+ xc11 = (xc10 + xc13 + Gap) / 2;
+ xc12 = xc11 + Gap;
+
+ yc00 = 0;
+ yc01 = yc00 + lineHeight;
+ yc02 = yc01 + lineHeight;
+ yc03 = yc02 + Gap;
+ yc04 = yc03 + 2 * lineHeight;
+ yc05 = yc04 + Gap;
+ yc06 = yc05 + 2 * lineHeight;
+
+ yc07 = yc06 + Gap;
+ yc12 = yc07 + 3 * lineHeight + Gap / 2;
+ yc11 = yc12 - lineHeight;
+ yc10 = yc11 - lineHeight;
+ yc09 = yc11 - d / 4;
+ yc08 = yc12 - d / 2;
+
+ xs = 0;
+
+ int y1 = withInfo ? yc12 : yc02;
+ int y0 = cOsd::OsdTop() + (Setup.ChannelInfoPos ? 0 : cOsd::OsdHeight() - y1);
+ osd = CreateOsd(cOsd::OsdLeft(), y0, xc00, yc00, xc15 - 1, y1 - 1);
+ osd->DrawRectangle(xc00, yc00, xc15 - 1, y1 - 1, Theme.Color(clrBackground));
+ // Rectangles:
+ osd->DrawRectangle(xc00, yc00, xc02 - 1, yc02 - 1, frameColor);
+ if (withInfo) {
+ osd->DrawRectangle(xc00, yc03, xc02 - 1, yc04 - 1, frameColor);
+ osd->DrawRectangle(xc00, yc05, xc02 - 1, yc06 - 1, frameColor);
+ // Elbow:
+ osd->DrawRectangle(xc00, yc07, xc01 - 1, yc08 - 1, frameColor);
+ osd->DrawRectangle(xc00, yc08, xc01 - 1, yc12 - 1, clrTransparent);
+ osd->DrawEllipse (xc00, yc08, xc01 - 1, yc12 - 1, frameColor, 3);
+ osd->DrawRectangle(xc01, yc07, xc02 - 1, yc12 - 1, frameColor);
+ osd->DrawEllipse (xc02, yc09, xc04 - 1, yc11 - 1, frameColor, -3);
+ osd->DrawRectangle(xc02, yc11, xc05 - 1, yc12 - 1, frameColor);
+ // Status area:
+ osd->DrawRectangle(xc06, yc11 + lineHeight / 2, xc07 - 1, yc12 - 1, frameColor);
+ osd->DrawRectangle(xc08, yc11, xc09 - 1, yc12 - 1, frameColor);
+ osd->DrawRectangle(xc10, yc11, xc11 - 1, yc12 - 1, Theme.Color(clrDeviceBg));
+// osd->DrawRectangle(xc12, yc11, xc13 - 1, yc12 - 1, Theme.Color(clrDateBg));
+ osd->DrawRectangle(xc14, yc11, xc14 + lineHeight / 2 - 1, yc12 - 1, frameColor);
+ osd->DrawRectangle(xc14 + lineHeight / 2, yc11 + lineHeight / 2, xc15 - 1, yc12 - 1, clrTransparent);
+ osd->DrawEllipse (xc14 + lineHeight / 2, yc11, xc15 - 1, yc12 - 1, frameColor, 5);
+ }
+ // Icons:
+ osd->DrawRectangle(xc14, yc00, xc14 + lineHeight / 2 - 1, yc01 - 1, frameColor);
+ osd->DrawRectangle(xc14 + lineHeight / 2, yc00, xc15 - 1, yc00 + lineHeight / 2 - 1, clrTransparent);
+ osd->DrawEllipse (xc14 + lineHeight / 2, yc00, xc15 - 1, yc01 - 1, frameColor, 5);
+}
+
+cLCARSNGDisplayChannel::~cLCARSNGDisplayChannel()
+{
+ delete tallFont;
+ delete tinyFont;
+ delete osd;
+ cDevice::PrimaryDevice()->ScaleVideo(cRect::Null);
+}
+
+void cLCARSNGDisplayChannel::DrawDate(void)
+{
+ cString s = DayDateTime();
+ if (initial || strcmp(s, lastDate)) {
+ osd->DrawText(xc12, yc00, s, Theme.Color(clrDateFg), Theme.Color(clrDateBg), cFont::GetFont(fontOsd), xc13 - xc12, lineHeight, taRight | taBorder);
+ lastDate = s;
+ }
+}
+
+void cLCARSNGDisplayChannel::DrawTrack(void)
+{
+ cDevice *Device = cDevice::PrimaryDevice();
+ const tTrackId *Track = Device->GetTrack(Device->GetCurrentAudioTrack());
+ if (!Track && *lastTrackId.description || Track && strcmp(lastTrackId.description, Track->description)) {
+ osd->DrawText(xc03, yc07, Track ? Track->description : "", Theme.Color(clrTrackName), Theme.Color(clrBackground), cFont::GetFont(fontOsd), xc07 - xc03);
+ strn0cpy(lastTrackId.description, Track ? Track->description : "", sizeof(lastTrackId.description));
+ }
+}
+
+void cLCARSNGDisplayChannel::DrawSeen(int Current, int Total)
+{
+ if (lastCurrentPosition >= 0)
+ return; // to not interfere with SetPositioner()
+ int Seen = (Total > 0) ? min(xc07 - xc06, int((xc07 - xc06) * double(Current) / Total)) : 0;
+ if (initial || Seen != lastSeen) {
+ int y0 = yc11 - ShowSeenExtent;
+ int y1 = yc11 + lineHeight / 2 - Gap / 2;
+ osd->DrawRectangle(xc06, y0, xc06 + Seen - 1, y1 - 1, Theme.Color(clrSeen));
+ osd->DrawRectangle(xc06 + Seen, y0, xc07 - 1, y1 - 1, Theme.Color(clrBackground));
+ // Restzeit anzeigen
+// if ((Current < Total) && ((Current / 60) > 0))
+// if ((Current / 60) > 0)
+ osd->DrawText(xc00, yc03 + lineHeight, ((Current / 60.0) > 0.1) ? cString::sprintf("-%d", max((int)ceil((Total - Current) / 60.0), 0)) : cString::sprintf(" "), Theme.Color(clrChannelFrameFg), frameColor, cFont::GetFont(fontOsd), xc02 - xc00, 0, taRight | taBorder);
+ lastSeen = Seen;
+ }
+}
+
+void cLCARSNGDisplayChannel::DrawDevice(void)
+{
+ const cDevice *Device = cDevice::ActualDevice();
+ if (DrawDeviceData(osd, Device, xc10, yc11, xc11, yc12, xs, tinyFont, lastDeviceType, lastCamSlot, Device->DeviceNumber() != lastDeviceNumber)) {
+ lastDeviceNumber = Device->DeviceNumber();
+ // Make sure signal meters are redrawn:
+ lastSignalStrength = -1;
+ lastSignalQuality = -1;
+ lastSignalDisplay = 0;
+ }
+}
+
+void cLCARSNGDisplayChannel::DrawSignal(void)
+{
+ time_t Now = time(NULL);
+ if (Now != lastSignalDisplay) {
+ DrawDeviceSignal(osd, cDevice::ActualDevice(), xs + lineHeight / 2, yc11, xc11, yc12, lastSignalStrength, lastSignalQuality, initial);
+ lastSignalDisplay = Now;
+ }
+}
+
+void cLCARSNGDisplayChannel::SetChannel(const cChannel *Channel, int Number)
+{
+ int x = xc13;
+ int xi = x - SymbolSpacing -
+ bmRecording.Width() - SymbolSpacing -
+ bmEncrypted.Width() - SymbolSpacing -
+ bmDolbyDigital.Width() - SymbolSpacing -
+ bmAudio.Width() - SymbolSpacing -
+ max(bmTeletext.Width(), bmRadio.Width()) - SymbolSpacing;
+ osd->DrawRectangle(xc12, yc11, xc13 - 1, yc12 - 1, frameColor);
+ if (Channel && !Channel->GroupSep()) {
+ bool rec = cRecordControls::Active();
+ x -= bmRecording.Width() + SymbolSpacing;
+ osd->DrawBitmap(x, yc11 + (yc12 - yc11 - bmRecording.Height()) / 2, bmRecording, Theme.Color(rec ? clrChannelSymbolRecFg : clrChannelSymbolOff), rec ? Theme.Color(clrChannelSymbolRecBg) : frameColor);
+ x -= bmEncrypted.Width() + SymbolSpacing;
+ osd->DrawBitmap(x, yc11 + (yc12 - yc11 - bmEncrypted.Height()) / 2, bmEncrypted, Theme.Color(Channel->Ca() ? clrChannelSymbolOn : clrChannelSymbolOff), frameColor);
+ x -= bmDolbyDigital.Width() + SymbolSpacing;
+ osd->DrawBitmap(x, yc11 + (yc12 - yc11 - bmDolbyDigital.Height()) / 2, bmDolbyDigital, Theme.Color(Channel->Dpid(0) ? clrChannelSymbolOn : clrChannelSymbolOff), frameColor);
+ x -= bmAudio.Width() + SymbolSpacing;
+ osd->DrawBitmap(x, yc11 + (yc12 - yc11 - bmAudio.Height()) / 2, bmAudio, Theme.Color(Channel->Apid(1) ? clrChannelSymbolOn : clrChannelSymbolOff), frameColor);
+ if (Channel->Vpid()) {
+ x -= bmTeletext.Width() + SymbolSpacing;
+ osd->DrawBitmap(x, yc11 + (yc12 - yc11 - bmTeletext.Height()) / 2, bmTeletext, Theme.Color(Channel->Tpid() ? clrChannelSymbolOn : clrChannelSymbolOff), frameColor);
+ }
+ else if (Channel->Apid(0)) {
+ x -= bmRadio.Width() + SymbolSpacing;
+ osd->DrawBitmap(x, yc11 + (yc12 - yc11 - bmRadio.Height()) / 2, bmRadio, Theme.Color(clrChannelSymbolOn), frameColor);
+ }
+ }
+ cString ChNumber("");
+ cString ChName("");
+ if (Channel) {
+ ChName = Channel->Name();
+ if (!Channel->GroupSep())
+ ChNumber = cString::sprintf("%d%s", Channel->Number(), Number ? "-" : "");
+ }
+ else if (Number)
+ ChNumber = cString::sprintf("%d-", Number);
+ else
+ ChName = ChannelString(NULL, 0);
+ osd->DrawText(xc00, yc00, ChNumber, Theme.Color(clrChannelFrameFg), frameColor, tallFont, xc02 - xc00, yc02 - yc00, taTop | taRight | taBorder);
+ osd->DrawText(xc03, yc00, ChName, Theme.Color(clrChannelName), Theme.Color(clrBackground), tallFont, xi - xc03 - lineHeight, 0, taTop | taLeft);
+ lastSignalDisplay = 0;
+ if (withInfo) {
+ if (Channel) {
+ int x = xc00 + (yc10 - yc09); // compensate for the arc
+ osd->DrawText(x, yc07, cSource::ToString(Channel->Source()), Theme.Color(clrChannelFrameFg), frameColor, cFont::GetFont(fontOsd), xc02 - x, yc10 - yc07, taTop | taRight | taBorder);
+ }
+ DrawDevice();
+ }
+}
+
+void cLCARSNGDisplayChannel::SetEvents(const cEvent *Present, const cEvent *Following)
+{
+ if (!withInfo)
+ return;
+ if (present != Present)
+ lastSeen = -1;
+ present = Present;
+ for (int i = 0; i < 2; i++) {
+ const cEvent *e = !i ? Present : Following;
+ int y = !i ? yc03 : yc05;
+ if (e) {
+ osd->DrawText(xc00, y, e->GetTimeString(), Theme.Color(clrChannelFrameFg), frameColor, cFont::GetFont(fontOsd), xc02 - xc00, 0, taRight | taBorder);
+ osd->DrawText(xc03, y, e->Title(), Theme.Color(clrEventTitle), Theme.Color(clrBackground), cFont::GetFont(fontOsd), xc13 - xc03);
+ osd->DrawText(xc03, y + lineHeight, e->ShortText(), Theme.Color(clrEventShortText), Theme.Color(clrBackground), cFont::GetFont(fontSml), xc13 - xc03);
+ }
+ else {
+ osd->DrawRectangle(xc00, y, xc02 - 1, y + lineHeight, frameColor);
+ osd->DrawRectangle(xc02, y, xc13 - 1, y + 2 * lineHeight, Theme.Color(clrBackground));
+ }
+ }
+}
+
+void cLCARSNGDisplayChannel::SetMessage(eMessageType Type, const char *Text)
+{
+ if (Text) {
+ int x0, x1, y0, y1, y2;
+ if (withInfo) {
+ x0 = xc06;
+ x1 = xc13;
+ y0 = yc11 - ShowSeenExtent;
+ y1 = yc11;
+ y2 = yc12;
+ }
+ else {
+ x0 = xc03;
+ x1 = xc13;
+ y0 = y1 = yc00;
+ y2 = yc02;
+ }
+ osd->SaveRegion(x0, y0, x1 - 1, y2 - 1);
+ if (withInfo)
+ osd->DrawRectangle(xc06, y0, xc07, y1 - 1, Theme.Color(clrBackground)); // clears the "seen" bar
+ osd->DrawText(x0, y1, Text, Theme.Color(clrMessageStatusFg + 2 * Type), Theme.Color(clrMessageStatusBg + 2 * Type), cFont::GetFont(fontSml), x1 - x0, y2 - y1, taCenter);
+ message = true;
+ }
+ else {
+ osd->RestoreRegion();
+ message = false;
+ }
+}
+
+void cLCARSNGDisplayChannel::SetPositioner(const cPositioner *Positioner)
+{
+ if (Positioner) {
+ int y0 = yc11 - ShowSeenExtent;
+ int y1 = yc11 + lineHeight / 2 - Gap / 2;
+ DrawDevicePosition(osd, Positioner, xc06, y0, xc07, y1, lastCurrentPosition);
+ }
+ else {
+ lastCurrentPosition = -1;
+ initial = true; // to have DrawSeen() refresh the progress bar
+ }
+ return;
+}
+
+void cLCARSNGDisplayChannel::Flush(void)
+{
+ if (withInfo) {
+ if (!message) {
+ DrawDate();
+ DrawTrack();
+ DrawDevice();
+ DrawSignal();
+ int Current = 0;
+ int Total = 0;
+ if (present) {
+ time_t t = time(NULL);
+ if (t > present->StartTime())
+ Current = t - present->StartTime();
+ Total = present->Duration();
+ }
+ DrawSeen(Current, Total);
+ }
+ }
+ osd->Flush();
+// cDevice::PrimaryDevice()->ScaleVideo(videoWindowRect);
+ initial = false;
+}
+
+// --- cLCARSNGDisplayMenu -------------------------------------------------
+
+class cLCARSNGDisplayMenu : public cSkinDisplayMenu {
+private:
+ cOsd *osd;
+ int xa00, xa01, xa02, xa03, xa04, xa05, xa06, xa07, xa08, xa09;
+ int yt00, yt01, yt02, yt03, yt04, yt05, yt06, yt07, yt08;
+ int yc00, yc01, yc02, yc03, yc04, yc05, yc06, yc07, yc08, yc09, yc10, yc11;
+ int yb00, yb01, yb02, yb03, yb04, yb05, yb06, yb07, yb08, yb09, yb10, yb11, yb12, yb13, yb14, yb15;
+ int xm00, xm01, xm02, xm03, xm04, xm05, xm06, xm07, xm08;
+ int ym00, ym01, ym02, ym03, ym04, ym05, ym06, ym07;
+ int xs00, xs01, xs02, xs03, xs04, xs05, xs06, xs07, xs08, xs09, xs10, xs11, xs12, xs13;
+ int ys00, ys01, ys02, ys03, ys04, ys05;
+ int xi00, xi01, xi02, xi03;
+ int yi00, yi01;
+ int xb00, xb01, xb02, xb03, xb04, xb05, xb06, xb07, xb08, xb09, xb10, xb11, xb12, xb13, xb14, xb15;
+ int xd00, xd01, xd02, xd03, xd04, xd05, xd06, xd07;
+ int yd00, yd01, yd02, yd03, yd04, yd05;
+ int xs; // starting column for signal display
+ int lineHeight;
+ cFont *tinyFont;
+ cFont *tallFont;
+ tColor frameColor;
+ int currentIndex;
+ cVector<int> deviceOffset;
+ cVector<bool> deviceRecording;
+ cString lastDeviceType[MAXDEVICES];
+ cVector<cCamSlot *> lastCamSlot;
+ cVector<int> lastSignalStrength;
+ cVector<int> lastSignalQuality;
+ bool initial;
+ enum eCurrentMode { cmUnknown, cmLive, cmPlay };
+ eCurrentMode lastMode;
+ cString lastDate;
+ int lastDiskUsageState;
+ bool lastDiskAlert;
+ double lastSystemLoad;
+ int lastTimersState;
+ time_t lastSignalDisplay;
+ int lastLiveIndicatorY;
+ bool lastLiveIndicatorTransferring;
+ const cChannel *lastChannel;
+ const cEvent *lastEvent;
+ const cRecording *lastRecording;
+ cString lastHeader;
+ int lastSeen;
+ static cBitmap bmArrowUp, bmArrowDown, bmTransferMode;
+ void DrawMainFrameUpper(tColor Color);
+ void DrawMainFrameLower(void);
+ void DrawMainButton(const char *Text, int x0, int x1, int x2, int x3, int y0, int y1, tColor ColorFg, tColor ColorBg, const cFont *Font);
+ void DrawMenuFrame(void);
+ void DrawMainBracket(void);
+ void DrawStatusElbows(void);
+ void DrawDate(void);
+ void DrawDisk(void);
+ void DrawLoad(void);
+ void DrawFrameDisplay(void);
+ void DrawScrollbar(int Total, int Offset, int Shown, bool CanScrollUp, bool CanScrollDown);
+ void DrawTimer(const cTimer *Timer, int y, bool MultiRec);
+ void DrawTimers(void);
+ void DrawDevice(const cDevice *Device);
+ void DrawDevices(void);
+ void DrawLiveIndicator(void);
+ void DrawSignals(void);
+ void DrawLive(const cChannel *Channel);
+ void DrawPlay(cControl *Control);
+ void DrawInfo(const cEvent *Event, bool WithTime);
+ void DrawSeen(int Current, int Total);
+ void DrawTextScrollbar(void);
+public:
+ cLCARSNGDisplayMenu(void);
+ virtual ~cLCARSNGDisplayMenu();
+ virtual void Scroll(bool Up, bool Page);
+ virtual int MaxItems(void);
+ virtual void Clear(void);
+ virtual void SetMenuCategory(eMenuCategory MenuCategory);
+ virtual void SetTitle(const char *Title);
+ virtual void SetButtons(const char *Red, const char *Green = NULL, const char *Yellow = NULL, const char *Blue = NULL);
+ virtual void SetMessage(eMessageType Type, const char *Text);
+ virtual void SetItem(const char *Text, int Index, bool Current, bool Selectable);
+ virtual void SetScrollbar(int Total, int Offset);
+ virtual void SetEvent(const cEvent *Event);
+ virtual void SetRecording(const cRecording *Recording);
+ virtual void SetText(const char *Text, bool FixedFont);
+ virtual int GetTextAreaWidth(void) const;
+ virtual const cFont *GetTextAreaFont(bool FixedFont) const;
+ virtual void Flush(void);
+ };
+
+cBitmap cLCARSNGDisplayMenu::bmArrowUp(arrowup_xpm);
+cBitmap cLCARSNGDisplayMenu::bmArrowDown(arrowdown_xpm);
+cBitmap cLCARSNGDisplayMenu::bmTransferMode(play_xpm);
+
+cLCARSNGDisplayMenu::cLCARSNGDisplayMenu(void)
+{
+ tallFont = cFont::CreateFont(Setup.FontOsd, Setup.FontOsdSize * 1.6);
+ initial = true;
+ lastMode = cmUnknown;
+ lastChannel = NULL;
+ lastEvent = NULL;
+ lastRecording = NULL;
+ lastSeen = -1;
+ lastTimersState = -1;
+ lastSignalDisplay = 0;
+ lastLiveIndicatorY = -1;
+ lastLiveIndicatorTransferring = false;
+ lastDiskUsageState = -1;
+ lastDiskAlert = false;
+ lastSystemLoad = -1;
+ const cFont *font = cFont::GetFont(fontOsd);
+ lineHeight = font->Height();
+ tinyFont = CreateTinyFont(lineHeight);
+ frameColor = Theme.Color(clrMenuFrameBg);
+ currentIndex = -1;
+ // The outer frame:
+ int d = 5 * lineHeight;
+ xa00 = 0;
+ xa01 = xa00 + d / 2;
+ xa02 = xa00 + d;
+ xa03 = xa02 + lineHeight;
+ xa04 = xa02 + d / 4;
+ xa05 = xa02 + d;
+ xa06 = xa05 + Gap;
+ xa09 = cOsd::OsdWidth();
+ xa08 = xa09 - lineHeight;
+ xa07 = xa08 - Gap;
+
+ yt00 = 0;
+ yt01 = yt00 + lineHeight;
+ yt02 = yt01 + lineHeight;
+ yt03 = yt01 + d / 4;
+ yt04 = yt02 + Gap;
+ yt05 = yt00 + d / 2;
+ yt06 = yt04 + 2 * lineHeight;
+ yt07 = yt06 + Gap;
+ yt08 = yt07 + 2 * lineHeight;
+
+// yc00 = yt06 + Gap;
+ yc00 = yt08 + Gap;
+// yc05 = yc00 + 3 * lineHeight + Gap / 2; // Button in der Mitte
+ yc05 = yc00 + 5 * lineHeight + Gap / 2;
+ yc04 = yc05 - lineHeight;
+ yc03 = yc04 - lineHeight;
+ yc02 = yc04 - d / 4;
+ yc01 = yc05 - d / 2;
+
+ yc06 = yc05 + Gap;
+// yc06 = yc05 + 2 * lineHeight + Gap; // Button in der Mitte
+ yc07 = yc06 + lineHeight;
+ yc08 = yc07 + lineHeight;
+ yc09 = yc07 + d / 4;
+ yc10 = yc06 + d / 2;
+ yc11 = yc06 + 3 * lineHeight + Gap / 2;
+
+ yb00 = yc11 + Gap;
+ yb01 = yb00 + 2 * lineHeight;
+ yb02 = yb01 + Gap;
+ yb03 = yb02 + 2 * lineHeight;
+ yb04 = yb03 + Gap; // Load
+ yb05 = yb04 + 1 * lineHeight; // Load %
+ yb06 = yb05 + Gap;
+ yb07 = yb06 + 2 * lineHeight;
+ yb08 = yb07 + Gap;
+
+ yb15 = cOsd::OsdHeight();
+ yb14 = yb15 - lineHeight;
+ yb13 = yb14 - lineHeight;
+ yb12 = yb14 - d / 4;
+ yb11 = yb15 - d / 2;
+// yb10 = yb13 - Gap - 2 * lineHeight; // VDR
+ yb10 = yb13 - Gap - lineHeight;
+ yb09 = yb10 - Gap;
+
+ // Compensate for large font size:
+ if (yb09 - yb08 < 2 * lineHeight) {
+ yb08 = yb06;
+ yb06 = 0; // drop empty rectangle
+ }
+ if (yb09 - yb08 < 2 * lineHeight) {
+ yb05 = yb09;
+ yb08 = 0; // drop "LCARSNG" display
+ }
+ if (yb05 - yb04 < 1 * lineHeight) {
+ yb03 = yb09;
+ yb04 = 0; // drop "LOAD" display
+ }
+ if (yb03 - yb02 < 2 * lineHeight) {
+ yb01 = yb09;
+ yb02 = 0; // drop "DISK" display
+ }
+ // Anything else is just insanely large...
+
+ // The main command menu:
+ xm00 = xa03;
+ xm01 = xa05;
+ xm02 = xa06;
+ xm08 = (xa09 + xa00) / 2;
+ xm07 = xm08 - lineHeight;
+ xm06 = xm07 - lineHeight / 2;
+ xm05 = xm06 - lineHeight / 2;
+ xm04 = xm05 - lineHeight;
+ xm03 = xm04 - Gap;
+ ym00 = yc08; // Bezug Menü oben
+ ym01 = ym00 + lineHeight / 2;
+ ym02 = ym01 + lineHeight / 2;
+ ym03 = ym02 + Gap;
+ ym07 = yb15;
+ ym06 = ym07 - lineHeight / 2;
+ ym05 = ym06 - lineHeight / 2;
+ ym04 = ym05 - Gap;
+
+ // The status area:
+ xs00 = xm08 + Gap + lineHeight + Gap;
+ xs13 = xa09; //cOsd::OsdWidth()
+ xs12 = xa08;
+ xs11 = xa07;
+ xs05 = (xs00 + xs11 + Gap) / 2;
+ xs04 = xs05 - lineHeight / 2;
+ xs03 = xs04 - lineHeight / 2;
+ xs02 = xs03 - 2 * lineHeight;
+ xs01 = xs02 - Gap;
+ xs06 = xs05 + Gap;
+ xs07 = xs06 + lineHeight / 2;
+ xs08 = xs07 + lineHeight / 2;
+ xs09 = xs08 + 2 * lineHeight;
+ xs10 = xs09 + Gap;
+ ys00 = yc06; // Bezug Status oben
+ ys01 = ys00 + lineHeight;
+ ys02 = ys01 + lineHeight / 2;
+ ys04 = ys01 + lineHeight;
+ ys03 = ys04 - Gap;
+ ys05 = yb15;
+
+ // The color buttons in submenus:
+ xb00 = xa06;
+ xb15 = xa07;
+ int w = (xa08 - xa06) / 4;
+ xb01 = xb00 + lineHeight / 2;
+ xb02 = xb01 + Gap;
+ xb04 = xb00 + w;
+ xb03 = xb04 - Gap;
+ xb05 = xb04 + lineHeight / 2;
+ xb06 = xb05 + Gap;
+ xb08 = xb04 + w;
+ xb07 = xb08 - Gap;
+ xb09 = xb08 + lineHeight / 2;
+ xb10 = xb09 + Gap;
+ xb12 = xb08 + w;
+ xb11 = xb12 - Gap;
+ xb13 = xb12 + lineHeight / 2;
+ xb14 = xb13 + Gap;
+
+ // The color buttons in the main menu:
+ int r = lineHeight;
+// xd07 = xa09;
+ xd07 = xm05 - Gap;
+ xd06 = xd07 - r;
+ xd05 = xd06 - 5 * r;
+ xd04 = xd05 - r;
+ xd03 = xd04 - Gap;
+ xd02 = xd03 - r;
+ xd01 = xd02 - 5 * r;
+ xd00 = xd01 - r;
+ yd00 = yt00;
+ yd05 = yc04 - 3 * Gap;
+// yd05 = yc06 - Gap; // Button in der Mitte
+ yd04 = yd05 - r; //0.85 * r; // Button in der Mitte
+ yd03 = yd04 - Gap;
+ yd02 = yd03 - r; //0.85 * r; // Button in der Mitte
+ yd01 = yd02 - Gap;
+
+ xs = 0;
+
+ osd = CreateOsd(cOsd::OsdLeft(), cOsd::OsdTop(), xa00, yt00, xa09 - 1, yb15 - 1);
+}
+
+cLCARSNGDisplayMenu::~cLCARSNGDisplayMenu()
+{
+ delete tallFont;
+ delete tinyFont;
+ delete osd;
+ cDevice::PrimaryDevice()->ScaleVideo(cRect::Null);
+}
+
+void cLCARSNGDisplayMenu::SetMenuCategory(eMenuCategory MenuCategory)
+{
+ if (initial || MenuCategory != cSkinDisplayMenu::MenuCategory()) {
+ cSkinDisplayMenu::SetMenuCategory(MenuCategory);
+ initial = true;
+ osd->DrawRectangle(xa00, yt00, xa09 - 1, yb15 - 1, Theme.Color(clrBackground));
+ switch (MenuCategory) {
+ case mcMain:
+ case mcSetup:
+ case mcCommand:
+ yi00 = ym03;
+ yi01 = ym04;
+ xi00 = xm00;
+ xi01 = xm03;
+ xi02 = xm04;
+ xi03 = xm05;
+ lastTimersState = -1;
+ DrawMainFrameLower();
+ DrawMainBracket();
+ DrawStatusElbows();
+ break;
+ case mcChannel:
+ osd->DrawRectangle(xa00, yt00, xa09 - 1, yb15 - 1, 0x00000000);
+ yi00 = ym03;
+ yi01 = ym04;
+ xi00 = xm00;
+ xi01 = xm03;
+ xi02 = xm04;
+ xi03 = xm05;
+ DrawMainBracket();
+ break;
+ case mcSchedule:
+ case mcScheduleNow:
+ case mcScheduleNext:
+ case mcEvent:
+ case mcRecording:
+ case mcRecordingInfo:
+ case mcTimer:
+ case mcTimerEdit:
+ yi00 = ym00;
+ yi01 = ym07;
+ xi00 = xa03;
+ xi01 = xa07;
+ xi02 = xa08;
+ xi03 = xa09;
+ DrawMainFrameLower();
+ DrawMainBracket();
+ break;
+ default:
+ yi00 = yt02;
+ yi01 = yb13;
+ xi00 = xa03;
+ xi01 = xa07;
+ xi02 = xa08;
+ xi03 = xa09;
+ DrawMenuFrame();
+ }
+ }
+}
+
+void cLCARSNGDisplayMenu::DrawMainFrameUpper(tColor Color)
+{
+ // Top left rectangles:
+ osd->DrawRectangle(xa00, yt00, xa02 - 1, yt02 - 1, Color);
+ osd->DrawRectangle(xa00, yt04, xa02 - 1, yt06 - 1, Color);
+ osd->DrawRectangle(xa00, yt07, xa02 - 1, yt08 - 1, Color);
+ // Upper elbow:
+ osd->DrawRectangle(xa00, yc00, xa01 - 1, yc01 - 1, Color);
+ osd->DrawEllipse (xa00, yc01, xa01 - 1, yc05 - 1, Color, 3);
+ osd->DrawRectangle(xa01, yc00, xa02 - 1, yc05 - 1, Color);
+ osd->DrawEllipse (xa02, yc02, xa04 - 1, yc04 - 1, Color, -3);
+ osd->DrawRectangle(xa02, yc04, xa05 - 1, yc05 - 1, Color);
+ // Upper delimiter:
+ osd->DrawRectangle(xa06, yc04 + lineHeight / 2, xm03 - 1, yc05 - 1, Color);
+ osd->DrawRectangle(xm03 + Gap, yc04 + lineHeight / 2, xm07 - 1, yc05 - 1, Color);
+ // Top right rectangles:
+ osd->DrawRectangle(xm07, yt00, xm08 - 1, yc04 -Gap - 1, Color);
+ osd->DrawEllipse (xm07, yc04, xm08 - 1, yc05 - 1, Color, 4);
+ osd->DrawEllipse (xm05, yc04, xm07 - 1, yc05 - 1 - lineHeight / 2, Color, -4);
+}
+
+void cLCARSNGDisplayMenu::DrawMainFrameLower(void)
+{
+// unterer gelber Rahmen
+ const cFont *font = cFont::GetFont(fontOsd);
+ // Lower elbow:
+ osd->DrawRectangle(xa00, yc10, xa01 - 1, yc11 - 1, frameColor);
+ osd->DrawEllipse (xa00, yc06, xa01 - 1, yc10 - 1, frameColor, 2);
+ osd->DrawRectangle(xa01, yc06, xa02 - 1, yc11 - 1, frameColor);
+ osd->DrawEllipse (xa02, yc07, xa04 - 1, yc09 - 1, frameColor, -2);
+ osd->DrawRectangle(xa02, yc06, xa05 - 1, yc07 - 1, frameColor);
+ // Lower delimiter:
+ osd->DrawRectangle(xa06, yc06, xm03 - 1, yc07 - lineHeight / 2 - 1, frameColor);
+ osd->DrawRectangle(xm03 + Gap, yc06, xm08 - 1, yc07 - 1, frameColor);
+ osd->DrawRectangle(xm08 + Gap, yc06, xs00 - Gap - 1, yc07 - 1, frameColor);
+ // VDR version:
+ osd->DrawRectangle(xa00, yb10, xa02 - 1, yb15 - 1, frameColor);
+ osd->DrawText(xa00, yb10, "VDR", Theme.Color(clrMenuFrameFg), frameColor, tallFont, xa02 - xa00, yb11 - yb10, taTop | taRight | taBorder);
+ osd->DrawText(xa00, yb15 - lineHeight, VDRVERSION, Theme.Color(clrMenuFrameFg), frameColor, font, xa02 - xa00, lineHeight, taBottom | taRight | taBorder);
+}
+
+void cLCARSNGDisplayMenu::DrawMainButton(const char *Text, int x0, int x1, int x2, int x3, int y0, int y1, tColor ColorFg, tColor ColorBg, const cFont *Font)
+{
+ int h = y1 - y0;
+ osd->DrawEllipse(x0, y0, x1 - 1, y1 - 1, ColorBg, 7);
+ osd->DrawText(x1, y0, Text, ColorFg, ColorBg, Font, x2 - x1, h, taBottom | taRight);
+ osd->DrawEllipse(x2, y0, x3 - 1, y1 - 1, ColorBg, 5);
+}
+
+void cLCARSNGDisplayMenu::DrawMenuFrame(void)
+{
+ // Upper elbow:
+ osd->DrawRectangle(xa00, yt05, xa01 - 1, yt06 - 1, frameColor);
+ osd->DrawRectangle(xa00, yt00, xa01 - 1, yt05 - 1, clrTransparent);
+ osd->DrawEllipse (xa00, yt00, xa01 - 1, yt05 - 1, frameColor, 2);
+ osd->DrawRectangle(xa01, yt00, xa02 - 1, yt06 - 1, frameColor);
+ osd->DrawEllipse (xa02, yt01, xa04 - 1, yt03 - 1, frameColor, -2);
+ osd->DrawRectangle(xa02, yt00, xa05 - 1, yt01 - 1, frameColor);
+ osd->DrawRectangle(xa06, yt00, xa07 - 1, yt01 - 1, frameColor);
+ osd->DrawRectangle(xa08, yt00, xa08 + lineHeight / 2 - 1, yt01 - 1, frameColor);
+ osd->DrawRectangle(xa08 + lineHeight / 2, yt00, xa09 - 1, yt00 + lineHeight / 2 - 1, clrTransparent);
+ osd->DrawEllipse (xa08 + lineHeight / 2, yt00, xa09 - 1, yt01 - 1, frameColor, 5);
+ // Center part:
+ osd->DrawRectangle(xa00, yt06 + Gap, xa02 - 1, yc00 - 1 - Gap, frameColor);
+ osd->DrawRectangle(xa00, yc00, xa02 - 1, yc11 - 1, frameColor);
+ // Lower elbow:
+ osd->DrawRectangle(xa00, yb10, xa02 - 1, yb11 - 1, frameColor);
+ osd->DrawRectangle(xa00, yb11, xa01 - 1, yb15 - 1, clrTransparent);
+ osd->DrawEllipse (xa00, yb11, xa01 - 1, yb15 - 1, frameColor, 3);
+ osd->DrawRectangle(xa01, yb11, xa02 - 1, yb15 - 1, frameColor);
+ osd->DrawEllipse (xa02, yb12, xa04 - 1, yb14 - 1, frameColor, -3);
+ osd->DrawRectangle(xa02, yb14, xa05 - 1, yb15 - 1, frameColor);
+ osd->DrawRectangle(xa08, yb14, xa08 + lineHeight / 2 - 1, yb15 - 1, frameColor);
+ osd->DrawRectangle(xa08 + lineHeight / 2, yb14 + lineHeight / 2, xa09 - 1, yb15 - 1, clrTransparent);
+ osd->DrawEllipse (xa08 + lineHeight / 2, yb14, xa09 - 1, yb15 - 1, frameColor, 5);
+ osd->DrawText(xa00, yb10, "VDR", Theme.Color(clrMenuFrameFg), frameColor, tallFont, xa02 - xa00, yb11 - yb10, taTop | taRight | taBorder);
+ // Color buttons:
+ tColor lutBg[] = { clrButtonRedBg, clrButtonGreenBg, clrButtonYellowBg, clrButtonBlueBg };
+ osd->DrawRectangle(xb00, yb14, xb01 - 1, yb15 - 1, Theme.Color(lutBg[Setup.ColorKey0]));
+ osd->DrawRectangle(xb04, yb14, xb05 - 1, yb15 - 1, Theme.Color(lutBg[Setup.ColorKey1]));
+ osd->DrawRectangle(xb08, yb14, xb09 - 1, yb15 - 1, Theme.Color(lutBg[Setup.ColorKey2]));
+ osd->DrawRectangle(xb12, yb14, xb13 - 1, yb15 - 1, Theme.Color(lutBg[Setup.ColorKey3]));
+}
+
+void cLCARSNGDisplayMenu::DrawDate(void)
+{
+ cString s = DayDateTime();
+ if (initial || strcmp(s, lastDate)) {
+ const cFont *font = cFont::GetFont(fontOsd);
+ tColor ColorFg = Theme.Color(clrDateFg);
+ tColor ColorBg = Theme.Color(clrDateBg);
+ lastDate = s;
+ const char *t = strrchr(s, ' ');
+ osd->DrawText(xa00, yb01 - lineHeight, t, ColorFg, ColorBg, font, xa02 - xa00, lineHeight, taBottom | taRight | taBorder);
+ s.Truncate(t - s);
+ osd->DrawText(xa00, yb00, s, ColorFg, ColorBg, font, xa02 - xa00, yb01 - yb00 - lineHeight, taTop | taRight | taBorder);
+ }
+}
+
+void cLCARSNGDisplayMenu::DrawDisk(void)
+{
+ if (yb02) {
+ if (cVideoDiskUsage::HasChanged(lastDiskUsageState) || initial) { // must call HasChanged() first, or it shows an outdated value in the 'initial' case!
+ const cFont *font = cFont::GetFont(fontOsd);
+ int DiskUsage = cVideoDiskUsage::UsedPercent();
+ bool DiskAlert = DiskUsage > DISKUSAGEALERTLIMIT;
+ tColor ColorFg = DiskAlert ? Theme.Color(clrAlertFg) : Theme.Color(clrMenuFrameFg);
+ tColor ColorBg = DiskAlert ? Theme.Color(clrAlertBg) : frameColor;
+ if (initial || DiskAlert != lastDiskAlert)
+ osd->DrawText(xa00, yb02, tr("DISK"), ColorFg, ColorBg, tinyFont, xa02 - xa00, yb03 - yb02, taTop | taLeft | taBorder);
+ osd->DrawText(xa01, yb02, cString::sprintf("%02d%s", DiskUsage, "%"), ColorFg, ColorBg, font, xa02 - xa01, lineHeight, taBottom | taRight | taBorder);
+ osd->DrawText(xa00, yb03 - lineHeight, cString::sprintf("%02d:%02d", cVideoDiskUsage::FreeMinutes() / 60, cVideoDiskUsage::FreeMinutes() % 60), ColorFg, ColorBg, font, xa02 - xa00, 0, taBottom | taRight | taBorder);
+ lastDiskAlert = DiskAlert;
+ }
+ }
+}
+
+void cLCARSNGDisplayMenu::DrawLoad(void)
+{
+ if (yb04) {
+ tColor ColorFg = Theme.Color(clrMenuFrameFg);
+ tColor ColorBg = frameColor;
+ if (initial)
+ osd->DrawText(xa00, yb04, tr("LOAD"), ColorFg, ColorBg, tinyFont, xa02 - xa00, yb05 - yb04, taTop | taLeft | taBorder);
+ double SystemLoad;
+ if (getloadavg(&SystemLoad, 1) > 0) {
+ if (initial || SystemLoad != lastSystemLoad) {
+ osd->DrawText(xa01, yb04, cString::sprintf("%.1f", SystemLoad), ColorFg, ColorBg, cFont::GetFont(fontOsd), xa02 - xa01, lineHeight, taBottom | taRight | taBorder);
+ lastSystemLoad = SystemLoad;
+ }
+ }
+ }
+}
+
+void cLCARSNGDisplayMenu::DrawMainBracket(void)
+{
+ const cFont *font = cFont::GetFont(fontOsd);
+ tColor Color = Theme.Color(clrMenuMainBracket);
+ if (MenuCategory() != mcSchedule && MenuCategory() != mcScheduleNow && MenuCategory() != mcScheduleNext && MenuCategory() != mcEvent && MenuCategory() != mcRecording && MenuCategory() != mcRecordingInfo && MenuCategory() != mcTimer && MenuCategory() != mcTimerEdit) {
+ osd->DrawRectangle(xm00, ym00, xm01 - 1, ym01 - 1, Color);
+ osd->DrawRectangle(xm02, ym00, xm07 - 1, ym01 - 1, Color);
+ osd->DrawEllipse (xm07, ym00, xm08 - 1, ym02 - 1, Color, 1);
+ osd->DrawEllipse (xm06, ym01, xm07 - 1, ym02 - 1, Color, -1);
+ osd->DrawRectangle(xm07, ym03, xm08 - 1, ym04 - 1, Color);
+ osd->DrawEllipse (xm06, ym05, xm07 - 1, ym06 - 1, Color, -4);
+ osd->DrawEllipse (xm07, ym05, xm08 - 1, ym07 - 1, Color, 4);
+ osd->DrawRectangle(xm02, ym06, xm07 - 1, ym07 - 1, Color);
+ osd->DrawRectangle(xm00, ym06, xm01 - 1, ym07 - 1, Color);
+ }
+ if (MenuCategory() == mcSetup)
+ osd->DrawText(xm02, ys00, tr("Setup"), Theme.Color(clrMenuFrameFg), frameColor, font, xm04 - xm02 - Gap, lineHeight, taBottom | taLeft | taBorder);
+ if (MenuCategory() == mcCommand)
+ osd->DrawText(xm02, ys00, tr("Commands"), Theme.Color(clrMenuFrameFg), frameColor, font, xm04 - xm02 - Gap, lineHeight, taBottom | taLeft | taBorder);
+ if (MenuCategory() == mcChannel)
+ osd->DrawText(xm02, ys00, tr("Channels"), Theme.Color(clrMenuFrameFg), frameColor, font, xm04 - xm02 - Gap, lineHeight, taBottom | taLeft | taBorder);
+ if (MenuCategory() != mcMain && MenuCategory() != mcSchedule && MenuCategory() != mcScheduleNow && MenuCategory() != mcScheduleNext && MenuCategory() != mcEvent && MenuCategory() != mcRecording && MenuCategory() != mcRecordingInfo && MenuCategory() != mcTimer && MenuCategory() != mcTimerEdit) {
+ osd->DrawRectangle(xm04 - Gap, ym00, xm04, ym01 - 1, Theme.Color(clrBackground));
+ osd->DrawRectangle(xm04 - Gap, ym06, xm04, ym07 - 1, Theme.Color(clrBackground));
+ }
+}
+
+void cLCARSNGDisplayMenu::DrawStatusElbows(void)
+{
+ const cFont *font = cFont::GetFont(fontOsd);
+ osd->DrawText (xs00, ys00, tr("TIMERS"), Theme.Color(clrMenuFrameFg), frameColor, font, xs01 - xs00, lineHeight, taBottom | taLeft | taBorder);
+ osd->DrawRectangle(xs02, ys00, xs03 - 1, ys01 - 1, frameColor);
+ osd->DrawEllipse (xs03, ys00, xs05 - 1, ys01 - 1, frameColor, 1);
+ osd->DrawEllipse (xs03, ys01, xs04 - 1, ys02 - 1, frameColor, -1);
+ osd->DrawRectangle(xs04, ys01, xs05 - 1, ys03 - 1, frameColor);
+ osd->DrawRectangle(xs04, ys04, xs05 - 1, ys05 - 1, frameColor);
+ osd->DrawText (xs10, ys00, tr("DEVICES"), Theme.Color(clrMenuFrameFg), frameColor, font, xs11 - xs10, lineHeight, taBottom | taRight | taBorder);
+ osd->DrawRectangle(xs08, ys00, xs09 - 1, ys01 - 1, frameColor);
+ osd->DrawEllipse (xs06, ys00, xs08 - 1, ys01 - 1, frameColor, 2);
+ osd->DrawEllipse (xs07, ys01, xs08 - 1, ys02 - 1, frameColor, -2);
+ osd->DrawRectangle(xs06, ys01, xs07 - 1, ys03 - 1, frameColor);
+ osd->DrawRectangle(xs06, ys04, xs07 - 1, ys05 - 1, frameColor);
+ osd->DrawRectangle(xs12, ys00, xs13 - 1, ys01 - 1, frameColor);
+}
+
+void cLCARSNGDisplayMenu::DrawFrameDisplay(void)
+{
+ if (MenuCategory() != mcChannel) {
+ DrawDate();
+ DrawDisk();
+ DrawLoad();
+ if (initial) {
+ if (yb06)
+ osd->DrawRectangle(xa00, yb06, xa02 - 1, yb07 - 1, frameColor);
+ if (yb08) {
+ const cFont *font = cFont::GetFont(fontOsd);
+ osd->DrawRectangle(xa00, yb08, xa02 - 1, yb09 - 1, frameColor);
+ osd->DrawText(xa00, yb09 - lineHeight, "LCARSNG", Theme.Color(clrMenuFrameFg), frameColor, font, xa02 - xa00, lineHeight, taBottom | taRight | taBorder);
+ }
+ }
+ }
+}
+
+void cLCARSNGDisplayMenu::DrawScrollbar(int Total, int Offset, int Shown, bool CanScrollUp, bool CanScrollDown)
+{
+ int x0, x1, tt, tb;
+ tColor ClearColor;
+ if (MenuCategory() == mcMain || MenuCategory() == mcSetup || MenuCategory() == mcCommand || MenuCategory() == mcChannel) {
+ x0 = xm07;
+ x1 = xm08;
+ tt = ym03;
+ tb = ym04;
+ ClearColor = Theme.Color(clrMenuMainBracket);
+ }
+ else {
+ x0 = xa02 + Gap;
+ x1 = x0 + lineHeight / 2;
+ ClearColor = Theme.Color(clrBackground);
+ int d = TextFrame;
+ if (MenuCategory() == mcSchedule || MenuCategory() == mcScheduleNow || MenuCategory() == mcScheduleNext || MenuCategory() == mcEvent || MenuCategory() == mcRecording || MenuCategory() == mcRecordingInfo || MenuCategory() == mcTimer || MenuCategory() == mcTimerEdit) {
+ tt = yb00;
+ tb = yb07 + lineHeight + Gap;
+ }
+ else {
+ tt = yc00;
+ tb = yc11;
+ if (CanScrollUp)
+ osd->DrawBitmap(xa02 - bmArrowUp.Width() - d, tt + d, bmArrowUp, Theme.Color(clrMenuScrollbarArrow), frameColor);
+ else
+ osd->DrawRectangle(xa02 - bmArrowUp.Width() - d, tt + d, xa02 - d - 1, tt + d + bmArrowUp.Height() - 1, frameColor);
+ if (CanScrollDown)
+ osd->DrawBitmap(xa02 - bmArrowDown.Width() - d, tb - d - bmArrowDown.Height(), bmArrowDown, Theme.Color(clrMenuScrollbarArrow), frameColor);
+ else
+ osd->DrawRectangle(xa02 - bmArrowDown.Width() - d, tb - d - bmArrowDown.Height(), xa02 - d - 1, tb - d - 1, frameColor);
+ }
+ }
+ if (Total > 0 && Total > Shown) {
+ int sw = x1 - x0;
+ int sh = max(int((tb - tt) * double(Shown) / Total + 0.5), sw);
+ int st = min(int(tt + (tb - tt) * double(Offset) / Total + 0.5), tb - sh);
+ int sb = min(st + sh, tb);
+ osd->DrawRectangle(x0, tt, x1 - 1, tb - 1, Theme.Color(clrMenuScrollbarTotal));
+ osd->DrawRectangle(x0, st, x1 - 1, sb - 1, Theme.Color(clrMenuScrollbarShown));
+ }
+ else if (MenuCategory() != mcMain && MenuCategory() != mcSetup && MenuCategory() != mcCommand && MenuCategory() != mcChannel)
+ osd->DrawRectangle(x0, tt, x1 - 1, tb - 1, ClearColor);
+}
+
+void cLCARSNGDisplayMenu::DrawTimer(const cTimer *Timer, int y, bool MultiRec)
+{
+ // The timer data:
+ bool Alert = !Timer->Recording() && Timer->Pending();
+ tColor ColorFg = Alert ? Theme.Color(clrAlertFg) : Theme.Color(clrTimerFg);
+ tColor ColorBg = Alert ? Theme.Color(clrAlertBg) : Theme.Color(clrTimerBg);
+ osd->DrawRectangle(xs00, y, xs03 - 1, y + lineHeight - 1, ColorBg);
+ cString Date;
+ if (Timer->Recording())
+ Date = cString::sprintf("-%s", *TimeString(Timer->StopTime()));
+ else {
+ time_t Now = time(NULL);
+ cString Today = WeekDayName(Now);
+ cString Time = TimeString(Timer->StartTime());
+ cString Day = WeekDayName(Timer->StartTime());
+ if (Timer->StartTime() > Now + 6 * SECSINDAY)
+ Date = DayDateTime(Timer->StartTime());
+ else if (strcmp(Day, Today) != 0)
+ Date = cString::sprintf("%s %s", *Day, *Time);
+ else
+ Date = Time;
+ }
+ if (Timer->Flags() & tfVps)
+ Date = cString::sprintf("VPS %s", *Date);
+ const cChannel *Channel = Timer->Channel();
+ const cEvent *Event = Timer->Event();
+ int d = max(TextFrame / 2, 1);
+ if (Channel) {
+ osd->DrawText(xs00 + d, y, Channel->Name(), ColorFg, ColorBg, tinyFont, xs03 - xs00 - d);
+ osd->DrawText(xs03 - tinyFont->Width(Date) - d, y, Date, ColorFg, ColorBg, tinyFont);
+ }
+ if (Event)
+ osd->DrawText(xs00 + d, y + lineHeight - tinyFont->Height(), Event->Title(), ColorFg, ColorBg, tinyFont, xs03 - xs00 - 2 * d);
+ // The timer recording indicator:
+ if (Timer->Recording())
+ osd->DrawRectangle(xs03 + Gap, y - (MultiRec ? Gap : 0), xs04 - Gap / 2 - 1, y + lineHeight - 1, Theme.Color(clrMenuTimerRecording));
+}
+
+void cLCARSNGDisplayMenu::DrawTimers(void)
+{
+ if (Timers.Modified(lastTimersState)) {
+ deviceRecording.Clear();
+ const cFont *font = cFont::GetFont(fontOsd);
+ osd->DrawRectangle(xs00, ys04, xs04 - 1, ys05 - 1, Theme.Color(clrBackground));
+ osd->DrawRectangle(xs07, ys04, xs13 - 1, ys05 - 1, Theme.Color(clrBackground));
+ cSortedTimers SortedTimers;
+ cVector<int> FreeDeviceSlots;
+ int NumDevices = 0;
+ int y = ys04;
+ // Timers and recording devices:
+ while (1) {
+ int NumTimers = 0;
+ const cDevice *Device = NULL;
+ for (int i = 0; i < SortedTimers.Size(); i++) {
+ if (y + lineHeight > ys05)
+ break;
+ if (const cTimer *Timer = SortedTimers[i]) {
+ if (Timer->Recording()) {
+ if (cRecordControl *RecordControl = cRecordControls::GetRecordControl(Timer)) {
+ if (!Device || Device == RecordControl->Device()) {
+ DrawTimer(Timer, y, NumTimers > 0);
+ NumTimers++;
+ if (!Device) {
+ Device = RecordControl->Device();
+ deviceOffset[Device->DeviceNumber()] = y;
+ deviceRecording[Device->DeviceNumber()] = true;
+ NumDevices++;
+ }
+ else
+ FreeDeviceSlots.Append(y);
+ y += lineHeight + Gap;
+ }
+ else
+ continue;
+ }
+ SortedTimers[i] = NULL;
+ }
+ else if (!Device && Timer->HasFlags(tfActive)) {
+ DrawTimer(Timer, y, false);
+ FreeDeviceSlots.Append(y);
+ y += lineHeight + Gap;
+ SortedTimers[i] = NULL;
+ }
+ }
+ }
+ if (!Device)
+ break;
+ }
+ // Devices currently not recording:
+ int Slot = 0;
+ for (int i = 0; i < cDevice::NumDevices(); i++) {
+ if (const cDevice *Device = cDevice::GetDevice(i)) {
+ if (Device->NumProvidedSystems()) {
+ if (!deviceRecording[Device->DeviceNumber()]) {
+ if (Slot < FreeDeviceSlots.Size()) {
+ y = FreeDeviceSlots[Slot];
+ Slot++;
+ }
+ if (y + lineHeight > ys05)
+ break;
+ deviceOffset[Device->DeviceNumber()] = y;
+ y += lineHeight + Gap;
+ NumDevices++;
+ }
+ }
+ }
+ }
+ // Total number of active timers:
+ int NumTimers = 0;
+ for (cTimer *Timer = Timers.First(); Timer; Timer = Timers.Next(Timer)) {
+ if (Timer->HasFlags(tfActive))
+ NumTimers++;
+ }
+ osd->DrawText(xs02, ys00, itoa(NumTimers), Theme.Color(clrMenuFrameFg), frameColor, font, xs03 - xs02, ys01 - ys00, taBottom | taLeft | taBorder);
+ osd->DrawText(xs08, ys00, itoa(NumDevices), Theme.Color(clrMenuFrameFg), frameColor, font, xs09 - xs08, ys01 - ys00, taBottom | taRight | taBorder);
+ lastSignalDisplay = 0;
+ initial = true; // forces redrawing of devices
+ }
+}
+
+void cLCARSNGDisplayMenu::DrawDevice(const cDevice *Device)
+{
+ int dn = Device->DeviceNumber();
+ int y = deviceOffset[dn];
+ if (y + lineHeight <= ys05) {
+ if (DrawDeviceData(osd, Device, xs08, y, xs11, y + lineHeight, xs, tinyFont, lastDeviceType[dn], lastCamSlot[dn], initial)) {
+ // Make sure signal meters are redrawn:
+ lastSignalStrength[dn] = -1;
+ lastSignalQuality[dn] = -1;
+ lastSignalDisplay = 0;
+ }
+ // The device recording indicator:
+ if (deviceRecording[dn])
+ osd->DrawRectangle(xs07 + Gap / 2, y, xs08 - Gap - 1, y + lineHeight - 1, Theme.Color(clrMenuDeviceRecording));
+ }
+}
+
+void cLCARSNGDisplayMenu::DrawDevices(void)
+{
+ for (int i = 0; i < cDevice::NumDevices(); i++) {
+ if (const cDevice *Device = cDevice::GetDevice(i)) {
+ if (Device->NumProvidedSystems())
+ DrawDevice(Device);
+ }
+ }
+}
+
+void cLCARSNGDisplayMenu::DrawLiveIndicator(void)
+{
+ cDevice *Device = cDevice::PrimaryDevice();
+ int y = -1;
+ bool Transferring = Device->Transferring();
+ if (!Device->Replaying() || Transferring)
+ y = deviceOffset[cDevice::ActualDevice()->DeviceNumber()];
+ if (initial || y != lastLiveIndicatorY || Transferring != lastLiveIndicatorTransferring) {
+ if (lastLiveIndicatorY >= 0)
+ osd->DrawRectangle(xs12, lastLiveIndicatorY, xs13 - 1, lastLiveIndicatorY + lineHeight - 1, Theme.Color(clrBackground));
+ if (y >= 0) {
+ tColor ColorBg = Theme.Color(clrChannelFrameBg);
+ osd->DrawRectangle(xs12, y, xs12 + lineHeight / 2 - 1, y + lineHeight - 1, ColorBg);
+ osd->DrawEllipse (xs12 + lineHeight / 2, y, xs13 - 1, y + lineHeight - 1, ColorBg, 5);
+ if (Transferring) {
+ int w = bmTransferMode.Width();
+ int h = bmTransferMode.Height();
+ int b = w * w + h * h; // the diagonal of the bitmap (squared)
+ int c = lineHeight * lineHeight; // the diameter of the circle (squared)
+ const cBitmap *bm = &bmTransferMode;
+ if (b > c) {
+ // the bitmap doesn't fit, so scale it down:
+ double f = sqrt(double(c) / (2 * b));
+ bm = bmTransferMode.Scaled(f, f);
+ }
+ osd->DrawBitmap((xs12 + xs13 - bm->Width()) / 2, y + (lineHeight - bm->Height()) / 2, *bm, Theme.Color(clrChannelFrameFg), ColorBg);
+ if (bm != &bmTransferMode)
+ delete bm;
+ }
+ }
+ lastLiveIndicatorY = y;
+ lastLiveIndicatorTransferring = Transferring;
+ }
+}
+
+void cLCARSNGDisplayMenu::DrawSignals(void)
+{
+ time_t Now = time(NULL);
+ if (initial || Now - lastSignalDisplay >= SIGNALDISPLAYDELTA) {
+ for (int i = 0; i < cDevice::NumDevices(); i++) {
+ if (const cDevice *Device = cDevice::GetDevice(i)) {
+ if (Device->NumProvidedSystems()) {
+ if (int y = deviceOffset[i])
+ DrawDeviceSignal(osd, Device, xs + lineHeight / 2, y, xs11, y + lineHeight, lastSignalStrength[i], lastSignalQuality[i], initial);
+ }
+ }
+ }
+ lastSignalDisplay = Now;
+ }
+}
+
+void cLCARSNGDisplayMenu::DrawLive(const cChannel *Channel)
+{
+ if (lastMode != cmLive) {
+ initial = true;
+ lastMode = cmLive;
+ }
+ if (initial) {
+ DrawMainFrameUpper(Theme.Color(clrChannelFrameBg));
+ osd->DrawText(xd00, yd00, tr("LIVE"), Theme.Color(clrChannelFrameBg), Theme.Color(clrBackground), tallFont, xd07 - xd00, yt02 - yd00, taTop | taRight | taBorder);
+ }
+ if (!Channel)
+ return;
+ if (initial || Channel != lastChannel) {
+ osd->DrawText(xa00, yt04, itoa(Channel->Number()), Theme.Color(clrChannelFrameFg), Theme.Color(clrChannelFrameBg), tallFont, xa02 - xa00, yt06 - yt04, taTop | taRight | taBorder);
+ osd->DrawText(xa03, yt04, Channel->Name(), Theme.Color(clrChannelName), Theme.Color(clrBackground), tallFont, xd07 - xa03, yt06 - yt04, taTop | taLeft);
+ int x = xa00 + (yc03 - yc02); // compensate for the arc
+ osd->DrawText(x, yc00, cSource::ToString(Channel->Source()), Theme.Color(clrChannelFrameFg), Theme.Color(clrChannelFrameBg), cFont::GetFont(fontOsd), xa02 - x, yc03 - yc00, taTop | taRight | taBorder);
+ lastChannel = Channel;
+ DrawSeen(0, 0);
+ }
+ // The current programme:
+ cSchedulesLock SchedulesLock;
+ if (const cSchedules *Schedules = cSchedules::Schedules(SchedulesLock)) {
+ if (const cSchedule *Schedule = Schedules->GetSchedule(Channel)) {
+ const cEvent *Event = Schedule->GetPresentEvent();
+ if (initial || Event != lastEvent) {
+ DrawInfo(Event, true);
+ lastEvent = Event;
+ lastSeen = -1;
+ }
+ int Current = 0;
+ int Total = 0;
+ if (Event) {
+ time_t t = time(NULL);
+ if (t > Event->StartTime())
+ Current = t - Event->StartTime();
+ Total = Event->Duration();
+ }
+ DrawSeen(Current, Total);
+ }
+ }
+}
+
+void cLCARSNGDisplayMenu::DrawPlay(cControl *Control)
+{
+ if (lastMode != cmPlay) {
+ initial = true;
+ lastMode = cmPlay;
+ }
+ if (initial) {
+ DrawMainFrameUpper(Theme.Color(clrReplayFrameBg));
+ osd->DrawText(xd00, yd00, tr("PLAY"), Theme.Color(clrReplayFrameBg), Theme.Color(clrBackground), tallFont, xd07 - xd00, yt02 - yd00, taTop | taRight | taBorder);
+ }
+ // The current progress:
+ int Current = 0;
+ int Total = 0;
+ if (Control->GetIndex(Current, Total))
+ DrawSeen(Current, Total);
+ // The current programme:
+ if (const cRecording *Recording = Control->GetRecording()) {
+ if (initial || Recording != lastRecording) {
+ const cFont *font = cFont::GetFont(fontOsd);
+ if (const cRecordingInfo *Info = Recording->Info()) {
+ osd->DrawText(xa03, yt04, Info->ChannelName(), Theme.Color(clrChannelName), Theme.Color(clrBackground), tallFont, xd07 - xa03, yt06 - yt04, taTop | taLeft);
+ DrawInfo(Info->GetEvent(), false);
+ }
+ else
+ osd->DrawText(xa03, yt04, Recording->Name(), Theme.Color(clrEventTitle), Theme.Color(clrBackground), font, xd07 - xa03, 0, taTop | taLeft);
+ osd->DrawText(xa00, yt07, ShortDateString(Recording->Start()), Theme.Color(clrReplayFrameFg), Theme.Color(clrReplayFrameBg), font, xa02 - xa00, 0, taTop | taRight | taBorder);
+ osd->DrawText(xa00, yt07 + lineHeight, TimeString(Recording->Start()), Theme.Color(clrReplayFrameFg), Theme.Color(clrReplayFrameBg), font, xa02 - xa00, 0, taBottom | taRight | taBorder);
+ lastRecording = Recording;
+ }
+ }
+ else {
+ cString Header = Control->GetHeader();
+ if (!*lastHeader || strcmp(Header, lastHeader)) {
+ osd->DrawText(xa03, yt04, Header, Theme.Color(clrMenuText), Theme.Color(clrBackground), tallFont, xd00 - xa03, yd01 - yd00, taTop | taLeft);
+ lastHeader = Header;
+ }
+ }
+}
+
+void cLCARSNGDisplayMenu::DrawInfo(const cEvent *Event, bool WithTime)
+{
+ if (Event) {
+ const cFont *font = cFont::GetFont(fontOsd);
+ int y = yt07;
+ osd->DrawText(xa03, y, Event->Title(), Theme.Color(clrEventTitle), Theme.Color(clrBackground), font, xd07 - xa03 - lineHeight, lineHeight, taBottom | taLeft);
+ y += lineHeight;
+ osd->DrawText(xa03, y, Event->ShortText(), Theme.Color(clrEventShortText), Theme.Color(clrBackground), cFont::GetFont(fontSml), xd07 - xa03 - lineHeight, lineHeight, taTop | taLeft);
+ if (WithTime) {
+ osd->DrawText(xa00, y - lineHeight, Event->GetTimeString(), Theme.Color(clrChannelFrameFg), Theme.Color(clrChannelFrameBg), font, xa02 - xa00, lineHeight, taTop | taRight | taBorder);
+ osd->DrawText(xa00, y, cString::sprintf("-%s", *Event->GetEndTimeString()), Theme.Color(clrChannelFrameFg), Theme.Color(clrChannelFrameBg), font, xa02 - xa00, lineHeight, taBottom | taRight | taBorder);
+ }
+ }
+}
+
+void cLCARSNGDisplayMenu::DrawSeen(int Current, int Total)
+{
+// Fortschrittsbalken
+ int Seen = (Total > 0) ? min(xm03 - xm02, int((xm03 - xm02) * double(Current) / Total)) : 0;
+ if (initial || Seen != lastSeen) {
+ int y0 = yc04 - ShowSeenExtent;
+ int y1 = yc04 + lineHeight / 2 - Gap / 2;
+ osd->DrawRectangle(xm02, y0, xm02 + Seen - 1, y1 - 1, Theme.Color(clrSeen));
+ osd->DrawRectangle(xm02 + Seen, y0, xm03 - 1, y1 - 1, Theme.Color(clrBackground));
+ lastSeen = Seen;
+ }
+}
+
+void cLCARSNGDisplayMenu::DrawTextScrollbar(void)
+{
+ if (textScroller.CanScroll())
+ DrawScrollbar(textScroller.Total(), textScroller.Offset(), textScroller.Shown(), textScroller.CanScrollUp(), textScroller.CanScrollDown());
+}
+
+void cLCARSNGDisplayMenu::Scroll(bool Up, bool Page)
+{
+ cSkinDisplayMenu::Scroll(Up, Page);
+ DrawTextScrollbar();
+}
+
+int cLCARSNGDisplayMenu::MaxItems(void)
+{
+ switch (MenuCategory()) {
+ case mcMain:
+ case mcSetup:
+ case mcCommand:
+ case mcChannel:
+ return (ym04 - ym03) / lineHeight;
+ break;
+ case mcSchedule:
+ case mcScheduleNow:
+ case mcScheduleNext:
+ case mcEvent:
+ case mcRecording:
+ case mcRecordingInfo:
+ case mcTimer:
+ case mcTimerEdit:
+ return (ym07 - ym00) / lineHeight;
+ break;
+ default:
+ return (yb13 - yt02) / lineHeight;
+ }
+}
+
+void cLCARSNGDisplayMenu::Clear(void)
+{
+ textScroller.Reset();
+ osd->DrawRectangle(xi00, yi00, xi03 - 1, yi01 - 1, Theme.Color(clrBackground));
+}
+
+void cLCARSNGDisplayMenu::SetTitle(const char *Title)
+{
+ const cFont *font = cFont::GetFont(fontOsd);
+ switch (MenuCategory()) {
+ case mcMain:
+ case mcSetup:
+ case mcCommand:
+ case mcChannel:
+ break;
+ case mcSchedule:
+ case mcScheduleNow:
+ case mcScheduleNext:
+ case mcEvent:
+ case mcRecording:
+ case mcRecordingInfo:
+ case mcTimer:
+ case mcTimerEdit:
+ osd->DrawText(xs00, ys00, Title, Theme.Color(clrMenuFrameFg), frameColor, font, xs11 - xs00, lineHeight, taBottom | taRight | taBorder);
+ osd->DrawRectangle(xs12, ys00, xs13 - 1, ys01 - 1, frameColor);
+ break;
+ default:
+ int w = font->Width(Title);
+ osd->DrawRectangle(xa06, yt00, xa07 - w - Gap - 1, yt01 - 1, frameColor);
+ osd->DrawText(xa07 - w - Gap, yt00, Title, Theme.Color(clrMenuTitle), Theme.Color(clrBackground), font, w + Gap, yt01 - yt00, taRight);
+ }
+}
+
+void cLCARSNGDisplayMenu::SetButtons(const char *Red, const char *Green, const char *Yellow, const char *Blue)
+{
+ const char *lutText[] = { Red, Green, Yellow, Blue };
+ tColor lutFg[] = { clrButtonRedFg, clrButtonGreenFg, clrButtonYellowFg, clrButtonBlueFg };
+ tColor lutBg[] = { clrButtonRedBg, clrButtonGreenBg, clrButtonYellowBg, clrButtonBlueBg };
+ const cFont *font = cFont::GetFont(fontSml);
+ if (MenuCategory() == mcMain || MenuCategory() == mcSetup || MenuCategory() == mcCommand || MenuCategory() == mcChannel || MenuCategory() == mcSchedule || MenuCategory() == mcScheduleNow || MenuCategory() == mcScheduleNext || MenuCategory() == mcEvent || MenuCategory() == mcRecording || MenuCategory() == mcRecordingInfo || MenuCategory() == mcTimer || MenuCategory() == mcTimerEdit) {
+ DrawMainButton(lutText[Setup.ColorKey0], xd00, xd01, xd02, xd03, yd02, yd03, Theme.Color(lutFg[Setup.ColorKey0]), Theme.Color(lutBg[Setup.ColorKey0]), font);
+ DrawMainButton(lutText[Setup.ColorKey1], xd04, xd05, xd06, xd07, yd02, yd03, Theme.Color(lutFg[Setup.ColorKey1]), Theme.Color(lutBg[Setup.ColorKey1]), font);
+ DrawMainButton(lutText[Setup.ColorKey2], xd00, xd01, xd02, xd03, yd04, yd05, Theme.Color(lutFg[Setup.ColorKey2]), Theme.Color(lutBg[Setup.ColorKey2]), font);
+ DrawMainButton(lutText[Setup.ColorKey3], xd04, xd05, xd06, xd07, yd04, yd05, Theme.Color(lutFg[Setup.ColorKey3]), Theme.Color(lutBg[Setup.ColorKey3]), font);
+ }
+ else {
+ int h = yb15 - yb14;
+ osd->DrawText(xb02, yb14, lutText[Setup.ColorKey0], Theme.Color(lutFg[Setup.ColorKey0]), Theme.Color(lutBg[Setup.ColorKey0]), font, xb03 - xb02, h, taLeft | taBorder);
+ osd->DrawText(xb06, yb14, lutText[Setup.ColorKey1], Theme.Color(lutFg[Setup.ColorKey1]), Theme.Color(lutBg[Setup.ColorKey1]), font, xb07 - xb06, h, taLeft | taBorder);
+ osd->DrawText(xb10, yb14, lutText[Setup.ColorKey2], Theme.Color(lutFg[Setup.ColorKey2]), Theme.Color(lutBg[Setup.ColorKey2]), font, xb11 - xb10, h, taLeft | taBorder);
+ osd->DrawText(xb14, yb14, lutText[Setup.ColorKey3], Theme.Color(lutFg[Setup.ColorKey3]), Theme.Color(lutBg[Setup.ColorKey3]), font, xb15 - xb14, h, taLeft | taBorder);
+ }
+}
+
+void cLCARSNGDisplayMenu::SetMessage(eMessageType Type, const char *Text)
+{
+ if (Text) {
+ osd->SaveRegion(xb00, yb14, xb15 - 1, yb15 - 1);
+ osd->DrawText(xb00, yb14, Text, Theme.Color(clrMessageStatusFg + 2 * Type), Theme.Color(clrMessageStatusBg + 2 * Type), cFont::GetFont(fontSml), xb15 - xb00, yb15 - yb14, taCenter);
+ }
+ else
+ osd->RestoreRegion();
+}
+
+void cLCARSNGDisplayMenu::SetItem(const char *Text, int Index, bool Current, bool Selectable)
+{
+ int y = yi00 + Index * lineHeight;
+ tColor ColorFg, ColorBg;
+ if (Current) {
+ if (TwoColors) {
+ ColorFg = Theme.Color(clrBackground);
+ ColorBg = Theme.Color(clrMenuFrameBg);
+ }
+ else {
+ ColorFg = Theme.Color(clrMenuItemCurrentFg);
+ ColorBg = Theme.Color(clrMenuItemCurrentBg);
+ }
+ osd->DrawRectangle(xi00, y, xi01 - 1, y + lineHeight - 1, ColorBg);
+ osd->DrawRectangle(xi02, y, xi02 + lineHeight / 2 - 1, y + lineHeight - 1, ColorBg);
+ osd->DrawEllipse (xi02 + lineHeight / 2, y, xi03 - 1, y + lineHeight - 1, ColorBg, 5);
+ currentIndex = Index;
+ }
+ else {
+ ColorFg = Theme.Color(Selectable ? clrMenuItemSelectable : clrMenuItemNonSelectable);
+ ColorBg = Theme.Color(clrBackground);
+ if (currentIndex == Index)
+ osd->DrawRectangle(xi00, y, xi03 - 1, y + lineHeight - 1, Theme.Color(clrBackground));
+ }
+ const cFont *font = cFont::GetFont(fontOsd);
+ for (int i = 0; i < MaxTabs; i++) {
+ const char *s = GetTabbedText(Text, i);
+ if (s) {
+ int xt = xi00 + TextSpacing + Tab(i);
+ osd->DrawText(xt, y, s, ColorFg, ColorBg, font, xi01 - xt);
+ }
+ if (!Tab(i + 1))
+ break;
+ }
+ SetEditableWidth(xi02 - xi00 - TextSpacing - Tab(1));
+}
+
+void cLCARSNGDisplayMenu::SetScrollbar(int Total, int Offset)
+{
+ DrawScrollbar(Total, Offset, MaxItems(), Offset > 0, Offset + MaxItems() < Total);
+}
+
+void cLCARSNGDisplayMenu::SetEvent(const cEvent *Event)
+{
+ if (!Event)
+ return;
+ const cFont *font = cFont::GetFont(fontOsd);
+ int xl = xi00;
+ int y = yi00;
+ cTextScroller ts;
+ char t[32];
+ snprintf(t, sizeof(t), "%s %s - %s", *Event->GetDateString(), *Event->GetTimeString(), *Event->GetEndTimeString());
+ ts.Set(osd, xl, y, xi01 - xl, yi01 - y, t, font, Theme.Color(clrEventTime), Theme.Color(clrBackground));
+ if (Event->Vps() && Event->Vps() != Event->StartTime()) {
+ cString buffer = cString::sprintf(" VPS: %s ", *Event->GetVpsString());
+ const cFont *font = cFont::GetFont(fontSml);
+ int w = font->Width(buffer);
+ osd->DrawText(xi01 - w, y, buffer, Theme.Color(clrMenuFrameFg), frameColor, font, w);
+ int yb = y + font->Height();
+ osd->DrawRectangle(xi02, y, xi02 + lineHeight / 2 - 1, yb - 1, frameColor);
+ osd->DrawEllipse (xi02 + lineHeight / 2, y, xi03 - 1, yb - 1, frameColor, 5);
+ }
+ y += ts.Height();
+ if (Event->ParentalRating()) {
+ cString buffer = cString::sprintf(" %s ", *Event->GetParentalRatingString());
+ const cFont *font = cFont::GetFont(fontSml);
+ int w = font->Width(buffer);
+ osd->DrawText(xi01 - w, y, buffer, Theme.Color(clrMenuFrameFg), frameColor, font, w);
+ int yb = y + font->Height();
+ osd->DrawRectangle(xi02, y, xi02 + lineHeight / 2 - 1, yb - 1, frameColor);
+ osd->DrawEllipse (xi02 + lineHeight / 2, y, xi03 - 1, yb - 1, frameColor, 5);
+ }
+ y += font->Height();
+ ts.Set(osd, xl, y, xi01 - xl, yi01 - y, Event->Title(), font, Theme.Color(clrEventTitle), Theme.Color(clrBackground));
+ y += ts.Height();
+ if (!isempty(Event->ShortText())) {
+ const cFont *font = cFont::GetFont(fontSml);
+ ts.Set(osd, xl, y, xi01 - xl, yi01 - y, Event->ShortText(), font, Theme.Color(clrEventShortText), Theme.Color(clrBackground));
+ y += ts.Height();
+ }
+ y += font->Height();
+ if (!isempty(Event->Description())) {
+ int yt = y;
+ int yb = yi01;
+ textScroller.Set(osd, xl, yt, xi01 - xl, yb - yt, Event->Description(), font, Theme.Color(clrEventDescription), Theme.Color(clrBackground));
+ DrawTextScrollbar();
+ }
+}
+
+void cLCARSNGDisplayMenu::SetRecording(const cRecording *Recording)
+{
+ if (!Recording)
+ return;
+ const cRecordingInfo *Info = Recording->Info();
+ const cFont *font = cFont::GetFont(fontOsd);
+ int xl = xi00;
+ int y = yi00;
+ cTextScroller ts;
+ cString t = cString::sprintf("%s %s %s", *DateString(Recording->Start()), *TimeString(Recording->Start()), Info->ChannelName() ? Info->ChannelName() : "");
+ ts.Set(osd, xl, y, xi01 - xl, yi01 - y, t, font, Theme.Color(clrEventTime), Theme.Color(clrBackground));
+ y += ts.Height();
+ if (Info->GetEvent()->ParentalRating()) {
+ cString buffer = cString::sprintf(" %s ", *Info->GetEvent()->GetParentalRatingString());
+ const cFont *font = cFont::GetFont(fontSml);
+ int w = font->Width(buffer);
+ osd->DrawText(xi01 - w, y, buffer, Theme.Color(clrMenuFrameFg), frameColor, font, w);
+ int yb = y + font->Height();
+ osd->DrawRectangle(xi02, y, xi02 + lineHeight / 2 - 1, yb - 1, frameColor);
+ osd->DrawEllipse (xi02 + lineHeight / 2, y, xi03 - 1, yb - 1, frameColor, 5);
+ }
+ y += font->Height();
+ const char *Title = Info->Title();
+ if (isempty(Title))
+ Title = Recording->Name();
+ ts.Set(osd, xl, y, xi01 - xl, yi01 - y, Title, font, Theme.Color(clrEventTitle), Theme.Color(clrBackground));
+ y += ts.Height();
+ if (!isempty(Info->ShortText())) {
+ const cFont *font = cFont::GetFont(fontSml);
+ ts.Set(osd, xl, y, xi01 - xl, yi01 - y, Info->ShortText(), font, Theme.Color(clrEventShortText), Theme.Color(clrBackground));
+ y += ts.Height();
+ }
+ y += font->Height();
+ if (!isempty(Info->Description())) {
+ int yt = y;
+ int yb = yi01;
+ textScroller.Set(osd, xl, yt, xi01 - xl, yb - yt, Info->Description(), font, Theme.Color(clrEventDescription), Theme.Color(clrBackground));
+ DrawTextScrollbar();
+ }
+}
+
+void cLCARSNGDisplayMenu::SetText(const char *Text, bool FixedFont)
+{
+ textScroller.Set(osd, xi00, yi00, GetTextAreaWidth(), yi01 - yi00, Text, GetTextAreaFont(FixedFont), Theme.Color(clrMenuText), Theme.Color(clrBackground));
+ DrawTextScrollbar();
+}
+
+int cLCARSNGDisplayMenu::GetTextAreaWidth(void) const
+{
+ return xi01 - xi00;
+}
+
+const cFont *cLCARSNGDisplayMenu::GetTextAreaFont(bool FixedFont) const
+{
+ const cFont *font = cFont::GetFont(FixedFont ? fontFix : fontOsd);
+ //XXX -> make a way to let the text define which font to use
+ return font;
+}
+
+void cLCARSNGDisplayMenu::Flush(void)
+{
+
+ cDevice *Device = cDevice::PrimaryDevice();
+ cRect videoWindowRect( 0.575 * xa09, lineHeight, 0.44 * xa09, yc06 - lineHeight / 2);
+ DrawFrameDisplay();
+ switch (MenuCategory()) {
+ case mcMain:
+ case mcSetup:
+ case mcCommand:
+// case mcChannel:
+ DrawTimers();
+ DrawDevices();
+ DrawLiveIndicator();
+ DrawSignals();
+ case mcSchedule:
+ case mcScheduleNow:
+ case mcScheduleNext:
+ case mcEvent:
+ case mcRecording:
+ case mcRecordingInfo:
+ case mcTimer:
+ case mcTimerEdit:
+// cDevice *Device = cDevice::PrimaryDevice();
+ if (!Device->Replaying() || Device->Transferring()) {
+ const cChannel *Channel = Channels.GetByNumber(cDevice::PrimaryDevice()->CurrentChannel());
+ DrawLive(Channel);
+ }
+ else if (cControl *Control = cControl::Control(true))
+ DrawPlay(Control);
+ osd->DrawRectangle( xs00, 0, xa09, yc06 - 1, 0x00000000);
+// cRect videoWindowRect( 0.575 * xa09, lineHeight, 0.44 * xa09, yc06 - lineHeight / 2);
+ if (initial) {
+ availableRect = cDevice::PrimaryDevice()->CanScaleVideo(videoWindowRect);
+ osd->Flush();
+ cDevice::PrimaryDevice()->ScaleVideo(availableRect);
+ }
+ else
+ osd->Flush();
+ break;
+ default:
+ availableRect = cDevice::PrimaryDevice()->CanScaleVideo(cRect::Null);
+ osd->Flush();
+ cDevice::PrimaryDevice()->ScaleVideo(availableRect);
+ }
+ initial = false;
+}
+
+// --- cLCARSNGDisplayReplay -----------------------------------------------
+
+class cLCARSNGDisplayReplay : public cSkinDisplayReplay {
+private:
+ cOsd *osd;
+ int xp00, xp01, xp02, xp03, xp04, xp05, xp06, xp07, xp08, xp09, xp10, xp11, xp12, xp13, xp14, xp15;
+ int yp00, yp01, yp02, yp03, yp04, yp05, yp06, yp07, yp08, yp09;
+ bool modeOnly;
+ int lineHeight;
+ tColor frameColor;
+ int lastCurrentWidth;
+ int lastTotalWidth;
+ cString lastDate;
+ tTrackId lastTrackId;
+ void DrawDate(void);
+ void DrawTrack(void);
+public:
+ cLCARSNGDisplayReplay(bool ModeOnly);
+ virtual ~cLCARSNGDisplayReplay();
+ virtual void SetRecording(const cRecording *Recording);
+ virtual void SetTitle(const char *Title);
+ virtual void SetMode(bool Play, bool Forward, int Speed);
+ virtual void SetProgress(int Current, int Total);
+ virtual void SetCurrent(const char *Current);
+ virtual void SetTotal(const char *Total);
+ virtual void SetJump(const char *Jump);
+ virtual void SetMessage(eMessageType Type, const char *Text);
+ virtual void Flush(void);
+ };
+
+cLCARSNGDisplayReplay::cLCARSNGDisplayReplay(bool ModeOnly)
+{
+ const cFont *font = cFont::GetFont(fontOsd);
+ modeOnly = ModeOnly;
+ lineHeight = font->Height();
+ frameColor = Theme.Color(clrReplayFrameBg);
+ lastCurrentWidth = 0;
+ lastTotalWidth = 0;
+ int d = 5 * lineHeight;
+ xp00 = 0;
+ xp01 = xp00 + d / 2;
+ xp02 = xp00 + d;
+ xp03 = xp02 + lineHeight;
+ xp04 = xp02 + d / 4;
+ xp05 = xp02 + d;
+ xp06 = xp05 + Gap;
+ xp15 = cOsd::OsdWidth();
+ xp14 = xp15 - lineHeight;
+ xp13 = xp14 - Gap;
+ xp07 = (xp15 + xp00) / 2;
+ xp08 = xp07 + Gap;
+ xp09 = xp08 + lineHeight;
+ xp10 = xp09 + Gap;
+ xp11 = (xp10 + xp13 + Gap) / 2;
+ xp12 = xp11 + Gap;
+
+ yp00 = lineHeight;
+ yp01 = yp00 + 2 * lineHeight;
+ yp02 = yp01 + Gap;
+ yp03 = yp02 + 2 * lineHeight;
+
+ yp04 = yp03 + Gap;
+ yp09 = yp04 + 3 * lineHeight + Gap / 2;
+ yp08 = yp09 - lineHeight;
+ yp07 = yp08 - lineHeight;
+ yp06 = yp08 - d / 4;
+ yp05 = yp09 - d / 2;
+
+ osd = CreateOsd(cOsd::OsdLeft(), cOsd::OsdTop() + cOsd::OsdHeight() - yp09, xp00, yp00 - lineHeight, xp15 - 1, yp09 - 1);
+ osd->DrawRectangle(xp00, yp00, xp15 - 1, yp09 - 1, modeOnly ? clrTransparent : Theme.Color(clrBackground));
+ // Rectangles:
+ if (!modeOnly)
+ osd->DrawRectangle(xp00, yp00, xp02 - 1, yp01 - 1, frameColor);
+ osd->DrawRectangle(xp00, yp02, xp02 - 1, yp03 - 1, frameColor);
+ if (!modeOnly) {
+ // Elbow:
+ osd->DrawRectangle(xp00, yp04, xp01 - 1, yp05 - 1, frameColor);
+ osd->DrawRectangle(xp00, yp05, xp01 - 1, yp09 - 1, clrTransparent);
+ osd->DrawEllipse (xp00, yp05, xp01 - 1, yp09 - 1, frameColor, 3);
+ osd->DrawRectangle(xp01, yp04, xp02 - 1, yp09 - 1, frameColor);
+ osd->DrawEllipse (xp02, yp06, xp04 - 1, yp08 - 1, frameColor, -3);
+ osd->DrawRectangle(xp02, yp08, xp05 - 1, yp09 - 1, frameColor);
+ // Status area:
+ osd->DrawRectangle(xp06, yp08, xp07 - 1, yp09 - 1, frameColor);
+ osd->DrawRectangle(xp08, yp08, xp09 - 1, yp09 - 1, frameColor);
+ osd->DrawRectangle(xp10, yp08, xp11 - 1, yp09 - 1, frameColor);
+ osd->DrawRectangle(xp12, yp08, xp13 - 1, yp09 - 1, frameColor);
+ osd->DrawRectangle(xp14, yp08, xp14 + lineHeight / 2 - 1, yp09 - 1, frameColor);
+ osd->DrawRectangle(xp14 + lineHeight / 2, yp08 + lineHeight / 2, xp15 - 1, yp09 - 1, clrTransparent);
+ osd->DrawEllipse (xp14 + lineHeight / 2, yp08, xp15 - 1, yp09 - 1, frameColor, 5);
+ }
+}
+
+cLCARSNGDisplayReplay::~cLCARSNGDisplayReplay()
+{
+ delete osd;
+ cDevice::PrimaryDevice()->ScaleVideo(cRect::Null);
+}
+
+void cLCARSNGDisplayReplay::DrawDate(void)
+{
+ cString s = DayDateTime();
+ if (!*lastDate || strcmp(s, lastDate)) {
+ osd->DrawText(xp12, yp00 - lineHeight, s, Theme.Color(clrDateFg), Theme.Color(clrDateBg), cFont::GetFont(fontOsd), xp13 - xp12, lineHeight, taRight | taBorder);
+ lastDate = s;
+ }
+}
+
+void cLCARSNGDisplayReplay::DrawTrack(void)
+{
+ cDevice *Device = cDevice::PrimaryDevice();
+ const tTrackId *Track = Device->GetTrack(Device->GetCurrentAudioTrack());
+ if (!Track && *lastTrackId.description || Track && strcmp(lastTrackId.description, Track->description)) {
+ osd->DrawText(xp03, yp04, Track ? Track->description : "", Theme.Color(clrTrackName), Theme.Color(clrBackground), cFont::GetFont(fontOsd), xp07 - xp03);
+ strn0cpy(lastTrackId.description, Track ? Track->description : "", sizeof(lastTrackId.description));
+ }
+}
+
+void cLCARSNGDisplayReplay::SetRecording(const cRecording *Recording)
+{
+ const cRecordingInfo *RecordingInfo = Recording->Info();
+ SetTitle(RecordingInfo->Title());
+ osd->DrawText(xp03, yp01 - lineHeight, RecordingInfo->ShortText(), Theme.Color(clrEventShortText), Theme.Color(clrBackground), cFont::GetFont(fontSml), xp13 - xp03);
+ osd->DrawText(xp00, yp00, ShortDateString(Recording->Start()), Theme.Color(clrReplayFrameFg), frameColor, cFont::GetFont(fontOsd), xp02 - xp00, 0, taTop | taRight | taBorder);
+ osd->DrawText(xp00, yp01 - lineHeight, TimeString(Recording->Start()), Theme.Color(clrReplayFrameFg), frameColor, cFont::GetFont(fontOsd), xp02 - xp00, 0, taBottom | taRight | taBorder);
+}
+
+void cLCARSNGDisplayReplay::SetTitle(const char *Title)
+{
+ osd->DrawText(xp03, yp00, Title, Theme.Color(clrEventTitle), Theme.Color(clrBackground), cFont::GetFont(fontOsd), xp13 - xp03);
+}
+
+static const char *const *ReplaySymbols[2][2][5] = {
+ { { pause_xpm, srew_xpm, srew1_xpm, srew2_xpm, srew3_xpm },
+ { pause_xpm, sfwd_xpm, sfwd1_xpm, sfwd2_xpm, sfwd3_xpm }, },
+ { { play_xpm, frew_xpm, frew1_xpm, frew2_xpm, frew3_xpm },
+ { play_xpm, ffwd_xpm, ffwd1_xpm, ffwd2_xpm, ffwd3_xpm } }
+ };
+
+void cLCARSNGDisplayReplay::SetMode(bool Play, bool Forward, int Speed)
+{
+ Speed = constrain(Speed, -1, 3);
+ cBitmap bm(ReplaySymbols[Play][Forward][Speed + 1]);
+ osd->DrawBitmap(xp01 - bm.Width() / 2, (yp02 + yp03 - bm.Height()) / 2, bm, Theme.Color(clrReplayFrameFg), frameColor);
+}
+
+void cLCARSNGDisplayReplay::SetProgress(int Current, int Total)
+{
+ cProgressBar pb(xp13 - xp03, lineHeight, Current, Total, marks, Theme.Color(clrReplayProgressSeen), Theme.Color(clrReplayProgressRest), Theme.Color(clrReplayProgressSelected), Theme.Color(clrReplayProgressMark), Theme.Color(clrReplayProgressCurrent));
+ osd->DrawBitmap(xp03, yp02, pb);
+}
+
+void cLCARSNGDisplayReplay::SetCurrent(const char *Current)
+{
+ const cFont *font = cFont::GetFont(fontOsd);
+ int w = font->Width(Current);
+ osd->DrawText(xp03, yp03 - lineHeight, Current, Theme.Color(clrReplayPosition), Theme.Color(clrBackground), font, max(lastCurrentWidth, w), 0, taLeft);
+ lastCurrentWidth = w;
+}
+
+void cLCARSNGDisplayReplay::SetTotal(const char *Total)
+{
+ const cFont *font = cFont::GetFont(fontOsd);
+ int w = font->Width(Total);
+ osd->DrawText(xp13 - w, yp03 - lineHeight, Total, Theme.Color(clrReplayPosition), Theme.Color(clrBackground), font, max(lastTotalWidth, w), 0, taRight);
+ lastTotalWidth = w;
+}
+
+void cLCARSNGDisplayReplay::SetJump(const char *Jump)
+{
+ osd->DrawText(xp06, yp08, Jump, Theme.Color(clrReplayJumpFg), Jump ? Theme.Color(clrReplayJumpBg) : frameColor, cFont::GetFont(fontOsd), xp07 - xp06, 0, taCenter);
+}
+
+void cLCARSNGDisplayReplay::SetMessage(eMessageType Type, const char *Text)
+{
+ if (Text) {
+ osd->SaveRegion(xp06, yp08, xp13 - 1, yp09 - 1);
+ osd->DrawText(xp06, yp08, Text, Theme.Color(clrMessageStatusFg + 2 * Type), Theme.Color(clrMessageStatusBg + 2 * Type), cFont::GetFont(fontSml), xp13 - xp06, yp09 - yp08, taCenter);
+ }
+ else
+ osd->RestoreRegion();
+}
+
+void cLCARSNGDisplayReplay::Flush(void)
+{
+ if (!modeOnly) {
+ DrawDate();
+ DrawTrack();
+ }
+ osd->Flush();
+// cDevice::PrimaryDevice()->ScaleVideo(videoWindowRect);
+}
+
+// --- cLCARSNGDisplayVolume -----------------------------------------------
+
+class cLCARSNGDisplayVolume : public cSkinDisplayVolume {
+private:
+ cOsd *osd;
+ int x0, x1, x2, x3, x4, x5, x6, x7;
+ int y0, y1;
+ tColor frameColor;
+ int mute;
+public:
+ cLCARSNGDisplayVolume(void);
+ virtual ~cLCARSNGDisplayVolume();
+ virtual void SetVolume(int Current, int Total, bool Mute);
+ virtual void Flush(void);
+ };
+
+cLCARSNGDisplayVolume::cLCARSNGDisplayVolume(void)
+{
+ const cFont *font = cFont::GetFont(fontOsd);
+ int lineHeight = font->Height();
+ frameColor = Theme.Color(clrVolumeFrame);
+ mute = -1;
+ x0 = 0;
+ x1 = lineHeight / 2;
+ x2 = lineHeight;
+ x3 = x2 + Gap;
+ x7 = cOsd::OsdWidth();
+ x6 = x7 - lineHeight / 2;
+ x5 = x6 - lineHeight / 2;
+ x4 = x5 - Gap;
+ y0 = 0;
+ y1 = lineHeight;
+ osd = CreateOsd(cOsd::OsdLeft(), cOsd::OsdTop() + cOsd::OsdHeight() - y1, x0, y0, x7 - 1, y1 - 1);
+ osd->DrawRectangle(x0, y0, x7 - 1, y1 - 1, Theme.Color(clrBackground));
+ osd->DrawRectangle(x0, y0, x1 - 1, y1 - 1, clrTransparent);
+ osd->DrawEllipse (x0, y0, x1 - 1, y1 - 1, frameColor, 7);
+ osd->DrawRectangle(x1, y0, x2 - 1, y1 - 1, frameColor);
+ osd->DrawRectangle(x3, y0, x4 - 1, y1 - 1, frameColor);
+ osd->DrawRectangle(x5, y0, x6 - 1, y1 - 1, frameColor);
+ osd->DrawRectangle(x6, y0, x7 - 1, y1 - 1, clrTransparent);
+ osd->DrawEllipse (x6, y0, x7 - 1, y1 - 1, frameColor, 5);
+}
+
+cLCARSNGDisplayVolume::~cLCARSNGDisplayVolume()
+{
+ delete osd;
+ cDevice::PrimaryDevice()->ScaleVideo(cRect::Null);
+}
+
+void cLCARSNGDisplayVolume::SetVolume(int Current, int Total, bool Mute)
+{
+ int xl = x3 + TextSpacing;
+ int xr = x4 - TextSpacing;
+ int yt = y0 + TextFrame;
+ int yb = y1 - TextFrame;
+ if (mute != Mute) {
+ osd->DrawRectangle(x3, y0, x4 - 1, y1 - 1, frameColor);
+ mute = Mute;
+ }
+ cBitmap bm(Mute ? mute_xpm : volume_xpm);
+ osd->DrawBitmap(xl, y0 + (y1 - y0 - bm.Height()) / 2, bm, Theme.Color(clrVolumeSymbol), frameColor);
+ if (!Mute) {
+ xl += bm.Width() + TextSpacing;
+ int w = (y1 - y0) / 3;
+ int d = TextFrame;
+ int n = (xr - xl + d) / (w + d);
+ int x = xr - n * (w + d);
+ tColor Color = Theme.Color(clrVolumeBarLower);
+ for (int i = 0; i < n; i++) {
+ if (Total * i >= Current * n)
+ Color = Theme.Color(clrVolumeBarUpper);
+ osd->DrawRectangle(x, yt, x + w - 1, yb - 1, Color);
+ x += w + d;
+ }
+ }
+}
+
+void cLCARSNGDisplayVolume::Flush(void)
+{
+ osd->Flush();
+// cDevice::PrimaryDevice()->ScaleVideo(videoWindowRect);
+}
+
+// --- cLCARSNGDisplayTracks -----------------------------------------------
+
+class cLCARSNGDisplayTracks : public cSkinDisplayTracks {
+private:
+ cOsd *osd;
+ int xt00, xt01, xt02, xt03, xt04, xt05, xt06, xt07, xt08, xt09, xt10, xt11, xt12;
+ int yt00, yt01, yt02, yt03, yt04, yt05, yt06, yt07;
+ int lineHeight;
+ tColor frameColor;
+ int currentIndex;
+ static cBitmap bmAudioLeft, bmAudioRight, bmAudioStereo;
+ void SetItem(const char *Text, int Index, bool Current);
+public:
+ cLCARSNGDisplayTracks(const char *Title, int NumTracks, const char * const *Tracks);
+ virtual ~cLCARSNGDisplayTracks();
+ virtual void SetTrack(int Index, const char * const *Tracks);
+ virtual void SetAudioChannel(int AudioChannel);
+ virtual void Flush(void);
+ };
+
+cBitmap cLCARSNGDisplayTracks::bmAudioLeft(audioleft_xpm);
+cBitmap cLCARSNGDisplayTracks::bmAudioRight(audioright_xpm);
+cBitmap cLCARSNGDisplayTracks::bmAudioStereo(audiostereo_xpm);
+
+cLCARSNGDisplayTracks::cLCARSNGDisplayTracks(const char *Title, int NumTracks, const char * const *Tracks)
+{
+ const cFont *font = cFont::GetFont(fontOsd);
+ lineHeight = font->Height();
+ frameColor = Theme.Color(clrTrackFrameBg);
+ currentIndex = -1;
+ xt00 = 0;
+ xt01 = xt00 + lineHeight / 2;
+ xt02 = xt01 + Gap;
+ xt03 = xt00 + 2 * lineHeight;
+ int ItemsWidth = font->Width(Title) + xt03 - xt02;
+ for (int i = 0; i < NumTracks; i++)
+ ItemsWidth = max(ItemsWidth, font->Width(Tracks[i]) + 2 * TextFrame);
+ xt04 = xt02 + ItemsWidth;
+ xt05 = xt04 + Gap;
+ xt06 = xt04 + lineHeight;
+ xt07 = xt05 + lineHeight;
+ xt08 = xt07 + lineHeight;
+ xt09 = xt08 + Gap;
+ xt10 = xt09 + lineHeight / 2;
+ xt11 = xt10 + Gap;
+ xt12 = xt11 + lineHeight;
+ yt00 = 0;
+ yt01 = yt00 + lineHeight;
+ yt02 = yt01 + lineHeight;
+ yt03 = yt02 + Gap;
+ yt04 = yt03 + NumTracks * lineHeight + (NumTracks - 1) * Gap;
+ yt05 = yt04 + Gap;
+ yt06 = yt05 + lineHeight;
+ yt07 = yt06 + lineHeight;
+ while (yt07 > cOsd::OsdHeight()) {
+ yt04 -= lineHeight + Gap;
+ yt05 = yt04 + Gap;
+ yt06 = yt05 + lineHeight;
+ yt07 = yt06 + lineHeight;
+ }
+ osd = CreateOsd(cOsd::OsdLeft(), cOsd::OsdTop() + cOsd::OsdHeight() - yt07, xt00, yt00, xt12 - 1, yt07 - 1);
+ // The upper elbow:
+ osd->DrawRectangle(xt00, yt00, xt12 - 1, yt07 - 1, Theme.Color(clrBackground));
+ osd->DrawRectangle(xt00, yt00, xt03 - 1, yt02 - 1, clrTransparent);
+ osd->DrawEllipse (xt00, yt00, xt03 - 1, yt02 - 1, frameColor, 2);
+ osd->DrawRectangle(xt03, yt00, xt04 - 1, yt02 - 1, frameColor);
+ osd->DrawRectangle(xt04, yt00, xt08 - 1, yt01 - 1, frameColor);
+ osd->DrawEllipse (xt04, yt01, xt06 - 1, yt02 - 1, frameColor, -2);
+ osd->DrawRectangle(xt09, yt00, xt10 - 1, yt01 - 1, frameColor);
+ osd->DrawRectangle(xt11, yt00, xt11 + lineHeight / 2 - 1, yt01 - 1, frameColor);
+ osd->DrawRectangle(xt11 + lineHeight / 2, yt00, xt12 - 1, yt00 + lineHeight / 2 - 1, clrTransparent);
+ osd->DrawEllipse (xt11 + lineHeight / 2, yt00, xt12 - 1, yt01 - 1, frameColor, 5);
+ osd->DrawText(xt03, yt00, Title, Theme.Color(clrTrackFrameFg), frameColor, font, xt04 - xt03, 0, taTop | taRight);
+ // The items:
+ for (int i = 0; i < NumTracks; i++)
+ SetItem(Tracks[i], i, false);
+ // The lower elbow:
+ osd->DrawRectangle(xt00, yt05, xt03 - 1, yt07 - 1, clrTransparent);
+ osd->DrawEllipse (xt00, yt05, xt03 - 1, yt07 - 1, frameColor, 3);
+ osd->DrawRectangle(xt03, yt05, xt04 - 1, yt07 - 1, frameColor);
+ osd->DrawRectangle(xt04, yt06, xt08 - 1, yt07 - 1, frameColor);
+ osd->DrawEllipse (xt04, yt05, xt06 - 1, yt06 - 1, frameColor, -3);
+ osd->DrawRectangle(xt09, yt06, xt10 - 1, yt07 - 1, frameColor);
+ osd->DrawRectangle(xt11, yt06, xt11 + lineHeight / 2 - 1, yt07 - 1, frameColor);
+ osd->DrawRectangle(xt11 + lineHeight / 2, yt06 + lineHeight / 2, xt12 - 1, yt07 - 1, clrTransparent);
+ osd->DrawEllipse (xt11 + lineHeight / 2, yt06, xt12 - 1, yt07 - 1, frameColor, 5);
+}
+
+cLCARSNGDisplayTracks::~cLCARSNGDisplayTracks()
+{
+ delete osd;
+ cDevice::PrimaryDevice()->ScaleVideo(cRect::Null);
+}
+
+void cLCARSNGDisplayTracks::SetItem(const char *Text, int Index, bool Current)
+{
+ int y0 = yt03 + Index * (lineHeight + Gap);
+ int y1 = y0 + lineHeight;
+ if (y1 > yt04)
+ return;
+ tColor ColorFg, ColorBg;
+ if (Current) {
+ ColorFg = Theme.Color(clrTrackItemCurrentFg);
+ ColorBg = Theme.Color(clrTrackItemCurrentBg);
+ osd->DrawRectangle(xt00, y0, xt01 - 1, y1 - 1, frameColor);
+ osd->DrawRectangle(xt02, y0, xt04 - 1, y1 - 1, ColorBg);
+ osd->DrawRectangle(xt05, y0, xt05 + lineHeight / 2 - 1, y1 - 1, ColorBg);
+ osd->DrawEllipse (xt05 + lineHeight / 2, y0, xt07 - 1, y1 - 1, ColorBg, 5);
+ currentIndex = Index;
+ }
+ else {
+ ColorFg = Theme.Color(clrTrackItemFg);
+ ColorBg = Theme.Color(clrTrackItemBg);
+ osd->DrawRectangle(xt00, y0, xt01 - 1, y1 - 1, frameColor);
+ osd->DrawRectangle(xt02, y0, xt04 - 1, y1 - 1, ColorBg);
+ if (currentIndex == Index)
+ osd->DrawRectangle(xt05, y0, xt07 - 1, y1 - 1, Theme.Color(clrBackground));
+ }
+ const cFont *font = cFont::GetFont(fontOsd);
+ osd->DrawText(xt02, y0, Text, ColorFg, ColorBg, font, xt04 - xt02, y1 - y0, taTop | taLeft | taBorder);
+}
+
+void cLCARSNGDisplayTracks::SetTrack(int Index, const char * const *Tracks)
+{
+ if (currentIndex >= 0)
+ SetItem(Tracks[currentIndex], currentIndex, false);
+ SetItem(Tracks[Index], Index, true);
+}
+
+void cLCARSNGDisplayTracks::SetAudioChannel(int AudioChannel)
+{
+ cBitmap *bm = NULL;
+ switch (AudioChannel) {
+ case 0: bm = &bmAudioStereo; break;
+ case 1: bm = &bmAudioLeft; break;
+ case 2: bm = &bmAudioRight; break;
+ default: ;
+ }
+ if (bm)
+ osd->DrawBitmap(xt04 - bm->Width(), (yt06 + yt07 - bm->Height()) / 2, *bm, Theme.Color(clrTrackFrameFg), frameColor);
+ else
+ osd->DrawRectangle(xt03, yt06, xt04 - 1, yt07 - 1, frameColor);
+}
+
+void cLCARSNGDisplayTracks::Flush(void)
+{
+ osd->Flush();
+// cDevice::PrimaryDevice()->ScaleVideo(videoWindowRect);
+}
+
+// --- cLCARSNGDisplayMessage ----------------------------------------------
+
+class cLCARSNGDisplayMessage : public cSkinDisplayMessage {
+private:
+ cOsd *osd;
+ int x0, x1, x2, x3, x4, x5, x6, x7;
+ int y0, y1;
+public:
+ cLCARSNGDisplayMessage(void);
+ virtual ~cLCARSNGDisplayMessage();
+ virtual void SetMessage(eMessageType Type, const char *Text);
+ virtual void Flush(void);
+ };
+
+cLCARSNGDisplayMessage::cLCARSNGDisplayMessage(void)
+{
+ const cFont *font = cFont::GetFont(fontOsd);
+ int lineHeight = font->Height();
+ x0 = 0;
+ x1 = lineHeight / 2;
+ x2 = lineHeight;
+ x3 = x2 + Gap;
+ x7 = cOsd::OsdWidth();
+ x6 = x7 - lineHeight / 2;
+ x5 = x6 - lineHeight / 2;
+ x4 = x5 - Gap;
+ y0 = 0;
+ y1 = lineHeight;
+ osd = CreateOsd(cOsd::OsdLeft(), cOsd::OsdTop() + cOsd::OsdHeight() - y1, x0, y0, x7 - 1, y1 - 1);
+}
+
+cLCARSNGDisplayMessage::~cLCARSNGDisplayMessage()
+{
+ delete osd;
+ cDevice::PrimaryDevice()->ScaleVideo(cRect::Null);
+}
+
+void cLCARSNGDisplayMessage::SetMessage(eMessageType Type, const char *Text)
+{
+ tColor ColorFg = Theme.Color(clrMessageStatusFg + 2 * Type);
+ tColor ColorBg = Theme.Color(clrMessageStatusBg + 2 * Type);
+ osd->DrawRectangle(x0, y0, x7 - 1, y1 - 1, Theme.Color(clrBackground));
+ osd->DrawRectangle(x0, y0, x1 - 1, y1 - 1, clrTransparent);
+ osd->DrawEllipse (x0, y0, x1 - 1, y1 - 1, ColorBg, 7);
+ osd->DrawRectangle(x1, y0, x2 - 1, y1 - 1, ColorBg);
+ osd->DrawText(x3, y0, Text, ColorFg, ColorBg, cFont::GetFont(fontSml), x4 - x3, y1 - y0, taCenter);
+ osd->DrawRectangle(x5, y0, x6 - 1, y1 - 1, ColorBg);
+ osd->DrawRectangle(x6, y0, x7 - 1, y1 - 1, clrTransparent);
+ osd->DrawEllipse (x6, y0, x7 - 1, y1 - 1, ColorBg, 5);
+}
+
+void cLCARSNGDisplayMessage::Flush(void)
+{
+ osd->Flush();
+// cDevice::PrimaryDevice()->ScaleVideo(videoWindowRect);
+}
+
+// --- cLCARSNG ------------------------------------------------------------
+
+cLCARSNG::cLCARSNG(void)
+:cSkin("lcarsng", &::Theme)
+{
+}
+
+const char *cLCARSNG::Description(void)
+{
+ return "LCARSNG";
+}
+
+cSkinDisplayChannel *cLCARSNG::DisplayChannel(bool WithInfo)
+{
+ return new cLCARSNGDisplayChannel(WithInfo);
+}
+
+cSkinDisplayMenu *cLCARSNG::DisplayMenu(void)
+{
+ return new cLCARSNGDisplayMenu;
+}
+
+cSkinDisplayReplay *cLCARSNG::DisplayReplay(bool ModeOnly)
+{
+ return new cLCARSNGDisplayReplay(ModeOnly);
+}
+
+cSkinDisplayVolume *cLCARSNG::DisplayVolume(void)
+{
+ return new cLCARSNGDisplayVolume;
+}
+
+cSkinDisplayTracks *cLCARSNG::DisplayTracks(const char *Title, int NumTracks, const char * const *Tracks)
+{
+ return new cLCARSNGDisplayTracks(Title, NumTracks, Tracks);
+}
+
+cSkinDisplayMessage *cLCARSNG::DisplayMessage(void)
+{
+ return new cLCARSNGDisplayMessage;
+}
diff --git a/lcarsng.h b/lcarsng.h
new file mode 100644
index 0000000..7720c4c
--- /dev/null
+++ b/lcarsng.h
@@ -0,0 +1,27 @@
+/*
+ * skinlcars.h: A VDR skin with Star Trek's "LCARS" layout
+ *
+ * See the main source file 'vdr.c' for copyright information and
+ * how to reach the author.
+ *
+ * $Id: skinlcars.h 3.0 2012/04/15 13:17:35 kls Exp $
+ */
+
+#ifndef __SKINLCARS_H
+#define __SKINLCARS_H
+
+#include <vdr/skins.h>
+
+class cLCARSNG : public cSkin {
+public:
+ cLCARSNG(void);
+ virtual const char *Description(void);
+ virtual cSkinDisplayChannel *DisplayChannel(bool WithInfo);
+ virtual cSkinDisplayMenu *DisplayMenu(void);
+ virtual cSkinDisplayReplay *DisplayReplay(bool ModeOnly);
+ virtual cSkinDisplayVolume *DisplayVolume(void);
+ virtual cSkinDisplayTracks *DisplayTracks(const char *Title, int NumTracks, const char * const *Tracks);
+ virtual cSkinDisplayMessage *DisplayMessage(void);
+ };
+
+#endif //__SKINLCARS_H
diff --git a/po/de_DE.po b/po/de_DE.po
new file mode 100644
index 0000000..7051224
--- /dev/null
+++ b/po/de_DE.po
@@ -0,0 +1,55 @@
+# VDR plugin language source file.
+# Copyright (C) 2008 Martin Schirrmacher <vdr.skinflat@schirrmacher.eu>
+# This file is distributed under the same license as the skinflat package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: vdr-skinlcarsng 0.0.1\n"
+"Report-Msgid-Bugs-To: <see README>\n"
+"POT-Creation-Date: 2013-10-18 12:01+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-15\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "clock"
+msgstr "Uhr"
+
+msgid "disk usage"
+msgstr ""
+
+msgid "free space"
+msgstr ""
+
+msgid "Volume"
+msgstr "Lautstärke"
+
+msgid "DISK"
+msgstr "PLATTE"
+
+msgid "LOAD"
+msgstr "LAST"
+
+msgid "Setup"
+msgstr "Einstellungen"
+
+msgid "Commands"
+msgstr "Befehle"
+
+msgid "Channels"
+msgstr "Kanäle"
+
+msgid "TIMERS"
+msgstr "TIMER"
+
+msgid "DEVICES"
+msgstr "EMPFÄNGER"
+
+msgid "LIVE"
+msgstr "LIVE"
+
+msgid "PLAY"
+msgstr "WIEDERGABE"
diff --git a/skinlcarsng.c b/skinlcarsng.c
new file mode 100644
index 0000000..59c3649
--- /dev/null
+++ b/skinlcarsng.c
@@ -0,0 +1,133 @@
+/*
+ * skinflat.c: A plugin for the Video Disk Recorder
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ * $Id$
+ */
+#include <getopt.h>
+#include <vdr/plugin.h>
+
+#if defined(APIVERSNUM) && APIVERSNUM < 10734
+#error "VDR-1.7.34 API version or greater is required!"
+#endif
+
+#include "lcarsng.h"
+
+static const char *VERSION = "0.0.1";
+static const char *DESCRIPTION = "skin lcarsng";
+
+class cPluginLCARSNG : public cPlugin {
+ private:
+ cLCARSNG *lcarsng;
+ public:
+ cPluginLCARSNG(void);
+ virtual ~cPluginLCARSNG();
+ virtual const char *Version(void) { return VERSION; }
+ virtual const char *Description(void) { return DESCRIPTION; }
+ virtual const char *CommandLineHelp(void);
+ virtual bool ProcessArgs(int argc, char *argv[]);
+ virtual bool Initialize(void);
+ virtual bool Start(void);
+ virtual void Stop(void);
+ virtual void Housekeeping(void);
+ virtual void MainThreadHook(void);
+ virtual cString Active(void);
+ virtual time_t WakeupTime(void);
+ virtual const char *MainMenuEntry(void) {return NULL;}
+ virtual cOsdObject *MainMenuAction(void);
+ virtual cMenuSetupPage *SetupMenu(void);
+ virtual bool SetupParse(const char *Name, const char *Value);
+ virtual bool Service(const char *Id, void *Data = NULL);
+ virtual const char **SVDRPHelpPages(void);
+ virtual cString SVDRPCommand(const char *Command, const char *Option, int &ReplyCode);
+};
+
+cPluginLCARSNG::cPluginLCARSNG(void) {
+ lcarsng = NULL;
+}
+
+cPluginLCARSNG::~cPluginLCARSNG() {
+}
+
+const char *cPluginLCARSNG::CommandLineHelp(void) {
+ return " -l <LOGOPATH>, --logopath=<LOGOPATH> Set directory where Channel Logos are stored.\n";
+}
+
+bool cPluginLCARSNG::ProcessArgs(int argc, char *argv[]) {
+ // Implement command line argument processing here if applicable.
+ static const struct option long_options[] = {
+ { "logopath", required_argument, NULL, 'l' },
+ { NULL }
+ };
+
+ int c;
+ while ((c = getopt_long(argc, argv, "l:", long_options, NULL)) != -1) {
+ switch (c) {
+ case 'l':
+// Config.SetLogoPath(cString(optarg));
+ break;
+ default:
+ return false;
+ }
+ }
+ return true;
+}
+
+bool cPluginLCARSNG::Initialize(void) {
+// Config.Init();
+ return true;
+}
+
+bool cPluginLCARSNG::Start(void) {
+ if (!cOsdProvider::SupportsTrueColor()) {
+ esyslog("skinlcarsng: No TrueColor OSD found! Aborting!");
+ return false;
+ } else
+ dsyslog("skinlcarsng: TrueColor OSD found");
+ lcarsng = new cLCARSNG;
+ return lcarsng;
+}
+
+void cPluginLCARSNG::Stop(void) {
+}
+
+void cPluginLCARSNG::Housekeeping(void) {
+}
+
+void cPluginLCARSNG::MainThreadHook(void) {
+}
+
+cString cPluginLCARSNG::Active(void) {
+ return NULL;
+}
+
+time_t cPluginLCARSNG::WakeupTime(void) {
+ return 0;
+}
+
+cOsdObject *cPluginLCARSNG::MainMenuAction(void) {
+ return NULL;
+}
+
+cMenuSetupPage *cPluginLCARSNG::SetupMenu(void) {
+ return NULL;
+}
+
+bool cPluginLCARSNG::SetupParse(const char *Name, const char *Value) {
+ return true;
+}
+
+bool cPluginLCARSNG::Service(const char *Id, void *Data) {
+ return false;
+}
+
+const char **cPluginLCARSNG::SVDRPHelpPages(void) {
+ return NULL;
+}
+
+cString cPluginLCARSNG::SVDRPCommand(const char *Command, const char *Option, int &ReplyCode) {
+ return NULL;
+}
+
+VDRPLUGINCREATOR(cPluginLCARSNG); // Don't touch this!
diff --git a/symbols/arrowdown.xpm b/symbols/arrowdown.xpm
new file mode 100644
index 0000000..899a1ea
--- /dev/null
+++ b/symbols/arrowdown.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static const char *const arrowdown_xpm[] = {
+"24 24 2 1",
+"# c #ffffff",
+". c #000000",
+"........................",
+"........................",
+"........................",
+"#......................#",
+"#......................#",
+"##....................##",
+"##....................##",
+"###..................###",
+"###..................###",
+"####................####",
+"####................####",
+"#####..............#####",
+"#####..............#####",
+"######............######",
+"######............######",
+"#######..........#######",
+"#######..........#######",
+"########........########",
+"########........########",
+"#########......#########",
+"#########......#########",
+"##########....##########",
+"##########....##########",
+"###########..###########"};
diff --git a/symbols/arrowup.xpm b/symbols/arrowup.xpm
new file mode 100644
index 0000000..c9751a1
--- /dev/null
+++ b/symbols/arrowup.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static const char *const arrowup_xpm[] = {
+"24 24 2 1",
+". c #FFFFFF",
+"+ c #000000",
+"...........++...........",
+"..........++++..........",
+"..........++++..........",
+".........++++++.........",
+".........++++++.........",
+"........++++++++........",
+"........++++++++........",
+".......++++++++++.......",
+".......++++++++++.......",
+"......++++++++++++......",
+"......++++++++++++......",
+".....++++++++++++++.....",
+".....++++++++++++++.....",
+"....++++++++++++++++....",
+"....++++++++++++++++....",
+"...++++++++++++++++++...",
+"...++++++++++++++++++...",
+"..++++++++++++++++++++..",
+"..++++++++++++++++++++..",
+".++++++++++++++++++++++.",
+".++++++++++++++++++++++.",
+"++++++++++++++++++++++++",
+"++++++++++++++++++++++++",
+"++++++++++++++++++++++++"};
diff --git a/symbols/audio.xpm b/symbols/audio.xpm
new file mode 100644
index 0000000..9c7f5da
--- /dev/null
+++ b/symbols/audio.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static const char *const audio_xpm[] = {
+"54 36 2 1",
+". c #ffffff",
+"+ c #000000",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"....++++++++++++++++++++++++++++++++++++++++++++++....",
+"....++++++++++++++++++++++++++++++++++++++++++++++....",
+"....++++++++++++++++++++++++++++++++++++++++++++++....",
+"....+++........................................+++....",
+"....+++........................................+++....",
+"....+++........................................+++....",
+"....+++........................................+++....",
+"....+++.........++++..............++++.........+++....",
+"....+++........++++++............++++++........+++....",
+"....+++.......++++++++..........++++++++.......+++....",
+"....+++......++++..++++........++++..++++......+++....",
+"....+++.....++++....++++......++++....++++.....+++....",
+"....+++....++++......++++....++++......++++....+++....",
+"....+++....+++........+++....+++........+++....+++....",
+"....+++....+++........+++....+++........+++....+++....",
+"....+++....++++......++++....++++......++++....+++....",
+"....+++.....++++....++++......++++....++++.....+++....",
+"....+++......++++..++++........++++..++++......+++....",
+"....+++.......++++++++..........++++++++.......+++....",
+"....+++........++++++............++++++........+++....",
+"....+++.........++++..............++++.........+++....",
+"....+++........................................+++....",
+"....+++........................................+++....",
+"....+++........................................+++....",
+"....+++........................................+++....",
+"....++++++++++++++++++++++++++++++++++++++++++++++....",
+"....++++++++++++++++++++++++++++++++++++++++++++++....",
+"....++++++++++++++++++++++++++++++++++++++++++++++....",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................"};
diff --git a/symbols/audioleft.xpm b/symbols/audioleft.xpm
new file mode 100644
index 0000000..3534239
--- /dev/null
+++ b/symbols/audioleft.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static const char *const audioleft_xpm[] = {
+"54 36 2 1",
+". c #ffffff",
+"# c #000000",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"...........######....................######...........",
+".........##########................##########.........",
+"........############..............############........",
+".......##############............##############.......",
+"......################..........#####......#####......",
+".....##################........#####........#####.....",
+".....##################........####..........####.....",
+"....####################......####............####....",
+"....####################......####............####....",
+"....####################......####............####....",
+"....####################......####............####....",
+"....####################......####............####....",
+"....####################......####............####....",
+".....##################........####..........####.....",
+".....##################........#####........#####.....",
+"......################..........#####......#####......",
+".......##############............##############.......",
+"........############..............############........",
+".........##########................##########.........",
+"...........######....................######...........",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................"};
diff --git a/symbols/audioright.xpm b/symbols/audioright.xpm
new file mode 100644
index 0000000..f16920d
--- /dev/null
+++ b/symbols/audioright.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static const char *const audioright_xpm[] = {
+"54 36 2 1",
+". c #ffffff",
+"# c #000000",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"...........######....................######...........",
+".........##########................##########.........",
+"........############..............############........",
+".......##############............##############.......",
+"......#####......#####..........################......",
+".....#####........#####........##################.....",
+".....####..........####........##################.....",
+"....####............####......####################....",
+"....####............####......####################....",
+"....####............####......####################....",
+"....####............####......####################....",
+"....####............####......####################....",
+"....####............####......####################....",
+".....####..........####........##################.....",
+".....#####........#####........##################.....",
+"......#####......#####..........################......",
+".......##############............##############.......",
+"........############..............############........",
+".........##########................##########.........",
+"...........######....................######...........",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................"};
diff --git a/symbols/audiostereo.xpm b/symbols/audiostereo.xpm
new file mode 100644
index 0000000..6529b79
--- /dev/null
+++ b/symbols/audiostereo.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static const char *const audiostereo_xpm[] = {
+"54 36 2 1",
+". c #ffffff",
+"# c #000000",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"...........######....................######...........",
+".........##########................##########.........",
+"........############..............############........",
+".......##############............##############.......",
+"......################..........################......",
+".....##################........##################.....",
+".....##################........##################.....",
+"....####################......####################....",
+"....####################......####################....",
+"....####################......####################....",
+"....####################......####################....",
+"....####################......####################....",
+"....####################......####################....",
+".....##################........##################.....",
+".....##################........##################.....",
+"......################..........################......",
+".......##############............##############.......",
+"........############..............############........",
+".........##########................##########.........",
+"...........######....................######...........",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................"};
diff --git a/symbols/dolbydigital.xpm b/symbols/dolbydigital.xpm
new file mode 100644
index 0000000..99e0e3e
--- /dev/null
+++ b/symbols/dolbydigital.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static const char *const dolbydigital_xpm[] = {
+"54 36 2 1",
+". c #ffffff",
+"+ c #000000",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"....+++++++++++++++++++++....+++++++++++++++++++++....",
+"....+++++++++++++++++++++....+++++++++++++++++++++....",
+"....+++++++++++++++++++++....+++++++++++++++++++++....",
+"....+++.....+++++++++++++....+++++++++++++.....+++....",
+"....+++.........+++++++++....+++++++++.........+++....",
+"....+++...........+++++++....+++++++...........+++....",
+"....+++............++++++....++++++............+++....",
+"....+++.............+++++....+++++.............+++....",
+"....+++.............+++++....+++++.............+++....",
+"....+++..............++++....++++..............+++....",
+"....+++..............++++....++++..............+++....",
+"....+++...............+++....+++...............+++....",
+"....+++...............+++....+++...............+++....",
+"....+++...............+++....+++...............+++....",
+"....+++...............+++....+++...............+++....",
+"....+++...............+++....+++...............+++....",
+"....+++...............+++....+++...............+++....",
+"....+++..............++++....++++..............+++....",
+"....+++..............++++....++++..............+++....",
+"....+++.............+++++....+++++.............+++....",
+"....+++.............+++++....+++++.............+++....",
+"....+++............++++++....++++++............+++....",
+"....+++...........+++++++....+++++++...........+++....",
+"....+++.........+++++++++....+++++++++.........+++....",
+"....+++.....+++++++++++++....+++++++++++++.....+++....",
+"....+++++++++++++++++++++....+++++++++++++++++++++....",
+"....+++++++++++++++++++++....+++++++++++++++++++++....",
+"....+++++++++++++++++++++....+++++++++++++++++++++....",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................"};
diff --git a/symbols/encrypted.xpm b/symbols/encrypted.xpm
new file mode 100644
index 0000000..36d1787
--- /dev/null
+++ b/symbols/encrypted.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static const char *const encrypted_xpm[] = {
+"54 36 2 1",
+". c #ffffff",
+"+ c #000000",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"....++++++++++++++++++++++++++++++++++++++++++++++....",
+"....++++++++++++++++++++++++++++++++++++++++++++++....",
+"....++++++++++++++++++++++++++++++++++++++++++++++....",
+"....+++........................................+++....",
+"....+++........................................+++....",
+"....+++........................................+++....",
+"....+++...........................++++.........+++....",
+"....+++..........................++++++........+++....",
+"....+++.........................++++++++.......+++....",
+"....+++........................++++++++++......+++....",
+"....+++.......................+++++..+++++.....+++....",
+"....+++......................+++++....+++++....+++....",
+"....+++...+++++++++++++++++++++++......+++++...+++....",
+"....+++...++++++++++++++++++++++........++++...+++....",
+"....+++...++++++++++++++++++++++........++++...+++....",
+"....+++...+++++++++++++++++++++++......+++++...+++....",
+"....+++.....++++++...........+++++....+++++....+++....",
+"....+++.....++++++............+++++..+++++.....+++....",
+"....+++.....++++++.............++++++++++......+++....",
+"....+++.....++++++..............++++++++.......+++....",
+"....+++.....++++++...............++++++........+++....",
+"....+++...........................++++.........+++....",
+"....+++........................................+++....",
+"....+++........................................+++....",
+"....+++........................................+++....",
+"....++++++++++++++++++++++++++++++++++++++++++++++....",
+"....++++++++++++++++++++++++++++++++++++++++++++++....",
+"....++++++++++++++++++++++++++++++++++++++++++++++....",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................"};
diff --git a/symbols/ffwd.xpm b/symbols/ffwd.xpm
new file mode 100644
index 0000000..969d5f1
--- /dev/null
+++ b/symbols/ffwd.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static const char *const ffwd_xpm[] = {
+"56 52 2 1",
+". c #ffffff",
+"# c #000000",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"....####............#####...............................",
+"....#####...........#######.............................",
+"....######..........########............................",
+"....#######.........#########...........................",
+"....########........###########.........................",
+"....#########........###########........................",
+"....##########........###########.......................",
+"....###########........############.....................",
+"....############........############....................",
+"....#############........############...................",
+"....##############........#############.................",
+"....###############........#############................",
+"....################........#############...............",
+"....#################........##############.............",
+"....##################........##############............",
+"....###################........##############...........",
+"....####################........###############.........",
+"....#####################........###############........",
+"....######################........###############.......",
+"....#######################........################.....",
+"....########################........################....",
+"....########################........################....",
+"....########################........################....",
+"....########################........################....",
+"....#######################........################.....",
+"....######################........###############.......",
+"....#####################........###############........",
+"....####################........###############.........",
+"....###################........##############...........",
+"....##################........##############............",
+"....#################........##############.............",
+"....################........#############...............",
+"....###############........#############................",
+"....##############........#############.................",
+"....#############........############...................",
+"....############........############....................",
+"....###########........############.....................",
+"....##########........###########.......................",
+"....#########........###########........................",
+"....########........###########.........................",
+"....#######.........#########...........................",
+"....######..........########............................",
+"....#####...........#######.............................",
+"....####............#####...............................",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................"};
diff --git a/symbols/ffwd1.xpm b/symbols/ffwd1.xpm
new file mode 100644
index 0000000..ec63484
--- /dev/null
+++ b/symbols/ffwd1.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static const char *const ffwd1_xpm[] = {
+"56 52 2 1",
+". c #ffffff",
+"# c #000000",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"....######..........########............................",
+"....#######.........#########...........................",
+"....########........###########.........................",
+"....#########........###########........................",
+"....##########........###########.......................",
+"....###########........############.....................",
+"....############........############....................",
+"....#############........############...................",
+"....##############........#############.................",
+"....###############........#############................",
+"....################........#############...............",
+"....#################........##############.............",
+"....##################........##############............",
+"....###################........##############...........",
+"....####################........###############.........",
+"....#####################........###############........",
+"....######################........###############.......",
+"....#######################........################.....",
+"....########################........################....",
+"....########################........################....",
+"....########################........################....",
+"....########################........################....",
+"....#######################........################.....",
+"....######################........###############.......",
+"....#####################........###############........",
+"....####################........###############.........",
+"....###################........##############...........",
+"....##################........##############............",
+"....#################........##############.............",
+"....################........#############...............",
+"....###############........#############................",
+"....##############........#############.................",
+"....#############........############...................",
+"....############........############....................",
+"....###########........############.....................",
+"....##########........###########.......................",
+"....#########........###########........................",
+"....########........###########.........................",
+"....#######.........#########...........................",
+"....######..........########............................",
+"........................................................",
+"........................................................",
+"....############........................................",
+"....############........................................",
+"....############........................................",
+"........................................................",
+"........................................................",
+"........................................................"};
diff --git a/symbols/ffwd2.xpm b/symbols/ffwd2.xpm
new file mode 100644
index 0000000..654cc11
--- /dev/null
+++ b/symbols/ffwd2.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static const char *const ffwd2_xpm[] = {
+"56 52 2 1",
+". c #ffffff",
+"# c #000000",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"....######..........########............................",
+"....#######.........#########...........................",
+"....########........###########.........................",
+"....#########........###########........................",
+"....##########........###########.......................",
+"....###########........############.....................",
+"....############........############....................",
+"....#############........############...................",
+"....##############........#############.................",
+"....###############........#############................",
+"....################........#############...............",
+"....#################........##############.............",
+"....##################........##############............",
+"....###################........##############...........",
+"....####################........###############.........",
+"....#####################........###############........",
+"....######################........###############.......",
+"....#######################........################.....",
+"....########################........################....",
+"....########################........################....",
+"....########################........################....",
+"....########################........################....",
+"....#######################........################.....",
+"....######################........###############.......",
+"....#####################........###############........",
+"....####################........###############.........",
+"....###################........##############...........",
+"....##################........##############............",
+"....#################........##############.............",
+"....################........#############...............",
+"....###############........#############................",
+"....##############........#############.................",
+"....#############........############...................",
+"....############........############....................",
+"....###########........############.....................",
+"....##########........###########.......................",
+"....#########........###########........................",
+"....########........###########.........................",
+"....#######.........#########...........................",
+"....######..........########............................",
+"........................................................",
+"........................................................",
+"....############......############......................",
+"....############......############......................",
+"....############......############......................",
+"........................................................",
+"........................................................",
+"........................................................"};
diff --git a/symbols/ffwd3.xpm b/symbols/ffwd3.xpm
new file mode 100644
index 0000000..0e71a04
--- /dev/null
+++ b/symbols/ffwd3.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static const char *const ffwd3_xpm[] = {
+"56 52 2 1",
+". c #ffffff",
+"# c #000000",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"....######..........########............................",
+"....#######.........#########...........................",
+"....########........###########.........................",
+"....#########........###########........................",
+"....##########........###########.......................",
+"....###########........############.....................",
+"....############........############....................",
+"....#############........############...................",
+"....##############........#############.................",
+"....###############........#############................",
+"....################........#############...............",
+"....#################........##############.............",
+"....##################........##############............",
+"....###################........##############...........",
+"....####################........###############.........",
+"....#####################........###############........",
+"....######################........###############.......",
+"....#######################........################.....",
+"....########################........################....",
+"....########################........################....",
+"....########################........################....",
+"....########################........################....",
+"....#######################........################.....",
+"....######################........###############.......",
+"....#####################........###############........",
+"....####################........###############.........",
+"....###################........##############...........",
+"....##################........##############............",
+"....#################........##############.............",
+"....################........#############...............",
+"....###############........#############................",
+"....##############........#############.................",
+"....#############........############...................",
+"....############........############....................",
+"....###########........############.....................",
+"....##########........###########.......................",
+"....#########........###########........................",
+"....########........###########.........................",
+"....#######.........#########...........................",
+"....######..........########............................",
+"........................................................",
+"........................................................",
+"....############......############......############....",
+"....############......############......############....",
+"....############......############......############....",
+"........................................................",
+"........................................................",
+"........................................................"};
diff --git a/symbols/frew.xpm b/symbols/frew.xpm
new file mode 100644
index 0000000..d26460e
--- /dev/null
+++ b/symbols/frew.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static const char *const frew_xpm[] = {
+"56 52 2 1",
+". c #FFFFFF",
+"+ c #000000",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"...............................+++++............++++....",
+".............................+++++++...........+++++....",
+"............................++++++++..........++++++....",
+"...........................+++++++++.........+++++++....",
+".........................+++++++++++........++++++++....",
+"........................+++++++++++........+++++++++....",
+".......................+++++++++++........++++++++++....",
+".....................++++++++++++........+++++++++++....",
+"....................++++++++++++........++++++++++++....",
+"...................++++++++++++........+++++++++++++....",
+".................+++++++++++++........++++++++++++++....",
+"................+++++++++++++........+++++++++++++++....",
+"...............+++++++++++++........++++++++++++++++....",
+".............++++++++++++++........+++++++++++++++++....",
+"............++++++++++++++........++++++++++++++++++....",
+"...........++++++++++++++........+++++++++++++++++++....",
+".........+++++++++++++++........++++++++++++++++++++....",
+"........+++++++++++++++........+++++++++++++++++++++....",
+".......+++++++++++++++........++++++++++++++++++++++....",
+".....++++++++++++++++........+++++++++++++++++++++++....",
+"....++++++++++++++++........++++++++++++++++++++++++....",
+"....++++++++++++++++........++++++++++++++++++++++++....",
+"....++++++++++++++++........++++++++++++++++++++++++....",
+"....++++++++++++++++........++++++++++++++++++++++++....",
+".....++++++++++++++++........+++++++++++++++++++++++....",
+".......+++++++++++++++........++++++++++++++++++++++....",
+"........+++++++++++++++........+++++++++++++++++++++....",
+".........+++++++++++++++........++++++++++++++++++++....",
+"...........++++++++++++++........+++++++++++++++++++....",
+"............++++++++++++++........++++++++++++++++++....",
+".............++++++++++++++........+++++++++++++++++....",
+"...............+++++++++++++........++++++++++++++++....",
+"................+++++++++++++........+++++++++++++++....",
+".................+++++++++++++........++++++++++++++....",
+"...................++++++++++++........+++++++++++++....",
+"....................++++++++++++........++++++++++++....",
+".....................++++++++++++........+++++++++++....",
+".......................+++++++++++........++++++++++....",
+"........................+++++++++++........+++++++++....",
+".........................+++++++++++........++++++++....",
+"...........................+++++++++.........+++++++....",
+"............................++++++++..........++++++....",
+".............................+++++++...........+++++....",
+"...............................+++++............++++....",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................"};
diff --git a/symbols/frew1.xpm b/symbols/frew1.xpm
new file mode 100644
index 0000000..bfc526c
--- /dev/null
+++ b/symbols/frew1.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static const char *const frew1_xpm[] = {
+"56 52 2 1",
+". c #FFFFFF",
+"+ c #000000",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"............................++++++++..........++++++....",
+"...........................+++++++++.........+++++++....",
+".........................+++++++++++........++++++++....",
+"........................+++++++++++........+++++++++....",
+".......................+++++++++++........++++++++++....",
+".....................++++++++++++........+++++++++++....",
+"....................++++++++++++........++++++++++++....",
+"...................++++++++++++........+++++++++++++....",
+".................+++++++++++++........++++++++++++++....",
+"................+++++++++++++........+++++++++++++++....",
+"...............+++++++++++++........++++++++++++++++....",
+".............++++++++++++++........+++++++++++++++++....",
+"............++++++++++++++........++++++++++++++++++....",
+"...........++++++++++++++........+++++++++++++++++++....",
+".........+++++++++++++++........++++++++++++++++++++....",
+"........+++++++++++++++........+++++++++++++++++++++....",
+".......+++++++++++++++........++++++++++++++++++++++....",
+".....++++++++++++++++........+++++++++++++++++++++++....",
+"....++++++++++++++++........++++++++++++++++++++++++....",
+"....++++++++++++++++........++++++++++++++++++++++++....",
+"....++++++++++++++++........++++++++++++++++++++++++....",
+"....++++++++++++++++........++++++++++++++++++++++++....",
+".....++++++++++++++++........+++++++++++++++++++++++....",
+".......+++++++++++++++........++++++++++++++++++++++....",
+"........+++++++++++++++........+++++++++++++++++++++....",
+".........+++++++++++++++........++++++++++++++++++++....",
+"...........++++++++++++++........+++++++++++++++++++....",
+"............++++++++++++++........++++++++++++++++++....",
+".............++++++++++++++........+++++++++++++++++....",
+"...............+++++++++++++........++++++++++++++++....",
+"................+++++++++++++........+++++++++++++++....",
+".................+++++++++++++........++++++++++++++....",
+"...................++++++++++++........+++++++++++++....",
+"....................++++++++++++........++++++++++++....",
+".....................++++++++++++........+++++++++++....",
+".......................+++++++++++........++++++++++....",
+"........................+++++++++++........+++++++++....",
+".........................+++++++++++........++++++++....",
+"...........................+++++++++.........+++++++....",
+"............................++++++++..........++++++....",
+"........................................................",
+"........................................................",
+"........................................++++++++++++....",
+"........................................++++++++++++....",
+"........................................++++++++++++....",
+"........................................................",
+"........................................................",
+"........................................................"};
diff --git a/symbols/frew2.xpm b/symbols/frew2.xpm
new file mode 100644
index 0000000..626c12a
--- /dev/null
+++ b/symbols/frew2.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static const char *const frew2_xpm[] = {
+"56 52 2 1",
+". c #FFFFFF",
+"+ c #000000",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"............................++++++++..........++++++....",
+"...........................+++++++++.........+++++++....",
+".........................+++++++++++........++++++++....",
+"........................+++++++++++........+++++++++....",
+".......................+++++++++++........++++++++++....",
+".....................++++++++++++........+++++++++++....",
+"....................++++++++++++........++++++++++++....",
+"...................++++++++++++........+++++++++++++....",
+".................+++++++++++++........++++++++++++++....",
+"................+++++++++++++........+++++++++++++++....",
+"...............+++++++++++++........++++++++++++++++....",
+".............++++++++++++++........+++++++++++++++++....",
+"............++++++++++++++........++++++++++++++++++....",
+"...........++++++++++++++........+++++++++++++++++++....",
+".........+++++++++++++++........++++++++++++++++++++....",
+"........+++++++++++++++........+++++++++++++++++++++....",
+".......+++++++++++++++........++++++++++++++++++++++....",
+".....++++++++++++++++........+++++++++++++++++++++++....",
+"....++++++++++++++++........++++++++++++++++++++++++....",
+"....++++++++++++++++........++++++++++++++++++++++++....",
+"....++++++++++++++++........++++++++++++++++++++++++....",
+"....++++++++++++++++........++++++++++++++++++++++++....",
+".....++++++++++++++++........+++++++++++++++++++++++....",
+".......+++++++++++++++........++++++++++++++++++++++....",
+"........+++++++++++++++........+++++++++++++++++++++....",
+".........+++++++++++++++........++++++++++++++++++++....",
+"...........++++++++++++++........+++++++++++++++++++....",
+"............++++++++++++++........++++++++++++++++++....",
+".............++++++++++++++........+++++++++++++++++....",
+"...............+++++++++++++........++++++++++++++++....",
+"................+++++++++++++........+++++++++++++++....",
+".................+++++++++++++........++++++++++++++....",
+"...................++++++++++++........+++++++++++++....",
+"....................++++++++++++........++++++++++++....",
+".....................++++++++++++........+++++++++++....",
+".......................+++++++++++........++++++++++....",
+"........................+++++++++++........+++++++++....",
+".........................+++++++++++........++++++++....",
+"...........................+++++++++.........+++++++....",
+"............................++++++++..........++++++....",
+"........................................................",
+"........................................................",
+"......................++++++++++++......++++++++++++....",
+"......................++++++++++++......++++++++++++....",
+"......................++++++++++++......++++++++++++....",
+"........................................................",
+"........................................................",
+"........................................................"};
diff --git a/symbols/frew3.xpm b/symbols/frew3.xpm
new file mode 100644
index 0000000..11d6451
--- /dev/null
+++ b/symbols/frew3.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static const char *const frew3_xpm[] = {
+"56 52 2 1",
+". c #FFFFFF",
+"+ c #000000",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"............................++++++++..........++++++....",
+"...........................+++++++++.........+++++++....",
+".........................+++++++++++........++++++++....",
+"........................+++++++++++........+++++++++....",
+".......................+++++++++++........++++++++++....",
+".....................++++++++++++........+++++++++++....",
+"....................++++++++++++........++++++++++++....",
+"...................++++++++++++........+++++++++++++....",
+".................+++++++++++++........++++++++++++++....",
+"................+++++++++++++........+++++++++++++++....",
+"...............+++++++++++++........++++++++++++++++....",
+".............++++++++++++++........+++++++++++++++++....",
+"............++++++++++++++........++++++++++++++++++....",
+"...........++++++++++++++........+++++++++++++++++++....",
+".........+++++++++++++++........++++++++++++++++++++....",
+"........+++++++++++++++........+++++++++++++++++++++....",
+".......+++++++++++++++........++++++++++++++++++++++....",
+".....++++++++++++++++........+++++++++++++++++++++++....",
+"....++++++++++++++++........++++++++++++++++++++++++....",
+"....++++++++++++++++........++++++++++++++++++++++++....",
+"....++++++++++++++++........++++++++++++++++++++++++....",
+"....++++++++++++++++........++++++++++++++++++++++++....",
+".....++++++++++++++++........+++++++++++++++++++++++....",
+".......+++++++++++++++........++++++++++++++++++++++....",
+"........+++++++++++++++........+++++++++++++++++++++....",
+".........+++++++++++++++........++++++++++++++++++++....",
+"...........++++++++++++++........+++++++++++++++++++....",
+"............++++++++++++++........++++++++++++++++++....",
+".............++++++++++++++........+++++++++++++++++....",
+"...............+++++++++++++........++++++++++++++++....",
+"................+++++++++++++........+++++++++++++++....",
+".................+++++++++++++........++++++++++++++....",
+"...................++++++++++++........+++++++++++++....",
+"....................++++++++++++........++++++++++++....",
+".....................++++++++++++........+++++++++++....",
+".......................+++++++++++........++++++++++....",
+"........................+++++++++++........+++++++++....",
+".........................+++++++++++........++++++++....",
+"...........................+++++++++.........+++++++....",
+"............................++++++++..........++++++....",
+"........................................................",
+"........................................................",
+"....++++++++++++......++++++++++++......++++++++++++....",
+"....++++++++++++......++++++++++++......++++++++++++....",
+"....++++++++++++......++++++++++++......++++++++++++....",
+"........................................................",
+"........................................................",
+"........................................................"};
diff --git a/symbols/mute-1.xpm b/symbols/mute-1.xpm
new file mode 100644
index 0000000..8900c3e
--- /dev/null
+++ b/symbols/mute-1.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static const char *const mute_xpm[] = {
+"52 40 2 1",
+". c #ffffff",
+"# c #000000",
+"............###...............####...............###",
+"............####..............####..............####",
+"............#####...........######.............#####",
+".............#####........########............#####.",
+"..............#####.....##########...........#####..",
+"...............#####...###########..........#####...",
+"................#####..####...####.........#####....",
+".................#####..#.....####........#####.....",
+"..................#####.......####.......#####......",
+"..............##...#####......####......#####.......",
+"............#####...#####.....####.....#####........",
+"..........########...#####....####....#####.........",
+"#################.....#####..........#####..........",
+"###############........#####........#####...........",
+"##############..........#####......#####............",
+"##############...........#####....#####.............",
+"####......####............############..............",
+"####......####.............##########...............",
+"####......####..............########................",
+"####......####..............########................",
+"####......####..............########................",
+"####......####..............########................",
+"####......####.............##########...............",
+"####......####............############..............",
+"##############...........#####....#####.............",
+"##############..........#####......#####............",
+"###############........#####........#####...........",
+"#################.....#####..........#####..........",
+"..........########...#####....####....#####.........",
+"............#####...#####.....####.....#####........",
+"..............##...#####......####......#####.......",
+"..................#####.......####.......#####......",
+".................#####..#.....####........#####.....",
+"................#####..####...####.........#####....",
+"...............#####...###########..........#####...",
+"..............#####.....##########...........#####..",
+".............#####........########............#####.",
+"............#####...........######.............#####",
+"............####..............####..............####",
+"............###...............####...............###"};
diff --git a/symbols/mute.xpm b/symbols/mute.xpm
new file mode 100644
index 0000000..7aa0b2c
--- /dev/null
+++ b/symbols/mute.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static const char *const mute_xpm[] = {
+"54 36 2 1",
+". c #ffffff",
+"# c #000000",
+"............#####..............####..............#####",
+"............######...........######.............######",
+".............######........########............######.",
+"..............######.....##########...........######..",
+"...............######..############..........######...",
+"................######..####...####.........######....",
+".................######..#.....####........######.....",
+"..................######.......####.......######......",
+"...............#...######......####......######.......",
+".............####...######.....####.....######........",
+"...........#######...######....####....######.........",
+"..###############.....######..........######..........",
+"###############........######........######...........",
+"##############..........######......######............",
+"##############...........################.............",
+"####.......###............##############..............",
+"####.......###.............############...............",
+"####.......###..............##########................",
+"####.......###..............##########................",
+"####.......###.............############...............",
+"####.......###............##############..............",
+"##############...........################.............",
+"##############..........######......######............",
+"###############........######........######...........",
+"..###############.....######..........######..........",
+"...........#######...######....####....######.........",
+".............####...######.....####.....######........",
+"...............#...######......####......######.......",
+"..................######.......####.......######......",
+".................######..#.....####........######.....",
+"................######..####...####.........######....",
+"...............######..############..........######...",
+"..............######.....##########...........######..",
+".............######........########............######.",
+"............######...........######.............######",
+"............#####..............####..............#####"};
diff --git a/symbols/pause.xpm b/symbols/pause.xpm
new file mode 100644
index 0000000..d9283f9
--- /dev/null
+++ b/symbols/pause.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static const char *const pause_xpm[] = {
+"56 52 2 1",
+". c #ffffff",
+"# c #000000",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"............##########............##########............",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................"};
diff --git a/symbols/play.xpm b/symbols/play.xpm
new file mode 100644
index 0000000..68c112f
--- /dev/null
+++ b/symbols/play.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static const char *const play_xpm[] = {
+"56 52 2 1",
+". c #ffffff",
+"# c #000000",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"............#####.......................................",
+"............#######.....................................",
+"............########....................................",
+"............#########...................................",
+"............###########.................................",
+"............############................................",
+"............#############...............................",
+"............###############.............................",
+"............################............................",
+"............#################...........................",
+"............###################.........................",
+"............####################........................",
+"............#####################.......................",
+"............#######################.....................",
+"............########################....................",
+"............#########################...................",
+"............###########################.................",
+"............############################................",
+"............#############################...............",
+"............###############################.............",
+"............################################............",
+"............################################............",
+"............################################............",
+"............################################............",
+"............###############################.............",
+"............#############################...............",
+"............############################................",
+"............###########################.................",
+"............#########################...................",
+"............########################....................",
+"............#######################.....................",
+"............#####################.......................",
+"............####################........................",
+"............###################.........................",
+"............#################...........................",
+"............################............................",
+"............###############.............................",
+"............#############...............................",
+"............############................................",
+"............###########.................................",
+"............#########...................................",
+"............########....................................",
+"............#######.....................................",
+"............#####.......................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................"};
diff --git a/symbols/radio.xpm b/symbols/radio.xpm
new file mode 100644
index 0000000..1230f9b
--- /dev/null
+++ b/symbols/radio.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static const char *const radio_xpm[] = {
+"54 36 2 1",
+". c #ffffff",
+"+ c #000000",
+"......................................................",
+"......................................................",
+"........................++++++++++....................",
+"........................++++++++++++++................",
+"........................++++++++++++++++++............",
+"........................++++++++++++++++++++..........",
+"........................++++++++++++++++++++++........",
+"........................+++++++++++++++++++++++.......",
+"........................++++++.......+++++++++++......",
+"........................++++++..........++++++++......",
+"........................++++++............++++++......",
+"........................++++++............+++++.......",
+"........................++++++...........+++++........",
+"........................++++++..........+++++.........",
+"........................++++++..........++++..........",
+"........................++++++..........+++...........",
+"........................++++++........................",
+"........................++++++........................",
+"........................++++++........................",
+"........................++++++........................",
+"........................++++++........................",
+"........................++++++........................",
+"............++++++++++++++++++........................",
+"..........++++++++++++++++++++........................",
+"........+++++++++++++++++++++++.......................",
+"......++++++++++++++++++++++++++......................",
+"....++++++++++++++++++++++++++++++....................",
+"....++++++++++++++++++++++++++++++....................",
+"....++++++++++++++++++++++++++++++....................",
+"....++++++++++++++++++++++++++++++....................",
+"......++++++++++++++++++++++++++......................",
+"........+++++++++++++++++++++++.......................",
+"..........+++++++++++++++++++.........................",
+"............+++++++++++++++...........................",
+"......................................................",
+"......................................................"};
diff --git a/symbols/recording.xpm b/symbols/recording.xpm
new file mode 100644
index 0000000..9134059
--- /dev/null
+++ b/symbols/recording.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static const char *const recording_xpm[] = {
+"54 36 2 1",
+". c #ffffff",
+"+ c #000000",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"....+++++++++++.......++++++++++++....++++++++++++....",
+"....++++++++++++.....+++++++++++++...+++++++++++++....",
+"....+++++++++++++...++++++++++++++..++++++++++++++....",
+"....++++++++++++++..++++++++++++++..++++++++++++++....",
+"....+++++....+++++..+++++...........+++++.............",
+"....++++......++++..++++............++++..............",
+"....++++......++++..++++............++++..............",
+"....++++......++++..++++............++++..............",
+"....++++......++++..++++............++++..............",
+"....++++......++++..++++............++++..............",
+"....++++......++++..++++............++++..............",
+"....+++++....+++++..+++++...........++++..............",
+"....+++++++++++++...++++++++++......++++..............",
+"....++++++++++++....++++++++++......++++..............",
+"....++++++++++......++++++++++......++++..............",
+"....+++++++++.......++++++++++......++++..............",
+"....++++++++++......+++++...........++++..............",
+"....++++..+++++.....++++............++++..............",
+"....++++...+++++....++++............++++..............",
+"....++++....+++++...++++............++++..............",
+"....++++.....+++++..++++............++++..............",
+"....++++......++++..++++............++++..............",
+"....++++......++++..++++............++++..............",
+"....++++......++++..+++++...........+++++.............",
+"....++++......++++..++++++++++++++..++++++++++++++....",
+"....++++......++++..++++++++++++++..++++++++++++++....",
+"....++++......++++...+++++++++++++...+++++++++++++....",
+"....++++......++++....++++++++++++....++++++++++++....",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................"};
diff --git a/symbols/sfwd.xpm b/symbols/sfwd.xpm
new file mode 100644
index 0000000..a6a1246
--- /dev/null
+++ b/symbols/sfwd.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static const char *const sfwd_xpm[] = {
+"56 52 2 1",
+". c #ffffff",
+"# c #000000",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"....##########......#####...............................",
+"....##########......#######.............................",
+"....##########......########............................",
+"....##########......#########...........................",
+"....##########......###########.........................",
+"....##########......############........................",
+"....##########......#############.......................",
+"....##########......###############.....................",
+"....##########......################....................",
+"....##########......#################...................",
+"....##########......###################.................",
+"....##########......####################................",
+"....##########......#####################...............",
+"....##########......#######################.............",
+"....##########......########################............",
+"....##########......#########################...........",
+"....##########......###########################.........",
+"....##########......############################........",
+"....##########......#############################.......",
+"....##########......###############################.....",
+"....##########......################################....",
+"....##########......################################....",
+"....##########......################################....",
+"....##########......################################....",
+"....##########......###############################.....",
+"....##########......#############################.......",
+"....##########......############################........",
+"....##########......###########################.........",
+"....##########......#########################...........",
+"....##########......########################............",
+"....##########......#######################.............",
+"....##########......#####################...............",
+"....##########......####################................",
+"....##########......###################.................",
+"....##########......#################...................",
+"....##########......################....................",
+"....##########......###############.....................",
+"....##########......#############.......................",
+"....##########......############........................",
+"....##########......###########.........................",
+"....##########......#########...........................",
+"....##########......########............................",
+"....##########......#######.............................",
+"....##########......#####...............................",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................"};
diff --git a/symbols/sfwd1.xpm b/symbols/sfwd1.xpm
new file mode 100644
index 0000000..5c2365f
--- /dev/null
+++ b/symbols/sfwd1.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static const char *const sfwd1_xpm[] = {
+"56 52 2 1",
+". c #ffffff",
+"# c #000000",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"....##########......########............................",
+"....##########......#########...........................",
+"....##########......###########.........................",
+"....##########......############........................",
+"....##########......#############.......................",
+"....##########......###############.....................",
+"....##########......################....................",
+"....##########......#################...................",
+"....##########......###################.................",
+"....##########......####################................",
+"....##########......#####################...............",
+"....##########......#######################.............",
+"....##########......########################............",
+"....##########......#########################...........",
+"....##########......###########################.........",
+"....##########......############################........",
+"....##########......#############################.......",
+"....##########......###############################.....",
+"....##########......################################....",
+"....##########......################################....",
+"....##########......################################....",
+"....##########......################################....",
+"....##########......###############################.....",
+"....##########......#############################.......",
+"....##########......############################........",
+"....##########......###########################.........",
+"....##########......#########################...........",
+"....##########......########################............",
+"....##########......#######################.............",
+"....##########......#####################...............",
+"....##########......####################................",
+"....##########......###################.................",
+"....##########......#################...................",
+"....##########......################....................",
+"....##########......###############.....................",
+"....##########......#############.......................",
+"....##########......############........................",
+"....##########......###########.........................",
+"....##########......#########...........................",
+"....##########......########............................",
+"........................................................",
+"........................................................",
+"....############........................................",
+"....############........................................",
+"....############........................................",
+"........................................................",
+"........................................................",
+"........................................................"};
diff --git a/symbols/sfwd2.xpm b/symbols/sfwd2.xpm
new file mode 100644
index 0000000..9a5c224
--- /dev/null
+++ b/symbols/sfwd2.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static const char *const sfwd2_xpm[] = {
+"56 52 2 1",
+". c #ffffff",
+"# c #000000",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"....##########......########............................",
+"....##########......#########...........................",
+"....##########......###########.........................",
+"....##########......############........................",
+"....##########......#############.......................",
+"....##########......###############.....................",
+"....##########......################....................",
+"....##########......#################...................",
+"....##########......###################.................",
+"....##########......####################................",
+"....##########......#####################...............",
+"....##########......#######################.............",
+"....##########......########################............",
+"....##########......#########################...........",
+"....##########......###########################.........",
+"....##########......############################........",
+"....##########......#############################.......",
+"....##########......###############################.....",
+"....##########......################################....",
+"....##########......################################....",
+"....##########......################################....",
+"....##########......################################....",
+"....##########......###############################.....",
+"....##########......#############################.......",
+"....##########......############################........",
+"....##########......###########################.........",
+"....##########......#########################...........",
+"....##########......########################............",
+"....##########......#######################.............",
+"....##########......#####################...............",
+"....##########......####################................",
+"....##########......###################.................",
+"....##########......#################...................",
+"....##########......################....................",
+"....##########......###############.....................",
+"....##########......#############.......................",
+"....##########......############........................",
+"....##########......###########.........................",
+"....##########......#########...........................",
+"....##########......########............................",
+"........................................................",
+"........................................................",
+"....############......############......................",
+"....############......############......................",
+"....############......############......................",
+"........................................................",
+"........................................................",
+"........................................................"};
diff --git a/symbols/sfwd3.xpm b/symbols/sfwd3.xpm
new file mode 100644
index 0000000..37e90f5
--- /dev/null
+++ b/symbols/sfwd3.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static const char *const sfwd3_xpm[] = {
+"56 52 2 1",
+". c #ffffff",
+"# c #000000",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"....##########......########............................",
+"....##########......#########...........................",
+"....##########......###########.........................",
+"....##########......############........................",
+"....##########......#############.......................",
+"....##########......###############.....................",
+"....##########......################....................",
+"....##########......#################...................",
+"....##########......###################.................",
+"....##########......####################................",
+"....##########......#####################...............",
+"....##########......#######################.............",
+"....##########......########################............",
+"....##########......#########################...........",
+"....##########......###########################.........",
+"....##########......############################........",
+"....##########......#############################.......",
+"....##########......###############################.....",
+"....##########......################################....",
+"....##########......################################....",
+"....##########......################################....",
+"....##########......################################....",
+"....##########......###############################.....",
+"....##########......#############################.......",
+"....##########......############################........",
+"....##########......###########################.........",
+"....##########......#########################...........",
+"....##########......########################............",
+"....##########......#######################.............",
+"....##########......#####################...............",
+"....##########......####################................",
+"....##########......###################.................",
+"....##########......#################...................",
+"....##########......################....................",
+"....##########......###############.....................",
+"....##########......#############.......................",
+"....##########......############........................",
+"....##########......###########.........................",
+"....##########......#########...........................",
+"....##########......########............................",
+"........................................................",
+"........................................................",
+"....############......############......############....",
+"....############......############......############....",
+"....############......############......############....",
+"........................................................",
+"........................................................",
+"........................................................"};
diff --git a/symbols/srew.xpm b/symbols/srew.xpm
new file mode 100644
index 0000000..1ae2115
--- /dev/null
+++ b/symbols/srew.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static const char *const srew_xpm[] = {
+"56 52 2 1",
+". c #FFFFFF",
+"+ c #000000",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"...............................+++++......++++++++++....",
+".............................+++++++......++++++++++....",
+"............................++++++++......++++++++++....",
+"...........................+++++++++......++++++++++....",
+".........................+++++++++++......++++++++++....",
+"........................++++++++++++......++++++++++....",
+".......................+++++++++++++......++++++++++....",
+".....................+++++++++++++++......++++++++++....",
+"....................++++++++++++++++......++++++++++....",
+"...................+++++++++++++++++......++++++++++....",
+".................+++++++++++++++++++......++++++++++....",
+"................++++++++++++++++++++......++++++++++....",
+"...............+++++++++++++++++++++......++++++++++....",
+".............+++++++++++++++++++++++......++++++++++....",
+"............++++++++++++++++++++++++......++++++++++....",
+"...........+++++++++++++++++++++++++......++++++++++....",
+".........+++++++++++++++++++++++++++......++++++++++....",
+"........++++++++++++++++++++++++++++......++++++++++....",
+".......+++++++++++++++++++++++++++++......++++++++++....",
+".....+++++++++++++++++++++++++++++++......++++++++++....",
+"....++++++++++++++++++++++++++++++++......++++++++++....",
+"....++++++++++++++++++++++++++++++++......++++++++++....",
+"....++++++++++++++++++++++++++++++++......++++++++++....",
+"....++++++++++++++++++++++++++++++++......++++++++++....",
+".....+++++++++++++++++++++++++++++++......++++++++++....",
+".......+++++++++++++++++++++++++++++......++++++++++....",
+"........++++++++++++++++++++++++++++......++++++++++....",
+".........+++++++++++++++++++++++++++......++++++++++....",
+"...........+++++++++++++++++++++++++......++++++++++....",
+"............++++++++++++++++++++++++......++++++++++....",
+".............+++++++++++++++++++++++......++++++++++....",
+"...............+++++++++++++++++++++......++++++++++....",
+"................++++++++++++++++++++......++++++++++....",
+".................+++++++++++++++++++......++++++++++....",
+"...................+++++++++++++++++......++++++++++....",
+"....................++++++++++++++++......++++++++++....",
+".....................+++++++++++++++......++++++++++....",
+".......................+++++++++++++......++++++++++....",
+"........................++++++++++++......++++++++++....",
+".........................+++++++++++......++++++++++....",
+"...........................+++++++++......++++++++++....",
+"............................++++++++......++++++++++....",
+".............................+++++++......++++++++++....",
+"...............................+++++......++++++++++....",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................"};
diff --git a/symbols/srew1.xpm b/symbols/srew1.xpm
new file mode 100644
index 0000000..a61bd90
--- /dev/null
+++ b/symbols/srew1.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static const char *const srew1_xpm[] = {
+"56 52 2 1",
+". c #FFFFFF",
+"+ c #000000",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"............................++++++++......++++++++++....",
+"...........................+++++++++......++++++++++....",
+".........................+++++++++++......++++++++++....",
+"........................++++++++++++......++++++++++....",
+".......................+++++++++++++......++++++++++....",
+".....................+++++++++++++++......++++++++++....",
+"....................++++++++++++++++......++++++++++....",
+"...................+++++++++++++++++......++++++++++....",
+".................+++++++++++++++++++......++++++++++....",
+"................++++++++++++++++++++......++++++++++....",
+"...............+++++++++++++++++++++......++++++++++....",
+".............+++++++++++++++++++++++......++++++++++....",
+"............++++++++++++++++++++++++......++++++++++....",
+"...........+++++++++++++++++++++++++......++++++++++....",
+".........+++++++++++++++++++++++++++......++++++++++....",
+"........++++++++++++++++++++++++++++......++++++++++....",
+".......+++++++++++++++++++++++++++++......++++++++++....",
+".....+++++++++++++++++++++++++++++++......++++++++++....",
+"....++++++++++++++++++++++++++++++++......++++++++++....",
+"....++++++++++++++++++++++++++++++++......++++++++++....",
+"....++++++++++++++++++++++++++++++++......++++++++++....",
+"....++++++++++++++++++++++++++++++++......++++++++++....",
+".....+++++++++++++++++++++++++++++++......++++++++++....",
+".......+++++++++++++++++++++++++++++......++++++++++....",
+"........++++++++++++++++++++++++++++......++++++++++....",
+".........+++++++++++++++++++++++++++......++++++++++....",
+"...........+++++++++++++++++++++++++......++++++++++....",
+"............++++++++++++++++++++++++......++++++++++....",
+".............+++++++++++++++++++++++......++++++++++....",
+"...............+++++++++++++++++++++......++++++++++....",
+"................++++++++++++++++++++......++++++++++....",
+".................+++++++++++++++++++......++++++++++....",
+"...................+++++++++++++++++......++++++++++....",
+"....................++++++++++++++++......++++++++++....",
+".....................+++++++++++++++......++++++++++....",
+".......................+++++++++++++......++++++++++....",
+"........................++++++++++++......++++++++++....",
+".........................+++++++++++......++++++++++....",
+"...........................+++++++++......++++++++++....",
+"............................++++++++......++++++++++....",
+"........................................................",
+"........................................................",
+"........................................++++++++++++....",
+"........................................++++++++++++....",
+"........................................++++++++++++....",
+"........................................................",
+"........................................................",
+"........................................................"};
diff --git a/symbols/srew2.xpm b/symbols/srew2.xpm
new file mode 100644
index 0000000..7449f8a
--- /dev/null
+++ b/symbols/srew2.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static const char *const srew2_xpm[] = {
+"56 52 2 1",
+". c #FFFFFF",
+"+ c #000000",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"............................++++++++......++++++++++....",
+"...........................+++++++++......++++++++++....",
+".........................+++++++++++......++++++++++....",
+"........................++++++++++++......++++++++++....",
+".......................+++++++++++++......++++++++++....",
+".....................+++++++++++++++......++++++++++....",
+"....................++++++++++++++++......++++++++++....",
+"...................+++++++++++++++++......++++++++++....",
+".................+++++++++++++++++++......++++++++++....",
+"................++++++++++++++++++++......++++++++++....",
+"...............+++++++++++++++++++++......++++++++++....",
+".............+++++++++++++++++++++++......++++++++++....",
+"............++++++++++++++++++++++++......++++++++++....",
+"...........+++++++++++++++++++++++++......++++++++++....",
+".........+++++++++++++++++++++++++++......++++++++++....",
+"........++++++++++++++++++++++++++++......++++++++++....",
+".......+++++++++++++++++++++++++++++......++++++++++....",
+".....+++++++++++++++++++++++++++++++......++++++++++....",
+"....++++++++++++++++++++++++++++++++......++++++++++....",
+"....++++++++++++++++++++++++++++++++......++++++++++....",
+"....++++++++++++++++++++++++++++++++......++++++++++....",
+"....++++++++++++++++++++++++++++++++......++++++++++....",
+".....+++++++++++++++++++++++++++++++......++++++++++....",
+".......+++++++++++++++++++++++++++++......++++++++++....",
+"........++++++++++++++++++++++++++++......++++++++++....",
+".........+++++++++++++++++++++++++++......++++++++++....",
+"...........+++++++++++++++++++++++++......++++++++++....",
+"............++++++++++++++++++++++++......++++++++++....",
+".............+++++++++++++++++++++++......++++++++++....",
+"...............+++++++++++++++++++++......++++++++++....",
+"................++++++++++++++++++++......++++++++++....",
+".................+++++++++++++++++++......++++++++++....",
+"...................+++++++++++++++++......++++++++++....",
+"....................++++++++++++++++......++++++++++....",
+".....................+++++++++++++++......++++++++++....",
+".......................+++++++++++++......++++++++++....",
+"........................++++++++++++......++++++++++....",
+".........................+++++++++++......++++++++++....",
+"...........................+++++++++......++++++++++....",
+"............................++++++++......++++++++++....",
+"........................................................",
+"........................................................",
+"......................++++++++++++......++++++++++++....",
+"......................++++++++++++......++++++++++++....",
+"......................++++++++++++......++++++++++++....",
+"........................................................",
+"........................................................",
+"........................................................"};
diff --git a/symbols/srew3.xpm b/symbols/srew3.xpm
new file mode 100644
index 0000000..c719a5d
--- /dev/null
+++ b/symbols/srew3.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static const char *const srew3_xpm[] = {
+"56 52 2 1",
+". c #FFFFFF",
+"+ c #000000",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"............................++++++++......++++++++++....",
+"...........................+++++++++......++++++++++....",
+".........................+++++++++++......++++++++++....",
+"........................++++++++++++......++++++++++....",
+".......................+++++++++++++......++++++++++....",
+".....................+++++++++++++++......++++++++++....",
+"....................++++++++++++++++......++++++++++....",
+"...................+++++++++++++++++......++++++++++....",
+".................+++++++++++++++++++......++++++++++....",
+"................++++++++++++++++++++......++++++++++....",
+"...............+++++++++++++++++++++......++++++++++....",
+".............+++++++++++++++++++++++......++++++++++....",
+"............++++++++++++++++++++++++......++++++++++....",
+"...........+++++++++++++++++++++++++......++++++++++....",
+".........+++++++++++++++++++++++++++......++++++++++....",
+"........++++++++++++++++++++++++++++......++++++++++....",
+".......+++++++++++++++++++++++++++++......++++++++++....",
+".....+++++++++++++++++++++++++++++++......++++++++++....",
+"....++++++++++++++++++++++++++++++++......++++++++++....",
+"....++++++++++++++++++++++++++++++++......++++++++++....",
+"....++++++++++++++++++++++++++++++++......++++++++++....",
+"....++++++++++++++++++++++++++++++++......++++++++++....",
+".....+++++++++++++++++++++++++++++++......++++++++++....",
+".......+++++++++++++++++++++++++++++......++++++++++....",
+"........++++++++++++++++++++++++++++......++++++++++....",
+".........+++++++++++++++++++++++++++......++++++++++....",
+"...........+++++++++++++++++++++++++......++++++++++....",
+"............++++++++++++++++++++++++......++++++++++....",
+".............+++++++++++++++++++++++......++++++++++....",
+"...............+++++++++++++++++++++......++++++++++....",
+"................++++++++++++++++++++......++++++++++....",
+".................+++++++++++++++++++......++++++++++....",
+"...................+++++++++++++++++......++++++++++....",
+"....................++++++++++++++++......++++++++++....",
+".....................+++++++++++++++......++++++++++....",
+".......................+++++++++++++......++++++++++....",
+"........................++++++++++++......++++++++++....",
+".........................+++++++++++......++++++++++....",
+"...........................+++++++++......++++++++++....",
+"............................++++++++......++++++++++....",
+"........................................................",
+"........................................................",
+"....++++++++++++......++++++++++++......++++++++++++....",
+"....++++++++++++......++++++++++++......++++++++++++....",
+"....++++++++++++......++++++++++++......++++++++++++....",
+"........................................................",
+"........................................................",
+"........................................................"};
diff --git a/symbols/teletext.xpm b/symbols/teletext.xpm
new file mode 100644
index 0000000..0e57687
--- /dev/null
+++ b/symbols/teletext.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static const char *const teletext_xpm[] = {
+"54 36 2 1",
+". c #ffffff",
+"+ c #000000",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................",
+"....++++++++++++++++++++++++++++++++++++++++++++++....",
+"....++++++++++++++++++++++++++++++++++++++++++++++....",
+"....++++++++++++++++++++++++++++++++++++++++++++++....",
+"....+++........................................+++....",
+"....+++........................................+++....",
+"....+++........................................+++....",
+"....+++.....++++++++++++++++++++++++++++++.....+++....",
+"....+++.....++++++++++++++++++++++++++++++.....+++....",
+"....+++.....++++++++++++++++++++++++++++++.....+++....",
+"....+++........................................+++....",
+"....+++........................................+++....",
+"....+++........................................+++....",
+"....+++.....++++++++++++++++++++++++++++++.....+++....",
+"....+++.....++++++++++++++++++++++++++++++.....+++....",
+"....+++.....++++++++++++++++++++++++++++++.....+++....",
+"....+++........................................+++....",
+"....+++........................................+++....",
+"....+++........................................+++....",
+"....+++.....++++++++++++++++++++++++++++++.....+++....",
+"....+++.....++++++++++++++++++++++++++++++.....+++....",
+"....+++.....++++++++++++++++++++++++++++++.....+++....",
+"....+++........................................+++....",
+"....+++........................................+++....",
+"....+++........................................+++....",
+"....+++........................................+++....",
+"....++++++++++++++++++++++++++++++++++++++++++++++....",
+"....++++++++++++++++++++++++++++++++++++++++++++++....",
+"....++++++++++++++++++++++++++++++++++++++++++++++....",
+"......................................................",
+"......................................................",
+"......................................................",
+"......................................................"};
diff --git a/symbols/volume.xpm b/symbols/volume.xpm
new file mode 100644
index 0000000..b5cb5d3
--- /dev/null
+++ b/symbols/volume.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static const char *const volume_xpm[] = {
+"56 28 2 1",
+". c #ffffff",
+"# c #000000",
+"....................................................####",
+"....................................................####",
+"................................................########",
+"................................................########",
+"............................................############",
+"............................................############",
+"........................................################",
+"........................................################",
+"....................................####################",
+"....................................####################",
+"................................########################",
+"................................########################",
+"............................############################",
+"............................############################",
+"........................################################",
+"........................################################",
+"....................####################################",
+"....................####################################",
+"................########################################",
+"................########################################",
+"............############################################",
+"............############################################",
+"........################################################",
+"........################################################",
+"....####################################################",
+"....####################################################",
+"########################################################",
+"########################################################"};
diff --git a/themes/lcarsng-390Lb.theme b/themes/lcarsng-390Lb.theme
new file mode 100644
index 0000000..f608c24
--- /dev/null
+++ b/themes/lcarsng-390Lb.theme
@@ -0,0 +1,110 @@
+Description = 390Lb
+clrBackground = A0141717
+
+clrTrackName = FFFFCC66
+clrAlertFg = FFFFFFFF
+clrAlertBg = FFFF0000
+clrChannelName = FF99CCFF
+clrEventTitle = FF99CCFF
+clrEventTime = FFFFCC66
+clrEventShortText = FFFFCC66
+clrEventDescription = FF99CCFF
+
+
+clrButtonRedFg = FF000000
+clrButtonRedBg = FFf97d7d
+clrButtonGreenFg = FF000000
+clrButtonGreenBg = FF9df97d
+clrButtonYellowFg = FF000000
+clrButtonYellowBg = FFf9f47d
+clrButtonBlueFg = FF000000
+clrButtonBlueBg = FF7db4f9
+
+
+clrMessageStatusFg = FFFFFFFF
+clrMessageStatusBg = FF0000B2
+clrMessageInfoFg = FF000000
+clrMessageInfoBg = FF00B200
+clrMessageWarningFg = FF000000
+clrMessageWarningBg = FFB2B200
+clrMessageErrorFg = FFFFFFFF
+clrMessageErrorBg = FFB20000
+clrVolumeFrame = FFF1DF6F
+clrVolumeSymbol = FF000000
+clrVolumeBarUpper = FFC1B259
+clrVolumeBarLower = FF00B200
+
+clrChannelFrameFg = FF000000
+clrChannelFrameBg = FF8a9ec9
+
+clrChannelSymbolOn = FF50638b
+clrChannelSymbolOff = FF738ec9
+clrChannelSymbolRecFg = FFFFFFFF
+clrChannelSymbolRecBg = FFB20000
+
+
+#Pegel Text
+clrDeviceFg = FFff9900
+#Pegel Hintergrund
+clrDeviceBg = A0141717
+#Pegel Balken
+clrSignalValue = FFff9966
+#Pegel Hintergrund
+clrSignalRest = FFffcc99
+#Timer Text
+clrTimerFg = FF000000
+#Timer hintergrund
+clrTimerBg = FF99CCFF
+#Sendungsfortschritt
+clrSeen = FFCC99CC
+#Datum Vordergrund
+clrDateFg = FF000000
+#Datum Hintergrund
+clrDateBg = FF99CCFF
+#Umrandung unten Vordergrund
+clrMenuFrameFg = FF202740
+#Umrandung unten Hintergrund
+#c#lrMenuFrameBg = FFe0606d
+clrMenuFrameBg = FFFF9966
+#Menue Titel Text
+clrMenuTitle = FFea962d
+
+#Menu Liste
+clrMenuMainBracket = FF9999ff
+#Liste Aktiv Vordergrund
+clrMenuItemCurrentFg = FFffa201
+#Liste Aktiv Hintergrund
+clrMenuItemCurrentBg = FF202740
+#Liste Eintrag
+clrMenuItemSelectable = FF8a9ec9
+#Liste Eintrag (inaktiv)
+clrMenuItemNonSelectable = FF99CCFF
+
+
+
+
+clrMenuTimerRecording = FFF1B1AF
+clrMenuDeviceRecording = FF99CCFF
+
+
+clrMenuScrollbarTotal = FFFFBC57
+clrMenuScrollbarShown = FFCC99CC
+clrMenuScrollbarArrow = FF000000
+clrMenuText = FFff00ff
+
+clrReplayFrameFg = FF000000
+clrReplayFrameBg = FFCC6666
+clrReplayPosition = FFCC99CC
+clrReplayJumpFg = FF000000
+clrReplayJumpBg = FFCC99CC
+clrReplayProgressSeen = FFCC99CC
+clrReplayProgressRest = FFCCCCCC
+clrReplayProgressSelected = FF990000
+clrReplayProgressMark = FF000000
+clrReplayProgressCurrent = FF990000
+clrTrackFrameFg = FF000000
+clrTrackFrameBg = FFFFCC66
+clrTrackItemFg = FF000000
+clrTrackItemBg = FFFFE6B3
+clrTrackItemCurrentFg = FF000000
+clrTrackItemCurrentBg = FFFFCC66
diff --git a/themes/lcarsng-BlueGlass.theme b/themes/lcarsng-BlueGlass.theme
new file mode 100644
index 0000000..59dc3db
--- /dev/null
+++ b/themes/lcarsng-BlueGlass.theme
@@ -0,0 +1,104 @@
+Description = BlueGlass
+clrBackground = 8C1B1B1B
+
+clrTrackName = FFFFCC66
+clrAlertFg = FFFFFFFF
+clrAlertBg = DCFF0000
+clrChannelName = FFFFFFFF
+clrEventTitle = FF99CCFF
+clrEventTime = FFFFFFFF #FFCC66
+clrEventShortText = FFFFCC66
+clrEventDescription = FF99CCFF
+
+# Pulsanti
+clrButtonRedFg = FF000000
+clrButtonRedBg = DCf97d7d
+clrButtonGreenFg = FF000000
+clrButtonGreenBg = DC9df97d
+clrButtonYellowFg = FF000000
+clrButtonYellowBg = DCf9f47d
+clrButtonBlueFg = FF000000
+clrButtonBlueBg = DC7db4f9
+
+# Messaggi di stato
+clrMessageStatusFg = FFFFFFFF
+clrMessageStatusBg = DC0000B2
+clrMessageInfoFg = FF000000
+clrMessageInfoBg = DC00B200
+clrMessageWarningFg = FF000000
+clrMessageWarningBg = DC005B9A #B2B200
+clrMessageErrorFg = FFFFFFFF
+clrMessageErrorBg = DCB20000
+
+# Volume
+clrVolumeFrame = DCFFFFFF #sfondo volume
+clrVolumeSymbol = FF000000
+clrVolumeBarUpper = DCC0C0C0 #barra volume non attivo
+clrVolumeBarLower = FF336699 #barra volume attivo
+
+# Menu info canale
+clrChannelFrameFg = FFFFFFFF #numero canale e orario programma
+clrChannelFrameBg = DC323D68 #cornice
+clrChannelSymbolOn = FFFFFFFF #50638b
+clrChannelSymbolOff = DC666666
+clrChannelSymbolRecFg = FFFFFFFF
+clrChannelSymbolRecBg = FFB20000
+
+# Device
+clrDeviceFg = FFff9900 #testo
+clrDeviceBg = A01B1B1B #sfondo
+clrSignalValue = DCFFCC00 #livello segnale
+clrSignalRest = A0000000 #resto segnale
+
+# Timer Text
+clrTimerFg = FF000000 #testo
+clrTimerBg = DCE9E0DB #sfondo
+
+# Progressbar
+clrSeen = A0F9F6F4
+
+# Data e ora
+clrDateFg = FF000000 #testo
+clrDateBg = DCE9E0DB #sfondo
+
+# Menu principale
+clrMenuFrameFg = FFFFCC99 #testo
+clrMenuFrameBg = DC21244B #cornice
+clrMenuTitle = FFEA962D #testo titoli
+
+# Menu lista voci
+clrMenuMainBracket = DC202740 #cornice sup/inf
+clrMenuItemCurrentFg = FFffcc99 #Voce selezionata (testo)
+clrMenuItemCurrentBg = FF202740 #Voce selezionata (barra)
+clrMenuItemSelectable = FF99CCFF #Lista delle voci selezionabili
+clrMenuItemNonSelectable = FF8C8C8C #lista delle voci (non selezionabili)
+
+# Tempo registrazione
+clrMenuTimerRecording = FFF6A03D #FFF1B1AF
+clrMenuDeviceRecording = A01B1B1B #FF99CCFF #A0141717
+
+# Scrollbar
+clrMenuScrollbarTotal = A0202740
+clrMenuScrollbarShown = FF202740
+clrMenuScrollbarArrow = FF000000
+clrMenuText = FFFFFFFF #FFff00ff
+
+# Replay OSD
+clrReplayFrameFg = FFFFFFFF #FF000000
+clrReplayFrameBg = DC007090
+clrReplayPosition = FFCC99CC
+clrReplayJumpFg = FF000000
+clrReplayJumpBg = FFCC99CC
+clrReplayProgressSeen = FFF6A03D #CC99CC
+clrReplayProgressRest = FFCCCCCC
+clrReplayProgressSelected = FF990000
+clrReplayProgressMark = FF000000
+clrReplayProgressCurrent = FF990000
+
+# Audio
+clrTrackFrameFg = FFFFFFFF
+clrTrackFrameBg = DC323D68 #Audio skin
+clrTrackItemFg = DC858585
+clrTrackItemBg = A0FFFFFF #Audio no select
+clrTrackItemCurrentFg = FF000000
+clrTrackItemCurrentBg = FFFFFFFF #Audio select
diff --git a/themes/lcarsng-LbSense.theme b/themes/lcarsng-LbSense.theme
new file mode 100644
index 0000000..faed2f1
--- /dev/null
+++ b/themes/lcarsng-LbSense.theme
@@ -0,0 +1,105 @@
+Description = LbSense
+clrBackground = A0141717
+
+clrTrackName = FFFFCC66
+clrAlertFg = FFFFFFFF
+clrAlertBg = FFFF0000
+clrChannelName = FFFFFFFF #FF99CCFF
+clrEventTitle = FFFFCC99 #99CCFF
+clrEventTime = FFFFCC66
+clrEventShortText = FF99CCFF #FFCC66
+clrEventDescription = FF99CCFF #99CCFF
+
+# Pulsanti
+clrButtonRedFg = FF000000
+clrButtonRedBg = FFf97d7d
+clrButtonGreenFg = FF000000
+clrButtonGreenBg = FF9df97d
+clrButtonYellowFg = FF000000
+clrButtonYellowBg = FFf9f47d
+clrButtonBlueFg = FF000000
+clrButtonBlueBg = FF7db4f9
+
+# Messaggi di stato
+clrMessageStatusFg = FFFFFFFF
+clrMessageStatusBg = FF0000B2
+clrMessageInfoFg = FF000000
+clrMessageInfoBg = FF00B200
+clrMessageWarningFg = FF000000
+clrMessageWarningBg = FFB2B200
+clrMessageErrorFg = FFFFFFFF
+clrMessageErrorBg = FFB20000
+
+# Volume
+clrVolumeFrame = DCFFFFFF #FF99CCFF #FFF1DF6F
+clrVolumeSymbol = FF000000
+clrVolumeBarUpper = A08C8C8C #DCFFCC99 #FFC1B259
+clrVolumeBarLower = DC7DB4F9 #FF8A9EC9 #FF9966 #FF00B200
+
+# Menu info canale
+clrChannelFrameFg = FF000000
+clrChannelFrameBg = FF8A9EC9
+clrChannelSymbolOn = FF202740 #FFFFFF #50638b
+clrChannelSymbolOff = FF738ec9
+clrChannelSymbolRecFg = FFFFFFFF
+clrChannelSymbolRecBg = FFB20000
+
+# Device
+clrDeviceFg = FFff9900
+clrDeviceBg = A0141717
+clrSignalValue = FFff9966
+clrSignalRest = FFffcc99
+
+# Timer Text
+clrTimerFg = FF000000
+clrTimerBg = FF99CCFF
+
+# Progressbar
+clrSeen = FFCC99CC
+
+# Data e ora
+clrDateFg = FF000000
+clrDateBg = FF99CCFF
+
+# Menu principale
+clrMenuFrameFg = FF202740
+clrMenuFrameBg = FFFFCC99 #FFFF9966
+clrMenuTitle = FFea962d
+
+# Menu lista voci
+clrMenuMainBracket = FF9999ff
+clrMenuItemCurrentFg = FFffcc99 #FFffa201
+clrMenuItemCurrentBg = FF202740
+clrMenuItemSelectable = FF99CCFF #8A9EC9
+clrMenuItemNonSelectable = FF99CCFF
+
+# Tempo registrazione
+clrMenuTimerRecording = FFF1B1AF
+clrMenuDeviceRecording = FF99CCFF
+
+# Scrollbar
+clrMenuScrollbarTotal = FF9999ff #FFFFBC57
+clrMenuScrollbarShown = FFCC99CC
+clrMenuScrollbarArrow = FF000000
+clrMenuText = FFff00ff
+
+# Replay OSD
+clrReplayFrameFg = FF000000
+clrReplayFrameBg = FFCC6666
+clrReplayPosition = FFCC99CC
+clrReplayJumpFg = FF000000
+clrReplayJumpBg = FFCC99CC
+clrReplayProgressSeen = FFCC99CC
+clrReplayProgressRest = FFCCCCCC
+clrReplayProgressSelected = FF990000
+clrReplayProgressMark = FF000000
+clrReplayProgressCurrent = FF990000
+
+# Audio
+clrTrackFrameFg = FF000000
+clrTrackFrameBg = FFFFFCC99 #skin
+clrTrackItemFg = DC858585
+clrTrackItemBg = A0FFFFFF #Audio no select
+clrTrackItemCurrentFg = FF000000
+clrTrackItemCurrentBg = FF99CCFF #Audio select
+
diff --git a/themes/lcarsng-default.theme b/themes/lcarsng-default.theme
new file mode 100644
index 0000000..e83206a
--- /dev/null
+++ b/themes/lcarsng-default.theme
@@ -0,0 +1,75 @@
+Description = Default
+clrBackground = 99000000
+clrDateFg = FF000000
+clrDateBg = FF99CCFF
+clrTimerFg = FF000000
+clrTimerBg = FF99CCFF
+clrDeviceFg = FF000000
+clrDeviceBg = FFF1B1AF
+clrSignalValue = FFA0FF99
+clrSignalRest = FFCC6666
+clrSeen = FFCC99CC
+clrTrackName = FFFFCC66
+clrAlertFg = FFFFFFFF
+clrAlertBg = FFFF0000
+clrChannelName = FF99CCFF
+clrEventTitle = FF99CCFF
+clrEventTime = FFFFCC66
+clrEventShortText = FFFFCC66
+clrEventDescription = FF99CCFF
+clrButtonRedFg = FF000000
+clrButtonRedBg = FFCC6666
+clrButtonGreenFg = FF000000
+clrButtonGreenBg = FFA0FF99
+clrButtonYellowFg = FF000000
+clrButtonYellowBg = FFF1DF60
+clrButtonBlueFg = FF000000
+clrButtonBlueBg = FF9A99FF
+clrMessageStatusFg = FF000000
+clrMessageStatusBg = FF9A99FF
+clrMessageInfoFg = FF000000
+clrMessageInfoBg = FFA0FF99
+clrMessageWarningFg = FF000000
+clrMessageWarningBg = FFF1DF60
+clrMessageErrorFg = FF000000
+clrMessageErrorBg = FFCC6666
+clrVolumeFrame = FFFF9966
+clrVolumeSymbol = FF000000
+clrVolumeBarUpper = FFCC7A52
+clrVolumeBarLower = FFA0FF99
+clrChannelFrameFg = FF000000
+clrChannelFrameBg = FF8A9EC9
+clrChannelSymbolOn = FF000000
+clrChannelSymbolOff = FF6E7EA1
+clrChannelSymbolRecFg = FFFFFFFF
+clrChannelSymbolRecBg = FFCC6666
+clrMenuFrameFg = FF000000
+clrMenuFrameBg = FFFF9966
+clrMenuTitle = FFFF9966
+clrMenuMainBracket = FF9999FF
+clrMenuTimerRecording = FFF1B1AF
+clrMenuDeviceRecording = FF99CCFF
+clrMenuItemCurrentFg = FFFF9966
+clrMenuItemCurrentBg = FF4D4D80
+clrMenuItemSelectable = FF9999FF
+clrMenuItemNonSelectable = FF99CCFF
+clrMenuScrollbarTotal = FFFFAD85
+clrMenuScrollbarShown = FFCC99CC
+clrMenuScrollbarArrow = FF000000
+clrMenuText = FF99CCFF
+clrReplayFrameFg = FF000000
+clrReplayFrameBg = FFCC6666
+clrReplayPosition = FFCC99CC
+clrReplayJumpFg = FF000000
+clrReplayJumpBg = FFCC99CC
+clrReplayProgressSeen = FFCC99CC
+clrReplayProgressRest = FFCCCCCC
+clrReplayProgressSelected = FF990000
+clrReplayProgressMark = FF000000
+clrReplayProgressCurrent = FF990000
+clrTrackFrameFg = FF000000
+clrTrackFrameBg = FFFFCC66
+clrTrackItemFg = FF000000
+clrTrackItemBg = FFFFE6B3
+clrTrackItemCurrentFg = FF000000
+clrTrackItemCurrentBg = FFFFCC66
diff --git a/themes/lcarsng-mein.theme b/themes/lcarsng-mein.theme
new file mode 100644
index 0000000..fd58057
--- /dev/null
+++ b/themes/lcarsng-mein.theme
@@ -0,0 +1,75 @@
+Description = mein
+clrBackground = 90000000
+clrDateFg = FF000000
+clrDateBg = FF99CCFF
+clrTimerFg = FF000000
+clrTimerBg = FF99CCFF
+clrDeviceFg = FF000000
+clrDeviceBg = FFF1B1AF
+clrSignalValue = FFA0FF99
+clrSignalRest = FFCC6666
+clrSeen = FFCC99CC
+clrTrackName = FFFFCC66
+clrAlertFg = FFFFFFFF
+clrAlertBg = FFFF0000
+clrChannelName = FF99CCFF
+clrEventTitle = FF99CCFF
+clrEventTime = FFFFCC66
+clrEventShortText = FFFFCC66
+clrEventDescription = FF99CCFF
+clrButtonRedFg = FF000000
+clrButtonRedBg = FFCC6666
+clrButtonGreenFg = FF000000
+clrButtonGreenBg = FFA0FF99
+clrButtonYellowFg = FF000000
+clrButtonYellowBg = FFF1DF60
+clrButtonBlueFg = FF000000
+clrButtonBlueBg = FF9A99FF
+clrMessageStatusFg = FFFFFFFF
+clrMessageStatusBg = FF9A99FF
+clrMessageInfoFg = FF000000
+clrMessageInfoBg = FFA0FF99
+clrMessageWarningFg = FF000000
+clrMessageWarningBg = FFF1DF60
+clrMessageErrorFg = FFFFFFFF
+clrMessageErrorBg = FFCC6666
+clrVolumeFrame = FFF1DF6F
+clrVolumeSymbol = FF000000
+clrVolumeBarUpper = FFC1B259
+clrVolumeBarLower = FFA0FF99
+clrChannelFrameFg = FF000000
+clrChannelFrameBg = FFFFCC99
+clrChannelSymbolOn = FF000000
+clrChannelSymbolOff = FFCCA37A
+clrChannelSymbolRecFg = FFFFFFFF
+clrChannelSymbolRecBg = FFCC6666
+clrMenuFrameFg = FF000000
+clrMenuFrameBg = FFF1DF6F
+clrMenuTitle = FFF1DF6F
+clrMenuMainBracket = FFFFBC57
+clrMenuTimerRecording = FFF1B1AF
+clrMenuDeviceRecording = FF99CCFF
+clrMenuItemCurrentFg = FF000000
+clrMenuItemCurrentBg = FFFFBC57
+clrMenuItemSelectable = FFFFBC57
+clrMenuItemNonSelectable = FF99CCFF
+clrMenuScrollbarTotal = FFFFBC57
+clrMenuScrollbarShown = FFCC99CC
+clrMenuScrollbarArrow = FF000000
+clrMenuText = FF99CCFF
+clrReplayFrameFg = FF000000
+clrReplayFrameBg = FFCC6666
+clrReplayPosition = FFCC99CC
+clrReplayJumpFg = FF000000
+clrReplayJumpBg = FFCC99CC
+clrReplayProgressSeen = FFCC99CC
+clrReplayProgressRest = FFCCCCCC
+clrReplayProgressSelected = FF990000
+clrReplayProgressMark = FF000000
+clrReplayProgressCurrent = FF990000
+clrTrackFrameFg = FF000000
+clrTrackFrameBg = FFFFCC66
+clrTrackItemFg = FF000000
+clrTrackItemBg = FFFFE6B3
+clrTrackItemCurrentFg = FF000000
+clrTrackItemCurrentBg = FFFFCC66
diff --git a/themes/lcarsng-meins.theme b/themes/lcarsng-meins.theme
new file mode 100644
index 0000000..88de19c
--- /dev/null
+++ b/themes/lcarsng-meins.theme
@@ -0,0 +1,75 @@
+Description = meins
+clrBackground = 90000000
+clrDateFg = FFFFA060
+clrDateBg = FF990000
+clrTimerFg = FF000000
+clrTimerBg = FF99CCFF
+clrDeviceFg = FF000000
+clrDeviceBg = FFF1B1AF
+clrSignalValue = FFA0FF99
+clrSignalRest = FFCC6666
+clrSeen = FFCC99CC
+clrTrackName = FFFFCC66
+clrAlertFg = FFFFFFFF
+clrAlertBg = FFFF0000
+clrChannelName = FF99CCFF
+clrEventTitle = FF99CCFF
+clrEventTime = FFFFCC66
+clrEventShortText = FFFFCC66
+clrEventDescription = FF99CCFF
+clrButtonRedFg = FF000000
+clrButtonRedBg = FFCC6666
+clrButtonGreenFg = FF000000
+clrButtonGreenBg = FFA0FF99
+clrButtonYellowFg = FF000000
+clrButtonYellowBg = FFF1DF60
+clrButtonBlueFg = FF000000
+clrButtonBlueBg = FF9A99FF
+clrMessageStatusFg = FFFFFFFF
+clrMessageStatusBg = FF9A99FF
+clrMessageInfoFg = FF000000
+clrMessageInfoBg = FFA0FF99
+clrMessageWarningFg = FF000000
+clrMessageWarningBg = FFF1DF60
+clrMessageErrorFg = FFFFFFFF
+clrMessageErrorBg = FFCC6666
+clrVolumeFrame = FFF1DF6F
+clrVolumeSymbol = FF000000
+clrVolumeBarUpper = FFC1B259
+clrVolumeBarLower = FFA0FF99
+clrChannelFrameFg = FFFFA060
+clrChannelFrameBg = FF306040
+clrChannelSymbolOn = FFFFA060
+clrChannelSymbolOff = FF000000
+clrChannelSymbolRecFg = FFFFFFFF
+clrChannelSymbolRecBg = FFCC6666
+clrMenuFrameFg = FFFFA060
+clrMenuFrameBg = FF604040
+clrMenuTitle = FFF1DF6F
+clrMenuMainBracket = FFFFA060
+clrMenuTimerRecording = FFF1B1AF
+clrMenuDeviceRecording = FF99CCFF
+clrMenuItemCurrentFg = FF000000
+clrMenuItemCurrentBg = FFFFA060
+clrMenuItemSelectable = FFFFA060
+clrMenuItemNonSelectable = FF99CCFF
+clrMenuScrollbarTotal = FFFFA060
+clrMenuScrollbarShown = FFCC99CC
+clrMenuScrollbarArrow = FF000000
+clrMenuText = FF99CCFF
+clrReplayFrameFg = FFFFA060
+clrReplayFrameBg = FF804030
+clrReplayPosition = FFCC99CC
+clrReplayJumpFg = FF000000
+clrReplayJumpBg = FFCC99CC
+clrReplayProgressSeen = FFCC99CC
+clrReplayProgressRest = FFCCCCCC
+clrReplayProgressSelected = FF990000
+clrReplayProgressMark = FF000000
+clrReplayProgressCurrent = FF990000
+clrTrackFrameFg = FF000000
+clrTrackFrameBg = FFFFCC66
+clrTrackItemFg = FF000000
+clrTrackItemBg = FFFFE6B3
+clrTrackItemCurrentFg = FF000000
+clrTrackItemCurrentBg = FFFFCC66