pax_global_header00006660000000000000000000000064143500502120014502gustar00rootroot0000000000000052 comment=8cb81b890dbb2770660adc5b3f927e01418abd64 vdr-plugin-skinenigmang-0.1.5/000077500000000000000000000000001435005021200162445ustar00rootroot00000000000000vdr-plugin-skinenigmang-0.1.5/COPYING000066400000000000000000000432541435005021200173070ustar00rootroot00000000000000 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. Copyright (C) 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. , 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. vdr-plugin-skinenigmang-0.1.5/HISTORY000066400000000000000000000346141435005021200173400ustar00rootroot00000000000000VDR Skin 'EnigmaNG' Revision History ------------------------------------------ 2022-12-19: Version 0.1.5 - Fixed: Memory leak when loading logos (Submitted by @bittor7x0) - Updated: Spanish translation (Submitted by @bittor7x0) 2022-10-09: Version 0.1.4 - Added: Patch by Jörg Wendel to improve epg image naming variants - Updated: New Makefile to behave nicely with modern VDR versions (Submitted by Alexander Grothe) 2015-09-20: Version 0.1.3 - Fixed: Compile under VDR 2.3.1. - Added: Display Category/Genre/Contents in channel OSD (Submitted by dimeptr; Closes #1161) - Added: Support for color button reordering in VDR >=1.7.30 (Closes #1209) - Added: Display free video disk space in main and recordings menu with VDR 1.7.28+. - Fixed: Main menu info area with VDR 1.7.28+. - Added: Setup options to set width of signal information and progress bar in channel info OSD. - Added: Support for building with GraphicsMagick instead of ImageMagick. (Patch by Ville Skyttä) - Fixed: Disappearing symbols in channel info osd if signal strength and quality are shown. 2012-04-29: Version 0.1.2 - Changed: Use vdr fuctions to determine signal strength (Closes #811). - Added: Hungarian translation (Provided by István Füley). - Fixed: Don't use deprecated member access (introduced in VDR 1.7.21). - Changed: Increased max values for image/logo width/height and logo cache. - Fixed: Handle case if curent event starts in the future in channel info OSD (Fixes #649). - Fixed: width of a timer's title in menu OSD info area (Closes #633). - Included: Catalan translation (Submitted by Innocent De Marchi). - Updated: Italian translation (Provided by Diego Pierotto). - Fixed: Displaying Content Descriptor in EPG details. - Added: New setup options for height and width of channel logos area. - Changed: Look for channel logos only in "logos" folder ("hqlogos" folder no longer supported). 2010-04-05: Version 0.1.1 - Moved "General / Show progressbar" to "Logos & Symbols / Show progressbar in lists". - Fixed gcc 4.3 compiler warnings. - Show "Parental Rating" and "Contents" in EPG and recording details (requires at least VDR 1.7.11). - Show estimated bitrate and recording format (TS/PES) in recording's details. - Show subtitle tracks in EPG and recording details. - Changed defaults for setup options. - Don't define CLEAR_BUG_WORKAROUND by default. - Added new setup option "Colored status symbols in EPG details". - Added new theme "bgw" (Submitted by jlacvdr @gmail.com). - Added new setup option "Round corners". - Display cut length and size of recordings in recording's details (based on skinelchi-0.2.1). - Fixed calculation of channel info OSD areas. - Check for valid OSD width and height and font size and width. - Added VDR's default fonts to the TrueTypeFont selector. - Unselectable rows in menu OSD starting with "---" will be formated as headlines if "Show symbols in lists" is set. - New "elapsed/remaining" option for "Show remaining/elapsed time" setting. - New "active only" option for "Show status symbols" setting. - Added setup option for minimal info area width. - Restructured setup menu. 2009-04-25: Version 0.1.0 - Fixed: Calculating width of events' start times in channel info OSD (Reported by tomglx @vdr-poprtal.de). - Changed: pause scrolling when text has scrolled all to the left in scroll behaviour "to the left" (Reported by Andreas Brugger). - Reworked: (simplified) font loading/caching. - Updated Italian translation (Provided by Diego Pierotto). - Removed: ENABLE_COPYFONT define. - Changed: Reduced number of font recreations (Reported by balta @vdr-portal.de). - Added: more CA systems to text mappings in channel info OSD (Submitted by free-x @vdr-portal.de). - Added: symbol in channel info OSD if current channel has subtitles. - Changed: background colors for the DarkBlue theme (Submitted by zulu @vdr-portal.de). - Added: New option "Show CA system as text". - Changed: Reduced number of locks while drawing to OSD which increases display speed especially in menu OSD. - Added: show signal strength and signal-to-noise ratio in channel info OSD (can be disabled by setting SKINENIGMA_DISABLE_SIGNALINFO to 1). - Fixed: compiler error with certain gcc versions (Reported by C-3PO @ vdr-portal.de). - Changed: smooth scrolling text (based on skinelchi by Christoph Haubrich ). - Removed: SKINENIGMA_DISABLE_ANIMATED_TEXT define. - Changed: Replace "/" by "~" in channel logo names. - Added: new setting "Show scrollbar in menu". - Added: Override VDR's SetTabs() to adopt column widths in menu OSD to selected font size. - Added: Support subtitle tracks in tracks OSD: logo will only be shown if icons/subtitle/subtitle.xpm exists. - Fixed: missing logo in tracks OSD while using single area. - Minor bugfixes and enhancements. - Requires at least VDR v1.6.0. 2008-03-09: Version 0.0.6 - Added scrollbar in menu lists when compiled with VDR >= v1.5.15. - Fixed: VDR didn't responde anymore if the font used for lists was too small (<11px) and the marker in front of the active list item has been turned on. - Added workaround to fix chrashes (hopefully) for VDR 1.4.x and patched fonts. - Updated French translation (Submitted by Patrice Staudt). - Updated Dutch translation (Submitted by Johan Schuring). - Updated Spanish translation (Submitted by Bittor Corl). - Updated Finnish translation (Submitted by Rolf Ahrenberg). - Fixed crash in EPG details when using epgsearch if channel isn't found. - Updated Italian translation (Provided by Diego Pierotto). - Fix TrueTypeFonts support when compiled with VDR >= v1.5.4. - Use WeekDayNameFull() in VDR >= v1.5.5. - Use "Full Title Width" setting also for Tracks and Replay OSD. - Optionally scroll current event's title and subtitle in channel info. - New setup option "Show status symbols" (Suggested by chrisz @vdr-portal.de). - Moved to the new i18n system introduced in VDR 1.5.7; fully backwards compatible due to Udo Richter's po2i18n.pl. - Optionally show current WSS mode as symbol (if Avards is running). - Draw "Dolby Digital" and "MONO" indicator in language flags. - Hide inactive status symbols. - Removed date from OSDs: tracks, volume - Added status symbols in replay OSD. - Draw line right to logos in Tracks and Replay OSD as it's done in other OSDs too. - Added channel info OSD for "Info on channel switch = no" VDR option (Reported by Pat @vdr-portal.de). - Removed compile time dependencies to plugin services. - Renamed SKINENIGMA_HAVE_EPGSEARCH define to SKINENIGMA_USE_PLUGIN_EPGSEARCH. - Disable i18n support for VDR >= v1.5.7. - Added Turkish to translation array (for VDR >= v1.5.2). - Use group name for logos even if channel logos are searched for by channel id. - Fixed problems when compiling with VDR v1.5.7+ (Reported by Matthias Fechner). - Fixed problems with certain images (Submitted by pinky666 @vdr-portal.de). - Fixed crash if using display of repeatings in EPG details and reelchannelscan plugin is loaded. - New setup option for location of messages in menu OSD. 2007-07-02: Version 0.0.5 - Reworked font handling in menu OSD a little bit to (hopefully) fix crashes with plugins that patch fonts. - Updated Dutch translation (Provided by dorpsgek @vdr-portal.de). - Don't make info area in mainmenu too small (Requested by vdrchuck @vdr-portal.de). - Save and restore TTF FixedFont (Reported by zulu @vdr-portal.de). - Updated Italian translation (Provided by Diego Pierotto). - Updated French translation (Provided by Pat @vdr-portal.de). 2007-06-25: Version 0.0.5rc3 - Updated Finnish translation (Submitted by Rolf Ahrenberg). - Added quickepgsearch, sport and music plugins in main menu logos (Submitted by zulu @vdr-portal.de). - Reworked debug() and error(). - Use required width of date for calculation of logo area with. - Don't let vector for text effects grow when moving through lists in menus. - Added internal translation of long weeksdays (Requested and translated by Pat @vdr-portal.de). - Support TrueTypeFonts again with VDR >=v1.5.4 (TTF width setup disabled). - Read OSD size from VDR's cOsd as suggested in VDR and Avards plugin. - Minor bugfixes and enhancements. 2007-06-18: Version 0.0.5rc2 - Added Italian translation (Submitted by Diego Pierotto). - Changed logging to only report missing channel logos once. - Use MAXFONTNAME and MAXFONTSIZE as introduced in VDR 1.5.3. - Recognize VDR >=1.5.3 and disable HAVE_FREETYPE. - Fixed font initialization. - Updated MoBuntu theme (Submitted by Morone @vdr-portal.de). - Set correct editable width for OSD text inputs (Reported by Brougs78 @vdr-portal.de). - Fixed calculation of bottom line in channel info (Reported by CKone @vdr-portal.de). - Hide "Set" button in fonts setup if TTF support disabled. - Fixed crash in TTF setup if no TrueType fonts were found (Reported by pat @vdr-portal.de). - Set correct title in setup submenus (Reported by pat @vdr-portal.de). - Minor bugfixes. 2007-06-11: Version 0.0.5rc - Fixed possible crash in recording's details. - Added MoBuntu theme (Submitted by Morone @vdr-portal.de). - Added Blue, Blue2, Blue3 and Coolblue theme (Submitted by Uwe @vdr-portal.de). - Added support for TrueTypeFonts (based on graphtft and text2skin plugins). - Added support for new epgsearch tags. - Updated French translation. (Submitted by pat @vdr-portal.de) - Changed size calculation for scrollbars. - Add setup options to individually set the fonts to use. See README for details. - Set used colors for every area in menu OSD when using multiple areas. - Reworked multiple areas mode in menu OSD. - Do not disable logos/symbols/flags if 4bpp single area is configured in setup. - Replaced setup options "One area (if possible)" and "Bpp in single area" by option "Try 8bpp single areas". - Unified appearance of error/info/status messages in all OSDs. - Added setup option to selectively enable scrolling text. - Added setup option to selectively enable logos in the different OSDs. - Added text effects (e.g. scrolling and blinking) for selected text. - Removed clrMenuHighlight, clrMessageBorder, clrMenuItemCurrentFg, clrMenuEventTitle, clrMenuEventShortText, clrMenuScrollbarTotal and clrMenuScrollbarShown in themes. - Fixed height of title/subtitle box in EPG & recording details. - Recognize mediamanager plugin in mainmenu logos. - Don't cut info line in EPG & recording details at logo area's left edge. - Updated Russian translation (Submitted by neptunvasja @vdr-portal.de). - Added Dutch translation (Submitted by dorpsgek @vdr-portal.de). - Various bugfixes and graphical changes. 2007-04-02: Version 0.0.4 - Changed text color in themes for green and yellow buttons. - Fixed false colors problem after theme changes. - Updated Finnish translation. (Submitted by Rolf Ahrenberg) - Updated French translation. (Submitted by pat @vdr-portal.de) - Do not overwrite status messages in mainmenu with list items. - New setup option that replaces SKINENIGMA_FULL_CHANNELINFO_TITLE define. - Disable logos/symbols/flags if 4bpp single area is configured in setup. (Will eventually replace SKINENIGMA_NO_MENULOGO define) - Added support for mailbox plugin; shows mail symbol in channel info (Based on patch by triple955 @vdr-portal.de). - Introduced new HAVE_IMAGEMAGICK define to enable non-xpm images in event's and recording's details. - Fixed "blinking" date in channel info (Reported by several people). - Changed background for recording symbol in channel info to white (Suggested by gromit @vdr-portal.de). - Long channel group names are no longer drawn at the right side of the date (Reported by several people). - New setup option for displaying a recording's size and use size.vdr (Suggested by vejoun @vdr-portal.de). - Show stop time of running timers in info area in main menu. (Suggested by viking @vdr-portal.de) - Updated Russian translation. (Submitted by neptunvasja @vdr-portal.de) - New defines "ListProgressBarGap" & "ListProgressBarBorder" to customize the progressbar in lists: * "ListProgressBarGap" sets the gap above/below the progressbar (relative to the font's height). * "ListProgressBarBorder" sets the border's width. - Added fallback to "classic" skin if any of the OSD menus fails to open. - Fix possible NULL pointer accesses. - Fixed compiler error with certain gcc versions. - Minor bugfixes and graphical changes. 2007-03-06: Version 0.0.3 - New command line option "-l" to set the logo path. - Added support for epgsearch's timer check auxiliary info in a recording's info. - Reorganized setup menu. - Don't use small font in a recording's replay info. - Show channel name and number in recording's info. - Don't use small font for description in event and recording info. - Added setup options for epgsearch features. - Use location set at "Channel info position" to display channel info. - Fixed transparent group titles in menus. (Reported by several users) - New (temporary) compile time option SKINENIGMA_FULL_CHANNELINFO_TITLE. - Fixed duration and elapsed/remaining time displaying in channel info. - Enhanced setup option "Show remaining/elapsed time". - Enhanced setup option "Show Symbols". - Changed alignment in bottom line of channel info. - New setup option to hide language flags; shows language name in channel info. (Suggested by balta @vdr-portal.de) - Redraw date in main menu and channel info only if time changed. (Based on suggestion by Hanspeter) - Changed detection for main menu; it now must start with "VDR - ". (Based on patch by triple955 @vdr-portal.de) - Fixed problems with floating text. (Patch by triple955 @vdr-portal.de) - Localized full weekday name. - Added new setup option for 8bpp or 4bpp single area. - Added Russian translation (Submitted by SergArb @vdr-portal.de). - Log "LOGO NOT FOUND" errors to syslog (Requested by Der_Pit). - Changed a false 4bpp area to 2bpp. - Corrected brackets (Reported by Sebastian Werner). - Many other fixes and graphical changes. 2007-02-19: Version 0.0.2 - Fixed problems in replay OSD when not using small font (Reported by several people). - Only display reruns of current event in EPG info if there are more than two reruns. - New setup option to enable/disable trying a single 8bpp OSD area. - Completed French translation (Submitted by Patrice Staudt). - Completed Finnish translation (Patch by rofafor @vdr-portal.de). - Changed defines: HAVE_EPGSEARCH to SKINENIGMA_HAVE_EPGSEARCH and NO_MENULOGO to SKINENIGMA_NO_MENULOGO (Patch by rofafor @vdr-portal.de). - Fixed crash if loading channel logos by channel id (Reported by zulu @vdr-portal.de). - Fixed gcc warning (Reported by zulu @vdr-portal.de). - Renamed theme WomansLike to WomenLike. - Some smaller fixes. 2007-02-14: Version 0.0.1 - Initial release. vdr-plugin-skinenigmang-0.1.5/Makefile000066400000000000000000000132451435005021200177110ustar00rootroot00000000000000# # Makefile for a Video Disk Recorder plugin # # $Id: Makefile,v 1.34 2010/03/08 14:31:57 amair Exp $ # This turns usage of logos in the main menu complete. This might also # improve the performance of the menus. EXPERIMENTAL!!! #SKINENIGMA_NO_MENULOGO = 1 # Debugging on/off #SKINENIGMA_DEBUG = 1 # If you have installed ImageMagick and want to use images in events' # and recordings' details. Set to GRAPHICS to use GraphicsMagick. #HAVE_IMAGEMAGICK = 1 # If you are using the epgsearch plugin and want to see the number of # timer conflicts in the main menu's info area. SKINENIGMA_USE_PLUGIN_EPGSEARCH = 1 # If you use the mailbox plugin this will include support for it. SKINENIGMA_USE_PLUGIN_MAILBOX = 1 # Include code to support the Avards plugin: # - Dynamic OSD size depending on current WSS mode. # - Display current WSS mode in channel info and replay OSDs. SKINENIGMA_USE_PLUGIN_AVARDS = 1 # Disable code to show signal strength and signal-to-noise ratio # in channel info OSD. #SKINENIGMA_DISABLE_SIGNALINFO = 1 # Strip debug symbols? Set eg. to /bin/true if not #STRIP = strip STRIP = /bin/true # 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. # PLUGIN = skinenigmang ### 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') # 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) CONFIGDIR = $(call PKGCFG,configdir) TMPDIR ?= /tmp ### The compiler options: export CFLAGS = $(call PKGCFG,cflags) export CXXFLAGS = $(call PKGCFG,cxxflags) -fPIC CXXFLAGS += -Wno-unused-result ### The version number of VDR's plugin API: APIVERSION = $(call PKGCFG,apiversion) ### Allow user defined options to overwrite defaults: -include $(PLGCFG) ### 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 (add further entries here): INCLUDES += #INCLUDES += -I$(VDRDIR)/include DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"' ifdef SKINENIGMA_USE_PLUGIN_EPGSEARCH DEFINES += -DUSE_PLUGIN_EPGSEARCH else # for backwards compatibility only ifdef SKINENIGMA_HAVE_EPGSEARCH DEFINES += -DUSE_PLUGIN_EPGSEARCH endif endif ifdef SKINENIGMA_DEBUG DEFINES += -DDEBUG endif ifdef SKINENIGMA_NO_MENULOGO DEFINES += -DSKINENIGMA_NO_MENULOGO endif ifdef SKINENIGMA_USE_PLUGIN_MAILBOX DEFINES += -DUSE_PLUGIN_MAILBOX endif ifdef SKINENIGMA_USE_PLUGIN_AVARDS DEFINES += -DUSE_PLUGIN_AVARDS endif ifdef SKINENIGMA_DISABLE_SIGNALINFO DEFINES += -DDISABLE_SIGNALINFO endif ifdef HAVE_IMAGEMAGICK DEFINES += -DHAVE_IMAGEMAGICK endif DEFINES += -DRECORDING_COVER='"Cover-Enigma"' # This is a simple workaround if one wants to use # softdevice plugin without a single 8bpp area, # because this combination shows some false colored # areas in menu OSD. ifdef CLEAR_BUG_WORKAROUND DEFINES += -DCLEAR_BUG_WORKAROUND endif ### The object files (add further files here): OBJS = $(PLUGIN).o enigma.o config.o logo.o tools.o status.o texteffects.o setup.o font.o ifdef HAVE_IMAGEMAGICK OBJS += bitmap.o ifneq ($(HAVE_IMAGEMAGICK), GRAPHICS) LIBS += -lMagick++ INCLUDES += -I/usr/include/ImageMagick -I/usr/local/include/ImageMagick else LIBS += $(shell pkg-config --libs GraphicsMagick++) INCLUDES += $(shell pkg-config --cflags GraphicsMagick++) endif endif INCLUDES += $(shell pkg-config freetype2 --cflags) LIBS += $(shell pkg-config freetype2 --libs) ### The main target: all: $(SOFILE) i18n ### Implicit rules: %.o: %.c $(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $< # Dependencies: MAKEDEP = $(CXX) -MM -MG DEPFILE = .dependencies $(DEPFILE): Makefile @$(MAKEDEP) $(DEFINES) $(INCLUDES) $(subst i18n.c,,$(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 *.h) xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='' -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 $@ ifndef SKINENIGMA_DEBUG @$(STRIP) $@ endif install-lib: $(SOFILE) @install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION) install: install-lib install-i18n dist: clean @-rm -rf $(TMPDIR)/$(ARCHIVE) @mkdir $(TMPDIR)/$(ARCHIVE) @cp -a * $(TMPDIR)/$(ARCHIVE) @tar czf $(PACKAGE).tgz --exclude CVS --exclude '.#*' --exclude '*.bak' -C $(TMPDIR) $(ARCHIVE) @-rm -rf $(TMPDIR)/$(ARCHIVE) @echo Distribution package created as $(PACKAGE).tgz clean: @-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~ $(PODIR)/*.mo $(PODIR)/*.pot vdr-plugin-skinenigmang-0.1.5/README000066400000000000000000000366511435005021200171370ustar00rootroot00000000000000This is the "EnigmaNG" skin for the Video Disk Recorder (VDR). Written by: Andreas Mair (andreas AT vdr - developer DOT org) Project's homepage: http://andreas.vdr-developer.org/enigmang Latest version available at: http://andreas.vdr-developer.org/enigmang 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.6.0. - Logo pack from http://andreas.vdr-developer.org/enigmang Description ----------- "EnigmaNG" is a standalone skin based on the "Enigma" text2skin addon. Compile time configuration -------------------------- There are some configuration items you need to set before running "make plugins" in "Make.config": SKINENIGMA_USE_PLUGIN_EPGSEARCH = 1 If you are using the epgsearch plugin and want to see the number of timer conflicts in the main menu's info area. SKINENIGMA_USE_PLUGIN_AVARDS = 1 Include code to support the Avards plugin: - Dynamic OSD size depending on current WSS mode. - Display current WSS mode in channel info and replay OSDs. SKINENIGMA_USE_PLUGIN_MAILBOX = 1 If you use the mailbox plugin this will include support for it. SKINENIGMA_NO_MENULOGO = 1 This turns usage of logos in the main menu completely off. This might also improve the performance of the menus. EXPERIMENTAL!!! HAVE_IMAGEMAGICK = 1 If you have installed ImageMagick and want to use images in events' and recordings' details. Set to GRAPHICS to use GraphicsMagick. SKINENIGMA_DISABLE_SIGNALINFO = 1 Do not include code to show signal strength and signal-to-noise ratio. Installation ------------ > cd /put/your/path/here/VDR/PLUGINS/src > tar -xzf /put/your/path/here/vdr-skinenigmang-X.Y.Z.tgz > ln -s skinenigmang-X.Y.Z skinenigmang OR (for CVS checkout): > ln -s EnigmaNG skinenigmang > cd skinenigmang > cp -df themes/*.theme /path/to/vdrconf/themes/ > cd /put/your/path/here/VDR > make > make plugins > ./vdr -P skinenigmang Update ------ That's the same procedure as "Installation" but you have to remove some things before: - Link to old sources > cd /put/your/path/here/VDR/PLUGINS/src > rm -f skinenigmang - Old themes (only if you didn't change/add them!) > cd /path/to/vdrconf/themes/ > rm -f EnigmaNG-*.theme Options ------- -i path, --epgimages=path Path to the epgimages (Default: /epgimages). -l path, --logodir=path Path to the logos (Default: /plugins/skinenigmang). Usage ----- In VDR go to the OSD settings menu and select the skin "EnigmaNG" Setup Options ------------- * General - Try 8bpp single area If you don't want to use a single 8bpp area for the OSD you can disable it here. If this option is enabled this will not ensure that a single area is used, but EnigmaNG will try to use it. If your output deviice can handle that area (e.g. softdevice) it will be used. Otherwise multiple areas are used. This option might be useful for 4MB modded DVB cards because they say they can handle the 8bpp single area but the OSD will be slower. If you own such a card you may want to play with that option and see if you can increase OSD speed. NOTE: after commit the settings you have to fully close and re-open the OSD to make the change affect. - Round corners If enabled some corners in the OSD will be rounded. - Full title width If enabled the titlebar in the channel info will be drawn above the channel logo. This has no effect if channel logos are disabled. - Show VPS Hide or show VPS information in channel info and event info. - Dynamic OSD size Get OSD size from Avards or VDR >= v1.5.4. NOTE: This requires EnigmaNG compiled with SKINENIGMA_USE_PLUGIN_AVARDS = 1 and a running Avards plugin. + Menu OSD - Show info area in main menu This info area is shown in the main menu and it will show the current/next timers and the number of timer conflicts (if SKINENIGMA_USE_PLUGIN_EPGSEACH has been defined). - Min width of info area This sets the minimum width the info area will have. - Show messages in menu on (Last line/Help buttons/Free last line) Last line - Messages will hide the last line in the menu OSD. Help buttons - Messages will hide the help buttons in menu OSD. Free last line - The same as "Last line" but now the available list items is reduced by one. - Show scrollbar in menu (no/yes/if required) Disable or enable the scrollbar in the menu OSD. If set to "if required" the scrollbar will only be visible if scrolling is possible. + EPG & Recording Details OSD - Show auxiliary information (top/bottom) Here you can set where you want to have the auxiliary information when you open an event's or recording's info screen. This information includes for a recording its channel, size, priority, lifetime, audio languages and some values that selected plugins (epgsearch, VDRAdmin-AM, pin) have set. For an event the audio languages are shown. - Show recording's size (never/use size.vdr only/always) This setting controls if a recording's size is shown in the recording's details. never - never show the size use size.vdr only - only show the size if size.vdr exists in the recording's directory. The first line of size.vdr is read and has to be the recording's size in megabytes (MB). You can create size.vdr by adding a line like du -sm | cut -f1 >"$2/size.vdr" to your VDR's recording script's "after" and "edited" sections. always - This will also use size.vdr if available. Otherwise it will calculate the size itself. + Channel Info OSD - Show remaining/elapsed time (elapsed/remaining/percent/"elapsed/remaining") Here you can set if you want to read the number of minutes an event is already running (preceded by "+") or the number of minutes an event will run (preceded by "-") or the percent the event has been running in the channel info. "elapsed/remaining" will show both elapsed and remaining number of minutes. - Width of progress bar The width of the progress bar that visualizes the elapsed time of the current event. - Show signal info If set to yes the signal strength (top) and signal-to-noise ratio (bottom) will be shown at the bottom right side of the channel info OSD. - Width of signal info The width of the signal info. - Show CA system as text Show used CA system (e.g. Cryptoworks) as text instead of symbol in the channel info OSD. * Logos & Symbols - Show symbols Here you can enable or disable the large symbols shown in top right corner of the main menu, the recordings info and the event info and the "background" symbol of the mode symbol when replaying recordings. - Show symbols in menu - Show symbols in replay - Show symbols in messages - Show symbols in audio If "Show Symbols" is set to "yes" you can enable or disable symbols for each OSD. - Colored status symbols in EPG details If enabled the symbols for a running event, an event having a timer and so on will be drawn colored in the EPG details OSD. - Show symbols in lists This replaces "T", "t", "V"... in the EPG views symbols. - Show progressbar in lists This replaces progressbars shown with pipes (e.g. [|| ]) by a graphical progressbar. - Show marker in lists If enabled a small circle is drawn in front of the selected item in lists. - Show status symbols (no/yes/active only) Display the status symbols in channel info and recording's progress info. "yes" will always show all symbols and "active only" will only show the active (= hilighted) ones. - Show flags If enabled graphical flags are drawn for the audio channel languages if the requested flag file exists. Else language's abbreviation is drawn. - Show WSS mode symbols Show symbols instead of text for the current WSS mode. NOTE: This requires EnigmaNG compiled with SKINENIGMA_USE_PLUGIN_AVARDS = 1 and a running Avards plugin. - Show mail icon (never/only if new mail present/always) (NOTE: only visible if mailbox plugin support is compiled in and plugin is loaded!) Enables mail icon in channel info. - Show event/recording images Enable or disable images in the right top corner in an event's or recording's info. The recording's image must be named "Cover-Enigma.xpm" in the recording's directory. An event's image must be named ".xpm" and must be stored in the directory given with the "--epgimages" option. If imagemagick support is compiled in you can use different image extensions, see below. - Resize images (pixel algo/ratio algo/zoom image) (NOTE: only visible if Imagemagick support is compiled in!) The algorithm to use for resizing. Please ask the Imagemagick documentation if you want to know how the algorithms work. - Image width (80 - 360) (NOTE: only visible if Imagemagick support is compiled in!) The width for event/recording images. - Image height (80 - 244) (NOTE: only visible if Imagemagick support is compiled in!) The height for event/recording images. - Image format (xpm/jpg/png) (NOTE: only visible if Imagemagick support is compiled in!) The extension to use for event/recording images. - Show channel logos Hide or show channel logos in channel info. - Identify channel by (name/data) Here you can choose if the channel logo should be searched by the channel's name (e.g. "YLETV2" -> "YLETV2.xpm") or by the channel's unique id (e.g. "T-8438-4097-33.xpm"). NOTE: the available logo packs are named by channel name only! - Channel logo cache size The number of logos/symbols to keep in the cache. * Animated Text - Enable This option enables scrolling of long lines and blinking of some text. - Scroll OSD title Scroll title of OSDs? - Scroll info area Scroll a timer's title in the main menu's info area? - Scroll active list items Scroll long columns of the active line in the menu? - Scroll other items Scroll items in other areas? At the moment these areas cover the title and subtitle in the EPGs and recordings details and the message in the message OSD. - Scroll behaviour (to the left/left and right) Text can either scroll from the left to right and then start again at the left or it can scroll from the left to the right and then back from the right to the left (ping pong). - Scroll delay (ms) (3 - 1000) The number of milliseconds to wait before the scrolling text is moved. - Scroll pause (ms) (500 - 2000) The number of milliseconds to wait at the left or right side of the text before scrolling again. - Blink pause (ms) (500 - 2000) The number of milliseconds to wait for blinking text. * Fonts If you've set the VDR OSD option "Use small font" to "skin dependent" then you can set your preferred fonts for various areas. If you've patched additional fonts into VDR you need to set the SKINENIGMA_FONTS define (see above) to see them in the list of available fonts. - OSD title - Messages - Date - Help keys - Channelinfo: title - Channelinfo: subtitle - Channelinfo: language - List items - Info area: timers title - Info area: timers text - Info area: warning title - Info area: warning text - Details: title - Details: subtitle - Details: date - Details: text - Replay: times - Fixed Font Set the font for the named area. You can set the TrueTypeFont to use by pressing the blue key. Then you can select one of the TrueTypeFonts known to fontconfig and set it's size and width. * EPGSearch NOTE: only visible if epgsearch support is compiled in - Number of Reruns (0 - 10) The number of reruns to show in an event's info. - Use Subtitle for reruns (never/if exists/always) If set to "never" all events will match that _contain_ the current event's title in their title, e.g. if title is "Brisant" it will also find "Brisant Classix". If set to "if exists" it will use the subtitle to find reruns if the current event contains a subtitle. This will also require a full title match, e.g. if title is "Brisant" and subtitle is "Boulevard Magazin" it will find only events with title and subtitle being exactly "Brisant" and "Boulevard Magazin". It won't find events named "Brisant Classix" or "Brisant" without subtitle. If set to "always" it will always use the subtitle even if it's empty. As a sideeffect also the event titles must match exactly, e.g. if title is "Tagesschau" it will only find events named "Tagesschau" and not "Tagesschau vor 30 Jahren". - Show timer conflicts Enable or disable showing the number of timer conflicts in the main menu's info area. Notes ----- - Only XPM format is supported for channel logos: 80x80 pixels and 13 colors (6 colors on DXR3) or less recommended. - If you'll add new channels logos on the fly, remember to flush the channel logo cache. Credits ------- - Rolf Ahrenberg for the Soppalusikka skin where I've lent some code. http://www.saunalahti.fi/~rahrenbe/vdr/soppalusikka/ - Andreas Brugger for the original "Enigma" for Text2Skin and his Text2Skin patches. http://brougs78.vdr-developer.org/ http://www.vdr-portal.de/board/thread.php?threadid=28730 http://www.vdr-wiki.de/wiki/index.php/Entwicklung_-_Tipps_und_Tricks - Sascha Volkenandt for Text2Skin where I've lent some code. http://linux.kompiliert.net/ - Speedbomb for the hqlogos. http://www.speedbomb.de/hobby/myhtpc/index.php?view=logos - zulu @vdr-portal.de for some symbols. http://www.vdr-portal.de/board/thread.php?postid=514251#post514251 - Thomas @vdr-portal.de for some logos. http://senderlogos.vdr-developer.org/ - FrankJepsen @vdr-portal.de for some logos. http://www.vdr-portal.de/board/thread.php?postid=531412#post531412 - chrisz @vdr-portal.de for some radio logos and original Enigma themes. WomensLike: http://www.vdr-portal.de/board/thread.php?threadid=59651 WineRed: http://www.vdr-portal.de/board/thread.php?threadid=59416 AppleGreen: http://www.vdr-portal.de/board/thread.php?threadid=59427 YellowSun: http://www.vdr-portal.de/board/thread.php?postid=581117 - skiller2k1 @vdr-portal.de for Comedy Central logo. http://www.vdr-portal.de/board/thread.php?postid=567887#post567887 - uwe @vdr-portal.de for themes (Blue, Blue2, Blue3 and CoolBlue). http://www.vdr-portal.de/board/thread.php?postid=615540#post615540 - Morone @vdr-portal.de for MoBuntu theme. http://www.vdr-portal.de/board/thread.php?postid=619867#post619867 - The translation team: English: Andreas Mair Deutsch: Andreas Mair Italiano: Diego Pierotto Nederlands: Johan Schuring Français: Patrice Staudt Finnish: Rolf Ahrenberg Hungarian: István Füley Polski: ??? Español: bittor from open7x0.org Svenska: ??? Russian: SergArb @vdr-portal.de / neptunvasja @vdr-portal.de Eesti: ??? Dansk: ??? Czech: ??? Türkçe: n/a - Udo Richter (udo_richter @gmx.de) for po2i18n.pl (used in EnigmaNG < 0.1.0). http://www.udo-richter.de/vdr/scripts.en.html#po2i18n - Christoph Haubrich for skinelchi where I've lent some code. http://firefly.vdr-developer.org/skinelchi/ // vim:et:sw=2:ts=2: vdr-plugin-skinenigmang-0.1.5/bitmap.c000066400000000000000000000045211435005021200176660ustar00rootroot00000000000000#ifdef HAVE_IMAGEMAGICK #include "common.h" #include "bitmap.h" #include "config.h" #ifndef X_DISPLAY_MISSING #define X_DISPLAY_MISSING #endif #undef debug #include using namespace Magick; #include #include void cOSDImageBitmap::Init(void) { InitializeMagick(NULL); } cOSDImageBitmap::cOSDImageBitmap() {} cOSDImageBitmap::~cOSDImageBitmap() {} bool cOSDImageBitmap::DrawImage(const char *fileNameP, int x, int y, int w, int h, int colors, cOsd *osd) { return DrawMagick(fileNameP, x, y, w, h, colors, osd); } bool cOSDImageBitmap::DrawMagick(const char *Filename, int x, int y, int width, int height, int colors, cOsd *osd) { Image image; try { Geometry geo; image.read(Filename); geo = image.size(); int w = geo.width(); int h = geo.height(); if (height != h || width != w) { switch (EnigmaConfig.resizeImages) { case 0: image.sample(Geometry(width, height)); break; case 1: image.scale(Geometry(width, height)); break; case 2: image.zoom(Geometry(width, height)); break; default: esyslog("ERROR: unknown resize mode %d", EnigmaConfig.resizeImages); break; } } geo = image.size(); w = geo.width(); h = geo.height(); if (colors != 0){ image.opacity(OpaqueOpacity); image.backgroundColor(Color(0, 0, 0, 0)); image.quantizeColorSpace(RGBColorspace); image.quantizeColors(colors); image.quantize(); } // center image x += ((width - w) / 2); y += ((height - h) / 2); const PixelPacket *pix = image.getConstPixels(0, 0, w, h); for (int iy = 0; iy < h; ++iy) { for (int ix = 0; ix < w; ++ix) { tColor col = (~(int)(pix->opacity * 255 / MaxRGB) << 24) | ((int)(pix->red * 255 / MaxRGB) << 16) | ((int)(pix->green * 255 / MaxRGB) << 8) | (int)(pix->blue * 255 / MaxRGB); osd->DrawPixel(x + ix, y + iy, col); ++pix; } } } catch (Exception &e) { esyslog("ERROR: Couldn't load %s: %s", Filename, e.what()); return false; } catch (...) { esyslog("ERROR: Couldn't load %s: Unknown exception caught", Filename); return false; } return true; } #endif //HAVE_IMAGEMAGICK // vim:et:sw=2:ts=2: vdr-plugin-skinenigmang-0.1.5/bitmap.h000066400000000000000000000011741435005021200176740ustar00rootroot00000000000000/* * bitmap.h: 'EnigmaNG' skin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifdef HAVE_IMAGEMAGICK #ifndef _OSDIMAGE_BITMAP_H_ #define _OSDIMAGE_BITMAP_H_ #include "common.h" #include class cOSDImageBitmap { public: cOSDImageBitmap(); ~cOSDImageBitmap(); bool DrawImage(const char *fileNameP, int x, int y, int w, int h, int colors, cOsd *osd); static void Init(void); private: bool DrawMagick(const char *Filename, int x, int y, int height, int width, int colors, cOsd *osd); }; #endif #endif //HAVE_IMAGEMAGICK // vim:et:sw=2:ts=2: vdr-plugin-skinenigmang-0.1.5/common.h000066400000000000000000000012201435005021200177000ustar00rootroot00000000000000/* * common.h: 'EnigmaNG' skin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __SKINENIGMA_COMMON_H #define __SKINENIGMA_COMMON_H #include #include #include #ifdef DEBUG #define debug(x...) dsyslog("EnigmaNG: " x); #define error(x...) esyslog("EnigmaNG: " x); //#define debug(x...) { printf("EnigmaNG: " x); printf("\n"); } //#define error(x...) { fprintf(stderr, "EnigmaNG: " x); fprintf(stderr, "\n"); } #else #define debug(x...) ; #define error(x...) esyslog("EnigmaNG: " x); #endif #endif // __SKINENIGMA_COMMON_H // vim:et:sw=2:ts=2: vdr-plugin-skinenigmang-0.1.5/config.c000066400000000000000000000155201435005021200176600ustar00rootroot00000000000000/* * config.c: 'EnigmaNG' skin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #include "common.h" #include "config.h" #include "tools.h" #ifdef USE_PLUGIN_AVARDS #include "services/avards.h" #endif #include #include #include #ifdef HAVE_IMAGEMAGICK const char *imageExtensionTexts[NUM_IMAGEEXTENSIONTEXTS] = { "xpm", "jpg", "png" }; #endif cEnigmaConfig EnigmaConfig; cGraphtftFont FontCache; FontConfig allFontConfig[FONT_NUMFONTS] = { { FONT_OSDTITLE, "FontOsdTitle", "FontOsdTitleName" }, { FONT_MESSAGE, "FontMessage", "FontMessageName" }, { FONT_DATE, "FontDate", "FontDateName" }, { FONT_HELPKEYS, "FontHelpKeys", "FontHelpKeysName" }, { FONT_CITITLE, "FontCiTitle", "FontCiTitleName" }, { FONT_CISUBTITLE, "FontCiSubtitle", "FontCiSubtitleName" }, { FONT_CILANGUAGE, "FontCiLanguage", "FontCiLanguageName" }, { FONT_LISTITEM, "FontListItem", "FontListItemName" }, { FONT_INFOTIMERHEADLINE, "FontInfoTimerHeadline", "FontInfoTimerHeadlineName" }, { FONT_INFOTIMERTEXT, "FontInfoTimerText", "FontInfoTimerTextName" }, { FONT_INFOWARNHEADLINE, "FontInfoWarnHeadline", "FontInfoWarnHeadlineName" }, { FONT_INFOWARNTEXT, "FontInfoWarnText", "FontInfoWarnTextName" }, { FONT_DETAILSTITLE, "FontDetailsTitle", "FontDetailsTitleName" }, { FONT_DETAILSSUBTITLE, "FontDetailsSubtitle", "FontDetailsSubtitleName" }, { FONT_DETAILSDATE, "FontDetailsDate", "FontDetailsDateName" }, { FONT_DETAILSTEXT, "FontDetailsText", "FontDetailsTextName" }, { FONT_REPLAYTIMES, "FontReplayTimes", "FontReplayTimesName" }, { FONT_FIXED, "FontFixed", "FontFixedName" } }; cEnigmaConfig::cEnigmaConfig() : showAuxInfo(1), showLogo(1), showVps(1), showSymbols(1), showSymbolsMenu(0), showSymbolsReplay(1), showSymbolsMsgs(1), showSymbolsAudio(1), showColSymbolsDetails(0), showListSymbols(1), showProgressbar(1), cacheSize(50), useChannelId(0), showInfo(1), minInfoWidth(144), showRemaining(0), showMarker(1), singleArea(1), singleArea8Bpp(1), showFlags(1), numReruns(5), useSubtitleRerun(1), showTimerConflicts(1), showRecSize(2), showImages(0), resizeImages(0), showMailIcon(0), imageWidth(120), imageHeight(80), imageExtension(0), fullTitleWidth(0), useTextEffects(0), scrollDelay(50), scrollPause(1500), scrollMode(0), blinkPause(1000), scrollInfo(1), scrollListItem(1), scrollOther(1), scrollTitle(1), dynOsd(0), statusLineMode(0), showWssSymbols(0), showStatusSymbols(0), showScrollbar(1), showSignalInfo(0), showCatGenCon(0), showCaMode(0), drawRoundCorners(1), channelLogoWidth(80), channelLogoHeight(80), signalInfoWidth(74), progressBarWidth(124) { memset(logoDir, 0, sizeof(logoDir)); memset(strImagesDir, 0, sizeof(strImagesDir)); for (int id = 0; id < FONT_NUMFONTS; id++) { switch (id) { case FONT_CISUBTITLE: case FONT_CILANGUAGE: case FONT_DETAILSSUBTITLE: allFonts[id].VdrId = fontSml + 1; allFonts[id].Default = fontSml; break; case FONT_FIXED: allFonts[id].VdrId = fontFix + 1; allFonts[id].Default = fontFix; break; default: allFonts[id].VdrId = fontOsd + 1; allFonts[id].Default = fontOsd; } memset(allFonts[id].Name, 0, sizeof(allFonts[id].Name)); allFonts[id].Width = 100; allFonts[id].Size = 26; } } cEnigmaConfig::~cEnigmaConfig() { } void cEnigmaConfig::SetLogoDir(const char *logodirP) { if (logodirP) { debug("cEnigmaConfig::SetLogoDir(%s)", logodirP); strncpy(logoDir, logodirP, sizeof(logoDir)); } } void cEnigmaConfig::SetImagesDir(const char *dir) { if (dir) { debug("cEnigmaConfig::SetImagesDir(%s)", dir); strncpy(strImagesDir, dir, sizeof(strImagesDir)); } } const char *cEnigmaConfig::GetImageExtension(void) { #ifdef HAVE_IMAGEMAGICK return (0 <= imageExtension && imageExtension < NUM_IMAGEEXTENSIONTEXTS) ? imageExtensionTexts[imageExtension] : imageExtensionTexts[0]; #else return "xpm"; #endif } const cFont *cEnigmaConfig::GetFont(int id) { const cFont *res = NULL; eDvbFont nVdrId = (eDvbFont)allFonts[id].VdrId; if (::Setup.UseSmallFont == 1) { // if "Use small font" == "skin dependent" if (nVdrId == FONT_TRUETYPE) { if (!isempty(allFonts[id].Name)) { res = FontCache.GetFont(allFonts[id].Name, allFonts[id].Size, allFonts[id].Width); } } else { if (nVdrId > FONT_TRUETYPE) nVdrId = (eDvbFont)(nVdrId - 1); } } else { if (allFonts[id].Default == fontFix) nVdrId = fontFix; if (::Setup.UseSmallFont == 2) nVdrId = fontSml; else nVdrId = fontOsd; } if (res == NULL) { switch (nVdrId) { case fontOsd: res = FontCache.GetFont(Setup.FontOsd, Setup.FontOsdSize); break; case fontSml: res = FontCache.GetFont(Setup.FontSml, Setup.FontSmlSize); break; case fontFix: res = FontCache.GetFont(Setup.FontFix, Setup.FontFixSize); break; } } if (res) return res; else return cFont::GetFont(nVdrId); } void cEnigmaConfig::SetFont(int id, const char *font) { if (id >= 0 && id < FONT_NUMFONTS && font) { const char *tmp = strrchr(font, ':'); if (tmp) { strncpy(allFonts[id].Name, font, std::min((int)sizeof(allFonts[id].Name), (int)(tmp - font))); allFonts[id].Size = atoi(tmp + 1); tmp = strchr(tmp + 1, ','); if (tmp) { allFonts[id].Width = atoi(tmp + 1); } } else { strncpy(allFonts[id].Name, font, sizeof(allFonts[id].Name)); } } } void cEnigmaConfig::SetFont(int id, int vdrId) { if (id >= 0 && id < FONT_NUMFONTS && vdrId >= 0) { allFonts[id].VdrId = vdrId; } } void cEnigmaConfig::GetOsdSize(struct EnigmaOsdSize *size) { if (size == NULL) return; size->y = Setup.OSDTop; size->x = Setup.OSDLeft; size->w = Setup.OSDWidth; size->h = Setup.OSDHeight; if (dynOsd) { size->y = cOsd::OsdTop(); size->x = cOsd::OsdLeft(); size->w = cOsd::OsdWidth(); size->h = cOsd::OsdHeight(); } if (size->w < MINOSDWIDTH) size->w = MINOSDWIDTH; if (size->h < MINOSDHEIGHT) size->h = MINOSDHEIGHT; debug("cEnigmaConfig::GetOsdSize() x=%d(%d) y=%d(%d) w=%d(%d) h=%d(%d)", size->x, Setup.OSDLeft, size->y, Setup.OSDTop, size->w, Setup.OSDWidth, size->h, Setup.OSDHeight); } // vim:et:sw=2:ts=2: vdr-plugin-skinenigmang-0.1.5/config.h000066400000000000000000000057221435005021200176700ustar00rootroot00000000000000/* * config.h: 'EnigmaNG' skin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __SKINENIGMA_CONFIG_H #define __SKINENIGMA_CONFIG_H #include "common.h" #ifdef HAVE_IMAGEMAGICK #define NUM_IMAGEEXTENSIONTEXTS 3 extern const char *imageExtensionTexts[NUM_IMAGEEXTENSIONTEXTS]; #else #define NUM_IMAGEEXTENSIONTEXTS 0 #endif #include "font.h" #include #include #ifndef MAXFONTNAME #define MAXFONTNAME 64 #endif #ifndef MAXFONTSIZE #define MAXFONTSIZE 64 #endif #define INIT_FONTS EnigmaConfig.InitFonts() struct EnigmaOsdSize { int x; int y; int w; int h; }; #define FONT_TRUETYPE 0 enum { FONT_OSDTITLE, FONT_MESSAGE, FONT_DATE, FONT_HELPKEYS, FONT_CITITLE, FONT_CISUBTITLE, FONT_CILANGUAGE, FONT_LISTITEM, FONT_INFOTIMERHEADLINE, FONT_INFOTIMERTEXT, FONT_INFOWARNHEADLINE, FONT_INFOWARNTEXT, FONT_DETAILSTITLE, FONT_DETAILSSUBTITLE, FONT_DETAILSDATE, FONT_DETAILSTEXT, FONT_REPLAYTIMES, FONT_FIXED, FONT_NUMFONTS }; struct FontInfo { int VdrId; char Name[MAXFONTNAME + 1]; int Width; int Size; int Default; }; struct FontConfig { int Id; const char *KeyId; const char *KeyName; }; extern FontConfig allFontConfig[FONT_NUMFONTS]; struct cEnigmaConfig { private: char logoDir[255]; char strImagesDir[255]; public: cEnigmaConfig(); ~cEnigmaConfig(); void SetLogoDir(const char *logodirP); char *GetLogoDir(void) { return logoDir; } void SetImagesDir(const char *dir); char *GetImagesDir(void) { return strImagesDir; } const char *GetImageExtension(void); const cFont *GetFont(int id); void SetFont(int id, const char *font); void SetFont(int id, int vdrId); void GetOsdSize(struct EnigmaOsdSize *size); int showAuxInfo; int showLogo; int showVps; int showSymbols; int showSymbolsMenu; int showSymbolsReplay; int showSymbolsMsgs; int showSymbolsAudio; int showColSymbolsDetails; int showListSymbols; int showProgressbar; int cacheSize; int useChannelId; int showInfo; int minInfoWidth; int showRemaining; int showMarker; int singleArea; int singleArea8Bpp; int showFlags; int numReruns; int useSubtitleRerun; int showTimerConflicts; int showRecSize; int showImages; int resizeImages; int showMailIcon; int imageWidth; int imageHeight; int imageExtension; int fullTitleWidth; int useTextEffects; int scrollDelay; int scrollPause; int scrollMode; int blinkPause; int scrollInfo; int scrollListItem; int scrollOther; int scrollTitle; int dynOsd; int statusLineMode; int showWssSymbols; int showStatusSymbols; int showScrollbar; int showSignalInfo; int showCatGenCon; int showCaMode; int drawRoundCorners; int channelLogoWidth; int channelLogoHeight; int signalInfoWidth; int progressBarWidth; FontInfo allFonts[FONT_NUMFONTS]; }; extern cEnigmaConfig EnigmaConfig; #endif // __SKINENIGMA_CONFIG_H // vim:et:sw=2:ts=2: vdr-plugin-skinenigmang-0.1.5/enigma.c000066400000000000000000005053611435005021200176620ustar00rootroot00000000000000/* * enigma.c: 'EnigmaNG' skin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #include "common.h" #include "config.h" #include "enigma.h" #include "logo.h" #include "status.h" #include "texteffects.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef DISABLE_SIGNALINFO #include #include #endif //DISABLE_SIGNALINFO #ifdef USE_PLUGIN_EPGSEARCH #include "services/epgsearch.h" #endif #ifdef USE_PLUGIN_AVARDS #include "services/avards.h" #endif #ifdef USE_PLUGIN_MAILBOX #include "services/mailbox.h" #endif #include "tools.h" #define MAX_AUDIO_BITMAPS 3 #define MAX_SPEED_BITMAPS 10 #define MAX_TRICKSPEED_BITMAPS 4 #include "symbols/small/eventparttimer.xpm" #include "symbols/small/eventtimer.xpm" #include "symbols/small/eventvps.xpm" #include "symbols/small/eventrunning.xpm" #include "symbols/small/eventrecording.xpm" #include "symbols/small/recordingnew.xpm" // small symbols (e.g. for channelinfo) #include "symbols/small/audio.xpm" #include "symbols/small/audioleft.xpm" #include "symbols/small/audioright.xpm" #include "symbols/small/dolbydigital.xpm" #include "symbols/small/encrypted.xpm" #include "symbols/small/teletext.xpm" #include "symbols/small/subtitle.xpm" #include "symbols/small/vps.xpm" #include "symbols/small/radio.xpm" #include "symbols/small/recording.xpm" #include "symbols/small/timer.xpm" #include "symbols/small/run.xpm" #ifdef USE_PLUGIN_MAILBOX #include "symbols/small/mail.xpm" #endif #ifdef USE_PLUGIN_AVARDS #define MAX_AVARDS_MODES 6 #include "symbols/small/v_unknown.xpm" #include "symbols/small/v_4_3.xpm" #include "symbols/small/v_l14_9.xpm" #include "symbols/small/v_l16_9.xpm" #include "symbols/small/v_l_16_9.xpm" #include "symbols/small/v_16_9.xpm" #endif static cBitmap bmEventPartTimer(eventparttimer_xpm); static cBitmap bmEventTimer(eventtimer_xpm); static cBitmap bmEventVPS(eventvps_xpm); static cBitmap bmEventRunning(eventrunning_xpm); static cBitmap bmEventRecording(eventrecording_xpm); static cBitmap bmRecordingNew(recordingnew_xpm); // channel info static cBitmap bmAudio[MAX_AUDIO_BITMAPS] = { cBitmap(audio_xpm), cBitmap(audioleft_xpm), cBitmap(audioright_xpm) }; static cBitmap bmDolbyDigital(dolbydigital_xpm); static cBitmap bmEncrypted(encrypted_xpm); static cBitmap bmRadio(radio_xpm); static cBitmap bmRecording(recording_xpm); static cBitmap bmTeletext(teletext_xpm); static cBitmap bmSubtitle(subtitle_xpm); static cBitmap bmVPS(vps_xpm); static cBitmap bmRun(run_xpm); static cBitmap bmTimer(timer_xpm); #ifdef USE_PLUGIN_MAILBOX static cBitmap bmMail(mail_xpm); #endif #ifdef USE_PLUGIN_AVARDS static cBitmap bmWSS[MAX_AVARDS_MODES] = { cBitmap(v_unknown_xpm), cBitmap(v_4_3_xpm), cBitmap(v_l14_9_xpm), cBitmap(v_l16_9_xpm), cBitmap(v_l_16_9_xpm), cBitmap(v_16_9_xpm) }; #endif // audio menu static const char *strAudio_large[MAX_AUDIO_BITMAPS] = { "icons/audio/audioStereo", "icons/audio/audioLeft", "icons/audio/audioRight" }; // replay static const char *strSlowForward_large[MAX_TRICKSPEED_BITMAPS] = { "icons/replay/slowForward", "icons/replay/slowForward1", "icons/replay/slowForward2", "icons/replay/slowForward3" }; static const char *strFastForward_large[MAX_SPEED_BITMAPS] = { "icons/replay/fastForward", "icons/replay/fastForward1", "icons/replay/fastForward2", "icons/replay/fastForward3", "icons/replay/fastForward4", "icons/replay/fastForward5", "icons/replay/fastForward6", "icons/replay/fastForward7", "icons/replay/fastForward8", "icons/replay/fastForward9" }; static const char *strSlowRewind_large[MAX_TRICKSPEED_BITMAPS] = { "icons/replay/slowRewind", "icons/replay/slowRewind1", "icons/replay/slowRewind2", "icons/replay/slowRewind3" }; static const char *strFastRewind_large[MAX_SPEED_BITMAPS] = { "icons/replay/fastRewind", "icons/replay/fastRewind1", "icons/replay/fastRewind2", "icons/replay/fastRewind3", "icons/replay/fastRewind4", "icons/replay/fastRewind5", "icons/replay/fastRewind6", "icons/replay/fastRewind7", "icons/replay/fastRewind8", "icons/replay/fastRewind9" }; static cTheme Theme; // Background colors THEME_CLR(Theme, clrBackground, 0xE5DEE5FA); THEME_CLR(Theme, clrAltBackground, 0xE5B2BBD6); THEME_CLR(Theme, clrTitleBg, 0xE54158BC); THEME_CLR(Theme, clrLogoBg, 0xE58EA4E3); THEME_CLR(Theme, clrBottomBg, 0xE51D2F7D); THEME_CLR(Theme, clrBotProgBarBg, 0xFF808080); THEME_CLR(Theme, clrBotProgBarFg, 0xFFFFFFFF); // Text colors THEME_CLR(Theme, clrMenuTxtFg, 0xFF000000); THEME_CLR(Theme, clrTitleFg, 0xFFFFFFFF); THEME_CLR(Theme, clrTitleShadow, 0xFF000000); // Symbols THEME_CLR(Theme, clrSymbolActive, 0xFFC4C400); THEME_CLR(Theme, clrSymbolInactive, 0xFF808080); THEME_CLR(Theme, clrSymbolRecord, 0xFFC40000); THEME_CLR(Theme, clrSymbolRecordBg, 0xFFFFFFFF); THEME_CLR(Theme, clrSymbolTimerActive, 0xFF0000C4); THEME_CLR(Theme, clrSymbolVpsActive, 0xFFC4C400); THEME_CLR(Theme, clrSymbolRecActive, 0xFFC40000); THEME_CLR(Theme, clrSymbolRunActive, 0xFF00C400); // Help buttons THEME_CLR(Theme, clrButtonRedFg, 0xFFFFFFFF); THEME_CLR(Theme, clrButtonRedBg, 0xE5C40000); THEME_CLR(Theme, clrButtonGreenFg, 0xFF000000); THEME_CLR(Theme, clrButtonGreenBg, 0xE500C400); THEME_CLR(Theme, clrButtonYellowFg, 0xFF000000); THEME_CLR(Theme, clrButtonYellowBg, 0xE5C4C400); THEME_CLR(Theme, clrButtonBlueFg, 0xFFFFFFFF); THEME_CLR(Theme, clrButtonBlueBg, 0xE50000C4); // Messages THEME_CLR(Theme, clrMessageStatusFg, 0xFF000000); THEME_CLR(Theme, clrMessageStatusBg, 0xE5D7FFD1); THEME_CLR(Theme, clrMessageInfoFg, 0xFF000000); THEME_CLR(Theme, clrMessageInfoBg, 0xE5D1DDFF); THEME_CLR(Theme, clrMessageWarningFg, 0xFF000000); THEME_CLR(Theme, clrMessageWarningBg, 0xE5F9FFD1); THEME_CLR(Theme, clrMessageErrorFg, 0xFF000000); THEME_CLR(Theme, clrMessageErrorBg, 0xE5FFD1D1); // Volume bar THEME_CLR(Theme, clrVolumeBar, 0xFF33CC33); THEME_CLR(Theme, clrVolumeBarMute, 0xFFFF0000); // Menu list items THEME_CLR(Theme, clrMenuItemSelectableFg, 0xFF000000); THEME_CLR(Theme, clrMenuItemNotSelectableFg, 0xE54158BC); // Replay OSD THEME_CLR(Theme, clrReplayCurrent, 0xFF1D2F7D); THEME_CLR(Theme, clrReplayTotal, 0xFF1D2F7D); THEME_CLR(Theme, clrReplayModeJump, 0xFF1D2F7D); THEME_CLR(Theme, clrReplayBarAreaBg, 0xE5DEE5FA); THEME_CLR(Theme, clrReplayProgressSeen, 0xFF8EA4E3); THEME_CLR(Theme, clrReplayProgressRest, 0xE5DEE5FA); THEME_CLR(Theme, clrReplayProgressSelected, 0xFF4158BC); THEME_CLR(Theme, clrReplayProgressMark, 0xFF4158BC); THEME_CLR(Theme, clrReplayProgressCurrent, 0xFFFF0000); #ifndef DISABLE_SIGNALINFO // Channel info THEME_CLR(Theme, clrSignalHighFg, 0xFF11BB10); THEME_CLR(Theme, clrSignalMediumFg, 0xFFC4C400); THEME_CLR(Theme, clrSignalLowFg, 0xFFCC0000); #endif //DISABLE_SIGNALINFO #define MIN_DATEWIDTH 144 #define TinyGap 1 #define SmallGap 2 #define Gap 4 #define BigGap 8 #define Roundness 10 #define TitleDecoGap SmallGap #define TitleDecoGap2 SmallGap #define TitleDecoHeight SmallGap #define TitleDeco (TitleDecoGap + TitleDecoHeight + TitleDecoGap2) #define LogoDecoGap SmallGap #define LogoDecoGap2 Gap #define LogoDecoWidth SmallGap #define MarkerGap 6 #define ListProgressBarGap Gap #define ListProgressBarBorder TinyGap #define ListHBorder Gap #define ScrollbarHeight 20 #define ScrollbarWidth 16 // --- cSkinEnigmaDisplayChannel -------------------------------------------- class cSkinEnigmaDisplayChannel : public cSkinDisplayChannel, public cSkinEnigmaBaseOsd { private: bool fShowLogo; bool fWithInfo; char *strLastDate; int nMessagesShown; bool fScrollTitle; bool fScrollOther; bool fLocked; bool fLockNeeded; int idTitle; int idEvTitle; int idEvSubTitle; int idEvCat; int nBPP; const cFont *pFontOsdTitle; const cFont *pFontDate; const cFont *pFontTitle; const cFont *pFontSubtitle; const cFont *pFontLanguage; const cFont *pFontMessage; int xLogoLeft, xLogoRight, yLogoTop, yLogoBottom, xLogoDecoLeft, xLogoDecoRight; int xTitleLeft, xTitleRight, yTitleTop, yTitleBottom, yTitleDecoTop, yTitleDecoBottom; int xEventNowLeft, xEventNowRight, yEventNowTop, yEventNowBottom; int xEventNextLeft, xEventNextRight, yEventNextTop, yEventNextBottom; int xBottomLeft, xBottomRight, yBottomTop, yBottomBottom; int xMessageLeft, xMessageRight, yMessageTop, yMessageBottom; int xFirstSymbol, xDateLeft, xIndent; #ifndef DISABLE_SIGNALINFO int xSignalBarLeft, nStrBarWidth, nSnrBarWidth; #if VDRVERSNUM < 10719 int m_Frontend; #endif cTimeMs UpdateSignalTimer; #endif //DISABLE_SIGNALINFO void DrawAreas(void); void DrawGroupInfo(const cChannel *Channel, int Number); void DrawChannelInfo(const cChannel *Channel, int Number); void DrawSymbols(const cChannel *Channel); #ifndef DISABLE_SIGNALINFO int GetSignal(int &str, int &snr, fe_status_t &status); void UpdateSignal(void); #endif //DISABLE_SIGNALINFO cString GetChannelName(const cChannel *Channel); cString GetChannelNumber(const cChannel *Channel, int Number); int FindCatTextAndLen(const cEvent* e, std::string& cat); public: cSkinEnigmaDisplayChannel(bool WithInfo); virtual ~ cSkinEnigmaDisplayChannel(); 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 Flush(void); }; cSkinEnigmaDisplayChannel::cSkinEnigmaDisplayChannel(bool WithInfo) { debug("cSkinEnigmaDisplayChannel::cSkinEnigmaDisplayChannel(%d)", WithInfo); fWithInfo = WithInfo; struct EnigmaOsdSize OsdSize; EnigmaConfig.GetOsdSize(&OsdSize); xIndent = EnigmaConfig.drawRoundCorners ? Roundness : SmallGap; pFontOsdTitle = EnigmaConfig.GetFont(FONT_OSDTITLE); pFontDate = EnigmaConfig.GetFont(FONT_DATE); pFontTitle = EnigmaConfig.GetFont(FONT_CITITLE); pFontSubtitle = EnigmaConfig.GetFont(FONT_CISUBTITLE); pFontLanguage = EnigmaConfig.GetFont(FONT_CILANGUAGE); pFontMessage = EnigmaConfig.GetFont(FONT_MESSAGE); fShowLogo = EnigmaConfig.showLogo; xFirstSymbol = 0; #ifndef DISABLE_SIGNALINFO nStrBarWidth = 10000; nSnrBarWidth = 10000; #if VDRVERSNUM < 10719 m_Frontend = -1; #endif UpdateSignalTimer.Set(); #endif //DISABLE_SIGNALINFO nMessagesShown = 0; strLastDate = NULL; fScrollTitle = EnigmaConfig.useTextEffects && EnigmaConfig.scrollTitle; fScrollOther = EnigmaConfig.useTextEffects && EnigmaConfig.scrollOther; idTitle = -1; idEvTitle = -1; idEvSubTitle = -1; idEvCat = -1; nBPP = 1; int MessageHeight = 2 * SmallGap + pFontMessage->Height() + 2 * SmallGap; int LogoHeight = 0; if (fWithInfo) LogoHeight = std::max(pFontTitle->Height() * 2 + pFontSubtitle->Height() * 2 + SmallGap, EnigmaConfig.channelLogoHeight); else LogoHeight = std::max(std::max(pFontOsdTitle->Height(), pFontDate->Height()) + TitleDecoGap + TitleDecoHeight + TitleDecoGap2 + MessageHeight + pFontLanguage->Height() + SmallGap, EnigmaConfig.channelLogoHeight); // title bar & logo area xLogoLeft = 0; xLogoRight = xLogoLeft + EnigmaConfig.channelLogoWidth; xLogoDecoLeft = xLogoRight + LogoDecoGap; xLogoDecoRight = xLogoDecoLeft + LogoDecoWidth; xTitleLeft = (fShowLogo && (!EnigmaConfig.fullTitleWidth || !fWithInfo) ? xLogoDecoRight + LogoDecoGap2 : xLogoLeft); xTitleRight = xTitleLeft + ((OsdSize.w - xTitleLeft) & ~0x07); // width must be multiple of 8 yTitleTop = 0; yTitleBottom = yTitleTop + std::max(pFontOsdTitle->Height(), pFontDate->Height()); yTitleDecoTop = yTitleBottom + TitleDecoGap; yTitleDecoBottom = yTitleDecoTop + TitleDecoHeight; yLogoTop = (fWithInfo ? yTitleDecoBottom + TitleDecoGap2 : yTitleTop); yLogoBottom = yLogoTop + LogoHeight; if (fWithInfo) { // current event area xEventNowLeft = (fShowLogo ? xLogoDecoRight + LogoDecoGap2 : xTitleLeft); xEventNowRight = xTitleRight; yEventNowTop = yLogoTop; yEventNowBottom = yEventNowTop + (LogoHeight - SmallGap) / 2; // next event area xEventNextLeft = xEventNowLeft; xEventNextRight = xEventNowRight; yEventNextTop = yEventNowBottom + SmallGap; yEventNextBottom = yLogoBottom; } else { xEventNowLeft = xEventNextLeft = (fShowLogo ? xLogoDecoRight + LogoDecoGap2 : xTitleLeft); xEventNowRight = xEventNextRight = xTitleRight; yEventNowTop = yEventNextTop = yTitleDecoBottom + TitleDecoGap2; yEventNowBottom = yEventNextBottom = yLogoBottom - pFontLanguage->Height() - SmallGap; } // progress bar area xBottomLeft = xTitleLeft; xBottomRight = xTitleRight; yBottomTop = yEventNextBottom + SmallGap; yBottomBottom = yBottomTop + pFontLanguage->Height(); // message area xMessageLeft = xEventNowLeft; xMessageRight = xTitleRight; yMessageTop = yLogoTop + (LogoHeight - MessageHeight) / 2; yMessageBottom = yMessageTop + MessageHeight; // date area cString date = DayDateTime(); int w = pFontDate->Width(date); xDateLeft = xTitleRight - xIndent - w - SmallGap; #ifndef DISABLE_SIGNALINFO xSignalBarLeft = EnigmaConfig.showSignalInfo ? (xBottomRight - xIndent - EnigmaConfig.signalInfoWidth) : -1; #endif // create osd osd = cOsdProvider::NewOsd(OsdSize.x, OsdSize.y + (Setup.ChannelInfoPos ? 0 : (OsdSize.h - yBottomBottom)) ); tArea SingleArea[] = { {0, 0, xBottomRight - 1, yBottomBottom - 1, fShowLogo || EnigmaConfig.showFlags ? 8 : 4} }; if ((SingleArea[0].bpp < 8 || EnigmaConfig.singleArea8Bpp) && osd->CanHandleAreas(SingleArea, sizeof(SingleArea) / sizeof(tArea)) == oeOk) { debug("cSkinEnigmaDisplayChannel: using %dbpp single area", SingleArea[0].bpp); osd->SetAreas(SingleArea, sizeof(SingleArea) / sizeof(tArea)); // clear all osd->DrawRectangle(0, 0, osd->Width(), osd->Height(), clrTransparent); if (SingleArea[0].bpp >=8 && Setup.AntiAlias) nBPP = 8; } else { debug("cSkinEnigmaDisplayChannel: using multiple areas"); if (fShowLogo) { tArea Areas[] = { {xLogoLeft, yLogoTop, xLogoDecoRight - 1, yLogoBottom - 1, 4}, {xTitleLeft, yTitleTop, xTitleRight - 1, yTitleDecoBottom - 1, 2}, {xEventNowLeft, yEventNowTop, xEventNowRight - 1, yEventNextBottom - 1, 4}, {xBottomLeft, yBottomTop, xBottomRight - 1, yBottomBottom - 1, 4} }; eOsdError rc = osd->CanHandleAreas(Areas, sizeof(Areas) / sizeof(tArea)); if (rc == oeOk) osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea)); else { error("cSkinEnigmaDisplayChannel: CanHandleAreas() returned %d", rc); delete osd; osd = NULL; throw 1; return; } } else { tArea Areas[] = { {xTitleLeft, yTitleTop, xTitleRight - 1, yTitleDecoBottom - 1, 2}, {xEventNowLeft, yEventNowTop, xEventNowRight - 1, yEventNextBottom - 1, 4}, {xBottomLeft, yBottomTop, xBottomRight - 1, yBottomBottom - 1, 4} }; eOsdError rc = osd->CanHandleAreas(Areas, sizeof(Areas) / sizeof(tArea)); if (rc == oeOk) osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea)); else { error("cSkinEnigmaDisplayChannel: CanHandleAreas() returned %d", rc); delete osd; osd = NULL; throw 1; return; } } } fLockNeeded = (fScrollTitle || fScrollOther); fLocked = false; TE_START(osd); if (fLockNeeded) { fLocked = true; } } cSkinEnigmaDisplayChannel::~cSkinEnigmaDisplayChannel() { debug("cSkinEnigmaDisplayChannel::~cSkinEnigmaDisplayChannel()"); if (fLockNeeded && !fLocked) TE_LOCK; TE_STOP; #ifndef DISABLE_SIGNALINFO #if VDRVERSNUM < 10719 if (m_Frontend >= 0) close(m_Frontend); #endif #endif //DISABLE_SIGNALINFO free(strLastDate); delete osd; } void cSkinEnigmaDisplayChannel::DrawAreas(void) { // draw titlebar osd->DrawRectangle(xTitleLeft, yTitleTop, xTitleRight - 1, yTitleBottom - 1, Theme.Color(clrTitleBg)); osd->DrawRectangle(xTitleLeft, yTitleDecoTop, xTitleRight - 1, yTitleDecoBottom - 1, Theme.Color(clrTitleBg)); if (fWithInfo) { // draw current event area osd->DrawRectangle(xEventNowLeft, yEventNowTop, xEventNowRight - 1, yEventNowBottom - 1, Theme.Color(clrBackground)); // draw next event area osd->DrawRectangle(xEventNextLeft, yEventNextTop, xEventNextRight - 1, yEventNextBottom - 1, Theme.Color(clrAltBackground)); } else { osd->DrawRectangle(xEventNowLeft, yEventNowTop, xEventNowRight - 1, yEventNextBottom - 1, Theme.Color(clrBackground)); } // draw progress bar area osd->DrawRectangle(xBottomLeft, yBottomTop, xBottomRight - 1, yBottomBottom - 1, Theme.Color(clrBottomBg)); if (EnigmaConfig.drawRoundCorners) { // draw rounded corners if (fWithInfo) { osd->DrawEllipse(xTitleLeft, yTitleTop, xTitleLeft + Roundness - 1, yTitleTop + Roundness - 1, clrTransparent, -2); osd->DrawEllipse(xBottomLeft, yBottomBottom - Roundness, xBottomLeft + Roundness, yBottomBottom - 1, clrTransparent, -3); } osd->DrawEllipse(xTitleRight - Roundness, yTitleTop, xTitleRight - 1, yTitleTop + Roundness - 1, clrTransparent, -1); osd->DrawEllipse(xBottomRight - Roundness, yBottomBottom - Roundness, xBottomRight - 1, yBottomBottom - 1, clrTransparent, -4); } } void cSkinEnigmaDisplayChannel::DrawGroupInfo(const cChannel *Channel, int /* Number */) { DrawAreas(); int xName = (fShowLogo && EnigmaConfig.fullTitleWidth ? xEventNowLeft : xTitleLeft + xIndent + pFontOsdTitle->Width("0000-") + Gap); idTitle = TE_MARQUEE(osd, idTitle, fScrollTitle, xName, yTitleTop + (yTitleBottom - yTitleTop - pFontOsdTitle->Height()) / 2, GetChannelName(Channel), Theme.Color(clrTitleFg), Theme.Color(clrTitleBg), pFontOsdTitle, nBPP, xDateLeft - SmallGap - xName); } void cSkinEnigmaDisplayChannel::DrawChannelInfo(const cChannel *Channel, int Number) { DrawAreas(); int xNumber = xTitleLeft + xIndent; int xName = xNumber + pFontOsdTitle->Width("0000-") + Gap; if (fShowLogo && EnigmaConfig.fullTitleWidth && fWithInfo) { xNumber = xTitleLeft + xIndent; xName = xEventNowLeft; } // draw channel number osd->DrawText(xNumber, yTitleTop, GetChannelNumber(Channel, Number), Theme.Color(clrTitleFg), clrTransparent, pFontOsdTitle, xName - xNumber - Gap, yTitleBottom - yTitleTop, taCenter); // draw channel name idTitle = TE_MARQUEE(osd, idTitle, fScrollTitle, xName, yTitleTop + (yTitleBottom - yTitleTop - pFontOsdTitle->Height()) / 2, GetChannelName(Channel), Theme.Color(clrTitleFg), Theme.Color(clrTitleBg), pFontOsdTitle, nBPP, xDateLeft - SmallGap - xName); if (fWithInfo && EnigmaConfig.showStatusSymbols) DrawSymbols(Channel); } void cSkinEnigmaDisplayChannel::DrawSymbols(const cChannel *Channel) { // draw symbols // right edge of logo int xs = xBottomRight - xIndent; // bottom edge of logo int ys = yBottomTop + (yBottomBottom - yBottomTop - SymbolHeight) / 2; #ifndef DISABLE_SIGNALINFO if (xSignalBarLeft >= 0) xs = xSignalBarLeft - Gap; #endif //DISABLE_SIGNALINFO bool isvps = false; if (EnigmaConfig.showVps) { // check if vps // get schedule #if VDRVERSNUM >= 20301 LOCK_SCHEDULES_READ #else cSchedulesLock SchedulesLock; const cSchedules *Schedules = cSchedules::Schedules(SchedulesLock); #endif if (Schedules) { const cSchedule *Schedule = Schedules->GetSchedule(Channel); if (Schedule) { // get present event const cEvent *Event = Schedule->GetPresentEvent(); // check if present event has vps if (Event && Event->Vps()) { isvps = true; } } } } // draw audio symbol according to current audio channel int AudioMode = cDevice::PrimaryDevice()->GetAudioChannel(); if (!(AudioMode >= 0 && AudioMode < MAX_AUDIO_BITMAPS)) AudioMode = 0; xs -= (bmAudio[AudioMode].Width() + SmallGap); osd->DrawBitmap(xs, ys, bmAudio[AudioMode], Theme.Color(clrBottomBg), Theme.Color(Channel->Apid(1) ? clrSymbolActive : clrSymbolInactive)); if (Channel->Dpid(0) || EnigmaConfig.showStatusSymbols == 1) { // draw dolby digital symbol xs -= (bmDolbyDigital.Width() + SmallGap); osd->DrawBitmap(xs, ys, bmDolbyDigital, Theme.Color(clrBottomBg), Theme.Color(Channel->Dpid(0) ? clrSymbolActive : clrSymbolInactive)); } if (Channel->Spid(0) || EnigmaConfig.showStatusSymbols == 1) { // draw subtitle symbol xs -= (bmSubtitle.Width() + SmallGap); osd->DrawBitmap(xs, ys, bmSubtitle, Theme.Color(clrBottomBg), Theme.Color(Channel->Spid(0) ? clrSymbolActive : clrSymbolInactive)); } if ((isvps || EnigmaConfig.showStatusSymbols == 1) && EnigmaConfig.showVps) { // draw vps symbol xs -= (bmVPS.Width() + SmallGap); osd->DrawBitmap(xs, ys, bmVPS, Theme.Color(clrBottomBg), Theme.Color(isvps ? clrSymbolActive : clrSymbolInactive)); } // draw radio symbol if no video PID; otherwise draw teletext symbol if (Channel->Vpid()) { xs -= (bmTeletext.Width() + SmallGap); osd->DrawBitmap(xs, ys, bmTeletext, Theme.Color(clrBottomBg), Theme.Color(Channel->Tpid() ? clrSymbolActive : clrSymbolInactive)); } else { xs -= (bmRadio.Width() + SmallGap); osd->DrawBitmap(xs, ys, bmRadio, Theme.Color(clrBottomBg), Theme.Color(Channel->Apid(0) ? clrSymbolActive : clrSymbolInactive)); } if (EnigmaConfig.showCaMode == 0) { if (Channel->Ca() >= 0x0100 || EnigmaConfig.showStatusSymbols == 1) { // draw encryption symbol xs -= (bmEncrypted.Width() + SmallGap); osd->DrawBitmap(xs, ys, bmEncrypted, Theme.Color(clrBottomBg), Theme.Color(Channel->Ca() >= 0x0100 ? clrSymbolActive : clrSymbolInactive)); } } else { const char *strCA = NULL; switch (Channel->Ca()) { case 0x0000: /* Free-To-Air */ strCA = tr("Free-To-Air"); break; case 0x0001 ... 0x000F: /* Reserved */ break; case 0x0100 ... 0x01FF: /* Canal Plus */ strCA = "Seca"; break; case 0x0500 ... 0x05FF: /* France Telecom */ strCA = "Viaccess"; break; case 0x0600 ... 0x06FF: /* Irdeto */ strCA = "Irdeto"; break; case 0x0900 ... 0x09FF: /* News Datacom */ strCA = "NDS"; break; case 0x0B00 ... 0x0BFF: /* Norwegian Telekom */ strCA = "Conax"; break; case 0x0D00 ... 0x0DFF: /* Philips */ strCA = "Cryptoworks"; break; case 0x0E00 ... 0x0EFF: /* Scientific Atlanta */ strCA = "Powervu"; break; case 0x1200 ... 0x12FF: /* BellVu Express */ strCA = "Nagravision"; break; case 0x1700 ... 0x17FF: /* BetaTechnik */ strCA = "Betacrypt"; break; case 0x1800 ... 0x18FF: /* Kudelski SA */ strCA = "Nagravision"; break; case 0x2200 ... 0x22FF: /* Scopus */ strCA = "CodiCrypt"; break; case 0x2600 : /* EBU */ strCA = "BISS"; break; case 0x4A20 ... 0x4A2F: /* AlphaCrypt */ strCA = "AlphaCrypt"; break; case 0x4A60 ... 0x4A6F: /* @Sky */ strCA = "Skycrypt"; break; case 0x4A70 ... 0x4A7F: /* Dreamcrypt */ strCA = "DreamCrypt"; break; case 0x4A80 ... 0x4A8F: /* THALESCrypt */ strCA = "ThalesCrypt"; break; case 0x4AA0 ... 0x4AAF: /* SIDSA */ strCA = "KeyFly"; break; case 0x4AD0 ... 0x4AD1: /* XCrypt Inc */ strCA = "XCrypt"; break; case 0x4AE0 ... 0x4AE1: /* Digi Raum Electronics */ strCA = "DRE-Crypt"; break; default: strCA = tr("encrypted"); break; } if (strCA) { xs -= (pFontLanguage->Width(strCA) + SmallGap); osd->DrawText(xs, yBottomTop + SmallGap , strCA, Theme.Color(clrSymbolActive), Theme.Color(clrBottomBg), pFontLanguage, pFontLanguage->Width(strCA), yBottomBottom - SmallGap); } } xFirstSymbol = DrawStatusSymbols(xBottomLeft + xIndent + EnigmaConfig.progressBarWidth + Gap, xs, yBottomTop, yBottomBottom, Channel) - Gap; } #ifndef DISABLE_SIGNALINFO #define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d" int cSkinEnigmaDisplayChannel::GetSignal(int &str, int &snr, fe_status_t & /* status */) { #if VDRVERSNUM < 10719 if (m_Frontend < 0) { str = 0; snr = 0; int const cardIndex = cDevice::ActualDevice()->CardIndex(); static char dev[256]; sprintf(dev, FRONTEND_DEVICE, cardIndex, 0); m_Frontend = open(dev, O_RDONLY | O_NONBLOCK); if (m_Frontend < 0) return -1; } else if (UpdateSignalTimer.Elapsed() < 500) { return 0; } ::ioctl(m_Frontend, FE_READ_SIGNAL_STRENGTH, &str); ::ioctl(m_Frontend, FE_READ_SNR, &snr); #else if (UpdateSignalTimer.Elapsed() < 500) { return 0; } cDevice* dev = cDevice::ActualDevice(); str = dev->SignalStrength(); snr = dev->SignalQuality(); #endif UpdateSignalTimer.Set(); return 0; } void cSkinEnigmaDisplayChannel::UpdateSignal() { if (xSignalBarLeft <= 0) return; int str = -1; int snr = -1; fe_status_t status; if (GetSignal(str, snr, status) < 0) return; if (snr < 0 && str < 0) return; int bw = EnigmaConfig.signalInfoWidth; int xSignalBarRight = xSignalBarLeft + bw; #if VDRVERSNUM < 10719 str = str * bw / 0xFFFF; snr = snr * bw / 0xFFFF; #else str = str * bw / 100; snr = snr * bw / 100; #endif if (str != nStrBarWidth || snr != nSnrBarWidth) { nStrBarWidth = str; nSnrBarWidth = snr; int h = int((yBottomBottom - Gap - yBottomTop - Gap - Gap ) / 2); int yStr = yBottomTop + Gap; int ySnr = yStr + h + Gap; // Draw Background osd->DrawRectangle(xSignalBarLeft, yStr, xSignalBarRight - 1, yStr + h , Theme.Color(clrBotProgBarBg)); osd->DrawRectangle(xSignalBarLeft, ySnr, xSignalBarRight - 1, ySnr + h , Theme.Color(clrBotProgBarBg)); // Draw Foreground int signalFgColor = Theme.Color(clrSignalHighFg); if (str <= 0.5 * bw) // low signal : RED signalFgColor = Theme.Color(clrSignalLowFg); else if (str <= 0.6 * bw) // medium signal : ORANGE signalFgColor = Theme.Color(clrSignalMediumFg); if (str) osd->DrawRectangle(xSignalBarLeft, yStr , xSignalBarLeft + str - 1, yStr + h , signalFgColor); signalFgColor = Theme.Color(clrSignalHighFg); if (snr <= 0.5 * bw) // low signal : RED signalFgColor = Theme.Color(clrSignalLowFg); else if (snr <= 0.6 * bw) // medium signal : ORANGE signalFgColor = Theme.Color(clrSignalMediumFg); if (snr) osd->DrawRectangle(xSignalBarLeft, ySnr , xSignalBarLeft + snr - 1, ySnr + h , signalFgColor); } } #endif //DISABLE_SIGNALINFO cString cSkinEnigmaDisplayChannel::GetChannelName(const cChannel *Channel) { char buffer[256]; // check if channel exists if (Channel) { snprintf(buffer, sizeof(buffer), "%s", Channel->Name()); } else { snprintf(buffer, sizeof(buffer), "%s", tr("*** Invalid Channel ***")); } return buffer; } cString cSkinEnigmaDisplayChannel::GetChannelNumber(const cChannel *Channel, int Number) { char buffer[256]; // check if real channel exists if (Channel && !Channel->GroupSep()) { snprintf(buffer, sizeof(buffer), "%d%s", Channel->Number(), Number ? "-" : ""); } else if (Number) { // no channel but number snprintf(buffer, sizeof(buffer), "%d-", Number); } else { // no channel and no number snprintf(buffer, sizeof(buffer), " "); } return buffer; } int cSkinEnigmaDisplayChannel::FindCatTextAndLen(const cEvent* e, std::string& cat) { cat = ExtractAttribute(e->Description(), EVENT_CATEGORY); std::string gen = ExtractAttribute(e->Description(), EVENT_GENRE); if (!cat.empty() && !gen.empty()) cat += " - "; cat += gen; #if VDRVERSNUM >= 10711 if (cat.empty()) { std::string strInfo; bool fFirst = true; for (int i = 0; e->Contents(i); i++) { const char *s = e->ContentToString(e->Contents(i)); if (!isempty(s)) { if (!fFirst) strInfo += " "; fFirst = false; strInfo += s; } } cat += strInfo; } #endif return 0; } void cSkinEnigmaDisplayChannel::SetChannel(const cChannel *Channel, int Number) { debug("cSkinEnigmaDisplayChannel::SetChannel()"); if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } #ifndef DISABLE_SIGNALINFO #if VDRVERSNUM < 10719 if (m_Frontend >= 0) { close(m_Frontend); m_Frontend = -1; } #endif #endif //DISABLE_SIGNALINFO xFirstSymbol = 0; free(strLastDate); strLastDate = NULL; if (Channel) { // clear all osd->DrawRectangle(0, 0, osd->Width(), osd->Height(), clrTransparent); if (fShowLogo) { // draw logo area osd->DrawRectangle(xLogoLeft, yLogoTop, xLogoRight - 1, yLogoBottom - 1, Theme.Color(clrLogoBg)); osd->DrawRectangle(xLogoDecoLeft, yLogoTop, xLogoDecoRight - 1, yLogoBottom - 1, Theme.Color(clrLogoBg)); if (EnigmaLogoCache.LoadChannelLogo(Channel)) { osd->DrawBitmap(xLogoLeft + (xLogoRight - xLogoLeft - EnigmaLogoCache.Get().Width()) / 2, yLogoTop + (yLogoBottom - yLogoTop - EnigmaLogoCache.Get().Height()) / 2, EnigmaLogoCache.Get(), EnigmaLogoCache.Get().Color(1), Theme.Color(clrLogoBg), true); } } if (Channel->GroupSep()) DrawGroupInfo(Channel, Number); else DrawChannelInfo(Channel, Number); } if (fLockNeeded && !fLocked) TE_UNLOCK; } void cSkinEnigmaDisplayChannel::SetEvents(const cEvent *Present, const cEvent *Following) { //TODO: update symbols debug("cSkinEnigmaDisplayChannel::SetEvents(%p, %p)", Present, Following); if (!fWithInfo) return; int xTimeLeft = xEventNowLeft + Gap; int wPresent = Present ? pFontTitle->Width(Present->GetTimeString()) : 0; int wFollowing = Following ? pFontTitle->Width(Following->GetTimeString()) : 0; int xTimeWidth = std::max(wPresent, wFollowing); if (xTimeWidth == 0) xTimeWidth = pFontTitle->Width("00:00"); int lineHeightTitle = pFontTitle->Height(); int lineHeightSubtitle = pFontSubtitle->Height(); if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } EnigmaTextEffects.ResetText(idEvTitle, Theme.Color(clrMenuTxtFg), Theme.Color(clrBackground), false); EnigmaTextEffects.ResetText(idEvSubTitle, Theme.Color(clrMenuItemNotSelectableFg), Theme.Color(clrBackground), false); EnigmaTextEffects.ResetText(idEvCat, Theme.Color(clrMenuItemNotSelectableFg), Theme.Color(clrBackground), false); idEvTitle = idEvSubTitle = idEvCat = -1; // check epg datas const cEvent *e = Present; // Current event int wDur = 0; if (e) { char sLen[11]; char sNow[15]; int total = e->Duration(); sprintf(sLen, "%d'", total / 60); int now = std::max((int)(time(NULL) - e->StartTime()), 0); if ((now < total) && ((now / 60) > 0)) { switch (EnigmaConfig.showRemaining) { case 0: snprintf(sNow, sizeof(sNow), "+%d'", now / 60); break; case 1: snprintf(sNow, sizeof(sNow), "-%d'", (int)ceil((total - now) / 60.0)); break; case 2: snprintf(sNow, sizeof(sNow), "%ld%%", lrint((ceil((float)now) / total * 100.0))); break; case 3: snprintf(sNow, sizeof(sNow), "+%d'/-%d'", now / 60, (int)ceil((total - now) / 60.0)); break; default: error("Invalid value for ShowRemaining: %d", EnigmaConfig.showRemaining); } } wDur = std::max(pFontTitle->Width(sLen), pFontSubtitle->Width(sNow)); int xDurationLeft = xEventNowRight - Gap - wDur; int xDurationWidth = xEventNowRight - Gap - xDurationLeft; int xTextLeft = xTimeLeft + xTimeWidth + BigGap; int xTextWidth = xDurationLeft - xTextLeft - BigGap; // draw start time osd->DrawText(xTimeLeft, yEventNowTop, e->GetTimeString(), Theme.Color(clrMenuTxtFg), Theme.Color(clrBackground), pFontTitle, xTimeWidth); // draw title idEvTitle = TE_MARQUEE(osd, idEvTitle, fScrollOther, xTextLeft, yEventNowTop, e->Title(), Theme.Color(clrMenuTxtFg), Theme.Color(clrBackground), pFontTitle, nBPP, xTextWidth, pFontTitle->Height()); // draw duration osd->DrawText(xDurationLeft, yEventNowTop, sLen, Theme.Color(clrMenuTxtFg), Theme.Color(clrBackground), pFontTitle, xDurationWidth, lineHeightTitle, taRight); if (e->HasTimer()) { if (e->IsRunning()) osd->DrawBitmap(xTimeLeft + (xTimeWidth - bmRecording.Width()) / 2, yEventNowTop + lineHeightTitle, bmRecording, Theme.Color(clrSymbolRecActive), Theme.Color(clrBackground)); else osd->DrawBitmap(xTimeLeft + (xTimeWidth - bmTimer.Width()) / 2, yEventNowTop + lineHeightTitle, bmTimer, Theme.Color(clrSymbolTimerActive), Theme.Color(clrBackground)); } std::string strShortText = e->ShortText() ? e->ShortText() : ""; if (EnigmaConfig.showCatGenCon) { std::string cat; if (FindCatTextAndLen(e, cat) == 0 && !cat.empty()) { // append category to shorttext if (strShortText.empty()) { strShortText = "[" + cat + "]"; } else { strShortText += " [" + cat + "]"; } } } // draw shorttext idEvSubTitle = TE_MARQUEE(osd, idEvSubTitle, fScrollOther, xTextLeft, yEventNowTop + lineHeightTitle, strShortText.c_str(), Theme.Color(clrMenuItemNotSelectableFg), Theme.Color(clrBackground), pFontSubtitle, nBPP, xTextWidth, pFontSubtitle->Height()); // draw duration if ((now < total) && ((now / 60) > 0)) { osd->DrawText(xDurationLeft, yEventNowTop + lineHeightTitle, sNow, Theme.Color(clrMenuItemNotSelectableFg), Theme.Color(clrBackground), pFontSubtitle, xDurationWidth, lineHeightSubtitle, taRight); } // draw timebar int xBarLeft = xBottomLeft + xIndent; int xBarWidth = EnigmaConfig.progressBarWidth; int x = xBarLeft + SmallGap + (int)(ceil((float)(now) / (float)(total) * (float)(xBarWidth - SmallGap - SmallGap))); x = std::min(x, xBarLeft + xBarWidth - SmallGap - 1); osd->DrawRectangle(xBarLeft, yBottomTop + Gap, xBarLeft + xBarWidth - 1, yBottomBottom - Gap - 1, Theme.Color(clrBotProgBarBg)); osd->DrawRectangle(xBarLeft + SmallGap, yBottomTop + Gap + SmallGap, x, yBottomBottom - Gap - SmallGap - 1, Theme.Color(clrBotProgBarFg)); } e = Following; // Next event if (e) { char sLen[20]; sprintf(sLen, "%d'", e->Duration() / 60); int xDurationLeft = xEventNowRight - Gap - wDur; int xDurationWidth = xEventNowRight - Gap - xDurationLeft; int xTextLeft = xTimeLeft + xTimeWidth + BigGap; int xTextWidth = xDurationLeft - xTextLeft - BigGap; // draw start time osd->DrawText(xTimeLeft, yEventNextTop, e->GetTimeString(), Theme.Color(clrMenuTxtFg), Theme.Color(clrAltBackground), pFontTitle, xTimeWidth); // draw title osd->DrawText(xTextLeft, yEventNextTop, e->Title(), Theme.Color(clrMenuTxtFg), Theme.Color(clrAltBackground), pFontTitle, xTextWidth); // draw duration osd->DrawText(xDurationLeft, yEventNextTop, sLen, Theme.Color(clrMenuTxtFg), Theme.Color(clrAltBackground), pFontTitle, xDurationWidth, lineHeightTitle, taRight); if (e->HasTimer()) osd->DrawBitmap(xTimeLeft + (xTimeWidth - bmTimer.Width()) / 2, yEventNextTop + lineHeightTitle, bmTimer, Theme.Color(clrSymbolTimerActive), Theme.Color(clrAltBackground)); std::string strShortText = e->ShortText() ? e->ShortText() : ""; if (EnigmaConfig.showCatGenCon) { std::string cat; if (FindCatTextAndLen(e, cat) == 0 && !cat.empty()) { // append category to shorttext if (strShortText.empty()) { strShortText = "[" + cat + "]"; } else { strShortText += " [" + cat + "]"; } } } // draw shorttext osd->DrawText(xTextLeft, yEventNextTop + lineHeightTitle, strShortText.c_str(), Theme.Color(clrMenuItemNotSelectableFg), Theme.Color(clrAltBackground), pFontSubtitle, xTextWidth); } if (fLockNeeded && !fLocked) TE_UNLOCK; } void cSkinEnigmaDisplayChannel::SetMessage(eMessageType Type, const char *Text) { debug("cSkinEnigmaDisplayChannel::SetMessage()"); if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } // check if message if (Text) { int top = (fWithInfo ? yMessageTop : yEventNowTop); int bottom = (fWithInfo ? yMessageBottom : yEventNextBottom); EnigmaTextEffects.PauseEffects(top); // save osd region if (nMessagesShown == 0) osd->SaveRegion(xMessageLeft, top, xMessageRight - 1, bottom - 1); // draw message osd->DrawRectangle(xMessageLeft, top, xMessageRight - 1, bottom - 1, clrTransparent); osd->DrawRectangle(xMessageLeft, top + SmallGap, xMessageRight - 1, bottom - SmallGap - 1, Theme.Color(clrButtonRedBg)); osd->DrawText(xMessageLeft, top + 2 * SmallGap, Text, Theme.Color(clrMessageStatusFg + 2 * Type), Theme.Color(clrMessageStatusBg + 2 * Type), pFontMessage, xMessageRight - xMessageLeft, bottom - 2 * SmallGap - top - 2 * SmallGap, taCenter); nMessagesShown++; } else { if (nMessagesShown > 0) nMessagesShown--; // restore saved osd region if (nMessagesShown == 0) osd->RestoreRegion(); EnigmaTextEffects.PauseEffects(); } if (fLockNeeded && !fLocked) TE_UNLOCK; } void cSkinEnigmaDisplayChannel::Flush(void) { // debug("cSkinEnigmaDisplayChannel::Flush()"); if (fLockNeeded && !fLocked) TE_LOCK; cString date = DayDateTime(); if ((strLastDate == NULL) || strcmp(strLastDate, (const char*)date) != 0) { free(strLastDate); strLastDate = strdup((const char*)date); // update date string int w = pFontDate->Width(date); osd->DrawText(xDateLeft, yTitleTop, date, Theme.Color(clrTitleFg), Theme.Color(clrTitleBg), pFontDate, w, yTitleBottom - yTitleTop, taCenter); } #ifndef DISABLE_SIGNALINFO UpdateSignal(); #endif //DISABLE_SIGNALINFO osd->Flush(); if (fLockNeeded) { TE_UNLOCK; if (fLocked) { fLocked = false; TE_WAKEUP; } } } // --- cSkinEnigmaDisplayMenu ----------------------------------------------- class cSkinEnigmaDisplayMenu : public cSkinDisplayMenu, public cSkinEnigmaBaseOsd { protected: int Tab(int n) { return (n >= 0 && n < MaxTabs) ? mytabs[n] : 0; } private: int mytabs[MaxTabs]; const cFont *pFontList; const cFont *pFontOsdTitle; const cFont *pFontHelpKeys; const cFont *pFontDate; const cFont *pFontDetailsTitle; const cFont *pFontDetailsSubtitle; const cFont *pFontDetailsDate; const cFont *pFontDetailsText; const cFont *pFontMessage; const cFont *pFontInfoWarnHeadline; const cFont *pFontInfoWarnText; const cFont *pFontInfoTimerHeadline; const cFont *pFontInfoTimerText; const cFont *pFontFixed; #if VDRVERSNUM >= 10728 int lastDiskUsageState; #endif char *strTitle; char *strLastDate; char *strTheme; char *strLastText; bool isMainMenu; bool fShowLogo; bool fShowLogoDefault; bool fShowInfo; bool fSetupAreasDone; int xBodyLeft, xBodyRight, yBodyTop, yBodyBottom; int xTitleLeft, xTitleRight, yTitleTop, yTitleBottom, yTitleDecoTop, yTitleDecoBottom; int xButtonsLeft, xButtonsRight, yButtonsTop, yButtonsBottom; int xMessageLeft, xMessageRight, yMessageTop, yMessageBottom; int xDateLeft, xDateRight, yDateTop, yDateBottom; int xLogoLeft, xLogoRight, yLogoTop, yLogoBottom; int xInfoLeft, xInfoRight, yInfoTop, yInfoBottom; int lineHeight, nMarkerGap, xIndent; int xItemLeft, xItemRight, yItemTop; int nMessagesShown; int nNumImageColors; int nBPP; int nOldIndex; int idListItem[MaxTabs]; int idTitle; bool fLocked; bool fLockNeeded; bool fScrollTitle; bool fScrollInfo; bool fScrollListItem; bool fScrollOther; bool fScrollbarShown; void DrawTitle(void); void DrawScrollbar(int Total, int Offset, int Shown, int Top, int Left, int Height, bool CanScrollUp, bool CanScrollDown); void SetTextScrollbar(void); void SetupAreas(void); void SetFonts(void); void SetColors(void); int DrawFlag(int x, int y, const tComponent *p); const char *GetPluginMainMenuName(const char *plugin); int ReadSizeVdr(const char *strPath); bool HasTabbedText(const char *s, int Tab); int getDateWidth(void); public: cSkinEnigmaDisplayMenu(); virtual ~cSkinEnigmaDisplayMenu(); virtual void SetTabs(int Tab1, int Tab2 = 0, int Tab3 = 0, int Tab4 = 0, int Tab5 = 0); virtual void Scroll(bool Up, bool Page); virtual int MaxItems(void); virtual void Clear(void); 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); }; cSkinEnigmaDisplayMenu::cSkinEnigmaDisplayMenu(void) { #if VDRVERSNUM >= 10728 lastDiskUsageState = -1; #endif struct EnigmaOsdSize OsdSize; EnigmaConfig.GetOsdSize(&OsdSize); xIndent = EnigmaConfig.drawRoundCorners ? Roundness : SmallGap; fSetupAreasDone = false; osd = NULL; SetFonts(); strTitle = NULL; strLastDate = NULL; strLastText = NULL; strTheme = strdup(Theme.Name()); isMainMenu = false; fShowLogo = false; #ifdef SKINENIGMA_NO_MENULOGO fShowLogoDefault = false; #else fShowLogoDefault = EnigmaConfig.showSymbols && (EnigmaConfig.showSymbolsMenu || EnigmaConfig.showImages); #endif fShowInfo = false; nMessagesShown = 0; nNumImageColors = 2; nBPP = 1; for (int i = 0; i < MaxTabs; i++) idListItem[i] = -1; nOldIndex = -1; idTitle = -1; fScrollTitle = EnigmaConfig.useTextEffects && EnigmaConfig.scrollTitle; fScrollInfo = EnigmaConfig.useTextEffects && EnigmaConfig.scrollInfo; fScrollListItem = EnigmaConfig.useTextEffects && EnigmaConfig.scrollListItem; fScrollOther = EnigmaConfig.useTextEffects && EnigmaConfig.scrollOther; fScrollbarShown = false; int LogoHeight = std::max(std::max(pFontOsdTitle->Height(), pFontDate->Height()) + TitleDeco + pFontDetailsTitle->Height() + Gap + pFontDetailsSubtitle->Height(), std::max(3 * pFontDate->Height(), (EnigmaConfig.showImages ? std::max(EnigmaConfig.imageHeight, IconHeight) : IconHeight) ) ); int LogoWidth = EnigmaConfig.showImages ? std::max(IconWidth, EnigmaConfig.imageWidth) : IconWidth; int RightColWidth = 0; if (fShowLogoDefault) { int nMainDateWidth = getDateWidth() + SmallGap + LogoWidth; cString date = DayDateTime(); int nSubDateWidth = pFontDate->Width(date); RightColWidth = SmallGap + Gap + std::max(nMainDateWidth, nSubDateWidth) + Gap; } else { cString date = DayDateTime(); RightColWidth = SmallGap + Gap + std::max(MIN_DATEWIDTH + LogoWidth, pFontDate->Width(date)) + Gap; } if (EnigmaConfig.showInfo) RightColWidth = std::max(EnigmaConfig.minInfoWidth, RightColWidth); RightColWidth = RightColWidth & ~0x07; // must be multiple of 8 int MessageHeight = 2 * SmallGap + pFontMessage->Height() + 2 * SmallGap; // title bar xTitleLeft = 0; xTitleRight = OsdSize.w - RightColWidth; yTitleTop = 0; yTitleBottom = std::max(pFontOsdTitle->Height(), pFontDate->Height()); yTitleDecoTop = yTitleBottom + TitleDecoGap; yTitleDecoBottom = yTitleDecoTop + TitleDecoHeight; // help buttons xButtonsLeft = xTitleLeft; xButtonsRight = OsdSize.w; if (EnigmaConfig.statusLineMode == 1) { //message on help butons yButtonsTop = OsdSize.h - std::max(SmallGap + pFontMessage->Height() + SmallGap, pFontHelpKeys->Height()); } else { yButtonsTop = OsdSize.h - pFontHelpKeys->Height(); } yButtonsBottom = OsdSize.h; // content area with items xBodyLeft = xTitleLeft; xBodyRight = xTitleRight; yBodyTop = yTitleDecoBottom + TitleDecoGap2; yBodyBottom = yButtonsTop - SmallGap; // message area xMessageLeft = xBodyLeft; xMessageRight = OsdSize.w; if (EnigmaConfig.statusLineMode == 1) { //on help buttons yMessageBottom = yButtonsBottom; yMessageTop = yButtonsTop; } else { yMessageBottom = yButtonsTop - SmallGap; yMessageTop = yMessageBottom - MessageHeight + SmallGap; // No extra SmallGap at bottom as there's already the Gap above the buttons } // logo box xLogoLeft = OsdSize.w - LogoWidth; xLogoRight = OsdSize.w; yLogoTop = yTitleTop; yLogoBottom = yLogoTop + LogoHeight + SmallGap; // info box xInfoLeft = OsdSize.w - RightColWidth; xInfoRight = OsdSize.w; yInfoTop = yLogoBottom; yInfoBottom = yBodyBottom; // date box xDateLeft = xTitleRight; xDateRight = OsdSize.w; yDateTop = yTitleTop; yDateBottom = yLogoBottom; // create osd osd = cOsdProvider::NewOsd(OsdSize.x, OsdSize.y); tArea SingleArea[] = { {xTitleLeft, yTitleTop, xMessageRight - 1, yButtonsBottom - 1, 8} }; if (EnigmaConfig.singleArea8Bpp && osd->CanHandleAreas(SingleArea, sizeof(SingleArea) / sizeof(tArea)) == oeOk) { debug("cSkinEnigmaDisplayMenu: using %dbpp single area", SingleArea[0].bpp); osd->SetAreas(SingleArea, sizeof(SingleArea) / sizeof(tArea)); nNumImageColors = 230; //TODO: find correct number of colors if (SingleArea[0].bpp >=8 && Setup.AntiAlias) nBPP = 8; } else { if (fShowLogoDefault || EnigmaConfig.showColSymbolsDetails) { debug("cSkinEnigmaDisplayMenu: using 6 areas"); tArea Areas[] = { {xTitleLeft, yTitleTop, xTitleRight - 1, yTitleDecoBottom - 1, 2}, //title area {xBodyLeft, yBodyTop, xBodyRight - 1, yInfoTop + pFontDetailsDate->Height() - 1, 2}, //body area (beside date/logo/symbols area) {xDateLeft, yDateTop, xLogoRight - 1, yInfoTop - 1, 4}, //date/logo area {xInfoLeft, yInfoTop, xInfoRight - 1, yInfoTop + pFontDetailsDate->Height() - 1, 4}, //area for symbols in event/recording info {xBodyLeft, yInfoTop + pFontDetailsDate->Height(), xInfoRight - 1, (EnigmaConfig.statusLineMode == 1 ? yBodyBottom : yMessageTop) - 1, 2}, // body/info area (below symbols area) {xMessageLeft, yMessageTop, xButtonsRight - 1, yButtonsBottom - 1, 4} //buttons/message area }; eOsdError rc = osd->CanHandleAreas(Areas, sizeof(Areas) / sizeof(tArea)); if (rc == oeOk) osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea)); else { error("cSkinEnigmaDisplayMenu: CanHandleAreas() [1] returned %d", rc); delete osd; osd = NULL; throw 1; return; } } else { debug("cSkinEnigmaDisplayMenu: using 4 areas"); tArea Areas[] = { {xTitleLeft, yTitleTop, xTitleRight - 1, yTitleDecoBottom - 1, 2}, //title area {xBodyLeft, yBodyTop, xInfoRight - 1, (EnigmaConfig.statusLineMode == 1 ? yBodyBottom : yMessageTop) - 1, 2}, // body/info area {xDateLeft, yDateTop, xLogoRight - 1, yTitleDecoBottom - 1, 4}, //date area {xMessageLeft, yMessageTop, xButtonsRight - 1, yButtonsBottom - 1, 4} //buttons/message area }; eOsdError rc = osd->CanHandleAreas(Areas, sizeof(Areas) / sizeof(tArea)); if (rc == oeOk) osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea)); else { error("cSkinEnigmaDisplayMenu: CanHandleAreas() [1] returned %d", rc); delete osd; osd = NULL; throw 1; return; } } nNumImageColors = 13; // "16 available colors" - "clrTransparent" - "clrLogoBg" - "clrMenuTxtFg" } lineHeight = pFontList->Height(); nMarkerGap = std::min(MarkerGap, lineHeight / 2 - 1); //lineHeight - 2 * MarkerGap xItemLeft = xBodyLeft + (EnigmaConfig.showMarker ? lineHeight : ListHBorder); xItemRight = (fShowLogo || fShowInfo ? xBodyRight : xInfoRight) - ListHBorder - SmallGap - SmallGap - SmallGap; int numItems = MaxItems(); yItemTop = yBodyTop + ((EnigmaConfig.statusLineMode == 2 ? yMessageTop : yBodyBottom) - yBodyTop - numItems * lineHeight) / 2; fLockNeeded = (fScrollTitle || fScrollInfo || fScrollListItem || fScrollOther); fLocked = false; TE_START(osd); if (fLockNeeded) { fLocked = true; } } void cSkinEnigmaDisplayMenu::SetFonts(void) { debug("cSkinEnigmaDisplayMenu::SetFonts()"); pFontList = EnigmaConfig.GetFont(FONT_LISTITEM); pFontOsdTitle = EnigmaConfig.GetFont(FONT_OSDTITLE); pFontHelpKeys = EnigmaConfig.GetFont(FONT_HELPKEYS); pFontDate = EnigmaConfig.GetFont(FONT_DATE); pFontDetailsTitle = EnigmaConfig.GetFont(FONT_DETAILSTITLE); pFontDetailsSubtitle = EnigmaConfig.GetFont(FONT_DETAILSSUBTITLE); pFontDetailsDate = EnigmaConfig.GetFont(FONT_DETAILSDATE); pFontDetailsText = EnigmaConfig.GetFont(FONT_DETAILSTEXT); pFontMessage = EnigmaConfig.GetFont(FONT_MESSAGE); pFontInfoWarnHeadline = EnigmaConfig.GetFont(FONT_INFOWARNHEADLINE); pFontInfoWarnText = EnigmaConfig.GetFont(FONT_INFOWARNTEXT); pFontInfoTimerHeadline = EnigmaConfig.GetFont(FONT_INFOTIMERHEADLINE); pFontInfoTimerText = EnigmaConfig.GetFont(FONT_INFOTIMERTEXT); pFontFixed = EnigmaConfig.GetFont(FONT_FIXED); } void cSkinEnigmaDisplayMenu::SetColors(void) { debug("cSkinEnigmaDisplayMenu::SetColors()"); #if VDRVERSNUM < 20301 if (osd->GetBitmap(1) == NULL) { //single area return; } cBitmap *bitmap = osd->GetBitmap(0); if (bitmap) { //title area bitmap->Reset(); bitmap->SetColor(0, clrTransparent); bitmap->SetColor(1, Theme.Color(clrTitleBg)); bitmap->SetColor(2, Theme.Color(clrTitleFg)); } bitmap = osd->GetBitmap(1); if (bitmap) { //body area (beside date/logo/ area) bitmap->Reset(); bitmap->SetColor(0, Theme.Color(clrBackground)); bitmap->SetColor(1, Theme.Color(clrAltBackground)); bitmap->SetColor(2, Theme.Color(clrMenuItemSelectableFg)); bitmap->SetColor(3, Theme.Color(clrMenuItemNotSelectableFg)); } bitmap = osd->GetBitmap(2); if (bitmap) { //date/logo area bitmap->Reset(); if (fShowLogo) { bitmap->SetColor(0, clrTransparent); bitmap->SetColor(1, Theme.Color(clrLogoBg)); bitmap->SetColor(2, Theme.Color(clrMenuTxtFg)); } else { bitmap->SetColor(0, Theme.Color(clrBackground)); bitmap->SetColor(1, Theme.Color(clrAltBackground)); bitmap->SetColor(2, Theme.Color(clrMenuItemSelectableFg)); bitmap->SetColor(3, Theme.Color(clrMenuItemNotSelectableFg)); bitmap->SetColor(4, clrTransparent); bitmap->SetColor(5, Theme.Color(clrLogoBg)); bitmap->SetColor(6, Theme.Color(clrMenuTxtFg)); } } if (osd->GetBitmap(4)) { // multiple body areas bitmap = osd->GetBitmap(3); if (bitmap) { //area for symbols in event/recording info bitmap->Reset(); bitmap->SetColor(0, Theme.Color(clrBackground)); bitmap->SetColor(1, Theme.Color(clrAltBackground)); bitmap->SetColor(2, Theme.Color(clrMenuItemSelectableFg)); bitmap->SetColor(3, Theme.Color(clrMenuItemNotSelectableFg)); } bitmap = osd->GetBitmap(4); if (bitmap) { //body/info area (below symbols area) bitmap->Reset(); bitmap->SetColor(0, Theme.Color(clrBackground)); bitmap->SetColor(1, Theme.Color(clrAltBackground)); bitmap->SetColor(2, Theme.Color(clrMenuItemSelectableFg)); bitmap->SetColor(3, Theme.Color(clrMenuItemNotSelectableFg)); } bitmap = osd->GetBitmap(5); } else { // single body area bitmap = osd->GetBitmap(2); } if (bitmap) { //buttons/message area bitmap->Reset(); bitmap->SetColor( 0, Theme.Color(clrBackground)); bitmap->SetColor( 1, Theme.Color(clrAltBackground)); bitmap->SetColor( 2, Theme.Color(clrMenuItemSelectableFg)); bitmap->SetColor( 3, Theme.Color(clrMenuItemNotSelectableFg)); bitmap->SetColor( 4, Theme.Color(clrBottomBg)); bitmap->SetColor( 5, Theme.Color(clrButtonRedBg)); bitmap->SetColor( 6, Theme.Color(clrButtonRedFg)); bitmap->SetColor( 7, Theme.Color(clrButtonGreenBg)); bitmap->SetColor( 8, Theme.Color(clrButtonGreenFg)); bitmap->SetColor( 9, Theme.Color(clrButtonYellowBg)); bitmap->SetColor(10, Theme.Color(clrButtonYellowFg)); bitmap->SetColor(11, Theme.Color(clrButtonBlueBg)); bitmap->SetColor(12, Theme.Color(clrButtonBlueFg)); bitmap->SetColor(13, clrTransparent); // color 14 reserved for "clrMessageStatusFg + 2 * Type" // color 15 reserved for "clrMessageStatusBg + 2 * Type" } #endif } void cSkinEnigmaDisplayMenu::SetupAreas(void) { //Must be TE_LOCKed by caller debug("cSkinEnigmaDisplayMenu::SetupAreas() %d %d %d", isMainMenu, fShowLogo, fShowInfo); fSetupAreasDone = true; SetColors(); EnigmaTextEffects.Clear(); idTitle = -1; nOldIndex = -1; for (int i = 0; i < MaxTabs; i++) idListItem[i] = -1; xItemRight = (fShowLogo || fShowInfo ? xBodyRight : xInfoRight) - ListHBorder - SmallGap - SmallGap - SmallGap; // clear transparent areas (without date/logo borders) osd->DrawRectangle(xBodyLeft, yTitleDecoBottom, xDateLeft - 1, yBodyTop - 1, clrTransparent); osd->DrawRectangle(xBodyLeft, yMessageBottom, xInfoRight - 1, yButtonsTop - 1, clrTransparent); // draw titlebar osd->DrawRectangle(xTitleLeft, yTitleTop, xTitleRight - 1, yTitleBottom - 1, Theme.Color(clrTitleBg)); osd->DrawRectangle(xTitleLeft, yTitleBottom, xTitleRight - 1, yTitleDecoTop - 1, clrTransparent); osd->DrawRectangle(xTitleLeft, yTitleDecoTop, xTitleRight - 1, yTitleDecoBottom - 1, Theme.Color(clrTitleBg)); if (EnigmaConfig.drawRoundCorners) { // draw rounded left corner of title bar osd->DrawEllipse(xTitleLeft, yTitleTop, xTitleLeft + Roundness - 1, yTitleTop + Roundness - 1, clrTransparent, -2); } idTitle = TE_MARQUEE(osd, idTitle, fScrollTitle, xTitleLeft + xIndent, yTitleTop + (yTitleBottom - yTitleTop - pFontOsdTitle->Height()) / 2, strTitle, Theme.Color(clrTitleFg), Theme.Color(clrTitleBg), pFontOsdTitle, nBPP, xTitleRight - xTitleLeft - xIndent - 1); // draw date area if (fShowLogo) { osd->DrawRectangle(xDateLeft + SmallGap, yDateTop, xLogoRight - 1, yDateBottom - SmallGap - 1, Theme.Color(clrLogoBg)); //draw borders osd->DrawRectangle(xDateLeft, yDateTop, xDateLeft + SmallGap - 1, yLogoBottom - SmallGap - 1, clrTransparent); osd->DrawRectangle(xDateLeft, yLogoBottom - SmallGap, xInfoRight - 1, yLogoBottom - 1, clrTransparent); } else { osd->DrawRectangle(xDateLeft + SmallGap, yDateTop, xLogoRight - 1, yTitleDecoBottom - 1, Theme.Color(clrLogoBg)); //draw borders osd->DrawRectangle(xDateLeft, yDateTop, xDateLeft + SmallGap - 1, yTitleDecoBottom - 1, clrTransparent); osd->DrawRectangle(xDateLeft, yTitleDecoBottom, xInfoRight - 1, yBodyTop - 1, clrTransparent); } // draw body area osd->DrawRectangle(xBodyLeft, yBodyTop, xBodyRight - 1, yBodyBottom - 1, Theme.Color(clrBackground)); // draw info area if (fShowInfo) { #ifdef CLEAR_BUG_WORKAROUND osd->DrawRectangle(xInfoLeft, fShowLogo ? yInfoTop : yBodyTop, xInfoRight - 2, yInfoBottom - 1, Theme.Color(clrAltBackground)); #else osd->DrawRectangle(xInfoLeft, fShowLogo ? yInfoTop : yBodyTop, xInfoRight - 1, yInfoBottom - 1, Theme.Color(clrAltBackground)); #endif int x = xInfoLeft + Gap; int y = fShowLogo ? yInfoTop : yBodyTop; int w = xInfoRight - x; #ifdef CLEAR_BUG_WORKAROUND w--; #endif int yMaxHeight = yInfoBottom; #ifdef USE_PLUGIN_EPGSEARCH if (EnigmaConfig.showTimerConflicts) { cPlugin *p = cPluginManager::GetPlugin("epgsearch"); if (p) { Epgsearch_lastconflictinfo_v1_0 *serviceData = new Epgsearch_lastconflictinfo_v1_0; if (serviceData) { serviceData->nextConflict = 0; serviceData->relevantConflicts = 0; serviceData->totalConflicts = 0; p->Service("Epgsearch-lastconflictinfo-v1.0", serviceData); if (serviceData->relevantConflicts > 0) { int yWarning = yMaxHeight - pFontInfoWarnHeadline->Height() - 2 * pFontInfoWarnText->Height(); // Needed space for warning yMaxHeight = yWarning; osd->DrawRectangle(xInfoLeft, yWarning, xInfoRight - 1, yWarning + SmallGap + 1, Theme.Color(clrBackground)); yWarning += pFontInfoWarnText->Height() / 2; TE_BLINK(osd, -1, true, xInfoLeft, yWarning, tr("WARNING"), Theme.Color(clrMenuItemSelectableFg), Theme.Color(clrAltBackground), pFontInfoWarnHeadline, nBPP, w, pFontInfoWarnHeadline->Height(), taCenter); yWarning += (int)(1.5 * pFontInfoWarnHeadline->Height()); char *info = NULL; if (-1 != asprintf(&info, "%d %s", serviceData->relevantConflicts, (serviceData->relevantConflicts == 1 ? tr("Timer conflict") : tr("Timer conflicts")))) { osd->DrawText(x, yWarning, info, Theme.Color(clrMenuItemSelectableFg), Theme.Color(clrAltBackground), pFontInfoWarnText, w, pFontInfoWarnText->Height(), taCenter); yWarning += pFontInfoWarnText->Height(); free(info); } } delete serviceData; } } } #endif //USE_PLUGIN_EPGSEARCH #if VDRVERSNUM >= 20301 LOCK_TIMERS_READ if (Timers->GetNextActiveTimer()) { #else if (Timers.GetNextActiveTimer()) { #endif int h = pFontInfoTimerHeadline->Height(); // Show next active timers y += h / 2; osd->DrawText(x, y, tr("TIMERS"), Theme.Color(clrMenuItemSelectableFg), Theme.Color(clrAltBackground), pFontInfoTimerHeadline, w, pFontInfoTimerHeadline->Height(), taCenter); y += h + h / 2; EnigmaStatus.UpdateActiveTimers(); h = pFontInfoTimerText->Height(); for (tTimer *timer = EnigmaStatus.mTimers.First(); timer; timer = EnigmaStatus.mTimers.Next(timer)) { if (y + 2 * h + SmallGap + 1 + h / 2 > yMaxHeight) break; // don't overwrite warning or help buttons if (timer->isRecording) { osd->DrawBitmap(x, y + (h - bmRecording.Height()) / 2, bmRecording, Theme.Color(clrMenuItemSelectableFg), Theme.Color(clrAltBackground)); } TE_MARQUEE(osd, -1, fScrollInfo, x + (timer->isRecording ? (bmRecording.Width() + Gap) : 0), y, timer->title.c_str(), Theme.Color(clrMenuItemSelectableFg), Theme.Color(clrAltBackground), pFontInfoTimerText, nBPP, w - (timer->isRecording ? (bmRecording.Width() + Gap) : 0), h); y += h; char* info = NULL; int rc = -1; if (timer->isRecording) { rc = asprintf(&info, "- %s / %s", *TimeString(timer->stopTime), timer->channelName.c_str()); } else { rc = asprintf(&info, "%d. %s / %s", timer->startDay, *TimeString(timer->startTime), timer->channelName.c_str()); } if (-1 != rc) { osd->DrawText(x, y, info, Theme.Color(clrMenuItemSelectableFg), Theme.Color(clrAltBackground), pFontInfoTimerText, w, h); free(info); y += h; osd->DrawRectangle(x, y + SmallGap, xInfoRight - Gap - 1, y + SmallGap + 1, Theme.Color(clrMenuItemSelectableFg)); y += SmallGap + 1 + h / 2; } } } #ifdef CLEAR_BUG_WORKAROUND osd->DrawRectangle(xInfoRight - 1, (fShowLogo ? yInfoTop : yBodyTop) - SmallGap, xInfoRight - 1, yInfoBottom - 1, Theme.Color(clrMenuItemNotSelectableFg)); #endif } else { // !fShowInfo osd->DrawRectangle(xInfoLeft, fShowLogo ? yInfoTop : yBodyTop, xInfoRight - 1, yInfoBottom - 1, Theme.Color(clrBackground)); } } cSkinEnigmaDisplayMenu::~cSkinEnigmaDisplayMenu() { if (fLockNeeded && !fLocked) TE_LOCK; TE_STOP; free(strTheme); free(strTitle); free(strLastDate); free(strLastText); delete osd; } void cSkinEnigmaDisplayMenu::SetTabs(int Tab1, int Tab2, int Tab3, int Tab4, int Tab5) { int w = pFontList->Width('0'); mytabs[0] = 0; mytabs[1] = Tab1 ? mytabs[0] + Tab1 : 0; mytabs[2] = Tab2 ? mytabs[1] + Tab2 : 0; mytabs[3] = Tab3 ? mytabs[2] + Tab3 : 0; mytabs[4] = Tab4 ? mytabs[3] + Tab4 : 0; mytabs[5] = Tab5 ? mytabs[4] + Tab5 : 0; if (Tab2) { for (int i = 1; i < MaxTabs; i++) mytabs[i] *= w;//XXX average character width of font used for items - see also skincurses.c!!! } else if (Tab1) { int temp1 = mytabs[0] + (int)(0.7 * ((fShowInfo ? xBodyRight : xInfoRight) - xBodyLeft)); int temp2 = mytabs[1] * w; mytabs[1] = std::min(temp1, temp2); } } void cSkinEnigmaDisplayMenu::SetTextScrollbar(void) { //Must be TE_LOCKed by caller // check if scrollbar is needed if (textScroller.CanScrollUp() || textScroller.CanScrollDown()) DrawScrollbar(textScroller.Total(), textScroller.Offset(), textScroller.Shown(), textScroller.Top() - SmallGap - 1, textScroller.Width(), textScroller.Height() + SmallGap + SmallGap + 1, textScroller.CanScrollUp(), textScroller.CanScrollDown()); } void cSkinEnigmaDisplayMenu::SetScrollbar(int Total, int Offset) { debug("cSkinEnigmaDisplayMenu::SetScrollbar(%d, %d)", Total, Offset); if (EnigmaConfig.showScrollbar == 0 || (EnigmaConfig.showScrollbar == 2 && Total <= MaxItems())) { fScrollbarShown = false; return; } if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } fScrollbarShown = true; DrawScrollbar(Total, Offset, MaxItems(), yItemTop - SmallGap - 1, xItemRight - ScrollbarWidth + SmallGap, MaxItems() * lineHeight + SmallGap + SmallGap + 1, Offset > 0, Offset + MaxItems() < Total); if (fLockNeeded && !fLocked) TE_UNLOCK; } void cSkinEnigmaDisplayMenu::DrawScrollbar(int Total, int Offset, int Shown, int Top, int Left, int Height, bool CanScrollUp, bool CanScrollDown) { //Must be TE_LOCKed by caller if (Total <= 0 || Total <= Shown) { Total = Shown = 1; } int yt = Top; int yb = yt + Height; int st = yt + ScrollbarHeight + Gap; int sb = yb - ScrollbarHeight - Gap; int tt = st + (sb - st) * Offset / Total; int tb = tt + (sb - st) * Shown / Total; int xl = Left + SmallGap; // arrow up osd->DrawRectangle(xl, yt, xl + ScrollbarWidth, yt + SmallGap, CanScrollUp ? Theme.Color(clrMenuTxtFg) : Theme.Color(clrAltBackground)); osd->DrawRectangle(xl + ScrollbarWidth - SmallGap, yt + SmallGap, xl + ScrollbarWidth, yt + ScrollbarHeight, CanScrollUp ? Theme.Color(clrMenuTxtFg) : Theme.Color(clrAltBackground)); // draw background of scrollbar osd->DrawRectangle(xl + ScrollbarWidth - SmallGap, st, xl + ScrollbarWidth, sb, Theme.Color(clrAltBackground)); // draw visible area of scrollbar osd->DrawRectangle(xl + ScrollbarWidth - SmallGap, tt, xl + ScrollbarWidth, tb, Theme.Color(clrMenuTxtFg)); // arrow down osd->DrawRectangle(xl + ScrollbarWidth - SmallGap, yb - ScrollbarHeight, xl + ScrollbarWidth, yb - SmallGap, CanScrollDown ? Theme.Color(clrMenuTxtFg) : Theme.Color(clrAltBackground)); osd->DrawRectangle(xl, yb - SmallGap, xl + ScrollbarWidth, yb, CanScrollDown ? Theme.Color(clrMenuTxtFg) : Theme.Color(clrAltBackground)); } void cSkinEnigmaDisplayMenu::Scroll(bool Up, bool Page) { if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } cSkinDisplayMenu::Scroll(Up, Page); SetTextScrollbar(); if (fLockNeeded && !fLocked) TE_UNLOCK; } int cSkinEnigmaDisplayMenu::MaxItems(void) { // max number of items return ((EnigmaConfig.statusLineMode == 2 ? yMessageTop : yBodyBottom) - yBodyTop) / lineHeight; } void cSkinEnigmaDisplayMenu::Clear(void) { debug("cSkinEnigmaDisplayMenu::Clear() %d %d %d", isMainMenu, fShowLogo, fShowInfo); if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } nOldIndex = -1; for (int i = MaxTabs - 1; i >= 0; i--) { if (idListItem[i] >= 0) { EnigmaTextEffects.ResetText(idListItem[i], Theme.Color(clrMenuItemSelectableFg), Theme.Color(clrBackground), !fLocked); idListItem[i] = -1; } } free(strLastText); strLastText = NULL; textScroller.Reset(); //TODO? SetFonts(); if (strcmp(strTheme, Theme.Name()) != 0) { free(strTheme); strTheme = strdup(Theme.Name()); SetupAreas(); } else { // clear items area if (fShowLogo || fShowInfo) { osd->DrawRectangle(xBodyLeft, yBodyTop, xBodyRight - 1, yBodyBottom - 1, Theme.Color(clrBackground)); //TODO? clear logo and/or info area? } else { osd->DrawRectangle(xBodyLeft, yBodyTop, xInfoRight - 1, yInfoBottom - 1, Theme.Color(clrBackground)); } } if (fLockNeeded && !fLocked) TE_UNLOCK; } void cSkinEnigmaDisplayMenu::DrawTitle(void) { #if VDRVERSNUM >= 10728 bool WithDisk = MenuCategory() == mcMain || MenuCategory() == mcRecording; idTitle = TE_MARQUEE(osd, idTitle, fScrollTitle, xTitleLeft + xIndent, yTitleTop + (yTitleBottom - yTitleTop - pFontOsdTitle->Height()) / 2, WithDisk ? (const char*)cString::sprintf("%s - %s", strTitle, *cVideoDiskUsage::String()) : strTitle, Theme.Color(clrTitleFg), Theme.Color(clrTitleBg), pFontOsdTitle, nBPP, xTitleRight - xTitleLeft - xIndent - 1); #else idTitle = TE_MARQUEE(osd, idTitle, fScrollTitle, xTitleLeft + xIndent, yTitleTop + (yTitleBottom - yTitleTop - pFontOsdTitle->Height()) / 2, strTitle, Theme.Color(clrTitleFg), Theme.Color(clrTitleBg), pFontOsdTitle, nBPP, xTitleRight - xTitleLeft - xIndent - 1); #endif } void cSkinEnigmaDisplayMenu::SetTitle(const char *Title) { debug("cSkinEnigmaDisplayMenu::SetTitle(%s)", Title); bool fTitleChanged = false; if (Title && strTitle) { if (strcmp(Title, strTitle) != 0) { fTitleChanged = true; free(strTitle); strTitle = strdup(Title); } } else { free(strTitle); if (Title) strTitle = strdup(Title); else strTitle = NULL; } #if VDRVERSNUM >= 10728 #define IS_MAINMENU (MenuCategory() == mcMain) #else char *strTitlePrefix = NULL; if (-1 == asprintf(&strTitlePrefix, "%s - ", trVDR("VDR"))) return; #define IS_MAINMENU (strncmp(strTitlePrefix, Title, strlen(strTitlePrefix)) == 0) #endif if ((Title == NULL) || (isMainMenu && IS_MAINMENU)) { if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } DrawTitle(); if (fLockNeeded && !fLocked) TE_UNLOCK; } else { bool old_isMainMenu = isMainMenu; bool old_fShowLogo = fShowLogo; bool old_fShowInfo = fShowInfo; if (strTitle == NULL || IS_MAINMENU) { isMainMenu = true; fShowLogo = fShowLogoDefault ? EnigmaConfig.showSymbolsMenu : false; fShowInfo = EnigmaConfig.showInfo; } else { isMainMenu = false; fShowLogo = false; fShowInfo = false; } if (fTitleChanged) { if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } EnigmaTextEffects.Clear(); idTitle = -1; nOldIndex = -1; for (int i = 0; i < MaxTabs; i++) idListItem[i] = -1; if (fLockNeeded && !fLocked) TE_UNLOCK; } if (!fSetupAreasDone || old_isMainMenu != isMainMenu || old_fShowLogo != fShowLogo || old_fShowInfo != fShowInfo) { if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } SetupAreas(); if (fLockNeeded && !fLocked) TE_UNLOCK; } else { if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } DrawTitle(); if (fLockNeeded && !fLocked) TE_UNLOCK; } } #if VDRVERSNUM < 10728 free (strTitlePrefix); #endif free(strLastDate); strLastDate = NULL; } void cSkinEnigmaDisplayMenu::SetButtons(const char *Red, const char *Green, const char *Yellow, const char *Blue) { debug("cSkinEnigmaDisplayMenu::SetButtons(%s, %s, %s, %s)", Red, Green, Yellow, Blue); if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } #if VDRVERSNUM < 10730 int n0 = 0; int n1 = 1; int n2= 2; int n3 = 3; #else int n0 = Setup.ColorKey0; int n1 = Setup.ColorKey1; int n2 = Setup.ColorKey2; int n3 = Setup.ColorKey3; #endif const char *lutText[] = { Red, Green, Yellow, Blue }; tColor lutFg[] = { clrButtonRedFg, clrButtonGreenFg, clrButtonYellowFg, clrButtonBlueFg }; tColor lutBg[] = { clrButtonRedBg, clrButtonGreenBg, clrButtonYellowBg, clrButtonBlueBg }; int w = (xButtonsRight - xButtonsLeft) / 4; int t3 = xButtonsLeft + xButtonsRight - xButtonsLeft - w; int t2 = t3 - w; int t1 = t2 - w; int t0 = xButtonsLeft; // draw color buttons if (lutText[n0]) osd->DrawText(t0, yButtonsTop, lutText[n0], Theme.Color(lutFg[n0]), Theme.Color(lutBg[n0]), pFontHelpKeys, t1 - t0 + 1, yButtonsBottom - yButtonsTop, taCenter); else { osd->DrawRectangle(t0, yButtonsTop, lutText[n1] ? t1 - 1 : t1, yButtonsBottom - 1, Theme.Color(clrBottomBg)); if (EnigmaConfig.drawRoundCorners) { osd->DrawEllipse(t0, yButtonsBottom - Roundness, t0 + Roundness - 1, yButtonsBottom - 1, clrTransparent, -3); } } if (lutText[n1]) osd->DrawText(t1, yButtonsTop, lutText[n1], Theme.Color(lutFg[n1]), Theme.Color(lutBg[n1]), pFontHelpKeys, w, yButtonsBottom - yButtonsTop, taCenter); else osd->DrawRectangle(t1, yButtonsTop, lutText[n2] ? t1 + w : t2 - 1, yButtonsBottom - 1, Theme.Color(clrBottomBg)); if (lutText[n2]) osd->DrawText(t2, yButtonsTop, lutText[n2], Theme.Color(lutFg[n2]), Theme.Color(lutBg[n2]), pFontHelpKeys, w, yButtonsBottom - yButtonsTop, taCenter); else osd->DrawRectangle(t2, yButtonsTop, lutText[n3] ? t2 + w : t3 - 1, yButtonsBottom - 1, Theme.Color(clrBottomBg)); if (lutText[n3]) osd->DrawText(t3, yButtonsTop, lutText[n3], Theme.Color(lutFg[n3]), Theme.Color(lutBg[n3]), pFontHelpKeys, w, yButtonsBottom - yButtonsTop, taCenter); else { osd->DrawRectangle(t3, yButtonsTop, xButtonsRight, yButtonsBottom, Theme.Color(clrBottomBg)); if (EnigmaConfig.drawRoundCorners) { osd->DrawEllipse(xButtonsRight - Roundness, yButtonsBottom - Roundness, xButtonsRight - 1, yButtonsBottom - 1, clrTransparent, -4); } } if (fLockNeeded && !fLocked) TE_UNLOCK; } void cSkinEnigmaDisplayMenu::SetMessage(eMessageType Type, const char *Text) { if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } // check if message if (Text) { EnigmaTextEffects.PauseEffects(yMessageTop); // save osd region if (nMessagesShown == 0) osd->SaveRegion(xMessageLeft, yMessageTop, xMessageRight - 1, yMessageBottom - 1); // draw message if (EnigmaConfig.statusLineMode == 1) { //on help buttons osd->DrawRectangle(xMessageLeft, yMessageTop, xMessageRight - 1, yMessageBottom - 1, Theme.Color(clrButtonRedBg)); osd->DrawText(xMessageLeft, yMessageTop + SmallGap, Text, Theme.Color(clrMessageStatusFg + 2 * Type), Theme.Color(clrMessageStatusBg + 2 * Type), pFontMessage, xMessageRight - xMessageLeft, yMessageBottom - SmallGap - yMessageTop - SmallGap, taCenter); } else { osd->DrawRectangle(xMessageLeft, yMessageTop, xMessageRight - 1, yMessageBottom - 1, clrTransparent); osd->DrawRectangle(xMessageLeft, yMessageTop + SmallGap, xMessageRight - 1, yMessageBottom - 1, Theme.Color(clrButtonRedBg)); osd->DrawText(xMessageLeft, yMessageTop + 2 * SmallGap, Text, Theme.Color(clrMessageStatusFg + 2 * Type), Theme.Color(clrMessageStatusBg + 2 * Type), pFontMessage, xMessageRight - xMessageLeft, yMessageBottom - SmallGap - yMessageTop - 2 * SmallGap, taCenter); } nMessagesShown++; } else { if (nMessagesShown > 0) nMessagesShown--; // restore saved osd region if (nMessagesShown == 0) osd->RestoreRegion(); EnigmaTextEffects.PauseEffects(); } if (fLockNeeded && !fLocked) TE_UNLOCK; } bool cSkinEnigmaDisplayMenu::HasTabbedText(const char *s, int NumOfTabs) { if (!s) return false; const char *b = strchrnul(s, '\t'); while (*b && NumOfTabs-- > 0) { b = strchrnul(b + 1, '\t'); } if (!*b) return (NumOfTabs <= 0) ? true : false; return true; } void cSkinEnigmaDisplayMenu::SetItem(const char *Text, int Index, bool isCurrent, bool Selectable) { debug("cSkinEnigmaDisplayMenu::SetItem(%s, %d, %d, %d)", Text, Index, isCurrent, Selectable); int y = yItemTop + Index * lineHeight; if (nMessagesShown > 0 && y >= yMessageTop) return; //Don't draw above messages if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } tColor ColorFg, ColorBg; // select colors if (isCurrent) { if ((Index == nOldIndex) && strLastText && Text && !strcmp(strLastText, Text) ) { return; } free(strLastText); strLastText = strdup(Text); nOldIndex = Index; ColorFg = Theme.Color(clrMenuItemSelectableFg); ColorBg = Theme.Color(clrAltBackground); } else { if (Selectable) { ColorFg = Theme.Color(clrMenuItemSelectableFg); ColorBg = Theme.Color(clrBackground); } else { ColorFg = Theme.Color(clrMenuItemNotSelectableFg); ColorBg = Theme.Color(clrBackground); } if (nOldIndex == Index) { for (int i = MaxTabs - 1; i >= 0; i--) { if (idListItem[i] >= 0) { EnigmaTextEffects.ResetText(idListItem[i], ColorFg, ColorBg); idListItem[i] = -1; } } free(strLastText); strLastText = NULL; nOldIndex = -1; } } if (!Selectable && EnigmaConfig.showListSymbols && (strncmp(Text, "---", 3) == 0)) { // headline? const char *c = Text + 3; while (*c == '-') c++; if (*c == ' ' || *c == '\t') { // it's a headline while (*c == ' ' || *c == '\t') // find start of headline text c++; // find end of headline text char *c2 = (char*)(c + strlen(c) - 1); while (*c2 == '-') c2--; while (*c2 == ' ' || *c2 == '\t') c2--; *(c2 + 1) = 0; int xt = xItemLeft + Tab(0); int w = Gap + pFontList->Width(c) + Gap; int x = std::max(0, (xItemRight - xt - w) / 2); int y2 = y + lineHeight; if (nMessagesShown && yMessageTop > y2) y2 = yMessageTop; int yBar = y + (y2 - y - SmallGap) / 2; osd->DrawRectangle(xt, yBar, x - 1, yBar + SmallGap - 1, ColorFg); osd->DrawText(x, y, c, ColorFg, ColorBg, pFontList, w, y2 - y, taCenter); osd->DrawRectangle(x + w, yBar, xItemRight - 1, yBar + SmallGap - 1, ColorFg); return; // headline displayed -> done } } // this should prevent menu flickering osd->DrawPixel(xItemLeft, y, ColorBg); osd->DrawPixel(xItemRight - 2, y, ColorBg); osd->DrawPixel(xItemLeft, y, ColorFg); osd->DrawPixel(xItemRight - 2, y, ColorFg); osd->DrawRectangle(xBodyLeft, y, xItemLeft - 1, y + lineHeight - 1, ColorBg); if (EnigmaConfig.showMarker) { osd->DrawEllipse(xBodyLeft + nMarkerGap, y + nMarkerGap, xBodyLeft + lineHeight - nMarkerGap, y + lineHeight - nMarkerGap, isCurrent ? ColorFg : ColorBg); } if (EnigmaConfig.showScrollbar == 0 || (!fScrollbarShown && EnigmaConfig.showScrollbar == 2)) osd->DrawRectangle(xItemRight, y, (fShowLogo || fShowInfo ? xBodyRight : xInfoRight) - 1, y + lineHeight - 1, ColorBg); // draw item for (int i = 0; i < MaxTabs; i++) { const char *s = GetTabbedText(Text, i); if (s) { char buffer[9]; int xt = xItemLeft + Tab(i); bool iseventinfo = false; bool isnewrecording = false; bool isprogressbar = false; int now = 0, total = 0; // check if event info symbol: "tTV*" "R" if (EnigmaConfig.showListSymbols && Selectable) { // check if event info characters if (strlen(s) == 3 && strchr(" tTR", s[0]) && strchr(" V", s[1]) && strchr(" *", s[2])) { // update status iseventinfo = true; } // check if new recording: "01.01.06*", "10:10*" if ((!iseventinfo && (strlen(s) == 6 && s[5] == '*' && s[2] == ':' && isdigit(*s) && isdigit(*(s + 1)) && isdigit(*(s + 3)) && isdigit(*(s + 4)))) || (strlen(s) == 9 && s[8] == '*' && s[5] == '.' && s[2] == '.' && isdigit(*s) && isdigit(*(s + 1)) && isdigit(*(s + 3)) && isdigit(*(s + 4)) && isdigit(*(s + 6)) && isdigit(*(s + 7)))) { // update status isnewrecording = true; // make a copy strncpy(buffer, s, strlen(s)); // remove the '*' character buffer[strlen(s) - 1] = '\0'; } } // check if progress bar: "[||||||| ]" if (!iseventinfo && !isnewrecording && EnigmaConfig.showProgressbar && (strlen(s) > 5 && s[0] == '[' && s[strlen(s) - 1] == ']')) { const char *p = s + 1; // update status isprogressbar = true; for (; *p != ']'; ++p) { // check if progressbar characters if (*p == ' ' || *p == '|') { // update counters ++total; if (*p == '|') ++now; } else { // wrong character detected; not a progressbar isprogressbar = false; break; } } } if (iseventinfo) { int evx = xt + Gap; const char *p = s; // draw background osd->DrawRectangle(xt, y, xItemRight, y + lineHeight - 1, ColorBg); // draw symbols for (; *p; ++p) { switch (*p) { case 't': // partial timer event osd->DrawBitmap(evx, y + (lineHeight - bmEventPartTimer.Height()) / 2, bmEventPartTimer, ColorFg, ColorBg); evx += bmEventPartTimer.Width(); break; case 'T': // timer event osd->DrawBitmap(evx, y + (lineHeight - bmEventTimer.Height()) / 2, bmEventTimer, ColorFg, ColorBg); evx += bmEventTimer.Width(); break; case 'R': // recording event (epgsearch) osd->DrawBitmap(evx, y + (lineHeight - bmEventRecording.Height()) / 2, bmEventRecording, ColorFg, ColorBg); evx += bmEventRecording.Width(); break; case 'V': // vps event osd->DrawBitmap(evx, y + (lineHeight - bmEventVPS.Height()) / 2, bmEventVPS, ColorFg, ColorBg); evx += bmEventVPS.Width(); break; case '*': // running event osd->DrawBitmap(evx, y + (lineHeight - bmEventRunning.Height()) / 2, bmEventRunning, ColorFg, ColorBg); evx += bmEventRunning.Width(); break; case ' ': default: // let's ignore space character break; } } } else if (isnewrecording) { // draw text osd->DrawText(xt, y, buffer, ColorFg, ColorBg, pFontList, xItemRight - xt); // draw symbol osd->DrawBitmap(xt + pFontList->Width(buffer), y + (lineHeight - bmRecordingNew.Height()) / 2, bmRecordingNew, ColorFg, ColorBg); } else if (isprogressbar) { // define x coordinates of progressbar int px0 = xt; int px1 = (Selectable ? (Tab(i + 1) ? Tab(i + 1) : xItemRight) : xItemRight) - 1; int px = px0 + std::max((int)((float) now * (float) (px1 - px0) / (float) total), ListProgressBarBorder); // define y coordinates of progressbar int py0 = y + ListProgressBarGap; int py1 = y + lineHeight - ListProgressBarGap; // draw background osd->DrawRectangle(px0, y, /*TODO? px1 */ xItemRight - 1, y + lineHeight - 1, ColorBg); // draw progressbar osd->DrawRectangle(px0, py0, px, py1, ColorFg); osd->DrawRectangle(px + 1, py0, px1, py0 + ListProgressBarBorder, ColorFg); osd->DrawRectangle(px + 1, py1 - ListProgressBarBorder, px1, py1, ColorFg); osd->DrawRectangle(px1 - ListProgressBarBorder, py0, px1, py1, ColorFg); } else { int w = (Tab(i + 1) && HasTabbedText(Text, i + 1) ? (xItemLeft + Tab(i + 1)) : xItemRight) - xt; // draw text if (isCurrent) { idListItem[i] = TE_MARQUEE(osd, idListItem[i], fScrollListItem, xt, y, s, ColorFg, ColorBg, pFontList, nBPP, w, nMessagesShown ? std::min(yMessageTop - y, lineHeight) : 0 ); } else osd->DrawText(xt, y, s, ColorFg, ColorBg, pFontList, w, nMessagesShown ? std::min(yMessageTop - y, lineHeight) : 0 ); } } if (!Tab(i + 1)) break; } //set editable width SetEditableWidth(xItemRight - Tab(1) - xItemLeft); #ifndef SKINENIGMA_NO_MENULOGO if (isCurrent && isMainMenu && fShowLogo && Text) { char *ItemText, *ItemText2; int n = strtoul(Text, &ItemText, 10); if (n != 0) ItemText2 = ItemText = skipspace(ItemText); else ItemText2 = skipspace(ItemText); bool fFoundLogo = false; if (strcmp(ItemText, trVDR("Schedule")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/schedule"); else if (strcmp(ItemText, trVDR("Channels")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/channels"); else if (strcmp(ItemText, trVDR("Timers")) == 0 || strcmp(ItemText2, GetPluginMainMenuName("timerinfo")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/timers"); else if (strcmp(ItemText, trVDR("Recordings")) == 0 || strcmp(ItemText, trVDR("Recording info")) == 0 || strcmp(ItemText2, GetPluginMainMenuName("extrecmenu")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/recordings"); else if (strcmp(ItemText, trVDR("Setup")) == 0 || strcmp(ItemText2, trVDR("Setup")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/setup"); else if (strcmp(ItemText, trVDR("Commands")) == 0 || strcmp(ItemText2, trVDR("Commands")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/commands"); else if (strcmp(ItemText, trVDR(" Stop replaying")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/stop"); else if (strcmp(ItemText, trVDR(" Cancel editing")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/cancel"); else if (strcmp(ItemText2, GetPluginMainMenuName("audiorecorder")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/audiorecorder"); else if (strcmp(ItemText2, GetPluginMainMenuName("burn")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/burn"); else if (strcmp(ItemText2, GetPluginMainMenuName("cdda")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/cdda"); else if (strcmp(ItemText2, GetPluginMainMenuName("chanorg")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/chanorg"); else if (strcmp(ItemText2, GetPluginMainMenuName("channelscan")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/channelscan"); else if (strcmp(ItemText2, GetPluginMainMenuName("digicam")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/digicam"); else if (strcmp(ItemText2, GetPluginMainMenuName("director")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/director"); else if (strcmp(ItemText2, GetPluginMainMenuName("dvd")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/dvd"); else if (strcmp(ItemText2, GetPluginMainMenuName("dvdselect")) == 0 || strcmp(ItemText2, GetPluginMainMenuName("dvdswitch")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/dvdselect"); else if (strcmp(ItemText2, GetPluginMainMenuName("dxr3")) == 0 || strcmp(ItemText2, GetPluginMainMenuName("softdevice")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/device"); else if (strcmp(ItemText2, GetPluginMainMenuName("epgsearch")) == 0 || strcmp(ItemText2, GetPluginMainMenuName("epgsearchonly")) == 0 || strcmp(ItemText2, GetPluginMainMenuName("conflictcheckonly")) == 0 || strcmp(ItemText2, GetPluginMainMenuName("nordlichtsepg")) == 0 || strcmp(ItemText2, GetPluginMainMenuName("quickepgsearch")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/epgsearch"); else if (strcmp(ItemText2, GetPluginMainMenuName("externalplayer")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/externalplayer"); else if (strcmp(ItemText2, GetPluginMainMenuName("femon")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/femon"); else if (strcmp(ItemText2, GetPluginMainMenuName("filebrowser")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/filebrowser"); else if (strcmp(ItemText2, GetPluginMainMenuName("fussball")) == 0 || strcmp(ItemText2, GetPluginMainMenuName("sport")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/fussball"); else if (strcmp(ItemText2, GetPluginMainMenuName("games")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/games"); else if (strcmp(ItemText2, GetPluginMainMenuName("image")) == 0 || strcmp(ItemText2, GetPluginMainMenuName("osdimage")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/image"); else if (strcmp(ItemText2, GetPluginMainMenuName("mp3")) == 0 || strcmp(ItemText2, GetPluginMainMenuName("mp3ng")) == 0 || strcmp(ItemText2, GetPluginMainMenuName("muggle")) == 0 || strcmp(ItemText2, GetPluginMainMenuName("music")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/mp3"); else if (strcmp(ItemText2, GetPluginMainMenuName("mplayer")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/mplayer"); else if (strcmp(ItemText2, GetPluginMainMenuName("newsticker")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/newsticker"); else if (strcmp(ItemText2, GetPluginMainMenuName("osdpip")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/osdpip"); else if (strcmp(ItemText2, GetPluginMainMenuName("pin")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/pin"); else if (strcmp(ItemText2, GetPluginMainMenuName("radio")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/radio"); else if (strcmp(ItemText2, GetPluginMainMenuName("rotor")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/rotor"); else if (strcmp(ItemText2, GetPluginMainMenuName("solitaire")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/solitaire"); else if (strcmp(ItemText2, GetPluginMainMenuName("streamdev-client")) == 0 || strcmp(ItemText2, GetPluginMainMenuName("streamdev-server")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/streamdev"); else if (strcmp(ItemText2, GetPluginMainMenuName("sudoku")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/sudoku"); else if (strcmp(ItemText2, GetPluginMainMenuName("teletext")) == 0 || strcmp(ItemText2, GetPluginMainMenuName("osdteletext")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/teletext"); else if (strcmp(ItemText2, GetPluginMainMenuName("tvonscreen")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/tvonscreen"); else if (strcmp(ItemText2, GetPluginMainMenuName("vcd")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/vcd"); else if (strcmp(ItemText2, GetPluginMainMenuName("vdrc")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/vdrc"); else if (strcmp(ItemText2, GetPluginMainMenuName("vdrcd")) == 0 || strcmp(ItemText2, GetPluginMainMenuName("mediad")) == 0 || strcmp(ItemText2, GetPluginMainMenuName("mediamanager")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/vdrcd"); else if (strcmp(ItemText2, GetPluginMainMenuName("vdrrip")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/vdrrip"); else if (strcmp(ItemText2, GetPluginMainMenuName("weather")) == 0 || strcmp(ItemText2, GetPluginMainMenuName("weatherng")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/weather"); else if (strcmp(ItemText2, GetPluginMainMenuName("webepg")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/webepg"); else if (strcmp(ItemText2, GetPluginMainMenuName("xineliboutput")) == 0) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/xineliboutput"); else fFoundLogo = EnigmaLogoCache.LoadIcon("icons/menu/vdr"); osd->DrawRectangle(xLogoLeft, yLogoTop, xLogoRight - 1, yLogoTop - 1, Theme.Color(clrLogoBg)); if (fFoundLogo) { osd->DrawBitmap(xLogoLeft + (xLogoRight - xLogoLeft - EnigmaLogoCache.Get().Width()) / 2, yLogoTop + (yLogoBottom - yLogoTop - EnigmaLogoCache.Get().Height()) / 2, EnigmaLogoCache.Get(), EnigmaLogoCache.Get().Color(1), Theme.Color(clrLogoBg), false, true); } } #endif if (fLockNeeded && !fLocked) TE_UNLOCK; } const char *cSkinEnigmaDisplayMenu::GetPluginMainMenuName(const char *plugin) { cPlugin *p = cPluginManager::GetPlugin(plugin); if (p) { const char *entry = p->MainMenuEntry(); if (entry) return entry; } return plugin; } int cSkinEnigmaDisplayMenu::DrawFlag(int x, int y, const tComponent *p) { //Must be TE_LOCKed by caller if (p == NULL) return 0; if ((p->stream == 2) && p->language) { std::string flag("flags/"); flag += p->language; /*TODO if (p->description) { } */ if (EnigmaLogoCache.LoadSymbol(flag.c_str())) { osd->DrawBitmap(x, y - EnigmaLogoCache.Get().Height(), EnigmaLogoCache.Get()); return EnigmaLogoCache.Get().Width(); } } return 0; } void cSkinEnigmaDisplayMenu::SetEvent(const cEvent *Event) { // check if event if (!Event) return; if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } isMainMenu = false; fShowInfo = false; fShowLogo = fShowLogoDefault ? EnigmaConfig.showImages : false; SetupAreas(); time_t now = time(NULL); // draw recording date string std::stringstream sstrDate; sstrDate << *Event->GetDateString() << " " << *Event->GetTimeString() << " - " << *Event->GetEndTimeString() << " ("; if (now > Event->StartTime()) sstrDate << (now - Event->StartTime()) / 60 << '/'; sstrDate << Event->Duration() / 60 << tr("min") << ")"; int y = yDateBottom + (pFontDetailsDate->Height() - bmVPS.Height()) / 2; int xs = xDateRight - Gap; // check if event has VPS if (EnigmaConfig.showVps && Event->Vps()) { // draw VPS symbol if (Event->Vps() != Event->StartTime()) { char vps[6]; struct tm tm_r; time_t t_vps = Event->Vps(); strftime(vps, sizeof(vps), "%H:%M", localtime_r(&t_vps, &tm_r)); xs -= pFontDetailsDate->Width(vps); osd->DrawText(xs, yDateBottom, vps, Theme.Color(clrMenuTxtFg), Theme.Color(clrBackground), pFontDetailsDate, pFontDetailsDate->Width(vps), pFontDetailsDate->Height()); xs -= TinyGap; } xs -= bmVPS.Width(); osd->DrawBitmap(xs, y, bmVPS, EnigmaConfig.showColSymbolsDetails ? Theme.Color(clrSymbolVpsActive) : Theme.Color(clrMenuTxtFg), EnigmaConfig.showColSymbolsDetails ? Theme.Color(clrSymbolInactive) : Theme.Color(clrBackground)); xs -= Gap; } // check if event is running if (Event->IsRunning()) { // draw running symbol xs -= (bmRun.Width() + Gap); osd->DrawBitmap(xs, y, bmRun, EnigmaConfig.showColSymbolsDetails ? Theme.Color(clrSymbolRunActive) : Theme.Color(clrMenuTxtFg), Theme.Color(clrBackground)); xs -= Gap; } // check if event has timer if (Event->HasTimer()) { if (Event->IsRunning()) { // draw recording symbol xs -= bmRecording.Width(); osd->DrawBitmap(xs, y, bmRecording, EnigmaConfig.showColSymbolsDetails ? Theme.Color(clrSymbolRecActive) : Theme.Color(clrMenuTxtFg), Theme.Color(clrBackground)); } else { // draw timer symbol xs -= bmTimer.Width(); osd->DrawBitmap(xs, y, bmTimer, EnigmaConfig.showColSymbolsDetails ? Theme.Color(clrSymbolTimerActive) : Theme.Color(clrMenuTxtFg), Theme.Color(clrBackground)); } xs -= Gap; } std::stringstream sstrInfo; #if VDRVERSNUM >= 10711 bool fFirst = true; for (int i = 0; Event->Contents(i); i++) { const char *s = Event->ContentToString(Event->Contents(i)); if (!isempty(s)) { if (fFirst) { fFirst = false; sstrInfo << tr("Content: "); } else { sstrInfo << ", "; } sstrInfo << s; } } if (!fFirst) sstrInfo << std::endl; if (Event->ParentalRating()) { sstrInfo << *Event->GetParentalRatingString() << std::endl; } #endif const cComponents *Components = Event->Components(); if (Components) { //TODO: show flaggs? std::stringstream infoVideo, infoAudio, infoSubtitle; for (int i = 0; i < Components->NumComponents(); i++) { const tComponent *p = Components->Component(i); // sstrInfo << "* " // << (int)p->stream << " " << (int)p->type << " (" << (p->language ? p->language : "n/a") << ") (" << (p->description ? p->description : "n/a") << ")\n"; if (p->stream == 1) { // video if (p->description) { infoVideo << p->description << " (" << p->language << "), "; } else { infoVideo << p->language << ", "; } } else if ((p->stream == 2) && p->language) { // audio if (p->description) { infoAudio << p->description << " (" << p->language << "), "; } else { infoAudio << p->language << ", "; } } else if ((p->stream == 3) && p->language) { // subtitle if (p->description) { infoSubtitle << p->description << " (" << p->language << "), "; // } else { //TODO: no description = no subtitle? // infoSubtitle << p->language << ", "; } } } if (!infoVideo.str().empty()) { sstrInfo << std::endl << tr("Video") << ": " << infoVideo.str().substr(0, infoVideo.str().length() - 2); // strip out the last delimiter } if (!infoAudio.str().empty()) { sstrInfo << std::endl << tr("Audio") << ": " << infoAudio.str().substr(0, infoAudio.str().length() - 2); // strip out the last delimiter } if (!infoSubtitle.str().empty()) { sstrInfo << std::endl << tr("Subtitles") << ": " << infoSubtitle.str().substr(0, infoSubtitle.str().length() - 2); // strip out the last delimiter } } std::string stringInfo = sstrInfo.str(); int yHeadlineBottom = yDateBottom; int xHeadlineRight = fShowLogo ? xDateLeft : xInfoRight; osd->DrawRectangle(xBodyLeft, yBodyTop, xHeadlineRight - 1, yHeadlineBottom - 1, Theme.Color(clrAltBackground)); int th = pFontDetailsTitle->Height() + (!isempty(Event->Description()) && !isempty(Event->ShortText()) ? Gap + pFontDetailsSubtitle->Height() : 0); y = yBodyTop + (yHeadlineBottom - yBodyTop - th) / 2; // draw recording title TE_MARQUEE(osd, -1, fScrollOther, xBodyLeft + Gap, y, Event->Title(), Theme.Color(clrMenuTxtFg), Theme.Color(clrAltBackground), pFontDetailsTitle, nBPP, xHeadlineRight - xBodyLeft - Gap - 1, pFontDetailsTitle->Height()); osd->DrawText(xBodyLeft + Gap, yHeadlineBottom, sstrDate.str().c_str(), Theme.Color(clrMenuTxtFg), Theme.Color(clrBackground), pFontDetailsDate, xs - xBodyLeft - Gap - 1, pFontDetailsDate->Height()); // draw recording short text and description const char *strDescr = NULL; if (isempty(Event->Description())) { // check if short text if (!isempty(Event->ShortText())) { // draw short text as description, if no description available strDescr = Event->ShortText(); } } else { // check if short text if (!isempty(Event->ShortText())) { // draw below Event->Title y += pFontDetailsTitle->Height() + Gap; // draw short text TE_MARQUEE(osd, -1, fScrollOther, xBodyLeft + Gap, y, Event->ShortText(), Theme.Color(clrMenuItemNotSelectableFg), Theme.Color(clrAltBackground), pFontDetailsSubtitle, nBPP, xHeadlineRight - xBodyLeft - Gap - 1, pFontDetailsSubtitle->Height()); } // draw description strDescr = Event->Description(); } std::string stringReruns; #ifdef USE_PLUGIN_EPGSEARCH cPlugin *epgSearchPlugin = cPluginManager::GetPlugin("epgsearch"); // try to find a rerun of the show using epgsearch-service if (epgSearchPlugin && EnigmaConfig.numReruns > 0 && !isempty(Event->Title())) { std::stringstream sstrReruns; Epgsearch_searchresults_v1_0 data; std::string strQuery = Event->Title(); if (EnigmaConfig.useSubtitleRerun > 0) { if (EnigmaConfig.useSubtitleRerun == 2 || !isempty(Event->ShortText())) strQuery += "~"; if (!isempty(Event->ShortText())) strQuery += Event->ShortText(); data.useSubTitle = true; } else { data.useSubTitle = false; } data.query = (char *)strQuery.c_str(); data.mode = 0; data.channelNr = 0; data.useTitle = true; data.useDescription = false; if (epgSearchPlugin->Service("Epgsearch-searchresults-v1.0", &data)) { cList* list = data.pResultList; if (list && (list->Count() > 1)) { //TODO: current event is shown as rerun sstrReruns << tr("RERUNS OF THIS SHOW") << ':' << std::endl; int i = 0; for (Epgsearch_searchresults_v1_0::cServiceSearchResult *r = list->First(); r && i < EnigmaConfig.numReruns; r = list->Next(r)) { i++; sstrReruns << "- " << *DayDateTime(r->event->StartTime()); #if VDRVERSNUM >= 20301 LOCK_CHANNELS_READ const cChannel *channel = Channels->GetByChannelID(r->event->ChannelID(), true, true); #else cChannel *channel = Channels.GetByChannelID(r->event->ChannelID(), true, true); #endif if (channel) sstrReruns << " " << channel->ShortName(true); sstrReruns << ": " << r->event->Title(); if (!isempty(r->event->ShortText())) sstrReruns << "~" << r->event->ShortText(); sstrReruns << std::endl; } delete list; } } stringReruns = sstrReruns.str(); } #endif // USE_PLUGIN_EPGSEARCH const char *strFirst = NULL; const char *strSecond = NULL; const char *strThird = stringReruns.empty() ? NULL : stringReruns.c_str(); if (EnigmaConfig.showAuxInfo) { strFirst = strDescr; strSecond = stringInfo.empty() ? NULL : stringInfo.c_str(); } else { strFirst = stringInfo.empty() ? NULL : stringInfo.c_str(); strSecond = strDescr; } if (strFirst || strSecond || strThird) { y = yHeadlineBottom + SmallGap + 2 * pFontDetailsDate->Height(); char *mytext = NULL; if (-1 != asprintf(&mytext, "%s%s%s%s%s", strFirst ? strFirst : "", strSecond ? "\n\n" : "", strSecond ? strSecond : "", (strFirst || strSecond) && strThird ? "\n\n" : "", strThird ? strThird : "")) { textScroller.Set(osd, xBodyLeft + Gap, y + Gap, xInfoRight - ListHBorder - SmallGap - SmallGap - SmallGap - ScrollbarWidth + SmallGap - xBodyLeft, yBodyBottom - Gap - y - Gap, mytext, pFontDetailsText, Theme.Color(clrMenuTxtFg), Theme.Color(clrBackground)); SetTextScrollbar(); free(mytext); } } #ifndef SKINENIGMA_NO_MENULOGO if (fShowLogo) { // draw logo osd->DrawRectangle(xDateLeft + SmallGap, yDateTop, xDateRight - 1, yDateBottom - SmallGap - 1, Theme.Color(clrLogoBg)); if (!(EnigmaConfig.showImages && EnigmaLogoCache.DrawEventImage(Event, xLogoLeft, yLogoTop, xLogoRight - xLogoLeft, yLogoBottom - yLogoTop, nNumImageColors, osd))) { if (EnigmaLogoCache.LoadIcon("icons/menu/schedule")) osd->DrawBitmap(xLogoLeft + (xLogoRight - xLogoLeft - EnigmaLogoCache.Get().Width()) / 2, yLogoTop + (yLogoBottom - yLogoTop - EnigmaLogoCache.Get().Height()) / 2, EnigmaLogoCache.Get(), EnigmaLogoCache.Get().Color(1), Theme.Color(clrLogoBg)); } // draw borders osd->DrawRectangle(xDateLeft, yDateTop, xDateLeft + SmallGap - 1, yDateBottom - 1, clrTransparent); osd->DrawRectangle(xDateLeft, yLogoBottom - SmallGap, xDateRight, yLogoBottom - 1, clrTransparent); } #endif if (fLockNeeded && !fLocked) TE_UNLOCK; } int cSkinEnigmaDisplayMenu::ReadSizeVdr(const char *strPath) { int dirSize = -1; char buffer[20]; char *strFilename = NULL; if (-1 != asprintf(&strFilename, "%s/size.vdr", strPath)) { struct stat st; if (stat(strFilename, &st) == 0) { int fd = open(strFilename, O_RDONLY); if (fd >= 0) { if (safe_read(fd, &buffer, sizeof(buffer)) >= 0) { dirSize = atoi(buffer); } close(fd); } } free(strFilename); } return dirSize; } void cSkinEnigmaDisplayMenu::SetRecording(const cRecording *Recording) { // check if recording if (!Recording) return; const cRecordingInfo *Info = Recording->Info(); if (Info == NULL) { //TODO: draw error message return; } if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } isMainMenu = false; fShowInfo = false; fShowLogo = fShowLogoDefault ? EnigmaConfig.showImages : false;; SetupAreas(); // draw recording date string std::stringstream sstrDate; #if VDRVERSNUM >= 10721 sstrDate << *DateString(Recording->Start()) << " " << *TimeString(Recording->Start()); #else sstrDate << *DateString(Recording->start) << " " << *TimeString(Recording->start); #endif unsigned long long nRecSize = -1; unsigned long long nFileSize[1000]; nFileSize[0] = 0; if (EnigmaConfig.showRecSize == 2) { int i = 0; struct stat filebuf; cString filename; int rc = 0; do { #if VDRVERSNUM >= 10703 if (Recording->IsPesRecording()) filename = cString::sprintf("%s/%03d.vdr", Recording->FileName(), ++i); else filename = cString::sprintf("%s/%05d.ts", Recording->FileName(), ++i); #else filename = cString::sprintf("%s/%03d.vdr", Recording->FileName(), ++i); #endif rc = stat(filename, &filebuf); if (rc == 0) nFileSize[i] = nFileSize[i-1] + filebuf.st_size; else if (ENOENT != errno) { error("error determining file size of \"%s\" %d (%s)", (const char *)filename, errno, strerror(errno)); nRecSize = -1; } } while (i <= 999 && !rc); nRecSize = nFileSize[i-1]; } cMarks marks; #if VDRVERSNUM >= 10703 bool fHasMarks = marks.Load(Recording->FileName(), Recording->FramesPerSecond(), Recording->IsPesRecording()) && marks.Count(); cIndexFile *index = new cIndexFile(Recording->FileName(), false, Recording->IsPesRecording()); #else bool fHasMarks = marks.Load(Recording->FileName()) && marks.Count(); cIndexFile *index = new cIndexFile(Recording->FileName(), false); #endif int nCutLength = 0; long nCutInFrame = 0; unsigned long long nRecSizeCut = nRecSize < 0 ? -1 : 0; unsigned long long nCutInOffset = 0; if (fHasMarks && index) { #if VDRVERSNUM >= 10703 uint16_t FileNumber; off_t FileOffset; #else uchar FileNumber; int FileOffset; #endif bool fCutIn = true; cMark *mark = marks.First(); while (mark) { #if VDRVERSNUM >= 10721 int pos = mark->Position(); #else int pos = mark->position; #endif index->Get(pos, &FileNumber, &FileOffset); //TODO: will disc spin up? if (fCutIn) { nCutInFrame = pos; fCutIn = false; if (nRecSize >= 0) nCutInOffset = nFileSize[FileNumber-1] + FileOffset; } else { nCutLength += pos - nCutInFrame; fCutIn = true; if (nRecSize >= 0) nRecSizeCut += nFileSize[FileNumber-1] + FileOffset - nCutInOffset; } cMark *nextmark = marks.Next(mark); mark = nextmark; } if (!fCutIn) { nCutLength += index->Last() - nCutInFrame; index->Get(index->Last() - 1, &FileNumber, &FileOffset); if (nRecSize >= 0) nRecSizeCut += nFileSize[FileNumber-1] + FileOffset - nCutInOffset; } } // draw additional information std::stringstream sstrInfo; #if VDRVERSNUM >= 10711 bool fFirst = true; for (int i = 0; Info->GetEvent()->Contents(i); i++) { const char *s = Info->GetEvent()->ContentToString(Info->GetEvent()->Contents(i)); if (!isempty(s)) { if (fFirst) { fFirst = false; sstrInfo << tr("Content: "); } else { sstrInfo << ", "; } sstrInfo << s; } } if (!fFirst) sstrInfo << std::endl; if (Info->GetEvent()->ParentalRating()) { sstrInfo << *Info->GetEvent()->GetParentalRatingString() << std::endl; } #endif #if VDRVERSNUM >= 20301 LOCK_CHANNELS_READ const cChannel *channel = Channels->GetByChannelID(Info->ChannelID()); #else cChannel *channel = Channels.GetByChannelID(Info->ChannelID()); #endif if (channel) sstrInfo << trVDR("Channel") << ": " << channel->Number() << " - " << channel->Name() << std::endl; if (EnigmaConfig.showRecSize > 0) { if (nRecSize < 0) { if ((nRecSize = ReadSizeVdr(Recording->FileName())) < 0 && EnigmaConfig.showRecSize == 2) { nRecSize = DirSizeMB(Recording->FileName()); } } if (nRecSize >= 0) { cString strRecSize = ""; if (fHasMarks) { if (nRecSize > MEGABYTE(1023)) strRecSize = cString::sprintf("%s: %.2f GB (%s: %.2f GB)", tr("Size"), (float)nRecSize / MEGABYTE(1024), tr("cut"), (float)nRecSizeCut / MEGABYTE(1024)); else strRecSize = cString::sprintf("%s: %lld MB (%s: %lld MB)", tr("Size"), nRecSize / MEGABYTE(1), tr("cut"), nRecSizeCut / MEGABYTE(1)); } else { if (nRecSize > MEGABYTE(1023)) strRecSize = cString::sprintf("%s: %.2f GB", tr("Size"), (float)nRecSize / MEGABYTE(1024)); else strRecSize = cString::sprintf("%s: %lld MB", tr("Size"), nRecSize / MEGABYTE(1)); } sstrInfo << (const char*)strRecSize << std::endl; } } if (index) { int nLastIndex = index->Last(); if (nLastIndex) { cString strLength; if (fHasMarks) { #if VDRVERSNUM >= 10703 strLength = cString::sprintf("%s: %s (%s %s)", tr("Length"), *IndexToHMSF(nLastIndex, false, Recording->FramesPerSecond()), tr("cut"), *IndexToHMSF(nCutLength, false, Recording->FramesPerSecond())); #else strLength = cString::sprintf("%s: %s (%s %s)", tr("Length"), *IndexToHMSF(nLastIndex), tr("cut"), *IndexToHMSF(nCutLength)); #endif } else { #if VDRVERSNUM >= 10703 strLength = cString::sprintf("%s: %s", tr("Length"), *IndexToHMSF(nLastIndex, false, Recording->FramesPerSecond())); #else strLength = cString::sprintf("%s: %s", tr("Length"), *IndexToHMSF(nLastIndex)); #endif } sstrInfo << (const char*)strLength << std::endl; #if VDRVERSNUM >= 10703 cString strBitrate = cString::sprintf("%s: %s\n%s: %.2f MBit/s (Video+Audio)", tr("Format"), Recording->IsPesRecording() ? "PES" : "TS", tr("Est. bitrate"), (float)nRecSize / nLastIndex * Recording->FramesPerSecond() * 8 / MEGABYTE(1)); #else cString strBitrate = cString::sprintf("%s: %.2f MBit/s (Video+Audio)", tr("Est. bitrate"), (float)nRecSize / nLastIndex * FRAMESPERSEC * 8 / MEGABYTE(1)); #endif sstrInfo << (const char*)strBitrate << std::endl; } } delete index; #if VDRVERSNUM >= 10721 sstrInfo << trVDR("Priority") << ": " << Recording->Priority() << std::endl << trVDR("Lifetime") << ": " << Recording->Lifetime() << std::endl; #else sstrInfo << trVDR("Priority") << ": " << Recording->priority << std::endl << trVDR("Lifetime") << ": " << Recording->lifetime << std::endl; #endif if (Info->Aux()) { sstrInfo << std::endl << tr("Auxiliary information") << ":\n" << parseaux(Info->Aux()); } int xs = xDateRight - Gap; const cComponents *Components = Info->Components(); if (Components) { //TODO: show flaggs? std::stringstream infoVideo, infoAudio, infoSubtitle; for (int i = 0; i < Components->NumComponents(); i++) { const tComponent *p = Components->Component(i); // sstrInfo << "* " // << (int)p->stream << " " << (int)p->type << " (" << (p->language ? p->language : "n/a") << ") (" << (p->description ? p->description : "n/a") << ")\n"; if (p->stream == 1 && p->language) { // video if (p->description) { infoVideo << p->description << " (" << p->language << "), "; } else { infoVideo << p->language << ", "; } } else if ((p->stream == 2) && p->language) { // audio if (p->description) { infoAudio << p->description << " (" << p->language << "), "; } else { infoAudio << p->language << ", "; } } else if ((p->stream == 3) && p->language) { // subtitle if (p->description) { infoSubtitle << p->description << " (" << p->language << "), "; // } else { //TODO: no description = no subtitle? // infoSubtitle << p->language << ", "; } } } if (!infoVideo.str().empty()) { sstrInfo << std::endl << tr("Video") << ": " << infoVideo.str().substr(0, infoVideo.str().length() - 2); // strip out the last delimiter } if (!infoAudio.str().empty()) { sstrInfo << std::endl << tr("Audio") << ": " << infoAudio.str().substr(0, infoAudio.str().length() - 2); // strip out the last delimiter } if (!infoSubtitle.str().empty()) { sstrInfo << std::endl << tr("Subtitles") << ": " << infoSubtitle.str().substr(0, infoSubtitle.str().length() - 2); // strip out the last delimiter } } int yHeadlineBottom = yDateBottom; int xHeadlineRight = fShowLogo ? xDateLeft : xInfoRight; const char *Title = Info->Title(); if (isempty(Title)) Title = Recording->Name(); osd->DrawRectangle(xBodyLeft, yBodyTop, xHeadlineRight - 1, yHeadlineBottom - 1, Theme.Color(clrAltBackground)); int th = pFontDetailsTitle->Height() + (!isempty(Info->Description()) && !isempty(Info->ShortText()) ? Gap + pFontDetailsSubtitle->Height() : 0); int y = yBodyTop + (yHeadlineBottom - yBodyTop - th) / 2; // draw recording title TE_MARQUEE(osd, -1, fScrollOther, xBodyLeft + Gap, y, Title, Theme.Color(clrMenuTxtFg), Theme.Color(clrAltBackground), pFontDetailsTitle, nBPP, xHeadlineRight - xBodyLeft - Gap - 1, pFontDetailsTitle->Height()); osd->DrawText(xBodyLeft + Gap, yHeadlineBottom, sstrDate.str().c_str(), Theme.Color(clrMenuTxtFg), Theme.Color(clrBackground), pFontDetailsDate, xs - xBodyLeft - Gap - 1, pFontDetailsDate->Height()); // draw recording short text and description const char* strDescr = NULL; if (isempty(Info->Description())) { // check if short text if (!isempty(Info->ShortText())) { // draw short text as description, if no description available strDescr = Info->ShortText(); } } else { // check if short text if (!isempty(Info->ShortText())) { // draw below Title y += pFontDetailsTitle->Height() + Gap; // draw short text TE_MARQUEE(osd, -1, fScrollOther, xBodyLeft + Gap, y, Info->ShortText(), Theme.Color(clrMenuItemNotSelectableFg), Theme.Color(clrAltBackground), pFontDetailsSubtitle, nBPP, xHeadlineRight - xBodyLeft - Gap - 1, pFontDetailsSubtitle->Height()); } // draw description strDescr = Info->Description(); } std::string stringInfo = sstrInfo.str(); const char *strInfo = stringInfo.empty() ? NULL : stringInfo.c_str(); if (strDescr || strInfo) { y = yHeadlineBottom + pFontDetailsDate->Height() + BigGap; char *mytext = NULL; int rc = -1; if (EnigmaConfig.showAuxInfo) rc = asprintf(&mytext, "%s%s%s", strDescr ? strDescr : "", strInfo && strDescr ? "\n\n" : "", strInfo ? strInfo : ""); else rc = asprintf(&mytext, "%s%s%s", strInfo ? strInfo : "", strInfo && strDescr ? "\n\n" : "", strDescr ? strDescr : ""); if (-1 != rc) { textScroller.Set(osd, xBodyLeft + Gap, y + Gap, xInfoRight - ListHBorder - SmallGap - SmallGap - SmallGap - ScrollbarWidth + SmallGap - xBodyLeft, yBodyBottom - Gap - y - Gap, mytext, pFontDetailsText, Theme.Color(clrMenuTxtFg), Theme.Color(clrBackground)); SetTextScrollbar(); free(mytext); } } #ifndef SKINENIGMA_NO_MENULOGO if (fShowLogo) { osd->DrawRectangle(xDateLeft + SmallGap, yDateTop, xDateRight - 1, yDateBottom - SmallGap - 1, Theme.Color(clrLogoBg)); if (!(EnigmaConfig.showImages && EnigmaLogoCache.DrawRecordingImage(Recording, xLogoLeft, yLogoTop, xLogoRight - xLogoLeft, yLogoBottom - yLogoTop, nNumImageColors, osd))) { // draw logo if (EnigmaLogoCache.LoadIcon("icons/menu/recordings")) osd->DrawBitmap(xLogoLeft + (xLogoRight - xLogoLeft - EnigmaLogoCache.Get().Width()) / 2, yLogoTop + (yLogoBottom - yLogoTop - EnigmaLogoCache.Get().Height()) / 2, EnigmaLogoCache.Get(), EnigmaLogoCache.Get().Color(1), Theme.Color(clrLogoBg)); } // draw borders osd->DrawRectangle(xDateLeft, yDateTop, xDateLeft + SmallGap - 1, yDateBottom - 1, clrTransparent); osd->DrawRectangle(xDateLeft, yLogoBottom - SmallGap, xDateRight, yLogoBottom - 1, clrTransparent); } #endif if (fLockNeeded && !fLocked) TE_UNLOCK; } void cSkinEnigmaDisplayMenu::SetText(const char *Text, bool FixedFont) { if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } // draw text textScroller.Set(osd, xBodyLeft + Gap, yBodyTop + Gap, GetTextAreaWidth(), yBodyBottom - Gap - yBodyTop - Gap, Text, GetTextAreaFont(FixedFont), Theme.Color(clrMenuTxtFg), Theme.Color(clrBackground)); SetTextScrollbar(); if (fLockNeeded && !fLocked) TE_UNLOCK; } int cSkinEnigmaDisplayMenu::GetTextAreaWidth(void) const { // max text area width return (fShowLogo || fShowInfo ? xBodyRight : xInfoRight) - ListHBorder - SmallGap - SmallGap - SmallGap - ScrollbarWidth + SmallGap; } const cFont *cSkinEnigmaDisplayMenu::GetTextAreaFont(bool FixedFont) const { // text area font return FixedFont ? pFontFixed : pFontDetailsText; } int cSkinEnigmaDisplayMenu::getDateWidth(void) { // only called from constructor, so pFontDate should be OK int w = MIN_DATEWIDTH; struct tm tm_r; time_t t = time(NULL); tm *tm = localtime_r(&t, &tm_r); int nWeekday = tm->tm_wday; if (0 <= nWeekday && nWeekday < 7) w = std::max(w, pFontDate->Width(WeekDayNameFull(nWeekday))); char temp[32]; strftime(temp, sizeof(temp), "%d.%m.%Y", tm); w = std::max(w, pFontDate->Width(temp)); cString time = TimeString(t); w = std::max(w, pFontDate->Width(time)); return w; } void cSkinEnigmaDisplayMenu::Flush(void) { if (fLockNeeded && !fLocked) TE_LOCK; //debug("cSkinEnigmaDisplayMenu::Flush()"); #if VDRVERSNUM >= 10728 if (cVideoDiskUsage::HasChanged(lastDiskUsageState)) DrawTitle(); #endif if (fShowLogo) { time_t t = time(NULL); cString time = TimeString(t); if ((strLastDate == NULL) || strcmp(strLastDate, (const char*)time) != 0) { free(strLastDate); strLastDate = strdup((const char*)time); int x = xDateLeft + SmallGap; int w = xLogoLeft - x; int ys = yDateTop + (yDateBottom - SmallGap - yDateTop - 3 * pFontDate->Height()) / 2; char temp[32]; struct tm tm_r; tm *tm = localtime_r(&t, &tm_r); int nWeekday = tm->tm_wday; if (0 <= nWeekday && nWeekday < 7) { osd->DrawText(x, ys,WeekDayNameFull(nWeekday), Theme.Color(clrMenuTxtFg), Theme.Color(clrLogoBg), pFontDate, w, pFontDate->Height(), taCenter); } ys += pFontDate->Height(); strftime(temp, sizeof(temp), "%d.%m.%Y", tm); osd->DrawText(x, ys, temp, Theme.Color(clrMenuTxtFg), Theme.Color(clrLogoBg), pFontDate, w, pFontDate->Height(), taCenter); ys += pFontDate->Height(); osd->DrawText(x, ys, time, Theme.Color(clrMenuTxtFg), Theme.Color(clrLogoBg), pFontDate, w, pFontDate->Height(), taCenter); } } else { cString date = DayDateTime(); if ((strLastDate == NULL) || strcmp(strLastDate, (const char*)date) != 0) { free(strLastDate); strLastDate = strdup((const char*)date); osd->DrawText(xDateLeft + SmallGap, yDateTop, date, Theme.Color(clrMenuTxtFg), Theme.Color(clrLogoBg), pFontDate, xDateRight - xDateLeft - SmallGap, yTitleDecoBottom - yDateTop, taCenter); } } osd->Flush(); if (fLockNeeded) { TE_UNLOCK; if (fLocked) { fLocked = false; TE_WAKEUP; } } } // --- cSkinEnigmaDisplayReplay --------------------------------------------- class cSkinEnigmaDisplayReplay : public cSkinDisplayReplay, public cSkinEnigmaBaseOsd { private: const cFont *pFontOsdTitle; const cFont *pFontReplayTimes; const cFont *pFontDate; const cFont *pFontLanguage; const cFont *pFontMessage; int xTitleLeft, xTitleRight, yTitleTop, yTitleBottom, yTitleDecoTop, yTitleDecoBottom; int xLogoLeft, xLogoRight, xLogoDecoLeft, xLogoDecoRight, yLogoTop, yLogoBottom; int xProgressLeft, xProgressRight, yProgressTop, yProgressBottom; int xTimeLeft, xTimeRight, yTimeTop, yTimeBottom; int xBottomLeft, xBottomRight, yBottomTop, yBottomBottom; int xMessageLeft, xMessageRight, yMessageTop, yMessageBottom; int xFirstSymbol, xIndent; char *strLastDate; bool modeonly; int nJumpWidth; int nCurrentWidth; bool fShowSymbol; bool fLocked; bool fLockNeeded; bool fScrollTitle; int idTitle; int nBPP; public: cSkinEnigmaDisplayReplay(bool ModeOnly); virtual ~ cSkinEnigmaDisplayReplay(); 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); }; cSkinEnigmaDisplayReplay::cSkinEnigmaDisplayReplay(bool ModeOnly) { struct EnigmaOsdSize OsdSize; EnigmaConfig.GetOsdSize(&OsdSize); xIndent = EnigmaConfig.drawRoundCorners ? Roundness : SmallGap; pFontOsdTitle = EnigmaConfig.GetFont(FONT_OSDTITLE); pFontReplayTimes = EnigmaConfig.GetFont(FONT_REPLAYTIMES); pFontDate = EnigmaConfig.GetFont(FONT_DATE); pFontLanguage = EnigmaConfig.GetFont(FONT_CILANGUAGE); pFontMessage = EnigmaConfig.GetFont(FONT_MESSAGE); strLastDate = NULL; int MessageHeight = 2 * SmallGap + pFontMessage->Height() + 2 * SmallGap; modeonly = ModeOnly; nJumpWidth = 0; nCurrentWidth = 0; fShowSymbol = EnigmaConfig.showSymbols && EnigmaConfig.showSymbolsReplay; fScrollTitle = !modeonly && EnigmaConfig.useTextEffects && EnigmaConfig.scrollTitle; idTitle = -1; nBPP = 1; int LogoSize = Gap + IconHeight + Gap; LogoSize += (LogoSize % 2 ? 1 : 0); yTitleTop = 0; yTitleBottom = yTitleTop + pFontOsdTitle->Height(); yTitleDecoTop = yTitleBottom + TitleDecoGap; yTitleDecoBottom = yTitleDecoTop + TitleDecoHeight; xLogoLeft = 0; xLogoRight = xLogoLeft + LogoSize; xLogoDecoLeft = xLogoRight + LogoDecoGap; xLogoDecoRight = xLogoDecoLeft + LogoDecoWidth; xTitleLeft = EnigmaConfig.fullTitleWidth ? 0 : xLogoDecoRight + LogoDecoGap2; xTitleRight = OsdSize.w; yLogoTop = yTitleDecoBottom + TitleDecoGap2; yLogoBottom = yLogoTop + LogoSize; xTimeLeft = xLogoDecoRight + LogoDecoGap2; xTimeRight = xTitleRight; xTimeLeft += (xTimeRight - xTimeLeft) - ((xTimeRight - xTimeLeft) & ~0x07); yTimeTop = yLogoBottom - SmallGap - pFontReplayTimes->Height() - SmallGap; yTimeBottom = yLogoBottom; xProgressLeft = xTimeLeft; xProgressRight = xTitleRight; yProgressTop = yLogoTop; yProgressBottom = yTimeTop - SmallGap; xBottomLeft = xTitleLeft; xBottomRight = xTitleRight; yBottomTop = yLogoBottom + SmallGap; yBottomBottom = yBottomTop + std::max(pFontDate->Height(), pFontLanguage->Height()); xMessageLeft = xProgressLeft; xMessageRight = xProgressRight; yMessageTop = yLogoTop + (LogoSize - MessageHeight) / 2; yMessageBottom = yMessageTop + MessageHeight; xFirstSymbol = xBottomRight - xIndent; // create osd osd = cOsdProvider::NewOsd(OsdSize.x, OsdSize.y + OsdSize.h - yBottomBottom); tArea SingleArea[] = { {std::min(xTitleLeft, xLogoLeft), yTitleTop, xBottomRight - 1, yBottomBottom - 1, fShowSymbol ? 8 : 4} }; if ((SingleArea[0].bpp < 8 || EnigmaConfig.singleArea8Bpp) && osd->CanHandleAreas(SingleArea, sizeof(SingleArea) / sizeof(tArea)) == oeOk) { debug("cSkinEnigmaDisplayReplay: using %dbpp single area", SingleArea[0].bpp); osd->SetAreas(SingleArea, sizeof(SingleArea) / sizeof(tArea)); if (SingleArea[0].bpp >=8 && Setup.AntiAlias) nBPP = 8; } else { debug("cSkinEnigmaDisplayReplay: using multiple areas"); tArea Areas[] = { {xTitleLeft, yTitleTop, xTitleRight - 1, yTitleDecoBottom - 1, 2}, {xLogoLeft, yLogoTop, xLogoDecoRight + 1, yLogoBottom - 1, 4}, //TODO? "+1" because of wrong colors with "-1" {xProgressLeft, yProgressTop, xTimeRight - 1, yTimeBottom - 1, 4}, {xBottomLeft, yBottomTop, xBottomRight - 1, yBottomBottom - 1, 4} }; int rc = osd->CanHandleAreas(Areas, sizeof(Areas) / sizeof(tArea)); if (rc == oeOk) osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea)); else { error("cSkinEnigmaDisplayReplay: CanHandleAreas() returned %d", rc); delete osd; osd = NULL; throw 1; return; } } // clear all osd->DrawRectangle(0, 0, osd->Width(), osd->Height(), clrTransparent); if (modeonly) { // draw logo area osd->DrawRectangle(xLogoLeft, yLogoTop, xLogoRight - 1, yLogoBottom - 1, fShowSymbol ? Theme.Color(clrLogoBg) : clrTransparent); } else { // draw title area osd->DrawRectangle(xTitleLeft, yTitleTop, xTitleRight - 1, yTitleBottom - 1, Theme.Color(clrTitleBg)); osd->DrawRectangle(xTitleLeft, yTitleDecoTop, xTitleRight - 1, yTitleDecoBottom - 1, Theme.Color(clrTitleBg)); // draw logo area osd->DrawRectangle(xLogoLeft, yLogoTop, xLogoRight - 1, yLogoBottom - 1, Theme.Color(clrLogoBg)); osd->DrawRectangle(xLogoDecoLeft, yLogoTop, xLogoDecoRight - 1, yLogoBottom - 1, Theme.Color(clrLogoBg)); // draw progress bar area osd->DrawRectangle(xProgressLeft, yProgressTop, xProgressRight - 1, yProgressBottom - 1, Theme.Color(clrReplayBarAreaBg)); // draw time area osd->DrawRectangle(xTimeLeft, yTimeTop, xTimeRight - 1, yTimeBottom - 1, Theme.Color(clrAltBackground)); // draw bottom area osd->DrawRectangle(xBottomLeft, yBottomTop, xBottomRight - 1, yBottomBottom - 1, Theme.Color(clrBottomBg)); if (EnigmaConfig.drawRoundCorners) { // draw rounded corners osd->DrawEllipse(xTitleLeft, yTitleTop, xTitleLeft + Roundness - 1, yTitleTop + Roundness - 1, clrTransparent, -2); osd->DrawEllipse(xTitleRight - Roundness, yTitleTop, xTitleRight, yTitleTop + Roundness, clrTransparent, -1); osd->DrawEllipse(xBottomLeft, yBottomBottom - Roundness, xBottomLeft + Roundness - 1, yBottomBottom - 1, clrTransparent, -3); osd->DrawEllipse(xBottomRight - Roundness, yBottomBottom - Roundness, xBottomRight - 1, yBottomBottom - 1, clrTransparent, -4); } xFirstSymbol = DrawStatusSymbols(0, xFirstSymbol, yBottomTop, yBottomBottom) - Gap; } fLockNeeded = fScrollTitle; fLocked = false; TE_START(osd); if (fLockNeeded) { fLocked = true; } } cSkinEnigmaDisplayReplay::~cSkinEnigmaDisplayReplay() { if (fLockNeeded && !fLocked) TE_LOCK; TE_STOP; free(strLastDate); delete osd; } void cSkinEnigmaDisplayReplay::SetTitle(const char *Title) { if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } idTitle = TE_MARQUEE(osd, idTitle, fScrollTitle, xTitleLeft + xIndent, yTitleTop, Title, Theme.Color(clrTitleFg), Theme.Color(clrTitleBg), pFontOsdTitle, nBPP, xTitleRight - xIndent - xTitleLeft - xIndent - 1); if (fLockNeeded && !fLocked) TE_UNLOCK; } void cSkinEnigmaDisplayReplay::SetMode(bool Play, bool Forward, int Speed) { if (fLockNeeded && !fLocked) TE_LOCK; bool fFoundLogo = false; if (Speed < -1) Speed = -1; if (modeonly) { osd->DrawRectangle(xLogoLeft, yLogoTop, xLogoRight - 1, yLogoBottom - 1, clrTransparent); osd->DrawEllipse(xLogoLeft, yLogoTop, xLogoRight - 1, yLogoBottom - 1, Theme.Color(clrLogoBg)); } else { osd->DrawRectangle(xLogoLeft, yLogoTop, xLogoRight - 1, yLogoBottom - 1, Theme.Color(clrLogoBg)); osd->DrawRectangle(xLogoDecoLeft, yLogoTop, xLogoDecoRight - 1, yLogoBottom - 1, Theme.Color(clrLogoBg)); } if (fShowSymbol) { char *logo = NULL; if (-1 != asprintf(&logo, "icons/menu/%s", EnigmaStatus.ReplayModeName())) { if (EnigmaLogoCache.LoadIcon(logo)) { osd->DrawBitmap(xLogoLeft + (xLogoRight - xLogoLeft - EnigmaLogoCache.Get().Width()) / 2, yLogoTop + (yLogoBottom - yLogoTop - EnigmaLogoCache.Get().Height()) / 2, EnigmaLogoCache.Get(), EnigmaLogoCache.Get().Color(1), clrTransparent, true, true); } free(logo); } } if (Speed == -1) fFoundLogo = EnigmaLogoCache.LoadIcon(Play ? "icons/replay/play" : "icons/replay/pause"); else if (Play) { if (Speed > MAX_SPEED_BITMAPS - 1) { error("MAX SPEED %d > 9", Speed); Speed = MAX_SPEED_BITMAPS - 1; } fFoundLogo = EnigmaLogoCache.LoadIcon(Forward ? strFastForward_large[Speed] : strFastRewind_large[Speed]); } else { // trick speed if (Speed > MAX_TRICKSPEED_BITMAPS - 1) { error("MAX SPEED %d > 3", Speed); Speed = MAX_TRICKSPEED_BITMAPS - 1; } fFoundLogo = EnigmaLogoCache.LoadIcon(Forward ? strSlowForward_large[Speed] : strSlowRewind_large[Speed]); } if (fFoundLogo) osd->DrawBitmap(xLogoLeft + (xLogoRight - xLogoLeft - EnigmaLogoCache.Get().Width()) / 2, yLogoTop + (yLogoBottom - yLogoTop - EnigmaLogoCache.Get().Height()) / 2, EnigmaLogoCache.Get(), EnigmaLogoCache.Get().Color(1), clrTransparent, false, true); if (fLockNeeded && !fLocked) TE_UNLOCK; } void cSkinEnigmaDisplayReplay::SetProgress(int isCurrent, int Total) { if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } // create progressbar cProgressBar pb(xProgressRight - xProgressLeft - 2 * BigGap, yProgressBottom - yProgressTop - 2 * BigGap, isCurrent, Total, marks, Theme.Color(clrReplayProgressSeen), Theme.Color(clrReplayProgressRest), Theme.Color(clrReplayProgressSelected), Theme.Color(clrReplayProgressMark), Theme.Color(clrReplayProgressCurrent)); // draw progressbar osd->DrawBitmap(xProgressLeft + BigGap, yProgressTop + BigGap, pb); if (fLockNeeded && !fLocked) TE_UNLOCK; } void cSkinEnigmaDisplayReplay::SetCurrent(const char *CurrentTime) { if (!CurrentTime) return; // draw current time int w = pFontReplayTimes->Width(CurrentTime); if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } osd->DrawText(xTimeLeft + BigGap, yTimeTop, CurrentTime, Theme.Color(clrReplayCurrent), Theme.Color(clrAltBackground), pFontReplayTimes, w, yTimeBottom - yTimeTop, taLeft); if (nCurrentWidth > w) osd->DrawRectangle(xTimeLeft + BigGap + w, yTimeTop, xTimeLeft + BigGap + nCurrentWidth - 1, yTimeBottom - 1, Theme.Color(clrAltBackground)); nCurrentWidth = w; if (fLockNeeded && !fLocked) TE_UNLOCK; } void cSkinEnigmaDisplayReplay::SetTotal(const char *Total) { if (!Total) return; // draw total time int w = pFontReplayTimes->Width(Total); if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } osd->DrawText(xTimeRight - BigGap - w, yTimeTop, Total, Theme.Color(clrReplayTotal), Theme.Color(clrAltBackground), pFontReplayTimes, w, yTimeBottom - yTimeTop, taRight); if (fLockNeeded && !fLocked) TE_UNLOCK; } void cSkinEnigmaDisplayReplay::SetJump(const char *Jump) { if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } if (Jump) { // draw jump prompt nJumpWidth = pFontReplayTimes->Width(Jump); osd->DrawText(xTimeLeft + (xTimeRight - xTimeLeft - nJumpWidth) / 2, yTimeTop, Jump, Theme.Color(clrReplayModeJump), Theme.Color(clrAltBackground), pFontReplayTimes, nJumpWidth, yTimeBottom - yTimeTop, taLeft); } else { // erase old prompt osd->DrawRectangle(xTimeLeft + (xTimeRight - xTimeLeft - nJumpWidth) / 2, yTimeTop, xTimeLeft + (xTimeRight - xTimeLeft - nJumpWidth) / 2 + nJumpWidth - 1, yTimeBottom - 1, Theme.Color(clrAltBackground)); } if (fLockNeeded && !fLocked) TE_UNLOCK; } void cSkinEnigmaDisplayReplay::SetMessage(eMessageType Type, const char *Text) { if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } if (Text) { // save current osd osd->SaveRegion(xMessageLeft, yMessageTop, xMessageRight, yMessageBottom); // draw message osd->DrawRectangle(xMessageLeft, yMessageTop, xMessageRight - 1, yMessageBottom - 1, clrTransparent); osd->DrawRectangle(xMessageLeft, yMessageTop + SmallGap, xMessageRight - 1, yMessageBottom - SmallGap - 1, Theme.Color(clrButtonRedBg)); osd->DrawText(xMessageLeft, yMessageTop + 2 * SmallGap, Text, Theme.Color(clrMessageStatusFg + 2 * Type), Theme.Color(clrMessageStatusBg + 2 * Type), pFontMessage, xMessageRight - xMessageLeft, yMessageBottom - 2 * SmallGap - yMessageTop - 2 * SmallGap, taCenter); } else { // restore saved osd osd->RestoreRegion(); } if (fLockNeeded && !fLocked) TE_UNLOCK; } void cSkinEnigmaDisplayReplay::Flush(void) { if (fLockNeeded && !fLocked) TE_LOCK; // update date if (!modeonly) { cString date = DayDateTime(); if ((strLastDate == NULL) || strcmp(strLastDate, (const char*)date) != 0) { free(strLastDate); strLastDate = strdup((const char*)date); osd->DrawText(xBottomLeft + xIndent, yBottomTop, date, Theme.Color(clrTitleFg), Theme.Color(clrBottomBg), pFontDate, xFirstSymbol - xBottomLeft - xIndent - 1, yBottomBottom - yBottomTop - 1, taLeft); } } osd->Flush(); if (fLockNeeded) { TE_UNLOCK; if (fLocked) { fLocked = false; TE_WAKEUP; } } } // --- cSkinEnigmaDisplayVolume --------------------------------------------- class cSkinEnigmaDisplayVolume : public cSkinDisplayVolume, public cSkinEnigmaBaseOsd { private: const cFont *pFontOsdTitle; const cFont *pFontDate; int xTitleLeft, xTitleRight, yTitleTop, yTitleBottom, yTitleDecoTop, yTitleDecoBottom; int xLogoLeft, xLogoRight, yLogoTop, yLogoBottom, xLogoDecoLeft, xLogoDecoRight; int xBodyLeft, xBodyRight, yBodyTop, yBodyBottom; int xBottomLeft, xBottomRight, yBottomTop, yBottomBottom; int xIndent; time_t lastTime; bool fShowSymbol; public: cSkinEnigmaDisplayVolume(); virtual ~ cSkinEnigmaDisplayVolume(); virtual void SetVolume(int Current, int Total, bool Mute); virtual void Flush(void); }; cSkinEnigmaDisplayVolume::cSkinEnigmaDisplayVolume() { struct EnigmaOsdSize OsdSize; EnigmaConfig.GetOsdSize(&OsdSize); xIndent = EnigmaConfig.drawRoundCorners ? Roundness : SmallGap; pFontOsdTitle = EnigmaConfig.GetFont(FONT_OSDTITLE); pFontDate = EnigmaConfig.GetFont(FONT_DATE); lastTime = 0; fShowSymbol = EnigmaConfig.showSymbols && EnigmaConfig.showSymbolsAudio; int LogoSize = std::max(pFontOsdTitle->Height() + cFont::GetFont(fontOsd)->Height() + pFontDate->Height() + TitleDeco + SmallGap, IconHeight); LogoSize += (LogoSize % 2 ? 1 : 0); xLogoLeft = 0; xLogoRight = LogoSize; xLogoDecoLeft = xLogoRight + LogoDecoGap; xLogoDecoRight = xLogoDecoLeft + LogoDecoWidth; yLogoTop = 0; yLogoBottom = yLogoTop + LogoSize; xTitleLeft = fShowSymbol ? (xLogoDecoRight + LogoDecoGap2) : 0; xTitleRight = OsdSize.w; yTitleTop = yLogoTop; yTitleBottom = yTitleTop + pFontOsdTitle->Height(); yTitleDecoTop = yTitleBottom + TitleDecoGap; yTitleDecoBottom = yTitleDecoTop + TitleDecoHeight; xBottomLeft = xTitleLeft; xBottomRight = OsdSize.w; yBottomTop = yLogoBottom - pFontDate->Height(); yBottomBottom = yLogoBottom; xBodyLeft = xTitleLeft; xBodyRight = xTitleRight; yBodyTop = yTitleDecoBottom + TitleDecoGap2; yBodyBottom = yBottomTop - SmallGap; // create osd osd = cOsdProvider::NewOsd(OsdSize.x, OsdSize.y + OsdSize.h - yBottomBottom); tArea SingleArea[] = { {xLogoLeft, yLogoTop, xTitleRight - 1, yBottomBottom - 1, fShowSymbol ? 8 : 4} }; if ((SingleArea[0].bpp < 8 || EnigmaConfig.singleArea8Bpp) && osd->CanHandleAreas(SingleArea, sizeof(SingleArea) / sizeof(tArea)) == oeOk) { debug("cSkinEnigmaDisplayVolume: using %dbpp single area", SingleArea[0].bpp); osd->SetAreas(SingleArea, sizeof(SingleArea) / sizeof(tArea)); } else { debug("cSkinEnigmaDisplayVolume: using multiple areas"); #if VDRVERSNUM < 20301 cBitmap *bitmap = NULL; #endif if (fShowSymbol) { tArea Areas[] = { {xLogoLeft, yLogoTop, xLogoRight + LogoDecoGap + LogoDecoWidth - 1, yLogoBottom - 1, 4}, {xTitleLeft, yTitleTop, xTitleRight - 1, yBottomBottom - 1, 4} }; int rc = osd->CanHandleAreas(Areas, sizeof(Areas) / sizeof(tArea)); if (rc == oeOk) osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea)); else { error("cSkinEnigmaDisplayVolume: CanHandleAreas() returned %d", rc); delete osd; osd = NULL; throw 1; return; } #if VDRVERSNUM < 20301 bitmap = osd->GetBitmap(1); #endif } else { tArea Areas[] = { {xTitleLeft, yTitleTop, xTitleRight - 1, yBottomBottom - 1, 4} }; int rc = osd->CanHandleAreas(Areas, sizeof(Areas) / sizeof(tArea)); if (rc == oeOk) osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea)); else { error("cSkinEnigmaDisplayVolume: CanHandleAreas() returned %d", rc); delete osd; osd = NULL; throw 1; return; } #if VDRVERSNUM < 20301 bitmap = osd->GetBitmap(0); #endif } #if VDRVERSNUM < 20301 if (bitmap) { // set colors bitmap->Reset(); bitmap->SetColor(0, Theme.Color(clrTransparent)); bitmap->SetColor(1, Theme.Color(clrBackground)); bitmap->SetColor(2, Theme.Color(clrTitleBg)); bitmap->SetColor(3, Theme.Color(clrBottomBg)); bitmap->SetColor(4, Theme.Color(clrVolumeBar)); bitmap->SetColor(5, Theme.Color(clrVolumeBarMute)); bitmap->SetColor(6, Theme.Color(clrTitleFg)); } #endif } // clear all osd->DrawRectangle(0, 0, osd->Width(), osd->Height(), clrTransparent); if (fShowSymbol) { // draw logo area osd->DrawRectangle(xLogoLeft, yLogoTop, xLogoRight - 1, yLogoBottom - 1, Theme.Color(clrLogoBg)); osd->DrawRectangle(xLogoDecoLeft, yLogoTop, xLogoDecoRight - 1, yLogoBottom - 1, Theme.Color(clrLogoBg)); } // draw title osd->DrawRectangle(xTitleLeft, yTitleTop, xTitleRight - 1, yTitleBottom - 1, Theme.Color(clrTitleBg)); osd->DrawRectangle(xTitleLeft, yTitleDecoTop, xTitleRight - 1, yTitleDecoBottom - 1, Theme.Color(clrTitleBg)); // draw body area osd->DrawRectangle(xBodyLeft, yBodyTop, xBodyRight - 1, yBodyBottom - 1, Theme.Color(clrBackground)); // draw bottom area osd->DrawRectangle(xBottomLeft, yBottomTop, xBottomRight - 1, yBottomBottom - 1, Theme.Color(clrBottomBg)); if (EnigmaConfig.drawRoundCorners) { // draw rounded corners osd->DrawEllipse(xTitleRight - Roundness, yTitleTop, xTitleRight - 1, yTitleTop + Roundness - 1, clrTransparent, -1); osd->DrawEllipse(xBottomRight - Roundness, yBottomBottom - Roundness, xBottomRight - 1, yBottomBottom - 1, clrTransparent, -4); if (!fShowSymbol) { osd->DrawEllipse(xTitleLeft, yTitleTop, xTitleLeft + Roundness - 1, yTitleTop + Roundness - 1, clrTransparent, -2); osd->DrawEllipse(xBottomLeft, yBottomBottom - Roundness, xBottomLeft + Roundness, yBottomBottom - 1, clrTransparent, -3); } } } cSkinEnigmaDisplayVolume::~cSkinEnigmaDisplayVolume() { delete osd; } void cSkinEnigmaDisplayVolume::SetVolume(int CurrentVol, int Total, bool Mute) { tColor ColorBar; const char *Prompt; bool fFoundLogo = false; // select behaviour if (Mute) { ColorBar = Theme.Color(clrVolumeBarMute); Prompt = tr("Mute"); if (fShowSymbol) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/volume/muteOn"); } else { ColorBar = Theme.Color(clrVolumeBar); Prompt = tr("Volume"); if (fShowSymbol) fFoundLogo = EnigmaLogoCache.LoadIcon("icons/volume/muteOff"); } // logo if (fShowSymbol && fFoundLogo) osd->DrawBitmap(xLogoLeft + (xLogoRight - xLogoLeft - EnigmaLogoCache.Get().Width()) / 2, yLogoTop + (yLogoBottom - yLogoTop - EnigmaLogoCache.Get().Height()) / 2, EnigmaLogoCache.Get(), EnigmaLogoCache.Get().Color(1), Theme.Color(clrLogoBg)); // current volume int vol = xBodyLeft + Gap + (xBodyRight - Gap - xBodyLeft - Gap) * CurrentVol / Total; // draw titlebar osd->DrawRectangle(xTitleLeft + (fShowSymbol ? Gap : xIndent), yTitleTop, xTitleRight - xIndent - 1, yTitleBottom - 1, Theme.Color(clrTitleBg)); osd->DrawText(xTitleLeft + (fShowSymbol ? Gap : xIndent), yTitleTop, Prompt, Theme.Color(clrTitleFg), clrTransparent, pFontOsdTitle, xTitleRight - xIndent - xTitleLeft, pFontOsdTitle->Height(), taCenter); // draw volumebar osd->DrawRectangle(xBodyLeft + Gap, yBodyTop + Gap, xBodyRight - Gap - 1, yBodyBottom - Gap - 1, Theme.Color(clrBackground)); osd->DrawRectangle(xBodyLeft + Gap, yBodyTop + Gap, vol - 1, yBodyBottom - Gap - 1, ColorBar); } void cSkinEnigmaDisplayVolume::Flush(void) { osd->Flush(); } // --- cSkinEnigmaDisplayTracks --------------------------------------------- class cSkinEnigmaDisplayTracks : public cSkinDisplayTracks, public cSkinEnigmaBaseOsd { private: const cFont *pFontOsdTitle; const cFont *pFontDate; const cFont *pFontListItem; int xTitleLeft, xTitleRight, yTitleTop, yTitleBottom, yTitleDecoTop, yTitleDecoBottom; int xLogoLeft, xLogoRight, xLogoDecoLeft, xLogoDecoRight, yLogoTop, yLogoBottom; int xListLeft, xListRight, yListTop, yListBottom, xItemLeft, xItemRight; int xBottomLeft, xBottomRight, yBottomTop, yBottomBottom; int xIndent; int lineHeight; int nMarkerGap; int currentIndex; bool fShowSymbol; time_t lastTime; void SetItem(const char *Text, int Index, bool Current); public: cSkinEnigmaDisplayTracks(const char *Title, int NumTracks, const char *const *Tracks); virtual ~ cSkinEnigmaDisplayTracks(); virtual void SetTrack(int Index, const char *const *Tracks); virtual void SetAudioChannel(int AudioChannel); virtual void Flush(void); }; cSkinEnigmaDisplayTracks::cSkinEnigmaDisplayTracks(const char *Title, int NumTracks, const char *const *Tracks) { struct EnigmaOsdSize OsdSize; EnigmaConfig.GetOsdSize(&OsdSize); xIndent = EnigmaConfig.drawRoundCorners ? Roundness : SmallGap; pFontOsdTitle = EnigmaConfig.GetFont(FONT_OSDTITLE); pFontDate = EnigmaConfig.GetFont(FONT_DATE); pFontListItem = EnigmaConfig.GetFont(FONT_LISTITEM); lastTime = 0; fShowSymbol = EnigmaConfig.showSymbols && EnigmaConfig.showSymbolsAudio; bool fShowSymbolNow = false; // if symbols are requested try to find subtitle XPM and force to display it at the end of this function, else disable symbols if (fShowSymbol && strcmp(Title, trVDR("Button$Subtitles")) == 0) { if (EnigmaLogoCache.LoadIcon("icons/subtitle/subtitle")) fShowSymbolNow = true; else fShowSymbol = false; } lineHeight = pFontListItem->Height(); nMarkerGap = std::min(MarkerGap, lineHeight / 2 - 1); //lineHeight - 2 * MarkerGap int LogoSize = IconHeight; LogoSize += (LogoSize % 2 ? 1 : 0); currentIndex = -1; int ItemsWidth = 0; //Get required space for the list items for (int i = 0; i < NumTracks; i++) ItemsWidth = std::max(ItemsWidth, pFontListItem->Width(Tracks[i])); //Add required space for marker or border ItemsWidth += (EnigmaConfig.showMarker ? lineHeight : ListHBorder) + ListHBorder; //If OSD title only covers the list then its content must fit too if (!EnigmaConfig.fullTitleWidth) ItemsWidth = std::max(ItemsWidth, pFontOsdTitle->Width(Title) + 2 * xIndent + (fShowSymbol ? 0 : (bmAudio[0].Width() + SmallGap))); //If the symbol is shown the list's width should be at least as wide as the symbol if (fShowSymbol) ItemsWidth = std::max(ItemsWidth, LogoSize); //Now let's calculate the OSD's full width if (EnigmaConfig.fullTitleWidth) { //If the symbol is shown, add its width if (fShowSymbol) ItemsWidth += LogoSize + LogoDecoGap + LogoDecoWidth + LogoDecoGap2; //The width must be wide enough for the OSD title ItemsWidth = std::max(ItemsWidth, pFontOsdTitle->Width(Title) + 2 * xIndent + (fShowSymbol ? 0 : (bmAudio[0].Width() + SmallGap))); } yTitleTop = 0; yTitleBottom = pFontOsdTitle->Height(); yTitleDecoTop = yTitleBottom + TitleDecoGap; yTitleDecoBottom = yTitleDecoTop + TitleDecoHeight; xLogoLeft = 0; xLogoRight = xLogoLeft + LogoSize; xLogoDecoLeft = xLogoRight + LogoDecoGap; xLogoDecoRight = xLogoDecoLeft + LogoDecoWidth; yLogoTop = yTitleDecoBottom + TitleDecoGap2; yLogoBottom = yLogoTop + std::max(LogoSize, NumTracks * lineHeight); xTitleLeft = fShowSymbol ? (EnigmaConfig.fullTitleWidth ? xLogoLeft : xLogoDecoRight + LogoDecoGap2) : 0; xTitleRight = xTitleLeft + FixWidth(ItemsWidth, 2); xListLeft = fShowSymbol ? (xLogoDecoRight + LogoDecoGap2) : 0; xListRight = xTitleRight; yListTop = yLogoTop; yListBottom = yLogoBottom; xItemLeft = xListLeft + (EnigmaConfig.showMarker ? lineHeight : ListHBorder); xItemRight = xListRight - ListHBorder; xBottomLeft = xTitleLeft; xBottomRight = xTitleRight; yBottomTop = yListBottom + SmallGap; yBottomBottom = yBottomTop + pFontDate->Height(); // create osd osd = cOsdProvider::NewOsd(OsdSize.x, OsdSize.y + OsdSize.h - yBottomBottom); tArea SingleArea[] = { {fShowSymbol ? xLogoLeft : xTitleLeft, yTitleTop, xBottomRight - 1, yBottomBottom - 1, fShowSymbol ? 8 : 4} }; if ((SingleArea[0].bpp < 8 || EnigmaConfig.singleArea8Bpp) && osd->CanHandleAreas(SingleArea, sizeof(SingleArea) / sizeof(tArea)) == oeOk) { debug("cSkinEnigmaDisplayTracks: using %dbpp single area", SingleArea[0].bpp); osd->SetAreas(SingleArea, sizeof(SingleArea) / sizeof(tArea)); } else { debug("cSkinEnigmaDisplayTracks: using multiple areas"); if (fShowSymbol) { tArea Areas[] = { {xTitleLeft, yTitleTop, xTitleRight - 1, yTitleDecoBottom- 1, 2}, {xLogoLeft, yLogoTop, xLogoDecoRight - 1, yLogoBottom - 1, 4}, {xListLeft, yListTop, xListRight - 1, yListBottom - 1, 2}, {xBottomLeft, yBottomTop, xBottomRight - 1, yBottomBottom - 1, 2} }; int rc = osd->CanHandleAreas(Areas, sizeof(Areas) / sizeof(tArea)); if (rc == oeOk) osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea)); else { error("cSkinEnigmaDisplayTracks: CanHandleAreas() returned %d", rc); delete osd; osd = NULL; throw 1; return; } } else { tArea Areas[] = { {xTitleLeft, yTitleTop, xTitleRight - 1, yTitleDecoBottom- 1, 2}, {xListLeft, yListTop, xListRight - 1, yListBottom - 1, 2}, {xBottomLeft, yBottomTop, xBottomRight - 1, yBottomBottom - 1, 2} }; int rc = osd->CanHandleAreas(Areas, sizeof(Areas) / sizeof(tArea)); if (rc == oeOk) osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea)); else { error("cSkinEnigmaDisplayTracks: CanHandleAreas() returned %d", rc); delete osd; osd = NULL; throw 1; return; } } } // clear all osd->DrawRectangle(0, 0, osd->Width(), osd->Height(), clrTransparent); // draw titlebar osd->DrawRectangle(xTitleLeft, yTitleTop, xTitleRight - 1, yTitleBottom - 1, Theme.Color(clrTitleBg)); osd->DrawRectangle(xTitleLeft, yTitleDecoTop, xTitleRight - 1, yTitleDecoBottom - 1, Theme.Color(clrTitleBg)); osd->DrawText(xTitleLeft + xIndent, yTitleTop, Title, Theme.Color(clrTitleFg), clrTransparent, pFontOsdTitle, xTitleRight - xIndent - xTitleLeft - xIndent, yTitleBottom - yTitleTop, fShowSymbol ? taCenter : taLeft); if (fShowSymbol) { // draw logo area osd->DrawRectangle(xLogoLeft, yLogoTop, xLogoRight - 1, yLogoBottom - 1, Theme.Color(clrLogoBg)); osd->DrawRectangle(xLogoDecoLeft, yLogoTop, xLogoDecoRight - 1, yLogoBottom - 1, Theme.Color(clrLogoBg)); } // draw list area osd->DrawRectangle(xListLeft, yListTop, xListRight - 1, yListBottom - 1, Theme.Color(clrBackground)); // draw bottom osd->DrawRectangle(xBottomLeft, yBottomTop, xBottomRight - 1, yBottomBottom - 1, Theme.Color(clrBottomBg)); if (EnigmaConfig.drawRoundCorners) { // draw rounded corners osd->DrawEllipse(xTitleLeft, yTitleTop, xTitleLeft + Roundness - 1, yTitleTop + Roundness - 1, clrTransparent, -2); osd->DrawEllipse(xTitleRight - Roundness, yTitleTop, xTitleRight - 1, yTitleTop + Roundness - 1, clrTransparent, -1); osd->DrawEllipse(xBottomLeft, yBottomBottom - Roundness, xBottomLeft + Roundness, yBottomBottom - 1, clrTransparent, -3); osd->DrawEllipse(xBottomRight - Roundness, yBottomBottom - Roundness, xBottomRight - 1, yBottomBottom - 1, clrTransparent, -4); } // fill up audio tracks for (int i = 0; i < NumTracks; i++) SetItem(Tracks[i], i, false); if (fShowSymbolNow) { // subtitle logo osd->DrawBitmap(xLogoLeft + (xLogoRight - xLogoLeft - EnigmaLogoCache.Get().Width()) / 2, yLogoTop + (yLogoBottom - yLogoTop - EnigmaLogoCache.Get().Height()) / 2, EnigmaLogoCache.Get(), EnigmaLogoCache.Get().Color(1), Theme.Color(clrLogoBg)); } } cSkinEnigmaDisplayTracks::~cSkinEnigmaDisplayTracks() { delete osd; } void cSkinEnigmaDisplayTracks::SetItem(const char *Text, int Index, bool isCurrent) { int y = yListTop + Index * lineHeight; tColor ColorFg, ColorBg; if (isCurrent) { ColorFg = Theme.Color(clrMenuItemSelectableFg); ColorBg = Theme.Color(clrAltBackground); currentIndex = Index; } else { ColorFg = Theme.Color(clrMenuItemSelectableFg); ColorBg = Theme.Color(clrBackground); } // draw track id osd->DrawRectangle(xListLeft, y, xListRight, y + lineHeight, ColorBg); if (EnigmaConfig.showMarker) { osd->DrawEllipse(xListLeft + nMarkerGap, y + nMarkerGap, xListLeft + lineHeight - nMarkerGap, y + lineHeight - nMarkerGap, isCurrent ? ColorFg : ColorBg); } osd->DrawText(xItemLeft, y, Text, ColorFg, ColorBg, pFontListItem, xItemRight - xItemLeft, lineHeight); osd->DrawRectangle(xItemRight, y, xListRight - 1, y + lineHeight - 1, ColorBg); } void cSkinEnigmaDisplayTracks::SetAudioChannel(int AudioChannel) { if (fShowSymbol) { // draw logo area osd->DrawRectangle(xLogoLeft, yLogoTop, xLogoRight - 1, yLogoBottom - 1, Theme.Color(clrLogoBg)); if (!(AudioChannel >= 0 && AudioChannel < MAX_AUDIO_BITMAPS)) AudioChannel = 0; if (EnigmaLogoCache.LoadIcon(strAudio_large[AudioChannel])) osd->DrawBitmap(xLogoLeft + (xLogoRight - xLogoLeft - EnigmaLogoCache.Get().Width()) / 2, yLogoTop + (yLogoBottom - yLogoTop - EnigmaLogoCache.Get().Height()) / 2, EnigmaLogoCache.Get(), EnigmaLogoCache.Get().Color(1), Theme.Color(clrLogoBg)); } else { if (!(AudioChannel >= 0 && AudioChannel < MAX_AUDIO_BITMAPS)) AudioChannel = 0; osd->DrawBitmap(xTitleRight - xIndent - bmAudio[AudioChannel].Width(), yTitleTop + (yTitleBottom - yTitleTop - bmAudio[AudioChannel].Height()) / 2, bmAudio[AudioChannel], Theme.Color(clrTitleFg), Theme.Color(clrTitleBg)); } } void cSkinEnigmaDisplayTracks::SetTrack(int Index, const char *const *Tracks) { if (currentIndex >= 0) SetItem(Tracks[currentIndex], currentIndex, false); SetItem(Tracks[Index], Index, true); } void cSkinEnigmaDisplayTracks::Flush(void) { osd->Flush(); } // --- cSkinEnigmaDisplayMessage -------------------------------------------- class cSkinEnigmaDisplayMessage : public cSkinDisplayMessage, public cSkinEnigmaBaseOsd { private: const cFont *pFontMessage; int xTitleLeft, xTitleRight, yTitleTop, yTitleBottom, yTitleDecoTop, yTitleDecoBottom; int xLogoLeft, xLogoRight, yLogoTop, yLogoBottom, xLogoDecoLeft, xLogoDecoRight; int xMessageLeft, xMessageRight, yMessageTop, yMessageBottom; int xBottomLeft, xBottomRight, yBottomTop, yBottomBottom; int xIndent; bool fShowSymbol; int idMessage; bool fScrollOther; bool fLocked; bool fLockNeeded; int nBPP; public: cSkinEnigmaDisplayMessage(); virtual ~ cSkinEnigmaDisplayMessage(); virtual void SetMessage(eMessageType Type, const char *Text); virtual void Flush(void); }; cSkinEnigmaDisplayMessage::cSkinEnigmaDisplayMessage() { struct EnigmaOsdSize OsdSize; EnigmaConfig.GetOsdSize(&OsdSize); xIndent = EnigmaConfig.drawRoundCorners ? Roundness : SmallGap; const cFont *pFontOsdTitle; const cFont *pFontDate; pFontMessage = EnigmaConfig.GetFont(FONT_MESSAGE); pFontOsdTitle = EnigmaConfig.GetFont(FONT_OSDTITLE); pFontDate = EnigmaConfig.GetFont(FONT_DATE); fScrollOther = EnigmaConfig.useTextEffects && EnigmaConfig.scrollOther; idMessage = -1; fShowSymbol = EnigmaConfig.showSymbols && EnigmaConfig.showSymbolsMsgs; nBPP = 1; int LogoSize = std::max(pFontOsdTitle->Height() + TitleDeco + pFontMessage->Height() + 5 * SmallGap + pFontDate->Height(), IconHeight); LogoSize += (LogoSize % 2 ? 1 : 0); xLogoLeft = 0; xLogoRight = xLogoLeft + LogoSize; xLogoDecoLeft = xLogoRight + LogoDecoGap; xLogoDecoRight = xLogoDecoLeft + LogoDecoWidth; yLogoTop = 0; yLogoBottom = yLogoTop + LogoSize; xTitleLeft = fShowSymbol ? xLogoDecoRight + LogoDecoGap2 : 0; xTitleRight = OsdSize.w; yTitleTop = yLogoTop; yTitleBottom = yTitleTop + pFontOsdTitle->Height(); yTitleDecoTop = yTitleBottom + TitleDecoGap; yTitleDecoBottom = yTitleDecoTop + TitleDecoHeight; xBottomLeft = xTitleLeft; xBottomRight = xTitleRight; yBottomTop = yLogoBottom - pFontDate->Height(); yBottomBottom = yLogoBottom; xMessageLeft = xTitleLeft; xMessageRight = xTitleRight; yMessageTop = yTitleDecoBottom + TitleDecoGap2; yMessageBottom = yBottomTop - SmallGap; // create osd osd = cOsdProvider::NewOsd(OsdSize.x, OsdSize.y + OsdSize.h - yBottomBottom); tArea SingleArea[] = { {xLogoLeft, yLogoTop, xBottomRight - 1, yBottomBottom - 1, fShowSymbol ? 8 : 4} }; if ((SingleArea[0].bpp < 8 || EnigmaConfig.singleArea8Bpp) && osd->CanHandleAreas(SingleArea, sizeof(SingleArea) / sizeof(tArea)) == oeOk) { debug("cSkinEnigmaDisplayMessage: using %dbpp single area", SingleArea[0].bpp); osd->SetAreas(SingleArea, sizeof(SingleArea) / sizeof(tArea)); if (SingleArea[0].bpp >=8 && Setup.AntiAlias) nBPP = 8; } else { debug("cSkinEnigmaDisplayMessage: using multiple areas"); if (fShowSymbol) { tArea Areas[] = { {xLogoLeft, yLogoTop, xLogoRight + LogoDecoGap + LogoDecoWidth - 1, yLogoBottom - 1, 4}, {xTitleLeft, yTitleTop, xBottomRight - 1, yBottomBottom - 1, 4} }; int rc = osd->CanHandleAreas(Areas, sizeof(Areas) / sizeof(tArea)); if (rc == oeOk) osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea)); else { error("cSkinEnigmaDisplayMessage: CanHandleAreas() returned %d", rc); delete osd; osd = NULL; throw 1; return; } } else { tArea Areas[] = { {xTitleLeft, yTitleTop, xBottomRight - 1, yBottomBottom - 1, 4} }; int rc = osd->CanHandleAreas(Areas, sizeof(Areas) / sizeof(tArea)); if (rc == oeOk) osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea)); else { error("cSkinEnigmaDisplayMessage: CanHandleAreas() returned %d", rc); delete osd; osd = NULL; throw 1; return; } } } // clear all osd->DrawRectangle(0, 0, osd->Width(), osd->Height(), clrTransparent); fLockNeeded = fScrollOther; fLocked = false; TE_START(osd); if (fLockNeeded) { fLocked = true; } } cSkinEnigmaDisplayMessage::~cSkinEnigmaDisplayMessage() { debug("cSkinEnigmaDisplayMessage::~cSkinEnigmaDisplayMessage"); if (fLockNeeded && !fLocked) TE_LOCK; TE_STOP; delete osd; } void cSkinEnigmaDisplayMessage::SetMessage(eMessageType Type, const char *Text) { debug("cSkinEnigmaDisplayMessage::SetMessage"); if (fLockNeeded && !fLocked) { fLocked = true; TE_LOCK; } if (fShowSymbol) { // draw logo osd->DrawRectangle(xLogoLeft, yLogoTop, xLogoRight - 1, yLogoBottom - 1, Theme.Color(clrLogoBg)); osd->DrawRectangle(xLogoDecoLeft, yLogoTop, xLogoDecoRight - 1, yLogoBottom - 1, Theme.Color(clrLogoBg)); if (EnigmaLogoCache.LoadIcon("icons/message/info")) osd->DrawBitmap(xLogoLeft + (xLogoRight - xLogoLeft - EnigmaLogoCache.Get().Width()) / 2, yLogoTop + (yLogoBottom - yLogoTop - EnigmaLogoCache.Get().Height()) / 2, EnigmaLogoCache.Get(), EnigmaLogoCache.Get().Color(1), Theme.Color(clrLogoBg)); } // draw title osd->DrawRectangle(xTitleLeft, yTitleTop, xTitleRight - 1, yTitleBottom - 1, Theme.Color(clrTitleBg)); osd->DrawRectangle(xTitleLeft, yTitleDecoTop, xTitleRight - 1, yTitleDecoBottom - 1, Theme.Color(clrTitleBg)); // draw centered message text osd->DrawRectangle(xMessageLeft, yMessageTop, xMessageRight - 1, yMessageBottom - 1, clrTransparent); osd->DrawRectangle(xMessageLeft, yMessageTop, xMessageRight - 1, yMessageBottom - 1, Theme.Color(clrButtonRedBg)); idMessage = TE_MARQUEE(osd, idMessage, fScrollOther, xMessageLeft, yMessageTop + 2 * SmallGap, Text, Theme.Color(clrMessageStatusFg + 2 * Type), Theme.Color(clrMessageStatusBg + 2 * Type), pFontMessage, nBPP, xMessageRight - xMessageLeft, yMessageBottom - 2 * SmallGap - yMessageTop - 2 * SmallGap, taCenter); // draw bottom osd->DrawRectangle(xBottomLeft, yBottomTop, xBottomRight - 1, yBottomBottom - 1, Theme.Color(clrBottomBg)); if (EnigmaConfig.drawRoundCorners) { // draw rounded corners osd->DrawEllipse(xTitleRight - Roundness, yTitleTop, xTitleRight - 1, yTitleTop + Roundness - 1, clrTransparent, -1); osd->DrawEllipse(xBottomRight - Roundness, yBottomBottom - Roundness, xBottomRight - 1, yBottomBottom - 1, clrTransparent, -4); if (!(fShowSymbol)) { // draw rounded corners at the left side if not showing logo osd->DrawEllipse(xTitleLeft, yTitleTop, xTitleLeft + Roundness - 1, yTitleTop + Roundness - 1, clrTransparent, -2); osd->DrawEllipse(xBottomLeft, yBottomBottom - Roundness, xBottomLeft + Roundness - 1, yBottomBottom - 1, clrTransparent, -3); } } if (fLockNeeded && !fLocked) TE_UNLOCK; } void cSkinEnigmaDisplayMessage::Flush(void) { if (fLockNeeded && !fLocked) TE_LOCK; osd->Flush(); if (fLockNeeded) { TE_UNLOCK; if (fLocked) { fLocked = false; TE_WAKEUP; } } } // --- cSkinEnigmaOsd ---------------------------------------------------------- bool cSkinEnigmaBaseOsd::HasChannelTimerRecording(const cChannel *Channel) { // try to find current channel from timers #if VDRVERSNUM >= 20301 LOCK_TIMERS_READ for (const cTimer *t = Timers->First(); t; t = Timers->Next(t)) { #else for (cTimer *t = Timers.First(); t; t = Timers.Next(t)) { #endif if ((t->Channel() == Channel) && t->Recording()) return true; } return false; } int cSkinEnigmaBaseOsd::DrawStatusSymbols(int /* x0 */, int xs, int top, int bottom, const cChannel *Channel /* = NULL */) { if (!EnigmaConfig.showStatusSymbols) return xs; int ys = top + (bottom - top - SymbolHeight) / 2; const cFont *pFontLanguage = EnigmaConfig.GetFont(FONT_CILANGUAGE); cDevice *Device = cDevice::PrimaryDevice(); eTrackType TrackType = Device->GetCurrentAudioTrack(); const tTrackId *Track = Device->GetTrack(TrackType); if (Track) { int AudioMode = Device->GetAudioChannel(); if (!(AudioMode >= 0 && AudioMode < MAX_AUDIO_BITMAPS)) AudioMode = 0; char *strFile = NULL; if (-1 != asprintf(&strFile, "flags/%s%s", Track->language, IS_DOLBY_TRACK(TrackType) ? "DD" : (AudioMode > 0 ? "MONO" : ""))) { bool fFlagFound = false; if (EnigmaConfig.showFlags) { if (EnigmaLogoCache.LoadSymbol(strFile)) { xs -= (EnigmaLogoCache.Get().Width() + SmallGap); osd->DrawBitmap(xs, ys, EnigmaLogoCache.Get()); fFlagFound = true; } } if (!fFlagFound) { const char *strLang = Track->description ? Track->description : (strFile + strlen("flags/")); //don't show "flags/" in OSD xs -= (pFontLanguage->Width(strLang) + SmallGap); osd->DrawText(xs, top + SmallGap , strLang, Theme.Color(clrSymbolActive), Theme.Color(clrBottomBg), pFontLanguage, pFontLanguage->Width(strLang), bottom - SmallGap); } free(strFile); } } // draw recording symbol if (cRecordControls::Active()) { xs -= (bmRecording.Width() + SmallGap); //TODO? get current channel on primary device: Channel = Device->CurrentChannel() bool fRecording = Channel && HasChannelTimerRecording(Channel); osd->DrawBitmap(xs, ys, bmRecording, Theme.Color(fRecording ? clrSymbolRecordBg : clrBottomBg), Theme.Color(fRecording ? clrSymbolRecord : clrSymbolActive)); } else if (EnigmaConfig.showStatusSymbols == 1) { xs -= (bmRecording.Width() + SmallGap); osd->DrawBitmap(xs, ys, bmRecording, Theme.Color(clrBottomBg), Theme.Color(clrSymbolInactive)); } #ifdef USE_PLUGIN_MAILBOX if (EnigmaConfig.showMailIcon) { cPlugin *MailBoxPlugin = cPluginManager::GetPlugin("mailbox"); bool fHasNewMail = false; if (MailBoxPlugin && MailBoxPlugin->Service(MailBox_HasNewMail_v1_0_NAME, &fHasNewMail)) { if (fHasNewMail || EnigmaConfig.showMailIcon > 1) { xs -= (bmMail.Width() + SmallGap); osd->DrawBitmap(xs, ys, bmMail, Theme.Color(clrBottomBg), Theme.Color(fHasNewMail ? clrSymbolActive : clrSymbolInactive)); } } } #endif #ifdef USE_PLUGIN_AVARDS cPlugin *AvardsPlugin = cPluginManager::GetPlugin("avards"); if (AvardsPlugin) { avards_CurrentVideoFormat_v1_0 avardsData; if (AvardsPlugin->Service(AVARDS_CURRENT_VIDEO_FORMAT_SERVICE_STRING_ID, &avardsData)) { if (EnigmaConfig.showWssSymbols) { if (avardsData.Mode > 0) { if (avardsData.Mode < MAX_AVARDS_MODES) { xs -= (bmWSS[avardsData.Mode].Width() + SmallGap); osd->DrawBitmap(xs, ys, bmWSS[avardsData.Mode], Theme.Color(clrBottomBg), Theme.Color(clrSymbolActive)); } else { esyslog("ERROR: Unknown Avards mode %d", avardsData.Mode); } } } else { if (avardsData.Mode > 0 && avardsData.ModeString) { xs -= (pFontLanguage->Width(avardsData.ModeString) + SmallGap); osd->DrawText(xs, top + SmallGap , avardsData.ModeString, Theme.Color(clrSymbolActive), Theme.Color(clrBottomBg), pFontLanguage, pFontLanguage->Width(avardsData.ModeString), bottom - SmallGap); } } } } #endif return xs; } int cSkinEnigmaBaseOsd::FixWidth(int w, int bpp, bool enlarge /* = true */) { int a = 8 / bpp; int r = w & (a - 1); if (r == 0) return w; return enlarge ? (w + a -r) : (w - r); } // --- cSkinEnigma ---------------------------------------------------------- cSkinEnigma::cSkinEnigma() : cSkin("EnigmaNG", &::Theme) { // Get the "classic" skin to be used as fallback skin if any of the OSD // menu fails to open. skinFallback = Skins.First(); for (cSkin *Skin = Skins.First(); Skin; Skin = Skins.Next(Skin)) { if (strcmp(Skin->Name(), "classic") == 0) { skinFallback = Skin; break; } } } const char *cSkinEnigma::Description(void) { return tr("EnigmaNG"); } cSkinDisplayChannel *cSkinEnigma::DisplayChannel(bool WithInfo) { try { return new cSkinEnigmaDisplayChannel(WithInfo); } catch(...) { return skinFallback->DisplayChannel(WithInfo); } } cSkinDisplayMenu *cSkinEnigma::DisplayMenu(void) { try { return new cSkinEnigmaDisplayMenu; } catch (...) { return skinFallback->DisplayMenu(); } } cSkinDisplayReplay *cSkinEnigma::DisplayReplay(bool ModeOnly) { try { return new cSkinEnigmaDisplayReplay(ModeOnly); } catch (...) { return skinFallback->DisplayReplay(ModeOnly); } } cSkinDisplayVolume *cSkinEnigma::DisplayVolume(void) { try { return new cSkinEnigmaDisplayVolume; } catch (...) { return skinFallback->DisplayVolume(); } } cSkinDisplayTracks *cSkinEnigma::DisplayTracks(const char *Title, int NumTracks, const char *const *Tracks) { try { return new cSkinEnigmaDisplayTracks(Title, NumTracks, Tracks); } catch (...) { return skinFallback->DisplayTracks(Title, NumTracks, Tracks); } } cSkinDisplayMessage *cSkinEnigma::DisplayMessage(void) { try { return new cSkinEnigmaDisplayMessage; } catch (...) { return skinFallback->DisplayMessage(); } } // vim:et:sw=2:ts=2: vdr-plugin-skinenigmang-0.1.5/enigma.h000066400000000000000000000020141435005021200176520ustar00rootroot00000000000000/* * enigma.h: 'EnigmaNG' skin for the Video Disk Recorder * */ #ifndef __ENIGMA_H #define __ENIGMA_H #include "common.h" #include #include class cSkinEnigma : public cSkin { private: cSkin *skinFallback; public: cSkinEnigma(); 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); }; // interface for common functions class cSkinEnigmaBaseOsd { protected: cOsd *osd; bool HasChannelTimerRecording(const cChannel *Channel); int DrawStatusSymbols(int x0, int xs, int top, int bottom, const cChannel *Channel = NULL); int FixWidth(int w, int bpp, bool enlarge = true); }; #endif //__ENIGMA_H // vim:et:sw=2:ts=2: vdr-plugin-skinenigmang-0.1.5/font.c000066400000000000000000000024271435005021200173630ustar00rootroot00000000000000/* * font.c: 'EnigmaNG' skin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * * Taken from GraphTFT */ #include "common.h" #include "font.h" #include #include cGraphtftFont::cGraphtftFont() { } cGraphtftFont::~cGraphtftFont() { Clear(); } const cFont* cGraphtftFont::GetFont(const char *Filename, int Size, int Width) { if (Filename == NULL) return NULL; if (Size < MINFONTSIZE) Size = MINFONTSIZE; if (Width == 0) Width = 100; char *cachename = NULL; if (-1 != asprintf(&cachename, "%s_%d_%d", Filename, Size, Width)) { string CacheName = cachename; free(cachename); cachename = NULL; if (_cache.find(CacheName) != _cache.end()) return _cache[CacheName]; debug("cGraphtftFont::Load() CREATING FONT %s size=%d width=%d", Filename, Size, Width); cFont *newFont = cFont::CreateFont(Filename, Size, Width > 0 ? (Size * Width / 100) : 0); if (newFont) { _cache[CacheName] = newFont; return newFont; } } error("ERROR: EnigmaNG: Couldn't load font %s:%d", Filename, Size); return NULL; } void cGraphtftFont::Clear() { cache_map::iterator it = _cache.begin(); for (; it != _cache.end(); ++it) delete((*it).second); _cache.clear(); } vdr-plugin-skinenigmang-0.1.5/font.h000066400000000000000000000013111435005021200173570ustar00rootroot00000000000000/* * font.h: 'EnigmaNG' skin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * * Taken from GraphTFT */ #ifndef VDR__GRAPHTFTFONT_H #define VDR__GRAPHTFTFONT_H #include "common.h" #include #include #include FT_FREETYPE_H #include #include #ifndef MINFONTSIZE #define MINFONTSIZE 10 #endif using std::map; using std::string; class cGraphtftFont { private: typedef map cache_map; public: cGraphtftFont(); ~cGraphtftFont(); const cFont* GetFont(const char *Filename, int Size, int Width = 0); void Clear(); private: cache_map _cache; }; #endif // VDR__GRAPHTFTFONT_H vdr-plugin-skinenigmang-0.1.5/logo.c000066400000000000000000000155271435005021200173620ustar00rootroot00000000000000/* * logo.c: 'EnigmaNG' skin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #include "common.h" #include "bitmap.h" #include "config.h" #include "logo.h" #include cEnigmaLogoCache EnigmaLogoCache(0); cEnigmaLogoCache::cEnigmaLogoCache(unsigned int cacheSizeP) :cacheSizeM(cacheSizeP), bitmapM(NULL) { #ifdef HAVE_IMAGEMAGICK bmpImage = new cBitmap(8, 8, 1); cOSDImageBitmap::Init(); #endif } cEnigmaLogoCache::~cEnigmaLogoCache() { #ifdef HAVE_IMAGEMAGICK delete bmpImage; #endif // let's flush the cache Flush(); } bool cEnigmaLogoCache::Resize(unsigned int cacheSizeP) { debug("cPluginSkinEnigma::Resize(%d)", cacheSizeP); // flush cache only if it's smaller than before if (cacheSizeP < cacheSizeM) { Flush(); } // resize current cache cacheSizeM = cacheSizeP; return true; } bool cEnigmaLogoCache::DrawEventImage(const cEvent *Event, int x, int y, int w, int h, int c, cOsd *osd) { if (Event == NULL || osd == NULL) return false; char *strFilename = NULL; int rc = false; if (-1 != asprintf(&strFilename, "%s/%d_0.%s", EnigmaConfig.GetImagesDir(), Event->EventID(), EnigmaConfig.GetImageExtension())) { rc = DrawImage(strFilename, x, y, w, h, c, osd); free (strFilename); } return rc; } bool cEnigmaLogoCache::DrawRecordingImage(const cRecording *Recording, int x, int y, int w, int h, int c, cOsd *osd) { if (Recording == NULL || osd == NULL) return false; char *strFilename = NULL; int rc = false; if (-1 != asprintf(&strFilename, "%s/%s_0.%s", Recording->FileName(), RECORDING_COVER, EnigmaConfig.GetImageExtension())) { rc = DrawImage(strFilename, x, y, w, h, c, osd); free (strFilename); } return rc; } bool cEnigmaLogoCache::DrawImage(const char *fileNameP, int x, int y, int w, int h, int c, cOsd *osd) { if (fileNameP== NULL || osd == NULL) return false; struct stat stbuf; if (lstat(fileNameP, &stbuf) != 0) { error("cPluginSkinEnigma::LoadImage(%s) FILE NOT FOUND", fileNameP); bitmapM = NULL; return false; } #ifdef HAVE_IMAGEMAGICK bitmapM = NULL; return image.DrawImage(fileNameP, x, y, w, h, c, osd); #else int rc = LoadXpm(fileNameP, w, h); if (rc) osd->DrawBitmap(x, y, *bitmapM); //TODO? return rc; #endif } bool cEnigmaLogoCache::LoadChannelLogo(const cChannel *Channel) { if (Channel == NULL) return false; bool fFoundLogo = false; const char *logoname = NULL; char *strLogo = NULL; char *filename = NULL; char *strChannelID = EnigmaConfig.useChannelId && !Channel->GroupSep() ? strdup(*Channel->GetChannelID().ToString()) : NULL; logoname = EnigmaConfig.useChannelId && !Channel->GroupSep() ? strChannelID : Channel->Name(); if (logoname == NULL) goto leave; strLogo = strreplace(strdup(logoname), '/', '~'); if (strLogo == NULL) goto leave; filename = (char *)malloc(strlen(strLogo) + 20 /* should be enough for folder */); if (filename == NULL) goto leave; strcpy(filename, "logos/"); strcat(filename, strLogo); if (!(fFoundLogo = Load(filename, EnigmaConfig.channelLogoWidth, EnigmaConfig.channelLogoHeight))) { fFoundLogo = Load("logos/no_logo", EnigmaConfig.channelLogoWidth, EnigmaConfig.channelLogoHeight); //TODO? different default logo for channel/group? } leave: free(filename); free(strLogo); free(strChannelID); return fFoundLogo; } bool cEnigmaLogoCache::LoadSymbol(const char *fileNameP) { return Load(fileNameP, SymbolWidth, SymbolHeight); } bool cEnigmaLogoCache::LoadIcon(const char *fileNameP) { return Load(fileNameP, IconWidth, IconHeight); } bool cEnigmaLogoCache::Load(const char *fileNameP, int w, int h) { if (fileNameP == NULL) return false; char *strFilename = NULL; if (-1 == asprintf(&strFilename, "%s/%s.xpm", EnigmaConfig.GetLogoDir(), fileNameP)) return false; debug("cPluginSkinEnigma::Load(%s)", strFilename); // does the logo exist already in map std::map < std::string, cBitmap * >::iterator i = cacheMapM.find(strFilename); if (i != cacheMapM.end()) { // yes - cache hit! debug("cPluginSkinEnigma::Load() CACHE HIT!"); // check if logo really exist if (i->second == NULL) { debug("cPluginSkinEnigma::Load() EMPTY"); // empty logo in cache free(strFilename); return false; } bitmapM = i->second; } else { // no - cache miss! debug("cPluginSkinEnigma::Load() CACHE MISS!"); // try to load xpm logo if (!LoadXpm(strFilename, w, h)) { free(strFilename); return false; } // check if cache is active if (cacheSizeM) { // update map if (cacheMapM.size() >= cacheSizeM) { // cache full - remove first debug("cPluginSkinEnigma::Load() DELETE"); if (cacheMapM.begin()->second != NULL) { // logo exists - delete it cBitmap *bmp = cacheMapM.begin()->second; DELETENULL(bmp); } // erase item cacheMapM.erase(cacheMapM.begin()); } // insert logo into map debug("cPluginSkinEnigma::Load() INSERT(%s)", strFilename); cacheMapM.insert(std::make_pair(strFilename, bitmapM)); } // check if logo really exist if (bitmapM == NULL) { debug("cPluginSkinEnigma::Load() EMPTY"); // empty logo in cache free(strFilename); return false; } } free(strFilename); return true; } cBitmap & cEnigmaLogoCache::Get(void) { return *bitmapM; } bool cEnigmaLogoCache::LoadXpm(const char *fileNameP, int w, int h) { if (fileNameP == NULL) return false; cBitmap *bmp = new cBitmap(1, 1, 1); // create absolute filename debug("cPluginSkinEnigma::LoadXpm(%s)", fileNameP); // check validity if (access(fileNameP, R_OK) == 0) { if (bmp->LoadXpm(fileNameP)) { if ((bmp->Width() <= w) && (bmp->Height() <= h)) { debug("cPluginSkinEnigma::LoadXpm(%s) LOGO FOUND", fileNameP); // assign bitmap bitmapM = bmp; return true; } else { // wrong size error("cPluginSkinEnigma::LoadXpm(%s) LOGO HAS WRONG SIZE %d/%d (%d/%d)", fileNameP, bmp->Width(), bmp->Height(), w, h); } } else { // bmp->LoadXpm() failed error("cPluginSkinEnigma::LoadXpm(%s) VDR can't load logo", fileNameP); } } else { // no xpm logo found error("cPluginSkinEnigma::LoadXpm(%s) LOGO NOT FOUND/READABLE (%m)", fileNameP); } delete bmp; bitmapM = NULL; return false; } bool cEnigmaLogoCache::Flush(void) { debug("cPluginSkinEnigma::Flush()"); // check if map is empty if (!cacheMapM.empty()) { debug("cPluginSkinEnigma::Flush() NON-EMPTY"); // delete bitmaps and clear map for (std::map::iterator i = cacheMapM.begin(); i != cacheMapM.end(); ++i) { delete((*i).second); } cacheMapM.clear(); // nullify bitmap pointer bitmapM = NULL; } return true; } // vim:et:sw=2:ts=2: vdr-plugin-skinenigmang-0.1.5/logo.h000066400000000000000000000030731435005021200173600ustar00rootroot00000000000000/* * logo.h: 'EnigmaNG' skin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __SKINENIGMA_LOGO_H #define __SKINENIGMA_LOGO_H #include "common.h" #ifdef HAVE_IMAGEMAGICK #include "bitmap.h" #endif #include #include #include #include #include // size of icons, e.g. icons top right in the main menu... #define IconWidth 80 #define IconHeight 80 // size of symbols, e.g. the flags #define SymbolWidth 27 #define SymbolHeight 18 class cEnigmaLogoCache { private: bool fImageRequested; unsigned int cacheSizeM; cBitmap *bitmapM; #ifdef HAVE_IMAGEMAGICK cOSDImageBitmap image; cBitmap *bmpImage; #endif std::map cacheMapM; bool DrawImage(const char *fileNameP, int x, int y, int w, int h, int c, cOsd *osd); bool LoadXpm(const char *fileNameP, int w, int h); bool Load(const char *fileNameP, int w, int h); public: cEnigmaLogoCache(unsigned int cacheSizeP); ~cEnigmaLogoCache(); bool Resize(unsigned int cacheSizeP); bool DrawEventImage(const cEvent *Event, int x, int y, int w, int h, int c, cOsd *osd); bool DrawRecordingImage(const cRecording *Recording, int x, int y, int w, int h, int c, cOsd *osd); bool LoadChannelLogo(const cChannel *Channel); bool LoadSymbol(const char *fileNameP); bool LoadIcon(const char *fileNameP); cBitmap& Get(void); bool Flush(void); }; extern cEnigmaLogoCache EnigmaLogoCache; #endif // __SKINENIGMA_LOGO_H // vim:et:sw=2:ts=2: vdr-plugin-skinenigmang-0.1.5/po/000077500000000000000000000000001435005021200166625ustar00rootroot00000000000000vdr-plugin-skinenigmang-0.1.5/po/ca_ES.po000066400000000000000000000174441435005021200202060ustar00rootroot00000000000000# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Marc Rovira Vall , 2003 # Ramon Roca , 2003 # Jordi Vilà , 2003 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-08-24 17:33+0200\n" "PO-Revision-Date: 2010-10-23 22:43+0100\n" "Last-Translator: Innocent De Marchi \n" "Language-Team: \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" msgid "Free-To-Air" msgstr "Free-To-Air" msgid "encrypted" msgstr "encritat" msgid "*** Invalid Channel ***" msgstr "*** Canal no vàlid ***" msgid "WARNING" msgstr "PERILL" msgid "Timer conflict" msgstr "Conflicte d'hora" msgid "Timer conflicts" msgstr "Conflictes d'hores" msgid "TIMERS" msgstr "HORES" msgid "min" msgstr "mínim" msgid "Content: " msgstr "Contingut:" msgid "Video" msgstr "Vídeo" msgid "Audio" msgstr "Audio" msgid "Subtitles" msgstr "Subtitols" msgid "RERUNS OF THIS SHOW" msgstr "REPETICIONS D'AQUEST ESPECTACLE" msgid "Size" msgstr "Tamany" msgid "cut" msgstr "talla" msgid "Length" msgstr "Longitud" msgid "Format" msgstr "Format" msgid "Est. bitrate" msgstr "Estat de la tasa de bits" msgid "Auxiliary information" msgstr "Informació auxiliar" msgid "Mute" msgstr "Silenci" msgid "Volume" msgstr "Volumen" msgid "EnigmaNG" msgstr "EnigmaNG" msgid "TrueType Font" msgstr "Font TrueType" msgid "Default OSD Font" msgstr "Font OSD per defecte" msgid "Default Fixed Size Font" msgstr "Font de mida fixa per defecte" msgid "Default Small Font" msgstr "Font petite per defecte" msgid "General" msgstr "General" msgid "Logos & Symbols" msgstr "Emblemes i simbols" msgid "Animated Text" msgstr "Texte animad" msgid "Fonts" msgstr "Fonts" msgid "EPGSearch" msgstr "EPGSearch" msgid "elapsed" msgstr "transcorregut" msgid "remaining" msgstr "falten" msgid "percent" msgstr "per cent" msgid "elapsed/remaining" msgstr "transcorregut/falten" msgid "never" msgstr "mai" msgid "use size.vdr only" msgstr "fer servir només tamany vdr" msgid "always" msgstr "sempre" msgid "Last line" msgstr "Darrera línia" msgid "Help buttons" msgstr "Botons d'ajuda" msgid "Free last line" msgstr "Darrera línia lliure" msgid "if required" msgstr "si és necessari" msgid "Try 8bpp single area" msgstr "Seleccioneu un àrea simple 8bpp" msgid "Round corners" msgstr "Cantons redons" msgid "Full title width" msgstr "Títol d'amplada completa" msgid "Show VPS" msgstr "Mostra VPS" msgid "Dynamic OSD size" msgstr "Mida OSD dinàmique" msgid "Menu OSD" msgstr "Menú oSD" msgid "Show info area in main menu" msgstr "Mostra l'àrea d'informació en el menú principal" msgid " Min width of info area" msgstr "Amplada mínima de l'àrea d'informació" msgid "Show messages in menu on" msgstr "Mostra els missatges en el menú activat" msgid "Show scrollbar in menu" msgstr "Mostra barres de desplaçament en el menú" msgid "EPG & Recording Details OSD" msgstr "EPG y detalls de gravació OSD" msgid "Show auxiliary information" msgstr "Mostra la informació auxiliar" msgid "Show recording's size" msgstr "Mostra la mida de la gravació" msgid "Channel Info OSD" msgstr "Canal d'informació OSD" msgid "Show remaining/elapsed time" msgstr "Mostra el temps restant/transcorregut" msgid "Width of progress bar" msgstr "" msgid "Show signal info" msgstr "Mostra la senyal d'informació" msgid " Width of signal info" msgstr "" msgid "Show CA system as text" msgstr "Mostra el sistema CA com a text" msgid "Show Category - Genre / Contents" msgstr "" msgid "pixel algo" msgstr "pixel algo" msgid "ratio algo" msgstr "raó algo" msgid "zoom image" msgstr "zoom de la imatge" msgid "only if new mail present" msgstr "només si hi ha nou correu" msgid "active only" msgstr "només actiu" msgid "Flushing channel logo cache..." msgstr "Flushing channel logo cache..." msgid "Show symbols" msgstr "Mostra els símbols" msgid " Show symbols in menu" msgstr " Mostra els símbols en el menú" msgid " Show symbols in replay" msgstr " Mostra els símbols en la reproducció" msgid " Show symbols in messages" msgstr " Mostra els símbols en els missatges" msgid " Show symbols in audio" msgstr " Mostra els símbols a en el so" msgid "Colored status symbols in EPG details" msgstr "Símbols d'estat en color en els detalls EPG" msgid "Show symbols in lists" msgstr "Mostra símbols a les llistes" msgid "Show progressbar in lists" msgstr "Mostra la barra de progrés a les llistes" msgid "Show marker in lists" msgstr "Mostra les marques a les llistes" msgid "Show status symbols" msgstr "Mostra els símbols d'estat" msgid " Show flags" msgstr " Mostra les marques" msgid " Show WSS mode symbols" msgstr " Mostra el mode de símbols WSS" msgid " Show mail icon" msgstr " Mostra els icones de correu" msgid "Show event/recording images" msgstr "Mostra les imatges d'esdeveniments/registre" msgid " Resize images" msgstr " Redimensiona imatges" msgid " Image width" msgstr " Amplada de la imatge" msgid " Image height" msgstr " Alçada de la imatge" msgid " Image format" msgstr " Format de la imatge" msgid "Show channel logos" msgstr "Mostra els logos del canal" msgid " Identify channel by" msgstr " Identifica el canal per" msgid "name" msgstr "nom" msgid "data" msgstr "data" msgid "Channel logo cache size" msgstr "MIda provisional del logo del canal" msgid "Button$Flush cache" msgstr "Botons$Flush cache" msgid "left and right" msgstr "esquerra i dreta" msgid "to the left" msgstr "a l'esquerra" msgid "Enable" msgstr "Activat" msgid " Scroll OSD title" msgstr " Mou el títol OSD" msgid " Scroll info area" msgstr " Mou l'àrea d'informació" msgid " Scroll active list items" msgstr " Mou la llista d'ítems actius" msgid " Scroll other items" msgstr " Mou altres ítems" msgid " Scroll behaviour" msgstr " Mou els comportaments" msgid " Scroll delay (ms)" msgstr " Mou el retard (ms)" msgid " Scroll pause (ms)" msgstr " Mou la pausa (ms)" msgid " Blink pause (ms)" msgstr " Pausa \"Blink\" (ms)" msgid "Name" msgstr "Nom" msgid "Width" msgstr "Amplada" msgid "No TrueType fonts installed!" msgstr "No hi ha fonts TrueType instal·lades" msgid "Fixed Font" msgstr "Font de mida fitxe" msgid "Button$Set" msgstr "Button$Set" msgid "OSD title" msgstr "Títol OSD" msgid "Messages" msgstr "MIssatges" msgid "Date" msgstr "Data" msgid "Help keys" msgstr "Tecles d'ajuda" msgid "Channelinfo: title" msgstr "Canal d'informació: títol" msgid "Channelinfo: subtitle" msgstr "Canal d'informació: sub-títol" msgid "Channelinfo: language" msgstr "Canal d'informació: idioma" msgid "List items" msgstr "Llista d'ítems" msgid "Info area: timers title" msgstr "Àrea d'informació: títols de temporitzadors" msgid "Info area: timers text" msgstr "Àrea d'informació: text de temporitzadors" msgid "Info area: warning title" msgstr "Àrea d'informació: títol d'avís" msgid "Info area: warning text" msgstr "Àrea d'informació: text d'avís" msgid "Details: title" msgstr "Detalls: títol" msgid "Details: subtitle" msgstr "Detalls: sub-titol" msgid "Details: date" msgstr "Detalls: data" msgid "Details: text" msgstr "Detalls: texte" msgid "Replay: times" msgstr "Reproducció: temps" msgid "if exists" msgstr "si existeix" msgid "Number of Reruns" msgstr "Nombre de repeticions" msgid "Use Subtitle for reruns" msgstr "Fer servir sub-títols per les repeticions " msgid "Show timer conflicts" msgstr "Mostra els conflictes de temps" msgid "EnigmaNG skin" msgstr "EnigmaNG skin" msgid "Channel:" msgstr "Canal:" msgid "Search pattern:" msgstr "Patró de recerca:" msgid "Timer check" msgstr "Verificació de temps" msgid "No timer check" msgstr "Sense verificació de temps" vdr-plugin-skinenigmang-0.1.5/po/cs_CZ.po000066400000000000000000000123271435005021200202300ustar00rootroot00000000000000# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Vladimír Bárta , 2006 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-08-24 17:33+0200\n" "PO-Revision-Date: 2007-12-18 08:11+0100\n" "Last-Translator: Vladimír Bárta \n" "Language-Team: \n" "Language: cz\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-2\n" "Content-Transfer-Encoding: 8bit\n" msgid "Free-To-Air" msgstr "" msgid "encrypted" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "WARNING" msgstr "" msgid "Timer conflict" msgstr "" msgid "Timer conflicts" msgstr "" msgid "TIMERS" msgstr "" msgid "min" msgstr "" msgid "Content: " msgstr "" msgid "Video" msgstr "" msgid "Audio" msgstr "" msgid "Subtitles" msgstr "" msgid "RERUNS OF THIS SHOW" msgstr "" msgid "Size" msgstr "" msgid "cut" msgstr "" msgid "Length" msgstr "" msgid "Format" msgstr "" msgid "Est. bitrate" msgstr "" msgid "Auxiliary information" msgstr "" msgid "Mute" msgstr "" msgid "Volume" msgstr "" msgid "EnigmaNG" msgstr "" msgid "TrueType Font" msgstr "" msgid "Default OSD Font" msgstr "" msgid "Default Fixed Size Font" msgstr "" msgid "Default Small Font" msgstr "" msgid "General" msgstr "" msgid "Logos & Symbols" msgstr "" msgid "Animated Text" msgstr "" msgid "Fonts" msgstr "" msgid "EPGSearch" msgstr "" msgid "elapsed" msgstr "" msgid "remaining" msgstr "" msgid "percent" msgstr "" msgid "elapsed/remaining" msgstr "" msgid "never" msgstr "" msgid "use size.vdr only" msgstr "" msgid "always" msgstr "" msgid "Last line" msgstr "" msgid "Help buttons" msgstr "" msgid "Free last line" msgstr "" msgid "if required" msgstr "" msgid "Try 8bpp single area" msgstr "" msgid "Round corners" msgstr "" msgid "Full title width" msgstr "" msgid "Show VPS" msgstr "" msgid "Dynamic OSD size" msgstr "" msgid "Menu OSD" msgstr "" msgid "Show info area in main menu" msgstr "" msgid " Min width of info area" msgstr "" msgid "Show messages in menu on" msgstr "" msgid "Show scrollbar in menu" msgstr "" msgid "EPG & Recording Details OSD" msgstr "" msgid "Show auxiliary information" msgstr "" msgid "Show recording's size" msgstr "" msgid "Channel Info OSD" msgstr "" msgid "Show remaining/elapsed time" msgstr "" msgid "Width of progress bar" msgstr "" msgid "Show signal info" msgstr "" msgid " Width of signal info" msgstr "" msgid "Show CA system as text" msgstr "" msgid "Show Category - Genre / Contents" msgstr "" msgid "pixel algo" msgstr "" msgid "ratio algo" msgstr "" msgid "zoom image" msgstr "" msgid "only if new mail present" msgstr "" msgid "active only" msgstr "" msgid "Flushing channel logo cache..." msgstr "" msgid "Show symbols" msgstr "" msgid " Show symbols in menu" msgstr "" msgid " Show symbols in replay" msgstr "" msgid " Show symbols in messages" msgstr "" msgid " Show symbols in audio" msgstr "" msgid "Colored status symbols in EPG details" msgstr "" msgid "Show symbols in lists" msgstr "" msgid "Show progressbar in lists" msgstr "" msgid "Show marker in lists" msgstr "" msgid "Show status symbols" msgstr "" msgid " Show flags" msgstr "" msgid " Show WSS mode symbols" msgstr "" msgid " Show mail icon" msgstr "" msgid "Show event/recording images" msgstr "" msgid " Resize images" msgstr "" msgid " Image width" msgstr "" msgid " Image height" msgstr "" msgid " Image format" msgstr "" msgid "Show channel logos" msgstr "" msgid " Identify channel by" msgstr "" msgid "name" msgstr "" msgid "data" msgstr "" msgid "Channel logo cache size" msgstr "" msgid "Button$Flush cache" msgstr "" msgid "left and right" msgstr "" msgid "to the left" msgstr "" msgid "Enable" msgstr "" msgid " Scroll OSD title" msgstr "" msgid " Scroll info area" msgstr "" msgid " Scroll active list items" msgstr "" msgid " Scroll other items" msgstr "" msgid " Scroll behaviour" msgstr "" msgid " Scroll delay (ms)" msgstr "" msgid " Scroll pause (ms)" msgstr "" msgid " Blink pause (ms)" msgstr "" msgid "Name" msgstr "" msgid "Width" msgstr "" msgid "No TrueType fonts installed!" msgstr "" msgid "Fixed Font" msgstr "" msgid "Button$Set" msgstr "" msgid "OSD title" msgstr "" msgid "Messages" msgstr "" msgid "Date" msgstr "" msgid "Help keys" msgstr "" msgid "Channelinfo: title" msgstr "" msgid "Channelinfo: subtitle" msgstr "" msgid "Channelinfo: language" msgstr "" msgid "List items" msgstr "" msgid "Info area: timers title" msgstr "" msgid "Info area: timers text" msgstr "" msgid "Info area: warning title" msgstr "" msgid "Info area: warning text" msgstr "" msgid "Details: title" msgstr "" msgid "Details: subtitle" msgstr "" msgid "Details: date" msgstr "" msgid "Details: text" msgstr "" msgid "Replay: times" msgstr "" msgid "if exists" msgstr "" msgid "Number of Reruns" msgstr "" msgid "Use Subtitle for reruns" msgstr "" msgid "Show timer conflicts" msgstr "" msgid "EnigmaNG skin" msgstr "" msgid "Channel:" msgstr "" msgid "Search pattern:" msgstr "" msgid "Timer check" msgstr "" msgid "No timer check" msgstr "" vdr-plugin-skinenigmang-0.1.5/po/da_DK.po000066400000000000000000000123001435005021200201600ustar00rootroot00000000000000# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Mogens Elneff , 2004 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-08-24 17:33+0200\n" "PO-Revision-Date: 2007-12-18 08:11+0100\n" "Last-Translator: Mogens Elneff \n" "Language-Team: \n" "Language: dk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-15\n" "Content-Transfer-Encoding: 8bit\n" msgid "Free-To-Air" msgstr "" msgid "encrypted" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "WARNING" msgstr "" msgid "Timer conflict" msgstr "" msgid "Timer conflicts" msgstr "" msgid "TIMERS" msgstr "" msgid "min" msgstr "" msgid "Content: " msgstr "" msgid "Video" msgstr "" msgid "Audio" msgstr "" msgid "Subtitles" msgstr "" msgid "RERUNS OF THIS SHOW" msgstr "" msgid "Size" msgstr "" msgid "cut" msgstr "" msgid "Length" msgstr "" msgid "Format" msgstr "" msgid "Est. bitrate" msgstr "" msgid "Auxiliary information" msgstr "" msgid "Mute" msgstr "" msgid "Volume" msgstr "" msgid "EnigmaNG" msgstr "" msgid "TrueType Font" msgstr "" msgid "Default OSD Font" msgstr "" msgid "Default Fixed Size Font" msgstr "" msgid "Default Small Font" msgstr "" msgid "General" msgstr "" msgid "Logos & Symbols" msgstr "" msgid "Animated Text" msgstr "" msgid "Fonts" msgstr "" msgid "EPGSearch" msgstr "" msgid "elapsed" msgstr "" msgid "remaining" msgstr "" msgid "percent" msgstr "" msgid "elapsed/remaining" msgstr "" msgid "never" msgstr "" msgid "use size.vdr only" msgstr "" msgid "always" msgstr "" msgid "Last line" msgstr "" msgid "Help buttons" msgstr "" msgid "Free last line" msgstr "" msgid "if required" msgstr "" msgid "Try 8bpp single area" msgstr "" msgid "Round corners" msgstr "" msgid "Full title width" msgstr "" msgid "Show VPS" msgstr "" msgid "Dynamic OSD size" msgstr "" msgid "Menu OSD" msgstr "" msgid "Show info area in main menu" msgstr "" msgid " Min width of info area" msgstr "" msgid "Show messages in menu on" msgstr "" msgid "Show scrollbar in menu" msgstr "" msgid "EPG & Recording Details OSD" msgstr "" msgid "Show auxiliary information" msgstr "" msgid "Show recording's size" msgstr "" msgid "Channel Info OSD" msgstr "" msgid "Show remaining/elapsed time" msgstr "" msgid "Width of progress bar" msgstr "" msgid "Show signal info" msgstr "" msgid " Width of signal info" msgstr "" msgid "Show CA system as text" msgstr "" msgid "Show Category - Genre / Contents" msgstr "" msgid "pixel algo" msgstr "" msgid "ratio algo" msgstr "" msgid "zoom image" msgstr "" msgid "only if new mail present" msgstr "" msgid "active only" msgstr "" msgid "Flushing channel logo cache..." msgstr "" msgid "Show symbols" msgstr "" msgid " Show symbols in menu" msgstr "" msgid " Show symbols in replay" msgstr "" msgid " Show symbols in messages" msgstr "" msgid " Show symbols in audio" msgstr "" msgid "Colored status symbols in EPG details" msgstr "" msgid "Show symbols in lists" msgstr "" msgid "Show progressbar in lists" msgstr "" msgid "Show marker in lists" msgstr "" msgid "Show status symbols" msgstr "" msgid " Show flags" msgstr "" msgid " Show WSS mode symbols" msgstr "" msgid " Show mail icon" msgstr "" msgid "Show event/recording images" msgstr "" msgid " Resize images" msgstr "" msgid " Image width" msgstr "" msgid " Image height" msgstr "" msgid " Image format" msgstr "" msgid "Show channel logos" msgstr "" msgid " Identify channel by" msgstr "" msgid "name" msgstr "" msgid "data" msgstr "" msgid "Channel logo cache size" msgstr "" msgid "Button$Flush cache" msgstr "" msgid "left and right" msgstr "" msgid "to the left" msgstr "" msgid "Enable" msgstr "" msgid " Scroll OSD title" msgstr "" msgid " Scroll info area" msgstr "" msgid " Scroll active list items" msgstr "" msgid " Scroll other items" msgstr "" msgid " Scroll behaviour" msgstr "" msgid " Scroll delay (ms)" msgstr "" msgid " Scroll pause (ms)" msgstr "" msgid " Blink pause (ms)" msgstr "" msgid "Name" msgstr "" msgid "Width" msgstr "" msgid "No TrueType fonts installed!" msgstr "" msgid "Fixed Font" msgstr "" msgid "Button$Set" msgstr "" msgid "OSD title" msgstr "" msgid "Messages" msgstr "" msgid "Date" msgstr "" msgid "Help keys" msgstr "" msgid "Channelinfo: title" msgstr "" msgid "Channelinfo: subtitle" msgstr "" msgid "Channelinfo: language" msgstr "" msgid "List items" msgstr "" msgid "Info area: timers title" msgstr "" msgid "Info area: timers text" msgstr "" msgid "Info area: warning title" msgstr "" msgid "Info area: warning text" msgstr "" msgid "Details: title" msgstr "" msgid "Details: subtitle" msgstr "" msgid "Details: date" msgstr "" msgid "Details: text" msgstr "" msgid "Replay: times" msgstr "" msgid "if exists" msgstr "" msgid "Number of Reruns" msgstr "" msgid "Use Subtitle for reruns" msgstr "" msgid "Show timer conflicts" msgstr "" msgid "EnigmaNG skin" msgstr "" msgid "Channel:" msgstr "" msgid "Search pattern:" msgstr "" msgid "Timer check" msgstr "" msgid "No timer check" msgstr "" vdr-plugin-skinenigmang-0.1.5/po/de_DE.po000066400000000000000000000166021435005021200201670ustar00rootroot00000000000000# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Klaus Schmidinger , 2000 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-08-24 17:33+0200\n" "PO-Revision-Date: 2007-12-18 08:11+0100\n" "Last-Translator: Andreas Mair \n" "Language-Team: \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-15\n" "Content-Transfer-Encoding: 8bit\n" msgid "Free-To-Air" msgstr "Free-To-Air" msgid "encrypted" msgstr "verschlüsselt" msgid "*** Invalid Channel ***" msgstr "*** Ungültiger Kanal ***" msgid "WARNING" msgstr "WARNUNG" msgid "Timer conflict" msgstr "Timerkonflikt" msgid "Timer conflicts" msgstr "Timerkonflikte" msgid "TIMERS" msgstr "TIMER" msgid "min" msgstr "min" msgid "Content: " msgstr "Inhalt: " msgid "Video" msgstr "Video" msgid "Audio" msgstr "Audio" msgid "Subtitles" msgstr "Untertitel" msgid "RERUNS OF THIS SHOW" msgstr "WIEDERHOLUNGEN" msgid "Size" msgstr "Größe" msgid "cut" msgstr "geschnitten" msgid "Length" msgstr "Länge" msgid "Format" msgstr "Format" msgid "Est. bitrate" msgstr "Geschätzte Bitrate" msgid "Auxiliary information" msgstr "Zusatzinformation" msgid "Mute" msgstr "Stumm" msgid "Volume" msgstr "Lautstärke" msgid "EnigmaNG" msgstr "EnigmaNG" msgid "TrueType Font" msgstr "TrueType Schrift" msgid "Default OSD Font" msgstr "Std. OSD Font" msgid "Default Fixed Size Font" msgstr "Std. Schrift mit fester Breite" msgid "Default Small Font" msgstr "Std. kleine Schrift" msgid "General" msgstr "Allgemein" msgid "Logos & Symbols" msgstr "Logos & Symbole" msgid "Animated Text" msgstr "Bewegter Text" msgid "Fonts" msgstr "Fonts" msgid "EPGSearch" msgstr "EPGSearch" msgid "elapsed" msgstr "abgelaufene" msgid "remaining" msgstr "restliche" msgid "percent" msgstr "Prozent" msgid "elapsed/remaining" msgstr "abgelaufene/restliche" msgid "never" msgstr "nie" msgid "use size.vdr only" msgstr "nur size.vdr verwenden" msgid "always" msgstr "immer" msgid "Last line" msgstr "Letzter Zeile" msgid "Help buttons" msgstr "Hilfe Tasten" msgid "Free last line" msgstr "freie letzte Zeile" msgid "if required" msgstr "wenn benötigt" msgid "Try 8bpp single area" msgstr "Einen 8bpp Bereich versuchen" msgid "Round corners" msgstr "Ecken abrunden" msgid "Full title width" msgstr "Volle Titelbreite" msgid "Show VPS" msgstr "VPS anzeigen" msgid "Dynamic OSD size" msgstr "Dynamische OSD-Größe" msgid "Menu OSD" msgstr "Menü OSD" msgid "Show info area in main menu" msgstr "Infobereich im Hauptmenü" msgid " Min width of info area" msgstr " Minimale Infobereich-Breite" msgid "Show messages in menu on" msgstr "Meldungen im Menü über" msgid "Show scrollbar in menu" msgstr "Bildlaufleiste im Menü anzeigen" msgid "EPG & Recording Details OSD" msgstr "EPG- & Aufnahmen-Details OSD" msgid "Show auxiliary information" msgstr "Zusatzinfo anzeigen" msgid "Show recording's size" msgstr "Aufnahmengröße anzeigen" msgid "Channel Info OSD" msgstr "Kanalinfo OSD" msgid "Show remaining/elapsed time" msgstr "Zeige abgel./restl. Zeit" msgid "Width of progress bar" msgstr "Breite der Fortschrittsanzeige" msgid "Show signal info" msgstr "Zeige Signal-Informationen" msgid " Width of signal info" msgstr " Breite der Signal-Informationen" msgid "Show CA system as text" msgstr "CA System als Text anzeigen" msgid "Show Category - Genre / Contents" msgstr "Kategory - Gengre / Inhalt anzeigen" msgid "pixel algo" msgstr "Pixel-Algorithmus" msgid "ratio algo" msgstr "Ratio-Algorithmus" msgid "zoom image" msgstr "Zoomen" msgid "only if new mail present" msgstr "nur bei neuer Mail" msgid "active only" msgstr "nur aktive" msgid "Flushing channel logo cache..." msgstr "Logo-Cache wird geleert..." msgid "Show symbols" msgstr "Symbole anzeigen" msgid " Show symbols in menu" msgstr " Symbole im Menü" msgid " Show symbols in replay" msgstr " Symbole bei der Wiedergabe" msgid " Show symbols in messages" msgstr " Symbole bei den Meldungen" msgid " Show symbols in audio" msgstr " Symbole bei Audio" msgid "Colored status symbols in EPG details" msgstr "Farbige Statussymbole in den EPG-Details" msgid "Show symbols in lists" msgstr "Symbole in Listen" msgid "Show progressbar in lists" msgstr "Fortschrittbalken in Listen anzeigen" msgid "Show marker in lists" msgstr "Symbol vor Listeneinträgen" msgid "Show status symbols" msgstr "Statussymbole anzeigen" msgid " Show flags" msgstr " Fahnen anzeigen" msgid " Show WSS mode symbols" msgstr " Symbol für WSS Modus" msgid " Show mail icon" msgstr " Zeige Mail-Icon" msgid "Show event/recording images" msgstr "Bilder in EPG/Aufnahmendetails" msgid " Resize images" msgstr " Bildberechnung benutzt" msgid " Image width" msgstr " Bildbreite" msgid " Image height" msgstr " Bildhöhe" msgid " Image format" msgstr " Bildformat" msgid "Show channel logos" msgstr "Kanal-Logos anzeigen" msgid " Identify channel by" msgstr " Kanal-Identifikation durch" msgid "name" msgstr "Name" msgid "data" msgstr "ID" msgid "Channel logo cache size" msgstr "Größe des Logo-Caches" msgid "Button$Flush cache" msgstr "Cache leeren" msgid "left and right" msgstr "links und rechts" msgid "to the left" msgstr "nach links" msgid "Enable" msgstr "Verwenden" msgid " Scroll OSD title" msgstr " OSD Titel scrollen" msgid " Scroll info area" msgstr " Infobereich scrollen" msgid " Scroll active list items" msgstr " Aktive Listenzeile scrollen" msgid " Scroll other items" msgstr " Andere Bereiche scrollen" msgid " Scroll behaviour" msgstr " Scroll-Verhalten" msgid " Scroll delay (ms)" msgstr " Scroll-Verzögerung (ms)" msgid " Scroll pause (ms)" msgstr " Scroll-Pause (ms)" msgid " Blink pause (ms)" msgstr " Blink-Pause (ms)" msgid "Name" msgstr "Name" msgid "Width" msgstr "Weite" msgid "No TrueType fonts installed!" msgstr "Keine TrueType Schriften installiert!" msgid "Fixed Font" msgstr "Schrift mit fester Breite" msgid "Button$Set" msgstr "Ändern" msgid "OSD title" msgstr "OSD Titel" msgid "Messages" msgstr "Meldungen" msgid "Date" msgstr "Datum" msgid "Help keys" msgstr "Farb-Tasten" msgid "Channelinfo: title" msgstr "Kanalinfo: Titel" msgid "Channelinfo: subtitle" msgstr "Kanalinfo: Untertitel" msgid "Channelinfo: language" msgstr "Kanalinfo: Sprache" msgid "List items" msgstr "Listen" msgid "Info area: timers title" msgstr "Infobereich: Timer Titel" msgid "Info area: timers text" msgstr "Infobereich: Timer Text" msgid "Info area: warning title" msgstr "Infobereich: Warnung Titel" msgid "Info area: warning text" msgstr "Infobereich: Warnung Text" msgid "Details: title" msgstr "Details: Titel" msgid "Details: subtitle" msgstr "Details: Untertitel" msgid "Details: date" msgstr "Details: Datumszeile" msgid "Details: text" msgstr "Details: Text" msgid "Replay: times" msgstr "Wiedergabe: Zeiten" msgid "if exists" msgstr "wenn vorhanden" msgid "Number of Reruns" msgstr "Anzahl Wiederholungen" msgid "Use Subtitle for reruns" msgstr "Verw. Untertitel für Wdh." msgid "Show timer conflicts" msgstr "Timerkonflikte anzeigen" msgid "EnigmaNG skin" msgstr "EnigmaNG Oberfläche" msgid "Channel:" msgstr "Kanal:" msgid "Search pattern:" msgstr "Suchmuster:" msgid "Timer check" msgstr "Überwachung" msgid "No timer check" msgstr "Ohne Überwachung" vdr-plugin-skinenigmang-0.1.5/po/el_GR.po000066400000000000000000000123171435005021200202160ustar00rootroot00000000000000# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Dimitrios Dimitrakos , 2002 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-08-24 17:33+0200\n" "PO-Revision-Date: 2007-12-18 08:11+0100\n" "Last-Translator: Dimitrios Dimitrakos \n" "Language-Team: \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-7\n" "Content-Transfer-Encoding: 8bit\n" msgid "Free-To-Air" msgstr "" msgid "encrypted" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "WARNING" msgstr "" msgid "Timer conflict" msgstr "" msgid "Timer conflicts" msgstr "" msgid "TIMERS" msgstr "" msgid "min" msgstr "" msgid "Content: " msgstr "" msgid "Video" msgstr "" msgid "Audio" msgstr "" msgid "Subtitles" msgstr "" msgid "RERUNS OF THIS SHOW" msgstr "" msgid "Size" msgstr "" msgid "cut" msgstr "" msgid "Length" msgstr "" msgid "Format" msgstr "" msgid "Est. bitrate" msgstr "" msgid "Auxiliary information" msgstr "" msgid "Mute" msgstr "" msgid "Volume" msgstr "" msgid "EnigmaNG" msgstr "" msgid "TrueType Font" msgstr "" msgid "Default OSD Font" msgstr "" msgid "Default Fixed Size Font" msgstr "" msgid "Default Small Font" msgstr "" msgid "General" msgstr "" msgid "Logos & Symbols" msgstr "" msgid "Animated Text" msgstr "" msgid "Fonts" msgstr "" msgid "EPGSearch" msgstr "" msgid "elapsed" msgstr "" msgid "remaining" msgstr "" msgid "percent" msgstr "" msgid "elapsed/remaining" msgstr "" msgid "never" msgstr "" msgid "use size.vdr only" msgstr "" msgid "always" msgstr "" msgid "Last line" msgstr "" msgid "Help buttons" msgstr "" msgid "Free last line" msgstr "" msgid "if required" msgstr "" msgid "Try 8bpp single area" msgstr "" msgid "Round corners" msgstr "" msgid "Full title width" msgstr "" msgid "Show VPS" msgstr "" msgid "Dynamic OSD size" msgstr "" msgid "Menu OSD" msgstr "" msgid "Show info area in main menu" msgstr "" msgid " Min width of info area" msgstr "" msgid "Show messages in menu on" msgstr "" msgid "Show scrollbar in menu" msgstr "" msgid "EPG & Recording Details OSD" msgstr "" msgid "Show auxiliary information" msgstr "" msgid "Show recording's size" msgstr "" msgid "Channel Info OSD" msgstr "" msgid "Show remaining/elapsed time" msgstr "" msgid "Width of progress bar" msgstr "" msgid "Show signal info" msgstr "" msgid " Width of signal info" msgstr "" msgid "Show CA system as text" msgstr "" msgid "Show Category - Genre / Contents" msgstr "" msgid "pixel algo" msgstr "" msgid "ratio algo" msgstr "" msgid "zoom image" msgstr "" msgid "only if new mail present" msgstr "" msgid "active only" msgstr "" msgid "Flushing channel logo cache..." msgstr "" msgid "Show symbols" msgstr "" msgid " Show symbols in menu" msgstr "" msgid " Show symbols in replay" msgstr "" msgid " Show symbols in messages" msgstr "" msgid " Show symbols in audio" msgstr "" msgid "Colored status symbols in EPG details" msgstr "" msgid "Show symbols in lists" msgstr "" msgid "Show progressbar in lists" msgstr "" msgid "Show marker in lists" msgstr "" msgid "Show status symbols" msgstr "" msgid " Show flags" msgstr "" msgid " Show WSS mode symbols" msgstr "" msgid " Show mail icon" msgstr "" msgid "Show event/recording images" msgstr "" msgid " Resize images" msgstr "" msgid " Image width" msgstr "" msgid " Image height" msgstr "" msgid " Image format" msgstr "" msgid "Show channel logos" msgstr "" msgid " Identify channel by" msgstr "" msgid "name" msgstr "" msgid "data" msgstr "" msgid "Channel logo cache size" msgstr "" msgid "Button$Flush cache" msgstr "" msgid "left and right" msgstr "" msgid "to the left" msgstr "" msgid "Enable" msgstr "" msgid " Scroll OSD title" msgstr "" msgid " Scroll info area" msgstr "" msgid " Scroll active list items" msgstr "" msgid " Scroll other items" msgstr "" msgid " Scroll behaviour" msgstr "" msgid " Scroll delay (ms)" msgstr "" msgid " Scroll pause (ms)" msgstr "" msgid " Blink pause (ms)" msgstr "" msgid "Name" msgstr "" msgid "Width" msgstr "" msgid "No TrueType fonts installed!" msgstr "" msgid "Fixed Font" msgstr "" msgid "Button$Set" msgstr "" msgid "OSD title" msgstr "" msgid "Messages" msgstr "" msgid "Date" msgstr "" msgid "Help keys" msgstr "" msgid "Channelinfo: title" msgstr "" msgid "Channelinfo: subtitle" msgstr "" msgid "Channelinfo: language" msgstr "" msgid "List items" msgstr "" msgid "Info area: timers title" msgstr "" msgid "Info area: timers text" msgstr "" msgid "Info area: warning title" msgstr "" msgid "Info area: warning text" msgstr "" msgid "Details: title" msgstr "" msgid "Details: subtitle" msgstr "" msgid "Details: date" msgstr "" msgid "Details: text" msgstr "" msgid "Replay: times" msgstr "" msgid "if exists" msgstr "" msgid "Number of Reruns" msgstr "" msgid "Use Subtitle for reruns" msgstr "" msgid "Show timer conflicts" msgstr "" msgid "EnigmaNG skin" msgstr "" msgid "Channel:" msgstr "" msgid "Search pattern:" msgstr "" msgid "Timer check" msgstr "" msgid "No timer check" msgstr "" vdr-plugin-skinenigmang-0.1.5/po/es_ES.po000066400000000000000000000172631435005021200202310ustar00rootroot00000000000000# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # bittor from github.com/bittor7x0 , 2008-2022 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-11-02 18:42+0100\n" "PO-Revision-Date: 2008-02-19 17:15+0100\n" "Last-Translator: bittor from github.com/bittor7x0 \n" "Language-Team: \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-15\n" "Content-Transfer-Encoding: 8bit\n" msgid "Free-To-Air" msgstr "sin encriptar" msgid "encrypted" msgstr "encriptado" msgid "*** Invalid Channel ***" msgstr "*** Canal no válido ***" msgid "WARNING" msgstr "AVISO" msgid "Timer conflict" msgstr "Conflicto de programación" msgid "Timer conflicts" msgstr "Conflictos de programación" msgid "TIMERS" msgstr "PROGRAMACIONES" msgid "min" msgstr "min" msgid "Content: " msgstr "Contenido: " msgid "Video" msgstr "Vídeo" msgid "Audio" msgstr "Audio" msgid "Subtitles" msgstr "Subtítulos" msgid "RERUNS OF THIS SHOW" msgstr "REPETICIONES" msgid "Size" msgstr "Tamaño" msgid "cut" msgstr "editado" msgid "Length" msgstr "Duración" msgid "Format" msgstr "Formato" msgid "Est. bitrate" msgstr "Bitrate est." msgid "Auxiliary information" msgstr "Información adicional" msgid "Mute" msgstr "Silenciar" msgid "Volume" msgstr "Volumen" msgid "EnigmaNG" msgstr "EnigmaNG" msgid "TrueType Font" msgstr "Fuente TrueType" msgid "Default OSD Font" msgstr "Fuente OSD defecto" msgid "Default Fixed Size Font" msgstr "Fuente tamaño fijo defecto" msgid "Default Small Font" msgstr "Fuente pequeña defecto" msgid "General" msgstr "General" msgid "Logos & Symbols" msgstr "Logos y símbolos" msgid "Animated Text" msgstr "Texto animado" msgid "Fonts" msgstr "Fuentes" msgid "EPGSearch" msgstr "EPGSearch" msgid "elapsed" msgstr "transcurrido" msgid "remaining" msgstr "restante" msgid "percent" msgstr "porcentaje" msgid "elapsed/remaining" msgstr "transcurrido/restante" msgid "never" msgstr "nunca" msgid "use size.vdr only" msgstr "sólo usar size.vdr" msgid "always" msgstr "siempre" msgid "Last line" msgstr "Última línea" msgid "Help buttons" msgstr "Botones de ayuda" msgid "Free last line" msgstr "Última línea libre" msgid "if required" msgstr "si es necesario" msgid "Try 8bpp single area" msgstr "Probar un área de 8bpp" msgid "Round corners" msgstr "Esquinas redondeadas" msgid "Full title width" msgstr "Ancho completo para título" msgid "Show VPS" msgstr "Mostrar VPS" msgid "Dynamic OSD size" msgstr "Tamaño OSD dinámico" msgid "Menu OSD" msgstr "Menú OSD" msgid "Show info area in main menu" msgstr "Mostrar info en menú principal" msgid " Min width of info area" msgstr " Anchura mín. para la info" msgid "Show messages in menu on" msgstr "Mostrar mensajes en el menú" msgid "Show scrollbar in menu" msgstr "Mostrar barra de scroll en menú" msgid "EPG & Recording Details OSD" msgstr "EPG y detalles de grabación OSD" msgid "Show auxiliary information" msgstr "Mostrar información adicional" msgid "Show recording's size" msgstr "Mostrar tamaño de grabación" msgid "Channel Info OSD" msgstr "Info canal OSD" msgid "Show remaining/elapsed time" msgstr "Mostrar tiempo restante/transcurrido" msgid "Width of progress bar" msgstr "Anchura para barra de progreso" msgid "Show signal info" msgstr "Mostrar info de señal" msgid " Width of signal info" msgstr " Anchura para info de señal" msgid "Show CA system as text" msgstr "Mostrar sistema CA como texto" msgid "Show Category - Genre / Contents" msgstr "Mostrar Categoría - Género / Contenido" msgid "pixel algo" msgstr "Algoritmo píxel" msgid "ratio algo" msgstr "Algoritmo ratio" msgid "zoom image" msgstr "Aumentar imagen" msgid "only if new mail present" msgstr "sólo si hay nuevo correo" msgid "active only" msgstr "sólo activo" msgid "Flushing channel logo cache..." msgstr "Limpiando la caché..." msgid "Show symbols" msgstr "Mostrar símbolos" msgid " Show symbols in menu" msgstr " Mostrar símbolos en menú" msgid " Show symbols in replay" msgstr " Mostrar símbolos en reproducción" msgid " Show symbols in messages" msgstr " Mostrar símbolos en mensajes" msgid " Show symbols in audio" msgstr " Mostrar símbolos en audio" msgid "Colored status symbols in EPG details" msgstr "Símbolos de estado coloreados en la EPG" msgid "Show symbols in lists" msgstr "Mostrar símbolos en listas" msgid "Show progressbar in lists" msgstr "Mostrar barra de progreso en listas" msgid "Show marker in lists" msgstr "Mostrar marcador en listas" msgid "Show status symbols" msgstr "Mostrar símbolos de estado" msgid " Show flags" msgstr " Mostrar banderas" msgid " Show WSS mode symbols" msgstr " Mostrar símbolos modo WSS" msgid " Show mail icon" msgstr " Mostrar icono de correo" msgid "Show event/recording images" msgstr "Mostrar imágenes grabación/suceso" msgid " Resize images" msgstr " Redimensionar imágenes" msgid " Image width" msgstr " Anchura de imagen" msgid " Image height" msgstr " Altura de imagen" msgid " Image format" msgstr " Formato de imagen" msgid "Show channel logos" msgstr "Mostrar logos de los canales" msgid " Identify channel by" msgstr " Identificar el canal por" msgid "name" msgstr "nombre" msgid "data" msgstr "datos" msgid "Channel logo cache size" msgstr "Tamaño de caché para los logos" msgid "Button$Flush cache" msgstr "Limpiar caché" msgid "left and right" msgstr "izquierda y derecha" msgid "to the left" msgstr "a la izquierda" msgid "Enable" msgstr "Activar" msgid " Scroll OSD title" msgstr " Título OSD del scroll" msgid " Scroll info area" msgstr " Scroll para el área info" msgid " Scroll active list items" msgstr " Scroll para la lista activa" msgid " Scroll other items" msgstr " Scroll para otros datos" msgid " Scroll behaviour" msgstr " Comportamiento del scroll" msgid " Scroll delay (ms)" msgstr " Retardo del scroll (ms)" msgid " Scroll pause (ms)" msgstr " Pausa del scroll (ms)" msgid " Blink pause (ms)" msgstr " Pausa del parpadeo (ms)" msgid "Name" msgstr "Nombre" msgid "Width" msgstr "Anchura" msgid "No TrueType fonts installed!" msgstr "¡Ninguna fuente TrueType instalada!" msgid "Fixed Font" msgstr "Fuente Fija" msgid "Button$Set" msgstr "Cambiar" msgid "OSD title" msgstr "Título OSD" msgid "Messages" msgstr "Mensajes" msgid "Date" msgstr "Fecha" msgid "Help keys" msgstr "Botones de ayuda" msgid "Channelinfo: title" msgstr "Info canal: título" msgid "Channelinfo: subtitle" msgstr "Info canal: subtítulo" msgid "Channelinfo: language" msgstr "Info canal: idioma" msgid "List items" msgstr "Listado" msgid "Info area: timers title" msgstr "Área info: título programación" msgid "Info area: timers text" msgstr "Área info: texto programación" msgid "Info area: warning title" msgstr "Área info: título aviso" msgid "Info area: warning text" msgstr "Área info: texto aviso" msgid "Details: title" msgstr "Detalles: título" msgid "Details: subtitle" msgstr "Detalles: subtítulo" msgid "Details: date" msgstr "Detalles: fecha" msgid "Details: text" msgstr "Detalles: texto" msgid "Replay: times" msgstr "Reproducir: veces" msgid "if exists" msgstr "si existe" msgid "Number of Reruns" msgstr "Número de repeticiones" msgid "Use Subtitle for reruns" msgstr "Usar subtítulo para repeticiones" msgid "Show timer conflicts" msgstr "Mostrar conflictos de programación" msgid "EnigmaNG skin" msgstr "Piel EnigmaNG" msgid "Channel:" msgstr "Canal:" msgid "Search pattern:" msgstr "Buscar patrón:" msgid "Timer check" msgstr "Comprobar programación" msgid "No timer check" msgstr "No comprobar programación" vdr-plugin-skinenigmang-0.1.5/po/et_EE.po000066400000000000000000000130101435005021200201760ustar00rootroot00000000000000# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Arthur Konovalov , 2004 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-08-24 17:33+0200\n" "PO-Revision-Date: 2007-12-18 08:11+0100\n" "Last-Translator: Arthur Konovalov \n" "Language-Team: \n" "Language: ee\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-13\n" "Content-Transfer-Encoding: 8bit\n" msgid "Free-To-Air" msgstr "" msgid "encrypted" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "WARNING" msgstr "" msgid "Timer conflict" msgstr "" msgid "Timer conflicts" msgstr "" msgid "TIMERS" msgstr "" msgid "min" msgstr "min" msgid "Content: " msgstr "" msgid "Video" msgstr "" msgid "Audio" msgstr "" msgid "Subtitles" msgstr "" msgid "RERUNS OF THIS SHOW" msgstr "" msgid "Size" msgstr "" msgid "cut" msgstr "" msgid "Length" msgstr "" msgid "Format" msgstr "" msgid "Est. bitrate" msgstr "" msgid "Auxiliary information" msgstr "Lisainfo" msgid "Mute" msgstr "" msgid "Volume" msgstr "" msgid "EnigmaNG" msgstr "EnigmaNG" msgid "TrueType Font" msgstr "" msgid "Default OSD Font" msgstr "" msgid "Default Fixed Size Font" msgstr "" msgid "Default Small Font" msgstr "" msgid "General" msgstr "" msgid "Logos & Symbols" msgstr "" msgid "Animated Text" msgstr "" msgid "Fonts" msgstr "" msgid "EPGSearch" msgstr "" msgid "elapsed" msgstr "" msgid "remaining" msgstr "" msgid "percent" msgstr "" msgid "elapsed/remaining" msgstr "" msgid "never" msgstr "" msgid "use size.vdr only" msgstr "" msgid "always" msgstr "" msgid "Last line" msgstr "" msgid "Help buttons" msgstr "" msgid "Free last line" msgstr "" msgid "if required" msgstr "" msgid "Try 8bpp single area" msgstr "" msgid "Round corners" msgstr "" msgid "Full title width" msgstr "" msgid "Show VPS" msgstr "" msgid "Dynamic OSD size" msgstr "" msgid "Menu OSD" msgstr "" msgid "Show info area in main menu" msgstr "" msgid " Min width of info area" msgstr "" msgid "Show messages in menu on" msgstr "" msgid "Show scrollbar in menu" msgstr "" msgid "EPG & Recording Details OSD" msgstr "" msgid "Show auxiliary information" msgstr "Lisainfo näitamine" msgid "Show recording's size" msgstr "" msgid "Channel Info OSD" msgstr "" msgid "Show remaining/elapsed time" msgstr "" msgid "Width of progress bar" msgstr "" msgid "Show signal info" msgstr "" msgid " Width of signal info" msgstr "" msgid "Show CA system as text" msgstr "" msgid "Show Category - Genre / Contents" msgstr "" msgid "pixel algo" msgstr "" msgid "ratio algo" msgstr "" msgid "zoom image" msgstr "" msgid "only if new mail present" msgstr "" msgid "active only" msgstr "" msgid "Flushing channel logo cache..." msgstr "Kanalilogo vahemälu tühjendamine..." msgid "Show symbols" msgstr "Sümbolite näitamine" msgid " Show symbols in menu" msgstr "" msgid " Show symbols in replay" msgstr "" msgid " Show symbols in messages" msgstr "" msgid " Show symbols in audio" msgstr "" msgid "Colored status symbols in EPG details" msgstr "" msgid "Show symbols in lists" msgstr "" msgid "Show progressbar in lists" msgstr "" msgid "Show marker in lists" msgstr "" #, fuzzy msgid "Show status symbols" msgstr "Sümbolite näitamine" msgid " Show flags" msgstr "" msgid " Show WSS mode symbols" msgstr "" msgid " Show mail icon" msgstr "" msgid "Show event/recording images" msgstr "" msgid " Resize images" msgstr "" msgid " Image width" msgstr "" msgid " Image height" msgstr "" msgid " Image format" msgstr "" msgid "Show channel logos" msgstr "Kanalilogo näitamine" msgid " Identify channel by" msgstr " Kanali tuvastamise meetod" msgid "name" msgstr "nimi" msgid "data" msgstr "andmed" msgid "Channel logo cache size" msgstr "Kanalilogo vahemälu suurus" msgid "Button$Flush cache" msgstr "Tühjenda" msgid "left and right" msgstr "" msgid "to the left" msgstr "" msgid "Enable" msgstr "" msgid " Scroll OSD title" msgstr "" msgid " Scroll info area" msgstr "" msgid " Scroll active list items" msgstr "" msgid " Scroll other items" msgstr "" msgid " Scroll behaviour" msgstr "" msgid " Scroll delay (ms)" msgstr "" msgid " Scroll pause (ms)" msgstr "" msgid " Blink pause (ms)" msgstr "" msgid "Name" msgstr "" msgid "Width" msgstr "" msgid "No TrueType fonts installed!" msgstr "" msgid "Fixed Font" msgstr "" msgid "Button$Set" msgstr "" msgid "OSD title" msgstr "" msgid "Messages" msgstr "" msgid "Date" msgstr "" msgid "Help keys" msgstr "" msgid "Channelinfo: title" msgstr "" msgid "Channelinfo: subtitle" msgstr "" msgid "Channelinfo: language" msgstr "" msgid "List items" msgstr "" msgid "Info area: timers title" msgstr "" msgid "Info area: timers text" msgstr "" msgid "Info area: warning title" msgstr "" msgid "Info area: warning text" msgstr "" msgid "Details: title" msgstr "" msgid "Details: subtitle" msgstr "" msgid "Details: date" msgstr "" msgid "Details: text" msgstr "" msgid "Replay: times" msgstr "" msgid "if exists" msgstr "" msgid "Number of Reruns" msgstr "" msgid "Use Subtitle for reruns" msgstr "" msgid "Show timer conflicts" msgstr "" msgid "EnigmaNG skin" msgstr "EnigmaNG kest" msgid "Channel:" msgstr "" msgid "Search pattern:" msgstr "" msgid "Timer check" msgstr "" msgid "No timer check" msgstr "" #~ msgid "Show progressbar" #~ msgstr "Edenemisriba näitamine" #~ msgid "Languages" #~ msgstr "Keeled" vdr-plugin-skinenigmang-0.1.5/po/fi_FI.po000066400000000000000000000166671435005021200202160ustar00rootroot00000000000000# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Rolf Ahrenberg , 2003 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-08-24 17:33+0200\n" "PO-Revision-Date: 2012-05-22 22:25+0200\n" "Last-Translator: Ville Skyttä \n" "Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Free-To-Air" msgstr "" msgid "encrypted" msgstr "salattu" msgid "*** Invalid Channel ***" msgstr "*** Virheellinen kanava ***" msgid "WARNING" msgstr "VAROITUS" msgid "Timer conflict" msgstr "Päällekkäinen ajastin" msgid "Timer conflicts" msgstr "Päällekkäisiä ajastimia" msgid "TIMERS" msgstr "AJASTIMET" msgid "min" msgstr "min" msgid "Content: " msgstr "" msgid "Video" msgstr "" msgid "Audio" msgstr "" msgid "Subtitles" msgstr "Tekstitys" msgid "RERUNS OF THIS SHOW" msgstr "TOISTUVAT TAPAHTUMAT" msgid "Size" msgstr "Koko" msgid "cut" msgstr "" msgid "Length" msgstr "" msgid "Format" msgstr "" msgid "Est. bitrate" msgstr "" msgid "Auxiliary information" msgstr "Lisätiedot" msgid "Mute" msgstr "Mykistetty" msgid "Volume" msgstr "Äänenvoimakkuus" msgid "EnigmaNG" msgstr "EnigmaNG" msgid "TrueType Font" msgstr "TrueType-kirjasin" msgid "Default OSD Font" msgstr "oletuskirjasintyyppi" msgid "Default Fixed Size Font" msgstr "tasavälinen kirjasintyyppi" msgid "Default Small Font" msgstr "pieni kirjasintyyppi" msgid "General" msgstr "Yleiset" msgid "Logos & Symbols" msgstr "Logot ja symbolit" msgid "Animated Text" msgstr "Tekstien elävöinti" msgid "Fonts" msgstr "Kirjasintyypit" msgid "EPGSearch" msgstr "EPGSearch" msgid "elapsed" msgstr "kulunut" msgid "remaining" msgstr "jäljellä oleva" msgid "percent" msgstr "prosentti" msgid "elapsed/remaining" msgstr "jäljellä oleva" msgid "never" msgstr "ei koskaan" msgid "use size.vdr only" msgstr "vain jos size.vdr" msgid "always" msgstr "aina" msgid "Last line" msgstr "alimmalla rivillä" msgid "Help buttons" msgstr "värinäppäinrivillä" msgid "Free last line" msgstr "alimmalla vapaalla rivillä" msgid "if required" msgstr "tarvittaessa" msgid "Try 8bpp single area" msgstr "Suosi yhtä 8bpp kuva-aluetta" msgid "Round corners" msgstr "" msgid "Full title width" msgstr "Levitä otsikkopalkki" msgid "Show VPS" msgstr "Näytä VPS-tieto" msgid "Dynamic OSD size" msgstr "Mukauta kuvaruutunäytön kokoa" msgid "Menu OSD" msgstr "" msgid "Show info area in main menu" msgstr "Näytä infoalue päävalikossa" msgid " Min width of info area" msgstr " Infoalueen minimileveys" msgid "Show messages in menu on" msgstr "Näytä viestit valikossa" msgid "Show scrollbar in menu" msgstr "Näytä vierityspalkki valikossa" msgid "EPG & Recording Details OSD" msgstr "" msgid "Show auxiliary information" msgstr "Näytä lisätiedot" msgid "Show recording's size" msgstr "Näytä tallenteen koko" msgid "Channel Info OSD" msgstr "" msgid "Show remaining/elapsed time" msgstr "Näytä tapahtuman aika" msgid "Width of progress bar" msgstr "" msgid "Show signal info" msgstr " Näytä sähköpostikuvake" msgid " Width of signal info" msgstr "" msgid "Show CA system as text" msgstr "" msgid "Show Category - Genre / Contents" msgstr "" msgid "pixel algo" msgstr "näytteistys" msgid "ratio algo" msgstr "skaalaus" msgid "zoom image" msgstr "zoomaus" msgid "only if new mail present" msgstr "jos uutta postia" msgid "active only" msgstr "" msgid "Flushing channel logo cache..." msgstr "Tyhjennetään välimuistia..." msgid "Show symbols" msgstr "Näytä symbolit" msgid " Show symbols in menu" msgstr " Näytä symbolit valikossa" msgid " Show symbols in replay" msgstr " Näytä symbolit toistettaessa" msgid " Show symbols in messages" msgstr " Näytä symbolit viesteissä" msgid " Show symbols in audio" msgstr " Näytä symbolit äänivalikossa" msgid "Colored status symbols in EPG details" msgstr "" msgid "Show symbols in lists" msgstr "Näytä tapahtumien symbolit" msgid "Show progressbar in lists" msgstr "" msgid "Show marker in lists" msgstr "Näytä valintasymboli" msgid "Show status symbols" msgstr "Näytä symbolit" msgid " Show flags" msgstr " Näytä liput" msgid " Show WSS mode symbols" msgstr " Näytä WSS-symbolit" msgid " Show mail icon" msgstr " Näytä sähköpostikuvake" msgid "Show event/recording images" msgstr "Näytä kuvat lisätietovalikossa" msgid " Resize images" msgstr " Muokkaa kuvien kokoa" msgid " Image width" msgstr " Kuvien leveys" msgid " Image height" msgstr " Kuvien korkeus" msgid " Image format" msgstr " Kuvaformaatti" msgid "Show channel logos" msgstr "Näytä kanavalogot" msgid " Identify channel by" msgstr " Tunnista kanava" msgid "name" msgstr "nimestä" msgid "data" msgstr "tiedoista" msgid "Channel logo cache size" msgstr "Välimuistin koko kanavalogoille" msgid "Button$Flush cache" msgstr "Tyhjennä" msgid "left and right" msgstr "edestakaisin" msgid "to the left" msgstr "vasemmalle" msgid "Enable" msgstr "Käytä elävöintiä" msgid " Scroll OSD title" msgstr " Vieritä valikon otsikkoa" msgid " Scroll info area" msgstr " Vieritä infoaluetta" msgid " Scroll active list items" msgstr " Vieritä aktiivista valintaa" msgid " Scroll other items" msgstr " Vieritä muita alueita" msgid " Scroll behaviour" msgstr " Vieritystapa" msgid " Scroll delay (ms)" msgstr " Vierityksen viive (ms)" msgid " Scroll pause (ms)" msgstr " Vierityksen tauko (ms)" msgid " Blink pause (ms)" msgstr " Vilkutuksen tauko (ms)" msgid "Name" msgstr "Nimi" msgid "Width" msgstr "Leveys" msgid "No TrueType fonts installed!" msgstr "TrueType-kirjasintyyppejä ei löydy!" msgid "Fixed Font" msgstr "Tasavälinen kirjasintyyppi" msgid "Button$Set" msgstr "Aseta" msgid "OSD title" msgstr "Valikon otsikko" msgid "Messages" msgstr "Viestit" msgid "Date" msgstr "Päiväys" msgid "Help keys" msgstr "Värinäppäimet" msgid "Channelinfo: title" msgstr "Kanavatieto: ohjelman nimi" msgid "Channelinfo: subtitle" msgstr "Kanavatieto: ohjelman kuvaus" msgid "Channelinfo: language" msgstr "Kanavatieto: kieli" msgid "List items" msgstr "Listat" msgid "Info area: timers title" msgstr "Infoalue: ajastimen otsikko" msgid "Info area: timers text" msgstr "Infoalue: ajastimen leipäteksti" msgid "Info area: warning title" msgstr "Infoalue: varoituksen otsikko" msgid "Info area: warning text" msgstr "Infoalue: varoituksen leipäteksti" msgid "Details: title" msgstr "Lisätiedot: ohjelman nimi" msgid "Details: subtitle" msgstr "Lisätiedot: ohjelman kuvaus" msgid "Details: date" msgstr "Lisätiedot: päivämäärä" msgid "Details: text" msgstr "Lisätiedot: leipäteksti" msgid "Replay: times" msgstr "Toisto: kellonajat" msgid "if exists" msgstr "jos olemassa" msgid "Number of Reruns" msgstr "Uusintojen lukumäärä" msgid "Use Subtitle for reruns" msgstr "Käytä lyhyttä kuvausta uusinnoille" msgid "Show timer conflicts" msgstr "Näytä päällekkäiset ajastimet" msgid "EnigmaNG skin" msgstr "EnigmaNG-ulkoasu" msgid "Channel:" msgstr "Kanava:" msgid "Search pattern:" msgstr "Hakutapa:" msgid "Timer check" msgstr "Ajastimien valvonta" msgid "No timer check" msgstr "Ei valvontaa" #~ msgid "Show progressbar" #~ msgstr "Näytä aikajana" #~ msgid "Languages" #~ msgstr "Kielet" vdr-plugin-skinenigmang-0.1.5/po/fr_FR.po000066400000000000000000000170061435005021200202240ustar00rootroot00000000000000# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Patrice Staudt , 2008 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-08-24 17:33+0200\n" "PO-Revision-Date: 2007-12-18 08:11+0100\n" "Last-Translator: Patrice Staudt \n" "Language-Team: \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" msgid "Free-To-Air" msgstr "" msgid "encrypted" msgstr "" msgid "*** Invalid Channel ***" msgstr "*** Chaîne non valable ***" msgid "WARNING" msgstr "ATTENTION" msgid "Timer conflict" msgstr "Conflit de programmation" msgid "Timer conflicts" msgstr "Conflits de programmation" msgid "TIMERS" msgstr "PROGRAMMATION" msgid "min" msgstr "min" msgid "Content: " msgstr "" msgid "Video" msgstr "" msgid "Audio" msgstr "" msgid "Subtitles" msgstr "" msgid "RERUNS OF THIS SHOW" msgstr "REPETITION" msgid "Size" msgstr "Taille" msgid "cut" msgstr "" msgid "Length" msgstr "" msgid "Format" msgstr "" msgid "Est. bitrate" msgstr "" msgid "Auxiliary information" msgstr "Information auxiliare" msgid "Mute" msgstr "Silence" msgid "Volume" msgstr "Volume" msgid "EnigmaNG" msgstr "EnigmaNG" msgid "TrueType Font" msgstr "TrueType" msgid "Default OSD Font" msgstr "OSD standard" msgid "Default Fixed Size Font" msgstr "Largeur fixe standard" msgid "Default Small Font" msgstr "Petite police standard" msgid "General" msgstr "Généralité" msgid "Logos & Symbols" msgstr "Logos et symboles" msgid "Animated Text" msgstr "Texte défilant" msgid "Fonts" msgstr "Les polices" msgid "EPGSearch" msgstr "Recherche EPG" msgid "elapsed" msgstr "écoulé" msgid "remaining" msgstr "restant" msgid "percent" msgstr "Pourcentage" #, fuzzy msgid "elapsed/remaining" msgstr "restant" msgid "never" msgstr "jamais" msgid "use size.vdr only" msgstr "utiliser seulement size.vdr" msgid "always" msgstr "toujours" msgid "Last line" msgstr "Dernière ligne" msgid "Help buttons" msgstr "Button aide" msgid "Free last line" msgstr "Dernière ligne libre" msgid "if required" msgstr "" msgid "Try 8bpp single area" msgstr "Essayer une surface à 8bpp" msgid "Round corners" msgstr "" msgid "Full title width" msgstr "Largeur totale pour le titre" msgid "Show VPS" msgstr "Afficher le VPS" msgid "Dynamic OSD size" msgstr "Taille dynamique de OSD" msgid "Menu OSD" msgstr "" msgid "Show info area in main menu" msgstr "Surface d'infos dans le menu principal" #, fuzzy msgid " Min width of info area" msgstr " Barre de défilement dans la surface info" msgid "Show messages in menu on" msgstr "Afficher les messages dans le menu" #, fuzzy msgid "Show scrollbar in menu" msgstr " dans le menu" msgid "EPG & Recording Details OSD" msgstr "" msgid "Show auxiliary information" msgstr "Afficher informations auxiliaires" msgid "Show recording's size" msgstr "Afficher la taille des enregistrements" msgid "Channel Info OSD" msgstr "" msgid "Show remaining/elapsed time" msgstr "Afficher le temps écoulé/restant" msgid "Width of progress bar" msgstr "" #, fuzzy msgid "Show signal info" msgstr " Afficher l'icône courriel" msgid " Width of signal info" msgstr "" msgid "Show CA system as text" msgstr "" msgid "Show Category - Genre / Contents" msgstr "" msgid "pixel algo" msgstr "Algorithme pixel" msgid "ratio algo" msgstr "Algorithme ratio" msgid "zoom image" msgstr "Agrandir image" msgid "only if new mail present" msgstr "juste lors d'un courriel" msgid "active only" msgstr "" msgid "Flushing channel logo cache..." msgstr "Suppression du cache..." msgid "Show symbols" msgstr "Afficher symbole" msgid " Show symbols in menu" msgstr " dans le menu" msgid " Show symbols in replay" msgstr " dans lecture" msgid " Show symbols in messages" msgstr " dans les messages" msgid " Show symbols in audio" msgstr " dans audio" msgid "Colored status symbols in EPG details" msgstr "" msgid "Show symbols in lists" msgstr "Symboles dans les listes" msgid "Show progressbar in lists" msgstr "" msgid "Show marker in lists" msgstr "Marque devant les listes" msgid "Show status symbols" msgstr "Afficher symbole de status" msgid " Show flags" msgstr " Afficher drapeau" msgid " Show WSS mode symbols" msgstr " Afficher mode symboles WSS" msgid " Show mail icon" msgstr " Afficher l'icône courriel" msgid "Show event/recording images" msgstr "Images dans les EPG et détails d'enregistrements" msgid " Resize images" msgstr " Redimensionne les images" msgid " Image width" msgstr " Largeur" msgid " Image height" msgstr " Hauteur" msgid " Image format" msgstr " Format d'image" msgid "Show channel logos" msgstr "Afficher logos des chaînes" msgid " Identify channel by" msgstr " Identifier chaîne par" msgid "name" msgstr "Nom" msgid "data" msgstr "Donnée" msgid "Channel logo cache size" msgstr "Taille du cache des logos" msgid "Button$Flush cache" msgstr "Supprimer cache" msgid "left and right" msgstr "gauche et droite" msgid "to the left" msgstr "vers la gauche" msgid "Enable" msgstr "Permettre" msgid " Scroll OSD title" msgstr " Défilement dans le titre du OSD" msgid " Scroll info area" msgstr " Barre de défilement dans la surface info" msgid " Scroll active list items" msgstr " Barre de défilement dans la liste active" msgid " Scroll other items" msgstr " Barre de défilement dans d'autres parties" msgid " Scroll behaviour" msgstr " Comportement de défilement" msgid " Scroll delay (ms)" msgstr " Délai de défilement (ms)" msgid " Scroll pause (ms)" msgstr " Pause de défilement (ms)" msgid " Blink pause (ms)" msgstr " Pause de clignotement (ms)" msgid "Name" msgstr "Nom" msgid "Width" msgstr "Largeur" msgid "No TrueType fonts installed!" msgstr "Il n'y a pas de police TrueType d'installé!" msgid "Fixed Font" msgstr "Police avec une largeur fixe" msgid "Button$Set" msgstr "Changer" msgid "OSD title" msgstr "Titre OSD" msgid "Messages" msgstr "Message" msgid "Date" msgstr "Date" msgid "Help keys" msgstr "Touche couleur" msgid "Channelinfo: title" msgstr "Chaîne info: titre " msgid "Channelinfo: subtitle" msgstr "Chaîne info: sous-titres" msgid "Channelinfo: language" msgstr "Chaîne info: langue" msgid "List items" msgstr "Liste" msgid "Info area: timers title" msgstr "Barre d'information: Titre Progammation" msgid "Info area: timers text" msgstr "Barre d'information: Text programmation" msgid "Info area: warning title" msgstr "Barre d'information: avertissement titre" msgid "Info area: warning text" msgstr "Barre d'information: texte d'avertissement" msgid "Details: title" msgstr "Détails: Titre" msgid "Details: subtitle" msgstr "Détails: Sous-titre" msgid "Details: date" msgstr "Détails: date" msgid "Details: text" msgstr "Détails: Texte" msgid "Replay: times" msgstr "Rejouer : périodes" msgid "if exists" msgstr "si existant" msgid "Number of Reruns" msgstr "Nombre de répétitions" msgid "Use Subtitle for reruns" msgstr "Utilise sous-titres pour les répétitions" msgid "Show timer conflicts" msgstr "Afficher les conflits de programmation" msgid "EnigmaNG skin" msgstr "Skin EnigmaNG" msgid "Channel:" msgstr "Chaîne:" msgid "Search pattern:" msgstr "Modèle de recherche" msgid "Timer check" msgstr "Observation de la programmation" msgid "No timer check" msgstr "Sans surveillance" #~ msgid "Show progressbar" #~ msgstr "Afficher barre de progression" #~ msgid "Languages" #~ msgstr "Langues" vdr-plugin-skinenigmang-0.1.5/po/hr_HR.po000066400000000000000000000123621435005021200202300ustar00rootroot00000000000000# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Drazen Dupor , 2004 # Dino Ravnic , 2004 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-08-24 17:33+0200\n" "PO-Revision-Date: 2007-12-18 08:11+0100\n" "Last-Translator: Drazen Dupor \n" "Language-Team: \n" "Language: hr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-2\n" "Content-Transfer-Encoding: 8bit\n" msgid "Free-To-Air" msgstr "" msgid "encrypted" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "WARNING" msgstr "" msgid "Timer conflict" msgstr "" msgid "Timer conflicts" msgstr "" msgid "TIMERS" msgstr "" msgid "min" msgstr "" msgid "Content: " msgstr "" msgid "Video" msgstr "" msgid "Audio" msgstr "" msgid "Subtitles" msgstr "" msgid "RERUNS OF THIS SHOW" msgstr "" msgid "Size" msgstr "" msgid "cut" msgstr "" msgid "Length" msgstr "" msgid "Format" msgstr "" msgid "Est. bitrate" msgstr "" msgid "Auxiliary information" msgstr "" msgid "Mute" msgstr "" msgid "Volume" msgstr "" msgid "EnigmaNG" msgstr "" msgid "TrueType Font" msgstr "" msgid "Default OSD Font" msgstr "" msgid "Default Fixed Size Font" msgstr "" msgid "Default Small Font" msgstr "" msgid "General" msgstr "" msgid "Logos & Symbols" msgstr "" msgid "Animated Text" msgstr "" msgid "Fonts" msgstr "" msgid "EPGSearch" msgstr "" msgid "elapsed" msgstr "" msgid "remaining" msgstr "" msgid "percent" msgstr "" msgid "elapsed/remaining" msgstr "" msgid "never" msgstr "" msgid "use size.vdr only" msgstr "" msgid "always" msgstr "" msgid "Last line" msgstr "" msgid "Help buttons" msgstr "" msgid "Free last line" msgstr "" msgid "if required" msgstr "" msgid "Try 8bpp single area" msgstr "" msgid "Round corners" msgstr "" msgid "Full title width" msgstr "" msgid "Show VPS" msgstr "" msgid "Dynamic OSD size" msgstr "" msgid "Menu OSD" msgstr "" msgid "Show info area in main menu" msgstr "" msgid " Min width of info area" msgstr "" msgid "Show messages in menu on" msgstr "" msgid "Show scrollbar in menu" msgstr "" msgid "EPG & Recording Details OSD" msgstr "" msgid "Show auxiliary information" msgstr "" msgid "Show recording's size" msgstr "" msgid "Channel Info OSD" msgstr "" msgid "Show remaining/elapsed time" msgstr "" msgid "Width of progress bar" msgstr "" msgid "Show signal info" msgstr "" msgid " Width of signal info" msgstr "" msgid "Show CA system as text" msgstr "" msgid "Show Category - Genre / Contents" msgstr "" msgid "pixel algo" msgstr "" msgid "ratio algo" msgstr "" msgid "zoom image" msgstr "" msgid "only if new mail present" msgstr "" msgid "active only" msgstr "" msgid "Flushing channel logo cache..." msgstr "" msgid "Show symbols" msgstr "" msgid " Show symbols in menu" msgstr "" msgid " Show symbols in replay" msgstr "" msgid " Show symbols in messages" msgstr "" msgid " Show symbols in audio" msgstr "" msgid "Colored status symbols in EPG details" msgstr "" msgid "Show symbols in lists" msgstr "" msgid "Show progressbar in lists" msgstr "" msgid "Show marker in lists" msgstr "" msgid "Show status symbols" msgstr "" msgid " Show flags" msgstr "" msgid " Show WSS mode symbols" msgstr "" msgid " Show mail icon" msgstr "" msgid "Show event/recording images" msgstr "" msgid " Resize images" msgstr "" msgid " Image width" msgstr "" msgid " Image height" msgstr "" msgid " Image format" msgstr "" msgid "Show channel logos" msgstr "" msgid " Identify channel by" msgstr "" msgid "name" msgstr "" msgid "data" msgstr "" msgid "Channel logo cache size" msgstr "" msgid "Button$Flush cache" msgstr "" msgid "left and right" msgstr "" msgid "to the left" msgstr "" msgid "Enable" msgstr "" msgid " Scroll OSD title" msgstr "" msgid " Scroll info area" msgstr "" msgid " Scroll active list items" msgstr "" msgid " Scroll other items" msgstr "" msgid " Scroll behaviour" msgstr "" msgid " Scroll delay (ms)" msgstr "" msgid " Scroll pause (ms)" msgstr "" msgid " Blink pause (ms)" msgstr "" msgid "Name" msgstr "" msgid "Width" msgstr "" msgid "No TrueType fonts installed!" msgstr "" msgid "Fixed Font" msgstr "" msgid "Button$Set" msgstr "" msgid "OSD title" msgstr "" msgid "Messages" msgstr "" msgid "Date" msgstr "" msgid "Help keys" msgstr "" msgid "Channelinfo: title" msgstr "" msgid "Channelinfo: subtitle" msgstr "" msgid "Channelinfo: language" msgstr "" msgid "List items" msgstr "" msgid "Info area: timers title" msgstr "" msgid "Info area: timers text" msgstr "" msgid "Info area: warning title" msgstr "" msgid "Info area: warning text" msgstr "" msgid "Details: title" msgstr "" msgid "Details: subtitle" msgstr "" msgid "Details: date" msgstr "" msgid "Details: text" msgstr "" msgid "Replay: times" msgstr "" msgid "if exists" msgstr "" msgid "Number of Reruns" msgstr "" msgid "Use Subtitle for reruns" msgstr "" msgid "Show timer conflicts" msgstr "" msgid "EnigmaNG skin" msgstr "" msgid "Channel:" msgstr "" msgid "Search pattern:" msgstr "" msgid "Timer check" msgstr "" msgid "No timer check" msgstr "" vdr-plugin-skinenigmang-0.1.5/po/hu_HU.po000066400000000000000000000165451435005021200202450ustar00rootroot00000000000000# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Istvan Koenigsberger , 2002 # Guido Josten , 2002 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-08-24 17:33+0200\n" "PO-Revision-Date: 2011-11-30 13:27+0200\n" "Last-Translator: jv\n" "Language-Team: \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-2\n" "Content-Transfer-Encoding: 8bit\n" msgid "Free-To-Air" msgstr "kódolatlan" msgid "encrypted" msgstr "kódolt" msgid "*** Invalid Channel ***" msgstr "*** Érvénytelen csatorna ***" msgid "WARNING" msgstr "FIGYELEM" msgid "Timer conflict" msgstr "Idõzitõ átfedés" msgid "Timer conflicts" msgstr "Idõzítõ átfedések" msgid "TIMERS" msgstr "IDÕZÍTÕK" msgid "min" msgstr "min" msgid "Content: " msgstr "Tartalom:" msgid "Video" msgstr "Videó" msgid "Audio" msgstr "Hang" msgid "Subtitles" msgstr "Feliratok" msgid "RERUNS OF THIS SHOW" msgstr "ISMÉTLÉSEK" msgid "Size" msgstr "Méret" msgid "cut" msgstr "vágás" msgid "Length" msgstr "Hossz" msgid "Format" msgstr "Formátum" msgid "Est. bitrate" msgstr "Becsült bitr." msgid "Auxiliary information" msgstr "További információk" msgid "Mute" msgstr "Némítás" msgid "Volume" msgstr "Hangerõ" msgid "EnigmaNG" msgstr "EnigmaNG" msgid "TrueType Font" msgstr "TrueType betûtipus" msgid "Default OSD Font" msgstr "Alapértelmezett OSD betûtipus" msgid "Default Fixed Size Font" msgstr "Alapértelmezett fixméretû betûtipus" msgid "Default Small Font" msgstr "Alapértelmezett kisméretû betûtipus" msgid "General" msgstr "Általános" msgid "Logos & Symbols" msgstr "Logók és szimbólumok" msgid "Animated Text" msgstr "Animált szöveg" msgid "Fonts" msgstr "Betûtipusok" msgid "EPGSearch" msgstr "EPGSearch" msgid "elapsed" msgstr "eltelt" msgid "remaining" msgstr "hátralevõ" msgid "percent" msgstr "hátralevõ" msgid "elapsed/remaining" msgstr "eltelt/hátralevõ" msgid "never" msgstr "soha" msgid "use size.vdr only" msgstr "csak a .vdr méret használata" msgid "always" msgstr "mindig" msgid "Last line" msgstr "Utolsó sor" msgid "Help buttons" msgstr "Help gombok" msgid "Free last line" msgstr "Utolsó üres sor" msgid "if required" msgstr "ha szükséges" msgid "Try 8bpp single area" msgstr "" msgid "Round corners" msgstr "Sarkok kerekítése" msgid "Full title width" msgstr "Teljes címsor szélesség" msgid "Show VPS" msgstr "VPS információ" msgid "Dynamic OSD size" msgstr "Dinamikus OSD méret" msgid "Menu OSD" msgstr "Menü OSD" msgid "Show info area in main menu" msgstr "Infó terület a fõmenüben" msgid " Min width of info area" msgstr " Infó terület min. szélessége" msgid "Show messages in menu on" msgstr "Üzenetek megjelenítése a menüben" msgid "Show scrollbar in menu" msgstr "Görgetõsáv a menüben" msgid "EPG & Recording Details OSD" msgstr "EPG és felvétel részl. OSDje" msgid "Show auxiliary information" msgstr "További információk" msgid "Show recording's size" msgstr "Felvételméretek" msgid "Channel Info OSD" msgstr "Csatorna infó OSDje" msgid "Show remaining/elapsed time" msgstr "Eltelt/hátralevõ idõ" msgid "Width of progress bar" msgstr "" msgid "Show signal info" msgstr "Jelszint" msgid " Width of signal info" msgstr "" msgid "Show CA system as text" msgstr "Kódolási rendszer szövegként" msgid "Show Category - Genre / Contents" msgstr "" msgid "pixel algo" msgstr "pixel algo" msgid "ratio algo" msgstr "méretarány algo" msgid "zoom image" msgstr "kép nagyítása" msgid "only if new mail present" msgstr "csak ha új levél érkezett" msgid "active only" msgstr "csak ha aktív" msgid "Flushing channel logo cache..." msgstr "Csatornalogó tár ürítése..." msgid "Show symbols" msgstr "Szimbóiumok" msgid " Show symbols in menu" msgstr " Szimbóiumok a menüben" msgid " Show symbols in replay" msgstr " Szimbóiumok visszajátszáskor" msgid " Show symbols in messages" msgstr " Szimbóiumok üzenetekben" msgid " Show symbols in audio" msgstr " Szimbóiumok hangsávokban" msgid "Colored status symbols in EPG details" msgstr "EPG-ben színes állapotszimbólumok" msgid "Show symbols in lists" msgstr "Szimbóiumok listákban" msgid "Show progressbar in lists" msgstr "Állapotjelzõ a listákban" msgid "Show marker in lists" msgstr "Vágási pontok listákban" msgid "Show status symbols" msgstr "Állapotszimbólumok" msgid " Show flags" msgstr " Zászlók" msgid " Show WSS mode symbols" msgstr " WSS mód" msgid " Show mail icon" msgstr " Új levél ikon" msgid "Show event/recording images" msgstr "Esemény/felvétel képek" msgid " Resize images" msgstr " Képek átméretezése" msgid " Image width" msgstr " Kép szélessége" msgid " Image height" msgstr " Kép magassága" msgid " Image format" msgstr " Kép formátuma" msgid "Show channel logos" msgstr "Csatornalogók" msgid " Identify channel by" msgstr " Csatornák azonosítása" msgid "name" msgstr "név szerint" msgid "data" msgstr "adat szerint" msgid "Channel logo cache size" msgstr "Csatonalogó gyorsítótár mérete" msgid "Button$Flush cache" msgstr "gyorsítótár" msgid "left and right" msgstr "balra-jobbra" msgid "to the left" msgstr "balra" msgid "Enable" msgstr "Engedélyezve" msgid " Scroll OSD title" msgstr " OSD címsor görgetése" msgid " Scroll info area" msgstr " Infó mezõ görgetése" msgid " Scroll active list items" msgstr " Aktív listaelemek görgetése" msgid " Scroll other items" msgstr " Egyéb elemek görgetése" msgid " Scroll behaviour" msgstr " Görgetés viselkedése" msgid " Scroll delay (ms)" msgstr " Görgetés késleltetése (ms)" msgid " Scroll pause (ms)" msgstr " Görgetés leállítása (ms)" msgid " Blink pause (ms)" msgstr " Villogás leállítása (ms)" msgid "Name" msgstr "Név" msgid "Width" msgstr "Szélesség" msgid "No TrueType fonts installed!" msgstr "Nincs TrueType betûkészlet telepítve!" msgid "Fixed Font" msgstr "Fixméretû betûkészlet" msgid "Button$Set" msgstr "Beállítás" msgid "OSD title" msgstr "OSD címsor" msgid "Messages" msgstr "Üzenetek" msgid "Date" msgstr "Dátum" msgid "Help keys" msgstr "Help gombok" msgid "Channelinfo: title" msgstr "Csatornainfó: cím" msgid "Channelinfo: subtitle" msgstr "Csatornainfó: alcím" msgid "Channelinfo: language" msgstr "Csatornainfó: nyelv" msgid "List items" msgstr "Lista elemek" msgid "Info area: timers title" msgstr "Infó terület: idõzítõk címe" msgid "Info area: timers text" msgstr "Infó terület: idõzítõk leírása" msgid "Info area: warning title" msgstr "Infó terület: figyelmeztetés címe" msgid "Info area: warning text" msgstr "Infó terület: figyelmeztetés leírása" msgid "Details: title" msgstr "Részletek: cím" msgid "Details: subtitle" msgstr "Részletek: alcím" msgid "Details: date" msgstr "Részletek: dátum" msgid "Details: text" msgstr "Részletek: leírás" msgid "Replay: times" msgstr "Visszajátszás: idõpontok" msgid "if exists" msgstr "ha létezik" msgid "Number of Reruns" msgstr "Ismétlések száma" msgid "Use Subtitle for reruns" msgstr "Alcímek használata ismétlésekhez" msgid "Show timer conflicts" msgstr "Idõzítõk ütközésének kijelzése" msgid "EnigmaNG skin" msgstr "EnigmaNG bõr" msgid "Channel:" msgstr "Csatorna:" msgid "Search pattern:" msgstr "Keresési minta:" msgid "Timer check" msgstr "Idõzítõ ellenõrzése" msgid "No timer check" msgstr "Nincs idõzítõ ellenõrzés" vdr-plugin-skinenigmang-0.1.5/po/it_IT.po000066400000000000000000000172061435005021200202400ustar00rootroot00000000000000# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Alberto Carraro , 2001 # Antonio Ospite , 2003 # Sean Carlos , 2005 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-08-24 17:33+0200\n" "PO-Revision-Date: 2010-08-09 23:43+0100\n" "Last-Translator: Diego Pierotto \n" "Language-Team: \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Italian\n" "X-Poedit-Country: ITALY\n" "X-Poedit-SourceCharset: utf-8\n" msgid "Free-To-Air" msgstr "in chiaro" msgid "encrypted" msgstr "codificato" msgid "*** Invalid Channel ***" msgstr "*** Canale NON valido ***" msgid "WARNING" msgstr "ATTENZIONE" msgid "Timer conflict" msgstr "Conflitto timer" msgid "Timer conflicts" msgstr "Conflitti timer" msgid "TIMERS" msgstr "TIMER" msgid "min" msgstr "min" msgid "Content: " msgstr "Contenuto: " msgid "Video" msgstr "Video" msgid "Audio" msgstr "Audio" msgid "Subtitles" msgstr "Sottotitoli" msgid "RERUNS OF THIS SHOW" msgstr "REPLICHE DI QUESTO SPETTACOLO" msgid "Size" msgstr "Dimensione" msgid "cut" msgstr "taglia" msgid "Length" msgstr "Durata" msgid "Format" msgstr "Formato" msgid "Est. bitrate" msgstr "Bitrate estimato" msgid "Auxiliary information" msgstr "Informazione ausiliare" msgid "Mute" msgstr "Muto" msgid "Volume" msgstr "Volume" msgid "EnigmaNG" msgstr "EnigmaNG" msgid "TrueType Font" msgstr "Car. TrueType" msgid "Default OSD Font" msgstr "Car. OSD pred." msgid "Default Fixed Size Font" msgstr "Car. dim. fissa pred." msgid "Default Small Font" msgstr "Car. piccolo pred." msgid "General" msgstr "Generale" msgid "Logos & Symbols" msgstr "Loghi e simboli" msgid "Animated Text" msgstr "Testo animato" msgid "Fonts" msgstr "Caratteri" msgid "EPGSearch" msgstr "EPGSearch" msgid "elapsed" msgstr "trascorso" msgid "remaining" msgstr "rimasto" msgid "percent" msgstr "percentuale" msgid "elapsed/remaining" msgstr "trascorso/rimasto" msgid "never" msgstr "mai" msgid "use size.vdr only" msgstr "usa solo size.vdr" msgid "always" msgstr "sempre" msgid "Last line" msgstr "Ultima riga" msgid "Help buttons" msgstr "Tasti aiuto" msgid "Free last line" msgstr "Ultima riga libera" msgid "if required" msgstr "se richiesto" msgid "Try 8bpp single area" msgstr "Prova area singola a 8bpp" msgid "Round corners" msgstr "Angoli arrotondati" msgid "Full title width" msgstr "Lunghezza titolo completo" msgid "Show VPS" msgstr "Mostra VPS" msgid "Dynamic OSD size" msgstr "Dimensione OSD dinamica" msgid "Menu OSD" msgstr "Menu OSD" msgid "Show info area in main menu" msgstr "Mostra area info nel menu" msgid " Min width of info area" msgstr " Larghezza min. area info" msgid "Show messages in menu on" msgstr "Mostra messaggi nel menu" msgid "Show scrollbar in menu" msgstr "Mostra barra scorrimento nel menu" msgid "EPG & Recording Details OSD" msgstr "OSD EPG e dettagli registrazioni" msgid "Show auxiliary information" msgstr "Mostra info ausiliare" msgid "Show recording's size" msgstr "Mostra dimensione reg." msgid "Channel Info OSD" msgstr "OSD info canale" msgid "Show remaining/elapsed time" msgstr "Mostra tempo rim./trasc." msgid "Width of progress bar" msgstr "" msgid "Show signal info" msgstr "Mostra info segnale" msgid " Width of signal info" msgstr "" msgid "Show CA system as text" msgstr "Mostra sistema CA come testo" msgid "Show Category - Genre / Contents" msgstr "" msgid "pixel algo" msgstr "algoritmo pixel" msgid "ratio algo" msgstr "algoritmo medio" msgid "zoom image" msgstr "ingrandisci immagine" msgid "only if new mail present" msgstr "solo se presenti nuove email" msgid "active only" msgstr "solo attivo" msgid "Flushing channel logo cache..." msgstr "Pulizia cache loghi canali..." msgid "Show symbols" msgstr "Mostra simboli" msgid " Show symbols in menu" msgstr " Mostra simboli menu" msgid " Show symbols in replay" msgstr " Mostra simboli esecuzione" msgid " Show symbols in messages" msgstr " Mostra simboli messaggi" msgid " Show symbols in audio" msgstr " Mostra simboli audio" msgid "Colored status symbols in EPG details" msgstr "Simboli di stato colorati nei dettagli EPG" msgid "Show symbols in lists" msgstr "Mostra simboli elenchi" msgid "Show progressbar in lists" msgstr "Mostra indicatore elenchi" msgid "Show marker in lists" msgstr "Mostra marcatore elenchi" msgid "Show status symbols" msgstr "Mostra simboli stato" msgid " Show flags" msgstr " Mostra bandierine" msgid " Show WSS mode symbols" msgstr " Mostra simboli mod. WSS" msgid " Show mail icon" msgstr " Mostra icona email" msgid "Show event/recording images" msgstr "Mostra immagini evento/reg." msgid " Resize images" msgstr " Ridimensiona immagini" msgid " Image width" msgstr " Larghezza immagine" msgid " Image height" msgstr " Altezza immagine" msgid " Image format" msgstr " Formato immagine" msgid "Show channel logos" msgstr "Mostra loghi canali" msgid " Identify channel by" msgstr " Identifica canale per" msgid "name" msgstr "nome" msgid "data" msgstr "dati" msgid "Channel logo cache size" msgstr "Dim. cache loghi canali" msgid "Button$Flush cache" msgstr "Svuota cache" msgid "left and right" msgstr "sinistra e destra" msgid "to the left" msgstr "verso sinistra" msgid "Enable" msgstr "Abilita" msgid " Scroll OSD title" msgstr " Scorri titolo OSD" msgid " Scroll info area" msgstr " Scorri info area" msgid " Scroll active list items" msgstr " Scorri elenco valori attivi" msgid " Scroll other items" msgstr " Scorri altri valori" msgid " Scroll behaviour" msgstr " Modalità scorrimento" msgid " Scroll delay (ms)" msgstr " Ritardo scorrimento (ms)" msgid " Scroll pause (ms)" msgstr " Pausa scorrimento (ms)" msgid " Blink pause (ms)" msgstr " Pausa lampeggiante (ms)" msgid "Name" msgstr "Nome" msgid "Width" msgstr "Larghezza" msgid "No TrueType fonts installed!" msgstr "Nessun car. TrueType installato!" msgid "Fixed Font" msgstr "Carattere fisso" msgid "Button$Set" msgstr "Imposta" msgid "OSD title" msgstr "Titolo OSD" msgid "Messages" msgstr "Messaggi" msgid "Date" msgstr "Data" msgid "Help keys" msgstr "Tasti aiuto" msgid "Channelinfo: title" msgstr "Info canale: titolo" msgid "Channelinfo: subtitle" msgstr "Info canale: sottotitoli" msgid "Channelinfo: language" msgstr "Info canale: lingua" msgid "List items" msgstr "Elenco valori" msgid "Info area: timers title" msgstr "Info area: titoli timer" msgid "Info area: timers text" msgstr "Info area: testo timer" msgid "Info area: warning title" msgstr "Info area: titolo avviso" msgid "Info area: warning text" msgstr "Info area: testo avviso" msgid "Details: title" msgstr "Dettagli: titolo" msgid "Details: subtitle" msgstr "Dettagli: sottotitoli" msgid "Details: date" msgstr "Dettagli: data" msgid "Details: text" msgstr "Dettagli: testo" msgid "Replay: times" msgstr "Riproduzione: volte" msgid "if exists" msgstr "se esiste" msgid "Number of Reruns" msgstr "Numero repliche" msgid "Use Subtitle for reruns" msgstr "Utilizza sottotitoli repliche" msgid "Show timer conflicts" msgstr "Mostra conflitti timer" msgid "EnigmaNG skin" msgstr "Stile interfaccia EnigmaNG" msgid "Channel:" msgstr "Canale:" msgid "Search pattern:" msgstr "Modello di ricerca:" msgid "Timer check" msgstr "Verifica timer" msgid "No timer check" msgstr "Nessuna verifica timer" #~ msgid "Show progressbar" #~ msgstr "Mostra barra avanzamento" #~ msgid "Languages" #~ msgstr "Lingue" vdr-plugin-skinenigmang-0.1.5/po/nl_NL.po000066400000000000000000000161141435005021200202270ustar00rootroot00000000000000# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Johan Schuring # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-08-24 17:33+0200\n" "PO-Revision-Date: 2007-12-18 08:11+0100\n" "Last-Translator: dorpsgek @vdr-portal.de\n" "Language-Team: \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-15\n" "Content-Transfer-Encoding: 8bit\n" msgid "Free-To-Air" msgstr "" msgid "encrypted" msgstr "" msgid "*** Invalid Channel ***" msgstr "*** Ongeldig Kanaal ***" msgid "WARNING" msgstr "WAARSCHUWING" msgid "Timer conflict" msgstr "Timerconflict" msgid "Timer conflicts" msgstr "Timerconflicten" msgid "TIMERS" msgstr "TIMER" msgid "min" msgstr "min" msgid "Content: " msgstr "" msgid "Video" msgstr "" msgid "Audio" msgstr "" msgid "Subtitles" msgstr "" msgid "RERUNS OF THIS SHOW" msgstr "HERHALINGEN" msgid "Size" msgstr "Grootte" msgid "cut" msgstr "" msgid "Length" msgstr "" msgid "Format" msgstr "" msgid "Est. bitrate" msgstr "" msgid "Auxiliary information" msgstr "Hulp informatie" msgid "Mute" msgstr "Geluid uit" msgid "Volume" msgstr "Volume" msgid "EnigmaNG" msgstr "EnigmaNG" msgid "TrueType Font" msgstr "TrueType Font" msgid "Default OSD Font" msgstr "Standaard OSDfont" msgid "Default Fixed Size Font" msgstr "Standaardwaarde font" msgid "Default Small Font" msgstr "Standaard klein font" msgid "General" msgstr "Algemeen" msgid "Logos & Symbols" msgstr "Logo's & Symbolen" msgid "Animated Text" msgstr "Geanimeerde tekst" msgid "Fonts" msgstr "Fonts" msgid "EPGSearch" msgstr "EPGsearch" msgid "elapsed" msgstr "gedane" msgid "remaining" msgstr "resterend" msgid "percent" msgstr "procent" #, fuzzy msgid "elapsed/remaining" msgstr "resterend" msgid "never" msgstr "nooit" msgid "use size.vdr only" msgstr "alleen size.vdr gebruiken" msgid "always" msgstr "Altijd" msgid "Last line" msgstr "Laatste lijn" msgid "Help buttons" msgstr "Help knoppen" msgid "Free last line" msgstr "Vrije laatste lijn" msgid "if required" msgstr "" msgid "Try 8bpp single area" msgstr "Op 8bpp bereik testen" msgid "Round corners" msgstr "" msgid "Full title width" msgstr "Volle titelbreedte" msgid "Show VPS" msgstr "VPS tonen" msgid "Dynamic OSD size" msgstr "Dynamische OSD grootte" msgid "Menu OSD" msgstr "" msgid "Show info area in main menu" msgstr "Info in hoofdmenu" #, fuzzy msgid " Min width of info area" msgstr " Infobereik scrollen" msgid "Show messages in menu on" msgstr "Toon berichten in menu aan" #, fuzzy msgid "Show scrollbar in menu" msgstr " Symbolen in menu tonen" msgid "EPG & Recording Details OSD" msgstr "" msgid "Show auxiliary information" msgstr "Toon hulp informatie" msgid "Show recording's size" msgstr "Opnamegrootte tonen" msgid "Channel Info OSD" msgstr "" msgid "Show remaining/elapsed time" msgstr "Toon resterend/gedane tijd" msgid "Width of progress bar" msgstr "" #, fuzzy msgid "Show signal info" msgstr " Mail-ikoon tonen" msgid " Width of signal info" msgstr "" msgid "Show CA system as text" msgstr "" msgid "Show Category - Genre / Contents" msgstr "" msgid "pixel algo" msgstr "pixelalgoritme" msgid "ratio algo" msgstr "algoritmeratio" msgid "zoom image" msgstr "zoomen" msgid "only if new mail present" msgstr "alleen bij nieuwe mail" msgid "active only" msgstr "" msgid "Flushing channel logo cache..." msgstr "Kanaallogo cache legen..." msgid "Show symbols" msgstr "Symbolen tonen" msgid " Show symbols in menu" msgstr " Symbolen in menu tonen" msgid " Show symbols in replay" msgstr " Symbolen bij weergave tonen" msgid " Show symbols in messages" msgstr " Symbolen bij berichten tonen" msgid " Show symbols in audio" msgstr " Symbolen bij audio tonen" msgid "Colored status symbols in EPG details" msgstr "" msgid "Show symbols in lists" msgstr "Symbolen in lijsten tonen" msgid "Show progressbar in lists" msgstr "" msgid "Show marker in lists" msgstr "Markering in lijsten tonen" msgid "Show status symbols" msgstr "Status symbolen tonen" msgid " Show flags" msgstr " Vlaggen tonen" msgid " Show WSS mode symbols" msgstr "WSS modus symbolen tonen" msgid " Show mail icon" msgstr " Mail-ikoon tonen" msgid "Show event/recording images" msgstr "Voorstelling/opname figuren tonen" msgid " Resize images" msgstr " Aanpassen beeldgrootte" msgid " Image width" msgstr " Beeldbreedte" msgid " Image height" msgstr " Beeldhoogte" msgid " Image format" msgstr " Beeldformaat" msgid "Show channel logos" msgstr "Toon kanaallogo's" msgid " Identify channel by" msgstr " Identificeer kanaal door" msgid "name" msgstr "naam" msgid "data" msgstr "data" msgid "Channel logo cache size" msgstr "Kanaallogo cache" msgid "Button$Flush cache" msgstr "Cache legen" msgid "left and right" msgstr "links en rechts" msgid "to the left" msgstr "naar links" msgid "Enable" msgstr "Toelaten" msgid " Scroll OSD title" msgstr " OSD titel scrollen" msgid " Scroll info area" msgstr " Infobereik scrollen" msgid " Scroll active list items" msgstr " Lijst aktieve punten scrollen" msgid " Scroll other items" msgstr " Andere punten scrollen" msgid " Scroll behaviour" msgstr " Scroll gedrag" msgid " Scroll delay (ms)" msgstr " Scrollvertraging (ms)" msgid " Scroll pause (ms)" msgstr " Scrollpause (ms)" msgid " Blink pause (ms)" msgstr " Blinkpauze (ms)" msgid "Name" msgstr "Naam" msgid "Width" msgstr "Breedte" msgid "No TrueType fonts installed!" msgstr "Geen TrueType fonten geinstalleerd!" msgid "Fixed Font" msgstr "Vaste waarde font" msgid "Button$Set" msgstr "Veranderen" msgid "OSD title" msgstr "OSD titel" msgid "Messages" msgstr "Meldingen" msgid "Date" msgstr "Datum" msgid "Help keys" msgstr "Help toetsen" msgid "Channelinfo: title" msgstr "Kanaalinfo: titel" msgid "Channelinfo: subtitle" msgstr "Kanaalinfo: ondertitel" msgid "Channelinfo: language" msgstr "Kanaalinfo: taal" msgid "List items" msgstr "Lijsten" msgid "Info area: timers title" msgstr "Infobereik: Timertitel" msgid "Info area: timers text" msgstr "Infobereik: Timertekst" msgid "Info area: warning title" msgstr "Infobereik: waarschuwing titel" msgid "Info area: warning text" msgstr "Infobereik: waarschuwing tekst" msgid "Details: title" msgstr "Details: titel" msgid "Details: subtitle" msgstr "Details: ondertitel" msgid "Details: date" msgstr "Details: datum" msgid "Details: text" msgstr "Details: tekst" msgid "Replay: times" msgstr "Weergave: tijden" msgid "if exists" msgstr "wanneer aanwezig" msgid "Number of Reruns" msgstr "aantal herhalingen" msgid "Use Subtitle for reruns" msgstr "Gebr. ondertitlel voor herh." msgid "Show timer conflicts" msgstr "Timerconflict tonen" msgid "EnigmaNG skin" msgstr "EnigmaNG skin" msgid "Channel:" msgstr "Kanaal:" msgid "Search pattern:" msgstr "Zoekpatroon:" msgid "Timer check" msgstr "Monitoren" msgid "No timer check" msgstr "Geen controle" #~ msgid "Show progressbar" #~ msgstr "Progressiebalk tonen" #~ msgid "Languages" #~ msgstr "Talen" vdr-plugin-skinenigmang-0.1.5/po/nn_NO.po000066400000000000000000000123541435005021200202360ustar00rootroot00000000000000# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Jørgen Tvedt , 2001 # Truls Slevigen , 2002 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-08-24 17:33+0200\n" "PO-Revision-Date: 2007-12-18 08:11+0100\n" "Last-Translator: Truls Slevigen \n" "Language-Team: \n" "Language: no\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" msgid "Free-To-Air" msgstr "" msgid "encrypted" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "WARNING" msgstr "" msgid "Timer conflict" msgstr "" msgid "Timer conflicts" msgstr "" msgid "TIMERS" msgstr "" msgid "min" msgstr "" msgid "Content: " msgstr "" msgid "Video" msgstr "" msgid "Audio" msgstr "" msgid "Subtitles" msgstr "" msgid "RERUNS OF THIS SHOW" msgstr "" msgid "Size" msgstr "" msgid "cut" msgstr "" msgid "Length" msgstr "" msgid "Format" msgstr "" msgid "Est. bitrate" msgstr "" msgid "Auxiliary information" msgstr "" msgid "Mute" msgstr "" msgid "Volume" msgstr "" msgid "EnigmaNG" msgstr "" msgid "TrueType Font" msgstr "" msgid "Default OSD Font" msgstr "" msgid "Default Fixed Size Font" msgstr "" msgid "Default Small Font" msgstr "" msgid "General" msgstr "" msgid "Logos & Symbols" msgstr "" msgid "Animated Text" msgstr "" msgid "Fonts" msgstr "" msgid "EPGSearch" msgstr "" msgid "elapsed" msgstr "" msgid "remaining" msgstr "" msgid "percent" msgstr "" msgid "elapsed/remaining" msgstr "" msgid "never" msgstr "" msgid "use size.vdr only" msgstr "" msgid "always" msgstr "" msgid "Last line" msgstr "" msgid "Help buttons" msgstr "" msgid "Free last line" msgstr "" msgid "if required" msgstr "" msgid "Try 8bpp single area" msgstr "" msgid "Round corners" msgstr "" msgid "Full title width" msgstr "" msgid "Show VPS" msgstr "" msgid "Dynamic OSD size" msgstr "" msgid "Menu OSD" msgstr "" msgid "Show info area in main menu" msgstr "" msgid " Min width of info area" msgstr "" msgid "Show messages in menu on" msgstr "" msgid "Show scrollbar in menu" msgstr "" msgid "EPG & Recording Details OSD" msgstr "" msgid "Show auxiliary information" msgstr "" msgid "Show recording's size" msgstr "" msgid "Channel Info OSD" msgstr "" msgid "Show remaining/elapsed time" msgstr "" msgid "Width of progress bar" msgstr "" msgid "Show signal info" msgstr "" msgid " Width of signal info" msgstr "" msgid "Show CA system as text" msgstr "" msgid "Show Category - Genre / Contents" msgstr "" msgid "pixel algo" msgstr "" msgid "ratio algo" msgstr "" msgid "zoom image" msgstr "" msgid "only if new mail present" msgstr "" msgid "active only" msgstr "" msgid "Flushing channel logo cache..." msgstr "" msgid "Show symbols" msgstr "" msgid " Show symbols in menu" msgstr "" msgid " Show symbols in replay" msgstr "" msgid " Show symbols in messages" msgstr "" msgid " Show symbols in audio" msgstr "" msgid "Colored status symbols in EPG details" msgstr "" msgid "Show symbols in lists" msgstr "" msgid "Show progressbar in lists" msgstr "" msgid "Show marker in lists" msgstr "" msgid "Show status symbols" msgstr "" msgid " Show flags" msgstr "" msgid " Show WSS mode symbols" msgstr "" msgid " Show mail icon" msgstr "" msgid "Show event/recording images" msgstr "" msgid " Resize images" msgstr "" msgid " Image width" msgstr "" msgid " Image height" msgstr "" msgid " Image format" msgstr "" msgid "Show channel logos" msgstr "" msgid " Identify channel by" msgstr "" msgid "name" msgstr "" msgid "data" msgstr "" msgid "Channel logo cache size" msgstr "" msgid "Button$Flush cache" msgstr "" msgid "left and right" msgstr "" msgid "to the left" msgstr "" msgid "Enable" msgstr "" msgid " Scroll OSD title" msgstr "" msgid " Scroll info area" msgstr "" msgid " Scroll active list items" msgstr "" msgid " Scroll other items" msgstr "" msgid " Scroll behaviour" msgstr "" msgid " Scroll delay (ms)" msgstr "" msgid " Scroll pause (ms)" msgstr "" msgid " Blink pause (ms)" msgstr "" msgid "Name" msgstr "" msgid "Width" msgstr "" msgid "No TrueType fonts installed!" msgstr "" msgid "Fixed Font" msgstr "" msgid "Button$Set" msgstr "" msgid "OSD title" msgstr "" msgid "Messages" msgstr "" msgid "Date" msgstr "" msgid "Help keys" msgstr "" msgid "Channelinfo: title" msgstr "" msgid "Channelinfo: subtitle" msgstr "" msgid "Channelinfo: language" msgstr "" msgid "List items" msgstr "" msgid "Info area: timers title" msgstr "" msgid "Info area: timers text" msgstr "" msgid "Info area: warning title" msgstr "" msgid "Info area: warning text" msgstr "" msgid "Details: title" msgstr "" msgid "Details: subtitle" msgstr "" msgid "Details: date" msgstr "" msgid "Details: text" msgstr "" msgid "Replay: times" msgstr "" msgid "if exists" msgstr "" msgid "Number of Reruns" msgstr "" msgid "Use Subtitle for reruns" msgstr "" msgid "Show timer conflicts" msgstr "" msgid "EnigmaNG skin" msgstr "" msgid "Channel:" msgstr "" msgid "Search pattern:" msgstr "" msgid "Timer check" msgstr "" msgid "No timer check" msgstr "" vdr-plugin-skinenigmang-0.1.5/po/pl_PL.po000066400000000000000000000130221435005021200202260ustar00rootroot00000000000000# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Michael Rakowski , 2002 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-08-24 17:33+0200\n" "PO-Revision-Date: 2007-12-18 08:11+0100\n" "Last-Translator: Michael Rakowski \n" "Language-Team: \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-2\n" "Content-Transfer-Encoding: 8bit\n" msgid "Free-To-Air" msgstr "" msgid "encrypted" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "WARNING" msgstr "" msgid "Timer conflict" msgstr "" msgid "Timer conflicts" msgstr "" msgid "TIMERS" msgstr "" msgid "min" msgstr "min" msgid "Content: " msgstr "" msgid "Video" msgstr "" msgid "Audio" msgstr "" msgid "Subtitles" msgstr "" msgid "RERUNS OF THIS SHOW" msgstr "" msgid "Size" msgstr "" msgid "cut" msgstr "" msgid "Length" msgstr "" msgid "Format" msgstr "" msgid "Est. bitrate" msgstr "" msgid "Auxiliary information" msgstr "Informacje pomocnicze" msgid "Mute" msgstr "" msgid "Volume" msgstr "" msgid "EnigmaNG" msgstr "EnigmaNG" msgid "TrueType Font" msgstr "" msgid "Default OSD Font" msgstr "" msgid "Default Fixed Size Font" msgstr "" msgid "Default Small Font" msgstr "" msgid "General" msgstr "" msgid "Logos & Symbols" msgstr "" msgid "Animated Text" msgstr "" msgid "Fonts" msgstr "" msgid "EPGSearch" msgstr "" msgid "elapsed" msgstr "" msgid "remaining" msgstr "" msgid "percent" msgstr "" msgid "elapsed/remaining" msgstr "" msgid "never" msgstr "" msgid "use size.vdr only" msgstr "" msgid "always" msgstr "" msgid "Last line" msgstr "" msgid "Help buttons" msgstr "" msgid "Free last line" msgstr "" msgid "if required" msgstr "" msgid "Try 8bpp single area" msgstr "" msgid "Round corners" msgstr "" msgid "Full title width" msgstr "" msgid "Show VPS" msgstr "" msgid "Dynamic OSD size" msgstr "" msgid "Menu OSD" msgstr "" msgid "Show info area in main menu" msgstr "" msgid " Min width of info area" msgstr "" msgid "Show messages in menu on" msgstr "" msgid "Show scrollbar in menu" msgstr "" msgid "EPG & Recording Details OSD" msgstr "" msgid "Show auxiliary information" msgstr "Pokazuj informacje pomocnicze" msgid "Show recording's size" msgstr "" msgid "Channel Info OSD" msgstr "" msgid "Show remaining/elapsed time" msgstr "" msgid "Width of progress bar" msgstr "" msgid "Show signal info" msgstr "" msgid " Width of signal info" msgstr "" msgid "Show CA system as text" msgstr "" msgid "Show Category - Genre / Contents" msgstr "" msgid "pixel algo" msgstr "" msgid "ratio algo" msgstr "" msgid "zoom image" msgstr "" msgid "only if new mail present" msgstr "" msgid "active only" msgstr "" msgid "Flushing channel logo cache..." msgstr "Opró¿niam cache logo kana³u..." msgid "Show symbols" msgstr "Pokazuj symbole" msgid " Show symbols in menu" msgstr "" msgid " Show symbols in replay" msgstr "" msgid " Show symbols in messages" msgstr "" msgid " Show symbols in audio" msgstr "" msgid "Colored status symbols in EPG details" msgstr "" msgid "Show symbols in lists" msgstr "" msgid "Show progressbar in lists" msgstr "" msgid "Show marker in lists" msgstr "" #, fuzzy msgid "Show status symbols" msgstr "Pokazuj symbole" msgid " Show flags" msgstr "" msgid " Show WSS mode symbols" msgstr "" msgid " Show mail icon" msgstr "" msgid "Show event/recording images" msgstr "" msgid " Resize images" msgstr "" msgid " Image width" msgstr "" msgid " Image height" msgstr "" msgid " Image format" msgstr "" msgid "Show channel logos" msgstr "Pokazuj logo kana³u" msgid " Identify channel by" msgstr " Rozpoznaj kana³ po" msgid "name" msgstr "nazwa" msgid "data" msgstr "parametry" msgid "Channel logo cache size" msgstr "Rozmiar cache dla logo kana³u" msgid "Button$Flush cache" msgstr "Opró¿nij cache" msgid "left and right" msgstr "" msgid "to the left" msgstr "" msgid "Enable" msgstr "" msgid " Scroll OSD title" msgstr "" msgid " Scroll info area" msgstr "" msgid " Scroll active list items" msgstr "" msgid " Scroll other items" msgstr "" msgid " Scroll behaviour" msgstr "" msgid " Scroll delay (ms)" msgstr "" msgid " Scroll pause (ms)" msgstr "" msgid " Blink pause (ms)" msgstr "" msgid "Name" msgstr "" msgid "Width" msgstr "" msgid "No TrueType fonts installed!" msgstr "" msgid "Fixed Font" msgstr "" msgid "Button$Set" msgstr "" msgid "OSD title" msgstr "" msgid "Messages" msgstr "" msgid "Date" msgstr "" msgid "Help keys" msgstr "" msgid "Channelinfo: title" msgstr "" msgid "Channelinfo: subtitle" msgstr "" msgid "Channelinfo: language" msgstr "" msgid "List items" msgstr "" msgid "Info area: timers title" msgstr "" msgid "Info area: timers text" msgstr "" msgid "Info area: warning title" msgstr "" msgid "Info area: warning text" msgstr "" msgid "Details: title" msgstr "" msgid "Details: subtitle" msgstr "" msgid "Details: date" msgstr "" msgid "Details: text" msgstr "" msgid "Replay: times" msgstr "" msgid "if exists" msgstr "" msgid "Number of Reruns" msgstr "" msgid "Use Subtitle for reruns" msgstr "" msgid "Show timer conflicts" msgstr "" msgid "EnigmaNG skin" msgstr "Skin EnigmaNG" msgid "Channel:" msgstr "" msgid "Search pattern:" msgstr "" msgid "Timer check" msgstr "" msgid "No timer check" msgstr "" #~ msgid "Show progressbar" #~ msgstr "Pokazuj pasek postêpu" #~ msgid "Languages" #~ msgstr "Jêzyki" vdr-plugin-skinenigmang-0.1.5/po/pt_PT.po000066400000000000000000000122751435005021200202570ustar00rootroot00000000000000# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Paulo Lopes , 2001 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-08-24 17:33+0200\n" "PO-Revision-Date: 2007-12-18 08:11+0100\n" "Last-Translator: Paulo Lopes \n" "Language-Team: \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" msgid "Free-To-Air" msgstr "" msgid "encrypted" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "WARNING" msgstr "" msgid "Timer conflict" msgstr "" msgid "Timer conflicts" msgstr "" msgid "TIMERS" msgstr "" msgid "min" msgstr "" msgid "Content: " msgstr "" msgid "Video" msgstr "" msgid "Audio" msgstr "" msgid "Subtitles" msgstr "" msgid "RERUNS OF THIS SHOW" msgstr "" msgid "Size" msgstr "" msgid "cut" msgstr "" msgid "Length" msgstr "" msgid "Format" msgstr "" msgid "Est. bitrate" msgstr "" msgid "Auxiliary information" msgstr "" msgid "Mute" msgstr "Muet" msgid "Volume" msgstr "" msgid "EnigmaNG" msgstr "" msgid "TrueType Font" msgstr "" msgid "Default OSD Font" msgstr "" msgid "Default Fixed Size Font" msgstr "" msgid "Default Small Font" msgstr "" msgid "General" msgstr "" msgid "Logos & Symbols" msgstr "" msgid "Animated Text" msgstr "" msgid "Fonts" msgstr "" msgid "EPGSearch" msgstr "" msgid "elapsed" msgstr "" msgid "remaining" msgstr "" msgid "percent" msgstr "" msgid "elapsed/remaining" msgstr "" msgid "never" msgstr "" msgid "use size.vdr only" msgstr "" msgid "always" msgstr "" msgid "Last line" msgstr "" msgid "Help buttons" msgstr "" msgid "Free last line" msgstr "" msgid "if required" msgstr "" msgid "Try 8bpp single area" msgstr "" msgid "Round corners" msgstr "" msgid "Full title width" msgstr "" msgid "Show VPS" msgstr "" msgid "Dynamic OSD size" msgstr "" msgid "Menu OSD" msgstr "" msgid "Show info area in main menu" msgstr "" msgid " Min width of info area" msgstr "" msgid "Show messages in menu on" msgstr "" msgid "Show scrollbar in menu" msgstr "" msgid "EPG & Recording Details OSD" msgstr "" msgid "Show auxiliary information" msgstr "" msgid "Show recording's size" msgstr "" msgid "Channel Info OSD" msgstr "" msgid "Show remaining/elapsed time" msgstr "" msgid "Width of progress bar" msgstr "" msgid "Show signal info" msgstr "" msgid " Width of signal info" msgstr "" msgid "Show CA system as text" msgstr "" msgid "Show Category - Genre / Contents" msgstr "" msgid "pixel algo" msgstr "" msgid "ratio algo" msgstr "" msgid "zoom image" msgstr "" msgid "only if new mail present" msgstr "" msgid "active only" msgstr "" msgid "Flushing channel logo cache..." msgstr "" msgid "Show symbols" msgstr "" msgid " Show symbols in menu" msgstr "" msgid " Show symbols in replay" msgstr "" msgid " Show symbols in messages" msgstr "" msgid " Show symbols in audio" msgstr "" msgid "Colored status symbols in EPG details" msgstr "" msgid "Show symbols in lists" msgstr "" msgid "Show progressbar in lists" msgstr "" msgid "Show marker in lists" msgstr "" msgid "Show status symbols" msgstr "" msgid " Show flags" msgstr "" msgid " Show WSS mode symbols" msgstr "" msgid " Show mail icon" msgstr "" msgid "Show event/recording images" msgstr "" msgid " Resize images" msgstr "" msgid " Image width" msgstr "" msgid " Image height" msgstr "" msgid " Image format" msgstr "" msgid "Show channel logos" msgstr "" msgid " Identify channel by" msgstr "" msgid "name" msgstr "" msgid "data" msgstr "" msgid "Channel logo cache size" msgstr "" msgid "Button$Flush cache" msgstr "" msgid "left and right" msgstr "" msgid "to the left" msgstr "" msgid "Enable" msgstr "" msgid " Scroll OSD title" msgstr "" msgid " Scroll info area" msgstr "" msgid " Scroll active list items" msgstr "" msgid " Scroll other items" msgstr "" msgid " Scroll behaviour" msgstr "" msgid " Scroll delay (ms)" msgstr "" msgid " Scroll pause (ms)" msgstr "" msgid " Blink pause (ms)" msgstr "" msgid "Name" msgstr "" msgid "Width" msgstr "" msgid "No TrueType fonts installed!" msgstr "" msgid "Fixed Font" msgstr "" msgid "Button$Set" msgstr "" msgid "OSD title" msgstr "" msgid "Messages" msgstr "" msgid "Date" msgstr "" msgid "Help keys" msgstr "" msgid "Channelinfo: title" msgstr "" msgid "Channelinfo: subtitle" msgstr "" msgid "Channelinfo: language" msgstr "" msgid "List items" msgstr "" msgid "Info area: timers title" msgstr "" msgid "Info area: timers text" msgstr "" msgid "Info area: warning title" msgstr "" msgid "Info area: warning text" msgstr "" msgid "Details: title" msgstr "" msgid "Details: subtitle" msgstr "" msgid "Details: date" msgstr "" msgid "Details: text" msgstr "" msgid "Replay: times" msgstr "" msgid "if exists" msgstr "" msgid "Number of Reruns" msgstr "" msgid "Use Subtitle for reruns" msgstr "" msgid "Show timer conflicts" msgstr "" msgid "EnigmaNG skin" msgstr "" msgid "Channel:" msgstr "" msgid "Search pattern:" msgstr "" msgid "Timer check" msgstr "" msgid "No timer check" msgstr "" vdr-plugin-skinenigmang-0.1.5/po/ro_RO.po000066400000000000000000000124101435005021200202400ustar00rootroot00000000000000# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Paul Lacatus , 2002 # Lucian Muresan , 2004 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-08-24 17:33+0200\n" "PO-Revision-Date: 2007-12-18 08:11+0100\n" "Last-Translator: Lucian Muresan \n" "Language-Team: \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-2\n" "Content-Transfer-Encoding: 8bit\n" msgid "Free-To-Air" msgstr "" msgid "encrypted" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "WARNING" msgstr "" msgid "Timer conflict" msgstr "" msgid "Timer conflicts" msgstr "" msgid "TIMERS" msgstr "" msgid "min" msgstr "" msgid "Content: " msgstr "" msgid "Video" msgstr "" msgid "Audio" msgstr "" msgid "Subtitles" msgstr "" msgid "RERUNS OF THIS SHOW" msgstr "" msgid "Size" msgstr "" msgid "cut" msgstr "" msgid "Length" msgstr "" msgid "Format" msgstr "" msgid "Est. bitrate" msgstr "" msgid "Auxiliary information" msgstr "" msgid "Mute" msgstr "" msgid "Volume" msgstr "" msgid "EnigmaNG" msgstr "" msgid "TrueType Font" msgstr "" msgid "Default OSD Font" msgstr "" msgid "Default Fixed Size Font" msgstr "" msgid "Default Small Font" msgstr "" msgid "General" msgstr "" msgid "Logos & Symbols" msgstr "" msgid "Animated Text" msgstr "" msgid "Fonts" msgstr "" msgid "EPGSearch" msgstr "" msgid "elapsed" msgstr "" msgid "remaining" msgstr "" msgid "percent" msgstr "" msgid "elapsed/remaining" msgstr "" msgid "never" msgstr "" msgid "use size.vdr only" msgstr "" msgid "always" msgstr "" msgid "Last line" msgstr "" msgid "Help buttons" msgstr "" msgid "Free last line" msgstr "" msgid "if required" msgstr "" msgid "Try 8bpp single area" msgstr "" msgid "Round corners" msgstr "" msgid "Full title width" msgstr "" msgid "Show VPS" msgstr "" msgid "Dynamic OSD size" msgstr "" msgid "Menu OSD" msgstr "" msgid "Show info area in main menu" msgstr "" msgid " Min width of info area" msgstr "" msgid "Show messages in menu on" msgstr "" msgid "Show scrollbar in menu" msgstr "" msgid "EPG & Recording Details OSD" msgstr "" msgid "Show auxiliary information" msgstr "" msgid "Show recording's size" msgstr "" msgid "Channel Info OSD" msgstr "" msgid "Show remaining/elapsed time" msgstr "" msgid "Width of progress bar" msgstr "" msgid "Show signal info" msgstr "" msgid " Width of signal info" msgstr "" msgid "Show CA system as text" msgstr "" msgid "Show Category - Genre / Contents" msgstr "" msgid "pixel algo" msgstr "" msgid "ratio algo" msgstr "" msgid "zoom image" msgstr "" msgid "only if new mail present" msgstr "" msgid "active only" msgstr "" msgid "Flushing channel logo cache..." msgstr "" msgid "Show symbols" msgstr "" msgid " Show symbols in menu" msgstr "" msgid " Show symbols in replay" msgstr "" msgid " Show symbols in messages" msgstr "" msgid " Show symbols in audio" msgstr "" msgid "Colored status symbols in EPG details" msgstr "" msgid "Show symbols in lists" msgstr "" msgid "Show progressbar in lists" msgstr "" msgid "Show marker in lists" msgstr "" msgid "Show status symbols" msgstr "" msgid " Show flags" msgstr "" msgid " Show WSS mode symbols" msgstr "" msgid " Show mail icon" msgstr "" msgid "Show event/recording images" msgstr "" msgid " Resize images" msgstr "" msgid " Image width" msgstr "" msgid " Image height" msgstr "" msgid " Image format" msgstr "" msgid "Show channel logos" msgstr "" msgid " Identify channel by" msgstr "" msgid "name" msgstr "" msgid "data" msgstr "" msgid "Channel logo cache size" msgstr "" msgid "Button$Flush cache" msgstr "" msgid "left and right" msgstr "" msgid "to the left" msgstr "" msgid "Enable" msgstr "" msgid " Scroll OSD title" msgstr "" msgid " Scroll info area" msgstr "" msgid " Scroll active list items" msgstr "" msgid " Scroll other items" msgstr "" msgid " Scroll behaviour" msgstr "" msgid " Scroll delay (ms)" msgstr "" msgid " Scroll pause (ms)" msgstr "" msgid " Blink pause (ms)" msgstr "" msgid "Name" msgstr "" msgid "Width" msgstr "" msgid "No TrueType fonts installed!" msgstr "" msgid "Fixed Font" msgstr "" msgid "Button$Set" msgstr "" msgid "OSD title" msgstr "" msgid "Messages" msgstr "" msgid "Date" msgstr "" msgid "Help keys" msgstr "" msgid "Channelinfo: title" msgstr "" msgid "Channelinfo: subtitle" msgstr "" msgid "Channelinfo: language" msgstr "" msgid "List items" msgstr "" msgid "Info area: timers title" msgstr "" msgid "Info area: timers text" msgstr "" msgid "Info area: warning title" msgstr "" msgid "Info area: warning text" msgstr "" msgid "Details: title" msgstr "" msgid "Details: subtitle" msgstr "" msgid "Details: date" msgstr "" msgid "Details: text" msgstr "" msgid "Replay: times" msgstr "" msgid "if exists" msgstr "" msgid "Number of Reruns" msgstr "" msgid "Use Subtitle for reruns" msgstr "" msgid "Show timer conflicts" msgstr "" msgid "EnigmaNG skin" msgstr "" msgid "Channel:" msgstr "" msgid "Search pattern:" msgstr "" msgid "Timer check" msgstr "" msgid "No timer check" msgstr "" vdr-plugin-skinenigmang-0.1.5/po/ru_RU.po000066400000000000000000000145441435005021200202660ustar00rootroot00000000000000# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Vyacheslav Dikonov , 2004 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-08-24 17:33+0200\n" "PO-Revision-Date: 2007-12-18 08:11+0100\n" "Last-Translator: SergArb @vdr-portal.de / neptunvasja @vdr-portal.de\n" "Language-Team: \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-5\n" "Content-Transfer-Encoding: 8bit\n" msgid "Free-To-Air" msgstr "" msgid "encrypted" msgstr "" msgid "*** Invalid Channel ***" msgstr "*** ½ÕßàÐÒØÛìÝëÙ ÚÐÝÐÛ ***" msgid "WARNING" msgstr "¿Àµ´Ã¿Àµ¶´µ½¸µ" msgid "Timer conflict" msgstr "ºÞÝäÛØÚâ âÐÙÜÕàÐ" msgid "Timer conflicts" msgstr "ºÞÝäÛØÚâë âÐÙÜÕàÞÒ" msgid "TIMERS" msgstr "°¹¼µÀË" msgid "min" msgstr "ÜØÝ" msgid "Content: " msgstr "" msgid "Video" msgstr "" msgid "Audio" msgstr "" msgid "Subtitles" msgstr "" msgid "RERUNS OF THIS SHOW" msgstr "¿¾²Â¾Àµ½¸Ï" msgid "Size" msgstr "ÀÐ×ÜÕà" msgid "cut" msgstr "" msgid "Length" msgstr "" msgid "Format" msgstr "" msgid "Est. bitrate" msgstr "" msgid "Auxiliary information" msgstr "ÀÐáè. ØÝäÞàÜÐæØï" msgid "Mute" msgstr "²ëÚÛ.×ÒãÚ" msgid "Volume" msgstr "³àÞÜÚÞáâì" msgid "EnigmaNG" msgstr "EnigmaNG" msgid "TrueType Font" msgstr "" msgid "Default OSD Font" msgstr "" msgid "Default Fixed Size Font" msgstr "" msgid "Default Small Font" msgstr "" msgid "General" msgstr "" msgid "Logos & Symbols" msgstr "»ÞÓÞâØßë & áØÜÒÞÛë" msgid "Animated Text" msgstr "" msgid "Fonts" msgstr "" msgid "EPGSearch" msgstr "" msgid "elapsed" msgstr "ØáâÕÚèØÕ" msgid "remaining" msgstr "ÞáâÐÛìÝëÕ" msgid "percent" msgstr "ßàÞæÕÝâ" #, fuzzy msgid "elapsed/remaining" msgstr "ÞáâÐÛìÝëÕ" msgid "never" msgstr "ÝØÚÞÓÔÐ" msgid "use size.vdr only" msgstr "ØáßÞÛì×ÞÒÐâì âÞÛìÚÞ size.vdr" msgid "always" msgstr "ÒáÕÓÔÐ" msgid "Last line" msgstr "" msgid "Help buttons" msgstr "" msgid "Free last line" msgstr "" msgid "if required" msgstr "" msgid "Try 8bpp single area" msgstr "" msgid "Round corners" msgstr "" msgid "Full title width" msgstr "¿ÞÛÝÐï èØàØÝÐ ×ÐÓÞÛÞÒÚÐ" msgid "Show VPS" msgstr "¿ÞÚÐ×ëÒÐâì VPS" msgid "Dynamic OSD size" msgstr "" msgid "Menu OSD" msgstr "" msgid "Show info area in main menu" msgstr "¿ÞÚÐ×ëÒÐâì ØÝä. ÞÑÛÐáìâ Ò ÓÛ. ÜÕÝî" msgid " Min width of info area" msgstr "" msgid "Show messages in menu on" msgstr "" #, fuzzy msgid "Show scrollbar in menu" msgstr " ¿ÞÚÐ×Ðâì áØÜÒÞÛë Ò ÜÕÝî" msgid "EPG & Recording Details OSD" msgstr "" msgid "Show auxiliary information" msgstr "¿ÞÚÐ×ëÒÐâì àÐáè. ØÝäÞàÜÐæØî" msgid "Show recording's size" msgstr "¿ÞÚÐ×ëÒÐâì àÐ×ÜÕàë ×ÐߨáÕÙ" msgid "Channel Info OSD" msgstr "" msgid "Show remaining/elapsed time" msgstr "¿ÞÚÐ×ëÒÐâì ÞáâÐÒ./ßàÞèÕÔ. ÒàÕÜï" msgid "Width of progress bar" msgstr "" #, fuzzy msgid "Show signal info" msgstr " ¿ÞÚÐ×Ðâì ×ÝÐçÞÚ íÛÕÚâ. ßÞçâë" msgid " Width of signal info" msgstr "" msgid "Show CA system as text" msgstr "" msgid "Show Category - Genre / Contents" msgstr "" msgid "pixel algo" msgstr "ÐÛÓÞàØâÜ ßØÚáÕÛï" msgid "ratio algo" msgstr "ÐÛÓÞàØâÜ áÞÞâÝÞèÕÝØï" msgid "zoom image" msgstr "ÃÒÕÛØçØâì" msgid "only if new mail present" msgstr "âÞÛìÚÞ ßàØ ÝÞÒÞÜ áÞÞÑéÕÝØØ" msgid "active only" msgstr "" msgid "Flushing channel logo cache..." msgstr "¾çØéÐî ÚÕè..." msgid "Show symbols" msgstr "¿ÞÚÐ×ëÒÐâì áØÜÒÞÛë" msgid " Show symbols in menu" msgstr " ¿ÞÚÐ×Ðâì áØÜÒÞÛë Ò ÜÕÝî" msgid " Show symbols in replay" msgstr "" msgid " Show symbols in messages" msgstr "" msgid " Show symbols in audio" msgstr "" msgid "Colored status symbols in EPG details" msgstr "" msgid "Show symbols in lists" msgstr "¿ÞÚÐ×ëÒÐâì áØÜÒÞÛë Ò áߨáÚÐå" msgid "Show progressbar in lists" msgstr "" msgid "Show marker in lists" msgstr "¿ÞÚÐ×ëÒÐâì ÜÕâÚã Ò áߨáÚÐå" #, fuzzy msgid "Show status symbols" msgstr "¿ÞÚÐ×ëÒÐâì áØÜÒÞÛë" msgid " Show flags" msgstr " ¿ÞÚÐ×Ðâì äÛÐÓØ" msgid " Show WSS mode symbols" msgstr "" msgid " Show mail icon" msgstr " ¿ÞÚÐ×Ðâì ×ÝÐçÞÚ íÛÕÚâ. ßÞçâë" msgid "Show event/recording images" msgstr "¸×ÞÑàÐÖÕÝØï Ò EPG" msgid " Resize images" msgstr " ¿ÕàÕàÕèÐâì ØáßÞÛì×ãï" msgid " Image width" msgstr " ÈØàØÝÐ Ø×ÞÑàÐÖÕÝØï" msgid " Image height" msgstr " ²ëáÞâÐ Ø×ÞÑàÐÖÕÝØï" msgid " Image format" msgstr " ÄÞàÜÐâ Ø×ÞÑàÐÖÕÝØï" msgid "Show channel logos" msgstr "¿ÞÚÐ×ëÒÐâì ÛÞÓÞ ÚÐÝÐÛÞÒ" msgid " Identify channel by" msgstr " ¾ßàÕÔÕÛïâì ÚÐÝÐÛ ßÞ" msgid "name" msgstr "ÝÐ×ÒÐÝØî" msgid "data" msgstr "ÔÐÝÝëÜ" msgid "Channel logo cache size" msgstr "ÀÐ×ÜÕà ÚÕèÐ ÛÞÓoâØßÞÒ ÚÐÝÐÛÞÒ" msgid "Button$Flush cache" msgstr "¾çØáâØâì ÚÕè" msgid "left and right" msgstr "" msgid "to the left" msgstr "" msgid "Enable" msgstr "" msgid " Scroll OSD title" msgstr "" msgid " Scroll info area" msgstr "" msgid " Scroll active list items" msgstr "" msgid " Scroll other items" msgstr "" msgid " Scroll behaviour" msgstr "" msgid " Scroll delay (ms)" msgstr "" msgid " Scroll pause (ms)" msgstr "" msgid " Blink pause (ms)" msgstr "" msgid "Name" msgstr "" msgid "Width" msgstr "" msgid "No TrueType fonts installed!" msgstr "" msgid "Fixed Font" msgstr "" msgid "Button$Set" msgstr "" msgid "OSD title" msgstr "" msgid "Messages" msgstr "" msgid "Date" msgstr "" msgid "Help keys" msgstr "" msgid "Channelinfo: title" msgstr "" msgid "Channelinfo: subtitle" msgstr "" msgid "Channelinfo: language" msgstr "" msgid "List items" msgstr "" msgid "Info area: timers title" msgstr "" msgid "Info area: timers text" msgstr "" msgid "Info area: warning title" msgstr "" msgid "Info area: warning text" msgstr "" msgid "Details: title" msgstr "" msgid "Details: subtitle" msgstr "" msgid "Details: date" msgstr "" msgid "Details: text" msgstr "" msgid "Replay: times" msgstr "" msgid "if exists" msgstr "ÕáÛØ Ò ÝÐÛØçØØ" msgid "Number of Reruns" msgstr "ºÞÛØçÕáâÒÞ ßÞÒâÞàÕÝØÙ" msgid "Use Subtitle for reruns" msgstr "¸áßÞÛì×. ßÞÔ×ÐÓÞÛÞÒÚØ ÔÛï ßÞÒâÞàÕÝØï" msgid "Show timer conflicts" msgstr "¿ÞÚÐ×Ðâì ÚÞÝäÛØÚâë âÐÙÜÕàÞÒ" msgid "EnigmaNG skin" msgstr "EnigmaNG áÚØÝ" msgid "Channel:" msgstr "" msgid "Search pattern:" msgstr "" msgid "Timer check" msgstr "¿àÞÒÕàÚÐ âÐÙÜÕàÞÒ" msgid "No timer check" msgstr "" #~ msgid "Show progressbar" #~ msgstr "¿ÞÚÐ×ëÒÐâì ØÝÔØÚÐâÞà ßàÞÔÒØÖÕÝØï" #~ msgid "Languages" #~ msgstr "Ï×ëÚØ" vdr-plugin-skinenigmang-0.1.5/po/sl_SI.po000066400000000000000000000124051435005021200202350ustar00rootroot00000000000000# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Miha Setina , 2000 # Matjaz Thaler , 2003 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-08-24 17:33+0200\n" "PO-Revision-Date: 2007-12-18 08:11+0100\n" "Last-Translator: Matjaz Thaler \n" "Language-Team: \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-2\n" "Content-Transfer-Encoding: 8bit\n" msgid "Free-To-Air" msgstr "" msgid "encrypted" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "WARNING" msgstr "" msgid "Timer conflict" msgstr "" msgid "Timer conflicts" msgstr "" msgid "TIMERS" msgstr "" msgid "min" msgstr "" msgid "Content: " msgstr "" msgid "Video" msgstr "" msgid "Audio" msgstr "" msgid "Subtitles" msgstr "" msgid "RERUNS OF THIS SHOW" msgstr "" msgid "Size" msgstr "" msgid "cut" msgstr "" msgid "Length" msgstr "" msgid "Format" msgstr "" msgid "Est. bitrate" msgstr "" msgid "Auxiliary information" msgstr "" msgid "Mute" msgstr "" msgid "Volume" msgstr "" msgid "EnigmaNG" msgstr "" msgid "TrueType Font" msgstr "" msgid "Default OSD Font" msgstr "" msgid "Default Fixed Size Font" msgstr "" msgid "Default Small Font" msgstr "" msgid "General" msgstr "" msgid "Logos & Symbols" msgstr "" msgid "Animated Text" msgstr "" msgid "Fonts" msgstr "" msgid "EPGSearch" msgstr "" msgid "elapsed" msgstr "" msgid "remaining" msgstr "" msgid "percent" msgstr "" msgid "elapsed/remaining" msgstr "" msgid "never" msgstr "" msgid "use size.vdr only" msgstr "" msgid "always" msgstr "" msgid "Last line" msgstr "" msgid "Help buttons" msgstr "" msgid "Free last line" msgstr "" msgid "if required" msgstr "" msgid "Try 8bpp single area" msgstr "" msgid "Round corners" msgstr "" msgid "Full title width" msgstr "" msgid "Show VPS" msgstr "" msgid "Dynamic OSD size" msgstr "" msgid "Menu OSD" msgstr "" msgid "Show info area in main menu" msgstr "" msgid " Min width of info area" msgstr "" msgid "Show messages in menu on" msgstr "" msgid "Show scrollbar in menu" msgstr "" msgid "EPG & Recording Details OSD" msgstr "" msgid "Show auxiliary information" msgstr "" msgid "Show recording's size" msgstr "" msgid "Channel Info OSD" msgstr "" msgid "Show remaining/elapsed time" msgstr "" msgid "Width of progress bar" msgstr "" msgid "Show signal info" msgstr "" msgid " Width of signal info" msgstr "" msgid "Show CA system as text" msgstr "" msgid "Show Category - Genre / Contents" msgstr "" msgid "pixel algo" msgstr "" msgid "ratio algo" msgstr "" msgid "zoom image" msgstr "" msgid "only if new mail present" msgstr "" msgid "active only" msgstr "" msgid "Flushing channel logo cache..." msgstr "" msgid "Show symbols" msgstr "" msgid " Show symbols in menu" msgstr "" msgid " Show symbols in replay" msgstr "" msgid " Show symbols in messages" msgstr "" msgid " Show symbols in audio" msgstr "" msgid "Colored status symbols in EPG details" msgstr "" msgid "Show symbols in lists" msgstr "" msgid "Show progressbar in lists" msgstr "" msgid "Show marker in lists" msgstr "" msgid "Show status symbols" msgstr "" msgid " Show flags" msgstr "" msgid " Show WSS mode symbols" msgstr "" msgid " Show mail icon" msgstr "" msgid "Show event/recording images" msgstr "" msgid " Resize images" msgstr "" msgid " Image width" msgstr "" msgid " Image height" msgstr "" msgid " Image format" msgstr "" msgid "Show channel logos" msgstr "" msgid " Identify channel by" msgstr "" msgid "name" msgstr "" msgid "data" msgstr "" msgid "Channel logo cache size" msgstr "" msgid "Button$Flush cache" msgstr "" msgid "left and right" msgstr "" msgid "to the left" msgstr "" msgid "Enable" msgstr "" msgid " Scroll OSD title" msgstr "" msgid " Scroll info area" msgstr "" msgid " Scroll active list items" msgstr "" msgid " Scroll other items" msgstr "" msgid " Scroll behaviour" msgstr "" msgid " Scroll delay (ms)" msgstr "" msgid " Scroll pause (ms)" msgstr "" msgid " Blink pause (ms)" msgstr "" msgid "Name" msgstr "" msgid "Width" msgstr "" msgid "No TrueType fonts installed!" msgstr "" msgid "Fixed Font" msgstr "" msgid "Button$Set" msgstr "" msgid "OSD title" msgstr "" msgid "Messages" msgstr "" msgid "Date" msgstr "" msgid "Help keys" msgstr "" msgid "Channelinfo: title" msgstr "" msgid "Channelinfo: subtitle" msgstr "" msgid "Channelinfo: language" msgstr "" msgid "List items" msgstr "" msgid "Info area: timers title" msgstr "" msgid "Info area: timers text" msgstr "" msgid "Info area: warning title" msgstr "" msgid "Info area: warning text" msgstr "" msgid "Details: title" msgstr "" msgid "Details: subtitle" msgstr "" msgid "Details: date" msgstr "" msgid "Details: text" msgstr "" msgid "Replay: times" msgstr "" msgid "if exists" msgstr "" msgid "Number of Reruns" msgstr "" msgid "Use Subtitle for reruns" msgstr "" msgid "Show timer conflicts" msgstr "" msgid "EnigmaNG skin" msgstr "" msgid "Channel:" msgstr "" msgid "Search pattern:" msgstr "" msgid "Timer check" msgstr "" msgid "No timer check" msgstr "" vdr-plugin-skinenigmang-0.1.5/po/sv_SE.po000066400000000000000000000130111435005021200202350ustar00rootroot00000000000000# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Tomas Prybil , 2002 # Jan Ekholm , 2003 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-08-24 17:33+0200\n" "PO-Revision-Date: 2007-12-18 08:11+0100\n" "Last-Translator: Tomas Prybil \n" "Language-Team: \n" "Language: se\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" msgid "Free-To-Air" msgstr "" msgid "encrypted" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "WARNING" msgstr "" msgid "Timer conflict" msgstr "" msgid "Timer conflicts" msgstr "" msgid "TIMERS" msgstr "" msgid "min" msgstr "min" msgid "Content: " msgstr "" msgid "Video" msgstr "" msgid "Audio" msgstr "" msgid "Subtitles" msgstr "" msgid "RERUNS OF THIS SHOW" msgstr "" msgid "Size" msgstr "" msgid "cut" msgstr "" msgid "Length" msgstr "" msgid "Format" msgstr "" msgid "Est. bitrate" msgstr "" msgid "Auxiliary information" msgstr "Extrainformation" msgid "Mute" msgstr "" msgid "Volume" msgstr "" msgid "EnigmaNG" msgstr "EnigmaNG" msgid "TrueType Font" msgstr "" msgid "Default OSD Font" msgstr "" msgid "Default Fixed Size Font" msgstr "" msgid "Default Small Font" msgstr "" msgid "General" msgstr "" msgid "Logos & Symbols" msgstr "" msgid "Animated Text" msgstr "" msgid "Fonts" msgstr "" msgid "EPGSearch" msgstr "" msgid "elapsed" msgstr "" msgid "remaining" msgstr "" msgid "percent" msgstr "" msgid "elapsed/remaining" msgstr "" msgid "never" msgstr "" msgid "use size.vdr only" msgstr "" msgid "always" msgstr "" msgid "Last line" msgstr "" msgid "Help buttons" msgstr "" msgid "Free last line" msgstr "" msgid "if required" msgstr "" msgid "Try 8bpp single area" msgstr "" msgid "Round corners" msgstr "" msgid "Full title width" msgstr "" msgid "Show VPS" msgstr "" msgid "Dynamic OSD size" msgstr "" msgid "Menu OSD" msgstr "" msgid "Show info area in main menu" msgstr "" msgid " Min width of info area" msgstr "" msgid "Show messages in menu on" msgstr "" msgid "Show scrollbar in menu" msgstr "" msgid "EPG & Recording Details OSD" msgstr "" msgid "Show auxiliary information" msgstr "Visa extrainformation" msgid "Show recording's size" msgstr "" msgid "Channel Info OSD" msgstr "" msgid "Show remaining/elapsed time" msgstr "" msgid "Width of progress bar" msgstr "" msgid "Show signal info" msgstr "" msgid " Width of signal info" msgstr "" msgid "Show CA system as text" msgstr "" msgid "Show Category - Genre / Contents" msgstr "" msgid "pixel algo" msgstr "" msgid "ratio algo" msgstr "" msgid "zoom image" msgstr "" msgid "only if new mail present" msgstr "" msgid "active only" msgstr "" msgid "Flushing channel logo cache..." msgstr "Tömmer cachen..." msgid "Show symbols" msgstr "Visa symboler" msgid " Show symbols in menu" msgstr "" msgid " Show symbols in replay" msgstr "" msgid " Show symbols in messages" msgstr "" msgid " Show symbols in audio" msgstr "" msgid "Colored status symbols in EPG details" msgstr "" msgid "Show symbols in lists" msgstr "" msgid "Show progressbar in lists" msgstr "" msgid "Show marker in lists" msgstr "" #, fuzzy msgid "Show status symbols" msgstr "Visa symboler" msgid " Show flags" msgstr "" msgid " Show WSS mode symbols" msgstr "" msgid " Show mail icon" msgstr "" msgid "Show event/recording images" msgstr "" msgid " Resize images" msgstr "" msgid " Image width" msgstr "" msgid " Image height" msgstr "" msgid " Image format" msgstr "" msgid "Show channel logos" msgstr "Visa kanallogotyper" msgid " Identify channel by" msgstr " Identifiera kanal med" msgid "name" msgstr "namn" msgid "data" msgstr "data" msgid "Channel logo cache size" msgstr "Cachestorlek för logotyper" msgid "Button$Flush cache" msgstr "Töm cachen" msgid "left and right" msgstr "" msgid "to the left" msgstr "" msgid "Enable" msgstr "" msgid " Scroll OSD title" msgstr "" msgid " Scroll info area" msgstr "" msgid " Scroll active list items" msgstr "" msgid " Scroll other items" msgstr "" msgid " Scroll behaviour" msgstr "" msgid " Scroll delay (ms)" msgstr "" msgid " Scroll pause (ms)" msgstr "" msgid " Blink pause (ms)" msgstr "" msgid "Name" msgstr "" msgid "Width" msgstr "" msgid "No TrueType fonts installed!" msgstr "" msgid "Fixed Font" msgstr "" msgid "Button$Set" msgstr "" msgid "OSD title" msgstr "" msgid "Messages" msgstr "" msgid "Date" msgstr "" msgid "Help keys" msgstr "" msgid "Channelinfo: title" msgstr "" msgid "Channelinfo: subtitle" msgstr "" msgid "Channelinfo: language" msgstr "" msgid "List items" msgstr "" msgid "Info area: timers title" msgstr "" msgid "Info area: timers text" msgstr "" msgid "Info area: warning title" msgstr "" msgid "Info area: warning text" msgstr "" msgid "Details: title" msgstr "" msgid "Details: subtitle" msgstr "" msgid "Details: date" msgstr "" msgid "Details: text" msgstr "" msgid "Replay: times" msgstr "" msgid "if exists" msgstr "" msgid "Number of Reruns" msgstr "" msgid "Use Subtitle for reruns" msgstr "" msgid "Show timer conflicts" msgstr "" msgid "EnigmaNG skin" msgstr "EnigmaNG-temat" msgid "Channel:" msgstr "" msgid "Search pattern:" msgstr "" msgid "Timer check" msgstr "" msgid "No timer check" msgstr "" #~ msgid "Show progressbar" #~ msgstr "Visa framsteg" #~ msgid "Languages" #~ msgstr "Språk" vdr-plugin-skinenigmang-0.1.5/po/tr_TR.po000066400000000000000000000123031435005021200202530ustar00rootroot00000000000000# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Oktay Yolgeçen , 2007 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-08-24 17:33+0200\n" "PO-Revision-Date: 2007-12-18 08:11+0100\n" "Last-Translator: Oktay Yolgeçen \n" "Language-Team: \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-9\n" "Content-Transfer-Encoding: 8bit\n" msgid "Free-To-Air" msgstr "" msgid "encrypted" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "WARNING" msgstr "" msgid "Timer conflict" msgstr "" msgid "Timer conflicts" msgstr "" msgid "TIMERS" msgstr "" msgid "min" msgstr "" msgid "Content: " msgstr "" msgid "Video" msgstr "" msgid "Audio" msgstr "" msgid "Subtitles" msgstr "" msgid "RERUNS OF THIS SHOW" msgstr "" msgid "Size" msgstr "" msgid "cut" msgstr "" msgid "Length" msgstr "" msgid "Format" msgstr "" msgid "Est. bitrate" msgstr "" msgid "Auxiliary information" msgstr "" msgid "Mute" msgstr "" msgid "Volume" msgstr "" msgid "EnigmaNG" msgstr "" msgid "TrueType Font" msgstr "" msgid "Default OSD Font" msgstr "" msgid "Default Fixed Size Font" msgstr "" msgid "Default Small Font" msgstr "" msgid "General" msgstr "" msgid "Logos & Symbols" msgstr "" msgid "Animated Text" msgstr "" msgid "Fonts" msgstr "" msgid "EPGSearch" msgstr "" msgid "elapsed" msgstr "" msgid "remaining" msgstr "" msgid "percent" msgstr "" msgid "elapsed/remaining" msgstr "" msgid "never" msgstr "" msgid "use size.vdr only" msgstr "" msgid "always" msgstr "" msgid "Last line" msgstr "" msgid "Help buttons" msgstr "" msgid "Free last line" msgstr "" msgid "if required" msgstr "" msgid "Try 8bpp single area" msgstr "" msgid "Round corners" msgstr "" msgid "Full title width" msgstr "" msgid "Show VPS" msgstr "" msgid "Dynamic OSD size" msgstr "" msgid "Menu OSD" msgstr "" msgid "Show info area in main menu" msgstr "" msgid " Min width of info area" msgstr "" msgid "Show messages in menu on" msgstr "" msgid "Show scrollbar in menu" msgstr "" msgid "EPG & Recording Details OSD" msgstr "" msgid "Show auxiliary information" msgstr "" msgid "Show recording's size" msgstr "" msgid "Channel Info OSD" msgstr "" msgid "Show remaining/elapsed time" msgstr "" msgid "Width of progress bar" msgstr "" msgid "Show signal info" msgstr "" msgid " Width of signal info" msgstr "" msgid "Show CA system as text" msgstr "" msgid "Show Category - Genre / Contents" msgstr "" msgid "pixel algo" msgstr "" msgid "ratio algo" msgstr "" msgid "zoom image" msgstr "" msgid "only if new mail present" msgstr "" msgid "active only" msgstr "" msgid "Flushing channel logo cache..." msgstr "" msgid "Show symbols" msgstr "" msgid " Show symbols in menu" msgstr "" msgid " Show symbols in replay" msgstr "" msgid " Show symbols in messages" msgstr "" msgid " Show symbols in audio" msgstr "" msgid "Colored status symbols in EPG details" msgstr "" msgid "Show symbols in lists" msgstr "" msgid "Show progressbar in lists" msgstr "" msgid "Show marker in lists" msgstr "" msgid "Show status symbols" msgstr "" msgid " Show flags" msgstr "" msgid " Show WSS mode symbols" msgstr "" msgid " Show mail icon" msgstr "" msgid "Show event/recording images" msgstr "" msgid " Resize images" msgstr "" msgid " Image width" msgstr "" msgid " Image height" msgstr "" msgid " Image format" msgstr "" msgid "Show channel logos" msgstr "" msgid " Identify channel by" msgstr "" msgid "name" msgstr "" msgid "data" msgstr "" msgid "Channel logo cache size" msgstr "" msgid "Button$Flush cache" msgstr "" msgid "left and right" msgstr "" msgid "to the left" msgstr "" msgid "Enable" msgstr "" msgid " Scroll OSD title" msgstr "" msgid " Scroll info area" msgstr "" msgid " Scroll active list items" msgstr "" msgid " Scroll other items" msgstr "" msgid " Scroll behaviour" msgstr "" msgid " Scroll delay (ms)" msgstr "" msgid " Scroll pause (ms)" msgstr "" msgid " Blink pause (ms)" msgstr "" msgid "Name" msgstr "" msgid "Width" msgstr "" msgid "No TrueType fonts installed!" msgstr "" msgid "Fixed Font" msgstr "" msgid "Button$Set" msgstr "" msgid "OSD title" msgstr "" msgid "Messages" msgstr "" msgid "Date" msgstr "" msgid "Help keys" msgstr "" msgid "Channelinfo: title" msgstr "" msgid "Channelinfo: subtitle" msgstr "" msgid "Channelinfo: language" msgstr "" msgid "List items" msgstr "" msgid "Info area: timers title" msgstr "" msgid "Info area: timers text" msgstr "" msgid "Info area: warning title" msgstr "" msgid "Info area: warning text" msgstr "" msgid "Details: title" msgstr "" msgid "Details: subtitle" msgstr "" msgid "Details: date" msgstr "" msgid "Details: text" msgstr "" msgid "Replay: times" msgstr "" msgid "if exists" msgstr "" msgid "Number of Reruns" msgstr "" msgid "Use Subtitle for reruns" msgstr "" msgid "Show timer conflicts" msgstr "" msgid "EnigmaNG skin" msgstr "" msgid "Channel:" msgstr "" msgid "Search pattern:" msgstr "" msgid "Timer check" msgstr "" msgid "No timer check" msgstr "" vdr-plugin-skinenigmang-0.1.5/services/000077500000000000000000000000001435005021200200675ustar00rootroot00000000000000vdr-plugin-skinenigmang-0.1.5/services/avards.h000066400000000000000000000014451435005021200215240ustar00rootroot00000000000000/* * avards-services.h: A plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * * $Id: avards.h,v 1.1 2007/11/22 09:01:05 amair Exp $ */ #ifndef __AVARDS_SERVICES_H #define __AVARDS_SERVICES_H #if APIVERSNUM < 10504 #define AVARDS_MAXOSDSIZE_SERVICE_STRING_ID "avards-MaxOSDsize-v1.0" struct avards_MaxOSDsize_v1_0 { int left, top, width, height; }; #endif #define AVARDS_CURRENT_WSSMODE_SERVICE_STRING_ID "avards-CurrentWSSMode-v1.0" struct avards_CurrentWssMode_v1_0 { const char *ModeString; }; #define AVARDS_CURRENT_VIDEO_FORMAT_SERVICE_STRING_ID "avards-CurrentVideoFormat-v1.0" struct avards_CurrentVideoFormat_v1_0 { const char *ModeString; int Mode; int Width; int Height; }; #endif // __AVARDS_SERVICES_H vdr-plugin-skinenigmang-0.1.5/services/epgsearch.h000066400000000000000000000137371435005021200222140ustar00rootroot00000000000000/* Copyright (C) 2004-2007 Christian Wieninger 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 Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef EPGSEARCHSERVICES_INC #define EPGSEARCHSERVICES_INC // Added by Andreas Mair (mail _AT_ andreas _DOT_ vdr-developer _DOT_ org) #define EPGSEARCH_SEARCHRESULTS_SERVICE_STRING_ID "Epgsearch-searchresults-v1.0" #define EPGSEARCH_LASTCONFLICTINFO_SERVICE_STRING_ID "Epgsearch-lastconflictinfo-v1.0" #include #include #include #include #include // Data structure for service "Epgsearch-search-v1.0" struct Epgsearch_search_v1_0 { // in char* query; // search term int mode; // search mode (0=phrase, 1=and, 2=or, 3=regular expression) int channelNr; // channel number to search in (0=any) bool useTitle; // search in title bool useSubTitle; // search in subtitle bool useDescription; // search in description // out cOsdMenu* pResultMenu; // pointer to the menu of results }; // Data structure for service "Epgsearch-exttimeredit-v1.0" struct Epgsearch_exttimeredit_v1_0 { // in cTimer* timer; // pointer to the timer to edit bool bNew; // flag that indicates, if this is a new timer or an existing one const cEvent* event; // pointer to the event corresponding to this timer (may be NULL) // out cOsdMenu* pTimerMenu; // pointer to the menu of results }; // Data structure for service "Epgsearch-updatesearchtimers-v1.0" struct Epgsearch_updatesearchtimers_v1_0 { // in bool showMessage; // inform via osd when finished? }; // Data structure for service "Epgsearch-osdmessage-v1.0" struct Epgsearch_osdmessage_v1_0 { // in char* message; // the message to display eMessageType type; }; // Data structure for service "EpgsearchMenu-v1.0" struct EpgSearchMenu_v1_0 { // in // out cOsdMenu* Menu; // pointer to the menu }; // Data structure for service "Epgsearch-lastconflictinfo-v1.0" struct Epgsearch_lastconflictinfo_v1_0 { // in // out time_t nextConflict; // next conflict date, 0 if none int relevantConflicts; // number of relevant conflicts int totalConflicts; // total number of conflicts }; // Data structure for service "Epgsearch-searchresults-v1.0" struct Epgsearch_searchresults_v1_0 { // in char* query; // search term int mode; // search mode (0=phrase, 1=and, 2=or, 3=regular expression) int channelNr; // channel number to search in (0=any) bool useTitle; // search in title bool useSubTitle; // search in subtitle bool useDescription; // search in description // out class cServiceSearchResult : public cListObject { public: const cEvent* event; cServiceSearchResult(const cEvent* Event) : event(Event) {} }; cList* pResultList; // pointer to the results }; // Data structure for service "Epgsearch-switchtimer-v1.0" struct Epgsearch_switchtimer_v1_0 { // in const cEvent* event; int mode; // mode (0=query existence, 1=add/modify, 2=delete) // in/out int switchMinsBefore; int announceOnly; // out bool success; // result }; // Data structures for service "Epgsearch-services-v1.0" class cServiceHandler { public: virtual std::list SearchTimerList() = 0; // returns a list of search timer entries in the same format as used in epgsearch.conf virtual int AddSearchTimer(const std::string&) = 0; // adds a new search timer and returns its ID (-1 on error) virtual bool ModSearchTimer(const std::string&) = 0; // edits an existing search timer and returns success virtual bool DelSearchTimer(int) = 0; // deletes search timer with given ID and returns success virtual std::list QuerySearchTimer(int) = 0; // returns the search result of the searchtimer with given ID in the same format as used in SVDRP command 'QRYS' (->MANUAL) virtual std::list QuerySearch(std::string) = 0; // returns the search result of the searchtimer with given settings in the same format as used in SVDRP command 'QRYS' (->MANUAL) virtual std::list ExtEPGInfoList() = 0; // returns a list of extended EPG categories in the same format as used in epgsearchcats.conf virtual std::list ChanGrpList() = 0; // returns a list of channel groups maintained by epgsearch virtual std::list BlackList() = 0; // returns a list of blacklists in the same format as used in epgsearchblacklists.conf virtual std::set DirectoryList() = 0; // List of all recording directories used in recordings, timers, search timers or in epgsearchdirs.conf virtual ~cServiceHandler() {} // Read a setup value virtual std::string ReadSetupValue(const std::string& entry) = 0; // Write a setup value virtual bool WriteSetupValue(const std::string& entry, const std::string& value) = 0; }; struct Epgsearch_services_v1_0 { // in/out std::unique_ptr handler; }; #endif vdr-plugin-skinenigmang-0.1.5/services/mailbox.h000066400000000000000000000035571435005021200217050ustar00rootroot00000000000000//----------------------------------------------------------------------------- /* * Description: This file contains the names & types for the service-interface * * See the file README in the main directory for a description of * this software, copyright information, and how to reach the author. * * Author: alex * Date: 03.03.2006 * * Last modfied: * $Author: amair $ * $Date: 2007/11/22 09:01:05 $ * $Revision: 1.1 $ */ //----------------------------------------------------------------------------- #ifndef __AxMailBoxServiceTypes_H__ #define __AxMailBoxServiceTypes_H__ //----------------------------------------------------------------------------- // includes //----------------------------------------------------------------------------- //----- C++ ------------------------------------------------------------------- //----- C --------------------------------------------------------------------- //----- AxLib ----------------------------------------------------------------- //----- vdr ------------------------------------------------------------------- //----- local ----------------------------------------------------------------- //============================================================================= // Service-Names (ID) //============================================================================= #define MailBox_HasNewMail_v1_0_NAME "MailBox-HasNewMail-1.0" //============================================================================= // service MailBox-HasNewMail-1.0 //============================================================================= /** Ask if new mails are present * * The Data-parameter to cPlugin::Service() is simply a pointer to a bool * which - on return - is * - true if at least one mail account contains an unread mail * - false if none of the mail accounts cotains any unread mail */ #endif vdr-plugin-skinenigmang-0.1.5/setup.c000066400000000000000000000545451435005021200175650ustar00rootroot00000000000000/* * setup.c: 'EnigmaNG' skin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #include "common.h" #include "config.h" #include "logo.h" #include "setup.h" #include "tools.h" #ifdef USE_PLUGIN_EPGSEARCH #include "services/epgsearch.h" #endif #ifdef USE_PLUGIN_AVARDS #include "services/avards.h" #endif #ifdef USE_PLUGIN_MAILBOX #include "services/mailbox.h" #endif #include "texteffects.h" static const char *allVdrFonts[] = { trNOOP("TrueType Font"), trNOOP("Default OSD Font"), trNOOP("Default Fixed Size Font"), trNOOP("Default Small Font") }; // cPluginSkinEnigmaSetup cPluginSkinEnigmaSetup::cPluginSkinEnigmaSetup(void) { // create setup menu debug("cPluginSkinEnigmaSetup()"); data = EnigmaConfig; Setup(); } void cMenuSetupSubMenu::AddCategory(const char *Title) { char *buffer = NULL; if (-1 != asprintf(&buffer, "--- %s ---", Title )) { cOsdItem *item = new cOsdItem(buffer); free(buffer); if (item) { item->SetSelectable(false); Add(item); } } } void cPluginSkinEnigmaSetup::Setup(void) { // update setup display int currentItem = Current(); Clear(); Add(new cOsdItem(tr("General"))); Add(new cOsdItem(tr("Logos & Symbols"))); Add(new cOsdItem(tr("Animated Text"))); if (::Setup.UseSmallFont == 1) { // only if "Use small font" = "skin dependent" Add(new cOsdItem(tr("Fonts"))); } #ifdef USE_PLUGIN_EPGSEARCH if (cPluginManager::GetPlugin("epgsearch") != NULL) { Add(new cOsdItem(tr("EPGSearch"))); } //TODO? else display "EPGsearch plugin not found" #endif SetCurrent(Get(currentItem)); Display(); SetHelp(NULL, NULL, NULL, trVDR("Button$Open")); } void cPluginSkinEnigmaSetup::Store(void) { // store setup data debug("cPluginSkinEnigmaSetup::Store()"); EnigmaConfig = data; SetupStore("SingleArea8Bpp", EnigmaConfig.singleArea8Bpp); SetupStore("ShowAuxInfo", EnigmaConfig.showAuxInfo); SetupStore("ShowRemaining", EnigmaConfig.showRemaining); SetupStore("ShowProgressBar", EnigmaConfig.showProgressbar); SetupStore("ShowListSymbols", EnigmaConfig.showListSymbols); SetupStore("ShowSymbols", EnigmaConfig.showSymbols); SetupStore("ShowSymbolsMenu", EnigmaConfig.showSymbolsMenu); SetupStore("ShowSymbolsReplay", EnigmaConfig.showSymbolsReplay); SetupStore("ShowSymbolsMsgs", EnigmaConfig.showSymbolsMsgs); SetupStore("ShowSymbolsAudio", EnigmaConfig.showSymbolsAudio); SetupStore("ShowColSymbolsDetails", EnigmaConfig.showColSymbolsDetails); SetupStore("ShowLogo", EnigmaConfig.showLogo); SetupStore("ShowInfo", EnigmaConfig.showInfo); SetupStore("MinInfoWidth", EnigmaConfig.minInfoWidth); SetupStore("ShowVPS", EnigmaConfig.showVps); SetupStore("ShowFlags", EnigmaConfig.showFlags); SetupStore("ShowCatGenCon", EnigmaConfig.showCatGenCon); SetupStore("ShowMarker", EnigmaConfig.showMarker); SetupStore("CacheSize", EnigmaConfig.cacheSize); SetupStore("UseChannelId", EnigmaConfig.useChannelId); SetupStore("NumReruns", EnigmaConfig.numReruns); SetupStore("UseSubtitleRerun", EnigmaConfig.useSubtitleRerun); SetupStore("ShowTimerConflicts", EnigmaConfig.showTimerConflicts); SetupStore("ShowRecSize", EnigmaConfig.showRecSize); SetupStore("ShowImages", EnigmaConfig.showImages); SetupStore("ResizeImages", EnigmaConfig.resizeImages); SetupStore("ShowMailIcon", EnigmaConfig.showMailIcon); SetupStore("ImageWidth", EnigmaConfig.imageWidth); SetupStore("ImageHeight", EnigmaConfig.imageHeight); SetupStore("ImageExtension", EnigmaConfig.imageExtension); SetupStore("FullTitleWidth", EnigmaConfig.fullTitleWidth); SetupStore("UseTextEffects", EnigmaConfig.useTextEffects); SetupStore("ScrollDelay", EnigmaConfig.scrollDelay); SetupStore("ScrollPause", EnigmaConfig.scrollPause); SetupStore("ScrollMode", EnigmaConfig.scrollMode); SetupStore("BlinkPause", EnigmaConfig.blinkPause); SetupStore("ScrollInfo", EnigmaConfig.scrollInfo); SetupStore("ScrollListItem", EnigmaConfig.scrollListItem); SetupStore("ScrollOther", EnigmaConfig.scrollOther); SetupStore("ScrollTitle", EnigmaConfig.scrollTitle); SetupStore("DynOSD", EnigmaConfig.dynOsd); SetupStore("StatusLineMode", EnigmaConfig.statusLineMode); SetupStore("ShowWssSymbols", EnigmaConfig.showWssSymbols); SetupStore("ShowStatusSymbols", EnigmaConfig.showStatusSymbols); SetupStore("ShowScrollbar", EnigmaConfig.showScrollbar); SetupStore("ShowSignalInfo", EnigmaConfig.showSignalInfo); SetupStore("ShowCaMode", EnigmaConfig.showCaMode); SetupStore("DrawRoundCorners", EnigmaConfig.drawRoundCorners); SetupStore("ChannelLogoWidth", EnigmaConfig.channelLogoWidth); SetupStore("ChannelLogoHeight", EnigmaConfig.channelLogoHeight); SetupStore("SignalInfoWidth", EnigmaConfig.signalInfoWidth); SetupStore("ProgressBarWidth", EnigmaConfig.progressBarWidth); char tmp[sizeof(EnigmaConfig.allFonts[0].Name) + 8]; for (int id = 0; id < FONT_NUMFONTS; id++) { SetupStore(allFontConfig[id].KeyId, EnigmaConfig.allFonts[id].VdrId); if (EnigmaConfig.allFonts[id].Name[0] != 0) { snprintf(tmp, sizeof(tmp), "%s:%d,%d", EnigmaConfig.allFonts[id].Name, EnigmaConfig.allFonts[id].Size, EnigmaConfig.allFonts[id].Width); SetupStore(allFontConfig[id].KeyName, tmp); } } // resize logo cache EnigmaLogoCache.Resize(EnigmaConfig.cacheSize); } eOSState cPluginSkinEnigmaSetup::ProcessKey(eKeys Key) { bool hadSubMenu = HasSubMenu(); eOSState state = cMenuSetupPage::ProcessKey(Key); if (hadSubMenu && Key == kOk) Store(); if (!HasSubMenu() && (state == osUnknown || Key == kOk)) { if ((Key == kOk && !hadSubMenu) || Key == kBlue) { const char* ItemText = Get(Current())->Text(); if (strcmp(ItemText, tr("General")) == 0) state = AddSubMenu(new cMenuSetupGeneral(&data)); else if (strcmp(ItemText, tr("Logos & Symbols")) == 0) state = AddSubMenu(new cMenuSetupLogos(&data)); else if (strcmp(ItemText, tr("Animated Text")) == 0) state = AddSubMenu(new cMenuSetupAnimText(&data)); else if (strcmp(ItemText, tr("Fonts")) == 0) state = AddSubMenu(new cMenuSetupFonts(&data)); #ifdef USE_PLUGIN_EPGSEARCH else if (strcmp(ItemText, tr("EPGSearch")) == 0) state = AddSubMenu(new cMenuSetupEpgSearch(&data)); #endif } } return state; } // Setup: SubMenu cMenuSetupSubMenu::cMenuSetupSubMenu(const char* Title, cEnigmaConfig* Data) : cOsdMenu(Title, 30) { data = Data; } eOSState cMenuSetupSubMenu::ProcessKey(eKeys Key) { eOSState state = cOsdMenu::ProcessKey(Key); if (state == osUnknown) { switch (Key) { case kOk: return osBack; default: break; } } return state; } // Setup: General cMenuSetupGeneral::cMenuSetupGeneral(cEnigmaConfig* Data) : cMenuSetupSubMenu(tr("General"), Data) { showRemainingTexts[0] = tr("elapsed"); showRemainingTexts[1] = tr("remaining"); showRemainingTexts[2] = tr("percent"); showRemainingTexts[3] = tr("elapsed/remaining"); showRecSizeTexts[0] = tr("never"); showRecSizeTexts[1] = tr("use size.vdr only"); showRecSizeTexts[2] = tr("always"); statusLineModeTexts[0] = tr("Last line"); statusLineModeTexts[1] = tr("Help buttons"); statusLineModeTexts[2] = tr("Free last line"); showScrollbarTexts[0] = trVDR("no"); showScrollbarTexts[1] = trVDR("yes"); showScrollbarTexts[2] = tr("if required"); Set(); } eOSState cMenuSetupGeneral::ProcessKey(eKeys Key) { int oldShowInfo = data->showInfo; #ifndef DISABLE_SIGNALINFO int oldShowSignalInfo = data->showSignalInfo; #endif eOSState state = cMenuSetupSubMenu::ProcessKey(Key); if (Key != kNone && ((data->showInfo != oldShowInfo) #ifndef DISABLE_SIGNALINFO || (data->showSignalInfo != oldShowSignalInfo) #endif )) { Set(); } if (state == osUnknown) { switch (Key) { case kOk: return osBack; default: break; } } return state; } void cMenuSetupGeneral::Set(void) { int currentItem = Current(); Clear(); Add(new cMenuEditBoolItem(tr("Try 8bpp single area"), &data->singleArea8Bpp)); Add(new cMenuEditBoolItem(tr("Round corners"), &data->drawRoundCorners)); Add(new cMenuEditBoolItem(tr("Full title width"), &data->fullTitleWidth)); // channel info / replay / tracks Add(new cMenuEditBoolItem(tr("Show VPS"), &data->showVps)); // channel info / epg details Add(new cMenuEditBoolItem(tr("Dynamic OSD size"), &data->dynOsd)); AddCategory(tr("Menu OSD")); Add(new cMenuEditBoolItem(tr("Show info area in main menu"), &data->showInfo)); if (data->showInfo) Add(new cMenuEditIntItem(tr(" Min width of info area"), &data->minInfoWidth, 80, Setup.OSDWidth)); Add(new cMenuEditStraItem(tr("Show messages in menu on"), &data->statusLineMode, 3, statusLineModeTexts)); Add(new cMenuEditStraItem(tr("Show scrollbar in menu"), &data->showScrollbar, 3, showScrollbarTexts)); AddCategory(tr("EPG & Recording Details OSD")); Add(new cMenuEditBoolItem(tr("Show auxiliary information"), &data->showAuxInfo, trVDR("top"), trVDR("bottom"))); Add(new cMenuEditStraItem(tr("Show recording's size"), &data->showRecSize, 3, showRecSizeTexts)); AddCategory(tr("Channel Info OSD")); Add(new cMenuEditStraItem(tr("Show remaining/elapsed time"), &data->showRemaining, 4, showRemainingTexts)); Add(new cMenuEditIntItem(tr("Width of progress bar"), &data->progressBarWidth, 74, Setup.OSDWidth)); #ifndef DISABLE_SIGNALINFO Add(new cMenuEditBoolItem(tr("Show signal info"), &data->showSignalInfo)); if (data->showSignalInfo) Add(new cMenuEditIntItem(tr(" Width of signal info"), &data->signalInfoWidth, 74, Setup.OSDWidth)); #endif //DISABLE_SIGNALINFO Add(new cMenuEditBoolItem(tr("Show CA system as text"), &data->showCaMode)); Add(new cMenuEditBoolItem(tr("Show Category - Genre / Contents"), &data->showCatGenCon)); SetCurrent(Get(currentItem)); Display(); SetHelp(NULL, NULL, NULL, NULL); } // Setup: Logos & Symbols cMenuSetupLogos::cMenuSetupLogos(cEnigmaConfig* Data) : cMenuSetupSubMenu(tr("Logos & Symbols"), Data) { #ifndef SKINENIGMA_NO_MENULOGO resizeImagesTexts[0] = tr("pixel algo"); resizeImagesTexts[1] = tr("ratio algo"); resizeImagesTexts[2] = tr("zoom image"); #endif #ifdef USE_PLUGIN_MAILBOX showMailIconTexts[0] = tr("never"); showMailIconTexts[1] = tr("only if new mail present"); showMailIconTexts[2] = tr("always"); #endif showStatusSymbolsTexts[0] = trVDR("no"); showStatusSymbolsTexts[1] = trVDR("yes"); showStatusSymbolsTexts[2] = tr("active only"); Set(); } eOSState cMenuSetupLogos::ProcessKey(eKeys Key) { int oldShowLogo = data->showLogo; int oldShowSymbols = data->showSymbols; int oldShowStatusSymbols = data->showStatusSymbols; int oldShowSymbolsMenu = data->showSymbolsMenu; int oldShowImages = data->showImages; eOSState state = cMenuSetupSubMenu::ProcessKey(Key); if ((state == osUnknown) && (Key == kRed)) { Skins.Message(mtInfo, tr("Flushing channel logo cache...")); EnigmaLogoCache.Flush(); Skins.Message(mtInfo, NULL); state = osContinue; } if (Key != kNone && ((data->showLogo != oldShowLogo) || (data->showSymbols != oldShowSymbols) || (data->showStatusSymbols != oldShowStatusSymbols) || (data->showSymbolsMenu != oldShowSymbolsMenu) || (data->showImages != oldShowImages) )) { Set(); } if (state == osUnknown) { switch (Key) { case kOk: return osBack; default: break; } } return state; } void cMenuSetupLogos::Set(void) { int currentItem = Current(); Clear(); Add(new cMenuEditBoolItem(tr("Show symbols"), &data->showSymbols)); //TODO? symbols -> icons if (data->showSymbols) { #ifndef SKINENIGMA_NO_MENULOGO Add(new cMenuEditBoolItem(tr(" Show symbols in menu"), &data->showSymbolsMenu)); #endif Add(new cMenuEditBoolItem(tr(" Show symbols in replay"), &data->showSymbolsReplay)); Add(new cMenuEditBoolItem(tr(" Show symbols in messages"), &data->showSymbolsMsgs)); Add(new cMenuEditBoolItem(tr(" Show symbols in audio"), &data->showSymbolsAudio)); } Add(new cMenuEditBoolItem(tr("Colored status symbols in EPG details"), &data->showColSymbolsDetails)); Add(new cMenuEditBoolItem(tr("Show symbols in lists"), &data->showListSymbols)); Add(new cMenuEditBoolItem(tr("Show progressbar in lists"), &data->showProgressbar)); Add(new cMenuEditBoolItem(tr("Show marker in lists"), &data->showMarker)); Add(new cMenuEditStraItem(tr("Show status symbols"), &data->showStatusSymbols, 3, showStatusSymbolsTexts)); if (data->showStatusSymbols) { Add(new cMenuEditBoolItem(tr(" Show flags"), &data->showFlags)); #ifdef USE_PLUGIN_AVARDS cPlugin *pAvardsPlugin = cPluginManager::GetPlugin("avards"); if (pAvardsPlugin != NULL) { if (pAvardsPlugin->Service(AVARDS_CURRENT_VIDEO_FORMAT_SERVICE_STRING_ID)) { Add(new cMenuEditBoolItem(tr(" Show WSS mode symbols"), &data->showWssSymbols)); } else { Add(new cOsdItem(AVARDS_CURRENT_VIDEO_FORMAT_SERVICE_STRING_ID " service not found!", osUnknown, false)); } } #endif #ifdef USE_PLUGIN_MAILBOX cPlugin *MailBoxPlugin = cPluginManager::GetPlugin("mailbox"); if (MailBoxPlugin) { if (MailBoxPlugin->Service(MailBox_HasNewMail_v1_0_NAME, 0)) { Add(new cMenuEditStraItem(tr(" Show mail icon"), &data->showMailIcon, 3, showMailIconTexts)); } else { Add(new cOsdItem(MailBox_HasNewMail_v1_0_NAME " service not found!", osUnknown, false)); } } //TODO? else display "Plugin not found" #endif } #ifndef SKINENIGMA_NO_MENULOGO if (data->showSymbols && data->showSymbolsMenu) { Add(new cMenuEditBoolItem(tr("Show event/recording images"), &data->showImages)); if (data->showImages) { #ifdef HAVE_IMAGEMAGICK Add(new cMenuEditStraItem(tr(" Resize images"), &data->resizeImages, 3, resizeImagesTexts)); #endif Add(new cMenuEditIntItem(tr(" Image width" ), &data->imageWidth, 80, 360)); Add(new cMenuEditIntItem(tr(" Image height" ), &data->imageHeight, 80, 288)); #ifdef HAVE_IMAGEMAGICK Add(new cMenuEditStraItem(tr(" Image format"), &data->imageExtension, 3, imageExtensionTexts)); #endif } } #endif //SKINENIGMA_NO_MENULOGO Add(new cMenuEditBoolItem(tr("Show channel logos"), &data->showLogo)); if (data->showLogo) { Add(new cMenuEditIntItem(tr(" Image width" ), &data->channelLogoWidth, 64, 360)); Add(new cMenuEditIntItem(tr(" Image height" ), &data->channelLogoHeight, 48, 288)); Add(new cMenuEditBoolItem(tr(" Identify channel by"), &data->useChannelId, tr("name"), tr("data"))); } if (data->showLogo || data->showSymbols) { Add(new cMenuEditIntItem(tr("Channel logo cache size"), &data->cacheSize, 0, 4000)); } SetCurrent(Get(currentItem)); Display(); SetHelp(tr("Button$Flush cache"), NULL, NULL, NULL); } // Setup: Animated Text cMenuSetupAnimText::cMenuSetupAnimText(cEnigmaConfig* Data) : cMenuSetupSubMenu(tr("Animated Text"), Data) { scrollModeTexts[0] = tr("left and right"); scrollModeTexts[1] = tr("to the left"); Set(); } eOSState cMenuSetupAnimText::ProcessKey(eKeys Key) { int oldUseTextEffects = data->useTextEffects; eOSState state = cMenuSetupSubMenu::ProcessKey(Key); if (Key != kNone && oldUseTextEffects != data->useTextEffects) Set(); return state; } void cMenuSetupAnimText::Set(void) { int currentItem = Current(); Clear(); Add(new cMenuEditBoolItem(tr("Enable"), &data->useTextEffects)); if (data->useTextEffects) { Add(new cMenuEditBoolItem(tr(" Scroll OSD title"), &data->scrollTitle)); Add(new cMenuEditBoolItem(tr(" Scroll info area"), &data->scrollInfo)); Add(new cMenuEditBoolItem(tr(" Scroll active list items"), &data->scrollListItem)); Add(new cMenuEditBoolItem(tr(" Scroll other items"), &data->scrollOther)); Add(new cMenuEditStraItem(tr(" Scroll behaviour"), &data->scrollMode, 2, scrollModeTexts)); Add(new cMenuEditIntItem(tr(" Scroll delay (ms)"), &data->scrollDelay, 3, 1000)); Add(new cMenuEditIntItem(tr(" Scroll pause (ms)"), &data->scrollPause, 500, 2000)); Add(new cMenuEditIntItem(tr(" Blink pause (ms)"), &data->blinkPause, 500, 2000)); } SetCurrent(Get(currentItem)); Display(); SetHelp(NULL, NULL, NULL, NULL); } // Setup: TTF cMenuSetupTTF::cMenuSetupTTF(FontInfo* Data, cStringList* fonts) : cOsdMenu(tr("TrueType Font"), 10) { data = Data; if (data && fonts) { fontList = fonts; nFont = std::max(0, fontList->Find(data->Name)); nWidth = data->Width; nSize = data->Size; } SetHelp(NULL, NULL, NULL, NULL); Set(); } void cMenuSetupTTF::Set(void) { int currentItem = Current(); Clear(); if (fontList->Size() > 0) { Add(new cMenuEditStraItem(tr("Name"), &nFont, fontList->Size(), &(*fontList)[0])); Add(new cMenuEditIntItem(tr("Size"), &nSize, 10, MAXFONTSIZE)); Add(new cMenuEditIntItem(tr("Width"), &nWidth, 50, 150)); SetCurrent(Get(currentItem)); } else { cOsdItem *item = new cOsdItem(tr("No TrueType fonts installed!")); if (item) { item->SetSelectable(false); Add(item); } } Display(); } eOSState cMenuSetupTTF::ProcessKey(eKeys Key) { eOSState state = cOsdMenu::ProcessKey(Key); if (state == osUnknown) { switch (Key) { case kOk: Store(); state = osBack; break; default: break; } } return state; } void cMenuSetupTTF::Store(void) { if (data) { Utf8Strn0Cpy(data->Name, (*fontList)[nFont], sizeof(data->Name)); data->Width = nWidth; data->Size = nSize; } } // Setup: Fonts cMenuSetupFonts::cMenuSetupFonts(cEnigmaConfig* Data) : cMenuSetupSubMenu(tr("Fonts"), Data) { allVdrFonts[0] = tr("TrueType Font"); allVdrFonts[1] = tr("Default OSD Font"); allVdrFonts[2] = tr("Default Fixed Size Font"); allVdrFonts[3] = tr("Default Small Font"); cFont::GetAvailableFontNames(&fontMonoNames, true); cFont::GetAvailableFontNames(&fontNames); fontNames.Insert(strdup(DefaultFontSml)); fontNames.Insert(strdup(DefaultFontOsd)); fontMonoNames.Insert(strdup(DefaultFontFix)); Set(); } cMenuSetupFonts::~cMenuSetupFonts(void) { } eOSState cMenuSetupFonts::ProcessKey(eKeys Key) { eOSState state = cMenuSetupSubMenu::ProcessKey(Key); if (state == osUnknown && Key == kBlue && data->allFonts[Current()].VdrId == FONT_TRUETYPE) { state = AddSubMenu(new cMenuSetupTTF(&data->allFonts[Current()], strncmp(Get(Current())->Text(), tr("Fixed Font"), strlen(tr("Fixed Font"))) == 0 ? &fontMonoNames : &fontNames)); } else { if (!HasSubMenu() && data->allFonts[Current()].VdrId == FONT_TRUETYPE) SetHelp(NULL, NULL, NULL, tr("Button$Set")); else SetHelp(NULL, NULL, NULL, NULL); } return state; } void cMenuSetupFonts::Set(void) { int currentItem = Current(); Clear(); int numAvailFonts = sizeof(allVdrFonts)/sizeof(char*); Add(new cMenuEditStraItem(tr("OSD title"), &data->allFonts[FONT_OSDTITLE].VdrId, numAvailFonts, allVdrFonts)); Add(new cMenuEditStraItem(tr("Messages"), &data->allFonts[FONT_MESSAGE].VdrId, numAvailFonts, allVdrFonts)); Add(new cMenuEditStraItem(tr("Date"), &data->allFonts[FONT_DATE].VdrId, numAvailFonts, allVdrFonts)); Add(new cMenuEditStraItem(tr("Help keys"), &data->allFonts[FONT_HELPKEYS].VdrId, numAvailFonts, allVdrFonts)); Add(new cMenuEditStraItem(tr("Channelinfo: title"), &data->allFonts[FONT_CITITLE].VdrId, numAvailFonts, allVdrFonts)); Add(new cMenuEditStraItem(tr("Channelinfo: subtitle"), &data->allFonts[FONT_CISUBTITLE].VdrId, numAvailFonts, allVdrFonts)); Add(new cMenuEditStraItem(tr("Channelinfo: language"), &data->allFonts[FONT_CILANGUAGE].VdrId, numAvailFonts, allVdrFonts)); Add(new cMenuEditStraItem(tr("List items"), &data->allFonts[FONT_LISTITEM].VdrId, numAvailFonts, allVdrFonts)); Add(new cMenuEditStraItem(tr("Info area: timers title"), &data->allFonts[FONT_INFOTIMERHEADLINE].VdrId, numAvailFonts, allVdrFonts)); Add(new cMenuEditStraItem(tr("Info area: timers text"), &data->allFonts[FONT_INFOTIMERTEXT].VdrId, numAvailFonts, allVdrFonts)); Add(new cMenuEditStraItem(tr("Info area: warning title"), &data->allFonts[FONT_INFOWARNHEADLINE].VdrId, numAvailFonts, allVdrFonts)); Add(new cMenuEditStraItem(tr("Info area: warning text"), &data->allFonts[FONT_INFOWARNTEXT].VdrId, numAvailFonts, allVdrFonts)); Add(new cMenuEditStraItem(tr("Details: title"), &data->allFonts[FONT_DETAILSTITLE].VdrId, numAvailFonts, allVdrFonts)); Add(new cMenuEditStraItem(tr("Details: subtitle"), &data->allFonts[FONT_DETAILSSUBTITLE].VdrId, numAvailFonts, allVdrFonts)); Add(new cMenuEditStraItem(tr("Details: date"), &data->allFonts[FONT_DETAILSDATE].VdrId, numAvailFonts, allVdrFonts)); Add(new cMenuEditStraItem(tr("Details: text"), &data->allFonts[FONT_DETAILSTEXT].VdrId, numAvailFonts, allVdrFonts)); Add(new cMenuEditStraItem(tr("Replay: times"), &data->allFonts[FONT_REPLAYTIMES].VdrId, numAvailFonts, allVdrFonts)); Add(new cMenuEditStraItem(tr("Fixed Font"), &data->allFonts[FONT_FIXED].VdrId, numAvailFonts, allVdrFonts)); SetCurrent(Get(currentItem)); Display(); if (data->allFonts[Current()].VdrId == FONT_TRUETYPE) SetHelp(NULL, NULL, NULL, tr("Button$Set")); else SetHelp(NULL, NULL, NULL, NULL); } #ifdef USE_PLUGIN_EPGSEARCH // Setup: EpgSearch cMenuSetupEpgSearch::cMenuSetupEpgSearch(cEnigmaConfig* Data) : cMenuSetupSubMenu(tr("EPGSearch"), Data) { useSubtitleRerunTexts[0] = tr("never"); useSubtitleRerunTexts[1] = tr("if exists"); useSubtitleRerunTexts[2] = tr("always"); Set(); } eOSState cMenuSetupEpgSearch::ProcessKey(eKeys Key) { return cMenuSetupSubMenu::ProcessKey(Key); } void cMenuSetupEpgSearch::Set(void) { int currentItem = Current(); Clear(); cPlugin *pEPGsearchPlugin = cPluginManager::GetPlugin("epgsearch"); if (pEPGsearchPlugin != NULL) { if (pEPGsearchPlugin->Service(EPGSEARCH_SEARCHRESULTS_SERVICE_STRING_ID)) { Add(new cMenuEditIntItem(tr("Number of Reruns"), &data->numReruns, 0, 10)); Add(new cMenuEditStraItem(tr("Use Subtitle for reruns"), &data->useSubtitleRerun, 3, useSubtitleRerunTexts)); } else { Add(new cOsdItem(EPGSEARCH_SEARCHRESULTS_SERVICE_STRING_ID " service not found!", osUnknown, false)); } if (data->showInfo) { if (pEPGsearchPlugin->Service(EPGSEARCH_LASTCONFLICTINFO_SERVICE_STRING_ID)) { Add(new cMenuEditBoolItem(tr("Show timer conflicts"), &data->showTimerConflicts)); } else { Add(new cOsdItem(EPGSEARCH_LASTCONFLICTINFO_SERVICE_STRING_ID " service not found!", osUnknown, false)); } } } SetCurrent(Get(currentItem)); Display(); SetHelp(NULL, NULL, NULL, NULL); } #endif // vim:et:sw=2:ts=2: vdr-plugin-skinenigmang-0.1.5/setup.h000066400000000000000000000046741435005021200175700ustar00rootroot00000000000000/* * setup.h: 'EnigmaNG' skin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #include "common.h" #include "config.h" #include class cPluginSkinEnigmaSetup : public cMenuSetupPage { private: cEnigmaConfig data; virtual void Setup(void); protected: virtual eOSState ProcessKey(eKeys Key); virtual void Store(void); public: cPluginSkinEnigmaSetup(void); }; class cMenuSetupSubMenu : public cOsdMenu { protected: cEnigmaConfig *data; virtual eOSState ProcessKey(eKeys Key); virtual void Set(void) = 0; void AddCategory(const char *Title); public: cMenuSetupSubMenu(const char *Title, cEnigmaConfig *Data); }; class cMenuSetupGeneral : public cMenuSetupSubMenu { private: const char *showRemainingTexts[4]; const char *showRecSizeTexts[3]; const char *statusLineModeTexts[3]; const char *showScrollbarTexts[3]; protected: virtual eOSState ProcessKey(eKeys Key); void Set(void); public: cMenuSetupGeneral(cEnigmaConfig *Data); }; class cMenuSetupLogos : public cMenuSetupSubMenu { private: const char *showSymbolsTexts[4]; const char *resizeImagesTexts[3]; #ifdef USE_PLUGIN_MAILBOX const char *showMailIconTexts[3]; #endif const char *showStatusSymbolsTexts[3]; protected: virtual eOSState ProcessKey(eKeys Key); void Set(void); public: cMenuSetupLogos(cEnigmaConfig *Data); }; class cMenuSetupAnimText : public cMenuSetupSubMenu { private: const char *scrollModeTexts[2]; protected: virtual eOSState ProcessKey(eKeys Key); void Set(void); public: cMenuSetupAnimText(cEnigmaConfig *Data); }; class cMenuSetupTTF : public cOsdMenu { private: FontInfo *data; int nFont; int nWidth; int nSize; cStringList *fontList; protected: virtual eOSState ProcessKey(eKeys Key); void Set(void); void Store(void); public: cMenuSetupTTF(FontInfo *fontinfo, cStringList* fontList); }; class cMenuSetupFonts : public cMenuSetupSubMenu { private: cStringList fontNames; cStringList fontMonoNames; protected: virtual eOSState ProcessKey(eKeys Key); void Set(void); public: cMenuSetupFonts(cEnigmaConfig *Data); virtual ~cMenuSetupFonts(void); }; #ifdef USE_PLUGIN_EPGSEARCH class cMenuSetupEpgSearch : public cMenuSetupSubMenu { private: const char *useSubtitleRerunTexts[3]; protected: virtual eOSState ProcessKey(eKeys Key); void Set(void); public: cMenuSetupEpgSearch(cEnigmaConfig *Data); }; #endif // vim:et:sw=2:ts=2: vdr-plugin-skinenigmang-0.1.5/skinenigmang.c000066400000000000000000000346431435005021200210740ustar00rootroot00000000000000/* * skinenigmang.c: 'EnigmaNG' skin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #include "common.h" #include "config.h" #include "enigma.h" #include "logo.h" #include "setup.h" #include "status.h" #include #include #if defined(APIVERSNUM) && APIVERSNUM < 10600 #error "VDR-1.6.0 API version or greater is required!" #endif static const char VERSION[] = "0.1.5"; static const char DESCRIPTION[] = trNOOP("EnigmaNG skin"); class cPluginSkinEnigma : public cPlugin { private: bool fLogodirSet; bool fImagesDirSet; public: cPluginSkinEnigma(void); virtual ~cPluginSkinEnigma(); virtual const char *Version(void) { return VERSION; } virtual const char *Description(void) { return tr(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) { return NULL; } 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); }; cPluginSkinEnigma::cPluginSkinEnigma(void) { // initialize any member variables here. // DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL // VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT! fLogodirSet = false; fImagesDirSet = false; } cPluginSkinEnigma::~cPluginSkinEnigma() { // clean up after yourself! } const char *cPluginSkinEnigma::CommandLineHelp(void) { // return a string that describes all known command line options. return " -i , --epgimages= Set directory where epgimages are stored\n" " -l , --logodir= Set directory where logos are stored.\n"; } bool cPluginSkinEnigma::ProcessArgs(int argc, char *argv[]) { // implement command line argument processing here if applicable. static const struct option long_options[] = { { "epgimages", required_argument, NULL, 'i' }, { "logodir", required_argument, NULL, 'l' }, { 0, 0, 0, 0 } }; int c; while ((c = getopt_long(argc, argv, "i:f:l:", long_options, NULL)) != -1) { switch (c) { case 'i': EnigmaConfig.SetImagesDir(optarg); fImagesDirSet = true; break; case 'l': EnigmaConfig.SetLogoDir(optarg); fLogodirSet = true; break; default: return false; } } return true; } bool cPluginSkinEnigma::Initialize(void) { // initialize any background activities the plugin shall perform. debug("cPluginSkinEnigma::Initialize()"); return true; } bool cPluginSkinEnigma::Start(void) { // start any background activities the plugin shall perform. debug("cPluginSkinEnigma::Start()"); if (!fLogodirSet) { // set logo directory EnigmaConfig.SetLogoDir(cPlugin::ConfigDirectory(PLUGIN_NAME_I18N)); fLogodirSet = true; } if (!fImagesDirSet) { // set epgimages directory char *dir = NULL; if (-1 != asprintf(&dir, "%s/epgimages", cPlugin::ConfigDirectory(PLUGIN_NAME_I18N))) { EnigmaConfig.SetImagesDir(dir); fImagesDirSet = true; free(dir); } } // resize logo cache EnigmaLogoCache.Resize(EnigmaConfig.cacheSize); // create skin new cSkinEnigma; return true; } void cPluginSkinEnigma::Stop(void) { // stop any background activities the plugin shall perform. debug("cPluginSkinEnigma::Stop()"); } void cPluginSkinEnigma::Housekeeping(void) { // perform any cleanup or other regular tasks. } cOsdObject *cPluginSkinEnigma::MainMenuAction(void) { // perform the action when selected from the main VDR menu. return NULL; } cMenuSetupPage *cPluginSkinEnigma::SetupMenu(void) { // return a setup menu in case the plugin supports one. debug("cPluginSkinEnigma::SetupMenu()"); return new cPluginSkinEnigmaSetup(); } bool cPluginSkinEnigma::SetupParse(const char *OptionName, const char *Value) { // parse your own setup parameters and store their values. // debug("cPluginSkinEnigma::SetupParse()"); if (!strcasecmp(OptionName, "SingleArea8Bpp")) EnigmaConfig.singleArea8Bpp = atoi(Value); else if (!strcasecmp(OptionName, "ShowAuxInfo")) EnigmaConfig.showAuxInfo = atoi(Value); else if (!strcasecmp(OptionName, "ShowProgressBar")) EnigmaConfig.showProgressbar = atoi(Value); else if (!strcasecmp(OptionName, "ShowRemaining")) EnigmaConfig.showRemaining = atoi(Value); else if (!strcasecmp(OptionName, "ShowListSymbols")) EnigmaConfig.showListSymbols = atoi(Value); else if (!strcasecmp(OptionName, "ShowSymbols")) EnigmaConfig.showSymbols = atoi(Value); else if (!strcasecmp(OptionName, "ShowSymbolsMenu")) EnigmaConfig.showSymbolsMenu = atoi(Value); else if (!strcasecmp(OptionName, "ShowSymbolsReplay")) EnigmaConfig.showSymbolsReplay = atoi(Value); else if (!strcasecmp(OptionName, "ShowSymbolsMsgs")) EnigmaConfig.showSymbolsMsgs = atoi(Value); else if (!strcasecmp(OptionName, "ShowSymbolsAudio")) EnigmaConfig.showSymbolsAudio = atoi(Value); else if (!strcasecmp(OptionName, "ShowColSymbolsDetails")) EnigmaConfig.showColSymbolsDetails = atoi(Value); else if (!strcasecmp(OptionName, "ShowLogo")) EnigmaConfig.showLogo = atoi(Value); else if (!strcasecmp(OptionName, "ShowInfo")) EnigmaConfig.showInfo = atoi(Value); else if (!strcasecmp(OptionName, "MinInfoWidth")) EnigmaConfig.minInfoWidth = atoi(Value); else if (!strcasecmp(OptionName, "ShowMarker")) EnigmaConfig.showMarker = atoi(Value); else if (!strcasecmp(OptionName, "ShowVPS")) EnigmaConfig.showVps = atoi(Value); else if (!strcasecmp(OptionName, "ShowFlags")) EnigmaConfig.showFlags = atoi(Value); else if (!strcasecmp(OptionName, "ShowCatGenCon")) EnigmaConfig.showCatGenCon = atoi(Value); else if (!strcasecmp(OptionName, "CacheSize")) EnigmaConfig.cacheSize = atoi(Value); else if (!strcasecmp(OptionName, "UseChannelId")) EnigmaConfig.useChannelId = atoi(Value); else if (!strcasecmp(OptionName, "NumReruns")) EnigmaConfig.numReruns = atoi(Value); else if (!strcasecmp(OptionName, "UseSubtitleRerun")) EnigmaConfig.useSubtitleRerun = atoi(Value); else if (!strcasecmp(OptionName, "ShowTimerConflicts")) EnigmaConfig.showTimerConflicts = atoi(Value); else if (!strcasecmp(OptionName, "ShowRecSize")) EnigmaConfig.showRecSize = atoi(Value); else if (!strcasecmp(OptionName, "ShowImages")) EnigmaConfig.showImages = atoi(Value); else if (!strcasecmp(OptionName, "ResizeImages")) EnigmaConfig.resizeImages = atoi(Value); else if (!strcasecmp(OptionName, "ShowMailIcon")) EnigmaConfig.showMailIcon = atoi(Value); else if (!strcasecmp(OptionName, "ImageWidth")) EnigmaConfig.imageWidth = atoi(Value); else if (!strcasecmp(OptionName, "ImageHeight")) EnigmaConfig.imageHeight = atoi(Value); else if (!strcasecmp(OptionName, "ImageExtension")) EnigmaConfig.imageExtension = atoi(Value); else if (!strcasecmp(OptionName, "FullTitleWidth")) EnigmaConfig.fullTitleWidth = atoi(Value); else if (!strcasecmp(OptionName, "UseTextEffects")) EnigmaConfig.useTextEffects = atoi(Value); else if (!strcasecmp(OptionName, "ScrollDelay")) EnigmaConfig.scrollDelay = atoi(Value); else if (!strcasecmp(OptionName, "ScrollPause")) EnigmaConfig.scrollPause = atoi(Value); else if (!strcasecmp(OptionName, "ScrollMode")) EnigmaConfig.scrollMode = atoi(Value); else if (!strcasecmp(OptionName, "BlinkPause")) EnigmaConfig.blinkPause = atoi(Value); else if (!strcasecmp(OptionName, "ScrollInfo")) EnigmaConfig.scrollInfo = atoi(Value); else if (!strcasecmp(OptionName, "ScrollListItem")) EnigmaConfig.scrollListItem = atoi(Value); else if (!strcasecmp(OptionName, "ScrollOther")) EnigmaConfig.scrollOther = atoi(Value); else if (!strcasecmp(OptionName, "ScrollTitle")) EnigmaConfig.scrollTitle = atoi(Value); else if (!strcasecmp(OptionName, "FontOsdTitle")) EnigmaConfig.SetFont(FONT_OSDTITLE, atoi(Value)); else if (!strcasecmp(OptionName, "FontOsdTitleName")) EnigmaConfig.SetFont(FONT_OSDTITLE, Value); else if (!strcasecmp(OptionName, "FontMessage")) EnigmaConfig.SetFont(FONT_MESSAGE, atoi(Value)); else if (!strcasecmp(OptionName, "FontMessageName")) EnigmaConfig.SetFont(FONT_MESSAGE, Value); else if (!strcasecmp(OptionName, "FontDate")) EnigmaConfig.SetFont(FONT_DATE, atoi(Value)); else if (!strcasecmp(OptionName, "FontDateName")) EnigmaConfig.SetFont(FONT_DATE, Value); else if (!strcasecmp(OptionName, "FontHelpKeys")) EnigmaConfig.SetFont(FONT_HELPKEYS, atoi(Value)); else if (!strcasecmp(OptionName, "FontHelpKeysName")) EnigmaConfig.SetFont(FONT_HELPKEYS, Value); else if (!strcasecmp(OptionName, "FontCiTitle")) EnigmaConfig.SetFont(FONT_CITITLE, atoi(Value)); else if (!strcasecmp(OptionName, "FontCiTitleName")) EnigmaConfig.SetFont(FONT_CITITLE, Value); else if (!strcasecmp(OptionName, "FontCiSubtitle")) EnigmaConfig.SetFont(FONT_CISUBTITLE, atoi(Value)); else if (!strcasecmp(OptionName, "FontCiSubtitleName")) EnigmaConfig.SetFont(FONT_CISUBTITLE, Value); else if (!strcasecmp(OptionName, "FontCiLanguage")) EnigmaConfig.SetFont(FONT_CILANGUAGE, atoi(Value)); else if (!strcasecmp(OptionName, "FontCiLanguageName")) EnigmaConfig.SetFont(FONT_CILANGUAGE, Value); else if (!strcasecmp(OptionName, "FontListItem")) EnigmaConfig.SetFont(FONT_LISTITEM, atoi(Value)); else if (!strcasecmp(OptionName, "FontListItemName")) EnigmaConfig.SetFont(FONT_LISTITEM, Value); else if (!strcasecmp(OptionName, "FontInfoTimerHeadline")) EnigmaConfig.SetFont(FONT_INFOTIMERHEADLINE, atoi(Value)); else if (!strcasecmp(OptionName, "FontInfoTimerHeadlineName")) EnigmaConfig.SetFont(FONT_INFOTIMERHEADLINE, Value); else if (!strcasecmp(OptionName, "FontInfoTimerText")) EnigmaConfig.SetFont(FONT_INFOTIMERTEXT, atoi(Value)); else if (!strcasecmp(OptionName, "FontInfoTimerTextName")) EnigmaConfig.SetFont(FONT_INFOTIMERTEXT, Value); else if (!strcasecmp(OptionName, "FontInfoWarnHeadline")) EnigmaConfig.SetFont(FONT_INFOWARNHEADLINE, atoi(Value)); else if (!strcasecmp(OptionName, "FontInfoWarnHeadlineName")) EnigmaConfig.SetFont(FONT_INFOWARNHEADLINE, Value); else if (!strcasecmp(OptionName, "FontInfoWarnText")) EnigmaConfig.SetFont(FONT_INFOWARNTEXT, atoi(Value)); else if (!strcasecmp(OptionName, "FontInfoWarnTextName")) EnigmaConfig.SetFont(FONT_INFOWARNTEXT, Value); else if (!strcasecmp(OptionName, "FontDetailsTitle")) EnigmaConfig.SetFont(FONT_DETAILSTITLE, atoi(Value)); else if (!strcasecmp(OptionName, "FontDetailsTitleName")) EnigmaConfig.SetFont(FONT_DETAILSTITLE, Value); else if (!strcasecmp(OptionName, "FontDetailsSubtitle")) EnigmaConfig.SetFont(FONT_DETAILSSUBTITLE, atoi(Value)); else if (!strcasecmp(OptionName, "FontDetailsSubtitleName")) EnigmaConfig.SetFont(FONT_DETAILSSUBTITLE, Value); else if (!strcasecmp(OptionName, "FontDetailsDate")) EnigmaConfig.SetFont(FONT_DETAILSDATE, atoi(Value)); else if (!strcasecmp(OptionName, "FontDetailsDateName")) EnigmaConfig.SetFont(FONT_DETAILSDATE, Value); else if (!strcasecmp(OptionName, "FontDetailsText")) EnigmaConfig.SetFont(FONT_DETAILSTEXT, atoi(Value)); else if (!strcasecmp(OptionName, "FontDetailsTextName")) EnigmaConfig.SetFont(FONT_DETAILSTEXT, Value); else if (!strcasecmp(OptionName, "FontReplayTimes")) EnigmaConfig.SetFont(FONT_REPLAYTIMES, atoi(Value)); else if (!strcasecmp(OptionName, "FontReplayTimesName")) EnigmaConfig.SetFont(FONT_REPLAYTIMES, Value); else if (!strcasecmp(OptionName, "FontFixed")) EnigmaConfig.SetFont(FONT_FIXED, atoi(Value)); else if (!strcasecmp(OptionName, "FontFixedName")) EnigmaConfig.SetFont(FONT_FIXED, Value); else if (!strcasecmp(OptionName, "DynOSD")) EnigmaConfig.dynOsd = atoi(Value); else if (!strcasecmp(OptionName, "StatusLineMode")) EnigmaConfig.statusLineMode = atoi(Value); else if (!strcasecmp(OptionName, "ShowWssSymbols")) EnigmaConfig.showWssSymbols = atoi(Value); else if (!strcasecmp(OptionName, "ShowStatusSymbols")) EnigmaConfig.showStatusSymbols = atoi(Value); else if (!strcasecmp(OptionName, "ShowScrollbar")) EnigmaConfig.showScrollbar = atoi(Value); else if (!strcasecmp(OptionName, "ShowSignalInfo")) EnigmaConfig.showSignalInfo = atoi(Value); else if (!strcasecmp(OptionName, "ShowCaMode")) EnigmaConfig.showCaMode = atoi(Value); else if (!strcasecmp(OptionName, "DrawRoundCorners")) EnigmaConfig.drawRoundCorners = atoi(Value); else if (!strcasecmp(OptionName, "ChannelLogoWidth")) EnigmaConfig.channelLogoWidth = atoi(Value); else if (!strcasecmp(OptionName, "ChannelLogoHeight")) EnigmaConfig.channelLogoHeight = atoi(Value); else if (!strcasecmp(OptionName, "SignalInfoWidth")) EnigmaConfig.signalInfoWidth = atoi(Value); else if (!strcasecmp(OptionName, "ProgressBarWidth")) EnigmaConfig.progressBarWidth = atoi(Value); else return false; return true; } bool cPluginSkinEnigma::Service(const char * /* Id */, void * /* Data */) { // handle custom service requests from other plugins return false; } const char **cPluginSkinEnigma::SVDRPHelpPages(void) { // return help text for SVDRP commands this plugin implements return NULL; } cString cPluginSkinEnigma::SVDRPCommand(const char * /* Command */, const char * /* Option */, int & /* ReplyCode */) { // process SVDRP commands this plugin implements return NULL; } VDRPLUGINCREATOR(cPluginSkinEnigma); // don't touch this! // vim:et:sw=2:ts=2: vdr-plugin-skinenigmang-0.1.5/status.c000066400000000000000000000065301435005021200177370ustar00rootroot00000000000000/* * status.c: 'EnigmaNG' skin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #include "common.h" #include "status.h" #include #include #include const char *ReplayNames[7] = { "", "recordings", "mp3", "mplayer", "dvd", "vcd", "image" }; cEnigmaStatus EnigmaStatus; cEnigmaStatus::cEnigmaStatus(void) : mReplayMode(replayNone), mReplayIsLoop(false), mReplayIsShuffle(false) {} void cEnigmaStatus::Replaying(const cControl * /*Control */ , const char *Name, const char *FileName, bool /* On */) { debug("cEnigmaStatus::Replaying(%s)", Name); if (Name != NULL) { #if VDRVERSNUM >= 20301 LOCK_RECORDINGS_READ #endif mReplayMode = replayMPlayer; if (strlen(Name) > 6 && Name[0] == '[' && Name[3] == ']' && Name[5] == '(') { int i; for (i = 6; Name[i]; ++i) { if (Name[i] == ' ' && Name[i - 1] == ')') break; } if (Name[i]) { // replaying mp3 mReplayMode = replayMP3; mReplayIsLoop = Name[1] == 'L'; mReplayIsShuffle = Name[2] == 'S'; } #if VDRVERSNUM >= 20301 } else if (FileName ? Recordings->GetByName(FileName) : NULL) { #else } else if (FileName ? Recordings.GetByName(FileName) : NULL) { #endif mReplayMode = replayNormal; } else if (strcmp(Name, "DVD") == 0) mReplayMode = replayDVD; else if (strcmp(Name, "VCD") == 0) mReplayMode = replayVCD; else if (access(Name, F_OK) == 0) mReplayMode = replayMPlayer; else if (strncmp(Name, "[image]", 7) == 0) mReplayMode = replayImage; else if (strlen(Name) > 7) { int i, n; for (i = 0, n = 0; Name[i]; ++i) { if (Name[i] == ' ' && Name[i - 1] == ',' && ++n == 4) break; } if (Name[i]) { // replaying DVD mReplayMode = replayDVD; } } } else { mReplayMode = replayNone; mReplayIsLoop = false; mReplayIsShuffle = false; } } void cEnigmaStatus::Recording(const cDevice * /* Device */, const char * /* Name */, const char * /* FileName */, bool /* On */) { } void cEnigmaStatus::OsdClear(void) { } void cEnigmaStatus::OsdCurrentItem(const char * /* Text */) { } void cEnigmaStatus::OsdItem(const char * /* Text */, int /* ItemIndex */) { } void cEnigmaStatus::UpdateActiveTimers(void) { mTimers.Clear(); #if VDRVERSNUM >= 20301 LOCK_TIMERS_READ for (const cTimer * tim = Timers->First(); tim; tim = Timers->Next(tim)) { #else Timers.IncBeingEdited(); for (cTimer * tim = Timers.First(); tim; tim = Timers.Next(tim)) { #endif if (tim->HasFlags(tfActive)) { int i = 0; cTimer dummy; dummy = *tim; do { mTimers.Add(new tTimer(&dummy)); if (!dummy.IsSingleEvent()) // add 4 additional rep. timer { int j = 0; do { j++; // just to avoid a endless loop dummy.Skip(); dummy.Matches(); // Refresh start- and end-time } while (!dummy.DayMatches(dummy.StartTime()) && (j < 7)); } i++; } while (!dummy.IsSingleEvent() && i < 5); } } #if VDRVERSNUM < 20301 Timers.DecBeingEdited(); #endif mTimers.Sort(); } // vim:et:sw=2:ts=2: vdr-plugin-skinenigmang-0.1.5/status.h000066400000000000000000000042221435005021200177400ustar00rootroot00000000000000/* * status.h: 'EnigmaNG' skin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __SKINENIGMA_STATUS_H #define __SKINENIGMA_STATUS_H #include "common.h" #include extern const char *ReplayNames[7]; struct tTimer : public cListObject { time_t startTime; time_t stopTime; int startDay; int channelNumber; std::string channelName; int priority; bool isRecording; std::string title; tTimer(cTimer *timer): startTime(timer->StartTime()), stopTime(timer->StopTime()), startDay(timer->GetMDay(startTime)), channelNumber(timer->Channel()->Number()), channelName(timer->Channel()->Name()), priority(timer->Priority()), isRecording(timer->Recording()), title(timer->File()) {} virtual int Compare(const cListObject & listObj) const { const tTimer *e = (const tTimer *)&listObj; int r = startTime - e->startTime; if (r == 0) r = e->priority - priority; return r; } }; class cEnigmaStatus : public cStatus { public: enum eReplayMode { replayNone, replayNormal, replayMP3, replayMPlayer, replayDVD, replayVCD, replayImage, }; void UpdateActiveTimers(void); cList mTimers; private: eReplayMode mReplayMode; bool mReplayIsLoop; bool mReplayIsShuffle; protected: virtual void Replaying(const cControl * Control, const char *Name, const char *FileName, bool On); virtual void Recording(const cDevice * Device, const char *Name, const char *FileName, bool On); virtual void OsdClear(void); virtual void OsdCurrentItem(const char *Text); virtual void OsdItem(const char *Text, int Index); public: cEnigmaStatus(void); eReplayMode ReplayMode(void) const { return mReplayMode; } const char* ReplayModeName(void) const { return ReplayNames[mReplayMode]; } }; extern cEnigmaStatus EnigmaStatus; #endif // __SKINENIGMA_STATUS_H // vim:et:sw=2:ts=2: vdr-plugin-skinenigmang-0.1.5/symbols/000077500000000000000000000000001435005021200177345ustar00rootroot00000000000000vdr-plugin-skinenigmang-0.1.5/symbols/small/000077500000000000000000000000001435005021200210445ustar00rootroot00000000000000vdr-plugin-skinenigmang-0.1.5/symbols/small/audio.xpm000066400000000000000000000012051435005021200226710ustar00rootroot00000000000000/* XPM */ static const char * audio_xpm[] = { "27 18 2 1", " c None", ". c #B9C000", " ", " ", " ....................... ", " ....................... ", " .. .. ", " .. .... .... .. ", " .. ...... ...... .. ", " .. .. .. .. .. .. ", " .. .. .. .. .. .. ", " .. .. .. .. .. .. ", " .. .. .. .. .. .. ", " .. ...... ...... .. ", " .. .... .... .. ", " .. .. ", " ....................... ", " ....................... ", " ", " "}; vdr-plugin-skinenigmang-0.1.5/symbols/small/audioleft.xpm000066400000000000000000000012111435005021200235410ustar00rootroot00000000000000/* XPM */ static const char * audioleft_xpm[] = { "27 18 2 1", " c None", ". c #B9C000", " ", " ", " ....................... ", " ....................... ", " .. .. ", " .. .... .. ", " .. ...... .. ", " .. .. .. .. ", " .. .. .. .. ", " .. .. .. .. ", " .. .. .. .. ", " .. ...... .. ", " .. .... .. ", " .. .. ", " ....................... ", " ....................... ", " ", " "}; vdr-plugin-skinenigmang-0.1.5/symbols/small/audioright.xpm000066400000000000000000000012121435005021200237250ustar00rootroot00000000000000/* XPM */ static const char * audioright_xpm[] = { "27 18 2 1", " c None", ". c #B9C000", " ", " ", " ....................... ", " ....................... ", " .. .. ", " .. .... .. ", " .. ...... .. ", " .. .. .. .. ", " .. .. .. .. ", " .. .. .. .. ", " .. .. .. .. ", " .. ...... .. ", " .. .... .. ", " .. .. ", " ....................... ", " ....................... ", " ", " "}; vdr-plugin-skinenigmang-0.1.5/symbols/small/dolbydigital.xpm000066400000000000000000000012141435005021200242370ustar00rootroot00000000000000/* XPM */ static const char * dolbydigital_xpm[] = { "27 18 2 1", " c None", ". c #B9C000", " ", " ", " ........... ........... ", " ........... ........... ", " .. ..... ..... .. ", " .. ... ... .. ", " .. ... ... .. ", " .. .. .. .. ", " .. .. .. .. ", " .. .. .. .. ", " .. .. .. .. ", " .. ... ... .. ", " .. ... ... .. ", " .. ..... ..... .. ", " ........... ........... ", " ........... ........... ", " ", " "}; vdr-plugin-skinenigmang-0.1.5/symbols/small/encrypted.xpm000066400000000000000000000012111435005021200235620ustar00rootroot00000000000000/* XPM */ static const char * encrypted_xpm[] = { "27 18 2 1", " c None", ". c #B9C000", " ", " ", " ....................... ", " ....................... ", " .. .. ", " .. .... .. ", " .. ...... .. ", " .. ............. .. .. ", " .. ............. .. .. ", " .. ..... ...... .. ", " .. ....... .... .. ", " .. ... ... .. ", " .. .. ", " .. .. ", " ....................... ", " ....................... ", " ", " "}; vdr-plugin-skinenigmang-0.1.5/symbols/small/eventparttimer.xpm000066400000000000000000000007571435005021200246540ustar00rootroot00000000000000/* XPM */ static const char * eventparttimer_xpm[] = { "14 22 2 1", ". c #FFFFFF", "+ c #000000", "..............", "..............", "..............", "......++......", "......++......", "..++......++..", "..++......++..", ".........++...", "........++....", ".......++.....", "++....+++++.++", "++....+++++.++", "..............", "..............", "..............", "..............", "..............", "..............", "..............", "..............", "..............", ".............."}; vdr-plugin-skinenigmang-0.1.5/symbols/small/eventrecording.xpm000066400000000000000000000007641435005021200246170ustar00rootroot00000000000000/* XPM */ static const char *const eventrecording_xpm[] = { "14 22 2 1", ". c #FFFFFF", "+ c #000000", "..............", "..............", "+++++.........", "++++++........", "++..++........", "++..++........", "++++++..++++..", "+++++..++++++.", "++++++.++..++.", "++.+++.++.....", "++..+++++.....", "++.++++++.....", "...++..++.....", "...++..++..++.", "...++++.+++++.", "...++++.++++..", "...++.........", "...++.........", "...+++++......", "...+++++......", "..............", ".............."}; vdr-plugin-skinenigmang-0.1.5/symbols/small/eventrunning.xpm000066400000000000000000000007621435005021200243210ustar00rootroot00000000000000/* XPM */ static const char *const eventrunning_xpm[] = { "14 22 2 1", ". c #FFFFFF", "+ c #000000", "..............", "..............", "..+++.........", ".+++++........", "++.++++.......", "+++++++.......", "...++++..++...", ".+++++..++++..", "...++++++++++.", ".....++++..++.", "..+...++++..+.", ".+++.++++++...", "..+++++.++++..", "...+++..+++++.", "....+..++++++.", "......+++.++..", ".....+++.+++..", "......+++.+++.", ".......++..++.", "........+...+.", "..............", ".............."}; vdr-plugin-skinenigmang-0.1.5/symbols/small/eventtimer.xpm000066400000000000000000000007531435005021200237610ustar00rootroot00000000000000/* XPM */ static const char * eventtimer_xpm[] = { "14 22 2 1", ". c #FFFFFF", "+ c #000000", "..............", "..............", "..............", "......++......", "......++......", "..++......++..", "..++......++..", ".........++...", "........++....", ".......++.....", "++....+++++.++", "++....+++++.++", "..............", "..............", "..............", "..++......++..", "..++......++..", "......++......", "......++......", "..............", "..............", ".............."}; vdr-plugin-skinenigmang-0.1.5/symbols/small/eventvps.xpm000066400000000000000000000007561435005021200234540ustar00rootroot00000000000000/* XPM */ static const char *const eventvps_xpm[] = { "14 22 2 1", ". c #FFFFFF", "+ c #000000", "..............", "..............", "++...++.......", "++...++.......", "++...++.......", "++...++..+++..", "++...++.+++++.", "++...+++++.++.", "+++.+++++.....", ".+++++.+++....", "..+++...+++...", "...++++..+++..", "..++++++..+++.", "..++..++...++.", "..++..+++..++.", "..++++++++.++.", "..+++++.+++++.", "..++.....+++..", "..++..........", "..++..........", "..............", ".............."}; vdr-plugin-skinenigmang-0.1.5/symbols/small/mail.xpm000066400000000000000000000012231435005021200225120ustar00rootroot00000000000000/* XPM */ static const char * mail_xpm[] = { "27 18 3 1", " c None", ". c #8D8F8D", "+ c #000000", "...........................", "...........................", "..+++++++++++++++++++++++..", "..+++++++++++++++++++++++..", "..++++...............++++..", "..++.++.............++.++..", "..++..++...........++..++..", "..++...++.........++...++..", "..++....++.......++....++..", "..++....+++.....+++....++..", "..++...++.++...++.++...++..", "..++..++...++.++...++..++..", "..++.++.....+++.....++.++..", "..++++.......+.......++++..", "..+++++++++++++++++++++++..", "..+++++++++++++++++++++++..", "...........................", "..........................."}; vdr-plugin-skinenigmang-0.1.5/symbols/small/radio.xpm000066400000000000000000000012121435005021200226640ustar00rootroot00000000000000/* XPM */ static const char *const radio_xpm[] = { "27 18 2 1", " c None", "+ c #B9C000", " ", " +++++ ", " +++++++++ ", " +++++++++++ ", " +++ ++++++ ", " +++ ++++ ", " +++ +++ ", " +++ ++ ", " +++ ", " +++ ", " +++ ", " +++++++++ ", " +++++++++++++ ", " +++++++++++++++ ", " +++++++++++++++ ", " +++++++++++++ ", " ++++++++++ ", " "}; vdr-plugin-skinenigmang-0.1.5/symbols/small/recording.xpm000066400000000000000000000012111435005021200235410ustar00rootroot00000000000000/* XPM */ static const char * recording_xpm[] = { "27 18 2 1", " c None", ". c #B9C000", " ", " ", " ....................... ", " ....................... ", " .. .. ", " .. .... .... .... .. ", " .. ..... .... ...... .. ", " .. .. .. .. .. .. .. ", " .. ..... ... .. .. ", " .. .... ... .. .. ", " .. .. .. .. .. .. .. ", " .. .. .. .... ...... .. ", " .. .. .. .... .... .. ", " .. .. ", " ....................... ", " ....................... ", " ", " "}; vdr-plugin-skinenigmang-0.1.5/symbols/small/recordingnew.xpm000066400000000000000000000005551435005021200242650ustar00rootroot00000000000000/* XPM */ static const char *const recordingnew_xpm[] = { "8 22 2 1", ". c #FFFFFF", "+ c #000000", "........", "........", "........", "..++++..", "..++++..", ".++++++.", ".++++++.", ".++++++.", ".++++++.", "..++++..", "..++++..", "..++++..", "..++++..", "...++...", "........", "........", "...++...", "..++++..", "..++++..", "...++...", "........", "........"}; vdr-plugin-skinenigmang-0.1.5/symbols/small/run.xpm000066400000000000000000000012031435005021200223720ustar00rootroot00000000000000/* XPM */ static const char * run_xpm[] = { "27 18 2 1", " c None", ". c #B9C000", " ", " ", " ....................... ", " ....................... ", " .. .. ", " .. .. .. ", " .. .... .. ", " .. ...... .. ", " .. ........ .. ", " .. ........ .. ", " .. ...... .. ", " .. .... .. ", " .. .. .. ", " .. .. ", " ....................... ", " ....................... ", " ", " "}; vdr-plugin-skinenigmang-0.1.5/symbols/small/subtitle.xpm000066400000000000000000000012101435005021200234170ustar00rootroot00000000000000/* XPM */ static const char * subtitle_xpm[] = { "27 18 2 1", " c None", ". c #B9C000", " ", " ", " ....................... ", " ....................... ", " .. .. ", " .. .. ", " .. .. ", " .. .. ", " .. .. ", " .. .. ", " .. ............... .. ", " .. ............... .. ", " .. .. ", " .. .. ", " ....................... ", " ....................... ", " ", " "}; vdr-plugin-skinenigmang-0.1.5/symbols/small/teletext.xpm000066400000000000000000000012101435005021200234220ustar00rootroot00000000000000/* XPM */ static const char * teletext_xpm[] = { "27 18 2 1", " c None", ". c #B9C000", " ", " ", " ....................... ", " ....................... ", " .. .. ", " .. .. ", " .. ............... .. ", " .. ............... .. ", " .. .. ", " .. .. ", " .. ............... .. ", " .. ............... .. ", " .. .. ", " .. .. ", " ....................... ", " ....................... ", " ", " "}; vdr-plugin-skinenigmang-0.1.5/symbols/small/timer.xpm000066400000000000000000000012051435005021200227100ustar00rootroot00000000000000/* XPM */ static const char * timer_xpm[] = { "27 18 2 1", " c None", ". c #B9C000", " ", " ", " ....................... ", " ....................... ", " .. .. ", " .. ...... .. .. .. .. ", " .. ...... .. ... ... .. ", " .. .. .. ....... .. ", " .. .. .. ....... .. ", " .. .. .. .. . .. .. ", " .. .. .. .. .. .. ", " .. .. .. .. .. .. ", " .. .. .. .. .. .. ", " .. .. ", " ....................... ", " ....................... ", " ", " "}; vdr-plugin-skinenigmang-0.1.5/symbols/small/v_16_9.xpm000066400000000000000000000012061435005021200225740ustar00rootroot00000000000000/* XPM */ static const char * v_16_9_xpm[] = { "27 18 2 1", " c None", ". c #B9C000", " ", " ", " ....................... ", " ....................... ", " .. .. ", " .. .. ", " .. .. ", " .. .. ", " .. .. ", " .. .. ", " .. .. ", " .. .. ", " .. .. ", " .. .. ", " ....................... ", " ....................... ", " ", " "}; vdr-plugin-skinenigmang-0.1.5/symbols/small/v_4_3.xpm000066400000000000000000000012051435005021200225020ustar00rootroot00000000000000/* XPM */ static const char * v_4_3_xpm[] = { "27 18 2 1", " c None", ". c #B9C000", " ", " ", " ....................... ", " ....................... ", " ..... ..... ", " ..... ..... ", " ..... ..... ", " ..... ..... ", " ..... ..... ", " ..... ..... ", " ..... ..... ", " ..... ..... ", " ..... ..... ", " ..... ..... ", " ....................... ", " ....................... ", " ", " "}; vdr-plugin-skinenigmang-0.1.5/symbols/small/v_l14_9.xpm000066400000000000000000000012071435005021200227470ustar00rootroot00000000000000/* XPM */ static const char * v_l14_9_xpm[] = { "27 18 2 1", " c None", ". c #B9C000", " ", " ", " ....................... ", " ....................... ", " ....................... ", " ....................... ", " ....................... ", " .... .... ", " .... .... ", " .... .... ", " .... .... ", " ....................... ", " ....................... ", " ....................... ", " ....................... ", " ....................... ", " ", " "}; vdr-plugin-skinenigmang-0.1.5/symbols/small/v_l16_9.xpm000066400000000000000000000012071435005021200227510ustar00rootroot00000000000000/* XPM */ static const char * v_l16_9_xpm[] = { "27 18 2 1", " c None", ". c #B9C000", " ", " ", " ....................... ", " ....................... ", " ....................... ", " ....................... ", " ..... ..... ", " ..... ..... ", " ..... ..... ", " ..... ..... ", " ..... ..... ", " ..... ..... ", " ....................... ", " ....................... ", " ....................... ", " ....................... ", " ", " "}; vdr-plugin-skinenigmang-0.1.5/symbols/small/v_l_16_9.xpm000066400000000000000000000012101435005021200231020ustar00rootroot00000000000000/* XPM */ static const char * v_l_16_9_xpm[] = { "27 18 2 1", " c None", ". c #B9C000", " ", " ", " ....................... ", " ....................... ", " ....................... ", " ....................... ", " ....................... ", " ....................... ", " .... .... ", " .... .... ", " ....................... ", " ....................... ", " ....................... ", " ....................... ", " ....................... ", " ....................... ", " ", " "}; vdr-plugin-skinenigmang-0.1.5/symbols/small/v_unknown.xpm000066400000000000000000000012111435005021200236110ustar00rootroot00000000000000/* XPM */ static const char * v_unknown_xpm[] = { "27 18 2 1", " c None", ". c #B9C000", " ", " ", " ....................... ", " ....................... ", " .. .. ", " .. .... .. ", " .. .. .. ", " .. .. .. ", " .. .. .. ", " .. .. .. ", " .. .. .. ", " .. .. ", " .. .. .. ", " .. .. .. ", " ....................... ", " ....................... ", " ", " "}; vdr-plugin-skinenigmang-0.1.5/symbols/small/vps.xpm000066400000000000000000000012031435005021200223760ustar00rootroot00000000000000/* XPM */ static const char * vps_xpm[] = { "27 18 2 1", " c None", ". c #B9C000", " ", " ", " ....................... ", " ....................... ", " .. .. ", " .. .. .. .... .... .. ", " .. .. .. ..... ..... .. ", " .. .. .. .. .. .. .. ", " .. .. .. ..... .... .. ", " .. .. .. .... .... .. ", " .. ..... .. .. .. ", " .. ... .. ..... .. ", " .. . .. .... .. ", " .. .. ", " ....................... ", " ....................... ", " ", " "}; vdr-plugin-skinenigmang-0.1.5/texteffects.c000066400000000000000000000247041435005021200207430ustar00rootroot00000000000000#include "common.h" #include "config.h" #include "texteffects.h" #include "tools.h" #include //Redefine macros #undef TE_LOCK #define TE_LOCK UpdateLock() #undef TE_UNLOCK #define TE_UNLOCK UpdateUnlock() // --- cEffect ----------------------------------------------- cEffect::cEffect(cOsd * osd, int x, int y, int width, int height, int depth /* = 1 */, bool active /* = true */) { debug("cEffect::cEffect(x=%d,y=%d,w=%d,h=%d)", x, y, width, height) Active = active; xOff = x; yOff = y; Osd = osd; bmp = NULL; Width = width; Height = height; ColorDepth = depth; Text = NULL; changed = false; } cEffect::~cEffect() { free(Text); Text = NULL; delete(bmp); bmp = NULL; } // --- cEffectScroll ----------------------------------------------- cEffectScroll::cEffectScroll(cOsd *osd, int x, int y, int width, int height /* = 0 */, tColor fg /* = 0xFFFFFFFF */, tColor bg /* = 0xFF000000 */, int alignment /* = taDefault */, int depth /* = 1 */, bool active /* = true */) : cEffect(osd, x, y, width, height, depth, active) { Fg = fg; Bg = bg; Alignment = alignment; DestWidth = width; pos = 0; dir = 0; Delay = EnigmaConfig.scrollPause; delay = Delay; xOffset = 0; } bool cEffectScroll::SetText(const char *text, const cFont *font, int offset /* = 0 */) { debug("cEffectScroll::SetText(%s, %d)", text ? text : "NULL", offset) if (!font) return false; changed = true; if (!text) { // || isempty(text)) { // clear area if no text is given Osd->DrawRectangle(xOff + xOffset, yOff, xOff + DestWidth, yOff - 1 + Height, Bg); return false; } if (Text && strcmp(Text, text) == 0) return true; if (Text) free(Text); Text = strdup(text); int textwidth = font->Width(text); int textheight = font->Height(text); xOffset = offset; dir = 0; DestWidth = Width - xOffset; // text is given, draw it Osd->DrawText(xOff + xOffset, yOff, text, Fg, Bg, font, DestWidth, textheight, Alignment); if (!DestWidth || !Active) return false; if (textwidth > DestWidth) { pos = 0; dir = -1; Time.Set(); if (bmp) bmp->SetSize(textwidth, textheight); else bmp = new cBitmap(textwidth, textheight, ColorDepth); bmp->DrawText(0, 0, text, Fg, Bg, font); delay = Delay; return true; } return false; } bool cEffectScroll::IsDrawNeeded(void) { if (bmp) { int elapsed = ((int)Time.Elapsed()); if (elapsed >= Delay) { Delay = EnigmaConfig.scrollDelay; if (dir == -2) { pos = 0; dir = -1; Delay = EnigmaConfig.scrollPause; } else { pos -= dir; if (pos < 0) { pos = 0; dir = -1; Delay = EnigmaConfig.scrollPause; } else { int x = bmp->Width() - DestWidth; if (pos > x) { if (EnigmaConfig.scrollMode) { // Restart scrolling from the left dir = -2; } else { // ping-pong scroll pos = x; dir = 1; } Delay = EnigmaConfig.scrollPause; } } } Time.Set(); delay = Delay; return true; } else { delay = Delay - elapsed; } } else { delay = 0; } return false; } int cEffectScroll::DrawIfNeeded(int yMax) { bool needed=IsDrawNeeded(); // printf("cEffectScroll::DrawIfNeeded(%d) bmp=%p dir=%d yOff=%d needed=%d, DestWidth=%d, h=%d\n", yMax, bmp, dir, yOff, needed, DestWidth, yOff + Height > yMax ? yMax - yOff : bmp->Height()); changed = false; if (bmp && dir && (yMax == 0 || yOff < yMax) && needed) { //TODO changed = true; for (int i = 0; i < DestWidth; i++) { int nHeight = (yMax > 0 && yOff + Height > yMax) ? yMax - yOff : bmp->Height(); for (int j = 0; j < nHeight; j++) { Osd->DrawPixel(xOff + xOffset + i, yOff + j, bmp->Color(*(bmp->Data(i + pos, j)))); } } } return delay; } // --- cEffectBlink ----------------------------------------------- cEffectBlink::cEffectBlink(cOsd *osd, int x, int y, int width, int height /* = 0 */, tColor fg /* = 0xFFFFFFFF */, tColor bg /* = 0xFF000000 */, int alignment /* = taDefault */, int depth /* = 1 */, bool active /* = true */) : cEffect(osd, x, y, width, height, depth, active) { Fg = fg; Bg = bg; Alignment = alignment; Delay = EnigmaConfig.blinkPause; delay = Delay; shown = false; changed = false; } bool cEffectBlink::SetText(const char *text, const cFont *font, int offset /* = 0 */) { debug("cEffectBlink::SetText(%s, %d)", text ? text : "NULL", offset) if (!font) return false; changed = true; if (!text || isempty(text)) { // clear area if no text is given Osd->DrawRectangle(xOff + xOffset, yOff, xOff + DestWidth, yOff - 1 + Height, Bg); return false; } xOffset = offset; shown = true; DestWidth = Width - xOffset; int textwidth = font->Width(text); int textheight = font->Height(text); if (textwidth < DestWidth) textwidth = DestWidth; if (textheight < Height) textheight = Height; // text is given, draw it Osd->DrawText(xOff + xOffset, yOff, text, Fg, Bg, font, DestWidth, textheight, Alignment); if (!DestWidth || !Active) return false; if (bmp) bmp->SetSize(textwidth, textheight); else bmp = new cBitmap(textwidth, textheight, ColorDepth); bmp->DrawText(0, 0, text, Fg, Bg, font, textwidth, textheight, Alignment); Time.Set(); delay = Delay; return true; } int cEffectBlink::DrawIfNeeded(int yMax) { //debug("cEffectBlink::DrawIfNeeded") changed = false; if (yMax != 0 && yMax < yOff) //TODO return delay; if (bmp) { int elapsed = ((int)Time.Elapsed()); if (elapsed >= Delay) { if (shown) { //hide Osd->DrawRectangle(xOff, yOff, xOff + Width - 1, yOff + Height - 1, Bg); shown = false; } else { //show for (int i = 0; i < Width; i++) { for (int j = 0; j < bmp->Height(); j++) { Osd->DrawPixel(xOff + xOffset + i, yOff + j, bmp->Color(*(bmp->Data(i, j)))); } } shown = true; } Time.Set(); delay = Delay; changed = true; } else { delay = Delay - elapsed; } } else { delay = 0; } return delay; } // --- cEnigmaTextEffects ----------------------------------------------- cEnigmaTextEffects EnigmaTextEffects("EnigmaNG effects"); cEnigmaTextEffects::cEnigmaTextEffects(const char *Description) : cThread(Description), osd(NULL), condSleep(), mutexSleep(), mutexRunning() { // SetPriority(19); sem_init(&sem_update, 0, 1); } cEnigmaTextEffects::~cEnigmaTextEffects(void) { //TODO? Stop(); } void cEnigmaTextEffects::Action(void) { mutexRunning.Lock(); mutexSleep.Lock(); debug("cEnigmaTextEffects::Action() %lu", pthread_self()); while (EnigmaConfig.useTextEffects && osd) { int nSleepMs = 5000; int tempSleep = 0; TE_LOCK; //This causes an initial wait until the first Flush() is called (which TE_UNKOCKs) bool changed = false; for (Effects_t::iterator effect = vecEffects.begin(); (effect != vecEffects.end()) && osd; ++effect) { cEffect *e = (*effect); if (e == NULL) continue; tempSleep = e->DrawIfNeeded(yMessageTop); changed = (changed || e->changed); //printf("TEMPSLEEP %d\n", tempSleep); nSleepMs = nSleepMs < tempSleep ? nSleepMs : (tempSleep <= 0 ? nSleepMs : tempSleep); } if (osd && changed) osd->Flush(); TE_UNLOCK; if (osd) { // printf("SLEEP1: %d, %lu\n", nSleepMs, pthread_self()); if (nSleepMs) condSleep.TimedWait(mutexSleep, nSleepMs); else condSleep.TimedWait(mutexSleep, EnigmaConfig.scrollPause); //TODO // printf("SLEEP2: %d, %lu\n", nSleepMs, pthread_self()); } } mutexSleep.Unlock(); mutexRunning.Unlock(); } bool cEnigmaTextEffects::Start(cOsd *o) { osd = o; if (!EnigmaConfig.useTextEffects) return false; debug("cEnigmaTextEffects::Start(%p) %lu", osd, pthread_self()); if (osd == NULL) return false; if (Running()) { error("cEnigmaTextEffects::Start - already running"); return false; //TODO? maybe Cancel() } yMessageTop = 0; TE_LOCK; return cThread::Start(); } void cEnigmaTextEffects::Stop(void) { //Must be TE_LOCKed by caller (calls TE_UNLOCK) debug("cEnigmaTextEffects::Stop()"); osd = NULL; Clear(); TE_UNLOCK; Wakeup(); // break sleeping Action() thread mutexRunning.Lock(); // Wait for Action() to finish mutexRunning.Unlock(); } void cEnigmaTextEffects::Clear(void) { debug("cEnigmaTextEffects::Clear()"); //Must be TE_LOCKed by caller for (Effects_t::iterator effect = vecEffects.begin(); effect != vecEffects.end(); ++effect) { delete(*effect); } vecEffects.clear(); } void cEnigmaTextEffects::PauseEffects(int y) { debug("cEnigmaTextEffects::PauseEffects(%d)", y); //Must be TE_LOCKed by caller yMessageTop = y; } void cEnigmaTextEffects::ResetText(int i, tColor /* ColorFg */, tColor /* ColorBg */, bool /* fDraw */) { debug("cEnigmaTextEffects::ResetText(%d)", i); //Must be TE_LOCKed by caller if (i < 0 || i >= (int)vecEffects.size()) return; cEffect *e = vecEffects[i]; if (e) { delete(e); vecEffects[i] = NULL; } if (i == (int)vecEffects.size() - 1) vecEffects.resize(vecEffects.size() - 1); } int cEnigmaTextEffects::DrawAnimatedText(int o_id, int action, bool _active, int x, int y, const char *s, tColor ColorFg, tColor ColorBg, const cFont *Font, int ColorDepth /* = 1 */, int Width /* = 0 */, int Height /* = 0 */, int Alignment /* = taDefault */) { //Must be TE_LOCKed by caller if (osd == NULL) return -1; debug("cEnigmaTextEffects::DrawAnimatedText(%d, %d, %d, %d, %d, %s, %d, %d, %p, %d, %d, %d, %d)", o_id, action, _active, x, y, s, ColorFg, ColorBg, Font, ColorDepth, Width, Height, Alignment); if (o_id >= 0) { // Update animated text cEffect *effect = vecEffects[o_id]; if (effect) { effect->SetText(s, Font); return o_id; } else { return -1; } } else { // New animated text cEffect *effect = NULL; if (action == 0) effect = new cEffectScroll(osd, x, y, Width, Height, ColorFg, ColorBg, Alignment, ColorDepth, _active); else effect = new cEffectBlink(osd, x, y, Width, Height, ColorFg, ColorBg, Alignment, ColorDepth, _active); if (effect == NULL) { return -1; } if (effect->SetText(s, Font)) { vecEffects.push_back(effect); return vecEffects.size() - 1; } else { delete effect; return -1; } } } // vim:et:sw=2:ts=2: vdr-plugin-skinenigmang-0.1.5/texteffects.h000066400000000000000000000070601435005021200207440ustar00rootroot00000000000000/* * texteffects.h: 'EnigmaNG' skin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __TEXTEFFECTS_H #define __TEXTEFFECTS_H #include #include "common.h" #include "enigma.h" #include #include #include #define TE_START(osd) EnigmaTextEffects.Start(osd); #define TE_STOP EnigmaTextEffects.Stop(); #define TE_LOCK EnigmaTextEffects.UpdateLock(); #define TE_UNLOCK EnigmaTextEffects.UpdateUnlock(); #define TE_WAKEUP EnigmaTextEffects.RefreshEffects(); #define TE_MARQUEE(osd, id, x...) EnigmaTextEffects.DrawAnimatedText(id, 0, x) #define TE_BLINK(osd, id, x...) EnigmaTextEffects.DrawAnimatedText(id, 1, x) class cEffect { protected: bool Active; cOsd *Osd; int xOff; int yOff; int Width; int Height; int ColorDepth; char *Text; cTimeMs Time; cBitmap *bmp; public: cEffect(cOsd *osd, int x, int y, int width, int height = 0, int depth = 1, bool active = true); virtual ~cEffect(); virtual bool SetText(const char *text, const cFont *font, int offset = 0) = 0; virtual int DrawIfNeeded(int yMax) = 0; bool changed; }; class cEffectScroll : public cEffect { private: tColor Fg; tColor Bg; int Alignment; int Delay; int pos; int dir; int delay; int xOffset; int DestWidth; bool IsDrawNeeded(void); public: cEffectScroll(cOsd *osd, int x, int y, int width, int height = 0, tColor fg = 0xFFFFFFFF, tColor bg = 0xFF000000, int alignment = taDefault, int depth = 1, bool active = true); virtual ~cEffectScroll() {}; virtual bool SetText(const char *text, const cFont *font, int offset = 0); virtual int DrawIfNeeded(int yMax); }; class cEffectBlink : public cEffect { private: tColor Fg; tColor Bg; int Alignment; int Delay; bool shown; int delay; int xOffset; int DestWidth; public: cEffectBlink(cOsd *osd, int x, int y, int width, int height = 0, tColor fg = 0xFFFFFFFF, tColor bg = 0xFF000000, int alignment = taDefault, int depth = 1, bool active = true); virtual ~cEffectBlink() {}; virtual bool SetText(const char *text, const cFont *font, int offset = 0); virtual int DrawIfNeeded(int yMax); }; class cEnigmaTextEffects : public cThread { private: cOsd *osd; int yMessageTop; typedef std::vector Effects_t; Effects_t vecEffects; cCondVar condSleep; cMutex mutexSleep; cMutex mutexRunning; sem_t sem_update; void Wakeup(void) { // printf("WAKE1: %lu\n", pthread_self()); mutexSleep.Lock(); condSleep.Broadcast(); mutexSleep.Unlock(); // printf("WAKE2: %lu\n", pthread_self()); } public: cEnigmaTextEffects(const char *Description = NULL); ~cEnigmaTextEffects(void); virtual void Action(void); bool Start(cOsd *o); void Stop(void); void Clear(void); void ResetText(int i, tColor ColorFg = 0, tColor ColorBg = 0, bool fDraw = true); void PauseEffects(int y = 0); int DrawAnimatedText(int o_id, int action, bool active, int x, int y, const char *s, tColor ColorFg, tColor ColorBg, const cFont *Font, int ColorDepth = 1, int Width = 0, int Height = 0, int Alignment = taDefault); void UpdateLock(void) { // printf("LOCK1: %lu\n", pthread_self()); sem_wait(&sem_update); // printf("LOCK2: %lu\n", pthread_self()); } void UpdateUnlock(void) { // printf("UNLOCK1: %lu\n", pthread_self()); sem_post(&sem_update); // printf("UNLOCK2: %lu\n", pthread_self()); } void RefreshEffects(void) { Wakeup(); } }; extern cEnigmaTextEffects EnigmaTextEffects; #endif //__TEXTEFFECTS_H // vim:et:sw=2:ts=2: vdr-plugin-skinenigmang-0.1.5/themes/000077500000000000000000000000001435005021200175315ustar00rootroot00000000000000vdr-plugin-skinenigmang-0.1.5/themes/EnigmaNG-AppleGreen.theme000066400000000000000000000025321435005021200242240ustar00rootroot00000000000000Description = AppleGreen clrBackground = E5DFFADE clrAltBackground = E5BFE6C2 clrTitleBg = E547BC41 clrLogoBg = E59AE38E clrBottomBg = E52A7D1D clrBotProgBarBg = FF808080 clrBotProgBarFg = FFFFFFFF clrMenuTxtFg = FF000000 clrTitleFg = FFFFFFFF clrTitleShadow = FF000000 clrSymbolActive = FF41C400 clrSymbolInactive = FF808080 clrSymbolRecord = FFC40000 clrSymbolRecordBg = FFFFFFFF clrSymbolTimerActive = FF98C400 clrSymbolVpsActive = FFC4C400 clrSymbolRecActive = FFC40000 clrSymbolRunActive = FF00C400 clrButtonRedFg = FFFFFFFF clrButtonRedBg = E5C40000 clrButtonGreenFg = FF000000 clrButtonGreenBg = E500C400 clrButtonYellowFg = FF000000 clrButtonYellowBg = E5C4C400 clrButtonBlueFg = FFFFFFFF clrButtonBlueBg = E50000C4 clrMessageStatusFg = FF000000 clrMessageStatusBg = E5D7FFD1 clrMessageInfoFg = FF000000 clrMessageInfoBg = E5D3FFD1 clrMessageWarningFg = FF000000 clrMessageWarningBg = E5D7FFD1 clrMessageErrorFg = FF000000 clrMessageErrorBg = E5FFD1D1 clrVolumeBar = FF33CC33 clrVolumeBarMute = FFFF0000 clrMenuItemSelectableFg = FF000000 clrMenuItemNotSelectableFg = E54158BC clrReplayCurrent = FF2D7D1D clrReplayTotal = FF2D7D1D clrReplayModeJump = FF2D7D1D clrReplayBarAreaBg = E5E6FADE clrReplayProgressSeen = FF9AE38E clrReplayProgressRest = E5E6FADE clrReplayProgressSelected = FF61BC41 clrReplayProgressMark = FF61BC41 clrReplayProgressCurrent = FF61BC41 vdr-plugin-skinenigmang-0.1.5/themes/EnigmaNG-Black.theme000066400000000000000000000027421435005021200232210ustar00rootroot00000000000000Description = Black clrBackground = EE3e4044 #496DCC clrAltBackground = EE25252a #393D8C clrTitleBg = EE37383a #5f6064 #4158BC clrLogoBg = EE3e4044 #575758 #496DAC clrBottomBg = EE37383a #5f6064 #1D2F7D clrBotProgBarBg = FF808080 clrBotProgBarFg = EE9cea6d #C4C400 clrMenuTxtFg = FFDDDDDD clrTitleFg = FFDDDDDD clrTitleShadow = FF000000 clrSymbolActive = FF90ec58 #C4C400 clrSymbolInactive = FF808080 clrSymbolRecord = FFC40000 clrSymbolRecordBg = FFDDDDDD clrSymbolTimerActive = FF0000C4 clrSymbolVpsActive = FF90ec58 #C4C400 clrSymbolRecActive = FFC40000 clrSymbolRunActive = FF90ec58 #00C400 clrButtonRedFg = FFDDDDDD clrButtonRedBg = E8C40000 clrButtonGreenFg = FF111111 clrButtonGreenBg = E800C400 clrButtonYellowFg = FF111111 clrButtonYellowBg = E8C4C400 clrButtonBlueFg = FFDDDDDD clrButtonBlueBg = E80000C4 clrMessageStatusFg = FF111111 clrMessageStatusBg = E89cff70 #C4C400 clrMessageInfoFg = FF111111 clrMessageInfoBg = E89cff70 #C4C400 clrMessageWarningFg = FF111111 clrMessageWarningBg = E8C4C400 clrMessageErrorFg = FF111111 clrMessageErrorBg = E8d2544d #C4C400 clrVolumeBar = FF33CC33 clrVolumeBarMute = EE496DCC clrMenuItemSelectableFg = FFDDDDDD clrMenuItemNotSelectableFg = FFAFAFCF clrReplayCurrent = EE8d8d93 #C3CAFA clrReplayTotal = EE8d8d93 #C3CAFA clrReplayModeJump = EE8d8d93 #C3CAFA clrReplayBarAreaBg = EE5c5d61 #496DCC clrReplayProgressSeen = EE33CC33 clrReplayProgressRest = EE515255 #496DCC clrReplayProgressSelected = EE1d1e38 #292D5C clrReplayProgressMark = EE292D5C vdr-plugin-skinenigmang-0.1.5/themes/EnigmaNG-Blue.theme000066400000000000000000000024601435005021200230710ustar00rootroot00000000000000Description = Blue clrBackground = EE496DCC clrAltBackground = EE393D8C clrTitleBg = EE4158BC clrLogoBg = EE496DAC clrBottomBg = EE1D2F7D clrBotProgBarBg = FF808080 clrBotProgBarFg = EEC4C400 clrMenuTxtFg = FFDDDDDD clrTitleFg = FFDDDDDD clrTitleShadow = FF000000 clrSymbolActive = FFC4C400 clrSymbolInactive = FF808080 clrSymbolRecord = FFC40000 clrSymbolRecordBg = FFDDDDDD clrSymbolTimerActive = FF0000C4 clrSymbolVpsActive = FFC4C400 clrSymbolRecActive = FFC40000 clrSymbolRunActive = FF00C400 clrButtonRedFg = FFDDDDDD clrButtonRedBg = E8C40000 clrButtonGreenFg = FF111111 clrButtonGreenBg = E800C400 clrButtonYellowFg = FF111111 clrButtonYellowBg = E8C4C400 clrButtonBlueFg = FFDDDDDD clrButtonBlueBg = E80000C4 clrMessageStatusFg = FF111111 clrMessageStatusBg = E8C4C400 clrMessageInfoFg = FF111111 clrMessageInfoBg = E8C4C400 clrMessageWarningFg = FF111111 clrMessageWarningBg = E8C4C400 clrMessageErrorFg = FF111111 clrMessageErrorBg = E8C4C400 clrVolumeBar = FF33CC33 clrVolumeBarMute = EE496DCC clrMenuItemSelectableFg = FFDDDDDD clrMenuItemNotSelectableFg = FFAFAFCF clrReplayCurrent = EEC3CAFA clrReplayTotal = EEC3CAFA clrReplayModeJump = EEC3CAFA clrReplayBarAreaBg = EE496DCC clrReplayProgressSeen = EE33CC33 clrReplayProgressRest = EE496DCC clrReplayProgressSelected = EE292D5C clrReplayProgressMark = EE292D5C vdr-plugin-skinenigmang-0.1.5/themes/EnigmaNG-Blue2.theme000066400000000000000000000024611435005021200231540ustar00rootroot00000000000000Description = Blue2 clrBackground = EE393D8C clrAltBackground = EE191D6C clrTitleBg = EE4158BC clrLogoBg = EE496DAC clrBottomBg = EE1D2F7D clrBotProgBarBg = FF808080 clrBotProgBarFg = EEC4C400 clrMenuTxtFg = FFDDDDDD clrTitleFg = FFDDDDDD clrTitleShadow = FF000000 clrSymbolActive = FFC4C400 clrSymbolInactive = FF808080 clrSymbolRecord = FFC40000 clrSymbolRecordBg = FFDDDDDD clrSymbolTimerActive = FF0000C4 clrSymbolVpsActive = FFC4C400 clrSymbolRecActive = FFC40000 clrSymbolRunActive = FF00C400 clrButtonRedFg = FFDDDDDD clrButtonRedBg = E8C40000 clrButtonGreenFg = FF111111 clrButtonGreenBg = E800C400 clrButtonYellowFg = FF111111 clrButtonYellowBg = E8C4C400 clrButtonBlueFg = FFDDDDDD clrButtonBlueBg = E80000C4 clrMessageStatusFg = FF111111 clrMessageStatusBg = E8C4C400 clrMessageInfoFg = FF111111 clrMessageInfoBg = E8C4C400 clrMessageWarningFg = FF111111 clrMessageWarningBg = E8C4C400 clrMessageErrorFg = FF111111 clrMessageErrorBg = E8C4C400 clrVolumeBar = FF33CC33 clrVolumeBarMute = EE393D8C clrMenuItemSelectableFg = FFDDDDDD clrMenuItemNotSelectableFg = FFAFAFCF clrReplayCurrent = EEC3CAFA clrReplayTotal = EEC3CAFA clrReplayModeJump = EEC3CAFA clrReplayBarAreaBg = EE191D6C clrReplayProgressSeen = EE33CC33 clrReplayProgressRest = EE393D8C clrReplayProgressSelected = EEC3CAFA clrReplayProgressMark = EEC3CAFA vdr-plugin-skinenigmang-0.1.5/themes/EnigmaNG-Blue3.theme000066400000000000000000000024611435005021200231550ustar00rootroot00000000000000Description = Blue3 clrBackground = EE333388 clrAltBackground = EE000066 clrTitleBg = EE4158BC clrLogoBg = EE496DAC clrBottomBg = EE1D2F7D clrBotProgBarBg = FF808080 clrBotProgBarFg = EEC4C400 clrMenuTxtFg = FFDDDDDD clrTitleFg = FFDDDDDD clrTitleShadow = FF000000 clrSymbolActive = FFC4C400 clrSymbolInactive = FF808080 clrSymbolRecord = FFC40000 clrSymbolRecordBg = FFDDDDDD clrSymbolTimerActive = FF0000C4 clrSymbolVpsActive = FFC4C400 clrSymbolRecActive = FFC40000 clrSymbolRunActive = FF00C400 clrButtonRedFg = FFDDDDDD clrButtonRedBg = E8C40000 clrButtonGreenFg = FF111111 clrButtonGreenBg = E800C400 clrButtonYellowFg = FF111111 clrButtonYellowBg = E8C4C400 clrButtonBlueFg = FFDDDDDD clrButtonBlueBg = E80000C4 clrMessageStatusFg = FF111111 clrMessageStatusBg = E8C4C400 clrMessageInfoFg = FF111111 clrMessageInfoBg = E8C4C400 clrMessageWarningFg = FF111111 clrMessageWarningBg = E8C4C400 clrMessageErrorFg = FF111111 clrMessageErrorBg = E8C4C400 clrVolumeBar = FF33CC33 clrVolumeBarMute = EE333388 clrMenuItemSelectableFg = FFDDDDDD clrMenuItemNotSelectableFg = FFAFAFCF clrReplayCurrent = EEC3CAFA clrReplayTotal = EEC3CAFA clrReplayModeJump = EEC3CAFA clrReplayBarAreaBg = EE191D6C clrReplayProgressSeen = EE33CC33 clrReplayProgressRest = EE393D8C clrReplayProgressSelected = EEC3CAFA clrReplayProgressMark = EEC3CAFA vdr-plugin-skinenigmang-0.1.5/themes/EnigmaNG-Coolblue.theme000066400000000000000000000041531435005021200237470ustar00rootroot00000000000000Description = CoolBlue # MenueHauptfarbe clrBackground = EE000066 # MenuFarbe RECHTS (neuer Timer Bereich) clrAltBackground = EE333388 # Titleleiste ganz oben u. beim Umschalten blau: C8000088 clrTitleBg = EEC40000 clrLogoBg = EEAAAADD # Umschalten Kasten unten passend mit Titelleiste! C8000088 clrBottomBg = EEC40000 clrBotProgBarBg = FF808080 #clrBotProgBarFg = FFDDDDDD clrBotProgBarFg = EEC4C400 # Im Menue RECHTS OBEN bei Logo Schriftfarbe ! # und in allen Programm u. Aufzeichnungsbeschreibungen ! clrMenuTxtFg = FFDDDDDD # title-Text weiss clrTitleFg = FFDDDDDD clrTitleShadow = FF000000 clrSymbolActive = FFC4C400 clrSymbolInactive = FF808080 clrSymbolRecord = FFC40000 clrSymbolRecordBg = FFDDDDDD clrSymbolTimerActive = FF0000C4 clrSymbolVpsActive = FFC4C400 clrSymbolRecActive = FFC40000 clrSymbolRunActive = FF00C400 # 4 Farben buttons clrButtonRedFg = FFDDDDDD clrButtonRedBg = EEC40000 clrButtonGreenFg = FF111111 clrButtonGreenBg = EE00C400 clrButtonYellowFg = FF111111 clrButtonYellowBg = EEC4C400 clrButtonBlueFg = FFDDDDDD clrButtonBlueBg = EE0000C4 #clrMessageBorder = D8FF0000 clrMessageStatusFg = FF111111 clrMessageStatusBg = EEC4C400 clrMessageInfoFg = FF111111 clrMessageInfoBg = EEC4C400 clrMessageWarningFg = FF111111 clrMessageWarningBg = EEC4C400 clrMessageErrorFg = FF111111 clrMessageErrorBg = EEC4C400 # jetzt ist das die Farbe des GELB-Buttons: #clrVolumeBar = EEC4C400 clrVolumeBar = EE33CC33 #clrVolumeBarMute = FFFF0000 # bei Mute kein ProgressBar! clrVolumeBarMute = EE000066 # Farbe Scrollbalken Menue TEXT ausgewaehlt (statt weiss gelb = zuviel) #clrMenuItemCurrentFg = FFDDDDDD # Scrollbar im Menue !!! = Farbe von Menue-Bereich rechts! #clrMenuHighlight = C8333388 #clrAltBackground = EE333388 # Schriftfarbe des Menues, PRG usw... clrMenuItemSelectableFg = FFDDDDDD # vorher B88EA4E3 clrMenuItemNotSelectableFg = FFAAAADD # Bei Aufnahme Scrollbar selbsterklaerend clrReplayCurrent = EEC3CAFA clrReplayTotal = EEC3CAFA clrReplayModeJump = EEC3CAFA clrReplayBarAreaBg = EE191D6C clrReplayProgressSeen = EE33CC33 clrReplayProgressRest = EE393D8C clrReplayProgressSelected = EEC3CAFA clrReplayProgressMark = EEC3CAFA vdr-plugin-skinenigmang-0.1.5/themes/EnigmaNG-DarkBlue.theme000066400000000000000000000025301435005021200236710ustar00rootroot00000000000000Description = DarkBlue clrBackground = B83E4044 clrAltBackground = B825252A clrTitleBg = B84158BC clrLogoBg = B8566489 clrBottomBg = B81D2F7D clrBotProgBarBg = FF808080 clrBotProgBarFg = FFFFFFFF clrMenuTxtFg = FFFFFFFF clrTitleFg = FFFFFFFF clrTitleShadow = FF000000 clrSymbolActive = FFC4C400 clrSymbolInactive = FF808080 clrSymbolRecord = FFC40000 clrSymbolRecordBg = FFFFFFFF clrSymbolTimerActive = FF0000C4 clrSymbolVpsActive = FFC4C400 clrSymbolRecActive = FFC40000 clrSymbolRunActive = FF00C400 clrButtonRedFg = FFFFFFFF clrButtonRedBg = B8C40000 clrButtonGreenFg = FFFFFFFF clrButtonGreenBg = B800C400 clrButtonYellowFg = FFFFFFFF clrButtonYellowBg = B8C4C400 clrButtonBlueFg = FFFFFFFF clrButtonBlueBg = B80000C4 clrMessageStatusFg = FFFFFFFF clrMessageStatusBg = B86B7F68 clrMessageInfoFg = FFFFFFFF clrMessageInfoBg = B8696F80 clrMessageWarningFg = FFFFFFFF clrMessageWarningBg = B87D8069 clrMessageErrorFg = FFFFFFFF clrMessageErrorBg = B87F6868 clrVolumeBar = FF33CC33 clrVolumeBarMute = FFFF0000 clrMenuItemSelectableFg = FFFFFFFF clrMenuItemNotSelectableFg = B88EA4E3 clrReplayCurrent = FFC3CAFA clrReplayTotal = FFC3CAFA clrReplayModeJump = FFC3CAFA clrReplayBarAreaBg = B82B2B3C clrReplayProgressSeen = FF24FC24 clrReplayProgressRest = B8DEE5FA clrReplayProgressSelected = FFFFFFFF clrReplayProgressMark = FFFFFFFF clrReplayProgressCurrent = FFFF0000 vdr-plugin-skinenigmang-0.1.5/themes/EnigmaNG-Grey.theme000066400000000000000000000024601435005021200231100ustar00rootroot00000000000000Description = Grey clrBackground = EE3e4044 clrAltBackground = EE25252a clrTitleBg = EE5f6064 clrLogoBg = EE575758 clrBottomBg = EE5f6064 clrBotProgBarBg = FF808080 clrBotProgBarFg = EE9cea6d clrMenuTxtFg = FFDDDDDD clrTitleFg = FFDDDDDD clrTitleShadow = FF000000 clrSymbolActive = FF90ec58 clrSymbolInactive = FF808080 clrSymbolRecord = FFC40000 clrSymbolRecordBg = FFDDDDDD clrSymbolTimerActive = FF0000C4 clrSymbolVpsActive = FF90ec58 clrSymbolRecActive = FFC40000 clrSymbolRunActive = FF90ec58 clrButtonRedFg = FFDDDDDD clrButtonRedBg = E8C40000 clrButtonGreenFg = FF111111 clrButtonGreenBg = E800C400 clrButtonYellowFg = FF111111 clrButtonYellowBg = E8C4C400 clrButtonBlueFg = FFDDDDDD clrButtonBlueBg = E80000C4 clrMessageStatusFg = FF111111 clrMessageStatusBg = E89cff70 clrMessageInfoFg = FF111111 clrMessageInfoBg = E89cff70 clrMessageWarningFg = FF111111 clrMessageWarningBg = E8C4C400 clrMessageErrorFg = FF111111 clrMessageErrorBg = E8d2544d clrVolumeBar = FF33CC33 clrVolumeBarMute = EE496DCC clrMenuItemSelectableFg = FFDDDDDD clrMenuItemNotSelectableFg = FFAFAFCF clrReplayCurrent = EE8d8d93 clrReplayTotal = EE8d8d93 clrReplayModeJump = EE8d8d93 clrReplayBarAreaBg = EE5c5d61 clrReplayProgressSeen = EE33CC33 clrReplayProgressRest = EE515255 clrReplayProgressSelected = EE1d1e38 clrReplayProgressMark = EE292D5C vdr-plugin-skinenigmang-0.1.5/themes/EnigmaNG-MoBuntu.theme000066400000000000000000000025271435005021200235770ustar00rootroot00000000000000Description = MoBuntu clrBackground = DF200F02 clrAltBackground = DF4C2F1A clrTitleBg = DF793809 clrLogoBg = DFE6731E clrBottomBg = DF793809 clrBotProgBarBg = FF808080 clrBotProgBarFg = FFFFFFFF clrMenuTxtFg = FFFFFFFF clrTitleFg = FFFFFFFF clrTitleShadow = FF000000 clrSymbolActive = FFC4C400 clrSymbolInactive = FF808080 clrSymbolRecord = FFC40000 clrSymbolRecordBg = FFFFFFFF clrSymbolTimerActive = FF0000C4 clrSymbolVpsActive = FFC4C400 clrSymbolRecActive = FFC40000 clrSymbolRunActive = FF00C400 clrButtonRedFg = FFFFFFFF clrButtonRedBg = E5C40000 clrButtonGreenFg = FF000000 clrButtonGreenBg = E500C400 clrButtonYellowFg = FF000000 clrButtonYellowBg = E5C4C400 clrButtonBlueFg = FFFFFFFF clrButtonBlueBg = E50000C4 clrMessageStatusFg = FF000000 clrMessageStatusBg = DFD7FFD1 clrMessageInfoFg = FF000000 clrMessageInfoBg = DFD1DDFF clrMessageWarningFg = FF000000 clrMessageWarningBg = DFF9FFD1 clrMessageErrorFg = FF000000 clrMessageErrorBg = DFFFD1D1 clrVolumeBar = FF33CC33 clrVolumeBarMute = FFFF0000 clrMenuItemSelectableFg = FFFFFFFF clrMenuItemNotSelectableFg = FFF8BF24 clrReplayCurrent = FFE6731E clrReplayTotal = FFE6731E clrReplayModeJump = FFE6731E clrReplayBarAreaBg = DFDEE5FA clrReplayProgressSeen = FFE6731E clrReplayProgressRest = DFDEE5FA clrReplayProgressSelected = FF4158BC clrReplayProgressMark = FF4158BC clrReplayProgressCurrent = FFFF0000 vdr-plugin-skinenigmang-0.1.5/themes/EnigmaNG-WineRed.theme000066400000000000000000000025271435005021200235430ustar00rootroot00000000000000Description = WineRed clrBackground = E5FADEDE clrAltBackground = E5E6BFBF clrTitleBg = E5BC5241 clrLogoBg = E5E38E8E clrBottomBg = E57D1D1D clrBotProgBarBg = FF808080 clrBotProgBarFg = FFFFFFFF clrMenuTxtFg = FF000000 clrTitleFg = FFFFFFFF clrTitleShadow = FF000000 clrSymbolActive = FF20C400 clrSymbolInactive = FF808080 clrSymbolRecord = FFC40000 clrSymbolRecordBg = FFFFFFFF clrSymbolTimerActive = FF0000C4 clrSymbolVpsActive = FFC4C400 clrSymbolRecActive = FFC40000 clrSymbolRunActive = FF00C400 clrButtonRedFg = FFFFFFFF clrButtonRedBg = E5C40000 clrButtonGreenFg = FF000000 clrButtonGreenBg = E500C400 clrButtonYellowFg = FF000000 clrButtonYellowBg = E5C4C400 clrButtonBlueFg = FFFFFFFF clrButtonBlueBg = E50000C4 clrMessageStatusFg = FF000000 clrMessageStatusBg = E5D7FFD1 clrMessageInfoFg = FF000000 clrMessageInfoBg = E5FFD1D1 clrMessageWarningFg = FF000000 clrMessageWarningBg = E5F9FFD1 clrMessageErrorFg = FF000000 clrMessageErrorBg = E5FFD1D1 clrVolumeBar = FF33CC33 clrVolumeBarMute = FFFF0000 clrMenuItemSelectableFg = FF000000 clrMenuItemNotSelectableFg = E54158BC clrReplayCurrent = FF7D1D1D clrReplayTotal = FF7D1D1D clrReplayModeJump = FF7D1D1D clrReplayBarAreaBg = E5FADEDE clrReplayProgressSeen = FFE38E8E clrReplayProgressRest = E5FADEDE clrReplayProgressSelected = FFBC4141 clrReplayProgressMark = FFBC4141 clrReplayProgressCurrent = FFFF0000 vdr-plugin-skinenigmang-0.1.5/themes/EnigmaNG-WomenLike.theme000066400000000000000000000025311435005021200240730ustar00rootroot00000000000000Description = WomenLike clrBackground = E5DADEFA clrAltBackground = E5E6BFE3 clrTitleBg = E5BC41B2 clrLogoBg = E5E38EDC clrBottomBg = E57D1D75 clrBotProgBarBg = FF808080 clrBotProgBarFg = FFFFFFFF clrMenuTxtFg = FF000000 clrTitleFg = FFFFFFFF clrTitleShadow = FF000000 clrSymbolActive = FF41C400 clrSymbolInactive = FF808080 clrSymbolRecord = FFC40000 clrSymbolRecordBg = FFFFFFFF clrSymbolTimerActive = FF0000C4 clrSymbolVpsActive = FFC4C400 clrSymbolRecActive = FFC40000 clrSymbolRunActive = FF00C400 clrButtonRedFg = FFFFFFFF clrButtonRedBg = E5C40000 clrButtonGreenFg = FF000000 clrButtonGreenBg = E500C400 clrButtonYellowFg = FF000000 clrButtonYellowBg = E5C4C400 clrButtonBlueFg = FFFFFFFF clrButtonBlueBg = E50000C4 clrMessageStatusFg = FF000000 clrMessageStatusBg = E5D7FFD1 clrMessageInfoFg = FF000000 clrMessageInfoBg = E5FFD1FD clrMessageWarningFg = FF000000 clrMessageWarningBg = E5F9FFD1 clrMessageErrorFg = FF000000 clrMessageErrorBg = E5FFD1D1 clrVolumeBar = FF33CC33 clrVolumeBarMute = FFFF0000 clrMenuItemSelectableFg = FF000000 clrMenuItemNotSelectableFg = E54158BC clrReplayCurrent = FF7D1D75 clrReplayTotal = FF7D1D75 clrReplayModeJump = FF7D1D75 clrReplayBarAreaBg = E5FADEF9 clrReplayProgressSeen = FFE38EDC clrReplayProgressRest = E5FADEF9 clrReplayProgressSelected = FFBC41B8 clrReplayProgressMark = FFBC41BB clrReplayProgressCurrent = FFBC41BB vdr-plugin-skinenigmang-0.1.5/themes/EnigmaNG-YellowSun.theme000066400000000000000000000025311435005021200241420ustar00rootroot00000000000000Description = YellowSun clrBackground = E5fae9bc clrAltBackground = E5f3e396 clrTitleBg = E5ffd927 clrLogoBg = E5e7dd41 clrBottomBg = E5e8c523 clrBotProgBarBg = FF808080 clrBotProgBarFg = FFFFFFFF clrMenuTxtFg = FF000000 clrTitleFg = FF000000 clrTitleShadow = FF9f9f9f clrSymbolActive = FFb12e2e clrSymbolInactive = FF808080 clrSymbolRecord = FFC40000 clrSymbolRecordBg = FFFFFFFF clrSymbolTimerActive = FFe98400 clrSymbolVpsActive = FF002ec4 clrSymbolRecActive = FFC40000 clrSymbolRunActive = FF00C400 clrButtonRedFg = FFFFFFFF clrButtonRedBg = E5C40000 clrButtonGreenFg = FF000000 clrButtonGreenBg = E500C400 clrButtonYellowFg = FF000000 clrButtonYellowBg = E5f4f115 clrButtonBlueFg = FFFFFFFF clrButtonBlueBg = E50000C4 clrMessageStatusFg = FF000000 clrMessageStatusBg = E5ffe29b clrMessageInfoFg = FF000000 clrMessageInfoBg = E5ffdf89 clrMessageWarningFg = FF000000 clrMessageWarningBg = E5ffe08d clrMessageErrorFg = FF000000 clrMessageErrorBg = E5FFD1D1 clrVolumeBar = FFffaa33 clrVolumeBarMute = FFFF0000 clrMenuItemSelectableFg = FF000000 clrMenuItemNotSelectableFg = E54158BC clrReplayCurrent = FFd4870e clrReplayTotal = FFd4870e clrReplayModeJump = FFd4870e clrReplayBarAreaBg = E5fae086 clrReplayProgressSeen = FFe3be57 clrReplayProgressRest = E5fada8c clrReplayProgressSelected = FFfb7141 clrReplayProgressMark = FFfb7141 clrReplayProgressCurrent = FFfb7141 vdr-plugin-skinenigmang-0.1.5/themes/EnigmaNG-bgw.theme000066400000000000000000000025231435005021200227610ustar00rootroot00000000000000Description = bgw clrBackground = E5DCDCDC clrAltBackground = E5A9A9A9 clrTitleBg = E5333333 clrLogoBg = E5707070 clrBottomBg = E5333333 clrBotProgBarBg = FF808080 clrBotProgBarFg = FFDCDCDC clrTitleFg = FFDCDCDC clrTitleShadow = FF000000 clrMenuTxtFg = FF000000 clrMenuItemSelectableFg = FF202020 clrMenuItemNotSelectableFg = E5404040 clrVolumeBar = FFDCDCDC clrVolumeBarMute = E5A9A9A9 clrSymbolActive = FFF0F0F0 clrSymbolInactive = FF808080 clrSymbolRecord = FFC40000 clrSymbolRecordBg = FFFFFFFF clrSymbolTimerActive = FF0000C4 clrSymbolVpsActive = FFC4C400 clrSymbolRecActive = FFC40000 clrSymbolRunActive = FF00C400 clrButtonRedFg = FFFFFFFF clrButtonRedBg = E5C40000 clrButtonGreenFg = FF000000 clrButtonGreenBg = E500C400 clrButtonYellowFg = FF000000 clrButtonYellowBg = E5C4C400 clrButtonBlueFg = FFFFFFFF clrButtonBlueBg = E50000C4 clrMessageStatusFg = FF000000 clrMessageStatusBg = E5D7FFD1 clrMessageInfoFg = FF000000 clrMessageInfoBg = E5D1DDFF clrMessageWarningFg = FF000000 clrMessageWarningBg = E5F9FFD1 clrMessageErrorFg = FF000000 clrMessageErrorBg = E5FFD1D1 clrReplayCurrent = FF1D2F7D clrReplayTotal = FF1D2F7D clrReplayModeJump = FF1D2F7D clrReplayBarAreaBg = E5DEE5FA clrReplayProgressSeen = FF8EA4E3 clrReplayProgressRest = E5DEE5FA clrReplayProgressSelected = FF4158BC clrReplayProgressMark = FF4158BC clrReplayProgressCurrent = FFFF0000 vdr-plugin-skinenigmang-0.1.5/themes/EnigmaNG-default.theme000066400000000000000000000025271435005021200236320ustar00rootroot00000000000000Description = Default clrBackground = E5DEE5FA clrAltBackground = E5B2BBD6 clrTitleBg = E54158BC clrLogoBg = E58EA4E3 clrBottomBg = E51D2F7D clrBotProgBarBg = FF808080 clrBotProgBarFg = FFFFFFFF clrMenuTxtFg = FF000000 clrTitleFg = FFFFFFFF clrTitleShadow = FF000000 clrSymbolActive = FFC4C400 clrSymbolInactive = FF808080 clrSymbolRecord = FFC40000 clrSymbolRecordBg = FFFFFFFF clrSymbolTimerActive = FF0000C4 clrSymbolVpsActive = FFC4C400 clrSymbolRecActive = FFC40000 clrSymbolRunActive = FF00C400 clrButtonRedFg = FFFFFFFF clrButtonRedBg = E5C40000 clrButtonGreenFg = FF000000 clrButtonGreenBg = E500C400 clrButtonYellowFg = FF000000 clrButtonYellowBg = E5C4C400 clrButtonBlueFg = FFFFFFFF clrButtonBlueBg = E50000C4 clrMessageStatusFg = FF000000 clrMessageStatusBg = E5D7FFD1 clrMessageInfoFg = FF000000 clrMessageInfoBg = E5D1DDFF clrMessageWarningFg = FF000000 clrMessageWarningBg = E5F9FFD1 clrMessageErrorFg = FF000000 clrMessageErrorBg = E5FFD1D1 clrVolumeBar = FF33CC33 clrVolumeBarMute = FFFF0000 clrMenuItemSelectableFg = FF000000 clrMenuItemNotSelectableFg = E54158BC clrReplayCurrent = FF1D2F7D clrReplayTotal = FF1D2F7D clrReplayModeJump = FF1D2F7D clrReplayBarAreaBg = E5DEE5FA clrReplayProgressSeen = FF8EA4E3 clrReplayProgressRest = E5DEE5FA clrReplayProgressSelected = FF4158BC clrReplayProgressMark = FF4158BC clrReplayProgressCurrent = FFFF0000 vdr-plugin-skinenigmang-0.1.5/tools.c000066400000000000000000000162241435005021200175550ustar00rootroot00000000000000/* * tools.c: The 'EnigmaNG' VDR skin * * See the README file for copyright information and how to reach the author. * */ #include "common.h" #include #include #include "tools.h" #define AUX_HEADER_EPGSEARCH "EPGSearch: " #define AUX_TAGS_EPGSEARCH_START "" #define AUX_TAGS_EPGSEARCH_ITEM_1A_START "" #define AUX_TAGS_EPGSEARCH_ITEM_1A_END "" #define AUX_TAGS_EPGSEARCH_ITEM_2A_START "" #define AUX_TAGS_EPGSEARCH_ITEM_2A_END "" #define AUX_TAGS_EPGSEARCH_ITEM_3A_START "" #define AUX_TAGS_EPGSEARCH_ITEM_3A_END "" #define AUX_TAGS_EPGSEARCH_ITEM_1B_START "" #define AUX_TAGS_EPGSEARCH_ITEM_1B_END "" #define AUX_TAGS_EPGSEARCH_ITEM_2B_START "" #define AUX_TAGS_EPGSEARCH_ITEM_2B_END "" #define AUX_TAGS_EPGSEARCH_END "" #define AUX_HEADER_VDRADMIN "VDRAdmin-AM: " #define AUX_TAGS_VDRADMIN_START "" #define AUX_TAGS_VDRADMIN_ITEM1_START "" #define AUX_TAGS_VDRADMIN_ITEM1_END "" #define AUX_TAGS_VDRADMIN_END "" #define AUX_HEADER_PIN "Protected: " #define AUX_TAGS_PIN_START "" #define AUX_TAGS_PIN_ITEM1_START "" #define AUX_TAGS_PIN_ITEM1_END "" #define AUX_TAGS_PIN_END "" std::string parseaux(const char *aux) { bool founditem = false; std::stringstream sstrReturn; const char *start, *end; // check if egpsearch start = strcasestr(aux, AUX_TAGS_EPGSEARCH_START); end = strcasestr(aux, AUX_TAGS_EPGSEARCH_END); if (start && end) { // add header sstrReturn << AUX_HEADER_EPGSEARCH; // parse first item const char *tmp; if ((tmp = strcasestr(start, AUX_TAGS_EPGSEARCH_ITEM_1A_START)) != NULL) { if (tmp < end) { tmp += strlen(AUX_TAGS_EPGSEARCH_ITEM_1A_START); const char *tmp2; if ((tmp2 = strcasestr(tmp, AUX_TAGS_EPGSEARCH_ITEM_1A_END)) != NULL) { // add channel sstrReturn << tr("Channel:") << " " << std::string(tmp, tmp2 - tmp); founditem = true; } else { founditem = false; } } } if (founditem) { // Channel tag found // parse second item if ((tmp = strcasestr(start, AUX_TAGS_EPGSEARCH_ITEM_2A_START)) != NULL) { if (tmp < end) { tmp += strlen(AUX_TAGS_EPGSEARCH_ITEM_2A_START); const char *tmp2; if ((tmp2 = strcasestr(tmp, AUX_TAGS_EPGSEARCH_ITEM_2A_END)) != NULL) { // add separator if (founditem) { sstrReturn << ", "; } // add search item sstrReturn << tr("Search pattern:") << " " << std::string(tmp, tmp2 - tmp); founditem = true; } else { founditem = false; } } } else { // parse second item if ((tmp = strcasestr(start, AUX_TAGS_EPGSEARCH_ITEM_3A_START)) != NULL) { if (tmp < end) { tmp += strlen(AUX_TAGS_EPGSEARCH_ITEM_3A_START); const char *tmp2; if ((tmp2 = strcasestr(tmp, AUX_TAGS_EPGSEARCH_ITEM_3A_END)) != NULL) { // add separator if (founditem) { sstrReturn << ", "; } // add search item sstrReturn << tr("Search pattern:") << " " << std::string(tmp, tmp2 - tmp); founditem = true; } else { founditem = false; } } } } } // timer check? if ((tmp = strcasestr(start, AUX_TAGS_EPGSEARCH_ITEM_1B_START)) != NULL) { if (tmp < end) { tmp += strlen(AUX_TAGS_EPGSEARCH_ITEM_1B_START); const char *tmp2; if ((tmp2 = strcasestr(tmp, AUX_TAGS_EPGSEARCH_ITEM_1B_END)) != NULL) { if (std::string(tmp, tmp2 - tmp) != "0") { // add separator if (founditem) { sstrReturn << ", "; } // add search item sstrReturn << tr("Timer check"); // parse second item if ((tmp = strcasestr(start, AUX_TAGS_EPGSEARCH_ITEM_2B_START)) != NULL) { if (tmp < end) { tmp += strlen(AUX_TAGS_EPGSEARCH_ITEM_2B_START); const char *tmp3; if ((tmp3 = strcasestr(tmp, AUX_TAGS_EPGSEARCH_ITEM_2B_END)) != NULL) { // add separator if (founditem) { sstrReturn << ", "; } // add search item sstrReturn << "eventid=" << std::string(tmp, tmp3 - tmp); } } } } else { if (founditem) { sstrReturn << ", "; } sstrReturn << tr("No timer check"); } founditem = true; } else { founditem = false; } } } // use old syntax if (!founditem) { start += strlen(AUX_HEADER_EPGSEARCH); sstrReturn << std::string(start, end - start); } sstrReturn << std::endl; } // check if VDRAdmin-AM start = strcasestr(aux, AUX_TAGS_VDRADMIN_START); end = strcasestr(aux, AUX_TAGS_VDRADMIN_END); if (start && end) { // add header sstrReturn << AUX_HEADER_VDRADMIN; // parse first item const char *tmp; if ((tmp = strcasestr(start, AUX_TAGS_VDRADMIN_ITEM1_START)) != NULL) { if (tmp < end) { tmp += strlen(AUX_TAGS_VDRADMIN_ITEM1_START); const char *tmp2; if ((tmp2 = strcasestr(tmp, AUX_TAGS_VDRADMIN_ITEM1_END)) != NULL) { // add search item sstrReturn << std::string(tmp, tmp2 - tmp) << std::endl; } } } } // check if pin start = strcasestr(aux, AUX_TAGS_PIN_START); end = strcasestr(aux, AUX_TAGS_PIN_END); if (start && end) { // add header sstrReturn << AUX_HEADER_PIN; // parse first item const char *tmp; if ((tmp = strcasestr(start, AUX_TAGS_PIN_ITEM1_START)) != NULL) { if (tmp < end) { tmp += strlen(AUX_TAGS_PIN_ITEM1_START); const char *tmp2; if ((tmp2 = strcasestr(tmp, AUX_TAGS_PIN_ITEM1_END)) != NULL) { // add search item sstrReturn << std::string(tmp, tmp2 - tmp) << std::endl; } } } } if (!sstrReturn.str().empty()) return sstrReturn.str(); return std::string(aux); } bool ischaracters(const char *str, const char *mask) { bool match = true; const char *p = str; for (; *p; ++p) { const char *m = mask; bool tmp = false; for (; *m; ++m) { if (*p == *m) tmp = true; } match = match && tmp; } return match; } std::string ExtractAttribute(const char* evDescription, const char* name) { std::string attribute; if (!evDescription || !name) return attribute; std::string description(evDescription); size_t apos = description.find(name); if (apos != std::string::npos) { apos += strlen(name); size_t npos = description.find('\n', apos); attribute = description.substr(apos, npos - apos); } return attribute; } // vim:et:sw=2:ts=2: vdr-plugin-skinenigmang-0.1.5/tools.h000066400000000000000000000010471435005021200175570ustar00rootroot00000000000000/* * tools.h: 'EnigmaNG' skin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __SKINENIGMA_TOOLS_H #define __SKINENIGMA_TOOLS_H #include "common.h" #define EVENT_CATEGORY "Category: " #define EVENT_GENRE "Genre: " std::string parseaux(const char *str); bool ischaracters(const char *aux, const char *mask); std::string ExtractAttribute(const char* evDescription, const char* name); #endif // __SKINENIGMA_TOOLS_H // vim:et:sw=2:ts=2: