mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
Compare commits
No commits in common. "master" and "1.0.0pre1" have entirely different histories.
3643
CONTRIBUTORS
3643
CONTRIBUTORS
File diff suppressed because it is too large
Load Diff
@ -1,34 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
|
|
||||||
# Filter source files for use with Doxygen.
|
|
||||||
#
|
|
||||||
# Escapes special characters in comments marked with "///<".
|
|
||||||
#
|
|
||||||
# Usage: Doxyfile.filter filename
|
|
||||||
#
|
|
||||||
# See the main source file 'vdr.c' for copyright information and
|
|
||||||
# how to reach the author.
|
|
||||||
#
|
|
||||||
# $Id: Doxyfile.filter 2.1 2013/02/17 10:54:05 kls Exp $
|
|
||||||
|
|
||||||
$TAG = "///<";
|
|
||||||
|
|
||||||
while (<>) {
|
|
||||||
$t = $_;
|
|
||||||
$p = index($t, $TAG);
|
|
||||||
if ($p >= 0) {
|
|
||||||
$p += length($TAG);
|
|
||||||
print substr($t, 0, $p);
|
|
||||||
$quote = 0;
|
|
||||||
while (1) {
|
|
||||||
$s = substr($t, $p++, 1);
|
|
||||||
last if ($s eq "");
|
|
||||||
$quote ^= 1 if ($s eq '"');
|
|
||||||
print "\\" if (!$quote && $s =~ /[\\\@<>]/);
|
|
||||||
print $s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
print $t;
|
|
||||||
}
|
|
||||||
}
|
|
216
FORMATS
Normal file
216
FORMATS
Normal file
@ -0,0 +1,216 @@
|
|||||||
|
Video Disk Recorder File Formats
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
* channels.conf
|
||||||
|
|
||||||
|
This file contains the channel setup.
|
||||||
|
It consists of two types of lines: "group delimiters" and "channel
|
||||||
|
definitions".
|
||||||
|
|
||||||
|
A "group delimiter" is a line starting with a ':' as the very first
|
||||||
|
character, followed by arbitrary text.
|
||||||
|
Example: ":First group"
|
||||||
|
|
||||||
|
A "channel definition" is a line with channel data, where the fields
|
||||||
|
are separated by ':' characters:
|
||||||
|
Example: "RTL:12188:h:1:27500:163:104:105:0:12003"
|
||||||
|
|
||||||
|
The fields in a channel definition have the following meaning (from left
|
||||||
|
to right):
|
||||||
|
|
||||||
|
- Name: the channel's name (if the name originally contains a ':' character
|
||||||
|
it has to be replaced by '|')
|
||||||
|
- Frequency in MHz for DVB-S and DVB-C, kHz for DVB-T (as an integer)
|
||||||
|
- Polarization (one of 'h', 'H', 'v', 'V') **
|
||||||
|
- Diseqc number **
|
||||||
|
- Symbol rate ***
|
||||||
|
- Video PID (set to '0' for radio channels, '1' for encrypted radio channels)
|
||||||
|
- Audio PID (either one number, or two, separated by a comma)
|
||||||
|
If this channel also carries Dolby Digital sound, the Dolby PIDs follow
|
||||||
|
the audio PIDs, separated by a semicolon, as in "...:101,102;103,104:..."
|
||||||
|
- Teletext PID
|
||||||
|
- Conditional Access (0 = Free To Air, 1 = can be decrypted by the first
|
||||||
|
DVB card, 2 = can be decrypted by the second DVB card)
|
||||||
|
- Program Number
|
||||||
|
|
||||||
|
Fields marked with ** are only meaningful for DVB-S receivers.
|
||||||
|
DVB-C and DVB-T receivers simply ignore these.
|
||||||
|
Fields marked with *** are only meaningful for DVB-S and DVB-C receivers.
|
||||||
|
DVB-T receivers simply ignore these.
|
||||||
|
|
||||||
|
* timers.conf
|
||||||
|
|
||||||
|
This file contains the timer setup.
|
||||||
|
|
||||||
|
The fields in a timer definition have the following meaning (from left
|
||||||
|
to right):
|
||||||
|
|
||||||
|
- Timer active (0 = inactive, 1 = active, 3 = instant recording)
|
||||||
|
Values other than these can be used by external programs to mark active timers
|
||||||
|
and recognize if the user has modified them. When a user modifes an active
|
||||||
|
timer the 'active' field will be explicitly set to '1' (or '0', respectively,
|
||||||
|
if the user deactivates the timer).
|
||||||
|
Note: in order to allow future extensibility, external programs using the
|
||||||
|
'active' parameter should only use the upper 16 bit of this 32 bit parameter
|
||||||
|
and leave the lower 16 bit untouched.
|
||||||
|
- Program number of the channel to record
|
||||||
|
- Day of recording (in case of a repeating timer), either one or more of
|
||||||
|
M------ = Monday
|
||||||
|
-T----- = Tuesday
|
||||||
|
--W---- = Wednesday
|
||||||
|
---T--- = Thrusday
|
||||||
|
----F-- = Friday
|
||||||
|
-----S- = Saturday
|
||||||
|
------S = Sunday
|
||||||
|
(any combination is possible, for example MTWTF--, and the days may be
|
||||||
|
indicated by any characters except '-', so for example ABC---- would set
|
||||||
|
a timer that records on monday, tuesday and wednesday) or the "day of month"
|
||||||
|
(1..31) in case of a single shot timer.
|
||||||
|
The day definition of a repeating timer may be followed by the date when that
|
||||||
|
timer shall hit for the first time. The format for this is @YYYY-MM-DD,
|
||||||
|
so a complete definition could look like this: MTWTF--@2002-02-18. This
|
||||||
|
"first day" feature can be used to disable a repeating timer for a couple
|
||||||
|
of days, or for instance to define a new Mon...Fri timer on wednesday, which
|
||||||
|
actually starts "monday next week". The "first day" date given need not be
|
||||||
|
that of a day when the timer would actually hit.
|
||||||
|
- Start time (first two digits for the hour, second two digits for the minutes)
|
||||||
|
- End time (first two digits for the hour, second two digits for the minutes)
|
||||||
|
- Priority (from 0 to 99, 0 = lowest prioity, 99 = highest priority)
|
||||||
|
- Guaranteed lifetime of recording (in days); 0 means that this recording may
|
||||||
|
be automatically deleted by a new recording with higher priority, 99 means
|
||||||
|
that this recording will never be automatically deleted
|
||||||
|
- Name of timer (will be used to name the recording); if the name contains
|
||||||
|
any ':' characters, these have to be replaced with '|'. If the name shall
|
||||||
|
contain subdirectories, these have to be delimited by '~' (since the '/'
|
||||||
|
character may be part of a regular programme name).
|
||||||
|
The special keywords TITLE and EPISODE, if present, will be replaced
|
||||||
|
with the title and episode information from the EPG data at the time of
|
||||||
|
recording (if that data is available). If at the time of recording either
|
||||||
|
of these cannot be determined, TITLE will default to the channel name, and
|
||||||
|
EPISODE will default to a blank.
|
||||||
|
- Summary (any newline characters in the summary have to be replaced with '|';
|
||||||
|
the summary may contain ':' characters)
|
||||||
|
|
||||||
|
* setup.conf
|
||||||
|
|
||||||
|
This file contains the basic configuration options for VDR.
|
||||||
|
|
||||||
|
Each line contains one option in the format "Name = Value".
|
||||||
|
|
||||||
|
See the MANUAL file for a description of the available options.
|
||||||
|
|
||||||
|
* commands.conf
|
||||||
|
|
||||||
|
This file contains the definitions of commands that can be executed from
|
||||||
|
the "Main" menus "Commands" option.
|
||||||
|
|
||||||
|
Each line contains one command definition in the following format:
|
||||||
|
|
||||||
|
title : command
|
||||||
|
|
||||||
|
where 'title' is the string the will be displayed in the "Commands" menu,
|
||||||
|
and 'command' is the actual command string that will be executed when this
|
||||||
|
option is selected. The delimiting ':' may be surrounded by any number of
|
||||||
|
white space characters.
|
||||||
|
|
||||||
|
In order to avoid error messages to stderr, every command should have
|
||||||
|
stderr redirected to stdout. Everything the command prints to stdout will
|
||||||
|
be displayed in a result window, with 'title' as its title.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
1 Check for new mail: /usr/local/bin/checkmail 2>&1
|
||||||
|
2 CPU status : /usr/local/bin/cpustatus 2>&1
|
||||||
|
3 Disk space : df -h | grep '/video' | awk '{ print 100 - $5 "% free"; }'
|
||||||
|
|
||||||
|
If the first non-blank character of the 'title' is a digit in the range
|
||||||
|
1..9, the command can be selected directly by pressing the respective numerical
|
||||||
|
key on the remote control.
|
||||||
|
|
||||||
|
* svdrphosts.conf
|
||||||
|
|
||||||
|
This file contains the IP numbers of all hosts that are allowed to access the
|
||||||
|
SVDRP port.
|
||||||
|
|
||||||
|
Each line contains one IP number in the format
|
||||||
|
|
||||||
|
IP-Address[/Netmask]
|
||||||
|
|
||||||
|
where 'IP-Address' is the address of a host or a network in the usual dot
|
||||||
|
separated notation (as in 192.168.100.1). If the optional 'Netmask' is given
|
||||||
|
only the given number of bits of 'IP-Address' are taken into account. This
|
||||||
|
allows you to grant SVDRP access to all hosts of an entire network. 'Netmask'
|
||||||
|
can be any integer from 1 to 32. The special value of 0 is only accepted if
|
||||||
|
the 'IP-Address' is 0.0.0.0, because this will give access to any host (USE
|
||||||
|
THIS WITH CARE!).
|
||||||
|
|
||||||
|
Everything following (and including) a '#' character is considered to be
|
||||||
|
comment.
|
||||||
|
|
||||||
|
* marks.vdr
|
||||||
|
|
||||||
|
This file (if present in a recording directory) contains the editing marks
|
||||||
|
defined for this recording.
|
||||||
|
|
||||||
|
Each line contains the definition of one mark in the following format:
|
||||||
|
|
||||||
|
hh:mm:ss.ff comment
|
||||||
|
|
||||||
|
where 'hh:mm:ss.ff' is a frame position within the recording, given as "hours,
|
||||||
|
minutes, seconds and (optional) frame number". 'comment' can be any string
|
||||||
|
and may be used to describe this mark. If present, 'comment' must be separated
|
||||||
|
from the frame position by at least one blank.
|
||||||
|
|
||||||
|
The lines in this file need not necessarily appear in the correct temporal
|
||||||
|
sequence, they will be automatically sorted by time index.
|
||||||
|
|
||||||
|
CURRENT RESTRICTIONS:
|
||||||
|
|
||||||
|
- the 'comment' is currently not used by VDR
|
||||||
|
- marks must have a frame number, and that frame MUST be an I-frame (this
|
||||||
|
means that only marks generated by VDR itself can be used, since they
|
||||||
|
will always be guaranteed to mark I-frames).
|
||||||
|
|
||||||
|
* 001.vdr ... 255.vdr
|
||||||
|
|
||||||
|
These are the actual recorded MPEG data files. In order to keep the size of
|
||||||
|
an individual file below a given limit, a recording is split into several
|
||||||
|
files. The contents of these files is "Packetized Elementary Stream" (PES)
|
||||||
|
and contains ES packets with ids 0xE0 for video, 0xC0 for audio 1 and 0xC1
|
||||||
|
for audio 2 (if available). Dolby Digital data is stored in packets with
|
||||||
|
ids 0xBD.
|
||||||
|
|
||||||
|
* epg.data
|
||||||
|
|
||||||
|
This file contains the EPG data in an easily parsable format. The first
|
||||||
|
character of each line defines what kind of data this line contains.
|
||||||
|
|
||||||
|
The following tag characters are defined:
|
||||||
|
|
||||||
|
C <service id> <channel name>
|
||||||
|
E <event id> <start time> <duration> <table id>
|
||||||
|
T <title>
|
||||||
|
S <subtitle>
|
||||||
|
D <description>
|
||||||
|
e
|
||||||
|
c
|
||||||
|
|
||||||
|
Lowercase characters mark the end of a sequence that was started by the
|
||||||
|
corresponding uppercase character. The outer frame consists of a sequence
|
||||||
|
of one or more 'C'...'c' (Channel) entries. Inside these any number of
|
||||||
|
'E'...'e' (Event) entries are allowed. The 'T', 'S' and 'D' entries are
|
||||||
|
optional (although every event should at least have a 'T' entry).
|
||||||
|
|
||||||
|
<service id> is the "program number" as defined in 'channels.conf'
|
||||||
|
<channel name> is the "name" as in 'channels.conf' (for information only)
|
||||||
|
<start time> is the time (as a time_t integer) in UTC when this event starts
|
||||||
|
<duration> is the time (in seconds) that this event will take
|
||||||
|
<table id> is a hex number that indicates the table this event is contained
|
||||||
|
in (if this is left empty or 0 this event will not be overwritten
|
||||||
|
or modified by data that comes from the DVB stream)
|
||||||
|
<title> is the title of the event
|
||||||
|
<subtitle> is the subtitle (typically the name of the episode etc.)
|
||||||
|
<description> is the description of the event
|
||||||
|
|
||||||
|
This file will be read at program startup in order to restore the results of
|
||||||
|
previous EPG scans.
|
412
INSTALL
412
INSTALL
@ -1,87 +1,74 @@
|
|||||||
Installation of the Video Disk Recorder
|
Installation of the Video Disk Recorder
|
||||||
---------------------------------------
|
---------------------------------------
|
||||||
|
|
||||||
Version 2.7
|
|
||||||
-----------
|
|
||||||
|
|
||||||
Compiling and running the program:
|
Compiling and running the program:
|
||||||
----------------------------------
|
----------------------------------
|
||||||
|
|
||||||
VDR requires the Linux-DVB driver header files to compile.
|
Make sure the files from this package are located in a
|
||||||
As of kernel 2.6 these are part of the official Linux kernel
|
directory that is "parallel" to the DVB directory of the
|
||||||
distribution, and so they should be automatically found in
|
driver source for the Siemens DVB-S PCI card (refer to
|
||||||
/usr/include/linux/dvb. If your DVB driver header files are
|
http://linuxtv.org/dvb/siemens_dvb.html for more information
|
||||||
in a different location, you can rename the file Make.config.template
|
about that driver). For example, if the DVB driver was
|
||||||
to Make.config and adjust the definition of DVBDIR in that file.
|
extracted into the directory /home/kls/vdr/DVB, then this
|
||||||
|
package should be extracted into /home/kls/vdr/VDR.
|
||||||
|
If you have the DVB driver source in a different location
|
||||||
|
you will have to change the definition of DVBDIR in the
|
||||||
|
Makefile.
|
||||||
|
|
||||||
Refer to http://linuxtv.org for more information about the Linux-DVB driver.
|
VDR requires the Linux-DVB card driver version dated 2001-09-14 or higher
|
||||||
|
to work properly.
|
||||||
VDR requires the Linux-DVB driver version that supports the S2API interface.
|
|
||||||
|
|
||||||
You will also need to install the following libraries, as well as their
|
|
||||||
"devel" packages to get the necessary header files for compiling VDR:
|
|
||||||
|
|
||||||
fontconfig
|
|
||||||
freetype2
|
|
||||||
fribidi (see "BiDi support" below)
|
|
||||||
gettext
|
|
||||||
libcap
|
|
||||||
libjpeg
|
|
||||||
|
|
||||||
If the "capability" module is not compiled into your kernel, you may
|
|
||||||
need to do "modprobe capability" before running VDR.
|
|
||||||
|
|
||||||
After extracting the package, change into the VDR directory
|
After extracting the package, change into the VDR directory
|
||||||
and type 'make'. This should produce an executable file
|
and type 'make'. This should produce an executable file
|
||||||
named 'vdr', which can be run after the DVB driver has been
|
named 'vdr', which can be run after the DVB driver has been
|
||||||
installed.
|
installed.
|
||||||
|
|
||||||
If you want to build a 32-bit version of VDR on a 64-bit machine, you can
|
|
||||||
use 'make M32=1' to do so. Note that you also need to have a Make.config file
|
|
||||||
(derived from Make.config.template) to make this work.
|
|
||||||
|
|
||||||
IMPORTANT: See "Configuration files" below for information on how
|
IMPORTANT: See "Configuration files" below for information on how
|
||||||
========= to set up the configuration files at the proper location!
|
========= to set up the configuration files at the proper location!
|
||||||
|
|
||||||
By default the 'vdr' program can be controlled via the PC keyboard.
|
The 'vdr' program can be controlled via the PC keyboard or
|
||||||
If you want to disable control via the keyboard, you can add NO_KBD=1
|
an infrared remote control unit. Define the REMOTE macro to one of the
|
||||||
to the 'make' call, or use the '--no-kbd' option at runtime.
|
following values 'make' call to activate the respective control mode:
|
||||||
|
|
||||||
If you have a LIRC compatible infrared remote control receiver you can define
|
|
||||||
the REMOTE macro to one of the following values in the 'make' call to make
|
|
||||||
the respective control the default:
|
|
||||||
|
|
||||||
|
REMOTE=KBD control via the PC keyboard (default)
|
||||||
|
REMOTE=RCU control via the "Remote Control Unit" receiver
|
||||||
|
(see http://www.cadsoft.de/people/kls/vdr/remote.htm)
|
||||||
REMOTE=LIRC control via the "Linux Infrared Remote Control"
|
REMOTE=LIRC control via the "Linux Infrared Remote Control"
|
||||||
(see http://www.lirc.org)
|
(see http://www.lirc.org)
|
||||||
|
REMOTE=NONE no remote control (in case only SVDRP shall be used)
|
||||||
|
|
||||||
Alternatively you can use the '--lirc' option at runtime.
|
Adding "DEBUG_OSD=1" will use the PC screen (or current window)
|
||||||
This option accepts an optional path to the remote control device,
|
to display texts instead of the DVB card's on-screen display
|
||||||
the default of which can be set via the LIRC_DEVICE macro.
|
interface. These modes are useful when testing new menus if you
|
||||||
|
only have a remote connection to the VDR (which, in my case, is
|
||||||
|
located in the living room and has neither a monitor nor a keyboard).
|
||||||
|
|
||||||
If you want to make your video directory available to other machines that
|
If your video directory will be on a VFAT partition, add the compile
|
||||||
have limitations on directory name lengths and/or allowed characters in
|
time switch
|
||||||
directory names, you can call VDR with the command line option '--dirnames'
|
|
||||||
(see man vdr(1) for details).
|
VFAT=1
|
||||||
|
|
||||||
|
to the 'make' command.
|
||||||
|
|
||||||
When running, the 'vdr' program writes status information into the
|
When running, the 'vdr' program writes status information into the
|
||||||
system log file, which is usually /var/log/messages (or /var/log/user.log,
|
system log file (/var/log/messages). You may want to watch these
|
||||||
depending on your syslog configuration). You may want to watch these
|
messages (tail -f /var/log/mesages) to see if there are any problems.
|
||||||
messages (tail -f /var/log/messages) to see if there are any problems.
|
|
||||||
|
|
||||||
The program can be controlled via a network connection to its SVDRP
|
The program can be controlled via a network connection to its SVDRP
|
||||||
port ("Simple Video Disk Recorder Protocol"). By default, it listens
|
port ("Simple Video Disk Recorder Protocol"). By default, it listens
|
||||||
on port 6419 (use the --port=PORT option to change this). For details
|
on port 2001 (use the --port=PORT option to change this). For details
|
||||||
about the SVDRP syntax see the source file 'svdrp.c'.
|
about the SVDRP syntax see the source file 'svdrp.c'.
|
||||||
|
|
||||||
|
WARNING: DUE TO THE OPEN SVDRP PORT THIS PROGRAM MAY CONSTITUTE A
|
||||||
|
======= POTENTIAL SECURITY HAZARD! IF YOU ARE NOT RUNNING VDR IN
|
||||||
|
A CONTROLLED ENVIRONMENT, YOU MAY WANT TO DISABLE SVDRP
|
||||||
|
BY USING '--port=0'!
|
||||||
|
|
||||||
The file 'svdrphosts.conf' can be used to define which hosts are allowed
|
The file 'svdrphosts.conf' can be used to define which hosts are allowed
|
||||||
to access the SVDRP port. By default only localhost (127.0.0.1) is granted
|
to access the SVDRP port. By default only localhost (127.0.0.1) is granted
|
||||||
access. If you want to give other hosts access to your SVDRP port you need to
|
access. If you want to give other hosts access to your SVDRP port you need to
|
||||||
add their IP numbers to 'svdrphosts.conf'.
|
add their IP numbers to 'svdrphosts.conf'.
|
||||||
|
|
||||||
You can disable SVDRP access entirely by either running VDR with '--port=0',
|
|
||||||
or by removing all entries (including 127.0.0.1 for the localhost) from
|
|
||||||
'svdrphosts.conf'.
|
|
||||||
|
|
||||||
If the program shall run as a daemon, use the --daemon option. This
|
If the program shall run as a daemon, use the --daemon option. This
|
||||||
will completely detach it from the terminal and will continue as a
|
will completely detach it from the terminal and will continue as a
|
||||||
background process.
|
background process.
|
||||||
@ -91,35 +78,6 @@ option to set the controlling terminal, as in
|
|||||||
|
|
||||||
vdr:123:respawn:/usr/local/bin/vdr --terminal=/dev/tty8 -w 60
|
vdr:123:respawn:/usr/local/bin/vdr --terminal=/dev/tty8 -w 60
|
||||||
|
|
||||||
See the man page vdr(1) for complete information about all command line options.
|
|
||||||
|
|
||||||
Output devices
|
|
||||||
--------------
|
|
||||||
|
|
||||||
VDR by itself doesn't produce any audio or video output. In order to watch
|
|
||||||
live tv or recordings, you will need to use a plugin that supports the actual
|
|
||||||
hardware in your system, for instance:
|
|
||||||
|
|
||||||
Plugin: Device:
|
|
||||||
|
|
||||||
dvbsddevice Full-Featured SD DVB cards (Fujitsu-Siemens Design)
|
|
||||||
ftp://ftp.tvdr.de/vdr/Plugins
|
|
||||||
dvbhddevice Full-featured HD DVB cards (Technotrend TT S2-6400)
|
|
||||||
https://bitbucket.org/powARman/dvbhddevice
|
|
||||||
rpihddevice Raspberry Pi
|
|
||||||
https://projects.vdr-developer.org/git/vdr-plugin-rpihddevice.git
|
|
||||||
|
|
||||||
See https://linuxtv.org/vdrwiki/index.php/Output_devices for more.
|
|
||||||
|
|
||||||
Standard compliance
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
Basically VDR works according to the DVB standard, but there are countries/providers
|
|
||||||
that use other standards, which in some details deviate from the DVB standard.
|
|
||||||
This makes it necessary to handle things differently in some areas, depending on
|
|
||||||
which standard is actually used. If this is the case in your area, you may need
|
|
||||||
to adjust the option "DVB/Standard compliance" in the Setup menu accordingly.
|
|
||||||
|
|
||||||
Locale
|
Locale
|
||||||
------
|
------
|
||||||
|
|
||||||
@ -138,56 +96,15 @@ in the log file, it is sufficient to just set
|
|||||||
which only influences the way strings are sorted and leaves error messages
|
which only influences the way strings are sorted and leaves error messages
|
||||||
in English.
|
in English.
|
||||||
|
|
||||||
Note that for VDR's internationalized texts to work, the LANG environment
|
Automatic restart in case of hangups:
|
||||||
variable must be set to a valid locale!
|
-------------------------------------
|
||||||
|
|
||||||
BiDi support
|
|
||||||
------------
|
|
||||||
|
|
||||||
Some languages are written right-to-left. In order to display such languages
|
|
||||||
correctly, you need to build VDR with BIDI=1. This will link to the "fribidi"
|
|
||||||
library and implement a function that prepares bidirectional texts to be
|
|
||||||
displayed correctly. Since BiDi support adds some runtime overhead by requiring
|
|
||||||
additional memory allocation and copying, this feature is not compiled in
|
|
||||||
by default, so that users that have no need for this don't get any overhead.
|
|
||||||
|
|
||||||
Workaround for providers not encoding their DVB SI table strings correctly
|
|
||||||
--------------------------------------------------------------------------
|
|
||||||
|
|
||||||
According to "ETSI EN 300 468" the default character set for SI data is
|
|
||||||
ISO6937. But unfortunately some broadcasters actually use ISO-8859-9 or
|
|
||||||
other encodings, but fail to correctly announce that.
|
|
||||||
Users who want to set the default character set to something different can
|
|
||||||
do this by using the command line option --chartab with something
|
|
||||||
like ISO-8859-9.
|
|
||||||
|
|
||||||
Start script with automatic restart in case of hangups:
|
|
||||||
-------------------------------------------------------
|
|
||||||
|
|
||||||
The VDR source directory contains a 'runvdr.template'. Just copy it as 'runvdr'
|
|
||||||
into your /usr/bin or /usr/local/bin directory and adjust it to your particular
|
|
||||||
requirements. (See the comments inside the script for more information.)
|
|
||||||
|
|
||||||
If you run VDR using the 'runvdr' shell script it will use the built-in
|
If you run VDR using the 'runvdr' shell script it will use the built-in
|
||||||
watchdog timer to restart the program in case something happens that
|
watchdog timer to restart the program in case something happens that
|
||||||
causes a program hangup. If you change the command line options for the
|
causes a program hangup. If you change the command line options for the
|
||||||
call to the VDR program, be sure to NOT use the '-d' option! Otherwise
|
call to the VDR program, be sure to NOT use the '-d' option! Otherwise
|
||||||
VDR will go into 'daemon' mode and the initial program call will return
|
VDR will go into 'deamon' mode and the initial program call will return
|
||||||
immediately! 'runvdr' needs to be started as user 'root'. Use the '-u'
|
immediately!
|
||||||
option to run the actual 'vdr' program under a different user id.
|
|
||||||
|
|
||||||
Setting the system time:
|
|
||||||
------------------------
|
|
||||||
|
|
||||||
If you want VDR to set the system time according to the data received
|
|
||||||
from the transponder, you need to start VDR as user 'root'. For security
|
|
||||||
reasons you should then use the '-u' option to define a lesser privileged
|
|
||||||
user id under which VDR should actually run. It will then only keep the
|
|
||||||
capability to set the system time, and set its user id to the given one.
|
|
||||||
You also need to enable the "EPG/Set system time" option in VDR's
|
|
||||||
Setup menu, and select a transponder from which you want to receive
|
|
||||||
the time in "Use time from transponder". Make sure you select a transponder
|
|
||||||
that has a reliable clock - some transponders are quite off.
|
|
||||||
|
|
||||||
Automatic shutdown:
|
Automatic shutdown:
|
||||||
-------------------
|
-------------------
|
||||||
@ -199,33 +116,30 @@ and the next timer event is at least MinEventTimeout minutes in the future
|
|||||||
(see the Setup parameters in MANUAL).
|
(see the Setup parameters in MANUAL).
|
||||||
|
|
||||||
The command given in the '-s' option will be called with five parameters.
|
The command given in the '-s' option will be called with five parameters.
|
||||||
|
The first one is the time (in UTC) of the next timer event (as a time_t
|
||||||
|
type number), and the second one is the number of seconds from the current
|
||||||
|
time until the next timer event. Your program can choose which one to use
|
||||||
|
for programming some sort of hardware device that makes sure the computer
|
||||||
|
will be restarted in time before the next timer event. Your program must
|
||||||
|
also initiate the actual shutdown procedure of the computer. After this
|
||||||
|
your program should return to VDR. VDR will not automatically exit after
|
||||||
|
calling the shutdown program, but will rather continue normally until it
|
||||||
|
receives a SIGTERM when the computer is actually shut down. So in case
|
||||||
|
the shutdown fails, or the shutdown program for some reason decides not to
|
||||||
|
perform a shutdown, VDR will stay up and running and will call the shutdown
|
||||||
|
program again after another MinUserInactivity minutes.
|
||||||
|
|
||||||
The first one is the time (in UTC) of the next timer event or plugin wakeup
|
If there are currently no timers active, both parameters will be '0'.
|
||||||
time (as a time_t type number), and the second one is the number of
|
In that case the program shall not set the hardware for automatic restart
|
||||||
seconds from the current time until the next timer event. Your program can
|
and only perform the system shutdown. A program that uses the second parameter
|
||||||
choose which one to use for programming some sort of hardware device that
|
to set the hardware for restart must therefore also check whether the first
|
||||||
makes sure the computer will be restarted in time before the next timer
|
parameter is '0'.
|
||||||
event. Your program must also initiate the actual shutdown procedure of the
|
|
||||||
computer. VDR will not automatically exit after calling the shutdown
|
|
||||||
program, but will rather continue normally until it receives a SIGTERM when
|
|
||||||
the computer is actually shut down. So in case the shutdown fails, or the
|
|
||||||
shutdown program for some reason decides not to perform a shutdown, VDR
|
|
||||||
will stay up and running and will call the shutdown program again after a
|
|
||||||
while. The command will be started in a separate background session, so it
|
|
||||||
can continue to run even after VDR has terminated.
|
|
||||||
|
|
||||||
If there are currently no timers active and there is no plugin wakeup
|
The third parameter contains the number of the channel that will be recorded
|
||||||
time, both parameters will be '0'. In that case the program shall not set
|
by the next timer (or 0 if no timer is present), and the fourth parameter
|
||||||
the hardware for automatic restart and only perform the system shutdown.
|
contains the file name of the recording as defined in the timer (or an empty
|
||||||
A program that uses the second parameter to set the hardware for restart
|
string if no timer is present). These can be used by the shutdown program to
|
||||||
must therefore also check whether the first parameter is '0'.
|
show that information on some display interface etc.
|
||||||
|
|
||||||
If the wakeup time is given by a timer, the third parameter will be the
|
|
||||||
number of the channel that will be recorded, otherwise it will be 0. The
|
|
||||||
fourth parameter contains the file name of the recording as defined in the
|
|
||||||
timer, the name of the plugin that requested the wakeup time, or an empty
|
|
||||||
string if no wakeup time is present. These can be used by the shutdown
|
|
||||||
program to show that information on some display interface etc.
|
|
||||||
|
|
||||||
The fifth parameter indicates the reason why the shutdown was requested.
|
The fifth parameter indicates the reason why the shutdown was requested.
|
||||||
'0' means this is an automatic shutdown due to some timeout, while '1' means
|
'0' means this is an automatic shutdown due to some timeout, while '1' means
|
||||||
@ -233,16 +147,18 @@ that this is a user requested shutdown (resulting from pressing the "Power"
|
|||||||
key). The shutdown program may use this information to decide whether or
|
key). The shutdown program may use this information to decide whether or
|
||||||
not to actually perform the system shutdown.
|
not to actually perform the system shutdown.
|
||||||
|
|
||||||
If a timer is currently recording, or a recording would start within the
|
If a timer is currently recording, the parameters will reflect the start
|
||||||
next 30 minutes (default for the "Min. event timeout" setup parameter), and
|
time of that timer. This means that the first parameter will be a time in
|
||||||
the user insists in shutting down now, the first and second parameter will
|
the past, and the second parameter will be a negative number. This only
|
||||||
correspond to a time that is "Min. event timeout" minutes in the future.
|
happens if the user presses the "Power" key while a timer is currently
|
||||||
|
recording.
|
||||||
|
|
||||||
Before the shutdown program is called, the user will be prompted to inform
|
Before the shutdown program is called, the user will be prompted to inform
|
||||||
him that the system is about to shut down. If any remote control key is
|
him that the system is about to shut down. If any remote control key is
|
||||||
pressed while this prompt is visible, the shutdown will be cancelled (and
|
pressed while this prompt is visible, the shutdown will be cancelled (and
|
||||||
tried again later). The shutdown prompt will be displayed for 5 minutes, which
|
tried again after another MinUserInactivity minutes). The shutdown prompt
|
||||||
should be enough time for the user to react.
|
will be displayed for 5 minutes, which should be enough time for the user
|
||||||
|
to react.
|
||||||
|
|
||||||
A sample shell script to be used with the '-s' option might look like this:
|
A sample shell script to be used with the '-s' option might look like this:
|
||||||
|
|
||||||
@ -264,27 +180,19 @@ Executing commands before and after a recording:
|
|||||||
------------------------------------------------
|
------------------------------------------------
|
||||||
|
|
||||||
You can use the '-r' option to define a program or script that gets called
|
You can use the '-r' option to define a program or script that gets called
|
||||||
at various stages of handling recordings.
|
before and after a recording is performed, and after an editing process
|
||||||
|
has finished.
|
||||||
|
|
||||||
The program will be called with two or three string parameters.
|
The program will be called with two string parameters. The first parameter
|
||||||
The first parameter is one of
|
is one of
|
||||||
|
|
||||||
before if this is *before* a recording starts
|
before if this is *before* a recording starts
|
||||||
started if this is after a recording has *started*
|
|
||||||
after if this is *after* a recording has finished
|
after if this is *after* a recording has finished
|
||||||
editing if this is before *editing* a recording
|
|
||||||
edited if this is after a recording has been *edited*
|
edited if this is after a recording has been *edited*
|
||||||
deleted if this is after a recording has been *deleted*
|
|
||||||
copying if this is before *copying* a recording
|
|
||||||
copied if this is after a recording has been *copied*
|
|
||||||
renamed if this is after a recording has been *renamed*
|
|
||||||
moved if this is after a recording has been *moved*
|
|
||||||
(note that a move across file system borders triggers a sequence
|
|
||||||
of "copying", "copied" and "deleted")
|
|
||||||
|
|
||||||
and the second and third parameter (if present) contain the full name of the recording's
|
and the second parameter contains the full name of the recording's
|
||||||
directory (which may not yet exists at that moment in the "before" case).
|
directory (which may not yet exists at that moment in the "before" case).
|
||||||
See the example below for the exact meaning of these parameters.
|
In the "edited" case it will be the name of the edited version.
|
||||||
|
|
||||||
Within this program you can do anything you would like to do before and/or
|
Within this program you can do anything you would like to do before and/or
|
||||||
after a recording or after an editing process. However, the program must return
|
after a recording or after an editing process. However, the program must return
|
||||||
@ -300,38 +208,11 @@ case "$1" in
|
|||||||
before)
|
before)
|
||||||
echo "Before recording $2"
|
echo "Before recording $2"
|
||||||
;;
|
;;
|
||||||
started)
|
|
||||||
echo "Started recording $2"
|
|
||||||
;;
|
|
||||||
after)
|
after)
|
||||||
echo "After recording $2"
|
echo "After recording $2"
|
||||||
;;
|
;;
|
||||||
editing)
|
|
||||||
echo "Editing recording $2"
|
|
||||||
echo "Source recording $3"
|
|
||||||
;;
|
|
||||||
edited)
|
edited)
|
||||||
echo "Edited recording $2"
|
echo "Edited recording $2"
|
||||||
echo "Source recording $3"
|
|
||||||
;;
|
|
||||||
deleted)
|
|
||||||
echo "Deleted recording $2"
|
|
||||||
;;
|
|
||||||
copying)
|
|
||||||
echo "Destination recording $2"
|
|
||||||
echo "Source recording $3"
|
|
||||||
;;
|
|
||||||
copied)
|
|
||||||
echo "Destination recording $2"
|
|
||||||
echo "Source recording $3"
|
|
||||||
;;
|
|
||||||
renamed)
|
|
||||||
echo "New name of recording $2"
|
|
||||||
echo "Old name of recording $3"
|
|
||||||
;;
|
|
||||||
moved)
|
|
||||||
echo "New path of recording $2"
|
|
||||||
echo "Old path of recording $3"
|
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo "ERROR: unknown state: $1"
|
echo "ERROR: unknown state: $1"
|
||||||
@ -346,9 +227,7 @@ Use "vdr --help" for a list of available command line options.
|
|||||||
Replaying Dolby Digital audio:
|
Replaying Dolby Digital audio:
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
If you have a "full featured" DVB card with SPDIF output you can replay
|
To replay Dolby Digital audio you need a program that reads the DD data
|
||||||
Dolby Digital audio directly through the DVB card.
|
|
||||||
You can also use an external program that reads the DD data
|
|
||||||
from stdin and processes it in a way suitable for your audio hardware.
|
from stdin and processes it in a way suitable for your audio hardware.
|
||||||
This program must be given to VDR with the '-a' option, as in
|
This program must be given to VDR with the '-a' option, as in
|
||||||
|
|
||||||
@ -357,7 +236,7 @@ This program must be given to VDR with the '-a' option, as in
|
|||||||
The video data directory:
|
The video data directory:
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
All recordings are written into directories below "/srv/vdr/video". Please
|
All recordings are written into directories below "/video". Please
|
||||||
make sure this directory exists, and that the user who runs the 'vdr'
|
make sure this directory exists, and that the user who runs the 'vdr'
|
||||||
program has read and write access to that directory.
|
program has read and write access to that directory.
|
||||||
If you prefer a different location for your video files, you can use
|
If you prefer a different location for your video files, you can use
|
||||||
@ -366,49 +245,51 @@ name you use with '-v' is a clean and absolute path name (no '..' or
|
|||||||
multiple slashes).
|
multiple slashes).
|
||||||
|
|
||||||
Note that the file system need not be 64-bit proof, since the 'vdr'
|
Note that the file system need not be 64-bit proof, since the 'vdr'
|
||||||
program splits video files into chunks of about 2GB. You should use
|
program splits video files into chunks of about 1GB. You should use
|
||||||
a disk with several gigabytes of free space. One GB can store roughly
|
a disk with several gigabytes of free space. One GB can store roughly
|
||||||
half an hour of SD video data, or 10 minutes of HD video.
|
half an hour of video data.
|
||||||
Either use one of today's large terabyte disks (preferably with a backup disk
|
|
||||||
in a RAID-1 array), or use something like "mhddfs" to group several disks
|
|
||||||
into one large volume.
|
|
||||||
|
|
||||||
Note that you should not copy any non-VDR files into the video directory,
|
If you have more than one disk and don't want to combine them to form
|
||||||
since this might cause a lot of unnecessary disk access when VDR cleans up those
|
one large logical volume, you can set up several video directories as
|
||||||
directories and there is a large number of files and/or subdirectories in
|
mount points for these disks. All of these directories must have the
|
||||||
there. If you have a large disk that you want to use for VDR's video data as
|
same basic name and must end with a numeric part, which starts at 0 for
|
||||||
well as other stuff, you may want to create a subdirectory for VDR, as in
|
the main directory and has increasing values for the rest of the
|
||||||
|
directories. For example
|
||||||
|
|
||||||
/mydisk/video
|
/video0
|
||||||
|
/video1
|
||||||
|
/video2
|
||||||
|
|
||||||
and put your other stuff into, say,
|
would be a setup with three directories. You can use more than one
|
||||||
|
numeric digit, and the directories need not be directly under '/':
|
||||||
|
|
||||||
/mydisk/otherstuff
|
/mnt/MyVideos/vdr.00
|
||||||
|
/mnt/MyVideos/vdr.01
|
||||||
|
/mnt/MyVideos/vdr.02
|
||||||
|
...
|
||||||
|
/mnt/MyVideos/vdr.11
|
||||||
|
|
||||||
If your video directory is mounted via a Samba share, and you are experiencing
|
would set up twelve disks (wow, what a machine that would be!).
|
||||||
problems with replaying in fast forward mode, you can comment out the line
|
|
||||||
|
|
||||||
#define USE_FADVISE
|
To use such a multi directory setup, you need to add the '-v' option
|
||||||
|
with the name of the basic directory when running 'vdr':
|
||||||
|
|
||||||
in the file tools.c, which may lead to better results.
|
vdr -v /video0
|
||||||
|
|
||||||
Configuration files:
|
Configuration files:
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
There are several configuration files that hold information about
|
There are three configuration files that hold information about
|
||||||
channels, remote control keys, timers etc. By default these files are
|
channels, remote control keys and timers. By default these files are
|
||||||
spread around the system according to the FHS ("File system Hierarchy Standard").
|
assumed to be located in the video directory, but a different directory
|
||||||
If you prefer to have VDR built to run locally under the VDR source tree,
|
can be used with the '-c' option. For starters just copy all *.conf files from
|
||||||
you can copy the file Make.config.template to Make.config and set the parameter
|
the VDR directory into your video directory.
|
||||||
LCLBLD=1. If you also want to have all data files under one single directory,
|
|
||||||
set ONEDIR=1 in Make.config.
|
|
||||||
|
|
||||||
For starters just copy all *.conf files from the VDR directory into your
|
|
||||||
video directory.
|
|
||||||
|
|
||||||
The configuration files can be edited with any text editor, or will be written
|
The configuration files can be edited with any text editor, or will be written
|
||||||
by the 'vdr' program if any changes are made inside the on-screen menus.
|
by the 'vdr' program if any changes are made inside the on-screen menus.
|
||||||
Take a look at man page vdr(5) for information about the file formats.
|
The meaning of the data entries may still vary in future releases, so for the
|
||||||
|
moment please look at the source code (config.c) to see the meaning of the
|
||||||
|
various fields.
|
||||||
|
|
||||||
The files that come with this package contain the author's selections,
|
The files that come with this package contain the author's selections,
|
||||||
so please make sure you adapt these to your personal taste. Also make sure
|
so please make sure you adapt these to your personal taste. Also make sure
|
||||||
@ -425,30 +306,8 @@ Setting up DiSEqC:
|
|||||||
|
|
||||||
If you are using a DVB-S card with a satellite equipment that needs to be
|
If you are using a DVB-S card with a satellite equipment that needs to be
|
||||||
accessed using DiSEqC, you have to go to the "Setup" menu and set the "DiSEqC"
|
accessed using DiSEqC, you have to go to the "Setup" menu and set the "DiSEqC"
|
||||||
parameter to "on". You also need to set up the file 'diseqc.conf' to properly
|
parameter to "on". Also check the "DiSEqC" parameters for the various channels
|
||||||
access your DiSEqC equipment (see man vdr(5) for details).
|
and set them to the necessary values.
|
||||||
|
|
||||||
A special form of DiSEqC is used to connect several receivers to one signal
|
|
||||||
source using only a single cable. This method, known as "Satellite Channel Routing"
|
|
||||||
according to EN50494 (aka "Unicable(TM)", "OLT(TM)", "SatCR", "Single Cable
|
|
||||||
Distribution", "Channel Stacking System" or "Single Cable Interface") or
|
|
||||||
EN50607 (aka "JESS") uses the file "scr.conf" to specify which SCR channels
|
|
||||||
use which user band frequency.
|
|
||||||
|
|
||||||
If DVB-S devices need to be connected to the same satellite cable, but no
|
|
||||||
"Satellite Channel Routing" is available, they can be set to be "bonded" in
|
|
||||||
the Setup/LNB menu. Bonded devices can only be tuned to the same polarization
|
|
||||||
and frequency band, which reduces the number of potentially receivable channels.
|
|
||||||
|
|
||||||
Note that it doesn't make sense to use "Satellite Channel Routing" and
|
|
||||||
"Device Bonding" at the same time with the same devices. If you use either
|
|
||||||
of these methods, it is necessary that your devices are always created in the
|
|
||||||
same sequence when the drivers are loaded. You may need to configure some
|
|
||||||
proper "udev" rules to make sure this happens.
|
|
||||||
If you use "Device Bonding" and you add devices to your setup that don't
|
|
||||||
provide DVB-S and take up a position in which there used to be a bonded DVB-S
|
|
||||||
device, make sure you open, adjust (if necessary) and confirm the Setup/LNB
|
|
||||||
menu to have the device bondings set correctly again.
|
|
||||||
|
|
||||||
Running VDR with DVB-C (cable) or DVB-T (terrestrial):
|
Running VDR with DVB-C (cable) or DVB-T (terrestrial):
|
||||||
------------------------------------------------------
|
------------------------------------------------------
|
||||||
@ -459,18 +318,20 @@ cable or terrestrial reception is the 'channels.conf' file. The distribution
|
|||||||
archive contains a default 'channels.conf.cable' and 'channels.conf.terr',
|
archive contains a default 'channels.conf.cable' and 'channels.conf.terr',
|
||||||
respectively, which users of such cards can rename or copy to 'channels.conf'
|
respectively, which users of such cards can rename or copy to 'channels.conf'
|
||||||
in order to receive digital cable or terrestrial channels. The format of these
|
in order to receive digital cable or terrestrial channels. The format of these
|
||||||
files is mostly the same as for satellite channels, however, some fields have
|
files is exactly the same as for satellite channels (the fields containing
|
||||||
different or extended meanings (see man vdr(5) for details).
|
"Polarization" and "Diseqc" data are ignored in case of DVB-C and DVB-T, and
|
||||||
|
the "Frequency" is in kHz in case of DVB-T).
|
||||||
|
|
||||||
You can even use a mixture of DVB-S, DVB-C and DVB-T cards in the same system.
|
You can even use a mixture of DVB-S, DVB-C and DVB-T cards in the same system.
|
||||||
All you need to do is to put all the channel definitions into one big
|
All you need to do is to put all the channel definitions into one big
|
||||||
'channels.conf' file. VDR will automatically know which channels can be
|
'channels.conf' file and set the 'Ca' parameter of each channel to the number
|
||||||
received with which card(s) by evaluating the 'source' parameter.
|
of the card that can receive it.
|
||||||
|
|
||||||
Learning the remote control keys:
|
Learning the remote control keys:
|
||||||
---------------------------------
|
---------------------------------
|
||||||
|
|
||||||
There is no default 'remote.conf' file, so you will have to go through a "teach-in"
|
There is no default 'keys.conf' file, so if you compile the program
|
||||||
|
with 'REMOTE=RCU' you will have to go through a "teach-in"
|
||||||
session that allows the program to learn your remote control codes.
|
session that allows the program to learn your remote control codes.
|
||||||
It will first attempt to determine the basic data transfer mode and
|
It will first attempt to determine the basic data transfer mode and
|
||||||
timing of your remote control unit, and then will ask you to press one
|
timing of your remote control unit, and then will ask you to press one
|
||||||
@ -481,26 +342,27 @@ you define, the more you will be able to navigate through the menus and
|
|||||||
control recording/replaying. The program uses only a very small number
|
control recording/replaying. The program uses only a very small number
|
||||||
of keys which have multiple meanings in the various modes (see MANUAL
|
of keys which have multiple meanings in the various modes (see MANUAL
|
||||||
for a detailed description).
|
for a detailed description).
|
||||||
|
If the program has been built with "REMOTE=KBD", it will use the
|
||||||
|
key configuration file 'keys-pc.conf', so that you won't loose data
|
||||||
|
when switching between remote control and keyboard mode.
|
||||||
|
|
||||||
The recommended PC key assignments are:
|
The default PC key assignments are:
|
||||||
|
|
||||||
Up, Down, Left, Right Cursor keys
|
Up, Down, Left, Right Crsr keys in numeric block
|
||||||
Menu 'Home'
|
Menu 'Home' in numeric block
|
||||||
Ok 'Enter'
|
Ok '5' in numeric block
|
||||||
Back 'Backspace'
|
Back 'End' in numeric block
|
||||||
Red, Green, Yellow, Blue 'F1'..'F4'
|
Red, Green, Yellow, Blue 'F1'..'F4'
|
||||||
0..9 '0'..'9'
|
0..9 '0'..'9' in top row
|
||||||
Volume+/- 'PgUp', 'PgDn'
|
Power 'P'
|
||||||
Mute 'F10'
|
Volume+/- '+', '-'
|
||||||
|
Mute 'm'
|
||||||
|
|
||||||
If you want to change your key assignments later, simply delete the file
|
If you prefer different key assignments, or if the default doesn't work for
|
||||||
'remote.conf' and restart 'vdr' to get into learning mode.
|
your keyboard, simply delete the file 'keys-pc.conf' and restart 'vdr' to get
|
||||||
|
into learning mode.
|
||||||
|
|
||||||
Generating source code documentation:
|
If the program has been compiled with 'REMOTE=LIRC', no 'keys.conf' file
|
||||||
-------------------------------------
|
will be used. Instead, the key names as listed in the source file 'config.c'
|
||||||
|
must be used when setting up LIRC. See http://www.lirc.org for more about LIRC.
|
||||||
|
|
||||||
You can do a 'make srcdoc' to generate source code documentation using the
|
|
||||||
Doxygen tool. To do so you need the Doxygen package from http://www.doxygen.org
|
|
||||||
and the Graphviz package from http://www.research.att.com/sw/tools/graphviz.
|
|
||||||
After installing these two packages you can do 'make srcdoc' and then use your
|
|
||||||
HTML browser to read srcdoc/html/index.html.
|
|
||||||
|
@ -1,100 +0,0 @@
|
|||||||
#
|
|
||||||
# User defined Makefile options for the Video Disk Recorder
|
|
||||||
#
|
|
||||||
# Copy this file to 'Make.config' and change the parameters as necessary.
|
|
||||||
#
|
|
||||||
# See the main source file 'vdr.c' for copyright information and
|
|
||||||
# how to reach the author.
|
|
||||||
#
|
|
||||||
# $Id: Make.config.template 5.2 2024/10/11 14:21:04 kls Exp $
|
|
||||||
|
|
||||||
### The C compiler and options:
|
|
||||||
|
|
||||||
CC = gcc
|
|
||||||
CFLAGS = -g -O3 -Wall
|
|
||||||
|
|
||||||
CXX = g++
|
|
||||||
CXXFLAGS = -g -O3 -Wall -Werror=overloaded-virtual -Wno-parentheses
|
|
||||||
|
|
||||||
# Use 'make DEBUG=1 ...' to build a debug version of VDR and plugins:
|
|
||||||
ifdef DEBUG
|
|
||||||
CFLAGS += -O0
|
|
||||||
CXXFLAGS += -O0
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Use 'make M32=1 ...' to build a 32-bit version of VDR on a 64-bit machine:
|
|
||||||
ifdef M32
|
|
||||||
CFLAGS += -m32
|
|
||||||
CXXFLAGS += -m32
|
|
||||||
endif
|
|
||||||
|
|
||||||
### The directory environment:
|
|
||||||
|
|
||||||
# Default directories (adjust as necessary or desired):
|
|
||||||
|
|
||||||
#PREFIX = /usr/local
|
|
||||||
#VDRROOT = $(PREFIX)
|
|
||||||
#BINDIR = $(VDRROOT)/bin
|
|
||||||
#INCDIR = $(VDRROOT)/include
|
|
||||||
#LIBDIR = $(VDRROOT)/lib
|
|
||||||
#LOCDIR = $(VDRROOT)/locale
|
|
||||||
#MANDIR = $(VDRROOT)/man
|
|
||||||
#PCDIR = $(VDRROOT)/pkgconfig
|
|
||||||
#RESDIR = $(VDRROOT)/share
|
|
||||||
#DVBDIR = /usr/include
|
|
||||||
|
|
||||||
#VIDEODIR = /srv/vdr/video
|
|
||||||
#CONFDIR = /var/lib/vdr
|
|
||||||
#ARGSDIR = /etc/vdr/conf.d
|
|
||||||
#CACHEDIR = /var/cache/vdr
|
|
||||||
|
|
||||||
# Overrides for preset/legacy configurations:
|
|
||||||
|
|
||||||
# Use 'make LCLBLD=1' to build locale and plugin files under the source directory:
|
|
||||||
ifdef LCLBLD
|
|
||||||
LOCDIR = $(CWD)/locale
|
|
||||||
PLUGINDIR = $(CWD)/PLUGINS
|
|
||||||
ifndef PLUGIN # don't overwrite for plugins with old makefiles
|
|
||||||
LIBDIR = $(PLUGINDIR)/lib
|
|
||||||
endif
|
|
||||||
HDRDIR = $(CWD)/include
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Use 'make ONEDIR=1' to have all data in one single directory:
|
|
||||||
ifdef ONEDIR
|
|
||||||
VIDEODIR = /video
|
|
||||||
CACHEDIR = $(VIDEODIR)
|
|
||||||
CONFDIR = $(VIDEODIR)
|
|
||||||
ARGSDIR = $(VIDEODIR)/conf.d
|
|
||||||
RESDIR = $(VIDEODIR)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Use this if you want to have a central place where you configure compile time
|
|
||||||
# parameters for plugins:
|
|
||||||
#PLGCFG = $(CONFDIR)/plugins.mk
|
|
||||||
|
|
||||||
### The remote control:
|
|
||||||
LIRC_DEVICE = /var/run/lirc/lircd
|
|
||||||
### Use this for kernel based driver:
|
|
||||||
#LIRC_DEVICE = /dev/lirc0
|
|
||||||
|
|
||||||
### Define if you always want to use LIRC, independent of the --lirc option:
|
|
||||||
#REMOTE=LIRC
|
|
||||||
|
|
||||||
### Define if you don't want keyboard remote control:
|
|
||||||
#NO_KBD = 1
|
|
||||||
|
|
||||||
### Define if you want vdr to not run as root:
|
|
||||||
#VDR_USER = vdr
|
|
||||||
|
|
||||||
### Define if you want to compile in 'bidi' support:
|
|
||||||
#BIDI = 1
|
|
||||||
|
|
||||||
### Define if you want 'systemd' notification:
|
|
||||||
#SDNOTIFY = 1
|
|
||||||
|
|
||||||
### Fallback for plugins with old makefiles:
|
|
||||||
ifdef PLUGIN
|
|
||||||
CFLAGS += -fPIC
|
|
||||||
CXXFLAGS += -fPIC
|
|
||||||
endif
|
|
10
Make.global
10
Make.global
@ -1,10 +0,0 @@
|
|||||||
#
|
|
||||||
# Strictly necessary Makefile options for the Video Disk Recorder
|
|
||||||
#
|
|
||||||
# See the main source file 'vdr.c' for copyright information and
|
|
||||||
# how to reach the author.
|
|
||||||
#
|
|
||||||
# $Id: Make.global 1.2 2012/12/29 12:03:01 kls Exp $
|
|
||||||
|
|
||||||
# This is just a dummy file for plugins that use old style (version 1.7.33
|
|
||||||
# or earlier) Makefiles.
|
|
370
Makefile
370
Makefile
@ -4,364 +4,92 @@
|
|||||||
# See the main source file 'vdr.c' for copyright information and
|
# See the main source file 'vdr.c' for copyright information and
|
||||||
# how to reach the author.
|
# how to reach the author.
|
||||||
#
|
#
|
||||||
# $Id: Makefile 5.4 2024/10/21 19:01:16 kls Exp $
|
# $Id: Makefile 1.31 2002/02/24 12:29:54 kls Exp $
|
||||||
|
|
||||||
.DELETE_ON_ERROR:
|
.DELETE_ON_ERROR:
|
||||||
|
|
||||||
# Compiler flags:
|
DVBDIR = ../DVB
|
||||||
|
DTVDIR = ./libdtv
|
||||||
|
|
||||||
PKG_CONFIG ?= pkg-config
|
INCLUDES = -I$(DVBDIR)/ost/include
|
||||||
|
|
||||||
CC ?= gcc
|
DTVLIB = $(DTVDIR)/libdtv.a
|
||||||
CFLAGS ?= -g -O3 -Wall
|
|
||||||
|
|
||||||
CXX ?= g++
|
OBJS = config.o dvbapi.o dvbosd.o eit.o font.o i18n.o interface.o menu.o osd.o\
|
||||||
CXXFLAGS ?= -g -O3 -Wall -Werror=overloaded-virtual -Wno-parentheses
|
recording.o remote.o remux.o ringbuffer.o svdrp.o thread.o tools.o vdr.o\
|
||||||
CXXFLAGS += $(CPPFLAGS)
|
videodir.o
|
||||||
|
|
||||||
CDEFINES = -D_GNU_SOURCE
|
OSDFONT = -adobe-helvetica-medium-r-normal--23-*-100-100-p-*-iso8859-1
|
||||||
CDEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
|
FIXFONT = -adobe-courier-bold-r-normal--25-*-100-100-m-*-iso8859-1
|
||||||
|
|
||||||
LIBS = -ljpeg -lpthread -ldl -lcap -lrt $(shell $(PKG_CONFIG) --libs freetype2 fontconfig)
|
ifndef REMOTE
|
||||||
INCLUDES ?= $(shell $(PKG_CONFIG) --cflags freetype2 fontconfig)
|
REMOTE = KBD
|
||||||
|
|
||||||
# Directories:
|
|
||||||
|
|
||||||
CWD ?= $(shell pwd)
|
|
||||||
LSIDIR ?= $(CWD)/libsi
|
|
||||||
PLUGINDIR ?= $(CWD)/PLUGINS
|
|
||||||
|
|
||||||
# Failsafe defaults for "make LCLBLD=1":
|
|
||||||
ifdef LCLBLD
|
|
||||||
DESTDIR ?= $(CWD)
|
|
||||||
LOCDIR ?= $(CWD)/locale
|
|
||||||
HDRDIR ?= $(CWD)/include
|
|
||||||
LIBDIR ?= $(PLUGINDIR)/lib
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
DESTDIR ?=
|
ifeq ($(REMOTE), KBD)
|
||||||
VIDEODIR ?= /srv/vdr/video
|
NCURSESLIB = -lncurses
|
||||||
CONFDIR ?= /var/lib/vdr
|
|
||||||
ARGSDIR ?= /etc/vdr/conf.d
|
|
||||||
CACHEDIR ?= /var/cache/vdr
|
|
||||||
|
|
||||||
PREFIX ?= /usr/local
|
|
||||||
VDRROOT ?= $(PREFIX)
|
|
||||||
BINDIR ?= $(VDRROOT)/bin
|
|
||||||
INCDIR ?= $(VDRROOT)/include
|
|
||||||
LIBDIR ?= $(VDRROOT)/lib/vdr
|
|
||||||
LOCDIR ?= $(VDRROOT)/share/locale
|
|
||||||
MANDIR ?= $(VDRROOT)/share/man
|
|
||||||
PCDIR ?= $(VDRROOT)/lib/pkgconfig
|
|
||||||
RESDIR ?= $(VDRROOT)/share/vdr
|
|
||||||
|
|
||||||
# Source documentation
|
|
||||||
|
|
||||||
DOXYGEN ?= /usr/bin/doxygen
|
|
||||||
DOXYFILE = Doxyfile
|
|
||||||
|
|
||||||
# User configuration
|
|
||||||
|
|
||||||
-include Make.config
|
|
||||||
|
|
||||||
# Output control
|
|
||||||
|
|
||||||
ifdef VERBOSE
|
|
||||||
Q =
|
|
||||||
else
|
|
||||||
Q = @
|
|
||||||
endif
|
|
||||||
export Q
|
|
||||||
|
|
||||||
# Mandatory compiler flags:
|
|
||||||
|
|
||||||
CFLAGS += -fPIC
|
|
||||||
CXXFLAGS += -fPIC
|
|
||||||
|
|
||||||
# Common include files:
|
|
||||||
|
|
||||||
ifdef DVBDIR
|
|
||||||
CINCLUDES += -I$(DVBDIR)
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Object files
|
|
||||||
|
|
||||||
SILIB = $(LSIDIR)/libsi.a
|
|
||||||
|
|
||||||
OBJS = args.o audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o\
|
|
||||||
dvbplayer.o dvbspu.o dvbsubtitle.o eit.o eitscan.o epg.o filter.o font.o i18n.o interface.o keys.o\
|
|
||||||
lirc.o menu.o menuitems.o mtd.o nit.o osdbase.o osd.o pat.o player.o plugin.o positioner.o\
|
|
||||||
receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o shutdown.o\
|
|
||||||
skinclassic.o skinlcars.o skins.o skinsttng.o sourceparams.o sources.o spu.o status.o svdrp.o themes.o thread.o\
|
|
||||||
timers.o tools.o transfer.o vdr.o videodir.o
|
|
||||||
|
|
||||||
DEFINES += $(CDEFINES)
|
|
||||||
INCLUDES += $(CINCLUDES)
|
|
||||||
|
|
||||||
ifdef HDRDIR
|
|
||||||
HDRDIR := -I$(HDRDIR)
|
|
||||||
endif
|
|
||||||
ifndef NO_KBD
|
|
||||||
DEFINES += -DREMOTE_KBD
|
|
||||||
endif
|
|
||||||
ifdef REMOTE
|
|
||||||
DEFINES += -DREMOTE_$(REMOTE)
|
DEFINES += -DREMOTE_$(REMOTE)
|
||||||
endif
|
|
||||||
ifdef VDR_USER
|
DEFINES += -D_GNU_SOURCE
|
||||||
DEFINES += -DVDR_USER=\"$(VDR_USER)\"
|
|
||||||
endif
|
ifdef DEBUG_OSD
|
||||||
ifdef BIDI
|
DEFINES += -DDEBUG_OSD
|
||||||
INCLUDES += $(shell $(PKG_CONFIG) --cflags fribidi)
|
NCURSESLIB = -lncurses
|
||||||
DEFINES += -DBIDI
|
|
||||||
LIBS += $(shell $(PKG_CONFIG) --libs fribidi)
|
|
||||||
endif
|
|
||||||
ifdef SDNOTIFY
|
|
||||||
INCLUDES += $(shell $(PKG_CONFIG) --silence-errors --cflags libsystemd-daemon || $(PKG_CONFIG) --cflags libsystemd)
|
|
||||||
DEFINES += -DSDNOTIFY
|
|
||||||
LIBS += $(shell $(PKG_CONFIG) --silence-errors --libs libsystemd-daemon || $(PKG_CONFIG) --libs libsystemd)
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LIRC_DEVICE ?= /var/run/lirc/lircd
|
ifdef VFAT
|
||||||
|
# for people who want their video directory on a VFAT partition
|
||||||
|
DEFINES += -DVFAT
|
||||||
|
endif
|
||||||
|
|
||||||
DEFINES += -DLIRC_DEVICE=\"$(LIRC_DEVICE)\"
|
all: vdr
|
||||||
DEFINES += -DVIDEODIR=\"$(VIDEODIR)\"
|
font: genfontfile fontfix.c fontosd.c
|
||||||
DEFINES += -DCONFDIR=\"$(CONFDIR)\"
|
@echo "font files created."
|
||||||
DEFINES += -DARGSDIR=\"$(ARGSDIR)\"
|
|
||||||
DEFINES += -DCACHEDIR=\"$(CACHEDIR)\"
|
|
||||||
DEFINES += -DRESDIR=\"$(RESDIR)\"
|
|
||||||
DEFINES += -DPLUGINDIR=\"$(LIBDIR)\"
|
|
||||||
DEFINES += -DLOCDIR=\"$(LOCDIR)\"
|
|
||||||
|
|
||||||
# The version numbers of VDR and the plugin API (taken from VDR's "config.h"):
|
|
||||||
|
|
||||||
VDRVERSION = $(shell sed -ne '/define VDRVERSION/s/^.*"\(.*\)".*$$/\1/p' config.h)
|
|
||||||
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' config.h)
|
|
||||||
|
|
||||||
all: vdr i18n plugins
|
|
||||||
|
|
||||||
# Implicit rules:
|
# Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
@echo CC $@
|
g++ -g -O2 -Wall -Woverloaded-virtual -m486 -c $(DEFINES) $(INCLUDES) $<
|
||||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
|
||||||
|
|
||||||
# Dependencies:
|
# Dependencies:
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
MAKEDEP = g++ -MM -MG
|
||||||
DEPFILE = .dependencies
|
DEPFILE = .dependencies
|
||||||
$(DEPFILE): Makefile
|
$(DEPFILE): Makefile
|
||||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
-include $(DEPFILE)
|
include $(DEPFILE)
|
||||||
|
|
||||||
# The main program:
|
# The main program:
|
||||||
|
|
||||||
vdr: $(OBJS) $(SILIB)
|
vdr: $(OBJS) $(DTVLIB)
|
||||||
@echo LD $@
|
g++ -g -O2 $(OBJS) $(NCURSESLIB) -ljpeg -lpthread $(LIBDIRS) $(DTVLIB) -o vdr
|
||||||
$(Q)$(CXX) $(CXXFLAGS) -rdynamic $(LDFLAGS) $(OBJS) $(LIBS) $(SILIB) -o vdr
|
|
||||||
|
|
||||||
# The libsi library:
|
# The font files:
|
||||||
|
|
||||||
$(SILIB): make-libsi
|
fontfix.c:
|
||||||
@$(MAKE) --no-print-directory -C $(LSIDIR) CXXFLAGS="$(CXXFLAGS)" DEFINES="$(CDEFINES)" all
|
./genfontfile "cFont::tPixelData FontFix" "$(FIXFONT)" > $@
|
||||||
make-libsi: # empty rule makes sure the sub-make for libsi is always called
|
fontosd.c:
|
||||||
|
./genfontfile "cFont::tPixelData FontOsd" "$(OSDFONT)" > $@
|
||||||
|
|
||||||
# pkg-config file:
|
# The font file generator:
|
||||||
|
|
||||||
.PHONY: vdr.pc
|
genfontfile: genfontfile.c
|
||||||
vdr.pc:
|
gcc -o $@ -O2 -L/usr/X11R6/lib $< -lX11
|
||||||
@echo "vdrrootdir=$(VDRROOT)" > $@
|
|
||||||
@echo "bindir=$(BINDIR)" >> $@
|
|
||||||
@echo "incdir=$(INCDIR)" >> $@
|
|
||||||
@echo "mandir=$(MANDIR)" >> $@
|
|
||||||
@echo "videodir=$(VIDEODIR)" >> $@
|
|
||||||
@echo "configdir=$(CONFDIR)" >> $@
|
|
||||||
@echo "argsdir=$(ARGSDIR)" >> $@
|
|
||||||
@echo "cachedir=$(CACHEDIR)" >> $@
|
|
||||||
@echo "resdir=$(RESDIR)" >> $@
|
|
||||||
@echo "libdir=$(LIBDIR)" >> $@
|
|
||||||
@echo "locdir=$(LOCDIR)" >> $@
|
|
||||||
@echo "plgcfg=$(PLGCFG)" >> $@
|
|
||||||
@echo "apiversion=$(APIVERSION)" >> $@
|
|
||||||
@echo "cflags=$(CFLAGS) $(CDEFINES) $(CINCLUDES) $(HDRDIR)" >> $@
|
|
||||||
@echo "cxxflags=$(CXXFLAGS) $(CDEFINES) $(CINCLUDES) $(HDRDIR)" >> $@
|
|
||||||
@echo "" >> $@
|
|
||||||
@echo "Name: VDR" >> $@
|
|
||||||
@echo "Description: Video Disk Recorder" >> $@
|
|
||||||
@echo "URL: https://www.tvdr.de/" >> $@
|
|
||||||
@echo "Version: $(VDRVERSION)" >> $@
|
|
||||||
@echo "Cflags: \$${cflags}" >> $@
|
|
||||||
|
|
||||||
# Internationalization (I18N):
|
# The libdtv library:
|
||||||
|
|
||||||
PODIR = po
|
$(DTVLIB) $(DTVDIR)/libdtv.h:
|
||||||
LOCALEDIR = locale
|
make -C $(DTVDIR) all
|
||||||
I18Npo = $(wildcard $(PODIR)/*.po)
|
|
||||||
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
|
||||||
I18Nmsgs = $(addprefix $(LOCALEDIR)/, $(addsuffix /LC_MESSAGES/vdr.mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
|
||||||
I18Npot = $(PODIR)/vdr.pot
|
|
||||||
|
|
||||||
%.mo: %.po
|
|
||||||
@echo MO $@
|
|
||||||
$(Q)msgfmt -c -o $@ $<
|
|
||||||
|
|
||||||
$(I18Npot): $(wildcard *.c)
|
|
||||||
@echo GT $@
|
|
||||||
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=VDR --package-version=$(VDRVERSION) --msgid-bugs-address='<vdr-bugs@tvdr.de>' -o $@ `ls $^`
|
|
||||||
|
|
||||||
%.po: $(I18Npot)
|
|
||||||
@echo PO $@
|
|
||||||
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
|
||||||
@touch $@
|
|
||||||
|
|
||||||
$(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr.mo: $(PODIR)/%.mo
|
|
||||||
@echo IN $@
|
|
||||||
$(Q)install -D -m644 $< $@
|
|
||||||
|
|
||||||
.PHONY: i18n
|
|
||||||
i18n: $(I18Nmsgs)
|
|
||||||
|
|
||||||
install-i18n: i18n
|
|
||||||
@mkdir -p $(DESTDIR)$(LOCDIR)
|
|
||||||
cp -r $(LOCALEDIR)/* $(DESTDIR)$(LOCDIR)
|
|
||||||
|
|
||||||
# The 'include' directory (for plugins):
|
|
||||||
|
|
||||||
include-dir:
|
|
||||||
@mkdir -p include/vdr
|
|
||||||
@(cd include/vdr; for i in ../../*.h; do ln -fs $$i .; done)
|
|
||||||
@mkdir -p include/libsi
|
|
||||||
@(cd include/libsi; for i in ../../libsi/*.h; do ln -fs $$i .; done)
|
|
||||||
|
|
||||||
# Plugins:
|
|
||||||
|
|
||||||
plugins: include-dir vdr.pc
|
|
||||||
@failed="";\
|
|
||||||
noapiv="";\
|
|
||||||
oldmakefile="";\
|
|
||||||
for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do\
|
|
||||||
echo; echo "*** Plugin $$i:";\
|
|
||||||
# No APIVERSION: Skip\
|
|
||||||
if ! grep -q "\$$(LIBDIR)/.*\$$(APIVERSION)" "$(PLUGINDIR)/src/$$i/Makefile" ; then\
|
|
||||||
echo "ERROR: plugin $$i doesn't honor APIVERSION - not compiled!";\
|
|
||||||
noapiv="$$noapiv $$i";\
|
|
||||||
continue;\
|
|
||||||
fi;\
|
|
||||||
# Old Makefile\
|
|
||||||
if ! grep -q "PKGCFG" "$(PLUGINDIR)/src/$$i/Makefile" ; then\
|
|
||||||
echo "WARNING: plugin $$i is using an old Makefile!";\
|
|
||||||
oldmakefile="$$oldmakefile $$i";\
|
|
||||||
$(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" CFLAGS="$(CFLAGS) $(CDEFINES) $(CINCLUDES)" CXXFLAGS="$(CXXFLAGS) $(CDEFINES) $(CINCLUDES)" LIBDIR="$(PLUGINDIR)/lib" VDRDIR="$(CWD)" all || failed="$$failed $$i";\
|
|
||||||
continue;\
|
|
||||||
fi;\
|
|
||||||
# New Makefile\
|
|
||||||
INCLUDES="-I$(CWD)/include"\
|
|
||||||
$(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR="$(CWD)" || failed="$$failed $$i";\
|
|
||||||
if [ -n "$(LCLBLD)" ] ; then\
|
|
||||||
(cd $(PLUGINDIR)/src/$$i; for l in `find -name "libvdr-*.so" -o -name "lib$$i-*.so"`; do install -D $$l $(LIBDIR)/`basename $$l`.$(APIVERSION); done);\
|
|
||||||
if [ -d $(PLUGINDIR)/src/$$i/po ]; then\
|
|
||||||
for l in `ls $(PLUGINDIR)/src/$$i/po/*.mo`; do\
|
|
||||||
install -D -m644 $$l $(LOCDIR)/`basename $$l | cut -d. -f1`/LC_MESSAGES/vdr-$$i.mo;\
|
|
||||||
done;\
|
|
||||||
fi;\
|
|
||||||
fi;\
|
|
||||||
done;\
|
|
||||||
# Conclusion\
|
|
||||||
if [ -n "$$noapiv" ] ; then echo; echo "*** plugins without APIVERSION:$$noapiv"; echo; fi;\
|
|
||||||
if [ -n "$$oldmakefile" ] ; then\
|
|
||||||
echo; echo "*** plugins with old Makefile:$$oldmakefile"; echo;\
|
|
||||||
echo "**********************************************************************";\
|
|
||||||
echo "*** While this currently still works, it is strongly recommended";\
|
|
||||||
echo "*** that you convert old Makefiles to the new style used since";\
|
|
||||||
echo "*** VDR version 1.7.36. Support for old style Makefiles may be dropped";\
|
|
||||||
echo "*** in future versions of VDR.";\
|
|
||||||
echo "**********************************************************************";\
|
|
||||||
fi;\
|
|
||||||
if [ -n "$$failed" ] ; then echo; echo "*** failed plugins:$$failed"; echo; exit 1; fi
|
|
||||||
|
|
||||||
clean-plugins: vdr.pc
|
|
||||||
@for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do $(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR="$(CWD)" clean; done
|
|
||||||
@-rm -f $(PLUGINDIR)/lib/lib*-*.so.$(APIVERSION)
|
|
||||||
|
|
||||||
# Install the files (note that 'install-pc' must be first!):
|
|
||||||
|
|
||||||
install: install-pc install-bin install-conf install-doc install-plugins install-i18n install-includes
|
|
||||||
|
|
||||||
# VDR binary:
|
|
||||||
|
|
||||||
install-bin: vdr
|
|
||||||
@mkdir -p $(DESTDIR)$(BINDIR)
|
|
||||||
@cp --remove-destination vdr svdrpsend $(DESTDIR)$(BINDIR)
|
|
||||||
|
|
||||||
# Configuration files:
|
|
||||||
|
|
||||||
install-dirs:
|
|
||||||
@mkdir -p $(DESTDIR)$(VIDEODIR)
|
|
||||||
@mkdir -p $(DESTDIR)$(CONFDIR)
|
|
||||||
@mkdir -p $(DESTDIR)$(ARGSDIR)
|
|
||||||
@mkdir -p $(DESTDIR)$(CACHEDIR)
|
|
||||||
@mkdir -p $(DESTDIR)$(RESDIR)
|
|
||||||
|
|
||||||
install-conf: install-dirs
|
|
||||||
# 'cp -n' may be broken, so let's do it the hard way
|
|
||||||
@for i in *.conf; do\
|
|
||||||
if ! [ -e $(DESTDIR)$(CONFDIR)/$$i ] ; then\
|
|
||||||
cp -p $$i $(DESTDIR)$(CONFDIR);\
|
|
||||||
fi\
|
|
||||||
done
|
|
||||||
|
|
||||||
# Documentation:
|
|
||||||
|
|
||||||
install-doc:
|
|
||||||
@mkdir -p $(DESTDIR)$(MANDIR)/man1
|
|
||||||
@mkdir -p $(DESTDIR)$(MANDIR)/man5
|
|
||||||
@gzip -c vdr.1 > $(DESTDIR)$(MANDIR)/man1/vdr.1.gz
|
|
||||||
@gzip -c vdr.5 > $(DESTDIR)$(MANDIR)/man5/vdr.5.gz
|
|
||||||
@gzip -c svdrpsend.1 > $(DESTDIR)$(MANDIR)/man1/svdrpsend.1.gz
|
|
||||||
|
|
||||||
# Plugins:
|
|
||||||
|
|
||||||
install-plugins: plugins
|
|
||||||
@-for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do\
|
|
||||||
echo; echo "*** Plugin $$i:";\
|
|
||||||
$(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR=$(CWD) DESTDIR=$(DESTDIR) install;\
|
|
||||||
done
|
|
||||||
@if [ -d $(PLUGINDIR)/lib ] ; then\
|
|
||||||
for i in `find $(PLUGINDIR)/lib -name 'lib*-*.so.$(APIVERSION)'`; do\
|
|
||||||
install -D $$i $(DESTDIR)$(LIBDIR);\
|
|
||||||
done;\
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Includes:
|
|
||||||
|
|
||||||
install-includes: include-dir
|
|
||||||
@mkdir -p $(DESTDIR)$(INCDIR)
|
|
||||||
@cp -pLR include/vdr include/libsi $(DESTDIR)$(INCDIR)
|
|
||||||
|
|
||||||
# pkg-config file:
|
|
||||||
|
|
||||||
install-pc: vdr.pc
|
|
||||||
if [ -n "$(PCDIR)" ] ; then\
|
|
||||||
mkdir -p $(DESTDIR)$(PCDIR) ;\
|
|
||||||
cp vdr.pc $(DESTDIR)$(PCDIR) ;\
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Source documentation:
|
|
||||||
|
|
||||||
srcdoc:
|
|
||||||
@cat $(DOXYFILE) > $(DOXYFILE).tmp
|
|
||||||
@echo PROJECT_NUMBER = $(VDRVERSION) >> $(DOXYFILE).tmp
|
|
||||||
@chmod +x $(DOXYFILE).filter
|
|
||||||
$(DOXYGEN) $(DOXYFILE).tmp
|
|
||||||
@rm $(DOXYFILE).tmp
|
|
||||||
|
|
||||||
# Housekeeping:
|
# Housekeeping:
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@$(MAKE) --no-print-directory -C $(LSIDIR) clean
|
make -C $(DTVDIR) clean
|
||||||
@-rm -f $(OBJS) $(DEPFILE) vdr vdr.pc core* *~
|
-rm -f $(OBJS) $(DEPFILE) vdr genfontfile genfontfile.o core* *~
|
||||||
@-rm -rf $(LOCALEDIR) $(PODIR)/*~ $(PODIR)/*.mo $(PODIR)/*.pot
|
fontclean:
|
||||||
@-rm -rf include
|
-rm -f fontfix.c fontosd.c
|
||||||
@-rm -rf srcdoc
|
CLEAN: clean fontclean
|
||||||
CLEAN: clean
|
|
||||||
distclean: clean-plugins clean
|
|
||||||
|
2417
PLUGINS.html
2417
PLUGINS.html
File diff suppressed because it is too large
Load Diff
@ -1,34 +0,0 @@
|
|||||||
VDR Plugin 'epgtableid0' Revision History
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
2012-03-10: Version 0.0.1
|
|
||||||
|
|
||||||
- Initial revision.
|
|
||||||
|
|
||||||
2012-12-27: Version 0.0.2
|
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
|
||||||
|
|
||||||
2013-01-12: Version 0.0.3
|
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
|
||||||
|
|
||||||
2013-03-31: Version 2.0.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2014-01-01: Version 2.1.1
|
|
||||||
|
|
||||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
|
||||||
|
|
||||||
2015-02-19: Version 2.2.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2018-04-15: Version 2.4.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2021-12-27: Version 2.6.0
|
|
||||||
|
|
||||||
- Official release.
|
|
@ -1,97 +0,0 @@
|
|||||||
#
|
|
||||||
# Makefile for a Video Disk Recorder plugin
|
|
||||||
#
|
|
||||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
|
||||||
|
|
||||||
# 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 = epgtableid0
|
|
||||||
|
|
||||||
### The version number of this plugin (taken from the main source file):
|
|
||||||
|
|
||||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
|
||||||
|
|
||||||
### The directory environment:
|
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
|
||||||
PKG_CONFIG ?= pkg-config
|
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
|
||||||
LIBDIR = $(call PKGCFG,libdir)
|
|
||||||
PLGCFG = $(call PKGCFG,plgcfg)
|
|
||||||
#
|
|
||||||
TMPDIR ?= /tmp
|
|
||||||
|
|
||||||
### The compiler options:
|
|
||||||
|
|
||||||
export CFLAGS = $(call PKGCFG,cflags)
|
|
||||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
|
||||||
|
|
||||||
### 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 +=
|
|
||||||
|
|
||||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
|
||||||
|
|
||||||
### The object files (add further files here):
|
|
||||||
|
|
||||||
OBJS = $(PLUGIN).o
|
|
||||||
|
|
||||||
### The main target:
|
|
||||||
|
|
||||||
all: $(SOFILE)
|
|
||||||
|
|
||||||
### Implicit rules:
|
|
||||||
|
|
||||||
%.o: %.c
|
|
||||||
@echo CC $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
|
||||||
|
|
||||||
### Dependencies:
|
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
|
||||||
DEPFILE = .dependencies
|
|
||||||
$(DEPFILE): Makefile
|
|
||||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
|
||||||
|
|
||||||
-include $(DEPFILE)
|
|
||||||
|
|
||||||
### Targets:
|
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
|
||||||
@echo LD $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
|
||||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
|
||||||
|
|
||||||
install: install-lib
|
|
||||||
|
|
||||||
dist: clean
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@echo Distribution package created as $(PACKAGE).tgz
|
|
||||||
|
|
||||||
clean:
|
|
||||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
|
@ -1,19 +0,0 @@
|
|||||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
|
||||||
|
|
||||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
|
|
||||||
Project's homepage: https://www.tvdr.de
|
|
||||||
|
|
||||||
Latest version available at: https://www.tvdr.de
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Description:
|
|
||||||
|
|
||||||
The special handling of EPG events with table id 0x00 has been dropped
|
|
||||||
in VDR version 1.7.26, and replaced by a more felxible "EPG Handler"
|
|
||||||
concept. You can use this plugin to get the previous functionality back.
|
|
@ -1,98 +0,0 @@
|
|||||||
/*
|
|
||||||
* epgtableid0.c: A plugin for the Video Disk Recorder
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: epgtableid0.c 4.1 2018/04/10 13:00:18 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <vdr/epg.h>
|
|
||||||
#include <vdr/plugin.h>
|
|
||||||
|
|
||||||
static const char *VERSION = "2.4.0";
|
|
||||||
static const char *DESCRIPTION = "EPG handler for events with table id 0x00";
|
|
||||||
|
|
||||||
// --- cTable0Handler --------------------------------------------------------
|
|
||||||
|
|
||||||
class cTable0Handler : public cEpgHandler {
|
|
||||||
private:
|
|
||||||
bool Ignore(cEvent *Event) { return Event->TableID() == 0x00; }
|
|
||||||
public:
|
|
||||||
virtual bool SetEventID(cEvent *Event, tEventID EventID);
|
|
||||||
virtual bool SetStartTime(cEvent *Event, time_t StartTime);
|
|
||||||
virtual bool SetDuration(cEvent *Event, int Duration);
|
|
||||||
virtual bool SetTitle(cEvent *Event, const char *Title);
|
|
||||||
virtual bool SetShortText(cEvent *Event, const char *ShortText);
|
|
||||||
virtual bool SetDescription(cEvent *Event, const char *Description);
|
|
||||||
virtual bool SetContents(cEvent *Event, uchar *Contents);
|
|
||||||
virtual bool SetParentalRating(cEvent *Event, int ParentalRating);
|
|
||||||
virtual bool SetVps(cEvent *Event, time_t Vps);
|
|
||||||
virtual bool FixEpgBugs(cEvent *Event);
|
|
||||||
};
|
|
||||||
|
|
||||||
bool cTable0Handler::SetEventID(cEvent *Event, tEventID EventID)
|
|
||||||
{
|
|
||||||
return Ignore(Event);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cTable0Handler::SetStartTime(cEvent *Event, time_t StartTime)
|
|
||||||
{
|
|
||||||
return Ignore(Event);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cTable0Handler::SetDuration(cEvent *Event, int Duration)
|
|
||||||
{
|
|
||||||
return Ignore(Event);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cTable0Handler::SetTitle(cEvent *Event, const char *Title)
|
|
||||||
{
|
|
||||||
return Ignore(Event);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cTable0Handler::SetShortText(cEvent *Event, const char *ShortText)
|
|
||||||
{
|
|
||||||
return Ignore(Event);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cTable0Handler::SetDescription(cEvent *Event, const char *Description)
|
|
||||||
{
|
|
||||||
return Ignore(Event);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cTable0Handler::SetContents(cEvent *Event, uchar *Contents)
|
|
||||||
{
|
|
||||||
return Ignore(Event);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cTable0Handler::SetParentalRating(cEvent *Event, int ParentalRating)
|
|
||||||
{
|
|
||||||
return Ignore(Event);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cTable0Handler::SetVps(cEvent *Event, time_t Vps)
|
|
||||||
{
|
|
||||||
return Ignore(Event);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cTable0Handler::FixEpgBugs(cEvent *Event)
|
|
||||||
{
|
|
||||||
return Ignore(Event);
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cPluginEpgtableid0 ----------------------------------------------------
|
|
||||||
|
|
||||||
class cPluginEpgtableid0 : public cPlugin {
|
|
||||||
public:
|
|
||||||
virtual const char *Version(void) { return VERSION; }
|
|
||||||
virtual const char *Description(void) { return DESCRIPTION; }
|
|
||||||
virtual bool Initialize(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
bool cPluginEpgtableid0::Initialize(void)
|
|
||||||
{
|
|
||||||
new cTable0Handler;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
VDRPLUGINCREATOR(cPluginEpgtableid0); // Don't touch this!
|
|
@ -1,105 +0,0 @@
|
|||||||
VDR Plugin 'hello' Revision History
|
|
||||||
-----------------------------------
|
|
||||||
|
|
||||||
2002-05-09: Version 0.0.1
|
|
||||||
|
|
||||||
- Initial revision.
|
|
||||||
|
|
||||||
2002-05-11: Version 0.0.2
|
|
||||||
|
|
||||||
- Added setup parameters and a Setup menu to adjust them.
|
|
||||||
|
|
||||||
2002-05-12: Version 0.0.3
|
|
||||||
|
|
||||||
- Changed return type of cPluginHello::Start().
|
|
||||||
- Added cPluginHello::Housekeeping().
|
|
||||||
- Modified package generation.
|
|
||||||
|
|
||||||
2002-05-17: Version 0.0.4
|
|
||||||
|
|
||||||
- Makefile improvements.
|
|
||||||
|
|
||||||
2002-08-04: Version 0.0.5
|
|
||||||
|
|
||||||
- Added a missing #include.
|
|
||||||
|
|
||||||
2002-09-21: Version 0.0.6
|
|
||||||
|
|
||||||
- Fixed Makefile for NEWSTRUCT driver.
|
|
||||||
|
|
||||||
2002-10-26: Version 0.0.7
|
|
||||||
|
|
||||||
- Fixed a typo.
|
|
||||||
|
|
||||||
2002-11-01: Version 0.0.8
|
|
||||||
|
|
||||||
- Completely switched to the new CVS HEAD version of the linux-dvb driver.
|
|
||||||
The NEWSTRUCT compile time switch is now obsolete. The required driver is now
|
|
||||||
the CVS HEAD version dated 2002-11-01 or later.
|
|
||||||
- Introduced Make.config.
|
|
||||||
|
|
||||||
2002-11-23: Version 0.0.9
|
|
||||||
|
|
||||||
- Changed return type of MainMenuAction().
|
|
||||||
|
|
||||||
2002-12-13: Version 0.1.0
|
|
||||||
|
|
||||||
- Changed setting of CXX and CXXFLAGS variables in Makefile.
|
|
||||||
|
|
||||||
2006-04-22: Version 0.1.1
|
|
||||||
|
|
||||||
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
|
|
||||||
|
|
||||||
2007-08-11: Version 0.2.0
|
|
||||||
|
|
||||||
- Switched to 'gettext' internationalization.
|
|
||||||
|
|
||||||
2007-08-15: Version 0.2.1
|
|
||||||
|
|
||||||
- Moved the "all" target in the Makefile before the "Implicit rules",
|
|
||||||
so that a plain "make" will compile everything.
|
|
||||||
|
|
||||||
2008-03-18: Version 0.2.2
|
|
||||||
|
|
||||||
- Updated the Croatian language texts (thanks to Adrian Caval).
|
|
||||||
|
|
||||||
2008-09-06: Version 0.2.3
|
|
||||||
|
|
||||||
- Updated the Turkish language texts (thanks to Oktay Yolgeçen).
|
|
||||||
|
|
||||||
2009-12-06: Version 0.2.4
|
|
||||||
|
|
||||||
- Several code modifications to avoid compiler warnings (thanks to Winfried Köhler).
|
|
||||||
|
|
||||||
2010-02-28: Version 0.2.5
|
|
||||||
|
|
||||||
- Added Lithuanian language translations (thanks to Valdemaras Pipiras).
|
|
||||||
|
|
||||||
2012-12-27: Version 0.2.6
|
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
|
||||||
|
|
||||||
2013-01-12: Version 0.2.7
|
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
|
||||||
|
|
||||||
2013-03-31: Version 2.0.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2014-01-01: Version 2.1.1
|
|
||||||
|
|
||||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
|
||||||
|
|
||||||
2015-02-19: Version 2.2.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2018-04-15: Version 2.4.0
|
|
||||||
|
|
||||||
- Updated the French OSD texts (thanks to Bernard Jaulin).
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2021-12-27: Version 2.6.0
|
|
||||||
|
|
||||||
- Official release.
|
|
@ -1,128 +0,0 @@
|
|||||||
#
|
|
||||||
# Makefile for a Video Disk Recorder plugin
|
|
||||||
#
|
|
||||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
|
||||||
|
|
||||||
# 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 = hello
|
|
||||||
|
|
||||||
### The version number of this plugin (taken from the main source file):
|
|
||||||
|
|
||||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
|
||||||
|
|
||||||
### The directory environment:
|
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
|
||||||
PKG_CONFIG ?= pkg-config
|
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
|
||||||
LIBDIR = $(call PKGCFG,libdir)
|
|
||||||
LOCDIR = $(call PKGCFG,locdir)
|
|
||||||
PLGCFG = $(call PKGCFG,plgcfg)
|
|
||||||
#
|
|
||||||
TMPDIR ?= /tmp
|
|
||||||
|
|
||||||
### The compiler options:
|
|
||||||
|
|
||||||
export CFLAGS = $(call PKGCFG,cflags)
|
|
||||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
|
||||||
|
|
||||||
### 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 +=
|
|
||||||
|
|
||||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
|
||||||
|
|
||||||
### The object files (add further files here):
|
|
||||||
|
|
||||||
OBJS = $(PLUGIN).o
|
|
||||||
|
|
||||||
### The main target:
|
|
||||||
|
|
||||||
all: $(SOFILE) i18n
|
|
||||||
|
|
||||||
### Implicit rules:
|
|
||||||
|
|
||||||
%.o: %.c
|
|
||||||
@echo CC $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
|
||||||
|
|
||||||
### Dependencies:
|
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
|
||||||
DEPFILE = .dependencies
|
|
||||||
$(DEPFILE): Makefile
|
|
||||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
|
||||||
|
|
||||||
-include $(DEPFILE)
|
|
||||||
|
|
||||||
### Internationalization (I18N):
|
|
||||||
|
|
||||||
PODIR = po
|
|
||||||
I18Npo = $(wildcard $(PODIR)/*.po)
|
|
||||||
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
|
||||||
I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
|
||||||
I18Npot = $(PODIR)/$(PLUGIN).pot
|
|
||||||
|
|
||||||
%.mo: %.po
|
|
||||||
@echo MO $@
|
|
||||||
$(Q)msgfmt -c -o $@ $<
|
|
||||||
|
|
||||||
$(I18Npot): $(wildcard *.c)
|
|
||||||
@echo GT $@
|
|
||||||
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
|
|
||||||
|
|
||||||
%.po: $(I18Npot)
|
|
||||||
@echo PO $@
|
|
||||||
$(Q)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)
|
|
||||||
@echo LD $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
|
||||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
|
||||||
|
|
||||||
install: install-lib install-i18n
|
|
||||||
|
|
||||||
dist: $(I18Npo) clean
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@echo Distribution package created as $(PACKAGE).tgz
|
|
||||||
|
|
||||||
clean:
|
|
||||||
@-rm -f $(PODIR)/*.mo $(PODIR)/*.pot
|
|
||||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
|
@ -1,15 +0,0 @@
|
|||||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
|
||||||
|
|
||||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
|
|
||||||
Project's homepage: https://www.tvdr.de
|
|
||||||
|
|
||||||
Latest version available at: https://www.tvdr.de
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Description: This is a small demo of the VDR plugin interface.
|
|
@ -1,149 +0,0 @@
|
|||||||
/*
|
|
||||||
* hello.c: A plugin for the Video Disk Recorder
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: hello.c 4.1 2018/04/10 13:00:22 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <getopt.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <vdr/i18n.h>
|
|
||||||
#include <vdr/interface.h>
|
|
||||||
#include <vdr/plugin.h>
|
|
||||||
|
|
||||||
static const char *VERSION = "2.4.0";
|
|
||||||
static const char *DESCRIPTION = trNOOP("A friendly greeting");
|
|
||||||
static const char *MAINMENUENTRY = trNOOP("Hello");
|
|
||||||
|
|
||||||
class cPluginHello : public cPlugin {
|
|
||||||
private:
|
|
||||||
// Add any member variables or functions you may need here.
|
|
||||||
const char *option_a;
|
|
||||||
bool option_b;
|
|
||||||
public:
|
|
||||||
cPluginHello(void);
|
|
||||||
virtual ~cPluginHello();
|
|
||||||
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 Start(void);
|
|
||||||
virtual void Housekeeping(void);
|
|
||||||
virtual const char *MainMenuEntry(void) { return tr(MAINMENUENTRY); }
|
|
||||||
virtual cOsdObject *MainMenuAction(void);
|
|
||||||
virtual cMenuSetupPage *SetupMenu(void);
|
|
||||||
virtual bool SetupParse(const char *Name, const char *Value);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Global variables that control the overall behaviour:
|
|
||||||
|
|
||||||
int GreetingTime = 3;
|
|
||||||
int UseAlternateGreeting = false;
|
|
||||||
|
|
||||||
// --- cMenuSetupHello -------------------------------------------------------
|
|
||||||
|
|
||||||
class cMenuSetupHello : public cMenuSetupPage {
|
|
||||||
private:
|
|
||||||
int newGreetingTime;
|
|
||||||
int newUseAlternateGreeting;
|
|
||||||
protected:
|
|
||||||
virtual void Store(void);
|
|
||||||
public:
|
|
||||||
cMenuSetupHello(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
cMenuSetupHello::cMenuSetupHello(void)
|
|
||||||
{
|
|
||||||
newGreetingTime = GreetingTime;
|
|
||||||
newUseAlternateGreeting = UseAlternateGreeting;
|
|
||||||
Add(new cMenuEditIntItem( tr("Greeting time (s)"), &newGreetingTime));
|
|
||||||
Add(new cMenuEditBoolItem(tr("Use alternate greeting"), &newUseAlternateGreeting));
|
|
||||||
}
|
|
||||||
|
|
||||||
void cMenuSetupHello::Store(void)
|
|
||||||
{
|
|
||||||
SetupStore("GreetingTime", GreetingTime = newGreetingTime);
|
|
||||||
SetupStore("UseAlternateGreeting", UseAlternateGreeting = newUseAlternateGreeting);
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cPluginHello ----------------------------------------------------------
|
|
||||||
|
|
||||||
cPluginHello::cPluginHello(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!
|
|
||||||
option_a = NULL;
|
|
||||||
option_b = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
cPluginHello::~cPluginHello()
|
|
||||||
{
|
|
||||||
// Clean up after yourself!
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *cPluginHello::CommandLineHelp(void)
|
|
||||||
{
|
|
||||||
// Return a string that describes all known command line options.
|
|
||||||
return " -a ABC, --aaa=ABC do something nice with ABC\n"
|
|
||||||
" -b, --bbb activate 'plan B'\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cPluginHello::ProcessArgs(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
// Implement command line argument processing here if applicable.
|
|
||||||
static struct option long_options[] = {
|
|
||||||
{ "aaa", required_argument, NULL, 'a' },
|
|
||||||
{ "bbb", no_argument, NULL, 'b' },
|
|
||||||
{ NULL, no_argument, NULL, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
int c;
|
|
||||||
while ((c = getopt_long(argc, argv, "a:b", long_options, NULL)) != -1) {
|
|
||||||
switch (c) {
|
|
||||||
case 'a': option_a = optarg;
|
|
||||||
break;
|
|
||||||
case 'b': option_b = true;
|
|
||||||
break;
|
|
||||||
default: return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cPluginHello::Start(void)
|
|
||||||
{
|
|
||||||
// Start any background activities the plugin shall perform.
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cPluginHello::Housekeeping(void)
|
|
||||||
{
|
|
||||||
// Perform any cleanup or other regular tasks.
|
|
||||||
}
|
|
||||||
|
|
||||||
cOsdObject *cPluginHello::MainMenuAction(void)
|
|
||||||
{
|
|
||||||
// Perform the action when selected from the main VDR menu.
|
|
||||||
Interface->Confirm(UseAlternateGreeting ? tr("Howdy folks!") : tr("Hello world!"), GreetingTime);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
cMenuSetupPage *cPluginHello::SetupMenu(void)
|
|
||||||
{
|
|
||||||
// Return a setup menu in case the plugin supports one.
|
|
||||||
return new cMenuSetupHello;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cPluginHello::SetupParse(const char *Name, const char *Value)
|
|
||||||
{
|
|
||||||
// Parse your own setup parameters and store their values.
|
|
||||||
if (!strcasecmp(Name, "GreetingTime")) GreetingTime = atoi(Value);
|
|
||||||
else if (!strcasecmp(Name, "UseAlternateGreeting")) UseAlternateGreeting = atoi(Value);
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
VDRPLUGINCREATOR(cPluginHello); // Don't touch this!
|
|
@ -1,37 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Marc Rovira Vall <tm05462@salleURL.edu>, 2003
|
|
||||||
# Ramon Roca <ramon.roca@xcombo.com>, 2003
|
|
||||||
# Jordi Vilà <jvila@tinet.org>, 2003
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
|
||||||
"Last-Translator: Jordi Vilà <jvila@tinet.org>\n"
|
|
||||||
"Language-Team: Catalan <vdr@linuxtv.org>\n"
|
|
||||||
"Language: ca\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr ""
|
|
@ -1,35 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Vladimír Bárta <vladimir.barta@k2atmitec.cz>, 2006
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
|
||||||
"Last-Translator: Vladimír Bárta <vladimir.barta@k2atmitec.cz>\n"
|
|
||||||
"Language-Team: Czech <vdr@linuxtv.org>\n"
|
|
||||||
"Language: cs\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr "Pøátelský pozdrav"
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr "Ahoj"
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr "Èas pozdravu (s)"
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr "Pou¾ít alternativní pozdrav"
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr "Nazdar vespolek!"
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr "Ahoj svìte!"
|
|
@ -1,35 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Mogens Elneff <mogens@elneff.dk>, 2004
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
|
||||||
"Last-Translator: Mogens Elneff <mogens@elneff.dk>\n"
|
|
||||||
"Language-Team: Danish <vdr@linuxtv.org>\n"
|
|
||||||
"Language: da\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr ""
|
|
@ -1,35 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Klaus Schmidinger <vdr@tvdr.de>, 2000
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
|
||||||
"Last-Translator: Klaus Schmidinger <vdr@tvdr.de>\n"
|
|
||||||
"Language-Team: German <vdr@linuxtv.org>\n"
|
|
||||||
"Language: de\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr "Ein freundlicher Gruß"
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr "Hallo"
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr "Dauer des Grußes (s)"
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr "Alternativen Gruß verwenden"
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr "Tach zusammen!"
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr "Hallo Welt!"
|
|
@ -1,35 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Dimitrios Dimitrakos <mail@dimitrios.de>, 2002
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
|
||||||
"Last-Translator: Dimitrios Dimitrakos <mail@dimitrios.de>\n"
|
|
||||||
"Language-Team: Greek <vdr@linuxtv.org>\n"
|
|
||||||
"Language: el\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-7\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr ""
|
|
@ -1,35 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Ruben Nunez Francisco <ruben.nunez@tang-it.com>, 2002
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
|
||||||
"Last-Translator: Ruben Nunez Francisco <ruben.nunez@tang-it.com>\n"
|
|
||||||
"Language-Team: Spanish <vdr@linuxtv.org>\n"
|
|
||||||
"Language: es\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr ""
|
|
@ -1,35 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Arthur Konovalov <artlov@gmail.com>, 2004, 2015
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
|
||||||
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
|
|
||||||
"Language-Team: Estonian <vdr@linuxtv.org>\n"
|
|
||||||
"Language: et\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr "Sõbralik tervitus"
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr "Tere"
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr "Tervituse kestus (s)"
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr "Vahelduv tervitus"
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr "Kuidas käsi käib?"
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr "Tere, maailm!"
|
|
@ -1,38 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Hannu Savolainen <hannu@opensound.com>, 2002
|
|
||||||
# Jaakko Hyvätti <jaakko@hyvatti.iki.fi>, 2002
|
|
||||||
# Niko Tarnanen <niko.tarnanen@hut.fi>, 2003
|
|
||||||
# Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>, 2003
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
|
||||||
"Last-Translator: Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>\n"
|
|
||||||
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
|
||||||
"Language: fi\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr "Ystävällisin terveisin"
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr "Hei"
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr "Tervehdysaika (s)"
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr "Käytä vaihtoehtoista tervehdystä"
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr "Mitä kuuluu?"
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr "Hei maailma!"
|
|
@ -1,39 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Jean-Claude Repetto <jc@repetto.org>, 2001
|
|
||||||
# Olivier Jacques <jacquesolivier@hotmail.com>, 2003
|
|
||||||
# Gregoire Favre <greg@magma.unil.ch>, 2003
|
|
||||||
# Nicolas Huillard <nhuillard@e-dition.fr>, 2005
|
|
||||||
# Bernard Jaulin <bernard.jaulin@gmail.com>, 2018
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2018-04-14 8:34+0200\n"
|
|
||||||
"Last-Translator: Bernard Jaulin <bernard.jaulin@gmail.com>\n"
|
|
||||||
"Language-Team: French <vdr@linuxtv.org>\n"
|
|
||||||
"Language: fr\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr "Bien le bonjour"
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr "Hello"
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr "Durée pour le salut (s)"
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr "Changer de salutation"
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr "Bonjour à tous !"
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr "Bonjour le monde !"
|
|
@ -1,35 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Adrian Caval <anrxc@sysphere.org>, 2008
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2008-03-17 19:52+0100\n"
|
|
||||||
"Last-Translator: Adrian Caval <anrxc@sysphere.org>\n"
|
|
||||||
"Language-Team: Croatian <vdr@linuxtv.org>\n"
|
|
||||||
"Language: hr\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr "Prijateljska dobrodo¹lica"
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr "Pozdrav"
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr "Trajanje dobrodo¹lice (s)"
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr "Koristi alternativni pozdrav"
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr "Pozdrav ljudi!"
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr "Pozdrav svijete!"
|
|
@ -1,36 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Istvan Koenigsberger <istvnko@hotmail.com>, 2002
|
|
||||||
# Guido Josten <guido.josten@t-online.de>, 2002
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
|
||||||
"Last-Translator: Istvan Koenigsberger <istvnko@hotmail.com>, Guido Josten <guido.josten@t-online.de>\n"
|
|
||||||
"Language-Team: Hungarian <vdr@linuxtv.org>\n"
|
|
||||||
"Language: hu\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr ""
|
|
@ -1,35 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Diego Pierotto <vdr-italian@tiscali.it>, 2008
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2008-01-27 20:11+0100\n"
|
|
||||||
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
|
|
||||||
"Language-Team: Italian <vdr@linuxtv.org>\n"
|
|
||||||
"Language: it\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr "Un saluto cordiale"
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr "Ciao"
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr "Tempo saluto (s)"
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr "Utilizza saluto alternativo"
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr "Come state gente!"
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr "Ciao mondo!"
|
|
@ -1,35 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Valdemaras Pipiras <varas@ambernet.lt>, 2009
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2009-12-08 12:18+0200\n"
|
|
||||||
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
|
|
||||||
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
|
|
||||||
"Language: lt\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr "Draugiškas labas"
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr "Labas!"
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr "Pasveikinomo laikas (s)"
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr "Naudoti alternatyvų pasveikinimą"
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr "Kaip yr chebryte?"
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr "Labas pasauli!"
|
|
@ -1,37 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Arnold Niessen <niessen@iae.nl> <arnold.niessen@philips.com>, 2001
|
|
||||||
# Hans Dingemans <hans.dingemans@tacticalops.nl>, 2003
|
|
||||||
# Maarten Wisse <Maarten.Wisse@urz.uni-hd.de>, 2005
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
|
||||||
"Last-Translator: Maarten Wisse <Maarten.Wisse@urz.uni-hd.de>\n"
|
|
||||||
"Language-Team: Dutch <vdr@linuxtv.org>\n"
|
|
||||||
"Language: nl\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr ""
|
|
@ -1,36 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Jørgen Tvedt <pjtvedt@online.no>, 2001
|
|
||||||
# Truls Slevigen <truls@slevigen.no>, 2002
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
|
||||||
"Last-Translator: Truls Slevigen <truls@slevigen.no>\n"
|
|
||||||
"Language-Team: Norwegian Nynorsk <vdr@linuxtv.org>\n"
|
|
||||||
"Language: nn\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr ""
|
|
@ -1,38 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Michael Rakowski <mrak@gmx.de>, 2002
|
|
||||||
# Tomasz Maciej Nowak <tmn505@gmail.com>, 2018
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2018-02-19 00:41+0100\n"
|
|
||||||
"Last-Translator: Tomasz Maciej Nowak <tmn505@gmail.com>\n"
|
|
||||||
"Language-Team: Polish <vdr@linuxtv.org>\n"
|
|
||||||
"Language: pl_PL\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
|
||||||
"X-Generator: Poedit 2.0.6\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr "Przyjazne pozdrowienie"
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr "Witaj"
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr "Czas pozdrowienia (s)"
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr "Użyj alternatywnego pozdrowienia"
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr "Siema ziomy!"
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr "Witaj świecie!"
|
|
@ -1,35 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Paulo Lopes <pmml@netvita.pt>, 2001
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
|
||||||
"Last-Translator: Paulo Lopes <pmml@netvita.pt>\n"
|
|
||||||
"Language-Team: Portuguese <vdr@linuxtv.org>\n"
|
|
||||||
"Language: pt\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr ""
|
|
@ -1,36 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Paul Lacatus <paul@campina.iiruc.ro>, 2002
|
|
||||||
# Lucian Muresan <lucianm@users.sourceforge.net>, 2004
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
|
||||||
"Last-Translator: Lucian Muresan <lucianm@users.sourceforge.net>\n"
|
|
||||||
"Language-Team: Romanian <vdr@linuxtv.org>\n"
|
|
||||||
"Language: ro\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr ""
|
|
@ -1,35 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Vyacheslav Dikonov <sdiconov@mail.ru>, 2004
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
|
||||||
"Last-Translator: Vyacheslav Dikonov <sdiconov@mail.ru>\n"
|
|
||||||
"Language-Team: Russian <vdr@linuxtv.org>\n"
|
|
||||||
"Language: ru\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-5\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr "´àãÖÕáÚÞÕ ßàØÒÕâáâÒØÕ"
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr "¿àØÒÕâ!"
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr "¿àÞÔÞÛÖØâÕÛìÝÞáâì ßàØÒÕâáâÒØï"
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr "°ÛìâÕàÝÐâØÒÝÞÕ ßàØÒÕâáâÒØÕ"
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr "ºÐÚ ßÞÖØÒÐÕâÕ?"
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr "·ÔàÐÒáâÒãÙ ÜØà!"
|
|
@ -1,35 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Vladimír Bárta <vladimir.barta@k2atmitec.cz>, 2006
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2009-09-30 09:48+0100\n"
|
|
||||||
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
|
|
||||||
"Language-Team: Slovak <vdr@linuxtv.org>\n"
|
|
||||||
"Language: sk\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr "Priateµský pozdrav"
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr "Ahoj"
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr "Èas pozdravu (s)"
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr "Pou¾i» náhradný pozdrav"
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr "Ahojte v¹etci!"
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr "Ahoj svet!"
|
|
@ -1,36 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Miha Setina <mihasetina@softhome.net>, 2000
|
|
||||||
# Matjaz Thaler <matjaz.thaler@guest.arnes.si>, 2003
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
|
||||||
"Last-Translator: Matjaz Thaler <matjaz.thaler@guest.arnes.si>\n"
|
|
||||||
"Language-Team: Slovenian <vdr@linuxtv.org>\n"
|
|
||||||
"Language: sl\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr ""
|
|
@ -1,36 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Tomas Prybil <tomas@prybil.se>, 2002
|
|
||||||
# Jan Ekholm <chakie@infa.abo.fi>, 2003
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
|
||||||
"Last-Translator: Tomas Prybil <tomas@prybil.se>\n"
|
|
||||||
"Language-Team: Swedish <vdr@linuxtv.org>\n"
|
|
||||||
"Language: sv\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr ""
|
|
@ -1,35 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Oktay Yolgeçen <oktay_73@yahoo.de>, 2007
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2008-05-12 22:34:4800\n"
|
|
||||||
"Last-Translator: Oktay Yolgeçen <oktay_73@yahoo.de>\n"
|
|
||||||
"Language-Team: Turkish <vdr@linuxtv.org>\n"
|
|
||||||
"Language: tr\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-9\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr "Dostça selam"
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr "Merhaba"
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr "Selam vakiti (s)"
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr "Alternatif selam kullan"
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr "Selam dostlar!"
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr "Merhaba dünya!"
|
|
@ -1,38 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Marc Rovira Vall <tm05462@salleURL.edu>, 2003
|
|
||||||
# Ramon Roca <ramon.roca@xcombo.com>, 2003
|
|
||||||
# Jordi Vilà <jvila@tinet.org>, 2003
|
|
||||||
# Nan Feng VDR <nfgx@21cn.com>, 2009
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2009-01-23 09:48+0800\n"
|
|
||||||
"Last-Translator: senin\n"
|
|
||||||
"Language-Team: Chinese (simplified) <vdr@linuxtv.org>\n"
|
|
||||||
"Language: zh_CN\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=utf-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr "友好的问候"
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr "你好"
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr "问候时间 (s)"
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr "使用替代贺卡"
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr "你好人!"
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr "世界您好!"
|
|
@ -1,93 +0,0 @@
|
|||||||
VDR Plugin 'osddemo' Revision History
|
|
||||||
-------------------------------------
|
|
||||||
|
|
||||||
2002-11-23: Version 0.0.1
|
|
||||||
|
|
||||||
- Initial revision.
|
|
||||||
|
|
||||||
2002-12-13: Version 0.1.0
|
|
||||||
|
|
||||||
- Changed setting of CXX and CXXFLAGS variables in Makefile.
|
|
||||||
|
|
||||||
2004-04-30: Version 0.1.1
|
|
||||||
|
|
||||||
- New OSD handling.
|
|
||||||
|
|
||||||
2007-08-15: Version 0.1.2
|
|
||||||
|
|
||||||
- Moved the "all" target in the Makefile before the "Implicit rules",
|
|
||||||
so that a plain "make" will compile everything.
|
|
||||||
|
|
||||||
2008-04-13: Version 0.1.3
|
|
||||||
|
|
||||||
- Fixed setting the OSD level (thanks to Wolfgang Rohdewald).
|
|
||||||
|
|
||||||
2011-02-20: Version 0.2.0
|
|
||||||
|
|
||||||
- Added support for TrueColor OSD.
|
|
||||||
|
|
||||||
2011-03-28: Version 0.2.1
|
|
||||||
|
|
||||||
- Added Cancel(3) to ~cTrueColorDemo() (thanks to Reinhard Nissl).
|
|
||||||
- Added a missing font deletion in cTrueColorDemo::Action() (thanks to Reinhard Nissl).
|
|
||||||
|
|
||||||
2011-04-17: Version 0.2.2
|
|
||||||
|
|
||||||
- Fixed a possible NULL pointer dereference in osddemo.c (reported by Paul Menzel).
|
|
||||||
|
|
||||||
2012-03-13: Version 0.2.3
|
|
||||||
|
|
||||||
- No longer using GetFont() (which is not thread safe) in the 'osddemo' plugin,
|
|
||||||
|
|
||||||
2012-12-27: Version 0.2.4
|
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
|
||||||
|
|
||||||
2013-01-12: Version 0.2.5
|
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
|
||||||
|
|
||||||
2013-02-13: Version 0.3.0
|
|
||||||
|
|
||||||
- Added demos of the DrawEllipse() and DrawSlope() function (press '1' or '2',
|
|
||||||
respectively).
|
|
||||||
|
|
||||||
2013-02-19: Version 0.3.1
|
|
||||||
|
|
||||||
- The demos can now also be ended with the "Back" key.
|
|
||||||
|
|
||||||
2013-03-31: Version 2.0.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2014-01-01: Version 2.1.1
|
|
||||||
|
|
||||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
|
||||||
|
|
||||||
2014-02-06: Version 2.1.2
|
|
||||||
|
|
||||||
- Fixed flickering if subtitles are active while the OSD demo is running.
|
|
||||||
- Fixed a possible crash in the OSD demo (reported by Christopher Reimer).
|
|
||||||
|
|
||||||
2015-02-19: Version 2.2.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2015-03-08: Version 2.3.1
|
|
||||||
|
|
||||||
- Now using cOsd::MaxPixmapSize().
|
|
||||||
- Fixed a vertical black line in the "TiledPixmaps" area on the rpihddevice OSD with
|
|
||||||
1280x800 pixel (thanks to Thomas Reufer).
|
|
||||||
- Added a demo case for storing images (thanks to Thomas Reufer).
|
|
||||||
|
|
||||||
2018-04-15: Version 2.4.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2020-10-12: Version 2.4.1
|
|
||||||
|
|
||||||
- Added test cases for alignment of semi-circles (press key '4').
|
|
||||||
|
|
||||||
2021-12-27: Version 2.6.0
|
|
||||||
|
|
||||||
- Official release.
|
|
@ -1,97 +0,0 @@
|
|||||||
#
|
|
||||||
# Makefile for a Video Disk Recorder plugin
|
|
||||||
#
|
|
||||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
|
||||||
|
|
||||||
# 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 = osddemo
|
|
||||||
|
|
||||||
### The version number of this plugin (taken from the main source file):
|
|
||||||
|
|
||||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
|
||||||
|
|
||||||
### The directory environment:
|
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
|
||||||
PKG_CONFIG ?= pkg-config
|
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
|
||||||
LIBDIR = $(call PKGCFG,libdir)
|
|
||||||
PLGCFG = $(call PKGCFG,plgcfg)
|
|
||||||
#
|
|
||||||
TMPDIR ?= /tmp
|
|
||||||
|
|
||||||
### The compiler options:
|
|
||||||
|
|
||||||
export CFLAGS = $(call PKGCFG,cflags)
|
|
||||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
|
||||||
|
|
||||||
### 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 +=
|
|
||||||
|
|
||||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
|
||||||
|
|
||||||
### The object files (add further files here):
|
|
||||||
|
|
||||||
OBJS = $(PLUGIN).o
|
|
||||||
|
|
||||||
### The main target:
|
|
||||||
|
|
||||||
all: $(SOFILE)
|
|
||||||
|
|
||||||
### Implicit rules:
|
|
||||||
|
|
||||||
%.o: %.c
|
|
||||||
@echo CC $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
|
||||||
|
|
||||||
### Dependencies:
|
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
|
||||||
DEPFILE = .dependencies
|
|
||||||
$(DEPFILE): Makefile
|
|
||||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
|
||||||
|
|
||||||
-include $(DEPFILE)
|
|
||||||
|
|
||||||
### Targets:
|
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
|
||||||
@echo LD $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
|
||||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
|
||||||
|
|
||||||
install: install-lib
|
|
||||||
|
|
||||||
dist: clean
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@echo Distribution package created as $(PACKAGE).tgz
|
|
||||||
|
|
||||||
clean:
|
|
||||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
|
@ -1,34 +0,0 @@
|
|||||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
|
||||||
|
|
||||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
|
|
||||||
Project's homepage: https://www.tvdr.de
|
|
||||||
|
|
||||||
Latest version available at: https://www.tvdr.de
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Description:
|
|
||||||
|
|
||||||
Demonstration of how a plugin can have its very own OSD setup.
|
|
||||||
|
|
||||||
It's a very primitive game that opens a small window in which the
|
|
||||||
user can draw lines with the Up, Down, Left and Right buttons.
|
|
||||||
The color buttons are used to switch color.
|
|
||||||
|
|
||||||
On a VDR system with TrueColor support it displays some of the
|
|
||||||
possibilities available with the TrueColor OSD. Once the "Animation"
|
|
||||||
pixmap is displayed, it can be moved around with the Up, Down, Left
|
|
||||||
and Right buttons. The Red button turns off the "Tiled Pixmaps"
|
|
||||||
display, and the Green button toggles the color display.
|
|
||||||
|
|
||||||
In both variants of the demo, pressing the '1' key displays all
|
|
||||||
possible ellipses that can be drawn with the DrawEllipse() function,
|
|
||||||
while pressing the '2' key shows all possible slopes the DrawSlope()
|
|
||||||
function can draw.
|
|
||||||
|
|
||||||
Press Ok to close the window.
|
|
@ -1,766 +0,0 @@
|
|||||||
/*
|
|
||||||
* osddemo.c: A plugin for the Video Disk Recorder
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: osddemo.c 4.5 2020/10/14 20:32:41 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <vdr/osd.h>
|
|
||||||
#include <vdr/plugin.h>
|
|
||||||
|
|
||||||
static const char *VERSION = "2.4.1";
|
|
||||||
static const char *DESCRIPTION = "Demo of arbitrary OSD setup";
|
|
||||||
static const char *MAINMENUENTRY = "Osd Demo";
|
|
||||||
|
|
||||||
// --- DrawEllipses ----------------------------------------------------------
|
|
||||||
|
|
||||||
void DrawEllipse(cOsd *Osd, int x1, int y1, int x2, int y2, int Quadrants)
|
|
||||||
{
|
|
||||||
Osd->DrawRectangle(x1 + 2, y1 + 2, x2 - 2, y2 - 2, clrGreen);
|
|
||||||
Osd->DrawEllipse(x1 + 3, y1 + 3, x2 - 3, y2 - 3, clrRed, Quadrants);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DrawEllipses(cOsd *Osd)
|
|
||||||
{
|
|
||||||
int xa = 0;
|
|
||||||
int ya = 0;
|
|
||||||
int xb = Osd->Width() - 1;
|
|
||||||
int yb = Osd->Height() - 1;
|
|
||||||
int x0 = xa;
|
|
||||||
int x5 = xb;
|
|
||||||
int x1 = x0 + (xb - xa) / 5;
|
|
||||||
int x2 = x0 + (xb - xa) * 2 / 5;
|
|
||||||
int x3 = x0 + (xb - xa) * 3 / 5;
|
|
||||||
int x4 = x0 + (xb - xa) * 4 / 5;
|
|
||||||
int y0 = ya;
|
|
||||||
int y4 = yb;
|
|
||||||
int y2 = (y0 + y4) / 2;
|
|
||||||
int y1 = (y0 + y2) / 2;
|
|
||||||
int y3 = (y2 + y4) / 2;
|
|
||||||
Osd->DrawRectangle(xa, ya, xb, yb, clrGray50);
|
|
||||||
DrawEllipse(Osd, x4, y0, x5, y4, 0);
|
|
||||||
DrawEllipse(Osd, x2, y1, x3, y2, 1);
|
|
||||||
DrawEllipse(Osd, x1, y1, x2, y2, 2);
|
|
||||||
DrawEllipse(Osd, x1, y2, x2, y3, 3);
|
|
||||||
DrawEllipse(Osd, x2, y2, x3, y3, 4);
|
|
||||||
DrawEllipse(Osd, x3, y1, x4, y3, 5);
|
|
||||||
DrawEllipse(Osd, x1, y0, x3, y1, 6);
|
|
||||||
DrawEllipse(Osd, x0, y1, x1, y3, 7);
|
|
||||||
DrawEllipse(Osd, x1, y3, x3, y4, 8);
|
|
||||||
DrawEllipse(Osd, x3, y0, x4, y1, -1);
|
|
||||||
DrawEllipse(Osd, x0, y0, x1, y1, -2);
|
|
||||||
DrawEllipse(Osd, x0, y3, x1, y4, -3);
|
|
||||||
DrawEllipse(Osd, x3, y3, x4, y4, -4);
|
|
||||||
Osd->Flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- DrawSlopes ------------------------------------------------------------
|
|
||||||
|
|
||||||
void DrawSlope(cOsd *Osd, int x1, int y1, int x2, int y2, int Type)
|
|
||||||
{
|
|
||||||
Osd->DrawRectangle(x1 + 2, y1 + 2, x2 - 2, y2 - 2, clrGreen);
|
|
||||||
Osd->DrawSlope(x1 + 3, y1 + 3, x2 - 3, y2 - 3, clrRed, Type);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DrawSlopes(cOsd *Osd)
|
|
||||||
{
|
|
||||||
int xa = 0;
|
|
||||||
int ya = 0;
|
|
||||||
int xb = Osd->Width() - 1;
|
|
||||||
int yb = Osd->Height() - 1;
|
|
||||||
int x0 = xa;
|
|
||||||
int x4 = xb;
|
|
||||||
int x2 = (x0 + x4) / 2;
|
|
||||||
int x1 = (x0 + x2) / 2;
|
|
||||||
int x3 = (x2 + x4) / 2;
|
|
||||||
int y0 = ya;
|
|
||||||
int y3 = yb;
|
|
||||||
int y2 = (y0 + y3) / 2;
|
|
||||||
int y1 = (y0 + y2) / 2;
|
|
||||||
Osd->DrawRectangle(xa, ya, xb, yb, clrGray50);
|
|
||||||
DrawSlope(Osd, x0, y0, x2, y1, 0);
|
|
||||||
DrawSlope(Osd, x2, y0, x4, y1, 1);
|
|
||||||
DrawSlope(Osd, x0, y1, x2, y2, 2);
|
|
||||||
DrawSlope(Osd, x2, y1, x4, y2, 3);
|
|
||||||
DrawSlope(Osd, x0, y2, x1, y3, 4);
|
|
||||||
DrawSlope(Osd, x1, y2, x2, y3, 5);
|
|
||||||
DrawSlope(Osd, x2, y2, x3, y3, 6);
|
|
||||||
DrawSlope(Osd, x3, y2, x4, y3, 7);
|
|
||||||
Osd->Flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- DrawImages ------------------------------------------------------------
|
|
||||||
|
|
||||||
struct tOsdImageRef {
|
|
||||||
int image;
|
|
||||||
cSize size;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define NUMOSDIMAGES 16
|
|
||||||
#define NUMOSDIMAGEVARIANTS 8
|
|
||||||
|
|
||||||
void DrawImages(cOsd *Osd)
|
|
||||||
{
|
|
||||||
// Create images:
|
|
||||||
cImage *images[NUMOSDIMAGEVARIANTS];
|
|
||||||
for (int i = 0; i < NUMOSDIMAGEVARIANTS; i++) {
|
|
||||||
images[i] = new cImage(cSize(
|
|
||||||
i == 0 || i == 1 ? Osd->MaxPixmapSize().Width() + 1 : rand() % Osd->Width(),
|
|
||||||
i == 0 || i == 2 ? Osd->MaxPixmapSize().Height() + 1 : rand() % Osd->Height()));
|
|
||||||
for (int x = 0; x < images[i]->Width(); x++) {
|
|
||||||
for (int y = 0; y < images[i]->Height(); y++) {
|
|
||||||
images[i]->SetPixel(cPoint(x, y),
|
|
||||||
(!x || !y || x == images[i]->Width() - 1 || y == images[i]->Height() - 1) ? clrWhite :
|
|
||||||
(x > images[i]->Width() / 2 ?
|
|
||||||
(y > images[i]->Height() / 2 ? clrBlue : clrGreen) :
|
|
||||||
(y > images[i]->Height() / 2 ? clrRed : clrYellow)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Store images:
|
|
||||||
tOsdImageRef osdImages[NUMOSDIMAGES];
|
|
||||||
for (int i = 0; i < NUMOSDIMAGES; i++) {
|
|
||||||
osdImages[i].image = cOsdProvider::StoreImage(*images[i % NUMOSDIMAGEVARIANTS]);
|
|
||||||
osdImages[i].size.Set(images[i % NUMOSDIMAGEVARIANTS]->Size());
|
|
||||||
}
|
|
||||||
// Delete images:
|
|
||||||
for (int i = 0; i < NUMOSDIMAGEVARIANTS; i++)
|
|
||||||
delete images[i];
|
|
||||||
// Draw images:
|
|
||||||
for (int i = 0; i < NUMOSDIMAGES; i++)
|
|
||||||
Osd->DrawImage(cPoint(rand() % (Osd->Width() + osdImages[i].size.Width()), rand() % (Osd->Height() + osdImages[i].size.Height())).Shifted(-osdImages[i].size.Width(), -osdImages[i].size.Height()), osdImages[i].image);
|
|
||||||
// Drop image references:
|
|
||||||
for (int i = 0; i < NUMOSDIMAGES; i++)
|
|
||||||
cOsdProvider::DropImage(osdImages[i].image);
|
|
||||||
Osd->Flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- DrawEllipseAlignments -------------------------------------------------
|
|
||||||
|
|
||||||
void DrawEllipseAlignments(cOsd *Osd)
|
|
||||||
{
|
|
||||||
cFont *Font = cFont::CreateFont(Setup.FontOsd, 20);
|
|
||||||
int xa = 0;
|
|
||||||
int ya = 0;
|
|
||||||
int xb = Osd->Width() - 1;
|
|
||||||
int yb = Osd->Height() - 1;
|
|
||||||
Osd->DrawRectangle(xa, ya, xb, yb, clrBlack);
|
|
||||||
int d = 50;
|
|
||||||
int a = d / 2 + 1;
|
|
||||||
int t = a * 2;
|
|
||||||
int n = 30;
|
|
||||||
for (int i = 0; i < n; i++) {
|
|
||||||
Osd->DrawRectangle(a, t, a + d - 1, t + d - 1, clrGreen);
|
|
||||||
Osd->DrawEllipse(a, t - d / 2, a + d - 1, t, clrGreen, 6);
|
|
||||||
Osd->DrawEllipse(a, t + d, a + d - 1, t + d + d / 2, clrGreen, 8);
|
|
||||||
Osd->DrawText(a + d / 3, t + d / 3, itoa(d), clrRed, clrGreen, Font);
|
|
||||||
a += d + 5;
|
|
||||||
d++;
|
|
||||||
}
|
|
||||||
d = 50;
|
|
||||||
a = d * 3;
|
|
||||||
n = 20;
|
|
||||||
for (int i = 0; i < n; i++) {
|
|
||||||
Osd->DrawRectangle(t, a, t + d - 1, a + d - 1, clrGreen);
|
|
||||||
Osd->DrawEllipse(t - d / 2, a, t, a + d - 1, clrGreen, 7);
|
|
||||||
Osd->DrawEllipse(t + d, a, t + d + d / 2, a + d - 1, clrGreen, 5);
|
|
||||||
Osd->DrawText(t + d / 3, a + d / 3, itoa(d), clrRed, clrGreen, Font);
|
|
||||||
a += d + 5;
|
|
||||||
d++;
|
|
||||||
}
|
|
||||||
d = 50;
|
|
||||||
a = d * 3;
|
|
||||||
t = d * 5;
|
|
||||||
n = 30;
|
|
||||||
for (int i = 0; i < n; i++) {
|
|
||||||
Osd->DrawRectangle(a, t, a + d - 1, t + d - 1, clrGreen);
|
|
||||||
Osd->DrawEllipse(a, t - d, a + d - 1, t, clrGreen, 2);
|
|
||||||
Osd->DrawEllipse(a, t + d, a + d - 1, t + d + d, clrGreen, 3);
|
|
||||||
Osd->DrawText(a + d / 3, t + d / 3, itoa(d), clrRed, clrGreen, Font);
|
|
||||||
a += d + 5;
|
|
||||||
d++;
|
|
||||||
}
|
|
||||||
d = 50;
|
|
||||||
a = d * 3;
|
|
||||||
t = d * 9;
|
|
||||||
n = 30;
|
|
||||||
for (int i = 0; i < n; i++) {
|
|
||||||
Osd->DrawRectangle(a, t, a + d - 1, t + d - 1, clrGreen);
|
|
||||||
Osd->DrawEllipse(a, t - d, a + d - 1, t, clrGreen, 1);
|
|
||||||
Osd->DrawEllipse(a, t + d, a + d - 1, t + d + d, clrGreen, 4);
|
|
||||||
Osd->DrawText(a + d / 3, t + d / 3, itoa(d), clrRed, clrGreen, Font);
|
|
||||||
a += d + 5;
|
|
||||||
d++;
|
|
||||||
}
|
|
||||||
d = 50;
|
|
||||||
a = d * 12;
|
|
||||||
t = d * 5;
|
|
||||||
n = 20;
|
|
||||||
for (int i = 0; i < n; i++) {
|
|
||||||
Osd->DrawRectangle(t, a, t + d - 1, a + d - 1, clrGreen);
|
|
||||||
Osd->DrawEllipse(t - d, a, t, a + d - 1, clrGreen, 2);
|
|
||||||
Osd->DrawEllipse(t + d, a, t + d + d, a + d - 1, clrGreen, 1);
|
|
||||||
Osd->DrawText(t + d / 3, a + d / 3, itoa(d), clrRed, clrGreen, Font);
|
|
||||||
a += d + 5;
|
|
||||||
d++;
|
|
||||||
}
|
|
||||||
d = 50;
|
|
||||||
a = d * 12;
|
|
||||||
t = d * 9;
|
|
||||||
n = 20;
|
|
||||||
for (int i = 0; i < n; i++) {
|
|
||||||
Osd->DrawRectangle(t, a, t + d - 1, a + d - 1, clrGreen);
|
|
||||||
Osd->DrawEllipse(t - d, a, t, a + d - 1, clrGreen, 3);
|
|
||||||
Osd->DrawEllipse(t + d, a, t + d + d, a + d - 1, clrGreen, 4);
|
|
||||||
Osd->DrawText(t + d / 3, a + d / 3, itoa(d), clrRed, clrGreen, Font);
|
|
||||||
a += d + 5;
|
|
||||||
d++;
|
|
||||||
}
|
|
||||||
Osd->Flush();
|
|
||||||
delete Font;
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cLineGame -------------------------------------------------------------
|
|
||||||
|
|
||||||
class cLineGame : public cOsdObject {
|
|
||||||
private:
|
|
||||||
cOsd *osd;
|
|
||||||
int x;
|
|
||||||
int y;
|
|
||||||
tColor color;
|
|
||||||
public:
|
|
||||||
cLineGame(void);
|
|
||||||
virtual ~cLineGame();
|
|
||||||
virtual void Show(void);
|
|
||||||
virtual eOSState ProcessKey(eKeys Key);
|
|
||||||
};
|
|
||||||
|
|
||||||
cLineGame::cLineGame(void)
|
|
||||||
{
|
|
||||||
osd = NULL;
|
|
||||||
x = y = 0;
|
|
||||||
color = clrRed;
|
|
||||||
}
|
|
||||||
|
|
||||||
cLineGame::~cLineGame()
|
|
||||||
{
|
|
||||||
delete osd;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cLineGame::Show(void)
|
|
||||||
{
|
|
||||||
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop());
|
|
||||||
if (osd) {
|
|
||||||
int x1 = cOsd::OsdWidth() - 1;
|
|
||||||
int y1 = cOsd::OsdHeight() - 1;
|
|
||||||
while (x1 > 0 && y1 > 0) {
|
|
||||||
tArea Area = { 0, 0, x1, y1, 4 };
|
|
||||||
if (osd->CanHandleAreas(&Area, 1) == oeOk) {
|
|
||||||
osd->SetAreas(&Area, 1);
|
|
||||||
osd->DrawRectangle(0, 0, osd->Width() - 1, osd->Height() - 1, clrGray50);
|
|
||||||
osd->Flush();
|
|
||||||
x = osd->Width() / 2;
|
|
||||||
y = osd->Height() / 2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
x1 = x1 * 9 / 10;
|
|
||||||
y1 = y1 * 9 / 10;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
eOSState cLineGame::ProcessKey(eKeys Key)
|
|
||||||
{
|
|
||||||
eOSState state = cOsdObject::ProcessKey(Key);
|
|
||||||
if (state == osUnknown) {
|
|
||||||
const int d = 4;
|
|
||||||
switch (Key & ~k_Repeat) {
|
|
||||||
case kUp: y = max(0, y - d); break;
|
|
||||||
case kDown: y = min(osd->Height() - d, y + d); break;
|
|
||||||
case kLeft: x = max(0, x - d); break;
|
|
||||||
case kRight: x = min(osd->Width() - d, x + d); break;
|
|
||||||
case kRed: color = clrRed; break;
|
|
||||||
case kGreen: color = clrGreen; break;
|
|
||||||
case kYellow: color = clrYellow; break;
|
|
||||||
case kBlue: color = clrBlue; break;
|
|
||||||
case k1: DrawEllipses(osd);
|
|
||||||
return osContinue;
|
|
||||||
case k2: DrawSlopes(osd);
|
|
||||||
return osContinue;
|
|
||||||
case kBack:
|
|
||||||
case kOk: return osEnd;
|
|
||||||
default: return state;
|
|
||||||
}
|
|
||||||
osd->DrawRectangle(x, y, x + d - 1, y + d - 1, color);
|
|
||||||
osd->Flush();
|
|
||||||
state = osContinue;
|
|
||||||
}
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cTrueColorDemo --------------------------------------------------------
|
|
||||||
|
|
||||||
class cTrueColorDemo : public cOsdObject, public cThread {
|
|
||||||
private:
|
|
||||||
cOsd *osd;
|
|
||||||
cPoint cursor;
|
|
||||||
cRect cursorLimits;
|
|
||||||
bool clockwise;
|
|
||||||
cPixmap *destroyablePixmap;
|
|
||||||
cPixmap *toggleablePixmap;
|
|
||||||
bool SetArea(void);
|
|
||||||
virtual void Action(void);
|
|
||||||
cPixmap *CreateTextPixmap(const char *s, int Line, int Layer, tColor ColorFg, tColor ColorBg, const cFont *Font);
|
|
||||||
public:
|
|
||||||
cTrueColorDemo(void);
|
|
||||||
virtual ~cTrueColorDemo();
|
|
||||||
virtual void Show(void);
|
|
||||||
virtual eOSState ProcessKey(eKeys Key);
|
|
||||||
};
|
|
||||||
|
|
||||||
cTrueColorDemo::cTrueColorDemo(void)
|
|
||||||
{
|
|
||||||
osd = NULL;
|
|
||||||
clockwise = true;
|
|
||||||
destroyablePixmap = NULL;
|
|
||||||
toggleablePixmap = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
cTrueColorDemo::~cTrueColorDemo()
|
|
||||||
{
|
|
||||||
Cancel(3);
|
|
||||||
delete osd;
|
|
||||||
}
|
|
||||||
|
|
||||||
cPixmap *cTrueColorDemo::CreateTextPixmap(const char *s, int Line, int Layer, tColor ColorFg, tColor ColorBg, const cFont *Font)
|
|
||||||
{
|
|
||||||
const int h = Font->Height(s);
|
|
||||||
int w = Font->Width(s);
|
|
||||||
cPixmap *Pixmap = osd->CreatePixmap(Layer, cRect((osd->Width() - w) / 2, Line, w, h));
|
|
||||||
if (Pixmap) {
|
|
||||||
Pixmap->Clear();
|
|
||||||
Pixmap->SetAlpha(0);
|
|
||||||
Pixmap->DrawText(cPoint(0, 0), s, ColorFg, ColorBg, Font, w);
|
|
||||||
}
|
|
||||||
return Pixmap;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cTrueColorDemo::Action(void)
|
|
||||||
{
|
|
||||||
cPixmap *FadeInPixmap = NULL;
|
|
||||||
cPixmap *FadeOutPixmap = NULL;
|
|
||||||
cPixmap *MovePixmap = NULL;
|
|
||||||
cPixmap *NextPixmap = NULL;
|
|
||||||
cPixmap *TilePixmap = NULL;
|
|
||||||
cPixmap *ScrollPixmap = NULL;
|
|
||||||
cPixmap *AnimPixmap = NULL;
|
|
||||||
cFont *OsdFont = cFont::CreateFont(Setup.FontOsd, Setup.FontOsdSize);
|
|
||||||
cFont *SmlFont = cFont::CreateFont(Setup.FontSml, Setup.FontSmlSize);
|
|
||||||
cFont *LrgFont = cFont::CreateFont(Setup.FontOsd, osd->Height() / 10);
|
|
||||||
int FrameTime = 40; // ms
|
|
||||||
int FadeTime = 1000; // ms
|
|
||||||
int MoveTime = 4000; // ms
|
|
||||||
int TileTime = 6000; // ms
|
|
||||||
int ScrollWaitTime = 1000; // ms
|
|
||||||
int ScrollLineTime = 200; // ms
|
|
||||||
int ScrollTotalTime = 8000; // ms
|
|
||||||
uint64_t Start = 0;
|
|
||||||
uint64_t ScrollStartTime = 0;
|
|
||||||
int ScrollLineNumber = 0;
|
|
||||||
cPoint MoveStart, MoveEnd;
|
|
||||||
cPoint TileStart, TileEnd;
|
|
||||||
cPoint ScrollStart, ScrollEnd;
|
|
||||||
int Line = osd->Height() / 20;
|
|
||||||
int StartLine = Line;
|
|
||||||
cPoint OldCursor;
|
|
||||||
int State = 0;
|
|
||||||
while (Running()) {
|
|
||||||
cPixmap::Lock();
|
|
||||||
bool Animated = false;
|
|
||||||
uint64_t Now = cTimeMs::Now();
|
|
||||||
if (FadeInPixmap) {
|
|
||||||
double t = min(double(Now - Start) / FadeTime, 1.0);
|
|
||||||
int Alpha = t * ALPHA_OPAQUE;
|
|
||||||
FadeInPixmap->SetAlpha(Alpha);
|
|
||||||
if (t >= 1)
|
|
||||||
FadeInPixmap = NULL;
|
|
||||||
Animated = true;
|
|
||||||
}
|
|
||||||
if (FadeOutPixmap) {
|
|
||||||
double t = min(double(Now - Start) / FadeTime, 1.0);
|
|
||||||
int Alpha = ALPHA_OPAQUE - t * ALPHA_OPAQUE;
|
|
||||||
FadeOutPixmap->SetAlpha(Alpha);
|
|
||||||
if (t >= 1)
|
|
||||||
FadeOutPixmap = NULL;
|
|
||||||
Animated = true;
|
|
||||||
}
|
|
||||||
if (MovePixmap) {
|
|
||||||
double t = min(double(Now - Start) / MoveTime, 1.0);
|
|
||||||
int x = MoveStart.X() + t * (MoveEnd.X() - MoveStart.X());
|
|
||||||
int y = MoveStart.Y() + t * (MoveEnd.Y() - MoveStart.Y());
|
|
||||||
cRect r = MovePixmap->ViewPort();
|
|
||||||
r.SetPoint(x, y);
|
|
||||||
MovePixmap->SetViewPort(r);
|
|
||||||
if (t >= 1)
|
|
||||||
MovePixmap = NULL;
|
|
||||||
Animated = true;
|
|
||||||
}
|
|
||||||
if (TilePixmap) {
|
|
||||||
double t = min(double(Now - Start) / TileTime, 1.0);
|
|
||||||
int x = TileStart.X() + t * (TileEnd.X() - TileStart.X());
|
|
||||||
int y = TileStart.Y() + t * (TileEnd.Y() - TileStart.Y());
|
|
||||||
TilePixmap->SetDrawPortPoint(cPoint(x, y));
|
|
||||||
if (t >= 1) {
|
|
||||||
destroyablePixmap = TilePixmap;
|
|
||||||
TilePixmap = NULL;
|
|
||||||
}
|
|
||||||
Animated = true;
|
|
||||||
}
|
|
||||||
if (ScrollPixmap) {
|
|
||||||
if (int(Now - Start) > ScrollWaitTime) {
|
|
||||||
if (ScrollStartTime) {
|
|
||||||
double t = min(double(Now - ScrollStartTime) / ScrollLineTime, 1.0);
|
|
||||||
int x = ScrollStart.X() + t * (ScrollEnd.X() - ScrollStart.X());
|
|
||||||
int y = ScrollStart.Y() + t * (ScrollEnd.Y() - ScrollStart.Y());
|
|
||||||
ScrollPixmap->SetDrawPortPoint(cPoint(x, y));
|
|
||||||
if (t >= 1) {
|
|
||||||
if (int(Now - Start) < ScrollTotalTime) {
|
|
||||||
cRect r = ScrollPixmap->DrawPort();
|
|
||||||
r.SetPoint(-r.X(), -r.Y());
|
|
||||||
ScrollPixmap->Pan(cPoint(0, 0), r);
|
|
||||||
cString s = cString::sprintf("Line %d", ++ScrollLineNumber);
|
|
||||||
ScrollPixmap->DrawRectangle(cRect(0, ScrollPixmap->ViewPort().Height(), ScrollPixmap->DrawPort().Width(), ScrollPixmap->DrawPort().Height()), clrTransparent);
|
|
||||||
ScrollPixmap->DrawText(cPoint(0, ScrollPixmap->ViewPort().Height()), s, clrYellow, clrTransparent, OsdFont);
|
|
||||||
ScrollStartTime = Now;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
FadeOutPixmap = ScrollPixmap;
|
|
||||||
ScrollPixmap = NULL;
|
|
||||||
Start = cTimeMs::Now();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ScrollStartTime = Now;
|
|
||||||
}
|
|
||||||
Animated = true;
|
|
||||||
}
|
|
||||||
if (AnimPixmap) {
|
|
||||||
int d = AnimPixmap->ViewPort().Height();
|
|
||||||
if (clockwise)
|
|
||||||
d = -d;
|
|
||||||
cPoint p = AnimPixmap->DrawPort().Point().Shifted(0, d);
|
|
||||||
if (clockwise && p.Y() <= -AnimPixmap->DrawPort().Height())
|
|
||||||
p.SetY(0);
|
|
||||||
else if (!clockwise && p.Y() > 0)
|
|
||||||
p.SetY(-(AnimPixmap->DrawPort().Height() - AnimPixmap->ViewPort().Height()));
|
|
||||||
AnimPixmap->SetDrawPortPoint(p);
|
|
||||||
}
|
|
||||||
if (!Animated) {
|
|
||||||
switch (State) {
|
|
||||||
case 0: {
|
|
||||||
FadeInPixmap = CreateTextPixmap("VDR", Line, 1, clrYellow, clrTransparent, LrgFont);
|
|
||||||
if (FadeInPixmap)
|
|
||||||
Line += FadeInPixmap->DrawPort().Height();
|
|
||||||
Start = cTimeMs::Now();
|
|
||||||
State++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 1: {
|
|
||||||
FadeInPixmap = CreateTextPixmap("Video Disk Recorder", Line, 3, clrYellow, clrTransparent, OsdFont);
|
|
||||||
if (FadeInPixmap)
|
|
||||||
Line += FadeInPixmap->DrawPort().Height();
|
|
||||||
Start = cTimeMs::Now();
|
|
||||||
State++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 2: {
|
|
||||||
FadeInPixmap = CreateTextPixmap("True Color OSD Demo", Line, 1, clrYellow, clrTransparent, OsdFont);
|
|
||||||
if (FadeInPixmap)
|
|
||||||
Line += FadeInPixmap->DrawPort().Height();
|
|
||||||
Start = cTimeMs::Now();
|
|
||||||
State++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 3: {
|
|
||||||
NextPixmap = CreateTextPixmap("Millions of colors", Line, 1, clrYellow, clrTransparent, LrgFont);
|
|
||||||
if (NextPixmap) {
|
|
||||||
FadeInPixmap = NextPixmap;
|
|
||||||
Start = cTimeMs::Now();
|
|
||||||
StartLine = Line;
|
|
||||||
Line += NextPixmap->DrawPort().Height();
|
|
||||||
}
|
|
||||||
State++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 4: {
|
|
||||||
Line += osd->Height() / 10;
|
|
||||||
int w = osd->Width() / 2;
|
|
||||||
int h = osd->Height() - Line - osd->Height() / 10;
|
|
||||||
cImage Image(cSize(w, h));
|
|
||||||
for (int y = 0; y < h; y++) {
|
|
||||||
for (int x = 0; x < w; x++)
|
|
||||||
Image.SetPixel(cPoint(x, y), HsvToColor(360 * double(x) / w, 1 - double(y) / h, 1) | 0xDF000000);
|
|
||||||
}
|
|
||||||
if (cPixmap *Pixmap = osd->CreatePixmap(2, cRect((osd->Width() - w) / 2, Line, w, h))) {
|
|
||||||
Pixmap->DrawImage(cPoint(0, 0), Image);
|
|
||||||
toggleablePixmap = Pixmap;
|
|
||||||
}
|
|
||||||
State++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 5: {
|
|
||||||
if (NextPixmap) {
|
|
||||||
MovePixmap = NextPixmap;
|
|
||||||
MoveStart = MovePixmap->ViewPort().Point();
|
|
||||||
MoveEnd.Set(osd->Width() - MovePixmap->ViewPort().Width(), osd->Height() - MovePixmap->ViewPort().Height());
|
|
||||||
Start = cTimeMs::Now();
|
|
||||||
}
|
|
||||||
State++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 6: {
|
|
||||||
TilePixmap = CreateTextPixmap("Tiled Pixmaps", StartLine, 1, clrRed, clrWhite, OsdFont);
|
|
||||||
if (TilePixmap) {
|
|
||||||
TilePixmap->SetViewPort(TilePixmap->ViewPort().Grown(TilePixmap->DrawPort().Width(), TilePixmap->DrawPort().Height()));
|
|
||||||
TilePixmap->SetAlpha(200);
|
|
||||||
TilePixmap->SetTile(true);
|
|
||||||
TileStart = TilePixmap->DrawPort().Point();
|
|
||||||
TileEnd = TileStart.Shifted(TilePixmap->ViewPort().Width(), TilePixmap->ViewPort().Height());
|
|
||||||
MovePixmap = TilePixmap;
|
|
||||||
MoveStart = MovePixmap->ViewPort().Point();
|
|
||||||
MoveEnd.Set(10, osd->Height() - MovePixmap->ViewPort().Height() - 10);
|
|
||||||
Start = cTimeMs::Now();
|
|
||||||
}
|
|
||||||
State++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 7: {
|
|
||||||
const char *Text = "Scrolling Pixmaps";
|
|
||||||
int w = OsdFont->Width(Text);
|
|
||||||
int h = OsdFont->Height();
|
|
||||||
if (cPixmap *Pixmap = osd->CreatePixmap(2, cRect((osd->Width() - w) / 2, StartLine, w, 2 * h), cRect(0, 0, w, 3 * h))) {
|
|
||||||
Pixmap->Clear();
|
|
||||||
Pixmap->DrawText(cPoint(0, 0), Text, clrYellow, clrTransparent, OsdFont);
|
|
||||||
cString s = cString::sprintf("Line %d", ++ScrollLineNumber);
|
|
||||||
Pixmap->DrawText(cPoint(0, Pixmap->ViewPort().Height()), s, clrYellow, clrTransparent, OsdFont);
|
|
||||||
ScrollPixmap = Pixmap;
|
|
||||||
ScrollStart.Set(0, 0);
|
|
||||||
ScrollEnd.Set(0, -h);
|
|
||||||
Start = cTimeMs::Now();
|
|
||||||
}
|
|
||||||
State++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 8: {
|
|
||||||
const char *Text = "Animation";
|
|
||||||
const int Size = SmlFont->Width(Text) + 10;
|
|
||||||
const int NumDots = 12;
|
|
||||||
const int AnimFrames = NumDots;
|
|
||||||
int Rows = min(osd->MaxPixmapSize().Height() / Size, AnimFrames);
|
|
||||||
int Cols = (AnimFrames + Rows - 1) / Rows;
|
|
||||||
// Temporarily using pixmap layer 0 to have the text alpha blended:
|
|
||||||
AnimPixmap = osd->CreatePixmap(0, cRect((osd->Width() - Size) / 2, StartLine, Size, Size), cRect(0, 0, Size * Cols, Size * Rows));
|
|
||||||
if (AnimPixmap) {
|
|
||||||
AnimPixmap->SetAlpha(0);
|
|
||||||
AnimPixmap->Clear();
|
|
||||||
const int Diameter = Size / 5;
|
|
||||||
for (int Frame = 0; Frame < AnimFrames; Frame++) {
|
|
||||||
int x0 = Frame / Rows * Size;
|
|
||||||
int y0 = Frame % Rows * Size;
|
|
||||||
AnimPixmap->DrawEllipse(cRect(x0, y0, Size, Size), 0xDDFFFFFF);
|
|
||||||
int xc = x0 + Size / 2 - Diameter / 2;
|
|
||||||
int yc = y0 + Size / 2 - Diameter / 2;
|
|
||||||
int Color = 0xFF;
|
|
||||||
int Delta = Color / NumDots / 3;
|
|
||||||
for (int a = 0; a < NumDots; a++) {
|
|
||||||
double t = 2 * M_PI * (Frame + a) / NumDots;
|
|
||||||
int x = xc + ((Size - Diameter) / 2 - 5) * cos(t);
|
|
||||||
int y = yc + ((Size - Diameter) / 2 - 5) * sin(t);
|
|
||||||
AnimPixmap->DrawEllipse(cRect(x, y, Diameter, Diameter), ArgbToColor(0xFF, Color, Color, Color));
|
|
||||||
Color -= Delta;
|
|
||||||
}
|
|
||||||
AnimPixmap->DrawText(cPoint(x0, y0), Text, clrBlack, clrTransparent, SmlFont, Size, Size, taCenter);
|
|
||||||
}
|
|
||||||
AnimPixmap->SetLayer(3); // now setting the actual pixmap layer
|
|
||||||
FadeInPixmap = AnimPixmap;
|
|
||||||
LOCK_THREAD;
|
|
||||||
OldCursor = cursor = AnimPixmap->ViewPort().Point();
|
|
||||||
cursorLimits.Set(0, 0, osd->Width(), osd->Height());
|
|
||||||
cursorLimits.SetRight(cursorLimits.Right() - Size);
|
|
||||||
cursorLimits.SetBottom(cursorLimits.Bottom() - Size);
|
|
||||||
cursorLimits.Grow(-10, -10);
|
|
||||||
Start = cTimeMs::Now();
|
|
||||||
}
|
|
||||||
State++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 9: {
|
|
||||||
LOCK_THREAD;
|
|
||||||
if (cursor != OldCursor) {
|
|
||||||
MovePixmap = AnimPixmap;
|
|
||||||
MoveStart = MovePixmap->ViewPort().Point();
|
|
||||||
MoveEnd = OldCursor = cursor;
|
|
||||||
MoveTime = 500;
|
|
||||||
Start = cTimeMs::Now();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
osd->Flush();
|
|
||||||
cPixmap::Unlock();
|
|
||||||
int Delta = cTimeMs::Now() - Now;
|
|
||||||
if (Delta < FrameTime)
|
|
||||||
cCondWait::SleepMs(FrameTime - Delta);
|
|
||||||
}
|
|
||||||
destroyablePixmap = NULL;
|
|
||||||
toggleablePixmap = NULL;
|
|
||||||
delete OsdFont;
|
|
||||||
delete SmlFont;
|
|
||||||
delete LrgFont;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cTrueColorDemo::SetArea(void)
|
|
||||||
{
|
|
||||||
if (osd) {
|
|
||||||
tArea Area = { 0, 0, cOsd::OsdWidth() - 1, cOsd::OsdHeight() - 1, 32 };
|
|
||||||
return osd->SetAreas(&Area, 1) == oeOk;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cTrueColorDemo::Show(void)
|
|
||||||
{
|
|
||||||
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop());
|
|
||||||
if (osd) {
|
|
||||||
if (SetArea()) {
|
|
||||||
osd->DrawRectangle(0, 0, osd->Width() - 1, osd->Height() - 1, clrGray50);
|
|
||||||
osd->Flush();
|
|
||||||
Start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
eOSState cTrueColorDemo::ProcessKey(eKeys Key)
|
|
||||||
{
|
|
||||||
eOSState state = cOsdObject::ProcessKey(Key);
|
|
||||||
if (state == osUnknown) {
|
|
||||||
LOCK_PIXMAPS;
|
|
||||||
LOCK_THREAD;
|
|
||||||
const int d = 80;
|
|
||||||
switch (Key & ~k_Repeat) {
|
|
||||||
case kUp: cursor.SetY(max(cursorLimits.Top(), cursor.Y() - d)); clockwise = false; break;
|
|
||||||
case kDown: cursor.SetY(min(cursorLimits.Bottom(), cursor.Y() + d)); clockwise = true; break;
|
|
||||||
case kLeft: cursor.SetX(max(cursorLimits.Left(), cursor.X() - d)); clockwise = false; break;
|
|
||||||
case kRight: cursor.SetX(min(cursorLimits.Right(), cursor.X() + d)); clockwise = true; break;
|
|
||||||
case kRed: if (destroyablePixmap) {
|
|
||||||
osd->DestroyPixmap(destroyablePixmap);
|
|
||||||
destroyablePixmap = NULL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case kGreen: if (toggleablePixmap)
|
|
||||||
toggleablePixmap->SetLayer(-toggleablePixmap->Layer());
|
|
||||||
break;
|
|
||||||
case k1: Cancel(3);
|
|
||||||
SetArea();
|
|
||||||
DrawEllipses(osd);
|
|
||||||
break;
|
|
||||||
case k2: Cancel(3);
|
|
||||||
SetArea();
|
|
||||||
DrawSlopes(osd);
|
|
||||||
break;
|
|
||||||
case k3: Cancel(3);
|
|
||||||
SetArea();
|
|
||||||
DrawImages(osd);
|
|
||||||
break;
|
|
||||||
case k4: Cancel(3);
|
|
||||||
SetArea();
|
|
||||||
DrawEllipseAlignments(osd);
|
|
||||||
return osContinue;
|
|
||||||
case kBack:
|
|
||||||
case kOk: return osEnd;
|
|
||||||
default: return state;
|
|
||||||
}
|
|
||||||
state = osContinue;
|
|
||||||
}
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cPluginOsddemo --------------------------------------------------------
|
|
||||||
|
|
||||||
class cPluginOsddemo : public cPlugin {
|
|
||||||
private:
|
|
||||||
// Add any member variables or functions you may need here.
|
|
||||||
public:
|
|
||||||
cPluginOsddemo(void);
|
|
||||||
virtual ~cPluginOsddemo();
|
|
||||||
virtual const char *Version(void) { return VERSION; }
|
|
||||||
virtual const char *Description(void) { return DESCRIPTION; }
|
|
||||||
virtual const char *CommandLineHelp(void);
|
|
||||||
virtual bool ProcessArgs(int argc, char *argv[]);
|
|
||||||
virtual bool Start(void);
|
|
||||||
virtual void Housekeeping(void);
|
|
||||||
virtual const char *MainMenuEntry(void) { return MAINMENUENTRY; }
|
|
||||||
virtual cOsdObject *MainMenuAction(void);
|
|
||||||
virtual cMenuSetupPage *SetupMenu(void);
|
|
||||||
virtual bool SetupParse(const char *Name, const char *Value);
|
|
||||||
};
|
|
||||||
|
|
||||||
cPluginOsddemo::cPluginOsddemo(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!
|
|
||||||
}
|
|
||||||
|
|
||||||
cPluginOsddemo::~cPluginOsddemo()
|
|
||||||
{
|
|
||||||
// Clean up after yourself!
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *cPluginOsddemo::CommandLineHelp(void)
|
|
||||||
{
|
|
||||||
// Return a string that describes all known command line options.
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cPluginOsddemo::ProcessArgs(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
// Implement command line argument processing here if applicable.
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cPluginOsddemo::Start(void)
|
|
||||||
{
|
|
||||||
// Start any background activities the plugin shall perform.
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cPluginOsddemo::Housekeeping(void)
|
|
||||||
{
|
|
||||||
// Perform any cleanup or other regular tasks.
|
|
||||||
}
|
|
||||||
|
|
||||||
cOsdObject *cPluginOsddemo::MainMenuAction(void)
|
|
||||||
{
|
|
||||||
// Perform the action when selected from the main VDR menu.
|
|
||||||
if (cOsdProvider::SupportsTrueColor())
|
|
||||||
return new cTrueColorDemo;
|
|
||||||
return new cLineGame;
|
|
||||||
}
|
|
||||||
|
|
||||||
cMenuSetupPage *cPluginOsddemo::SetupMenu(void)
|
|
||||||
{
|
|
||||||
// Return a setup menu in case the plugin supports one.
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cPluginOsddemo::SetupParse(const char *Name, const char *Value)
|
|
||||||
{
|
|
||||||
// Parse your own setup parameters and store their values.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
VDRPLUGINCREATOR(cPluginOsddemo); // Don't touch this!
|
|
@ -1,340 +0,0 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 2, June 1991
|
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
License is intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users. This
|
|
||||||
General Public License applies to most of the Free Software
|
|
||||||
Foundation's software and to any other program whose authors commit to
|
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
|
||||||
the GNU Lesser General Public License instead.) You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
this service if you wish), that you receive source code or can get it
|
|
||||||
if you want it, that you can change the software or use pieces of it
|
|
||||||
in new free programs; and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
|
||||||
These restrictions translate to certain responsibilities for you if you
|
|
||||||
distribute copies of the software, or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
|
||||||
you have. You must make sure that they, too, receive or can get the
|
|
||||||
source code. And you must show them these terms so they know their
|
|
||||||
rights.
|
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
|
||||||
distribute and/or modify the software.
|
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
|
||||||
that everyone understands that there is no warranty for this free
|
|
||||||
software. If the software is modified by someone else and passed on, we
|
|
||||||
want its recipients to know that what they have is not the original, so
|
|
||||||
that any problems introduced by others will not reflect on the original
|
|
||||||
authors' reputations.
|
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
|
||||||
program will individually obtain patent licenses, in effect making the
|
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
|
||||||
under the terms of this General Public License. The "Program", below,
|
|
||||||
refers to any such program or work, and a "work based on the Program"
|
|
||||||
means either the Program or any derivative work under copyright law:
|
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
|
||||||
source code as you receive it, in any medium, provided that you
|
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
notices that refer to this License and to the absence of any warranty;
|
|
||||||
and give any other recipients of the Program a copy of this License
|
|
||||||
along with the Program.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
|
||||||
of it, thus forming a work based on the Program, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
|
||||||
whole or in part contains or is derived from the Program or any
|
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
parties under the terms of this License.
|
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
|
||||||
when run, you must cause it, when started running for such
|
|
||||||
interactive use in the most ordinary way, to print or display an
|
|
||||||
announcement including an appropriate copyright notice and a
|
|
||||||
notice that there is no warranty (or else, saying that you provide
|
|
||||||
a warranty) and that users may redistribute the program under
|
|
||||||
these conditions, and telling the user how to view a copy of this
|
|
||||||
License. (Exception: if the Program itself is interactive but
|
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Program,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Program.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
|
||||||
under Section 2) in object code or executable form under the terms of
|
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
|
||||||
source code, which must be distributed under the terms of Sections
|
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
|
||||||
years, to give any third party, for a charge no more than your
|
|
||||||
cost of physically performing source distribution, a complete
|
|
||||||
machine-readable copy of the corresponding source code, to be
|
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
customarily used for software interchange; or,
|
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
|
||||||
to distribute corresponding source code. (This alternative is
|
|
||||||
allowed only for noncommercial distribution and only if you
|
|
||||||
received the program in object code or executable form with such
|
|
||||||
an offer, in accord with Subsection b above.)
|
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For an executable work, complete source
|
|
||||||
code means all the source code for all modules it contains, plus any
|
|
||||||
associated interface definition files, plus the scripts used to
|
|
||||||
control compilation and installation of the executable. However, as a
|
|
||||||
special exception, the source code distributed need not include
|
|
||||||
anything that is normally distributed (in either source or binary
|
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
|
||||||
operating system on which the executable runs, unless that component
|
|
||||||
itself accompanies the executable.
|
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
|
||||||
access to copy from a designated place, then offering equivalent
|
|
||||||
access to copy the source code from the same place counts as
|
|
||||||
distribution of the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
except as expressly provided under this License. Any attempt
|
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
void, and will automatically terminate your rights under this License.
|
|
||||||
However, parties who have received copies, or rights, from you under
|
|
||||||
this License will not have their licenses terminated so long as such
|
|
||||||
parties remain in full compliance.
|
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Program or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Program (or any work based on the
|
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Program or works based on it.
|
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
|
||||||
Program), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
|
||||||
these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties to
|
|
||||||
this License.
|
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Program at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Program by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Program.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
|
||||||
any particular circumstance, the balance of the section is intended to
|
|
||||||
apply and the section as a whole is intended to apply in other
|
|
||||||
circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system, which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Program under this License
|
|
||||||
may add an explicit geographical distribution limitation excluding
|
|
||||||
those countries, so that distribution is permitted only in or among
|
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
|
||||||
specifies a version number of this License which applies to it and "any
|
|
||||||
later version", you have the option of following the terms and conditions
|
|
||||||
either of that version or of any later version published by the Free
|
|
||||||
Software Foundation. If the Program does not specify a version number of
|
|
||||||
this License, you may choose any version ever published by the Free Software
|
|
||||||
Foundation.
|
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
|
||||||
programs whose distribution conditions are different, write to the author
|
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
of preserving the free status of all derivatives of our free software and
|
|
||||||
of promoting the sharing and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
|
||||||
when it starts in an interactive mode:
|
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) year name of author
|
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, the commands you use may
|
|
||||||
be called something other than `show w' and `show c'; they could even be
|
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License.
|
|
@ -1,122 +0,0 @@
|
|||||||
VDR Plugin 'pictures' Revision History
|
|
||||||
--------------------------------------
|
|
||||||
|
|
||||||
2008-01-13: Version 0.0.1
|
|
||||||
|
|
||||||
- Initial revision.
|
|
||||||
|
|
||||||
2008-01-19: Version 0.0.2
|
|
||||||
|
|
||||||
- Fixed the Play function (when used from a directory in the pictures menu
|
|
||||||
it always started with the next directory).
|
|
||||||
- Added Finnish texts (thanks to Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>).
|
|
||||||
|
|
||||||
2008-01-27: Version 0.0.3
|
|
||||||
|
|
||||||
- Added French texts (thanks to Patrice Staudt <patrice.staudt@laposte.net>).
|
|
||||||
|
|
||||||
2008-02-02: Version 0.0.4
|
|
||||||
|
|
||||||
- Added option -i to pic2mpg to ignore unknown file types.
|
|
||||||
|
|
||||||
2008-02-17: Version 0.0.5
|
|
||||||
|
|
||||||
- Fixed setting the OSD area.
|
|
||||||
- Introduced 'operator const void * ()' in cString to catch cases where operator*()
|
|
||||||
should be used.
|
|
||||||
|
|
||||||
2008-02-29: Version 0.0.6
|
|
||||||
|
|
||||||
- Made the 'pic2mpg' script of the 'pictures' plugin work with uppercase filename
|
|
||||||
extensions and relative paths (reported by Stefan Wagner <stefanwag@gmx.at>).
|
|
||||||
|
|
||||||
2008-03-14: Version 0.0.7
|
|
||||||
|
|
||||||
- Added Russian translations (thanks to Alexander Gross).
|
|
||||||
|
|
||||||
2009-12-06: Version 0.0.8
|
|
||||||
|
|
||||||
- Several code modifications to avoid compiler warnings (thanks to Winfried Köhler).
|
|
||||||
|
|
||||||
2010-02-28: Version 0.0.9
|
|
||||||
|
|
||||||
- Added Lithuanian language translations (thanks to Valdemaras Pipiras).
|
|
||||||
|
|
||||||
2011-02-20: Version 0.1.0
|
|
||||||
|
|
||||||
- Fixed reallocating memory (reported by Paul Menzel).
|
|
||||||
|
|
||||||
2011-07-23:
|
|
||||||
|
|
||||||
- Now rotating images according to the EXIF 'Orientation' parameter.
|
|
||||||
|
|
||||||
2011-08-14:
|
|
||||||
|
|
||||||
- The pic2mpg script now generates HD images (thanks to Andre Weidemann for his
|
|
||||||
support in using convert/ffmpeg). The old SD version is still available as
|
|
||||||
pic2mpg-sd.
|
|
||||||
|
|
||||||
2011-11-02:
|
|
||||||
|
|
||||||
- Fixed handling images that are rotated by 180 degrees in pic2mpg.
|
|
||||||
|
|
||||||
2012-01-08:
|
|
||||||
|
|
||||||
- Added option -o to pic2mpg.
|
|
||||||
|
|
||||||
2012-02-17:
|
|
||||||
|
|
||||||
- cReadDir::Next() now skips directory entries "." and "..".
|
|
||||||
|
|
||||||
2012-02-27: Version 0.1.2
|
|
||||||
|
|
||||||
- Removed an obsolete command line option.
|
|
||||||
|
|
||||||
2012-04-28: Version 0.1.3
|
|
||||||
|
|
||||||
- Added cPictureControl::GetHeader().
|
|
||||||
|
|
||||||
2012-12-27: Version 0.1.4
|
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
|
||||||
|
|
||||||
2013-01-12: Version 0.1.5
|
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
|
||||||
|
|
||||||
2013-03-31: Version 2.0.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2013-07-01:
|
|
||||||
|
|
||||||
- Added option -x to pic2mpg.
|
|
||||||
|
|
||||||
2014-01-01: Version 2.1.1
|
|
||||||
|
|
||||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
|
||||||
|
|
||||||
2015-02-19: Version 2.2.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2015-07-23: Version 2.3.1
|
|
||||||
|
|
||||||
- Added a missing 'const'.
|
|
||||||
|
|
||||||
2017-10-06: Version 2.3.2
|
|
||||||
|
|
||||||
- Adapted the pic2mpg script to new ffmpeg options.
|
|
||||||
- No longer using 'convert' to scale/rotate the pictures.
|
|
||||||
|
|
||||||
2018-04-15: Version 2.4.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2021-12-27: Version 2.6.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2022-12-05: Version 2.6.1
|
|
||||||
|
|
||||||
Fixed initializing cPictureControl.
|
|
@ -1,128 +0,0 @@
|
|||||||
#
|
|
||||||
# Makefile for a Video Disk Recorder plugin
|
|
||||||
#
|
|
||||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
|
||||||
|
|
||||||
# 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 = pictures
|
|
||||||
|
|
||||||
### The version number of this plugin (taken from the main source file):
|
|
||||||
|
|
||||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
|
||||||
|
|
||||||
### The directory environment:
|
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
|
||||||
PKG_CONFIG ?= pkg-config
|
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
|
||||||
LIBDIR = $(call PKGCFG,libdir)
|
|
||||||
LOCDIR = $(call PKGCFG,locdir)
|
|
||||||
PLGCFG = $(call PKGCFG,plgcfg)
|
|
||||||
#
|
|
||||||
TMPDIR ?= /tmp
|
|
||||||
|
|
||||||
### The compiler options:
|
|
||||||
|
|
||||||
export CFLAGS = $(call PKGCFG,cflags)
|
|
||||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
|
||||||
|
|
||||||
### 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 +=
|
|
||||||
|
|
||||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
|
||||||
|
|
||||||
### The object files (add further files here):
|
|
||||||
|
|
||||||
OBJS = $(PLUGIN).o entry.o menu.o player.o
|
|
||||||
|
|
||||||
### The main target:
|
|
||||||
|
|
||||||
all: $(SOFILE) i18n
|
|
||||||
|
|
||||||
### Implicit rules:
|
|
||||||
|
|
||||||
%.o: %.c
|
|
||||||
@echo CC $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
|
||||||
|
|
||||||
### Dependencies:
|
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
|
||||||
DEPFILE = .dependencies
|
|
||||||
$(DEPFILE): Makefile
|
|
||||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
|
||||||
|
|
||||||
-include $(DEPFILE)
|
|
||||||
|
|
||||||
### Internationalization (I18N):
|
|
||||||
|
|
||||||
PODIR = po
|
|
||||||
I18Npo = $(wildcard $(PODIR)/*.po)
|
|
||||||
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
|
||||||
I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
|
||||||
I18Npot = $(PODIR)/$(PLUGIN).pot
|
|
||||||
|
|
||||||
%.mo: %.po
|
|
||||||
@echo MO $@
|
|
||||||
$(Q)msgfmt -c -o $@ $<
|
|
||||||
|
|
||||||
$(I18Npot): $(wildcard *.c)
|
|
||||||
@echo GT $@
|
|
||||||
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
|
|
||||||
|
|
||||||
%.po: $(I18Npot)
|
|
||||||
@echo PO $@
|
|
||||||
$(Q)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)
|
|
||||||
@echo LD $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
|
||||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
|
||||||
|
|
||||||
install: install-lib install-i18n
|
|
||||||
|
|
||||||
dist: $(I18Npo) clean
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@echo Distribution package created as $(PACKAGE).tgz
|
|
||||||
|
|
||||||
clean:
|
|
||||||
@-rm -f $(PODIR)/*.mo $(PODIR)/*.pot
|
|
||||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
|
@ -1,119 +0,0 @@
|
|||||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
|
||||||
|
|
||||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
|
|
||||||
Project's homepage: https://www.tvdr.de
|
|
||||||
|
|
||||||
Latest version available at: https://www.tvdr.de
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Description:
|
|
||||||
============
|
|
||||||
|
|
||||||
The 'pictures' plugin implements a simple picture viewer.
|
|
||||||
|
|
||||||
There is already an 'image' plugin out there which has a lot more
|
|
||||||
functionality than this one, but it's way too complex for my taste,
|
|
||||||
and also converts the image files on-the-fly, which makes it slow
|
|
||||||
on slow hardware.
|
|
||||||
|
|
||||||
This plugin assumes that the pictures have already been converted to
|
|
||||||
MPEG frames (with the 'pic2mpg' script that comes with this archive),
|
|
||||||
and doesn't implement any fancy features like zooming, panning or
|
|
||||||
tiled previews. It's just a very simple viewer.
|
|
||||||
|
|
||||||
It also assumes a rather particular directory structure (see below),
|
|
||||||
which I have found to fit well for my needs. If you use a different
|
|
||||||
structure, the plugin should still work, but the information displayed
|
|
||||||
in the caption may not be as expected.
|
|
||||||
|
|
||||||
Remote control key functions while in the Pictures menu:
|
|
||||||
========================================================
|
|
||||||
|
|
||||||
- Left/right/Up/Down: navigate in the menu as usual.
|
|
||||||
- Ok: opens a directory or displays the selected
|
|
||||||
picture.
|
|
||||||
- Red/Play: start a slide show at the first picture in the
|
|
||||||
selected directory (or at the selected picture).
|
|
||||||
|
|
||||||
Remote control key functions while displaying pictures:
|
|
||||||
=======================================================
|
|
||||||
|
|
||||||
- Left/Right: advances to the previous/next picture. At the end of a directory
|
|
||||||
it automatically advances to the first picture of the next
|
|
||||||
directory and displays the caption.
|
|
||||||
- Up/Play: start the slide show.
|
|
||||||
- Down/Pause: stop the slide show.
|
|
||||||
- Blue/Stop: exit from the picture viewer.
|
|
||||||
- Green/Prev: skip to the first picture in the previous directory.
|
|
||||||
- Yellow/Next: skip to the first picture in the next directory.
|
|
||||||
- Ok: toggle the caption display.
|
|
||||||
- Back: return to the picture selection menu.
|
|
||||||
|
|
||||||
The slide show starts with the picture immediately following the one that
|
|
||||||
is currently visible, and continues until the last available picture,
|
|
||||||
automatically crossing directories as necessary.
|
|
||||||
|
|
||||||
Pressing any of the Left/Right, Green/Prev, Yellow/Next or Back keys
|
|
||||||
automatically stops an ongoing slide show.
|
|
||||||
|
|
||||||
Directory structure:
|
|
||||||
====================
|
|
||||||
|
|
||||||
The 'pictures' plugin requires a particular directory structure in order to
|
|
||||||
work properly. Starting at some base directory (e.g. "/path/to/pictures"),
|
|
||||||
there is one directory level marking the year in which the pictures were
|
|
||||||
taken, followed by a level with a properly sortable combination of month
|
|
||||||
and description, and finally the plain picture files, as in
|
|
||||||
|
|
||||||
/path/to/pictures/YEAR/MONTH_DESCRIPTION/*.jpg
|
|
||||||
|
|
||||||
For example
|
|
||||||
|
|
||||||
/path/to/pictures/2007/06a_Vacation_in_Colorado/dsc01234.jpg
|
|
||||||
/path/to/pictures/2007/06a_Vacation_in_Colorado/dsc01235.jpg
|
|
||||||
/path/to/pictures/2007/06b_Our_cat/dsc01236.jpg
|
|
||||||
|
|
||||||
The MONTH is "01" for January through "12" for December. If there is more
|
|
||||||
than one entry for one month, it should be followed by a letter to make them
|
|
||||||
sort correctly. Note that this is just a suggestion on how to make the
|
|
||||||
directories sort in the correct chronological order. Instead of the two digit
|
|
||||||
month number, optionally followed by a letter, you can use anything else you
|
|
||||||
like. There must be an underscore between the MONTH and the DESCRIPTION part,
|
|
||||||
and any underscores within the DESCRIPTION will be converted to blanks when
|
|
||||||
displaying the description (this is done so that blanks can be avoided in
|
|
||||||
the directory names).
|
|
||||||
|
|
||||||
Preparing the files:
|
|
||||||
====================
|
|
||||||
|
|
||||||
In order to display the pictures as "still pictures" on the DVB device, they
|
|
||||||
need to be converted into MPEG frames. This procedure takes some time, and
|
|
||||||
would make viewing pictures sluggish, especially on slow hardware. Therefore
|
|
||||||
the script "pic2mpg" must be used to convert all picture files before
|
|
||||||
using this plugin, as in
|
|
||||||
|
|
||||||
pic2mpg /path/to/pictures /path/to/pictures.MPG
|
|
||||||
|
|
||||||
This will recursively walk through all pictures in the source directory and
|
|
||||||
convert them into MPEG frames, stored in the destination directory. The
|
|
||||||
extension ".MPG" is just a suggestion, you can name the directory anything
|
|
||||||
you like, and it doesn't have to start with the same path as the source
|
|
||||||
directory. Just don't make the destination directory a subdirectory of
|
|
||||||
the source directory, because this would surely lead to problems.
|
|
||||||
See "pic2mpg -h" for a list of available options.
|
|
||||||
The pic2mpg conversion can be run any time, even if converted pictures
|
|
||||||
already exist. It will only convert pictures that haven't been converted
|
|
||||||
yet. Any changes to the source directory will be reflected in the destination
|
|
||||||
directory accordingly after pic2mpg has finished (note that this especially
|
|
||||||
means that any files or directories in the destination tree that have no
|
|
||||||
corresponding entry in the source tree will be deleted!). So you can run
|
|
||||||
pic2mpg, for instance, after copying new pictures into your picture
|
|
||||||
directory, or after making any other kind of changes to your existing
|
|
||||||
pictures. It might even be a good idea to run pic2mpg in a (nightly)
|
|
||||||
cron job.
|
|
@ -1,147 +0,0 @@
|
|||||||
/*
|
|
||||||
* entry.c: Data structure to handle still pictures
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: entry.c 2.1 2012/02/17 14:00:28 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "entry.h"
|
|
||||||
|
|
||||||
cPictureEntry::cPictureEntry(const char *Name, const cPictureEntry *Parent, bool IsDirectory)
|
|
||||||
{
|
|
||||||
name = strdup(Name);
|
|
||||||
parent = Parent;
|
|
||||||
isDirectory = IsDirectory;
|
|
||||||
entries = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
cPictureEntry::~cPictureEntry()
|
|
||||||
{
|
|
||||||
free(name);
|
|
||||||
delete entries;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cPictureEntry::Compare(const cListObject &ListObject) const
|
|
||||||
{
|
|
||||||
cPictureEntry *p = (cPictureEntry *)&ListObject;
|
|
||||||
if (IsDirectory() && !p->IsDirectory())
|
|
||||||
return -1;
|
|
||||||
if (!IsDirectory() && p->IsDirectory())
|
|
||||||
return +1;
|
|
||||||
if (IsDirectory())
|
|
||||||
return strcoll(name, p->name);
|
|
||||||
else
|
|
||||||
return strcmp(name, p->name); // correctly sorts dsc01234.jpg and dsc01234a.jpg in case pictures have been "squeezed in"
|
|
||||||
}
|
|
||||||
|
|
||||||
cString cPictureEntry::Path(void) const
|
|
||||||
{
|
|
||||||
return parent ? *AddDirectory(parent->Path(), name) : name;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cPictureEntry::Load(void) const
|
|
||||||
{
|
|
||||||
if (isDirectory && !entries) {
|
|
||||||
cString Directory = Path();
|
|
||||||
cReadDir d(Directory);
|
|
||||||
if (d.Ok()) {
|
|
||||||
struct dirent *e;
|
|
||||||
while ((e = d.Next()) != NULL) {
|
|
||||||
struct stat ds;
|
|
||||||
if (stat(AddDirectory(Directory, e->d_name), &ds) == 0) {
|
|
||||||
if (!entries)
|
|
||||||
entries = new cList<cPictureEntry>;
|
|
||||||
entries->Add(new cPictureEntry(e->d_name, this, S_ISDIR(ds.st_mode)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (entries)
|
|
||||||
entries->Sort();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
LOG_ERROR_STR(*Directory);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const cList<cPictureEntry> *cPictureEntry::Entries(void) const
|
|
||||||
{
|
|
||||||
Load();
|
|
||||||
return entries;
|
|
||||||
}
|
|
||||||
|
|
||||||
const cPictureEntry *cPictureEntry::FirstPicture(void) const
|
|
||||||
{
|
|
||||||
Load();
|
|
||||||
if (entries) {
|
|
||||||
for (cPictureEntry *pe = entries->First(); pe; pe = entries->Next(pe)) {
|
|
||||||
if (pe->IsDirectory()) {
|
|
||||||
const cPictureEntry *p = pe->FirstPicture();
|
|
||||||
if (p)
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return pe;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
const cPictureEntry *cPictureEntry::LastPicture(void) const
|
|
||||||
{
|
|
||||||
Load();
|
|
||||||
if (entries) {
|
|
||||||
for (cPictureEntry *pe = entries->Last(); pe; pe = entries->Prev(pe)) {
|
|
||||||
if (pe->IsDirectory()) {
|
|
||||||
const cPictureEntry *p = pe->LastPicture();
|
|
||||||
if (p)
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return pe;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
const cPictureEntry *cPictureEntry::PrevPicture(const cPictureEntry *This) const
|
|
||||||
{
|
|
||||||
if (This) {
|
|
||||||
const cPictureEntry *pe = (cPictureEntry *)entries->Prev(This);
|
|
||||||
if (pe) {
|
|
||||||
if (pe->IsDirectory()) {
|
|
||||||
const cPictureEntry *p = pe->LastPicture();
|
|
||||||
if (p)
|
|
||||||
return p;
|
|
||||||
return PrevPicture(pe);
|
|
||||||
}
|
|
||||||
return pe;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (parent)
|
|
||||||
return parent->PrevPicture(this);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
const cPictureEntry *cPictureEntry::NextPicture(const cPictureEntry *This) const
|
|
||||||
{
|
|
||||||
if (This) {
|
|
||||||
cPictureEntry *pe = (cPictureEntry *)entries->Next(This);
|
|
||||||
if (pe) {
|
|
||||||
if (pe->IsDirectory()) {
|
|
||||||
const cPictureEntry *p = pe->FirstPicture();
|
|
||||||
if (p)
|
|
||||||
return p;
|
|
||||||
return NextPicture(pe);
|
|
||||||
}
|
|
||||||
return pe;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (IsDirectory()) {
|
|
||||||
const cPictureEntry *p = FirstPicture();
|
|
||||||
if (p)
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
if (parent)
|
|
||||||
return parent->NextPicture(this);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
@ -1,36 +0,0 @@
|
|||||||
/*
|
|
||||||
* entry.h: Data structure to handle still pictures
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: entry.h 1.1 2008/01/13 11:29:27 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _ENTRY_H
|
|
||||||
#define _ENTRY_H
|
|
||||||
|
|
||||||
#include <vdr/tools.h>
|
|
||||||
|
|
||||||
class cPictureEntry : public cListObject {
|
|
||||||
private:
|
|
||||||
char *name;
|
|
||||||
const cPictureEntry *parent;
|
|
||||||
bool isDirectory;
|
|
||||||
mutable cList<cPictureEntry> *entries;
|
|
||||||
void Load(void) const;
|
|
||||||
public:
|
|
||||||
cPictureEntry(const char *Name, const cPictureEntry *Parent, bool IsDirectory);
|
|
||||||
virtual ~cPictureEntry();
|
|
||||||
virtual int Compare(const cListObject &ListObject) const;
|
|
||||||
const char *Name(void) const { return name; }
|
|
||||||
const cPictureEntry *Parent(void) const { return parent; }
|
|
||||||
bool IsDirectory(void) const { return isDirectory; }
|
|
||||||
cString Path(void) const;
|
|
||||||
const cList<cPictureEntry> *Entries(void) const;
|
|
||||||
const cPictureEntry *FirstPicture(void) const;
|
|
||||||
const cPictureEntry *LastPicture(void) const;
|
|
||||||
const cPictureEntry *PrevPicture(const cPictureEntry *This = NULL) const;
|
|
||||||
const cPictureEntry *NextPicture(const cPictureEntry *This = NULL) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif //_ENTRY_H
|
|
@ -1,129 +0,0 @@
|
|||||||
/*
|
|
||||||
* menu.c: A menu for still pictures
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: menu.c 4.1 2015/07/17 10:13:56 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "menu.h"
|
|
||||||
#include <vdr/tools.h>
|
|
||||||
#include "entry.h"
|
|
||||||
#include "player.h"
|
|
||||||
|
|
||||||
char PictureDirectory[PATH_MAX] = "";
|
|
||||||
|
|
||||||
static bool PathStartsWith(const char *Path, const char *Name)
|
|
||||||
{
|
|
||||||
if (Path && Name) {
|
|
||||||
while (*Name) {
|
|
||||||
if (*Path++ != *Name++)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (*Path && *Path != '/')
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *NextLevel(const char *Path)
|
|
||||||
{
|
|
||||||
if (Path) {
|
|
||||||
const char *p = strchr(Path, '/');
|
|
||||||
return p ? p + 1 : NULL;
|
|
||||||
}
|
|
||||||
return Path;
|
|
||||||
}
|
|
||||||
|
|
||||||
cPictureEntry *cPictureMenu::pictures = NULL;
|
|
||||||
|
|
||||||
cPictureMenu::cPictureMenu(const cPictureEntry *PictureEntry, const char *Path)
|
|
||||||
:cOsdMenu(tr("Pictures"))
|
|
||||||
{
|
|
||||||
pictureEntry = PictureEntry;
|
|
||||||
if (!pictureEntry)
|
|
||||||
pictureEntry = pictures = new cPictureEntry(PictureDirectory, NULL, true);
|
|
||||||
if (pictureEntry->Parent()) {
|
|
||||||
if (!pictureEntry->Parent()->Parent())
|
|
||||||
SetTitle(pictureEntry->Name()); // Year
|
|
||||||
else
|
|
||||||
SetTitle(cString::sprintf("%s: %s", pictureEntry->Parent()->Name(), *HandleUnderscores(pictureEntry->Name()))); // Year/Description
|
|
||||||
}
|
|
||||||
Set(Path);
|
|
||||||
}
|
|
||||||
|
|
||||||
cPictureMenu::~cPictureMenu()
|
|
||||||
{
|
|
||||||
if (pictures && pictureEntry && !pictureEntry->Parent())
|
|
||||||
DELETENULL(pictures);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cPictureMenu::Set(const char *Path)
|
|
||||||
{
|
|
||||||
Clear();
|
|
||||||
const cList<cPictureEntry> *l = pictureEntry->Entries();
|
|
||||||
if (l) {
|
|
||||||
for (const cPictureEntry *e = l->First(); e; e = l->Next(e)) {
|
|
||||||
cString Name = HandleUnderscores(e->Name());
|
|
||||||
if (!e->IsDirectory())
|
|
||||||
Name.Truncate(-4); // don't display the ".mpg" extension
|
|
||||||
Add(new cOsdItem(HandleUnderscores(Name)), PathStartsWith(Path, e->Name()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SetHelp(Count() ? trVDR("Button$Play") : NULL, NULL, NULL, cPictureControl::Active() ? trVDR("Button$Stop") : NULL);
|
|
||||||
if (Current() >= 0) {
|
|
||||||
const char *p = NextLevel(Path);
|
|
||||||
if (p)
|
|
||||||
SelectItem(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
eOSState cPictureMenu::SelectItem(const char *Path, bool SlideShow)
|
|
||||||
{
|
|
||||||
cOsdItem *Item = Get(Current());
|
|
||||||
if (Item) {
|
|
||||||
const cList<cPictureEntry> *l = pictureEntry->Entries();
|
|
||||||
if (l) {
|
|
||||||
const cPictureEntry *pe = l->Get(Current());
|
|
||||||
if (pe) {
|
|
||||||
if (SlideShow) {
|
|
||||||
cControl::Launch(new cPictureControl(pictures, pe, true));
|
|
||||||
pictures = NULL; // cPictureControl takes ownership
|
|
||||||
return osEnd;
|
|
||||||
}
|
|
||||||
if (pe->IsDirectory())
|
|
||||||
return AddSubMenu(new cPictureMenu(pe, Path));
|
|
||||||
else if (!Path) {
|
|
||||||
cControl::Launch(new cPictureControl(pictures, pe));
|
|
||||||
pictures = NULL; // cPictureControl takes ownership
|
|
||||||
return osEnd;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return osContinue;
|
|
||||||
}
|
|
||||||
|
|
||||||
eOSState cPictureMenu::ProcessKey(eKeys Key)
|
|
||||||
{
|
|
||||||
eOSState state = cOsdMenu::ProcessKey(Key);
|
|
||||||
if (state == osUnknown) {
|
|
||||||
switch (Key) {
|
|
||||||
case kRed:
|
|
||||||
case kPlay: return SelectItem(NULL, true);
|
|
||||||
case kBlue:
|
|
||||||
case kStop: if (cPictureControl::Active())
|
|
||||||
return osStopReplay;
|
|
||||||
break;
|
|
||||||
case kOk: return SelectItem();
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
cPictureMenu *cPictureMenu::CreatePictureMenu(void)
|
|
||||||
{
|
|
||||||
return new cPictureMenu(NULL, cPictureControl::LastDisplayed());
|
|
||||||
}
|
|
@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
* menu.h: A menu for still pictures
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: menu.h 1.1 2008/01/13 11:32:52 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _MENU_H
|
|
||||||
#define _MENU_H
|
|
||||||
|
|
||||||
#include <vdr/osdbase.h>
|
|
||||||
#include <vdr/tools.h>
|
|
||||||
#include "entry.h"
|
|
||||||
|
|
||||||
extern char PictureDirectory[PATH_MAX];
|
|
||||||
|
|
||||||
class cPictureMenu : public cOsdMenu {
|
|
||||||
private:
|
|
||||||
static cPictureEntry *pictures;
|
|
||||||
const cPictureEntry *pictureEntry;
|
|
||||||
void Set(const char *Path);
|
|
||||||
eOSState SelectItem(const char *Path = NULL, bool SlideShow = false);
|
|
||||||
public:
|
|
||||||
cPictureMenu(const cPictureEntry *PictureEntry, const char *Path = NULL);
|
|
||||||
~cPictureMenu();
|
|
||||||
virtual eOSState ProcessKey(eKeys Key);
|
|
||||||
static cPictureMenu *CreatePictureMenu(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif //_MENU_H
|
|
@ -1,172 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
|
|
||||||
# pic2mpg: Convert picture files to MPEG still frames
|
|
||||||
#
|
|
||||||
# Converts either a single picture file or all files in a
|
|
||||||
# given directory (recursively) to MPEG still frames.
|
|
||||||
#
|
|
||||||
# See the README file for copyright information and how to reach the author.
|
|
||||||
#
|
|
||||||
# $Id: pic2mpg 4.1 2017/10/06 14:42:18 kls Exp $
|
|
||||||
|
|
||||||
use File::Path;
|
|
||||||
use File::Spec;
|
|
||||||
use Getopt::Std;
|
|
||||||
use Image::ExifTool qw(:Public);
|
|
||||||
|
|
||||||
$Usage = qq{
|
|
||||||
Usage: $0 [options] picture-dir mpeg-dir
|
|
||||||
$0 [options] picture-file mpeg-file
|
|
||||||
|
|
||||||
Options: -f Force conversion
|
|
||||||
-h print Help
|
|
||||||
-o percent overscan in percent
|
|
||||||
-s size Screen size (WIDTHxHEIGHT, default is 1920x1080)
|
|
||||||
-v num Verbose (0=none, 1=list files, 2=detailed)
|
|
||||||
-x dir[,...] eXclude the given directories
|
|
||||||
};
|
|
||||||
|
|
||||||
getopts("fho:s:v:x:") || die $Usage;
|
|
||||||
|
|
||||||
die $Usage if $opt_h;
|
|
||||||
|
|
||||||
$Force = $opt_f;
|
|
||||||
$Overscan = $opt_o || 0;
|
|
||||||
$Size = $opt_s || "1920x1080";
|
|
||||||
$Verbose = $opt_v;
|
|
||||||
@Exclude = split(',', $opt_x || "");
|
|
||||||
|
|
||||||
$ListFiles = $Verbose >= 1;
|
|
||||||
$Detailed = $Verbose >= 2;
|
|
||||||
|
|
||||||
# Supported picture types:
|
|
||||||
|
|
||||||
%PICTYPES = (
|
|
||||||
bmp => 1,
|
|
||||||
gif => 1,
|
|
||||||
jpeg => 1,
|
|
||||||
jpg => 1,
|
|
||||||
png => 1,
|
|
||||||
pnm => 1,
|
|
||||||
tif => 1,
|
|
||||||
tiff => 1,
|
|
||||||
);
|
|
||||||
|
|
||||||
# Command options:
|
|
||||||
|
|
||||||
die "$0: missing parameter\n" unless $ARGV[0] && $ARGV[1];
|
|
||||||
die "$0: file or directory not found: $ARGV[0]\n" unless -e $ARGV[0];
|
|
||||||
die "$0: source and destination must be different\n" if $ARGV[0] eq $ARGV[1];
|
|
||||||
|
|
||||||
$Extent = $Size;
|
|
||||||
if ($Overscan > 0) {
|
|
||||||
my ($x, $y) = $Size =~ /(.*)x(.*)/;
|
|
||||||
my $r = (100 + $Overscan) / 100;
|
|
||||||
$x = int($x * $r + 0.5);
|
|
||||||
$y = int($y * $r + 0.5);
|
|
||||||
$Extent = "${x}x$y";
|
|
||||||
}
|
|
||||||
|
|
||||||
# Convert a single file:
|
|
||||||
|
|
||||||
if (-f $ARGV[0]) {
|
|
||||||
die "$0: mixed file and directory ('$ARGV[0]' <-> '$ARGV[1]')\n" unless !-e $ARGV[1] || -f $ARGV[1];
|
|
||||||
ConvertFile($ARGV[0], $ARGV[1]);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
die "$0: mixed directory and file ('$ARGV[0]' <-> '$ARGV[1]')\n" unless !-e $ARGV[1] || -d $ARGV[1];
|
|
||||||
|
|
||||||
$PICDIR = File::Spec->rel2abs($ARGV[0]);
|
|
||||||
$MPGDIR = File::Spec->rel2abs($ARGV[1]);
|
|
||||||
|
|
||||||
# Convert pictures to mpegs:
|
|
||||||
|
|
||||||
chdir($PICDIR) || die "$PICDIR: $!\n";
|
|
||||||
|
|
||||||
@Pictures = `find -type f | sort`;
|
|
||||||
chomp(@Pictures);
|
|
||||||
|
|
||||||
PIC:
|
|
||||||
for $pic (@Pictures) {
|
|
||||||
for (@Exclude) {
|
|
||||||
next PIC if ($pic =~ /\/$_\//);
|
|
||||||
}
|
|
||||||
my $mpg = "$MPGDIR/$pic.mpg";
|
|
||||||
if ($Force || !-e $mpg || -M $mpg > -M $pic) {
|
|
||||||
(my $dir = $mpg) =~ s/\/[^\/]*$//;
|
|
||||||
mkpath($dir);
|
|
||||||
ConvertFile($pic, $mpg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Remove mpegs without pictures:
|
|
||||||
|
|
||||||
chdir($MPGDIR) || die "$MPGDIR: $!\n";
|
|
||||||
|
|
||||||
@Mpegs = `find -type f`;
|
|
||||||
chomp(@Mpegs);
|
|
||||||
|
|
||||||
for $mpg (@Mpegs) {
|
|
||||||
my $pic = "$PICDIR/$mpg";
|
|
||||||
$pic =~ s/\.mpg$//;
|
|
||||||
if (!-e $pic) {
|
|
||||||
print "removing $mpg\n";
|
|
||||||
unlink($mpg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Remove empty directories:
|
|
||||||
|
|
||||||
chdir($MPGDIR) || die "$MPGDIR: $!\n";
|
|
||||||
|
|
||||||
for ($i = 0; $i < 10; $i++) { # dirs might become empty when removing empty subdirs
|
|
||||||
@Dirs = `find -type d -empty`;
|
|
||||||
chomp(@Dirs);
|
|
||||||
last unless @Dirs;
|
|
||||||
|
|
||||||
for $dir (@Dirs) {
|
|
||||||
$dir = EscapeMeta($dir);
|
|
||||||
print "removing $dir\n";
|
|
||||||
Exec("rm -rf $dir");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Actual file conversion:
|
|
||||||
|
|
||||||
sub ConvertFile
|
|
||||||
{
|
|
||||||
my ($Pict, $Mpeg) = @_;
|
|
||||||
(my $Type) = lc($Pict) =~ /\.([^\.]*)$/;
|
|
||||||
return if (!defined $PICTYPES{$Type});
|
|
||||||
my $Exif = ImageInfo($Pict);
|
|
||||||
my $Orientation = $$Exif{"Orientation"};
|
|
||||||
my ($Degrees) = $Orientation =~ /Rotate ([0-9]+)/;
|
|
||||||
my $Rotate = ($Degrees == 90) ? "transpose=clock" : ($Degrees == 180) ? "hflip,vflip" : ($Degrees == 270) ? "transpose=cclock" : "";
|
|
||||||
$Rotate .= ',' if ($Rotate);
|
|
||||||
my $Background = '#000000@1';
|
|
||||||
print "orientation = '$Orientation' -> rotation = $Rotate\n" if ($Detailed);
|
|
||||||
$Pict = EscapeMeta($Pict);
|
|
||||||
$Mpeg = EscapeMeta($Mpeg);
|
|
||||||
print "$Pict -> $Mpeg $Rotate\n" if $ListFiles;
|
|
||||||
my $Cmd = "ffmpeg -i $Pict -vf '${Rotate}scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:$Background' -c:v libx264 -pix_fmt yuv420p -f mpegts -y $Mpeg "
|
|
||||||
. ($Detailed ? "" : "2>/dev/null");
|
|
||||||
Exec($Cmd);
|
|
||||||
$Cmd = "touch -r $Pict $Mpeg";
|
|
||||||
Exec($Cmd);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub EscapeMeta
|
|
||||||
{
|
|
||||||
my $META = ' !"#$%&\'()*;<>?[\\]`{|}~';
|
|
||||||
my $s = shift;
|
|
||||||
$s =~ s/([$META])/\\$1/g;
|
|
||||||
return $s;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub Exec
|
|
||||||
{
|
|
||||||
my $Cmd = shift;
|
|
||||||
print "==> '$Cmd'\n" if ($Verbose);
|
|
||||||
!system($Cmd) || die "$Cmd: $!\n";
|
|
||||||
}
|
|
@ -1,193 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
|
|
||||||
# pic2mpg: Convert picture files to MPEG still frames
|
|
||||||
#
|
|
||||||
# Converts either a single picture file or all files in a
|
|
||||||
# given directory (recursively) to MPEG still frames.
|
|
||||||
#
|
|
||||||
# See the README file for copyright information and how to reach the author.
|
|
||||||
#
|
|
||||||
# $Id: pic2mpg-sd 2.1 2011/07/23 14:23:59 kls Exp $
|
|
||||||
|
|
||||||
## TODO implement HDTV (1920 x 1080)
|
|
||||||
|
|
||||||
use File::Path;
|
|
||||||
use File::Spec;
|
|
||||||
use Getopt::Std;
|
|
||||||
use Image::ExifTool qw(:Public);
|
|
||||||
use Image::Size;
|
|
||||||
|
|
||||||
$Usage = qq{
|
|
||||||
Usage: $0 [options] picture-dir mpeg-dir
|
|
||||||
$0 [options] picture-file mpeg-file
|
|
||||||
|
|
||||||
Options: -a Aspect ratio 4:3 (default is 16:9)
|
|
||||||
-f Force conversion
|
|
||||||
-h print Help
|
|
||||||
-i Ignore unknown file types
|
|
||||||
-n NTSC (default is PAL)
|
|
||||||
-v num Verbose (0=none, 1=list files, 2=detailed)
|
|
||||||
-x percent X overscan in percent
|
|
||||||
-y percent Y overscan in percent
|
|
||||||
};
|
|
||||||
|
|
||||||
getopts("afhinv:x:y:") || die $Usage;
|
|
||||||
|
|
||||||
die $Usage if $opt_h;
|
|
||||||
|
|
||||||
$Aspect = $opt_a;
|
|
||||||
$Force = $opt_f;
|
|
||||||
$Ignore = $opt_i;
|
|
||||||
$NTSC = $opt_n;
|
|
||||||
$Verbose = $opt_v;
|
|
||||||
$OverscanX = $opt_x;
|
|
||||||
$OverscanY = $opt_y;
|
|
||||||
|
|
||||||
$ListFiles = $Verbose >= 1;
|
|
||||||
$Detailed = $Verbose >= 2;
|
|
||||||
|
|
||||||
# Screen size:
|
|
||||||
|
|
||||||
$SW = $NTSC ? 720 : 720;
|
|
||||||
$SH = $NTSC ? 480 : 576;
|
|
||||||
|
|
||||||
$ScreenRatio = $Aspect ? 4 / 3 : 16 / 9;
|
|
||||||
|
|
||||||
# Converter programs:
|
|
||||||
|
|
||||||
%PNMCONV = (
|
|
||||||
bmp => "bmptopnm",
|
|
||||||
gif => "giftopnm",
|
|
||||||
jpeg => "jpegtopnm",
|
|
||||||
jpg => "jpegtopnm",
|
|
||||||
png => "pngtopnm",
|
|
||||||
pnm => "cat",
|
|
||||||
tif => "tifftopnm",
|
|
||||||
tiff => "tifftopnm",
|
|
||||||
);
|
|
||||||
|
|
||||||
# Command options:
|
|
||||||
|
|
||||||
die "$0: missing parameter\n" unless $ARGV[0] && $ARGV[1];
|
|
||||||
die "$0: file or directory not found: $ARGV[0]\n" unless -e $ARGV[0];
|
|
||||||
die "$0: source and destination must be different\n" if $ARGV[0] eq $ARGV[1];
|
|
||||||
|
|
||||||
$verbose1 = $Detailed ? "--verbose" : "";
|
|
||||||
$verbose2 = $Detailed ? "-v 2" : "-v 0";
|
|
||||||
$system1 = $NTSC ? "" : "--pal";
|
|
||||||
$system2 = $NTSC ? "n" : "p";
|
|
||||||
$framerate = $NTSC ? "30000:1001" : "25:1";
|
|
||||||
$aspect = $Aspect ? "2" : "3";
|
|
||||||
|
|
||||||
# Convert a single file:
|
|
||||||
|
|
||||||
if (-f $ARGV[0]) {
|
|
||||||
die "$0: mixed file and directory ('$ARGV[0]' <-> '$ARGV[1]')\n" unless !-e $ARGV[1] || -f $ARGV[1];
|
|
||||||
ConvertFile($ARGV[0], $ARGV[1]);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
die "$0: mixed directory and file ('$ARGV[0]' <-> '$ARGV[1]')\n" unless !-e $ARGV[1] || -d $ARGV[1];
|
|
||||||
|
|
||||||
$PICDIR = File::Spec->rel2abs($ARGV[0]);
|
|
||||||
$MPGDIR = File::Spec->rel2abs($ARGV[1]);
|
|
||||||
|
|
||||||
# Convert pictures to mpegs:
|
|
||||||
|
|
||||||
chdir($PICDIR) || die "$PICDIR: $!\n";
|
|
||||||
|
|
||||||
@Pictures = `find -type f`;
|
|
||||||
chomp(@Pictures);
|
|
||||||
|
|
||||||
for $pic (@Pictures) {
|
|
||||||
my $mpg = "$MPGDIR/$pic.mpg";
|
|
||||||
if ($Force || !-e $mpg || -M $mpg > -M $pic) {
|
|
||||||
(my $dir = $mpg) =~ s/\/[^\/]*$//;
|
|
||||||
mkpath($dir);
|
|
||||||
ConvertFile($pic, $mpg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Remove mpegs without pictures:
|
|
||||||
|
|
||||||
chdir($MPGDIR) || die "$MPGDIR: $!\n";
|
|
||||||
|
|
||||||
@Mpegs = `find -type f`;
|
|
||||||
chomp(@Mpegs);
|
|
||||||
|
|
||||||
for $mpg (@Mpegs) {
|
|
||||||
my $pic = "$PICDIR/$mpg";
|
|
||||||
$pic =~ s/\.mpg$//;
|
|
||||||
if (!-e $pic) {
|
|
||||||
print "removing $mpg\n";
|
|
||||||
unlink($mpg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Remove empty directories:
|
|
||||||
|
|
||||||
chdir($MPGDIR) || die "$MPGDIR: $!\n";
|
|
||||||
|
|
||||||
for ($i = 0; $i < 10; $i++) { # dirs might become empty when removing empty subdirs
|
|
||||||
@Dirs = `find -type d -empty`;
|
|
||||||
chomp(@Dirs);
|
|
||||||
last unless @Dirs;
|
|
||||||
|
|
||||||
for $dir (@Dirs) {
|
|
||||||
$dir = EscapeMeta($dir);
|
|
||||||
print "removing $dir\n";
|
|
||||||
!system("rm -rf $dir") || die "$dir: $!\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Actual file conversion:
|
|
||||||
|
|
||||||
sub ConvertFile
|
|
||||||
{
|
|
||||||
my ($Pict, $Mpeg) = @_;
|
|
||||||
(my $Type) = lc($Pict) =~ /\.([^\.]*)$/;
|
|
||||||
if (!defined $PNMCONV{$Type}) {
|
|
||||||
return if ($Ignore);
|
|
||||||
die "unknown file type '$Type': '$Pict'\n";
|
|
||||||
}
|
|
||||||
my ($w, $h) = imgsize($Pict);
|
|
||||||
print "image size is $w x $h\n" if ($Detailed);
|
|
||||||
my $Exif = ImageInfo($Pict);
|
|
||||||
my $Orientation = $$Exif{"Orientation"};
|
|
||||||
my ($Degrees) = $Orientation =~ /Rotate ([0-9]+) /;
|
|
||||||
my $Rotate = "-null";
|
|
||||||
$Rotate = "-cw" if $Degrees eq "90";
|
|
||||||
$Rotate = "-ccw" if $Degrees eq "270";
|
|
||||||
$Rotate = "-r180" if $Degrees eq "180";
|
|
||||||
print "orientation = '$Orientation' -> rotation = $Rotate\n" if ($Detailed);
|
|
||||||
($w, $h) = ($h, $w) if ($Degrees eq "90" || $Degrees eq "270");
|
|
||||||
if ($w / $h <= $ScreenRatio) {
|
|
||||||
$w = $h * $ScreenRatio;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$h = $w / $ScreenRatio;
|
|
||||||
}
|
|
||||||
my $ScaleW = $SW / $w * (100 - 2 * $OverscanX) / 100;
|
|
||||||
my $ScaleH = $SH / $h * (100 - 2 * $OverscanY) / 100;
|
|
||||||
$Pict = EscapeMeta($Pict);
|
|
||||||
$Mpeg = EscapeMeta($Mpeg);
|
|
||||||
print "$Pict -> $Mpeg $Rotate\n" if $ListFiles;
|
|
||||||
my $Cmd = "$PNMCONV{$Type} $Pict 2> /dev/null |"
|
|
||||||
. "pamflip $verbose1 $Rotate |"
|
|
||||||
. "pnmscale $verbose1 --xscale=$ScaleW --yscale=$ScaleH |"
|
|
||||||
. "pnmpad $verbose1 --black --width $SW --height $SH |"
|
|
||||||
. "ppmntsc $verbose1 $system1 |"
|
|
||||||
. "ppmtoy4m $verbose2 -F $framerate -I p -S 420mpeg2 |"
|
|
||||||
. "mpeg2enc $verbose2 -f 3 -b 12500 -a $aspect -q 1 -n $system2 -o $Mpeg";
|
|
||||||
!system($Cmd) || die "$Cmd: $!\n";
|
|
||||||
$Cmd = "touch -r $Pict $Mpeg";
|
|
||||||
!system($Cmd) || die "$Cmd: $!\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
sub EscapeMeta
|
|
||||||
{
|
|
||||||
my $META = ' !"#$%&\'()*;<>?[\\]`{|}~';
|
|
||||||
my $s = shift;
|
|
||||||
$s =~ s/([$META])/\\$1/g;
|
|
||||||
return $s;
|
|
||||||
}
|
|
@ -1,124 +0,0 @@
|
|||||||
/*
|
|
||||||
* pictures.c: A plugin for the Video Disk Recorder
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: pictures.c 5.1 2022/12/05 15:26:23 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <getopt.h>
|
|
||||||
#include <vdr/plugin.h>
|
|
||||||
#include "menu.h"
|
|
||||||
#include "player.h"
|
|
||||||
|
|
||||||
static const char *VERSION = "2.6.1";
|
|
||||||
static const char *DESCRIPTION = trNOOP("A simple picture viewer");
|
|
||||||
static const char *MAINMENUENTRY = trNOOP("Pictures");
|
|
||||||
|
|
||||||
// --- cMenuSetupPictures ----------------------------------------------------
|
|
||||||
|
|
||||||
class cMenuSetupPictures : public cMenuSetupPage {
|
|
||||||
private:
|
|
||||||
char newPictureDirectory[PATH_MAX];
|
|
||||||
int newSlideShowDelay;
|
|
||||||
protected:
|
|
||||||
virtual void Store(void);
|
|
||||||
public:
|
|
||||||
cMenuSetupPictures(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
cMenuSetupPictures::cMenuSetupPictures(void)
|
|
||||||
{
|
|
||||||
strn0cpy(newPictureDirectory, PictureDirectory, sizeof(newPictureDirectory));
|
|
||||||
newSlideShowDelay = SlideShowDelay;
|
|
||||||
Add(new cMenuEditStrItem(tr("Picture directory"), newPictureDirectory, sizeof(newPictureDirectory)));
|
|
||||||
Add(new cMenuEditIntItem(tr("Slide show delay (s)"), &newSlideShowDelay));
|
|
||||||
}
|
|
||||||
|
|
||||||
void cMenuSetupPictures::Store(void)
|
|
||||||
{
|
|
||||||
SetupStore("PictureDirectory", strn0cpy(PictureDirectory, newPictureDirectory, sizeof(PictureDirectory)));
|
|
||||||
SetupStore("SlideShowDelay", SlideShowDelay = newSlideShowDelay);
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cPluginPictures -------------------------------------------------------
|
|
||||||
|
|
||||||
class cPluginPictures : public cPlugin {
|
|
||||||
private:
|
|
||||||
// Add any member variables or functions you may need here.
|
|
||||||
public:
|
|
||||||
cPluginPictures(void);
|
|
||||||
virtual ~cPluginPictures();
|
|
||||||
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 const char *MainMenuEntry(void) { return tr(MAINMENUENTRY); }
|
|
||||||
virtual cOsdObject *MainMenuAction(void);
|
|
||||||
virtual cMenuSetupPage *SetupMenu(void);
|
|
||||||
virtual bool SetupParse(const char *Name, const char *Value);
|
|
||||||
};
|
|
||||||
|
|
||||||
cPluginPictures::cPluginPictures(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!
|
|
||||||
}
|
|
||||||
|
|
||||||
cPluginPictures::~cPluginPictures()
|
|
||||||
{
|
|
||||||
// Clean up after yourself!
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *cPluginPictures::CommandLineHelp(void)
|
|
||||||
{
|
|
||||||
// Return a string that describes all known command line options.
|
|
||||||
return " -d DIR, --dir=DIR set the picture directory to DIR\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cPluginPictures::ProcessArgs(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
// Implement command line argument processing here if applicable.
|
|
||||||
static struct option long_options[] = {
|
|
||||||
{ "dir", required_argument, NULL, 'd' },
|
|
||||||
{ NULL, no_argument, NULL, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
int c;
|
|
||||||
while ((c = getopt_long(argc, argv, "d:", long_options, NULL)) != -1) {
|
|
||||||
switch (c) {
|
|
||||||
case 'd': strn0cpy(PictureDirectory, optarg, sizeof(PictureDirectory));
|
|
||||||
break;
|
|
||||||
default: return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
cOsdObject *cPluginPictures::MainMenuAction(void)
|
|
||||||
{
|
|
||||||
// Perform the action when selected from the main VDR menu.
|
|
||||||
if (*PictureDirectory)
|
|
||||||
return cPictureMenu::CreatePictureMenu();
|
|
||||||
Skins.Message(mtWarning, tr("No picture directory has been defined!"));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
cMenuSetupPage *cPluginPictures::SetupMenu(void)
|
|
||||||
{
|
|
||||||
// Return a setup menu in case the plugin supports one.
|
|
||||||
return new cMenuSetupPictures;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cPluginPictures::SetupParse(const char *Name, const char *Value)
|
|
||||||
{
|
|
||||||
// Parse your own setup parameters and store their values.
|
|
||||||
if (!strcasecmp(Name, "PictureDirectory")) strn0cpy(PictureDirectory, Value, sizeof(PictureDirectory));
|
|
||||||
else if (!strcasecmp(Name, "SlideShowDelay")) SlideShowDelay = atoi(Value);
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
VDRPLUGINCREATOR(cPluginPictures); // Don't touch this!
|
|
@ -1,264 +0,0 @@
|
|||||||
/*
|
|
||||||
* player.c: A player for still pictures
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: player.c 5.1 2022/12/05 15:26:23 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "player.h"
|
|
||||||
#include <vdr/remote.h>
|
|
||||||
#include <vdr/tools.h>
|
|
||||||
|
|
||||||
int SlideShowDelay = 3; // seconds
|
|
||||||
|
|
||||||
cString HandleUnderscores(const char *s)
|
|
||||||
{
|
|
||||||
// Skip anything before and including the first '_' and replace
|
|
||||||
// any remaining '_' with blanks:
|
|
||||||
const char *p = strchr(s, '_');
|
|
||||||
if (p) {
|
|
||||||
p++;
|
|
||||||
char buf[strlen(p) + 1];
|
|
||||||
strcpy(buf, p);
|
|
||||||
return strreplace(buf, '_', ' ');
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cPicturePlayer --------------------------------------------------------
|
|
||||||
|
|
||||||
class cPicturePlayer : public cPlayer {
|
|
||||||
private:
|
|
||||||
int size;
|
|
||||||
int length;
|
|
||||||
uchar *buffer;
|
|
||||||
virtual void Activate(bool On);
|
|
||||||
public:
|
|
||||||
cPicturePlayer(void);
|
|
||||||
~cPicturePlayer();
|
|
||||||
void SetPicture(const char *FileName);
|
|
||||||
};
|
|
||||||
|
|
||||||
cPicturePlayer::cPicturePlayer(void)
|
|
||||||
{
|
|
||||||
size = KILOBYTE(100); // will be adjusted automatically if files are larger
|
|
||||||
length = 0;
|
|
||||||
buffer = MALLOC(uchar, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
cPicturePlayer::~cPicturePlayer()
|
|
||||||
{
|
|
||||||
free(buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cPicturePlayer::Activate(bool On)
|
|
||||||
{
|
|
||||||
if (length > 0)
|
|
||||||
DeviceStillPicture(buffer, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cPicturePlayer::SetPicture(const char *FileName)
|
|
||||||
{
|
|
||||||
int f = open(FileName, O_RDONLY);
|
|
||||||
if (f >= 0) {
|
|
||||||
for (;;) {
|
|
||||||
length = read(f, buffer, size);
|
|
||||||
if (length > 0) {
|
|
||||||
if (length >= size) {
|
|
||||||
int NewSize = size * 3 / 2;
|
|
||||||
if (uchar *NewBuffer = (uchar *)realloc(buffer, NewSize)) {
|
|
||||||
buffer = NewBuffer;
|
|
||||||
size = NewSize;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
LOG_ERROR_STR("out of memory");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
lseek(f, 0, SEEK_SET);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
DeviceStillPicture(buffer, length);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
LOG_ERROR_STR(FileName);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
close(f);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
LOG_ERROR_STR(FileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cPictureControl -------------------------------------------------------
|
|
||||||
|
|
||||||
int cPictureControl::active = 0;
|
|
||||||
cString cPictureControl::lastDisplayed;
|
|
||||||
|
|
||||||
cPictureControl::cPictureControl(cPictureEntry *Pictures, const cPictureEntry *PictureEntry, bool SlideShow)
|
|
||||||
:cControl(NULL)
|
|
||||||
{
|
|
||||||
player = new cPicturePlayer;
|
|
||||||
SetPlayer(player);
|
|
||||||
pictures = Pictures;
|
|
||||||
pictureEntry = PictureEntry;
|
|
||||||
osd = NULL;
|
|
||||||
lastPath = "/";
|
|
||||||
slideShowDelay.Set(SlideShowDelay * 1000);
|
|
||||||
slideShow = SlideShow;
|
|
||||||
alwaysDisplayCaption = false;
|
|
||||||
NextPicture(slideShow && pictureEntry->IsDirectory() ? 1 : 0);
|
|
||||||
active++;
|
|
||||||
}
|
|
||||||
|
|
||||||
cPictureControl::~cPictureControl()
|
|
||||||
{
|
|
||||||
active--;
|
|
||||||
delete osd;
|
|
||||||
delete player;
|
|
||||||
delete pictures;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cPictureControl::NextPicture(int Direction)
|
|
||||||
{
|
|
||||||
if (Direction) {
|
|
||||||
const cPictureEntry *pe = Direction > 0 ? pictureEntry->NextPicture() : pictureEntry->PrevPicture();
|
|
||||||
if (pe)
|
|
||||||
pictureEntry = pe;
|
|
||||||
}
|
|
||||||
if (pictureEntry) {
|
|
||||||
player->SetPicture(pictureEntry->Path());
|
|
||||||
DisplayCaption();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void cPictureControl::NextDirectory(int Direction)
|
|
||||||
{
|
|
||||||
// This only works reliable if a directory contains only subdirectories or pictures, not both!
|
|
||||||
if (Direction) {
|
|
||||||
const cPictureEntry *pe = Direction > 0 ? pictureEntry->Parent()->Entries()->Last()->NextPicture() : pictureEntry->Parent()->Entries()->First()->PrevPicture();
|
|
||||||
if (pe && Direction < 0)
|
|
||||||
pe = pe->Parent()->Entries()->First();
|
|
||||||
if (pe && pe != pictureEntry) {
|
|
||||||
pictureEntry = pe;
|
|
||||||
player->SetPicture(pictureEntry->Path());
|
|
||||||
DisplayCaption();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void DrawTextOutlined(cOsd *Osd, int x, int y, const char *s, tColor ColorFg, tColor ColorBg, const cFont *Font)
|
|
||||||
{
|
|
||||||
for (int dx = -1; dx <= 1; dx++) {
|
|
||||||
for (int dy = -1; dy <= 1; dy++) {
|
|
||||||
if (dx || dy)
|
|
||||||
Osd->DrawText(x + dx, y + dy, s, ColorBg, clrTransparent, Font);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Osd->DrawText(x, y, s, ColorFg, clrTransparent, Font);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cPictureControl::DisplayCaption(void)
|
|
||||||
{
|
|
||||||
bool Force = false;
|
|
||||||
cString Path = pictureEntry->Path();
|
|
||||||
lastDisplayed = Path + strlen(pictures->Name()) + 1;
|
|
||||||
const char *p = strrchr(Path, '/');
|
|
||||||
const char *q = strrchr(lastPath, '/');
|
|
||||||
if (p && q) {
|
|
||||||
int lp = p - Path;
|
|
||||||
int lq = q - lastPath;
|
|
||||||
if (lp != lq || strncmp(lastPath, Path, lp)) {
|
|
||||||
lastPath = Path;
|
|
||||||
Force = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!alwaysDisplayCaption && !Force) {
|
|
||||||
DELETENULL(osd);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const cFont *Font = cFont::GetFont(fontOsd);
|
|
||||||
int w = cOsd::OsdWidth();
|
|
||||||
int h = 2 * Font->Height();
|
|
||||||
if (!osd) {
|
|
||||||
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop() + cOsd::OsdHeight() - h, OSD_LEVEL_SUBTITLES);
|
|
||||||
tArea Areas[] = { { 0, 0, w - 1, h - 1, 8 } };
|
|
||||||
if (Setup.AntiAlias && osd->CanHandleAreas(Areas, sizeof(Areas) / sizeof(tArea)) == oeOk)
|
|
||||||
osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea));
|
|
||||||
else {
|
|
||||||
tArea Areas[] = { { 0, 0, w - 1, h - 1, 4 } };
|
|
||||||
osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const char *Year = pictureEntry->Parent()->Parent() ? pictureEntry->Parent()->Parent()->Name() : "";
|
|
||||||
cString Description = HandleUnderscores(pictureEntry->Parent()->Name());
|
|
||||||
osd->DrawRectangle(0, 0, w - 1, h - 1, clrTransparent);
|
|
||||||
DrawTextOutlined(osd, 0, 0, Description, clrWhite, clrBlack, Font);
|
|
||||||
DrawTextOutlined(osd, 0, h / 2, Year, clrWhite, clrBlack, Font);
|
|
||||||
struct stat sb;
|
|
||||||
if (stat(Path, &sb) == 0) {
|
|
||||||
cString Time = DayDateTime(sb.st_mtime);
|
|
||||||
DrawTextOutlined(osd, w - Font->Width(Time), h / 2, Time, clrWhite, clrBlack, Font);
|
|
||||||
}
|
|
||||||
p++;
|
|
||||||
Path.Truncate(-4); // don't display the ".mpg" extension
|
|
||||||
DrawTextOutlined(osd, w - Font->Width(p), 0, p, clrWhite, clrBlack, Font);
|
|
||||||
osd->Flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
cString cPictureControl::GetHeader(void)
|
|
||||||
{
|
|
||||||
return tr("Pictures");
|
|
||||||
}
|
|
||||||
|
|
||||||
eOSState cPictureControl::ProcessKey(eKeys Key)
|
|
||||||
{
|
|
||||||
switch (int(Key)) {
|
|
||||||
case kUp:
|
|
||||||
case kPlay: slideShowDelay.Set();
|
|
||||||
slideShow = true;
|
|
||||||
break;
|
|
||||||
case kDown:
|
|
||||||
case kPause: slideShow = false;
|
|
||||||
break;
|
|
||||||
case kLeft|k_Repeat:
|
|
||||||
case kLeft: NextPicture(-1);
|
|
||||||
slideShow = false;
|
|
||||||
break;
|
|
||||||
case kRight|k_Repeat:
|
|
||||||
case kRight: NextPicture(+1);
|
|
||||||
slideShow = false;
|
|
||||||
break;
|
|
||||||
case kOk: if (osd && !alwaysDisplayCaption)
|
|
||||||
DELETENULL(osd);
|
|
||||||
else {
|
|
||||||
alwaysDisplayCaption = !alwaysDisplayCaption;
|
|
||||||
DisplayCaption();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case kGreen:
|
|
||||||
case kPrev: NextDirectory(-1);
|
|
||||||
slideShow = false;
|
|
||||||
break;
|
|
||||||
case kYellow:
|
|
||||||
case kNext: NextDirectory(+1);
|
|
||||||
slideShow = false;
|
|
||||||
break;
|
|
||||||
case kBlue:
|
|
||||||
case kStop: return osEnd;
|
|
||||||
case kBack: slideShow = false;
|
|
||||||
cRemote::CallPlugin(PLUGIN_NAME_I18N);
|
|
||||||
break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
if (slideShow && slideShowDelay.TimedOut()) {
|
|
||||||
NextPicture(+1);
|
|
||||||
slideShowDelay.Set(SlideShowDelay * 1000);
|
|
||||||
}
|
|
||||||
return osContinue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *cPictureControl::LastDisplayed(void)
|
|
||||||
{
|
|
||||||
return lastDisplayed;
|
|
||||||
}
|
|
@ -1,48 +0,0 @@
|
|||||||
/*
|
|
||||||
* player.h: A player for still pictures
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: player.h 2.1 2012/04/28 11:56:01 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _PLAYER_H
|
|
||||||
#define _PLAYER_H
|
|
||||||
|
|
||||||
#include <vdr/osd.h>
|
|
||||||
#include <vdr/player.h>
|
|
||||||
#include <vdr/tools.h>
|
|
||||||
#include "entry.h"
|
|
||||||
|
|
||||||
extern int SlideShowDelay;
|
|
||||||
|
|
||||||
cString HandleUnderscores(const char *s);
|
|
||||||
|
|
||||||
class cPicturePlayer;
|
|
||||||
|
|
||||||
class cPictureControl : public cControl {
|
|
||||||
private:
|
|
||||||
static int active;
|
|
||||||
static cString lastDisplayed;
|
|
||||||
cPictureEntry *pictures;
|
|
||||||
const cPictureEntry *pictureEntry;
|
|
||||||
cPicturePlayer *player;
|
|
||||||
cOsd *osd;
|
|
||||||
cString lastPath;
|
|
||||||
cTimeMs slideShowDelay;
|
|
||||||
bool slideShow;
|
|
||||||
bool alwaysDisplayCaption;
|
|
||||||
void NextPicture(int Direction);
|
|
||||||
void NextDirectory(int Direction);
|
|
||||||
void DisplayCaption(void);
|
|
||||||
virtual void Hide(void) {}
|
|
||||||
public:
|
|
||||||
cPictureControl(cPictureEntry *Pictures, const cPictureEntry *PictureEntry, bool SlideShow = false);
|
|
||||||
virtual ~cPictureControl();
|
|
||||||
virtual cString GetHeader(void);
|
|
||||||
virtual eOSState ProcessKey(eKeys Key);
|
|
||||||
static bool Active(void) { return active > 0; }
|
|
||||||
static const char *LastDisplayed(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif //_PLAYER_H
|
|
@ -1,33 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Klaus Schmidinger <vdr@tvdr.de>, 2008
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
|
||||||
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
|
||||||
"Last-Translator: Klaus Schmidinger <vdr@tvdr.de>\n"
|
|
||||||
"Language-Team: German <vdr@linuxtv.org>\n"
|
|
||||||
"Language: de\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
|
|
||||||
msgid "Pictures"
|
|
||||||
msgstr "Bilder"
|
|
||||||
|
|
||||||
msgid "A simple picture viewer"
|
|
||||||
msgstr "Ein einfacher Bildbetrachter"
|
|
||||||
|
|
||||||
msgid "Picture directory"
|
|
||||||
msgstr "Bilder-Verzeichnis"
|
|
||||||
|
|
||||||
msgid "Slide show delay (s)"
|
|
||||||
msgstr "Dia-Schau Wartezeit"
|
|
||||||
|
|
||||||
msgid "No picture directory has been defined!"
|
|
||||||
msgstr "Es wurde kein Bilder-Verzeichnis angegeben!"
|
|
@ -1,33 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Arthur Konovalov <artlov@gmail.com>, 2015
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
|
||||||
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
|
||||||
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
|
|
||||||
"Language-Team: Estonian <vdr@linuxtv.org>\n"
|
|
||||||
"Language: et\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
|
|
||||||
msgid "Pictures"
|
|
||||||
msgstr "Pildid"
|
|
||||||
|
|
||||||
msgid "A simple picture viewer"
|
|
||||||
msgstr "Lihtne pildivaatur"
|
|
||||||
|
|
||||||
msgid "Picture directory"
|
|
||||||
msgstr "Pildikaust"
|
|
||||||
|
|
||||||
msgid "Slide show delay (s)"
|
|
||||||
msgstr "Slaidiseanssi viide (s)"
|
|
||||||
|
|
||||||
msgid "No picture directory has been defined!"
|
|
||||||
msgstr "Pildikaust on määramata!"
|
|
@ -1,33 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>, 2008
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
|
||||||
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
|
||||||
"Last-Translator: Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>\n"
|
|
||||||
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
|
||||||
"Language: fi\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
|
|
||||||
msgid "Pictures"
|
|
||||||
msgstr "Kuvat"
|
|
||||||
|
|
||||||
msgid "A simple picture viewer"
|
|
||||||
msgstr "Yksinkertainen kuvaselain"
|
|
||||||
|
|
||||||
msgid "Picture directory"
|
|
||||||
msgstr "Kuvahakemisto"
|
|
||||||
|
|
||||||
msgid "Slide show delay (s)"
|
|
||||||
msgstr "Diaesityksen viive (s)"
|
|
||||||
|
|
||||||
msgid "No picture directory has been defined!"
|
|
||||||
msgstr "Kuvahakemistoa ei ole määritelty!"
|
|
@ -1,33 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Patrice Staudt <patrice.staudt@laposte.net>, 2008
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
|
||||||
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
|
||||||
"Last-Translator: Patrice Staudt <patrice.staudt@laposte.net>\n"
|
|
||||||
"Language-Team: French <vdr@linuxtv.org>\n"
|
|
||||||
"Language: fr\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
|
|
||||||
msgid "Pictures"
|
|
||||||
msgstr "Images"
|
|
||||||
|
|
||||||
msgid "A simple picture viewer"
|
|
||||||
msgstr "Un simple visualiseur d'images"
|
|
||||||
|
|
||||||
msgid "Picture directory"
|
|
||||||
msgstr "Dossier des images"
|
|
||||||
|
|
||||||
msgid "Slide show delay (s)"
|
|
||||||
msgstr "Pause entre deux images (s)"
|
|
||||||
|
|
||||||
msgid "No picture directory has been defined!"
|
|
||||||
msgstr "Aucun dossier n'est définit!"
|
|
@ -1,33 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Diego Pierotto <vdr-italian@tiscali.it>, 2008
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
|
||||||
"PO-Revision-Date: 2008-01-27 20:22+0100\n"
|
|
||||||
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
|
|
||||||
"Language-Team: Italian <vdr@linuxtv.org>\n"
|
|
||||||
"Language: it\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
|
|
||||||
msgid "Pictures"
|
|
||||||
msgstr "Immagini"
|
|
||||||
|
|
||||||
msgid "A simple picture viewer"
|
|
||||||
msgstr "Un semplice visualizzatore immagini"
|
|
||||||
|
|
||||||
msgid "Picture directory"
|
|
||||||
msgstr "Directory immagini"
|
|
||||||
|
|
||||||
msgid "Slide show delay (s)"
|
|
||||||
msgstr "Ritardo diapositive (s)"
|
|
||||||
|
|
||||||
msgid "No picture directory has been defined!"
|
|
||||||
msgstr "Nessuna directory immagini impostata!"
|
|
@ -1,33 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Valdemaras Pipiras <varas@ambernet.lt>, 2009
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
|
||||||
"PO-Revision-Date: 2009-12-08 12:41+0100\n"
|
|
||||||
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>, 2009\n"
|
|
||||||
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
|
|
||||||
"Language: lt\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
|
|
||||||
msgid "Pictures"
|
|
||||||
msgstr "Nuotraukos"
|
|
||||||
|
|
||||||
msgid "A simple picture viewer"
|
|
||||||
msgstr "Paprasta nuotraukų naršyklė"
|
|
||||||
|
|
||||||
msgid "Picture directory"
|
|
||||||
msgstr "Nuotraukų katalogas"
|
|
||||||
|
|
||||||
msgid "Slide show delay (s)"
|
|
||||||
msgstr "Skaidrių peržiūros užlaikymas (s)"
|
|
||||||
|
|
||||||
msgid "No picture directory has been defined!"
|
|
||||||
msgstr "Nenustatytas nuotraukų katalogas!"
|
|
@ -1,34 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Tomasz Maciej Nowak <tmn505@gmail.com>, 2018
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2018-02-19 00:48+0100\n"
|
|
||||||
"PO-Revision-Date: 2018-02-19 00:53+0100\n"
|
|
||||||
"Last-Translator: Tomasz Maciej Nowak <tmn505@gmail.com>\n"
|
|
||||||
"Language-Team: Polish <vdr@linuxtv.org>\n"
|
|
||||||
"Language: pl_PL\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
|
||||||
"X-Generator: Poedit 2.0.6\n"
|
|
||||||
|
|
||||||
msgid "Pictures"
|
|
||||||
msgstr "Zdjęcia"
|
|
||||||
|
|
||||||
msgid "A simple picture viewer"
|
|
||||||
msgstr "Prosta przeglądarka zdjęć"
|
|
||||||
|
|
||||||
msgid "Picture directory"
|
|
||||||
msgstr "Katalog ze zdjęciami"
|
|
||||||
|
|
||||||
msgid "Slide show delay (s)"
|
|
||||||
msgstr "Pokaz slajdów opóźnienie (s)"
|
|
||||||
|
|
||||||
msgid "No picture directory has been defined!"
|
|
||||||
msgstr "Nie zdefiniowano katalogu ze zdjęciami!"
|
|
@ -1,34 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Alexander Gross <Bikalexander@gmail.com>, 2008
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
|
||||||
"PO-Revision-Date: 2008-03-14 00:45+0100\n"
|
|
||||||
"Last-Translator: Alexander Gross <Bikalexander@gmail.com>\n"
|
|
||||||
"Language-Team: Russian <vdr@linuxtv.org>\n"
|
|
||||||
"Language: ru\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-5\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
"X-Generator: KBabel 1.11.4\n"
|
|
||||||
|
|
||||||
msgid "Pictures"
|
|
||||||
msgstr "¸×ÞÑàÐÖÕÝØï"
|
|
||||||
|
|
||||||
msgid "A simple picture viewer"
|
|
||||||
msgstr "¿àÞáâÐï ßàÞÓàÐÜÜÐ ßàÞáÜÞâàÐ Ø×ÞÑàÐÖÕÝØÙ"
|
|
||||||
|
|
||||||
msgid "Picture directory"
|
|
||||||
msgstr "ºÐâÐÛÞÓ Ø×ÞÑàÐÖÕÝØÙ"
|
|
||||||
|
|
||||||
msgid "Slide show delay (s)"
|
|
||||||
msgstr "·ÐÔÕàÖÚÐ áÛÐÙÔ-èÞã (áÕÚ)"
|
|
||||||
|
|
||||||
msgid "No picture directory has been defined!"
|
|
||||||
msgstr "½Õ ÞßàÕÔÕÛñÝ ÚÐâÐÛÞÓ Ø×ÞÑàÐÖÕÝØÙ!"
|
|
@ -1,32 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Klaus Schmidinger <vdr@tvdr.de>, 2008
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
|
||||||
"PO-Revision-Date: 2009-09-30 12:54+0100\n"
|
|
||||||
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
|
|
||||||
"Language-Team: Slovak <vdr@linuxtv.org>\n"
|
|
||||||
"Language: sk\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=iso-8859-2\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "Pictures"
|
|
||||||
msgstr "Obrázky"
|
|
||||||
|
|
||||||
msgid "A simple picture viewer"
|
|
||||||
msgstr "Jednoduchý prehliadaè obrázkov"
|
|
||||||
|
|
||||||
msgid "Picture directory"
|
|
||||||
msgstr "Umiestnenie obrázkov"
|
|
||||||
|
|
||||||
msgid "Slide show delay (s)"
|
|
||||||
msgstr "Oneskorenie prezentácia (s)"
|
|
||||||
|
|
||||||
msgid "No picture directory has been defined!"
|
|
||||||
msgstr "Neboli preukázané ¾iadne fotky v adresári!"
|
|
@ -1,340 +0,0 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 2, June 1991
|
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
License is intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users. This
|
|
||||||
General Public License applies to most of the Free Software
|
|
||||||
Foundation's software and to any other program whose authors commit to
|
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
|
||||||
the GNU Lesser General Public License instead.) You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
this service if you wish), that you receive source code or can get it
|
|
||||||
if you want it, that you can change the software or use pieces of it
|
|
||||||
in new free programs; and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
|
||||||
These restrictions translate to certain responsibilities for you if you
|
|
||||||
distribute copies of the software, or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
|
||||||
you have. You must make sure that they, too, receive or can get the
|
|
||||||
source code. And you must show them these terms so they know their
|
|
||||||
rights.
|
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
|
||||||
distribute and/or modify the software.
|
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
|
||||||
that everyone understands that there is no warranty for this free
|
|
||||||
software. If the software is modified by someone else and passed on, we
|
|
||||||
want its recipients to know that what they have is not the original, so
|
|
||||||
that any problems introduced by others will not reflect on the original
|
|
||||||
authors' reputations.
|
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
|
||||||
program will individually obtain patent licenses, in effect making the
|
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
|
||||||
under the terms of this General Public License. The "Program", below,
|
|
||||||
refers to any such program or work, and a "work based on the Program"
|
|
||||||
means either the Program or any derivative work under copyright law:
|
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
|
||||||
source code as you receive it, in any medium, provided that you
|
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
notices that refer to this License and to the absence of any warranty;
|
|
||||||
and give any other recipients of the Program a copy of this License
|
|
||||||
along with the Program.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
|
||||||
of it, thus forming a work based on the Program, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
|
||||||
whole or in part contains or is derived from the Program or any
|
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
parties under the terms of this License.
|
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
|
||||||
when run, you must cause it, when started running for such
|
|
||||||
interactive use in the most ordinary way, to print or display an
|
|
||||||
announcement including an appropriate copyright notice and a
|
|
||||||
notice that there is no warranty (or else, saying that you provide
|
|
||||||
a warranty) and that users may redistribute the program under
|
|
||||||
these conditions, and telling the user how to view a copy of this
|
|
||||||
License. (Exception: if the Program itself is interactive but
|
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Program,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Program.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
|
||||||
under Section 2) in object code or executable form under the terms of
|
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
|
||||||
source code, which must be distributed under the terms of Sections
|
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
|
||||||
years, to give any third party, for a charge no more than your
|
|
||||||
cost of physically performing source distribution, a complete
|
|
||||||
machine-readable copy of the corresponding source code, to be
|
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
customarily used for software interchange; or,
|
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
|
||||||
to distribute corresponding source code. (This alternative is
|
|
||||||
allowed only for noncommercial distribution and only if you
|
|
||||||
received the program in object code or executable form with such
|
|
||||||
an offer, in accord with Subsection b above.)
|
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For an executable work, complete source
|
|
||||||
code means all the source code for all modules it contains, plus any
|
|
||||||
associated interface definition files, plus the scripts used to
|
|
||||||
control compilation and installation of the executable. However, as a
|
|
||||||
special exception, the source code distributed need not include
|
|
||||||
anything that is normally distributed (in either source or binary
|
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
|
||||||
operating system on which the executable runs, unless that component
|
|
||||||
itself accompanies the executable.
|
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
|
||||||
access to copy from a designated place, then offering equivalent
|
|
||||||
access to copy the source code from the same place counts as
|
|
||||||
distribution of the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
except as expressly provided under this License. Any attempt
|
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
void, and will automatically terminate your rights under this License.
|
|
||||||
However, parties who have received copies, or rights, from you under
|
|
||||||
this License will not have their licenses terminated so long as such
|
|
||||||
parties remain in full compliance.
|
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Program or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Program (or any work based on the
|
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Program or works based on it.
|
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
|
||||||
Program), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
|
||||||
these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties to
|
|
||||||
this License.
|
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Program at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Program by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Program.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
|
||||||
any particular circumstance, the balance of the section is intended to
|
|
||||||
apply and the section as a whole is intended to apply in other
|
|
||||||
circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system, which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Program under this License
|
|
||||||
may add an explicit geographical distribution limitation excluding
|
|
||||||
those countries, so that distribution is permitted only in or among
|
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
|
||||||
specifies a version number of this License which applies to it and "any
|
|
||||||
later version", you have the option of following the terms and conditions
|
|
||||||
either of that version or of any later version published by the Free
|
|
||||||
Software Foundation. If the Program does not specify a version number of
|
|
||||||
this License, you may choose any version ever published by the Free Software
|
|
||||||
Foundation.
|
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
|
||||||
programs whose distribution conditions are different, write to the author
|
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
of preserving the free status of all derivatives of our free software and
|
|
||||||
of promoting the sharing and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
|
||||||
when it starts in an interactive mode:
|
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) year name of author
|
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, the commands you use may
|
|
||||||
be called something other than `show w' and `show c'; they could even be
|
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License.
|
|
@ -1,39 +0,0 @@
|
|||||||
VDR Plugin 'servicedemo' Revision History
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
2005-08-21: Version 0.1.1
|
|
||||||
|
|
||||||
- Initial revision.
|
|
||||||
|
|
||||||
2007-08-15: Version 0.1.2
|
|
||||||
|
|
||||||
- Moved the "all" target in the Makefile before the "Implicit rules",
|
|
||||||
so that a plain "make" will compile everything.
|
|
||||||
|
|
||||||
2012-12-27: Version 0.1.3
|
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
|
||||||
|
|
||||||
2013-01-12: Version 0.1.4
|
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
|
||||||
|
|
||||||
2013-03-31: Version 2.0.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2014-01-01: Version 2.1.1
|
|
||||||
|
|
||||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
|
||||||
|
|
||||||
2015-02-19: Version 2.2.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2018-04-15: Version 2.4.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2021-12-27: Version 2.6.0
|
|
||||||
|
|
||||||
- Official release.
|
|
@ -1,99 +0,0 @@
|
|||||||
#
|
|
||||||
# Makefile for a Video Disk Recorder plugin
|
|
||||||
#
|
|
||||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
|
||||||
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
PLUGIN1 = svccli
|
|
||||||
PLUGIN2 = svcsvr
|
|
||||||
|
|
||||||
### The version number of this plugin (taken from the main source file):
|
|
||||||
|
|
||||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN1).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
|
||||||
|
|
||||||
### The directory environment:
|
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
|
||||||
PKG_CONFIG ?= pkg-config
|
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
|
||||||
LIBDIR = $(call PKGCFG,libdir)
|
|
||||||
PLGCFG = $(call PKGCFG,plgcfg)
|
|
||||||
#
|
|
||||||
TMPDIR ?= /tmp
|
|
||||||
|
|
||||||
### The compiler options:
|
|
||||||
|
|
||||||
export CFLAGS = $(call PKGCFG,cflags)
|
|
||||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
|
||||||
|
|
||||||
### 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 = svcintf-$(VERSION)
|
|
||||||
PACKAGE = vdr-$(ARCHIVE)
|
|
||||||
|
|
||||||
### Includes and Defines (add further entries here):
|
|
||||||
|
|
||||||
INCLUDES +=
|
|
||||||
|
|
||||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
|
||||||
|
|
||||||
### The object files (add further files here):
|
|
||||||
|
|
||||||
OBJS = $(PLUGIN1).o $(PLUGIN2).o
|
|
||||||
|
|
||||||
### The main target:
|
|
||||||
|
|
||||||
all: libvdr-$(PLUGIN1).so libvdr-$(PLUGIN2).so
|
|
||||||
|
|
||||||
### Implicit rules:
|
|
||||||
|
|
||||||
%.o: %.c
|
|
||||||
@echo CC $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
|
||||||
|
|
||||||
### Dependencies:
|
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
|
||||||
DEPFILE = .dependencies
|
|
||||||
$(DEPFILE): Makefile
|
|
||||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
|
||||||
|
|
||||||
-include $(DEPFILE)
|
|
||||||
|
|
||||||
### Targets:
|
|
||||||
|
|
||||||
libvdr-$(PLUGIN1).so: $(PLUGIN1).o
|
|
||||||
@echo LD $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN1).o -o $@
|
|
||||||
|
|
||||||
libvdr-$(PLUGIN2).so: $(PLUGIN2).o
|
|
||||||
@echo LD $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN2).o -o $@
|
|
||||||
|
|
||||||
install-lib: libvdr-$(PLUGIN1).so libvdr-$(PLUGIN2).so
|
|
||||||
install -D libvdr-$(PLUGIN1).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN1).so.$(APIVERSION)
|
|
||||||
install -D libvdr-$(PLUGIN2).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN2).so.$(APIVERSION)
|
|
||||||
|
|
||||||
install: install-lib
|
|
||||||
|
|
||||||
dist: clean
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@echo Distribution package created as $(PACKAGE).tgz
|
|
||||||
|
|
||||||
clean:
|
|
||||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
|
@ -1,20 +0,0 @@
|
|||||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
|
||||||
|
|
||||||
Written by: Udo Richter <udo_richter@gmx.de>
|
|
||||||
|
|
||||||
Project's homepage: https://www.tvdr.de
|
|
||||||
|
|
||||||
Latest version available at: https://www.tvdr.de
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Description:
|
|
||||||
|
|
||||||
Demonstration of how plugins can communicate with each other.
|
|
||||||
|
|
||||||
Run VDR with '-Psvcsvr -Psvccli' and select the main menu
|
|
||||||
option "Service demo" to run the demo.
|
|
@ -1,90 +0,0 @@
|
|||||||
/*
|
|
||||||
* svccli.c: Sample service client plugin
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: svccli.c 4.1 2018/04/10 13:00:53 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <vdr/interface.h>
|
|
||||||
#include <vdr/plugin.h>
|
|
||||||
|
|
||||||
static const char *VERSION = "2.4.0";
|
|
||||||
static const char *DESCRIPTION = "Service demo client";
|
|
||||||
static const char *MAINMENUENTRY = "Service demo";
|
|
||||||
|
|
||||||
class cPluginSvcCli : public cPlugin {
|
|
||||||
public:
|
|
||||||
virtual const char *Version(void) { return VERSION; }
|
|
||||||
virtual const char *Description(void) { return DESCRIPTION; }
|
|
||||||
virtual const char *MainMenuEntry(void) { return MAINMENUENTRY; }
|
|
||||||
virtual cOsdObject *MainMenuAction(void);
|
|
||||||
virtual bool Service(const char *Id, void *Data);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ReportBoredPlugin_v1_0 {
|
|
||||||
cPlugin *BoredPlugin;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct AddService_v1_0 {
|
|
||||||
int a, b;
|
|
||||||
int sum;
|
|
||||||
};
|
|
||||||
|
|
||||||
// --- cPluginSvcCli ---------------------------------------------------------
|
|
||||||
|
|
||||||
cOsdObject *cPluginSvcCli::MainMenuAction(void)
|
|
||||||
{
|
|
||||||
char s[128];
|
|
||||||
cPlugin *p;
|
|
||||||
|
|
||||||
// Inform server plugin that we are bored
|
|
||||||
// (directed communication)
|
|
||||||
ReportBoredPlugin_v1_0 rbp;
|
|
||||||
rbp.BoredPlugin = this;
|
|
||||||
p = cPluginManager::GetPlugin("svcsvr");
|
|
||||||
if (p)
|
|
||||||
p->Service("ReportBoredPlugin-v1.0", &rbp);
|
|
||||||
|
|
||||||
// See if any plugin can add
|
|
||||||
// (detect capability)
|
|
||||||
p = cPluginManager::CallFirstService("AddService-v1.0", NULL);
|
|
||||||
if (p) {
|
|
||||||
snprintf(s, sizeof(s), "Plugin %s can add", p->Name());
|
|
||||||
Interface->Confirm(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform add
|
|
||||||
// (use general service)
|
|
||||||
AddService_v1_0 adds;
|
|
||||||
adds.a = 1;
|
|
||||||
adds.b = 1;
|
|
||||||
if (cPluginManager::CallFirstService("AddService-v1.0", &adds)) {
|
|
||||||
snprintf(s, sizeof(s), "Plugin thinks that 1+1=%i", adds.sum);
|
|
||||||
Interface->Confirm(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inform other plugins that we are bored
|
|
||||||
// (broadcast)
|
|
||||||
rbp.BoredPlugin = this;
|
|
||||||
cPluginManager::CallAllServices("ReportBoredPlugin-v1.0", &rbp);
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cPluginSvcCli::Service(const char *Id, void *Data)
|
|
||||||
{
|
|
||||||
if (strcmp(Id, "ReportBoredPlugin-v1.0") == 0) {
|
|
||||||
if (Data) {
|
|
||||||
ReportBoredPlugin_v1_0 *rbp = (ReportBoredPlugin_v1_0*)Data;
|
|
||||||
char s[128];
|
|
||||||
snprintf(s, sizeof(s), "Plugin %s informed client that it is bored.", rbp->BoredPlugin->Name());
|
|
||||||
Interface->Confirm(s);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
VDRPLUGINCREATOR(cPluginSvcCli); // Don't touch this!
|
|
@ -1,57 +0,0 @@
|
|||||||
/*
|
|
||||||
* svcsvr.c: Sample service server plugin
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: svcsvr.c 4.1 2018/04/10 13:00:57 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <vdr/interface.h>
|
|
||||||
#include <vdr/plugin.h>
|
|
||||||
|
|
||||||
static const char *VERSION = "2.4.0";
|
|
||||||
static const char *DESCRIPTION = "Service demo server";
|
|
||||||
|
|
||||||
class cPluginSvcSvr : public cPlugin {
|
|
||||||
public:
|
|
||||||
virtual const char *Version(void) { return VERSION; }
|
|
||||||
virtual const char *Description(void) { return DESCRIPTION; }
|
|
||||||
virtual bool Service(const char *Id, void *Data);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ReportBoredPlugin_v1_0 {
|
|
||||||
cPlugin *BoredPlugin;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct AddService_v1_0 {
|
|
||||||
int a, b;
|
|
||||||
int sum;
|
|
||||||
};
|
|
||||||
|
|
||||||
// --- cPluginSvcSvr ---------------------------------------------------------
|
|
||||||
|
|
||||||
bool cPluginSvcSvr::Service(const char *Id, void *Data)
|
|
||||||
{
|
|
||||||
if (strcmp(Id,"ReportBoredPlugin-v1.0") == 0) {
|
|
||||||
if (Data) {
|
|
||||||
ReportBoredPlugin_v1_0 *rbp = (ReportBoredPlugin_v1_0*)Data;
|
|
||||||
char s[128];
|
|
||||||
snprintf(s, sizeof(s), "Plugin %s informed server that it is bored.", rbp->BoredPlugin->Name());
|
|
||||||
Interface->Confirm(s);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp(Id,"AddService-v1.0") == 0) {
|
|
||||||
if (Data) {
|
|
||||||
AddService_v1_0 *data = (AddService_v1_0*)Data;
|
|
||||||
data->sum = data->a + data->b;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
VDRPLUGINCREATOR(cPluginSvcSvr); // Don't touch this!
|
|
@ -1,340 +0,0 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 2, June 1991
|
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
License is intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users. This
|
|
||||||
General Public License applies to most of the Free Software
|
|
||||||
Foundation's software and to any other program whose authors commit to
|
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
|
||||||
the GNU Lesser General Public License instead.) You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
this service if you wish), that you receive source code or can get it
|
|
||||||
if you want it, that you can change the software or use pieces of it
|
|
||||||
in new free programs; and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
|
||||||
These restrictions translate to certain responsibilities for you if you
|
|
||||||
distribute copies of the software, or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
|
||||||
you have. You must make sure that they, too, receive or can get the
|
|
||||||
source code. And you must show them these terms so they know their
|
|
||||||
rights.
|
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
|
||||||
distribute and/or modify the software.
|
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
|
||||||
that everyone understands that there is no warranty for this free
|
|
||||||
software. If the software is modified by someone else and passed on, we
|
|
||||||
want its recipients to know that what they have is not the original, so
|
|
||||||
that any problems introduced by others will not reflect on the original
|
|
||||||
authors' reputations.
|
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
|
||||||
program will individually obtain patent licenses, in effect making the
|
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
|
||||||
under the terms of this General Public License. The "Program", below,
|
|
||||||
refers to any such program or work, and a "work based on the Program"
|
|
||||||
means either the Program or any derivative work under copyright law:
|
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
|
||||||
source code as you receive it, in any medium, provided that you
|
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
notices that refer to this License and to the absence of any warranty;
|
|
||||||
and give any other recipients of the Program a copy of this License
|
|
||||||
along with the Program.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
|
||||||
of it, thus forming a work based on the Program, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
|
||||||
whole or in part contains or is derived from the Program or any
|
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
parties under the terms of this License.
|
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
|
||||||
when run, you must cause it, when started running for such
|
|
||||||
interactive use in the most ordinary way, to print or display an
|
|
||||||
announcement including an appropriate copyright notice and a
|
|
||||||
notice that there is no warranty (or else, saying that you provide
|
|
||||||
a warranty) and that users may redistribute the program under
|
|
||||||
these conditions, and telling the user how to view a copy of this
|
|
||||||
License. (Exception: if the Program itself is interactive but
|
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Program,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Program.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
|
||||||
under Section 2) in object code or executable form under the terms of
|
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
|
||||||
source code, which must be distributed under the terms of Sections
|
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
|
||||||
years, to give any third party, for a charge no more than your
|
|
||||||
cost of physically performing source distribution, a complete
|
|
||||||
machine-readable copy of the corresponding source code, to be
|
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
customarily used for software interchange; or,
|
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
|
||||||
to distribute corresponding source code. (This alternative is
|
|
||||||
allowed only for noncommercial distribution and only if you
|
|
||||||
received the program in object code or executable form with such
|
|
||||||
an offer, in accord with Subsection b above.)
|
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For an executable work, complete source
|
|
||||||
code means all the source code for all modules it contains, plus any
|
|
||||||
associated interface definition files, plus the scripts used to
|
|
||||||
control compilation and installation of the executable. However, as a
|
|
||||||
special exception, the source code distributed need not include
|
|
||||||
anything that is normally distributed (in either source or binary
|
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
|
||||||
operating system on which the executable runs, unless that component
|
|
||||||
itself accompanies the executable.
|
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
|
||||||
access to copy from a designated place, then offering equivalent
|
|
||||||
access to copy the source code from the same place counts as
|
|
||||||
distribution of the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
except as expressly provided under this License. Any attempt
|
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
void, and will automatically terminate your rights under this License.
|
|
||||||
However, parties who have received copies, or rights, from you under
|
|
||||||
this License will not have their licenses terminated so long as such
|
|
||||||
parties remain in full compliance.
|
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Program or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Program (or any work based on the
|
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Program or works based on it.
|
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
|
||||||
Program), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
|
||||||
these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties to
|
|
||||||
this License.
|
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Program at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Program by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Program.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
|
||||||
any particular circumstance, the balance of the section is intended to
|
|
||||||
apply and the section as a whole is intended to apply in other
|
|
||||||
circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system, which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Program under this License
|
|
||||||
may add an explicit geographical distribution limitation excluding
|
|
||||||
those countries, so that distribution is permitted only in or among
|
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
|
||||||
specifies a version number of this License which applies to it and "any
|
|
||||||
later version", you have the option of following the terms and conditions
|
|
||||||
either of that version or of any later version published by the Free
|
|
||||||
Software Foundation. If the Program does not specify a version number of
|
|
||||||
this License, you may choose any version ever published by the Free Software
|
|
||||||
Foundation.
|
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
|
||||||
programs whose distribution conditions are different, write to the author
|
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
of preserving the free status of all derivatives of our free software and
|
|
||||||
of promoting the sharing and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
|
||||||
when it starts in an interactive mode:
|
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) year name of author
|
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, the commands you use may
|
|
||||||
be called something other than `show w' and `show c'; they could even be
|
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License.
|
|
@ -1,163 +0,0 @@
|
|||||||
VDR Plugin 'skincurses' Revision History
|
|
||||||
----------------------------------------
|
|
||||||
|
|
||||||
2004-05-31: Version 0.0.1
|
|
||||||
|
|
||||||
- Initial revision.
|
|
||||||
|
|
||||||
2004-05-31: Version 0.0.2
|
|
||||||
|
|
||||||
- Fixed some default parameters.
|
|
||||||
|
|
||||||
2005-01-02: Version 0.0.3
|
|
||||||
|
|
||||||
- Made several functions threadsafe.
|
|
||||||
- New audio track display.
|
|
||||||
|
|
||||||
2005-05-16: Version 0.0.4
|
|
||||||
|
|
||||||
- New "recording info" display.
|
|
||||||
|
|
||||||
2005-10-01:
|
|
||||||
|
|
||||||
- Added a note about using this skin to the README file.
|
|
||||||
|
|
||||||
2005-11-26: Version 0.0.5
|
|
||||||
|
|
||||||
- Fixed SetProgress() in case Total is 0.
|
|
||||||
|
|
||||||
2006-04-14: Version 0.0.6
|
|
||||||
|
|
||||||
- Added a missing "Key$" in skincurses.c.
|
|
||||||
|
|
||||||
2006-06-03: Version 0.0.7
|
|
||||||
|
|
||||||
- Fixed handling tabbed item display.
|
|
||||||
- When the 'skincurses' plugin is loaded, it automatically sets the 'curses'
|
|
||||||
skin as the current one.
|
|
||||||
|
|
||||||
2006-09-10: Version 0.0.8
|
|
||||||
|
|
||||||
- The size of the OSD is now adjusted to the size of the console window.
|
|
||||||
|
|
||||||
2007-06-15: Version 0.1.0
|
|
||||||
|
|
||||||
- Implemented UTF-8 handling.
|
|
||||||
|
|
||||||
2007-06-23: Version 0.1.1
|
|
||||||
|
|
||||||
- Fixed a name clash with the new cOsd position functions.
|
|
||||||
|
|
||||||
2007-07-20: Version 0.1.2
|
|
||||||
|
|
||||||
- Fixed clearing color buttons.
|
|
||||||
|
|
||||||
2007-08-15: Version 0.1.3
|
|
||||||
|
|
||||||
- Moved the "all" target in the Makefile before the "Implicit rules",
|
|
||||||
so that a plain "make" will compile everything.
|
|
||||||
- Added internationalization.
|
|
||||||
|
|
||||||
2007-08-26: Version 0.1.4
|
|
||||||
|
|
||||||
- Adapted to the new Level parameter of cOsd.
|
|
||||||
|
|
||||||
2008-01-19:
|
|
||||||
|
|
||||||
- Updated the Makefile of the skincurses plugin (thanks to Rolf Ahrenberg).
|
|
||||||
|
|
||||||
2008-02-15: Version 0.1.5
|
|
||||||
|
|
||||||
- Using cString::sprintf() instead of asprintf().
|
|
||||||
- Implemented cSkinCursesDisplayMenu::SetScrollbar().
|
|
||||||
|
|
||||||
2008-02-23: Version 0.1.6
|
|
||||||
|
|
||||||
- Revised the fix of calculating the scrollbar height in the skins. The scrollbar
|
|
||||||
handle now always has a height that is at least the width of the scrollbar.
|
|
||||||
|
|
||||||
2008-03-14: Version 0.1.7
|
|
||||||
|
|
||||||
- Added Russian translations (thanks to Alexander Gross).
|
|
||||||
|
|
||||||
2010-01-03: Version 0.1.8
|
|
||||||
|
|
||||||
- Displaying "genre" in event descriptions.
|
|
||||||
- Displaying "parental rating" in event descriptions.
|
|
||||||
|
|
||||||
2010-02-28: Version 0.1.9
|
|
||||||
|
|
||||||
- Added Lithuanian language translations (thanks to Valdemaras Pipiras).
|
|
||||||
|
|
||||||
2011-05-15: Version 0.1.10
|
|
||||||
|
|
||||||
- Avoiding a gcc 4.6 compiler error (thanks to Tobias Grimm).
|
|
||||||
|
|
||||||
2012-03-11: Version 0.1.11
|
|
||||||
|
|
||||||
- Adapted menu column widths of 'skincurses' to the wider HD OSD sizes.
|
|
||||||
|
|
||||||
2012-04-23: Version 0.1.12
|
|
||||||
|
|
||||||
- Now displaying disk usage in the title of the main and "Recordings" menu,
|
|
||||||
which is no longer done by the VDR core.
|
|
||||||
|
|
||||||
2012-12-27: Version 0.1.13
|
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
|
||||||
|
|
||||||
2013-01-12: Version 0.1.14
|
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
|
||||||
|
|
||||||
2013-03-03: Version 0.1.15
|
|
||||||
|
|
||||||
- The "Recording info" page now displays the name of the channel (if available)
|
|
||||||
from which this recording was taken.
|
|
||||||
|
|
||||||
2013-03-31: Version 2.0.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2014-01-01: Version 2.1.1
|
|
||||||
|
|
||||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
|
||||||
|
|
||||||
2015-02-08: Version 2.1.2
|
|
||||||
|
|
||||||
- Added a missing trailing blank in some translations.
|
|
||||||
|
|
||||||
2015-02-19: Version 2.2.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2016-12-22: Version 2.3.2
|
|
||||||
|
|
||||||
- Added cFont::Width(void) to get the default character width and allow stretched
|
|
||||||
font drawing in high level OSDs (dummy for skincurses).
|
|
||||||
- Fixed truncated date/time strings in the skins on multi-byte UTF-8 systems
|
|
||||||
(reported by Sergey Chernyavskiy).
|
|
||||||
|
|
||||||
2018-04-15: Version 2.4.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2019-03-12: Version 2.4.1
|
|
||||||
|
|
||||||
- Changes for ncurses version 6 (thanks to Ulrick Eckhardt).
|
|
||||||
|
|
||||||
2020-05-11: Version 2.4.2
|
|
||||||
|
|
||||||
- Fixed 'Changes for ncurses version 6'.
|
|
||||||
- Reacting to changes in screen size.
|
|
||||||
- Simplified color handling.
|
|
||||||
- Using 'stdscr' directly instead of an additional window.
|
|
||||||
|
|
||||||
2021-07-01: Version 2.4.3
|
|
||||||
|
|
||||||
- The number of errors (if any) of a recording is now displayed in the recording's
|
|
||||||
Info menu.
|
|
||||||
|
|
||||||
2021-12-27: Version 2.6.0
|
|
||||||
|
|
||||||
- Official release.
|
|
@ -1,128 +0,0 @@
|
|||||||
#
|
|
||||||
# Makefile for a Video Disk Recorder plugin
|
|
||||||
#
|
|
||||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
|
||||||
|
|
||||||
# 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 = skincurses
|
|
||||||
|
|
||||||
### The version number of this plugin (taken from the main source file):
|
|
||||||
|
|
||||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
|
||||||
|
|
||||||
### The directory environment:
|
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
|
||||||
PKG_CONFIG ?= pkg-config
|
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
|
||||||
LIBDIR = $(call PKGCFG,libdir)
|
|
||||||
LOCDIR = $(call PKGCFG,locdir)
|
|
||||||
PLGCFG = $(call PKGCFG,plgcfg)
|
|
||||||
#
|
|
||||||
TMPDIR ?= /tmp
|
|
||||||
|
|
||||||
### The compiler options:
|
|
||||||
|
|
||||||
export CFLAGS = $(call PKGCFG,cflags)
|
|
||||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
|
||||||
|
|
||||||
### 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 +=
|
|
||||||
|
|
||||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
|
||||||
|
|
||||||
### The object files (add further files here):
|
|
||||||
|
|
||||||
OBJS = $(PLUGIN).o
|
|
||||||
|
|
||||||
### The main target:
|
|
||||||
|
|
||||||
all: $(SOFILE) i18n
|
|
||||||
|
|
||||||
### Implicit rules:
|
|
||||||
|
|
||||||
%.o: %.c
|
|
||||||
@echo CC $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
|
||||||
|
|
||||||
### Dependencies:
|
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
|
||||||
DEPFILE = .dependencies
|
|
||||||
$(DEPFILE): Makefile
|
|
||||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
|
||||||
|
|
||||||
-include $(DEPFILE)
|
|
||||||
|
|
||||||
### Internationalization (I18N):
|
|
||||||
|
|
||||||
PODIR = po
|
|
||||||
I18Npo = $(wildcard $(PODIR)/*.po)
|
|
||||||
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
|
||||||
I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
|
||||||
I18Npot = $(PODIR)/$(PLUGIN).pot
|
|
||||||
|
|
||||||
%.mo: %.po
|
|
||||||
@echo MO $@
|
|
||||||
$(Q)msgfmt -c -o $@ $<
|
|
||||||
|
|
||||||
$(I18Npot): $(wildcard *.c)
|
|
||||||
@echo GT $@
|
|
||||||
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
|
|
||||||
|
|
||||||
%.po: $(I18Npot)
|
|
||||||
@echo PO $@
|
|
||||||
$(Q)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)
|
|
||||||
@echo LD $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -lncursesw -o $@
|
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
|
||||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
|
||||||
|
|
||||||
install: install-lib install-i18n
|
|
||||||
|
|
||||||
dist: $(I18Npo) clean
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@echo Distribution package created as $(PACKAGE).tgz
|
|
||||||
|
|
||||||
clean:
|
|
||||||
@-rm -f $(PODIR)/*.mo $(PODIR)/*.pot
|
|
||||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
|
@ -1,28 +0,0 @@
|
|||||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
|
||||||
|
|
||||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
|
|
||||||
Project's homepage: https://www.tvdr.de
|
|
||||||
|
|
||||||
Latest version available at: https://www.tvdr.de
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Description:
|
|
||||||
|
|
||||||
The 'skincurses' plugin implements a VDR skin that works in a
|
|
||||||
shell window, using only plain text output. It re-implements
|
|
||||||
what used to be available by compiling VDR versions before 1.3.7
|
|
||||||
with the DEBUG_OSD macro set.
|
|
||||||
|
|
||||||
To activate this skin you can either select it in the Setup/OSD
|
|
||||||
menu, or put the line
|
|
||||||
|
|
||||||
OSDSkin = curses
|
|
||||||
|
|
||||||
into your 'setup.conf' file before starting VDR. Make sure this
|
|
||||||
is the only OSDSkin line in that file.
|
|
@ -1,33 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Klaus Schmidinger <vdr@tvdr.de>, 2007
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
|
||||||
"PO-Revision-Date: 2007-08-15 16:07+0200\n"
|
|
||||||
"Last-Translator: Klaus Schmidinger <vdr@tvdr.de>\n"
|
|
||||||
"Language-Team: German <vdr@linuxtv.org>\n"
|
|
||||||
"Language: de\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A text only skin"
|
|
||||||
msgstr "Eine reine Text-Oberfläche"
|
|
||||||
|
|
||||||
msgid "errors"
|
|
||||||
msgstr "Fehler"
|
|
||||||
|
|
||||||
msgid "Key$Mute"
|
|
||||||
msgstr "Stumm"
|
|
||||||
|
|
||||||
#. TRANSLATORS: note the trailing blank!
|
|
||||||
msgid "Volume "
|
|
||||||
msgstr "Lautstärke "
|
|
||||||
|
|
||||||
msgid "Text mode"
|
|
||||||
msgstr "Text-Modus"
|
|
@ -1,33 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Arthur Konovalov <artlov@gmail.com>, 2015
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
|
||||||
"PO-Revision-Date: 2007-08-14 20:48+0300\n"
|
|
||||||
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
|
|
||||||
"Language-Team: Estonian <vdr@linuxtv.org>\n"
|
|
||||||
"Language: et\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A text only skin"
|
|
||||||
msgstr "Tekstipõhine kest"
|
|
||||||
|
|
||||||
msgid "errors"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Key$Mute"
|
|
||||||
msgstr "Hääletu"
|
|
||||||
|
|
||||||
#. TRANSLATORS: note the trailing blank!
|
|
||||||
msgid "Volume "
|
|
||||||
msgstr "Helitugevus "
|
|
||||||
|
|
||||||
msgid "Text mode"
|
|
||||||
msgstr "Tekst"
|
|
@ -1,33 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>, 2007
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
|
||||||
"PO-Revision-Date: 2007-08-14 20:48+0300\n"
|
|
||||||
"Last-Translator: Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>\n"
|
|
||||||
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
|
||||||
"Language: fi\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A text only skin"
|
|
||||||
msgstr "Tekstipohjainen ulkoasu"
|
|
||||||
|
|
||||||
msgid "errors"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Key$Mute"
|
|
||||||
msgstr "Mykistys"
|
|
||||||
|
|
||||||
#. TRANSLATORS: note the trailing blank!
|
|
||||||
msgid "Volume "
|
|
||||||
msgstr "Äänenvoimakkuus "
|
|
||||||
|
|
||||||
msgid "Text mode"
|
|
||||||
msgstr "Teksti"
|
|
@ -1,33 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Diego Pierotto <vdr-italian@tiscali.it>, 2008
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
|
||||||
"PO-Revision-Date: 2008-01-27 20:35+0100\n"
|
|
||||||
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
|
|
||||||
"Language-Team: Italian <vdr@linuxtv.org>\n"
|
|
||||||
"Language: it\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A text only skin"
|
|
||||||
msgstr "Una interfaccia solo testo"
|
|
||||||
|
|
||||||
msgid "errors"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Key$Mute"
|
|
||||||
msgstr "Muto"
|
|
||||||
|
|
||||||
#. TRANSLATORS: note the trailing blank!
|
|
||||||
msgid "Volume "
|
|
||||||
msgstr "Volume "
|
|
||||||
|
|
||||||
msgid "Text mode"
|
|
||||||
msgstr "Modalità testo"
|
|
@ -1,33 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Valdemaras Pipiras <varas@ambernet.lt>, 2010
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
|
||||||
"PO-Revision-Date: 2010-02-22 18:18+0200\n"
|
|
||||||
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
|
|
||||||
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
|
|
||||||
"Language: lt\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A text only skin"
|
|
||||||
msgstr "Tekstinis apvalkalas"
|
|
||||||
|
|
||||||
msgid "errors"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Key$Mute"
|
|
||||||
msgstr "Išjungti garsą"
|
|
||||||
|
|
||||||
#. TRANSLATORS: note the trailing blank!
|
|
||||||
msgid "Volume "
|
|
||||||
msgstr "Garsas "
|
|
||||||
|
|
||||||
msgid "Text mode"
|
|
||||||
msgstr "Tekstinis ręžimas"
|
|
@ -1,35 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Tomasz Maciej Nowak <tmn505@gmail.com>, 2018
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
|
||||||
"PO-Revision-Date: 2018-02-19 01:02+0100\n"
|
|
||||||
"Last-Translator: Tomasz Maciej Nowak <tmn505@gmail.com>\n"
|
|
||||||
"Language-Team: Polish <vdr@linuxtv.org>\n"
|
|
||||||
"Language: pl_PL\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
|
||||||
"X-Generator: Poedit 2.0.6\n"
|
|
||||||
|
|
||||||
msgid "A text only skin"
|
|
||||||
msgstr "Skóra tekstowa"
|
|
||||||
|
|
||||||
msgid "errors"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Key$Mute"
|
|
||||||
msgstr "Wycisz"
|
|
||||||
|
|
||||||
#. TRANSLATORS: note the trailing blank!
|
|
||||||
msgid "Volume "
|
|
||||||
msgstr "Głośność "
|
|
||||||
|
|
||||||
msgid "Text mode"
|
|
||||||
msgstr "Tryb tekstowy"
|
|
@ -1,34 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Alexander Gross <Bikalexander@gmail.com>, 2008
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
|
||||||
"PO-Revision-Date: 2008-03-14 00:21+0100\n"
|
|
||||||
"Last-Translator: Alexander Gross <Bikalexander@gmail.com>\n"
|
|
||||||
"Language-Team: Russian <vdr@linuxtv.org>\n"
|
|
||||||
"Language: ru\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-5\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"X-Generator: KBabel 1.11.4\n"
|
|
||||||
|
|
||||||
msgid "A text only skin"
|
|
||||||
msgstr "¿àÞáâÞ âÕÚáâÞÒëÙ ØÝâÕàäÕÙá"
|
|
||||||
|
|
||||||
msgid "errors"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Key$Mute"
|
|
||||||
msgstr "²ëÚÛ. ÓàÞÜÚÞáâì"
|
|
||||||
|
|
||||||
#. TRANSLATORS: note the trailing blank!
|
|
||||||
msgid "Volume "
|
|
||||||
msgstr "³àÞÜÚÞáâì "
|
|
||||||
|
|
||||||
msgid "Text mode"
|
|
||||||
msgstr "ÀÕÖØÜ âÕÚáâÐ"
|
|
@ -1,33 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
# This file is distributed under the same license as the VDR package.
|
|
||||||
# Klaus Schmidinger <vdr@tvdr.de>, 2007
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
|
||||||
"PO-Revision-Date: 2009-09-30 12:52+0100\n"
|
|
||||||
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
|
|
||||||
"Language-Team: Slovak <vdr@linuxtv.org>\n"
|
|
||||||
"Language: sk\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=iso-8859-2\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A text only skin"
|
|
||||||
msgstr "Iba text vzhµadu"
|
|
||||||
|
|
||||||
msgid "errors"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Key$Mute"
|
|
||||||
msgstr "Stlmi» zvuk"
|
|
||||||
|
|
||||||
#. TRANSLATORS: note the trailing blank!
|
|
||||||
msgid "Volume "
|
|
||||||
msgstr "Hlasitos» "
|
|
||||||
|
|
||||||
msgid "Text mode"
|
|
||||||
msgstr "Textový re¾im"
|
|
@ -1,873 +0,0 @@
|
|||||||
/*
|
|
||||||
* skincurses.c: A plugin for the Video Disk Recorder
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: skincurses.c 5.1 2021/07/01 15:40:46 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <ncurses.h>
|
|
||||||
#include <vdr/osd.h>
|
|
||||||
#include <vdr/plugin.h>
|
|
||||||
#include <vdr/skins.h>
|
|
||||||
#include <vdr/videodir.h>
|
|
||||||
|
|
||||||
static const char *VERSION = "2.4.3";
|
|
||||||
static const char *DESCRIPTION = trNOOP("A text only skin");
|
|
||||||
static const char *MAINMENUENTRY = NULL;
|
|
||||||
|
|
||||||
// --- cCursesFont -----------------------------------------------------------
|
|
||||||
|
|
||||||
class cCursesFont : public cFont {
|
|
||||||
public:
|
|
||||||
virtual int Width(void) const { return 1; }
|
|
||||||
virtual int Width(uint c) const { return 1; }
|
|
||||||
virtual int Width(const char *s) const { return s ? Utf8StrLen(s) : 0; }
|
|
||||||
virtual int Height(void) const { return 1; }
|
|
||||||
virtual void DrawText(cBitmap *Bitmap, int x, int y, const char *s, tColor ColorFg, tColor ColorBg, int Width) const {}
|
|
||||||
virtual void DrawText(cPixmap *Pixmap, int x, int y, const char *s, tColor ColorFg, tColor ColorBg, int Width) const {}
|
|
||||||
};
|
|
||||||
|
|
||||||
static const cCursesFont Font = cCursesFont(); // w/o the '= cCursesFont()' gcc 4.6 complains - can anybody explain why this is necessary?
|
|
||||||
|
|
||||||
// --- cCursesOsd ------------------------------------------------------------
|
|
||||||
|
|
||||||
#define clrBackground COLOR_BLACK
|
|
||||||
#define clrTransparent clrBackground
|
|
||||||
#define clrBlack clrBackground
|
|
||||||
#define clrRed COLOR_RED
|
|
||||||
#define clrGreen COLOR_GREEN
|
|
||||||
#define clrYellow COLOR_YELLOW
|
|
||||||
#define clrBlue COLOR_BLUE
|
|
||||||
#define clrMagenta COLOR_MAGENTA
|
|
||||||
#define clrCyan COLOR_CYAN
|
|
||||||
#define clrWhite COLOR_WHITE
|
|
||||||
|
|
||||||
static int clrMessage[] = {
|
|
||||||
clrBlack,
|
|
||||||
clrCyan,
|
|
||||||
clrBlack,
|
|
||||||
clrGreen,
|
|
||||||
clrBlack,
|
|
||||||
clrYellow,
|
|
||||||
clrWhite,
|
|
||||||
clrRed
|
|
||||||
};
|
|
||||||
|
|
||||||
static int ScOsdWidth = 50;
|
|
||||||
static int ScOsdHeight = 20;
|
|
||||||
|
|
||||||
class cCursesOsd : public cOsd {
|
|
||||||
private:
|
|
||||||
WINDOW *savedRegion;
|
|
||||||
cVector<int> colorPairs;
|
|
||||||
void SetColor(int colorFg, int colorBg = clrBackground);
|
|
||||||
public:
|
|
||||||
cCursesOsd(int Left, int Top);
|
|
||||||
virtual ~cCursesOsd();
|
|
||||||
virtual void SaveRegion(int x1, int y1, int x2, int y2);
|
|
||||||
virtual void RestoreRegion(void);
|
|
||||||
virtual void DrawText(int x, int y, const char *s, tColor ColorFg, tColor ColorBg, const cFont *Font, int Width = 0, int Height = 0, int Alignment = taDefault);
|
|
||||||
virtual void DrawRectangle(int x1, int y1, int x2, int y2, tColor Color);
|
|
||||||
virtual void Flush(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
cCursesOsd::cCursesOsd(int Left, int Top)
|
|
||||||
:cOsd(Left, Top, 0)
|
|
||||||
{
|
|
||||||
savedRegion = NULL;
|
|
||||||
|
|
||||||
start_color();
|
|
||||||
leaveok(stdscr, true);
|
|
||||||
refresh(); // to react on changes to screen size
|
|
||||||
|
|
||||||
int begy, begx;
|
|
||||||
int maxy, maxx;
|
|
||||||
getmaxyx(stdscr, maxy, maxx);
|
|
||||||
getbegyx(stdscr, begy, begx);
|
|
||||||
ScOsdWidth = maxx - begx;
|
|
||||||
ScOsdHeight = maxy - begy;
|
|
||||||
}
|
|
||||||
|
|
||||||
cCursesOsd::~cCursesOsd()
|
|
||||||
{
|
|
||||||
erase();
|
|
||||||
Flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
void cCursesOsd::SetColor(int colorFg, int colorBg)
|
|
||||||
{
|
|
||||||
int color = (colorBg << 16) | colorFg | 0x80000000;
|
|
||||||
int i = colorPairs.IndexOf(color);
|
|
||||||
if (i < 0) {
|
|
||||||
colorPairs.Append(color);
|
|
||||||
i = colorPairs.Size() - 1;
|
|
||||||
init_pair(i + 1, colorFg, colorBg);
|
|
||||||
}
|
|
||||||
attrset(COLOR_PAIR(i + 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
void cCursesOsd::SaveRegion(int x1, int y1, int x2, int y2)
|
|
||||||
{
|
|
||||||
if (savedRegion) {
|
|
||||||
delwin(savedRegion);
|
|
||||||
savedRegion = NULL;
|
|
||||||
}
|
|
||||||
savedRegion = newwin(y2 - y1 + 1, x2 - x1 + 1, y1, x1);
|
|
||||||
if (savedRegion)
|
|
||||||
copywin(stdscr, savedRegion, y1, x1, 0, 0, y2 - y1, x2 - x1, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cCursesOsd::RestoreRegion(void)
|
|
||||||
{
|
|
||||||
if (savedRegion) {
|
|
||||||
overwrite(savedRegion, stdscr);
|
|
||||||
delwin(savedRegion);
|
|
||||||
savedRegion = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void cCursesOsd::DrawText(int x, int y, const char *s, tColor ColorFg, tColor ColorBg, const cFont *Font, int Width, int Height, int Alignment)
|
|
||||||
{
|
|
||||||
int w = Font->Width(s);
|
|
||||||
int h = Font->Height();
|
|
||||||
if (Width || Height) {
|
|
||||||
int cw = Width ? Width : w;
|
|
||||||
int ch = Height ? Height : h;
|
|
||||||
DrawRectangle(x, y, x + cw - 1, y + ch - 1, ColorBg);
|
|
||||||
if (Width) {
|
|
||||||
if ((Alignment & taLeft) != 0)
|
|
||||||
;
|
|
||||||
else if ((Alignment & taRight) != 0) {
|
|
||||||
if (w < Width)
|
|
||||||
x += Width - w;
|
|
||||||
}
|
|
||||||
else { // taCentered
|
|
||||||
if (w < Width)
|
|
||||||
x += (Width - w) / 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (Height) {
|
|
||||||
if ((Alignment & taTop) != 0)
|
|
||||||
;
|
|
||||||
else if ((Alignment & taBottom) != 0) {
|
|
||||||
if (h < Height)
|
|
||||||
y += Height - h;
|
|
||||||
}
|
|
||||||
else { // taCentered
|
|
||||||
if (h < Height)
|
|
||||||
y += (Height - h) / 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SetColor(ColorFg, ColorBg);
|
|
||||||
mvaddnstr(y, x, s, Width ? Width : ScOsdWidth - x);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cCursesOsd::DrawRectangle(int x1, int y1, int x2, int y2, tColor Color)
|
|
||||||
{
|
|
||||||
SetColor(Color, Color);
|
|
||||||
int dx = x2 - x1;
|
|
||||||
int dy = y2 - y1;
|
|
||||||
if (dx >= dy) {
|
|
||||||
for (int y = y1; y <= y2; y++)
|
|
||||||
mvhline(y, x1, ' ', dx + 1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for (int x = x1; x <= x2; x++)
|
|
||||||
mvvline(y1, x, ' ', dy + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void cCursesOsd::Flush(void)
|
|
||||||
{
|
|
||||||
refresh();
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cSkinCursesDisplayChannel ---------------------------------------------
|
|
||||||
|
|
||||||
class cSkinCursesDisplayChannel : public cSkinDisplayChannel {
|
|
||||||
private:
|
|
||||||
cOsd *osd;
|
|
||||||
int timeWidth;
|
|
||||||
bool message;
|
|
||||||
public:
|
|
||||||
cSkinCursesDisplayChannel(bool WithInfo);
|
|
||||||
virtual ~cSkinCursesDisplayChannel();
|
|
||||||
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);
|
|
||||||
};
|
|
||||||
|
|
||||||
cSkinCursesDisplayChannel::cSkinCursesDisplayChannel(bool WithInfo)
|
|
||||||
{
|
|
||||||
int Lines = WithInfo ? 5 : 1;
|
|
||||||
message = false;
|
|
||||||
osd = new cCursesOsd(0, Setup.ChannelInfoPos ? 0 : ScOsdHeight - Lines);
|
|
||||||
timeWidth = strlen("00:00");
|
|
||||||
osd->DrawRectangle(0, 0, ScOsdWidth - 1, Lines - 1, clrBackground);
|
|
||||||
}
|
|
||||||
|
|
||||||
cSkinCursesDisplayChannel::~cSkinCursesDisplayChannel()
|
|
||||||
{
|
|
||||||
delete osd;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayChannel::SetChannel(const cChannel *Channel, int Number)
|
|
||||||
{
|
|
||||||
osd->DrawRectangle(0, 0, ScOsdWidth - 1, 0, clrBackground);
|
|
||||||
osd->DrawText(0, 0, ChannelString(Channel, Number), clrWhite, clrBackground, &Font);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayChannel::SetEvents(const cEvent *Present, const cEvent *Following)
|
|
||||||
{
|
|
||||||
osd->DrawRectangle(0, 1, timeWidth - 1, 4, clrRed);
|
|
||||||
osd->DrawRectangle(timeWidth, 1, ScOsdWidth - 1, 4, clrBackground);
|
|
||||||
for (int i = 0; i < 2; i++) {
|
|
||||||
const cEvent *e = !i ? Present : Following;
|
|
||||||
if (e) {
|
|
||||||
osd->DrawText( 0, 2 * i + 1, e->GetTimeString(), clrWhite, clrRed, &Font);
|
|
||||||
osd->DrawText(timeWidth + 1, 2 * i + 1, e->Title(), clrCyan, clrBackground, &Font);
|
|
||||||
osd->DrawText(timeWidth + 1, 2 * i + 2, e->ShortText(), clrYellow, clrBackground, &Font);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayChannel::SetMessage(eMessageType Type, const char *Text)
|
|
||||||
{
|
|
||||||
if (Text) {
|
|
||||||
osd->SaveRegion(0, 0, ScOsdWidth - 1, 0);
|
|
||||||
osd->DrawText(0, 0, Text, clrMessage[2 * Type], clrMessage[2 * Type + 1], &Font, ScOsdWidth, 0, taCenter);
|
|
||||||
message = true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
osd->RestoreRegion();
|
|
||||||
message = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayChannel::Flush(void)
|
|
||||||
{
|
|
||||||
if (!message) {
|
|
||||||
cString date = DayDateTime();
|
|
||||||
osd->DrawText(ScOsdWidth - Utf8StrLen(date), 0, date, clrWhite, clrBackground, &Font);
|
|
||||||
}
|
|
||||||
osd->Flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cSkinCursesDisplayMenu ------------------------------------------------
|
|
||||||
|
|
||||||
class cSkinCursesDisplayMenu : public cSkinDisplayMenu {
|
|
||||||
private:
|
|
||||||
cOsd *osd;
|
|
||||||
cString title;
|
|
||||||
int lastDiskUsageState;
|
|
||||||
void DrawTitle(void);
|
|
||||||
void DrawScrollbar(int Total, int Offset, int Shown, int Top, int Height, bool CanScrollUp, bool CanScrollDown);
|
|
||||||
void SetTextScrollbar(void);
|
|
||||||
public:
|
|
||||||
cSkinCursesDisplayMenu(void);
|
|
||||||
virtual ~cSkinCursesDisplayMenu();
|
|
||||||
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 const cFont *GetTextAreaFont(bool FixedFont) const { return &Font; }
|
|
||||||
virtual void Flush(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
cSkinCursesDisplayMenu::cSkinCursesDisplayMenu(void)
|
|
||||||
{
|
|
||||||
osd = new cCursesOsd(0, 0);
|
|
||||||
lastDiskUsageState = -1;
|
|
||||||
osd->DrawRectangle(0, 0, ScOsdWidth - 1, ScOsdHeight - 1, clrBackground);
|
|
||||||
}
|
|
||||||
|
|
||||||
cSkinCursesDisplayMenu::~cSkinCursesDisplayMenu()
|
|
||||||
{
|
|
||||||
delete osd;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::DrawScrollbar(int Total, int Offset, int Shown, int Top, int Height, bool CanScrollUp, bool CanScrollDown)
|
|
||||||
{
|
|
||||||
if (Total > 0 && Total > Shown) {
|
|
||||||
int yt = Top;
|
|
||||||
int yb = yt + Height;
|
|
||||||
int st = yt;
|
|
||||||
int sb = yb;
|
|
||||||
int th = max(int((sb - st) * double(Shown) / Total + 0.5), 1);
|
|
||||||
int tt = min(int(st + (sb - st) * double(Offset) / Total + 0.5), sb - th);
|
|
||||||
int tb = min(tt + th, sb);
|
|
||||||
int xl = ScOsdWidth - 1;
|
|
||||||
osd->DrawRectangle(xl, st, xl, sb - 1, clrWhite);
|
|
||||||
osd->DrawRectangle(xl, tt, xl, tb - 1, clrCyan);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::SetTextScrollbar(void)
|
|
||||||
{
|
|
||||||
if (textScroller.CanScroll())
|
|
||||||
DrawScrollbar(textScroller.Total(), textScroller.Offset(), textScroller.Shown(), textScroller.Top(), textScroller.Height(), textScroller.CanScrollUp(), textScroller.CanScrollDown());
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::Scroll(bool Up, bool Page)
|
|
||||||
{
|
|
||||||
cSkinDisplayMenu::Scroll(Up, Page);
|
|
||||||
SetTextScrollbar();
|
|
||||||
}
|
|
||||||
|
|
||||||
int cSkinCursesDisplayMenu::MaxItems(void)
|
|
||||||
{
|
|
||||||
return ScOsdHeight - 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::Clear(void)
|
|
||||||
{
|
|
||||||
osd->DrawRectangle(0, 1, ScOsdWidth - 1, ScOsdHeight - 2, clrBackground);
|
|
||||||
textScroller.Reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::DrawTitle(void)
|
|
||||||
{
|
|
||||||
bool WithDisk = MenuCategory() == mcMain || MenuCategory() == mcRecording;
|
|
||||||
osd->DrawText(0, 0, WithDisk ? cString::sprintf("%s - %s", *title, *cVideoDiskUsage::String()) : title, clrBlack, clrCyan, &Font, ScOsdWidth);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::SetTitle(const char *Title)
|
|
||||||
{
|
|
||||||
title = Title;
|
|
||||||
DrawTitle();
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::SetButtons(const char *Red, const char *Green, const char *Yellow, const char *Blue)
|
|
||||||
{
|
|
||||||
int w = ScOsdWidth;
|
|
||||||
int t0 = 0;
|
|
||||||
int t1 = 0 + w / 4;
|
|
||||||
int t2 = 0 + w / 2;
|
|
||||||
int t3 = w - w / 4;
|
|
||||||
int t4 = w;
|
|
||||||
int y = ScOsdHeight - 1;
|
|
||||||
osd->DrawText(t0, y, Red, clrWhite, Red ? clrRed : clrBackground, &Font, t1 - t0, 0, taCenter);
|
|
||||||
osd->DrawText(t1, y, Green, clrBlack, Green ? clrGreen : clrBackground, &Font, t2 - t1, 0, taCenter);
|
|
||||||
osd->DrawText(t2, y, Yellow, clrBlack, Yellow ? clrYellow : clrBackground, &Font, t3 - t2, 0, taCenter);
|
|
||||||
osd->DrawText(t3, y, Blue, clrWhite, Blue ? clrBlue : clrBackground, &Font, t4 - t3, 0, taCenter);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::SetMessage(eMessageType Type, const char *Text)
|
|
||||||
{
|
|
||||||
if (Text)
|
|
||||||
osd->DrawText(0, ScOsdHeight - 2, Text, clrMessage[2 * Type], clrMessage[2 * Type + 1], &Font, ScOsdWidth, 0, taCenter);
|
|
||||||
else
|
|
||||||
osd->DrawRectangle(0, ScOsdHeight - 2, ScOsdWidth - 1, ScOsdHeight - 2, clrBackground);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::SetItem(const char *Text, int Index, bool Current, bool Selectable)
|
|
||||||
{
|
|
||||||
int y = 2 + Index;
|
|
||||||
int ColorFg, ColorBg;
|
|
||||||
if (Current) {
|
|
||||||
ColorFg = clrBlack;
|
|
||||||
ColorBg = clrCyan;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ColorFg = Selectable ? clrWhite : clrCyan;
|
|
||||||
ColorBg = clrBackground;
|
|
||||||
}
|
|
||||||
for (int i = 0; i < MaxTabs; i++) {
|
|
||||||
const char *s = GetTabbedText(Text, i);
|
|
||||||
if (s) {
|
|
||||||
int xt = Tab(i) / AvgCharWidth();// Tab() is in "pixel" - see also skins.c!!!
|
|
||||||
osd->DrawText(xt, y, s, ColorFg, ColorBg, &Font, ScOsdWidth - 2 - xt);
|
|
||||||
}
|
|
||||||
if (!Tab(i + 1))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
SetEditableWidth(ScOsdWidth - 2 - Tab(1) / AvgCharWidth()); // Tab() is in "pixel" - see also skins.c!!!
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::SetScrollbar(int Total, int Offset)
|
|
||||||
{
|
|
||||||
DrawScrollbar(Total, Offset, MaxItems(), 2, MaxItems(), Offset > 0, Offset + MaxItems() < Total);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::SetEvent(const cEvent *Event)
|
|
||||||
{
|
|
||||||
if (!Event)
|
|
||||||
return;
|
|
||||||
int y = 2;
|
|
||||||
cTextScroller ts;
|
|
||||||
cString t = cString::sprintf("%s %s - %s", *Event->GetDateString(), *Event->GetTimeString(), *Event->GetEndTimeString());
|
|
||||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
|
|
||||||
if (Event->Vps() && Event->Vps() != Event->StartTime()) {
|
|
||||||
cString buffer = cString::sprintf(" VPS: %s", *Event->GetVpsString());
|
|
||||||
osd->DrawText(ScOsdWidth - Utf8StrLen(buffer), y, buffer, clrBlack, clrYellow, &Font);
|
|
||||||
}
|
|
||||||
y += ts.Height();
|
|
||||||
if (Event->ParentalRating()) {
|
|
||||||
cString buffer = cString::sprintf(" %s ", *Event->GetParentalRatingString());
|
|
||||||
osd->DrawText(ScOsdWidth - Utf8StrLen(buffer), y, buffer, clrBlack, clrYellow, &Font);
|
|
||||||
}
|
|
||||||
y += 1;
|
|
||||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Event->Title(), &Font, clrCyan, clrBackground);
|
|
||||||
y += ts.Height();
|
|
||||||
if (!isempty(Event->ShortText())) {
|
|
||||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Event->ShortText(), &Font, clrYellow, clrBackground);
|
|
||||||
y += ts.Height();
|
|
||||||
}
|
|
||||||
for (int i = 0; Event->Contents(i); i++) {
|
|
||||||
const char *s = Event->ContentToString(Event->Contents(i));
|
|
||||||
if (!isempty(s)) {
|
|
||||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, s, &Font, clrYellow, clrBackground);
|
|
||||||
y += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
y += 1;
|
|
||||||
if (!isempty(Event->Description())) {
|
|
||||||
textScroller.Set(osd, 0, y, ScOsdWidth - 2, ScOsdHeight - y - 2, Event->Description(), &Font, clrCyan, clrBackground);
|
|
||||||
SetTextScrollbar();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::SetRecording(const cRecording *Recording)
|
|
||||||
{
|
|
||||||
if (!Recording)
|
|
||||||
return;
|
|
||||||
const cRecordingInfo *Info = Recording->Info();
|
|
||||||
int y = 2;
|
|
||||||
cTextScroller ts;
|
|
||||||
cString t = cString::sprintf("%s %s %s", *DateString(Recording->Start()), *TimeString(Recording->Start()), Info->ChannelName() ? Info->ChannelName() : "");
|
|
||||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
|
|
||||||
y += ts.Height();
|
|
||||||
int xt = ScOsdWidth;
|
|
||||||
if (Info->GetEvent()->ParentalRating()) {
|
|
||||||
cString buffer = cString::sprintf(" %s ", *Info->GetEvent()->GetParentalRatingString());
|
|
||||||
int w = Utf8StrLen(buffer);
|
|
||||||
osd->DrawText(xt - w, y, buffer, clrBlack, clrYellow, &Font);
|
|
||||||
xt -= w + 1;
|
|
||||||
}
|
|
||||||
if (Info->Errors() > 0) {
|
|
||||||
cString buffer = cString::sprintf(" %d %s ", Info->Errors(), tr("errors"));
|
|
||||||
int w = Utf8StrLen(buffer);
|
|
||||||
osd->DrawText(xt - w, y, buffer, clrBlack, clrYellow, &Font);
|
|
||||||
xt -= w + 1;
|
|
||||||
}
|
|
||||||
y += 1;
|
|
||||||
const char *Title = Info->Title();
|
|
||||||
if (isempty(Title))
|
|
||||||
Title = Recording->Name();
|
|
||||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Title, &Font, clrCyan, clrBackground);
|
|
||||||
y += ts.Height();
|
|
||||||
if (!isempty(Info->ShortText())) {
|
|
||||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Info->ShortText(), &Font, clrYellow, clrBackground);
|
|
||||||
y += ts.Height();
|
|
||||||
}
|
|
||||||
for (int i = 0; Info->GetEvent()->Contents(i); i++) {
|
|
||||||
const char *s = Info->GetEvent()->ContentToString(Info->GetEvent()->Contents(i));
|
|
||||||
if (!isempty(s)) {
|
|
||||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, s, &Font, clrYellow, clrBackground);
|
|
||||||
y += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
y += 1;
|
|
||||||
if (!isempty(Info->Description())) {
|
|
||||||
textScroller.Set(osd, 0, y, ScOsdWidth - 2, ScOsdHeight - y - 2, Info->Description(), &Font, clrCyan, clrBackground);
|
|
||||||
SetTextScrollbar();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::SetText(const char *Text, bool FixedFont)
|
|
||||||
{
|
|
||||||
textScroller.Set(osd, 0, 2, ScOsdWidth - 2, ScOsdHeight - 4, Text, &Font, clrWhite, clrBackground);
|
|
||||||
SetTextScrollbar();
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::Flush(void)
|
|
||||||
{
|
|
||||||
if (cVideoDiskUsage::HasChanged(lastDiskUsageState))
|
|
||||||
DrawTitle();
|
|
||||||
cString date = DayDateTime();
|
|
||||||
osd->DrawText(ScOsdWidth - Utf8StrLen(date) - 2, 0, date, clrBlack, clrCyan, &Font);
|
|
||||||
osd->Flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cSkinCursesDisplayReplay ----------------------------------------------
|
|
||||||
|
|
||||||
class cSkinCursesDisplayReplay : public cSkinDisplayReplay {
|
|
||||||
private:
|
|
||||||
cOsd *osd;
|
|
||||||
bool message;
|
|
||||||
public:
|
|
||||||
cSkinCursesDisplayReplay(bool ModeOnly);
|
|
||||||
virtual ~cSkinCursesDisplayReplay();
|
|
||||||
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);
|
|
||||||
};
|
|
||||||
|
|
||||||
cSkinCursesDisplayReplay::cSkinCursesDisplayReplay(bool ModeOnly)
|
|
||||||
{
|
|
||||||
message = false;
|
|
||||||
osd = new cCursesOsd(0, ScOsdHeight - 3);
|
|
||||||
osd->DrawRectangle(0, 0, ScOsdWidth - 1, 2, ModeOnly ? clrTransparent : clrBackground);
|
|
||||||
}
|
|
||||||
|
|
||||||
cSkinCursesDisplayReplay::~cSkinCursesDisplayReplay()
|
|
||||||
{
|
|
||||||
delete osd;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayReplay::SetTitle(const char *Title)
|
|
||||||
{
|
|
||||||
osd->DrawText(0, 0, Title, clrWhite, clrBackground, &Font, ScOsdWidth);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayReplay::SetMode(bool Play, bool Forward, int Speed)
|
|
||||||
{
|
|
||||||
if (Setup.ShowReplayMode) {
|
|
||||||
const char *Mode;
|
|
||||||
if (Speed == -1) Mode = Play ? " > " : " || ";
|
|
||||||
else if (Play) Mode = Forward ? " X>> " : " <<X ";
|
|
||||||
else Mode = Forward ? " X|> " : " <|X ";
|
|
||||||
char buf[16];
|
|
||||||
strn0cpy(buf, Mode, sizeof(buf));
|
|
||||||
char *p = strchr(buf, 'X');
|
|
||||||
if (p)
|
|
||||||
*p = Speed > 0 ? '1' + Speed - 1 : ' ';
|
|
||||||
SetJump(buf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayReplay::SetProgress(int Current, int Total)
|
|
||||||
{
|
|
||||||
int p = Total > 0 ? ScOsdWidth * Current / Total : 0;
|
|
||||||
osd->DrawRectangle(0, 1, p, 1, clrGreen);
|
|
||||||
osd->DrawRectangle(p, 1, ScOsdWidth, 1, clrWhite);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayReplay::SetCurrent(const char *Current)
|
|
||||||
{
|
|
||||||
osd->DrawText(0, 2, Current, clrWhite, clrBackground, &Font, Utf8StrLen(Current) + 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayReplay::SetTotal(const char *Total)
|
|
||||||
{
|
|
||||||
osd->DrawText(ScOsdWidth - Utf8StrLen(Total), 2, Total, clrWhite, clrBackground, &Font);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayReplay::SetJump(const char *Jump)
|
|
||||||
{
|
|
||||||
osd->DrawText(ScOsdWidth / 4, 2, Jump, clrWhite, clrBackground, &Font, ScOsdWidth / 2, 0, taCenter);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayReplay::SetMessage(eMessageType Type, const char *Text)
|
|
||||||
{
|
|
||||||
if (Text) {
|
|
||||||
osd->SaveRegion(0, 2, ScOsdWidth - 1, 2);
|
|
||||||
osd->DrawText(0, 2, Text, clrMessage[2 * Type], clrMessage[2 * Type + 1], &Font, ScOsdWidth, 0, taCenter);
|
|
||||||
message = true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
osd->RestoreRegion();
|
|
||||||
message = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayReplay::Flush(void)
|
|
||||||
{
|
|
||||||
osd->Flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cSkinCursesDisplayVolume ----------------------------------------------
|
|
||||||
|
|
||||||
class cSkinCursesDisplayVolume : public cSkinDisplayVolume {
|
|
||||||
private:
|
|
||||||
cOsd *osd;
|
|
||||||
public:
|
|
||||||
cSkinCursesDisplayVolume(void);
|
|
||||||
virtual ~cSkinCursesDisplayVolume();
|
|
||||||
virtual void SetVolume(int Current, int Total, bool Mute);
|
|
||||||
virtual void Flush(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
cSkinCursesDisplayVolume::cSkinCursesDisplayVolume(void)
|
|
||||||
{
|
|
||||||
osd = new cCursesOsd(0, ScOsdHeight - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
cSkinCursesDisplayVolume::~cSkinCursesDisplayVolume()
|
|
||||||
{
|
|
||||||
delete osd;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayVolume::SetVolume(int Current, int Total, bool Mute)
|
|
||||||
{
|
|
||||||
if (Mute) {
|
|
||||||
osd->DrawRectangle(0, 0, ScOsdWidth - 1, 0, clrTransparent);
|
|
||||||
osd->DrawText(0, 0, tr("Key$Mute"), clrGreen, clrBackground, &Font);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// TRANSLATORS: note the trailing blank!
|
|
||||||
const char *Prompt = tr("Volume ");
|
|
||||||
int l = Utf8StrLen(Prompt);
|
|
||||||
int p = (ScOsdWidth - l) * Current / Total;
|
|
||||||
osd->DrawText(0, 0, Prompt, clrGreen, clrBackground, &Font);
|
|
||||||
osd->DrawRectangle(l, 0, l + p - 1, 0, clrGreen);
|
|
||||||
osd->DrawRectangle(l + p, 0, ScOsdWidth - 1, 0, clrWhite);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayVolume::Flush(void)
|
|
||||||
{
|
|
||||||
osd->Flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cSkinCursesDisplayTracks ----------------------------------------------
|
|
||||||
|
|
||||||
class cSkinCursesDisplayTracks : public cSkinDisplayTracks {
|
|
||||||
private:
|
|
||||||
cOsd *osd;
|
|
||||||
int itemsWidth;
|
|
||||||
int currentIndex;
|
|
||||||
void SetItem(const char *Text, int Index, bool Current);
|
|
||||||
public:
|
|
||||||
cSkinCursesDisplayTracks(const char *Title, int NumTracks, const char * const *Tracks);
|
|
||||||
virtual ~cSkinCursesDisplayTracks();
|
|
||||||
virtual void SetTrack(int Index, const char * const *Tracks);
|
|
||||||
virtual void SetAudioChannel(int AudioChannel) {}
|
|
||||||
virtual void Flush(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
cSkinCursesDisplayTracks::cSkinCursesDisplayTracks(const char *Title, int NumTracks, const char * const *Tracks)
|
|
||||||
{
|
|
||||||
currentIndex = -1;
|
|
||||||
itemsWidth = Font.Width(Title);
|
|
||||||
for (int i = 0; i < NumTracks; i++)
|
|
||||||
itemsWidth = max(itemsWidth, Font.Width(Tracks[i]));
|
|
||||||
itemsWidth = min(itemsWidth, ScOsdWidth);
|
|
||||||
osd = new cCursesOsd(0, 0);
|
|
||||||
osd->DrawRectangle(0, 0, ScOsdWidth - 1, ScOsdHeight - 1, clrBackground);
|
|
||||||
osd->DrawText(0, 0, Title, clrBlack, clrCyan, &Font, itemsWidth);
|
|
||||||
for (int i = 0; i < NumTracks; i++)
|
|
||||||
SetItem(Tracks[i], i, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
cSkinCursesDisplayTracks::~cSkinCursesDisplayTracks()
|
|
||||||
{
|
|
||||||
delete osd;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayTracks::SetItem(const char *Text, int Index, bool Current)
|
|
||||||
{
|
|
||||||
int y = 1 + Index;
|
|
||||||
int ColorFg, ColorBg;
|
|
||||||
if (Current) {
|
|
||||||
ColorFg = clrBlack;
|
|
||||||
ColorBg = clrCyan;
|
|
||||||
currentIndex = Index;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ColorFg = clrWhite;
|
|
||||||
ColorBg = clrBackground;
|
|
||||||
}
|
|
||||||
osd->DrawText(0, y, Text, ColorFg, ColorBg, &Font, itemsWidth);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayTracks::SetTrack(int Index, const char * const *Tracks)
|
|
||||||
{
|
|
||||||
if (currentIndex >= 0)
|
|
||||||
SetItem(Tracks[currentIndex], currentIndex, false);
|
|
||||||
SetItem(Tracks[Index], Index, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayTracks::Flush(void)
|
|
||||||
{
|
|
||||||
osd->Flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cSkinCursesDisplayMessage ---------------------------------------------
|
|
||||||
|
|
||||||
class cSkinCursesDisplayMessage : public cSkinDisplayMessage {
|
|
||||||
private:
|
|
||||||
cOsd *osd;
|
|
||||||
public:
|
|
||||||
cSkinCursesDisplayMessage(void);
|
|
||||||
virtual ~cSkinCursesDisplayMessage();
|
|
||||||
virtual void SetMessage(eMessageType Type, const char *Text);
|
|
||||||
virtual void Flush(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
cSkinCursesDisplayMessage::cSkinCursesDisplayMessage(void)
|
|
||||||
{
|
|
||||||
osd = new cCursesOsd(0, ScOsdHeight - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
cSkinCursesDisplayMessage::~cSkinCursesDisplayMessage()
|
|
||||||
{
|
|
||||||
delete osd;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayMessage::SetMessage(eMessageType Type, const char *Text)
|
|
||||||
{
|
|
||||||
osd->DrawText(0, 0, Text, clrMessage[2 * Type], clrMessage[2 * Type + 1], &Font, ScOsdWidth, 0, taCenter);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayMessage::Flush(void)
|
|
||||||
{
|
|
||||||
osd->Flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cSkinCurses -----------------------------------------------------------
|
|
||||||
|
|
||||||
class cSkinCurses : public cSkin {
|
|
||||||
public:
|
|
||||||
cSkinCurses(void);
|
|
||||||
virtual const char *Description(void);
|
|
||||||
virtual cSkinDisplayChannel *DisplayChannel(bool WithInfo);
|
|
||||||
virtual cSkinDisplayMenu *DisplayMenu(void);
|
|
||||||
virtual cSkinDisplayReplay *DisplayReplay(bool ModeOnly);
|
|
||||||
virtual cSkinDisplayVolume *DisplayVolume(void);
|
|
||||||
virtual cSkinDisplayTracks *DisplayTracks(const char *Title, int NumTracks, const char * const *Tracks);
|
|
||||||
virtual cSkinDisplayMessage *DisplayMessage(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
cSkinCurses::cSkinCurses(void)
|
|
||||||
:cSkin("curses")
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *cSkinCurses::Description(void)
|
|
||||||
{
|
|
||||||
return tr("Text mode");
|
|
||||||
}
|
|
||||||
|
|
||||||
cSkinDisplayChannel *cSkinCurses::DisplayChannel(bool WithInfo)
|
|
||||||
{
|
|
||||||
return new cSkinCursesDisplayChannel(WithInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
cSkinDisplayMenu *cSkinCurses::DisplayMenu(void)
|
|
||||||
{
|
|
||||||
return new cSkinCursesDisplayMenu;
|
|
||||||
}
|
|
||||||
|
|
||||||
cSkinDisplayReplay *cSkinCurses::DisplayReplay(bool ModeOnly)
|
|
||||||
{
|
|
||||||
return new cSkinCursesDisplayReplay(ModeOnly);
|
|
||||||
}
|
|
||||||
|
|
||||||
cSkinDisplayVolume *cSkinCurses::DisplayVolume(void)
|
|
||||||
{
|
|
||||||
return new cSkinCursesDisplayVolume;
|
|
||||||
}
|
|
||||||
|
|
||||||
cSkinDisplayTracks *cSkinCurses::DisplayTracks(const char *Title, int NumTracks, const char * const *Tracks)
|
|
||||||
{
|
|
||||||
return new cSkinCursesDisplayTracks(Title, NumTracks, Tracks);
|
|
||||||
}
|
|
||||||
|
|
||||||
cSkinDisplayMessage *cSkinCurses::DisplayMessage(void)
|
|
||||||
{
|
|
||||||
return new cSkinCursesDisplayMessage;
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cPluginSkinCurses -----------------------------------------------------
|
|
||||||
|
|
||||||
class cPluginSkinCurses : public cPlugin {
|
|
||||||
private:
|
|
||||||
// Add any member variables or functions you may need here.
|
|
||||||
public:
|
|
||||||
cPluginSkinCurses(void);
|
|
||||||
virtual ~cPluginSkinCurses();
|
|
||||||
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 Housekeeping(void);
|
|
||||||
virtual const char *MainMenuEntry(void) { return tr(MAINMENUENTRY); }
|
|
||||||
virtual cOsdObject *MainMenuAction(void);
|
|
||||||
virtual cMenuSetupPage *SetupMenu(void);
|
|
||||||
virtual bool SetupParse(const char *Name, const char *Value);
|
|
||||||
};
|
|
||||||
|
|
||||||
cPluginSkinCurses::cPluginSkinCurses(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!
|
|
||||||
}
|
|
||||||
|
|
||||||
cPluginSkinCurses::~cPluginSkinCurses()
|
|
||||||
{
|
|
||||||
// Clean up after yourself!
|
|
||||||
endwin();
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *cPluginSkinCurses::CommandLineHelp(void)
|
|
||||||
{
|
|
||||||
// Return a string that describes all known command line options.
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cPluginSkinCurses::ProcessArgs(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
// Implement command line argument processing here if applicable.
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cPluginSkinCurses::Initialize(void)
|
|
||||||
{
|
|
||||||
// Initialize any background activities the plugin shall perform.
|
|
||||||
if (initscr())
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cPluginSkinCurses::Start(void)
|
|
||||||
{
|
|
||||||
// Start any background activities the plugin shall perform.
|
|
||||||
cSkin *Skin = new cSkinCurses;
|
|
||||||
// This skin is normally used for debugging, so let's make it the current one:
|
|
||||||
Skins.SetCurrent(Skin->Name());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cPluginSkinCurses::Housekeeping(void)
|
|
||||||
{
|
|
||||||
// Perform any cleanup or other regular tasks.
|
|
||||||
}
|
|
||||||
|
|
||||||
cOsdObject *cPluginSkinCurses::MainMenuAction(void)
|
|
||||||
{
|
|
||||||
// Perform the action when selected from the main VDR menu.
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
cMenuSetupPage *cPluginSkinCurses::SetupMenu(void)
|
|
||||||
{
|
|
||||||
// Return a setup menu in case the plugin supports one.
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cPluginSkinCurses::SetupParse(const char *Name, const char *Value)
|
|
||||||
{
|
|
||||||
// Parse your own setup parameters and store their values.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
VDRPLUGINCREATOR(cPluginSkinCurses); // Don't touch this!
|
|
@ -1,340 +0,0 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 2, June 1991
|
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
License is intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users. This
|
|
||||||
General Public License applies to most of the Free Software
|
|
||||||
Foundation's software and to any other program whose authors commit to
|
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
|
||||||
the GNU Lesser General Public License instead.) You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
this service if you wish), that you receive source code or can get it
|
|
||||||
if you want it, that you can change the software or use pieces of it
|
|
||||||
in new free programs; and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
|
||||||
These restrictions translate to certain responsibilities for you if you
|
|
||||||
distribute copies of the software, or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
|
||||||
you have. You must make sure that they, too, receive or can get the
|
|
||||||
source code. And you must show them these terms so they know their
|
|
||||||
rights.
|
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
|
||||||
distribute and/or modify the software.
|
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
|
||||||
that everyone understands that there is no warranty for this free
|
|
||||||
software. If the software is modified by someone else and passed on, we
|
|
||||||
want its recipients to know that what they have is not the original, so
|
|
||||||
that any problems introduced by others will not reflect on the original
|
|
||||||
authors' reputations.
|
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
|
||||||
program will individually obtain patent licenses, in effect making the
|
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
|
||||||
under the terms of this General Public License. The "Program", below,
|
|
||||||
refers to any such program or work, and a "work based on the Program"
|
|
||||||
means either the Program or any derivative work under copyright law:
|
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
|
||||||
source code as you receive it, in any medium, provided that you
|
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
notices that refer to this License and to the absence of any warranty;
|
|
||||||
and give any other recipients of the Program a copy of this License
|
|
||||||
along with the Program.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
|
||||||
of it, thus forming a work based on the Program, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
|
||||||
whole or in part contains or is derived from the Program or any
|
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
parties under the terms of this License.
|
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
|
||||||
when run, you must cause it, when started running for such
|
|
||||||
interactive use in the most ordinary way, to print or display an
|
|
||||||
announcement including an appropriate copyright notice and a
|
|
||||||
notice that there is no warranty (or else, saying that you provide
|
|
||||||
a warranty) and that users may redistribute the program under
|
|
||||||
these conditions, and telling the user how to view a copy of this
|
|
||||||
License. (Exception: if the Program itself is interactive but
|
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Program,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Program.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
|
||||||
under Section 2) in object code or executable form under the terms of
|
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
|
||||||
source code, which must be distributed under the terms of Sections
|
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
|
||||||
years, to give any third party, for a charge no more than your
|
|
||||||
cost of physically performing source distribution, a complete
|
|
||||||
machine-readable copy of the corresponding source code, to be
|
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
customarily used for software interchange; or,
|
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
|
||||||
to distribute corresponding source code. (This alternative is
|
|
||||||
allowed only for noncommercial distribution and only if you
|
|
||||||
received the program in object code or executable form with such
|
|
||||||
an offer, in accord with Subsection b above.)
|
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For an executable work, complete source
|
|
||||||
code means all the source code for all modules it contains, plus any
|
|
||||||
associated interface definition files, plus the scripts used to
|
|
||||||
control compilation and installation of the executable. However, as a
|
|
||||||
special exception, the source code distributed need not include
|
|
||||||
anything that is normally distributed (in either source or binary
|
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
|
||||||
operating system on which the executable runs, unless that component
|
|
||||||
itself accompanies the executable.
|
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
|
||||||
access to copy from a designated place, then offering equivalent
|
|
||||||
access to copy the source code from the same place counts as
|
|
||||||
distribution of the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
except as expressly provided under this License. Any attempt
|
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
void, and will automatically terminate your rights under this License.
|
|
||||||
However, parties who have received copies, or rights, from you under
|
|
||||||
this License will not have their licenses terminated so long as such
|
|
||||||
parties remain in full compliance.
|
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Program or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Program (or any work based on the
|
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Program or works based on it.
|
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
|
||||||
Program), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
|
||||||
these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties to
|
|
||||||
this License.
|
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Program at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Program by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Program.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
|
||||||
any particular circumstance, the balance of the section is intended to
|
|
||||||
apply and the section as a whole is intended to apply in other
|
|
||||||
circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system, which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Program under this License
|
|
||||||
may add an explicit geographical distribution limitation excluding
|
|
||||||
those countries, so that distribution is permitted only in or among
|
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
|
||||||
specifies a version number of this License which applies to it and "any
|
|
||||||
later version", you have the option of following the terms and conditions
|
|
||||||
either of that version or of any later version published by the Free
|
|
||||||
Software Foundation. If the Program does not specify a version number of
|
|
||||||
this License, you may choose any version ever published by the Free Software
|
|
||||||
Foundation.
|
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
|
||||||
programs whose distribution conditions are different, write to the author
|
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
of preserving the free status of all derivatives of our free software and
|
|
||||||
of promoting the sharing and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
|
||||||
when it starts in an interactive mode:
|
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) year name of author
|
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, the commands you use may
|
|
||||||
be called something other than `show w' and `show c'; they could even be
|
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License.
|
|
@ -1,85 +0,0 @@
|
|||||||
VDR Plugin 'status' Revision History
|
|
||||||
------------------------------------
|
|
||||||
|
|
||||||
2002-05-18: Version 0.0.1
|
|
||||||
|
|
||||||
- Initial revision.
|
|
||||||
|
|
||||||
2002-07-13: Version 0.0.2
|
|
||||||
|
|
||||||
- Changed the interface of cStatus::Replaying().
|
|
||||||
|
|
||||||
2002-09-21: Version 0.0.3
|
|
||||||
|
|
||||||
- Fixed Makefile for NEWSTRUCT driver.
|
|
||||||
|
|
||||||
2002-10-26: Version 0.0.4
|
|
||||||
|
|
||||||
- Fixed a typo.
|
|
||||||
|
|
||||||
2002-11-01: Version 0.0.5
|
|
||||||
|
|
||||||
- Completely switched to the new CVS HEAD version of the linux-dvb driver.
|
|
||||||
The NEWSTRUCT compile time switch is now obsolete. The required driver is now
|
|
||||||
the CVS HEAD version dated 2002-11-01 or later.
|
|
||||||
- Introduced Make.config.
|
|
||||||
|
|
||||||
2002-11-23: Version 0.0.6
|
|
||||||
|
|
||||||
- Changed return type of MainMenuAction().
|
|
||||||
|
|
||||||
2002-12-13: Version 0.1.0
|
|
||||||
|
|
||||||
- Changed setting of CXX and CXXFLAGS variables in Makefile.
|
|
||||||
|
|
||||||
2005-12-31: Version 0.2.0
|
|
||||||
|
|
||||||
- API change in cStatus.
|
|
||||||
|
|
||||||
2007-08-15: Version 0.2.1
|
|
||||||
|
|
||||||
- Moved the "all" target in the Makefile before the "Implicit rules",
|
|
||||||
so that a plain "make" will compile everything.
|
|
||||||
|
|
||||||
2008-02-16: Version 0.3.0
|
|
||||||
|
|
||||||
- Added new cStatus functions.
|
|
||||||
|
|
||||||
2012-03-11: Version 0.3.1
|
|
||||||
|
|
||||||
- Added new parameter LiveView to ChannelSwitch() (reported by Udo Richter).
|
|
||||||
|
|
||||||
2012-12-27: Version 0.3.2
|
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
|
||||||
|
|
||||||
2013-01-12: Version 0.3.3
|
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
|
||||||
|
|
||||||
2013-03-31: Version 2.0.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2014-01-01: Version 2.1.1
|
|
||||||
|
|
||||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
|
||||||
|
|
||||||
2015-02-19: Version 2.2.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2018-04-15: Version 2.4.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2021-12-27: Version 2.6.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2025-02-10: Version 2.6.1
|
|
||||||
|
|
||||||
- Added cStatus::OsdItem2().
|
|
||||||
- Activated logging of OsdItem2().
|
|
||||||
- Added cStatus::OsdCurrentItem2().
|
|
||||||
- Added cStatus::OsdStatusMessage2().
|
|
@ -1,97 +0,0 @@
|
|||||||
#
|
|
||||||
# Makefile for a Video Disk Recorder plugin
|
|
||||||
#
|
|
||||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
|
||||||
|
|
||||||
# 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 = status
|
|
||||||
|
|
||||||
### The version number of this plugin (taken from the main source file):
|
|
||||||
|
|
||||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
|
||||||
|
|
||||||
### The directory environment:
|
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
|
||||||
PKG_CONFIG ?= pkg-config
|
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
|
||||||
LIBDIR = $(call PKGCFG,libdir)
|
|
||||||
PLGCFG = $(call PKGCFG,plgcfg)
|
|
||||||
#
|
|
||||||
TMPDIR ?= /tmp
|
|
||||||
|
|
||||||
### The compiler options:
|
|
||||||
|
|
||||||
export CFLAGS = $(call PKGCFG,cflags)
|
|
||||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
|
||||||
|
|
||||||
### 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 +=
|
|
||||||
|
|
||||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
|
||||||
|
|
||||||
### The object files (add further files here):
|
|
||||||
|
|
||||||
OBJS = $(PLUGIN).o
|
|
||||||
|
|
||||||
### The main target:
|
|
||||||
|
|
||||||
all: $(SOFILE)
|
|
||||||
|
|
||||||
### Implicit rules:
|
|
||||||
|
|
||||||
%.o: %.c
|
|
||||||
@echo CC $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
|
||||||
|
|
||||||
### Dependencies:
|
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
|
||||||
DEPFILE = .dependencies
|
|
||||||
$(DEPFILE): Makefile
|
|
||||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
|
||||||
|
|
||||||
-include $(DEPFILE)
|
|
||||||
|
|
||||||
### Targets:
|
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
|
||||||
@echo LD $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
|
||||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
|
||||||
|
|
||||||
install: install-lib
|
|
||||||
|
|
||||||
dist: clean
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@echo Distribution package created as $(PACKAGE).tgz
|
|
||||||
|
|
||||||
clean:
|
|
||||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
|
@ -1,15 +0,0 @@
|
|||||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
|
||||||
|
|
||||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
|
|
||||||
Project's homepage: https://www.tvdr.de
|
|
||||||
|
|
||||||
Latest version available at: https://www.tvdr.de
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Description: This is an example that shows the use of cStatus.
|
|
@ -1,209 +0,0 @@
|
|||||||
/*
|
|
||||||
* status.c: A plugin for the Video Disk Recorder
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: status.c 5.4 2025/02/12 21:18:53 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <vdr/plugin.h>
|
|
||||||
#include <vdr/status.h>
|
|
||||||
|
|
||||||
static const char *VERSION = "2.6.1";
|
|
||||||
static const char *DESCRIPTION = "Status monitor test";
|
|
||||||
static const char *MAINMENUENTRY = NULL;
|
|
||||||
|
|
||||||
// ---
|
|
||||||
|
|
||||||
class cStatusTest : public cStatus {
|
|
||||||
protected:
|
|
||||||
virtual void TimerChange(const cTimer *Timer, eTimerChange Change);
|
|
||||||
virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView);
|
|
||||||
virtual void Recording(const cDevice *Device, const char *Name, const char *FileName, bool On);
|
|
||||||
virtual void Replaying(const cControl *Control, const char *Name, const char *FileName, bool On);
|
|
||||||
virtual void SetVolume(int Volume, bool Absolute);
|
|
||||||
virtual void SetAudioTrack(int Index, const char * const *Tracks);
|
|
||||||
virtual void SetAudioChannel(int AudioChannel);
|
|
||||||
virtual void SetSubtitleTrack(int Index, const char * const *Tracks);
|
|
||||||
virtual void OsdClear(void);
|
|
||||||
virtual void OsdTitle(const char *Title);
|
|
||||||
virtual void OsdStatusMessage2(eMessageType Type, const char *Message);
|
|
||||||
virtual void OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue);
|
|
||||||
virtual void OsdItem2(const char *Text, int Index, bool Selectable);
|
|
||||||
virtual void OsdCurrentItem2(const char *Text, int Index);
|
|
||||||
virtual void OsdTextItem(const char *Text, bool Scroll);
|
|
||||||
virtual void OsdChannel(const char *Text);
|
|
||||||
virtual void OsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle);
|
|
||||||
};
|
|
||||||
|
|
||||||
void cStatusTest::TimerChange(const cTimer *Timer, eTimerChange Change)
|
|
||||||
{
|
|
||||||
dsyslog("status: cStatusTest::TimerChange %s %d", Timer ? *Timer->ToText(true) : "-", Change);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cStatusTest::ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView)
|
|
||||||
{
|
|
||||||
dsyslog("status: cStatusTest::ChannelSwitch %d %d %d", Device->CardIndex(), ChannelNumber, LiveView);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cStatusTest::Recording(const cDevice *Device, const char *Name, const char *FileName, bool On)
|
|
||||||
{
|
|
||||||
dsyslog("status: cStatusTest::Recording %d %s %s %d", Device->CardIndex(), Name, FileName, On);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cStatusTest::Replaying(const cControl *Control, const char *Name, const char *FileName, bool On)
|
|
||||||
{
|
|
||||||
dsyslog("status: cStatusTest::Replaying %s %s %d", Name, FileName, On);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cStatusTest::SetVolume(int Volume, bool Absolute)
|
|
||||||
{
|
|
||||||
dsyslog("status: cStatusTest::SetVolume %d %d", Volume, Absolute);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cStatusTest::SetAudioTrack(int Index, const char * const *Tracks)
|
|
||||||
{
|
|
||||||
dsyslog("status: cStatusTest::SetAudioTrack %d %s", Index, Tracks[Index]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cStatusTest::SetAudioChannel(int AudioChannel)
|
|
||||||
{
|
|
||||||
dsyslog("status: cStatusTest::SetAudioChannel %d", AudioChannel);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cStatusTest::SetSubtitleTrack(int Index, const char * const *Tracks)
|
|
||||||
{
|
|
||||||
dsyslog("status: cStatusTest::SetSubtitleTrack %d %s", Index, Tracks[Index]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cStatusTest::OsdClear(void)
|
|
||||||
{
|
|
||||||
dsyslog("status: cStatusTest::OsdClear");
|
|
||||||
}
|
|
||||||
|
|
||||||
void cStatusTest::OsdTitle(const char *Title)
|
|
||||||
{
|
|
||||||
dsyslog("status: cStatusTest::OsdTitle '%s'", Title);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cStatusTest::OsdStatusMessage2(eMessageType Type, const char *Message)
|
|
||||||
{
|
|
||||||
dsyslog("status: cStatusTest::OsdStatusMessage2 %d '%s'", Type, Message);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cStatusTest::OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue)
|
|
||||||
{
|
|
||||||
dsyslog("status: cStatusTest::OsdHelpKeys %s - %s - %s - %s", Red, Green, Yellow, Blue);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cStatusTest::OsdItem2(const char *Text, int Index, bool Selected)
|
|
||||||
{
|
|
||||||
dsyslog("status: cStatusTest::OsdItem2 %s %d %d", Text, Index, Selected);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cStatusTest::OsdCurrentItem2(const char *Text, int Index)
|
|
||||||
{
|
|
||||||
dsyslog("status: cStatusTest::OsdCurrentItem %s %d", Text, Index);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cStatusTest::OsdTextItem(const char *Text, bool Scroll)
|
|
||||||
{
|
|
||||||
dsyslog("status: cStatusTest::OsdTextItem %s %d", Text, Scroll);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cStatusTest::OsdChannel(const char *Text)
|
|
||||||
{
|
|
||||||
dsyslog("status: cStatusTest::OsdChannel %s", Text);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cStatusTest::OsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle)
|
|
||||||
{
|
|
||||||
char buffer[25];
|
|
||||||
struct tm tm_r;
|
|
||||||
dsyslog("status: cStatusTest::OsdProgramme");
|
|
||||||
strftime(buffer, sizeof(buffer), "%R", localtime_r(&PresentTime, &tm_r));
|
|
||||||
dsyslog("%5s %s", buffer, PresentTitle);
|
|
||||||
dsyslog("%5s %s", "", PresentSubtitle);
|
|
||||||
strftime(buffer, sizeof(buffer), "%R", localtime_r(&FollowingTime, &tm_r));
|
|
||||||
dsyslog("%5s %s", buffer, FollowingTitle);
|
|
||||||
dsyslog("%5s %s", "", FollowingSubtitle);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---
|
|
||||||
|
|
||||||
class cPluginStatus : public cPlugin {
|
|
||||||
private:
|
|
||||||
// Add any member variables or functions you may need here.
|
|
||||||
cStatusTest *statusTest;
|
|
||||||
public:
|
|
||||||
cPluginStatus(void);
|
|
||||||
virtual ~cPluginStatus();
|
|
||||||
virtual const char *Version(void) { return VERSION; }
|
|
||||||
virtual const char *Description(void) { return DESCRIPTION; }
|
|
||||||
virtual const char *CommandLineHelp(void);
|
|
||||||
virtual bool ProcessArgs(int argc, char *argv[]);
|
|
||||||
virtual bool Start(void);
|
|
||||||
virtual void Housekeeping(void);
|
|
||||||
virtual const char *MainMenuEntry(void) { return MAINMENUENTRY; }
|
|
||||||
virtual cOsdObject *MainMenuAction(void);
|
|
||||||
virtual cMenuSetupPage *SetupMenu(void);
|
|
||||||
virtual bool SetupParse(const char *Name, const char *Value);
|
|
||||||
};
|
|
||||||
|
|
||||||
cPluginStatus::cPluginStatus(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!
|
|
||||||
statusTest = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
cPluginStatus::~cPluginStatus()
|
|
||||||
{
|
|
||||||
// Clean up after yourself!
|
|
||||||
delete statusTest;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *cPluginStatus::CommandLineHelp(void)
|
|
||||||
{
|
|
||||||
// Return a string that describes all known command line options.
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cPluginStatus::ProcessArgs(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
// Implement command line argument processing here if applicable.
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cPluginStatus::Start(void)
|
|
||||||
{
|
|
||||||
// Start any background activities the plugin shall perform.
|
|
||||||
statusTest = new cStatusTest;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cPluginStatus::Housekeeping(void)
|
|
||||||
{
|
|
||||||
// Perform any cleanup or other regular tasks.
|
|
||||||
}
|
|
||||||
|
|
||||||
cOsdObject *cPluginStatus::MainMenuAction(void)
|
|
||||||
{
|
|
||||||
// Perform the action when selected from the main VDR menu.
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
cMenuSetupPage *cPluginStatus::SetupMenu(void)
|
|
||||||
{
|
|
||||||
// Return a setup menu in case the plugin supports one.
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cPluginStatus::SetupParse(const char *Name, const char *Value)
|
|
||||||
{
|
|
||||||
// Parse your own setup parameters and store their values.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
VDRPLUGINCREATOR(cPluginStatus); // Don't touch this!
|
|
@ -1,340 +0,0 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 2, June 1991
|
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
License is intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users. This
|
|
||||||
General Public License applies to most of the Free Software
|
|
||||||
Foundation's software and to any other program whose authors commit to
|
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
|
||||||
the GNU Lesser General Public License instead.) You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
this service if you wish), that you receive source code or can get it
|
|
||||||
if you want it, that you can change the software or use pieces of it
|
|
||||||
in new free programs; and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
|
||||||
These restrictions translate to certain responsibilities for you if you
|
|
||||||
distribute copies of the software, or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
|
||||||
you have. You must make sure that they, too, receive or can get the
|
|
||||||
source code. And you must show them these terms so they know their
|
|
||||||
rights.
|
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
|
||||||
distribute and/or modify the software.
|
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
|
||||||
that everyone understands that there is no warranty for this free
|
|
||||||
software. If the software is modified by someone else and passed on, we
|
|
||||||
want its recipients to know that what they have is not the original, so
|
|
||||||
that any problems introduced by others will not reflect on the original
|
|
||||||
authors' reputations.
|
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
|
||||||
program will individually obtain patent licenses, in effect making the
|
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
|
||||||
under the terms of this General Public License. The "Program", below,
|
|
||||||
refers to any such program or work, and a "work based on the Program"
|
|
||||||
means either the Program or any derivative work under copyright law:
|
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
|
||||||
source code as you receive it, in any medium, provided that you
|
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
notices that refer to this License and to the absence of any warranty;
|
|
||||||
and give any other recipients of the Program a copy of this License
|
|
||||||
along with the Program.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
|
||||||
of it, thus forming a work based on the Program, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
|
||||||
whole or in part contains or is derived from the Program or any
|
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
parties under the terms of this License.
|
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
|
||||||
when run, you must cause it, when started running for such
|
|
||||||
interactive use in the most ordinary way, to print or display an
|
|
||||||
announcement including an appropriate copyright notice and a
|
|
||||||
notice that there is no warranty (or else, saying that you provide
|
|
||||||
a warranty) and that users may redistribute the program under
|
|
||||||
these conditions, and telling the user how to view a copy of this
|
|
||||||
License. (Exception: if the Program itself is interactive but
|
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Program,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Program.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
|
||||||
under Section 2) in object code or executable form under the terms of
|
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
|
||||||
source code, which must be distributed under the terms of Sections
|
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
|
||||||
years, to give any third party, for a charge no more than your
|
|
||||||
cost of physically performing source distribution, a complete
|
|
||||||
machine-readable copy of the corresponding source code, to be
|
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
customarily used for software interchange; or,
|
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
|
||||||
to distribute corresponding source code. (This alternative is
|
|
||||||
allowed only for noncommercial distribution and only if you
|
|
||||||
received the program in object code or executable form with such
|
|
||||||
an offer, in accord with Subsection b above.)
|
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For an executable work, complete source
|
|
||||||
code means all the source code for all modules it contains, plus any
|
|
||||||
associated interface definition files, plus the scripts used to
|
|
||||||
control compilation and installation of the executable. However, as a
|
|
||||||
special exception, the source code distributed need not include
|
|
||||||
anything that is normally distributed (in either source or binary
|
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
|
||||||
operating system on which the executable runs, unless that component
|
|
||||||
itself accompanies the executable.
|
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
|
||||||
access to copy from a designated place, then offering equivalent
|
|
||||||
access to copy the source code from the same place counts as
|
|
||||||
distribution of the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
except as expressly provided under this License. Any attempt
|
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
void, and will automatically terminate your rights under this License.
|
|
||||||
However, parties who have received copies, or rights, from you under
|
|
||||||
this License will not have their licenses terminated so long as such
|
|
||||||
parties remain in full compliance.
|
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Program or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Program (or any work based on the
|
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Program or works based on it.
|
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
|
||||||
Program), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
|
||||||
these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties to
|
|
||||||
this License.
|
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Program at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Program by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Program.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
|
||||||
any particular circumstance, the balance of the section is intended to
|
|
||||||
apply and the section as a whole is intended to apply in other
|
|
||||||
circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system, which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Program under this License
|
|
||||||
may add an explicit geographical distribution limitation excluding
|
|
||||||
those countries, so that distribution is permitted only in or among
|
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
|
||||||
specifies a version number of this License which applies to it and "any
|
|
||||||
later version", you have the option of following the terms and conditions
|
|
||||||
either of that version or of any later version published by the Free
|
|
||||||
Software Foundation. If the Program does not specify a version number of
|
|
||||||
this License, you may choose any version ever published by the Free Software
|
|
||||||
Foundation.
|
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
|
||||||
programs whose distribution conditions are different, write to the author
|
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
of preserving the free status of all derivatives of our free software and
|
|
||||||
of promoting the sharing and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
|
||||||
when it starts in an interactive mode:
|
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) year name of author
|
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, the commands you use may
|
|
||||||
be called something other than `show w' and `show c'; they could even be
|
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License.
|
|
@ -1,43 +0,0 @@
|
|||||||
VDR Plugin 'svdrpdemo' Revision History
|
|
||||||
---------------------------------------
|
|
||||||
|
|
||||||
2005-08-27: Version 0.0.1
|
|
||||||
|
|
||||||
- Initial revision.
|
|
||||||
|
|
||||||
2005-08-28: Version 0.0.2
|
|
||||||
|
|
||||||
- Removed unused MAINMENUENTRY.
|
|
||||||
|
|
||||||
2007-08-15: Version 0.0.3
|
|
||||||
|
|
||||||
- Moved the "all" target in the Makefile before the "Implicit rules",
|
|
||||||
so that a plain "make" will compile everything.
|
|
||||||
|
|
||||||
2012-12-27: Version 0.0.4
|
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
|
||||||
|
|
||||||
2013-01-12: Version 0.0.5
|
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
|
||||||
|
|
||||||
2013-03-31: Version 2.0.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2014-01-01: Version 2.1.1
|
|
||||||
|
|
||||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
|
||||||
|
|
||||||
2015-02-19: Version 2.2.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2018-04-15: Version 2.4.0
|
|
||||||
|
|
||||||
- Official release.
|
|
||||||
|
|
||||||
2021-12-27: Version 2.6.0
|
|
||||||
|
|
||||||
- Official release.
|
|
@ -1,97 +0,0 @@
|
|||||||
#
|
|
||||||
# Makefile for a Video Disk Recorder plugin
|
|
||||||
#
|
|
||||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
|
||||||
|
|
||||||
# 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 = svdrpdemo
|
|
||||||
|
|
||||||
### The version number of this plugin (taken from the main source file):
|
|
||||||
|
|
||||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
|
||||||
|
|
||||||
### The directory environment:
|
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
|
||||||
PKG_CONFIG ?= pkg-config
|
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
|
||||||
LIBDIR = $(call PKGCFG,libdir)
|
|
||||||
PLGCFG = $(call PKGCFG,plgcfg)
|
|
||||||
#
|
|
||||||
TMPDIR ?= /tmp
|
|
||||||
|
|
||||||
### The compiler options:
|
|
||||||
|
|
||||||
export CFLAGS = $(call PKGCFG,cflags)
|
|
||||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
|
||||||
|
|
||||||
### 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 +=
|
|
||||||
|
|
||||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
|
||||||
|
|
||||||
### The object files (add further files here):
|
|
||||||
|
|
||||||
OBJS = $(PLUGIN).o
|
|
||||||
|
|
||||||
### The main target:
|
|
||||||
|
|
||||||
all: $(SOFILE)
|
|
||||||
|
|
||||||
### Implicit rules:
|
|
||||||
|
|
||||||
%.o: %.c
|
|
||||||
@echo CC $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
|
||||||
|
|
||||||
### Dependencies:
|
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
|
||||||
DEPFILE = .dependencies
|
|
||||||
$(DEPFILE): Makefile
|
|
||||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
|
||||||
|
|
||||||
-include $(DEPFILE)
|
|
||||||
|
|
||||||
### Targets:
|
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
|
||||||
@echo LD $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
|
||||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
|
||||||
|
|
||||||
install: install-lib
|
|
||||||
|
|
||||||
dist: clean
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@echo Distribution package created as $(PACKAGE).tgz
|
|
||||||
|
|
||||||
clean:
|
|
||||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
|
@ -1,17 +0,0 @@
|
|||||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
|
||||||
|
|
||||||
Written by: Klaus Schmidinger <Klaus.Schmidinger@tvdr.de>
|
|
||||||
|
|
||||||
Project's homepage: https://www.tvdr.de
|
|
||||||
|
|
||||||
Latest version available at: https://www.tvdr.de
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Description:
|
|
||||||
|
|
||||||
This plugin shows how to add SVDRP support to a plugin.
|
|
@ -1,59 +0,0 @@
|
|||||||
/*
|
|
||||||
* svdrpdemo.c: A plugin for the Video Disk Recorder
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: svdrpdemo.c 4.1 2018/04/10 13:01:07 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <vdr/plugin.h>
|
|
||||||
|
|
||||||
static const char *VERSION = "2.4.0";
|
|
||||||
static const char *DESCRIPTION = "How to add SVDRP support to a plugin";
|
|
||||||
|
|
||||||
class cPluginSvdrpdemo : public cPlugin {
|
|
||||||
private:
|
|
||||||
// Add any member variables or functions you may need here.
|
|
||||||
public:
|
|
||||||
virtual const char *Version(void) { return VERSION; }
|
|
||||||
virtual const char *Description(void) { return DESCRIPTION; }
|
|
||||||
virtual const char **SVDRPHelpPages(void);
|
|
||||||
virtual cString SVDRPCommand(const char *Command, const char *Option, int &ReplyCode);
|
|
||||||
};
|
|
||||||
|
|
||||||
const char **cPluginSvdrpdemo::SVDRPHelpPages(void)
|
|
||||||
{
|
|
||||||
static const char *HelpPages[] = {
|
|
||||||
"DATE\n"
|
|
||||||
" Print the current date.",
|
|
||||||
"TIME [ raw ]\n"
|
|
||||||
" Print the current time.\n"
|
|
||||||
" If the optional keyword 'raw' is given, the result will be the\n"
|
|
||||||
" raw time_t data.",
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
return HelpPages;
|
|
||||||
}
|
|
||||||
|
|
||||||
cString cPluginSvdrpdemo::SVDRPCommand(const char *Command, const char *Option, int &ReplyCode)
|
|
||||||
{
|
|
||||||
if (strcasecmp(Command, "DATE") == 0) {
|
|
||||||
// we use the default reply code here
|
|
||||||
return DateString(time(NULL));
|
|
||||||
}
|
|
||||||
else if (strcasecmp(Command, "TIME") == 0) {
|
|
||||||
ReplyCode = 901;
|
|
||||||
if (*Option) {
|
|
||||||
if (strcasecmp(Option, "RAW") == 0)
|
|
||||||
return cString::sprintf("%ld\nThis is the number of seconds since the epoch\nand a demo of a multi-line reply", time(NULL));
|
|
||||||
else {
|
|
||||||
ReplyCode = 504;
|
|
||||||
return cString::sprintf("Unknown option: \"%s\"", Option);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return TimeString(time(NULL));
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
VDRPLUGINCREATOR(cPluginSvdrpdemo); // Don't touch this!
|
|
28
README
28
README
@ -4,38 +4,38 @@ Video Disk Recorder ('VDR')
|
|||||||
These files contain the source code of the "Video Disk Recorder",
|
These files contain the source code of the "Video Disk Recorder",
|
||||||
which is based on the DVB driver of the LinuxTV project (http://linuxtv.org).
|
which is based on the DVB driver of the LinuxTV project (http://linuxtv.org).
|
||||||
For details about the "Video Disk Recorder" project please
|
For details about the "Video Disk Recorder" project please
|
||||||
refer to https://www.tvdr.de.
|
refer to http://www.cadsoft.de/people/kls/vdr.
|
||||||
|
|
||||||
|
There is also a remote control unit described on those
|
||||||
|
Web pages, which can be used within this program.
|
||||||
|
|
||||||
Please see the INSTALL file for details on how to install
|
Please see the INSTALL file for details on how to install
|
||||||
this program on your computer.
|
this program on your computer.
|
||||||
|
|
||||||
The MANUAL file describes how to operate the VDR.
|
The MANUAL file describes how to operate the VDR.
|
||||||
|
|
||||||
The CONTRIBUTORS file lists all the people who have contributed to the
|
The author can be contacted at kls@cadsoft.de.
|
||||||
development of VDR.
|
|
||||||
|
|
||||||
The author can be contacted at vdr@tvdr.de.
|
Yet another "set-top-box"?
|
||||||
|
|
||||||
Yet another "set-top box"?
|
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
The "set-top boxes" available from commercial companies all have
|
The "set-top-boxes" available from commercial companies all have
|
||||||
one major drawback: they are not "open". This project's goal is
|
one major drawback: they are not "open". This project's goal is
|
||||||
to build an "open" digital satellite receiver and timer controlled
|
to build an "open" digital satellite receiver and timer controlled
|
||||||
video disk recorder, based upon open standards and freely available
|
video disk recorder, based upon open standards and freely available
|
||||||
driver software (of course, the hardware still has to be bought).
|
driver software (of course, the hardware still has to be bought).
|
||||||
|
|
||||||
The on screen menu system is simple, but shall provide all the
|
The on screen menu system is simple, but shall provide all the
|
||||||
possibilities necessary to perform timer controlled recording,
|
possibilites necessary to perform timer controlled recording,
|
||||||
file management and even "on disk editing". The menus
|
file management and even "on disk editing". The menus
|
||||||
of commercial set-top boxes usually are a lot more fancy than
|
of commercial set-top-boxes usually are a lot more fancy than
|
||||||
the ones in this system, but here we have the full source code
|
the ones in this system, but here we have the full source code
|
||||||
and can modify the menus in whatever way desired.
|
and can modify the menus in whatever way desired.
|
||||||
|
|
||||||
If you actually use VDR, please add yourself to the "VDR User Counter"
|
What do you think?
|
||||||
at https://www.tvdr.de/counter.htm. You can also like VDR on facebook
|
------------------
|
||||||
at https://www.facebook.com/VideoDiskRecorder.
|
|
||||||
|
|
||||||
|
So, what do you think about this project? Does it make sense? Were you
|
||||||
|
able to use it? Do you have suggestions on how to improve it?
|
||||||
|
Please send email to kls@cadsoft.de if you'd like to comment on this.
|
||||||
|
|
||||||
"VDR Video Disk Recorder" is a registered trademark of Klaus Schmidinger.
|
|
||||||
"TVDR TV Done Right" is a registered trademark of Klaus Schmidinger.
|
|
||||||
|
56
README.i18n
56
README.i18n
@ -1,56 +0,0 @@
|
|||||||
Video Disk Recorder ('VDR') - Internationalization
|
|
||||||
--------------------------------------------------
|
|
||||||
|
|
||||||
The internationalized texts of VDR and its plugins use the 'gettext'
|
|
||||||
functionality. This file provides information on how to maintain
|
|
||||||
these texts. The instructions apply equally to VDR itself or any
|
|
||||||
plugin.
|
|
||||||
|
|
||||||
|
|
||||||
How to initiate internationalization support
|
|
||||||
--------------------------------------------
|
|
||||||
|
|
||||||
Not every plugin necessarily has texts that are visible to the
|
|
||||||
user, therefore there is by default no 'po' directory.
|
|
||||||
If your plugin source contains texts marked for translation
|
|
||||||
with tr(), you need to
|
|
||||||
|
|
||||||
- Change into the source directory.
|
|
||||||
- Enter the command 'mkdir po'.
|
|
||||||
|
|
||||||
After that, continue with "How to translate to a new language".
|
|
||||||
|
|
||||||
How to translate to a new language
|
|
||||||
----------------------------------
|
|
||||||
|
|
||||||
- Change into the source directory.
|
|
||||||
- Do a 'make i18n' to have the current *.pot file created.
|
|
||||||
- Make sure your locale is set to the language you want to
|
|
||||||
translate to.
|
|
||||||
- Change into the 'po' subdirectory and run 'msginit'. This
|
|
||||||
will create a new *.po file for your language.
|
|
||||||
- Edit the new *.po file and translate the texts.
|
|
||||||
You can do this either with your favorite text editor, or
|
|
||||||
with a specialized tool like POEdit, GTranslator, KBabel
|
|
||||||
or whatever you have.
|
|
||||||
|
|
||||||
How to maintain an existing language file
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
- Change into the source directory.
|
|
||||||
- Do a 'make i18n' to have the *.po files brought up-to-date
|
|
||||||
with the texts in the source code.
|
|
||||||
- Edit the modified *.po file(s) and translate the texts.
|
|
||||||
If you are using a plain text editor, you should search for
|
|
||||||
empty strings ("") to find new, untranslated texts. Also,
|
|
||||||
look for the "fuzzy" keyword to find translations that have
|
|
||||||
been "guessed" from other, similar texts, and make sure they
|
|
||||||
are correct. After that you may want to remove the "fuzzy"
|
|
||||||
keyword. Specialized tools for maintaining translation
|
|
||||||
files may provide particular functions to guide you through
|
|
||||||
updating translations.
|
|
||||||
|
|
||||||
Once you have created or updated a translation file, please
|
|
||||||
send it to the maintainer of the respective plugin (in case
|
|
||||||
it belongs to a plugin) or to vdr@tvdr.de (for core VDR
|
|
||||||
language files).
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user