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.4.1-5" have entirely different histories.
1881
CONTRIBUTORS
1881
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;
|
|
||||||
}
|
|
||||||
}
|
|
337
INSTALL
337
INSTALL
@ -1,9 +1,25 @@
|
|||||||
Installation of the Video Disk Recorder
|
Installation of the Video Disk Recorder
|
||||||
---------------------------------------
|
---------------------------------------
|
||||||
|
|
||||||
Version 2.7
|
Version 1.4
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
|
IMPORTANT NOTES:
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Please make sure your environment is NOT set to use UTF-8 or
|
||||||
|
any other multibyte character representation. Check the value of your
|
||||||
|
$LANG or $LC_CTYPE environment variable, and if it contains something
|
||||||
|
like "de_DE.UTF-8", make sure you set it to something like "de_DE.iso8859-1"
|
||||||
|
or whatever single byte character mode you want. If you run VDR with
|
||||||
|
UTF-8 enabled, it may crash in case it encounters EPG or channel data
|
||||||
|
that contains non-7-bit ASCII characters. Another problem may occur if
|
||||||
|
you have mounted your video partition with "iocharset=utf8". In that case
|
||||||
|
recordings that contain umlauts or other non-seven-bit ASCII characters
|
||||||
|
may be displayed wrong, or not at all. Please make sure you mount your
|
||||||
|
video partition with "iocharset=iso8859-1" or whatever single byte character
|
||||||
|
mode you want.
|
||||||
|
|
||||||
Compiling and running the program:
|
Compiling and running the program:
|
||||||
----------------------------------
|
----------------------------------
|
||||||
|
|
||||||
@ -16,30 +32,20 @@ to Make.config and adjust the definition of DVBDIR in that file.
|
|||||||
|
|
||||||
Refer to http://linuxtv.org for more information about the Linux-DVB driver.
|
Refer to http://linuxtv.org for more information about the Linux-DVB driver.
|
||||||
|
|
||||||
VDR requires the Linux-DVB driver version that supports the S2API interface.
|
VDR requires the Linux-DVB driver version dated 2003-08-23 or higher
|
||||||
|
to work properly.
|
||||||
|
|
||||||
You will also need to install the following libraries, as well as their
|
You will also need to install the "libjpeg" and "libcap" libraries,
|
||||||
"devel" packages to get the necessary header files for compiling VDR:
|
as well as their "devel" packages to get the necessary header files
|
||||||
|
for compiling VDR. If the "capability" module is not compiled into
|
||||||
fontconfig
|
your kernel, you may need to do "modprobe capability" before running
|
||||||
freetype2
|
VDR.
|
||||||
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!
|
||||||
|
|
||||||
@ -47,41 +53,47 @@ By default the 'vdr' program can be controlled via the PC keyboard.
|
|||||||
If you want to disable control via the keyboard, you can add NO_KBD=1
|
If you want to disable control via the keyboard, you can add NO_KBD=1
|
||||||
to the 'make' call, or use the '--no-kbd' option at runtime.
|
to the 'make' call, or use the '--no-kbd' option at runtime.
|
||||||
|
|
||||||
If you have a LIRC compatible infrared remote control receiver you can define
|
If you have an infrared remote control unit you can define the REMOTE macro
|
||||||
the REMOTE macro to one of the following values in the 'make' call to make
|
to one of the following values in the 'make' call to make the respective control
|
||||||
the respective control the default:
|
the default:
|
||||||
|
|
||||||
|
REMOTE=RCU control via the "Remote Control Unit" receiver
|
||||||
|
(see http://www.cadsoft.de/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)
|
||||||
|
|
||||||
Alternatively you can use the '--lirc' option at runtime.
|
Alternatively you can use the '--rcu' or '--lirc' options at runtime.
|
||||||
This option accepts an optional path to the remote control device,
|
These options accept an optional path to the remote control device,
|
||||||
the default of which can be set via the LIRC_DEVICE macro.
|
the defaults of which can be set via the RCU_DEVICE and LIRC_DEVICE macros,
|
||||||
|
respectively.
|
||||||
|
|
||||||
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. Alternatively, you can call VDR with the command
|
||||||
|
line option '--vfat'.
|
||||||
|
|
||||||
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.
|
||||||
@ -93,33 +105,6 @@ 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.
|
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,35 +123,8 @@ 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
|
||||||
@ -175,6 +133,9 @@ 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 'daemon' mode and the initial program call will return
|
||||||
immediately! 'runvdr' needs to be started as user 'root'. Use the '-u'
|
immediately! 'runvdr' needs to be started as user 'root'. Use the '-u'
|
||||||
option to run the actual 'vdr' program under a different user id.
|
option to run the actual 'vdr' program under a different user id.
|
||||||
|
Note that the 'runvdr' script needs to be adjusted to your particular
|
||||||
|
requirements before you can actually use it. See the comments inside
|
||||||
|
the script for more information.
|
||||||
|
|
||||||
Setting the system time:
|
Setting the system time:
|
||||||
------------------------
|
------------------------
|
||||||
@ -199,33 +160,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 five 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
|
||||||
@ -241,8 +199,9 @@ correspond to a time that is "Min. event timeout" minutes in the future.
|
|||||||
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 +223,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 +251,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"
|
||||||
@ -357,7 +281,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
|
||||||
@ -368,22 +292,39 @@ 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 2GB. 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
|
||||||
|
one large logical volume, you can set up several video directories as
|
||||||
|
mount points for these disks. All of these directories must have the
|
||||||
|
same basic name and must end with a numeric part, which starts at 0 for
|
||||||
|
the main directory and has increasing values for the rest of the
|
||||||
|
directories. For example
|
||||||
|
|
||||||
|
/video0
|
||||||
|
/video1
|
||||||
|
/video2
|
||||||
|
|
||||||
|
would be a setup with three directories. You can use more than one
|
||||||
|
numeric digit, and the directories need not be directly under '/':
|
||||||
|
|
||||||
|
/mnt/MyVideos/vdr.00
|
||||||
|
/mnt/MyVideos/vdr.01
|
||||||
|
/mnt/MyVideos/vdr.02
|
||||||
|
...
|
||||||
|
/mnt/MyVideos/vdr.11
|
||||||
|
|
||||||
|
would set up twelve disks (wow, what a machine that would be!).
|
||||||
|
|
||||||
|
To use such a multi directory setup, you need to add the '-v' option
|
||||||
|
with the name of the basic directory when running 'vdr':
|
||||||
|
|
||||||
|
vdr -v /video0
|
||||||
|
|
||||||
|
Note that you should not copy any non-VDR files into the /videoX directories,
|
||||||
since this might cause a lot of unnecessary disk access when VDR cleans up those
|
since this might cause a lot of unnecessary disk access when VDR cleans up those
|
||||||
directories and there is a large number of files and/or subdirectories in
|
directories and there is a large number of files and/or subdirectories in
|
||||||
there. If you have a large disk that you want to use for VDR's video data as
|
there.
|
||||||
well as other stuff, you may want to create a subdirectory for VDR, as in
|
|
||||||
|
|
||||||
/mydisk/video
|
|
||||||
|
|
||||||
and put your other stuff into, say,
|
|
||||||
|
|
||||||
/mydisk/otherstuff
|
|
||||||
|
|
||||||
If your video directory is mounted via a Samba share, and you are experiencing
|
If your video directory is mounted via a Samba share, and you are experiencing
|
||||||
problems with replaying in fast forward mode, you can comment out the line
|
problems with replaying in fast forward mode, you can comment out the line
|
||||||
@ -397,11 +338,9 @@ Configuration files:
|
|||||||
|
|
||||||
There are several configuration files that hold information about
|
There are several configuration files that hold information about
|
||||||
channels, remote control keys, timers etc. By default these files are
|
channels, remote control keys, timers etc. 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. Plugins assume their configuration files
|
||||||
you can copy the file Make.config.template to Make.config and set the parameter
|
in a subdirectory called "plugins" of this 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
|
For starters just copy all *.conf files from the VDR directory into your
|
||||||
video directory.
|
video directory.
|
||||||
@ -428,28 +367,6 @@ 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". You also need to set up the file 'diseqc.conf' to properly
|
||||||
access your DiSEqC equipment (see man vdr(5) for details).
|
access your DiSEqC equipment (see man vdr(5) for details).
|
||||||
|
|
||||||
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):
|
||||||
------------------------------------------------------
|
------------------------------------------------------
|
||||||
|
|
||||||
@ -484,17 +401,19 @@ for a detailed description).
|
|||||||
|
|
||||||
The recommended PC key assignments are:
|
The recommended 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 'Enter'
|
||||||
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 'remote.conf' and restart 'vdr' to get
|
||||||
|
into learning mode.
|
||||||
|
|
||||||
Generating source code documentation:
|
Generating source code documentation:
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
|
@ -6,95 +6,41 @@
|
|||||||
# 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: Make.config.template 5.2 2024/10/11 14:21:04 kls Exp $
|
# $Id: Make.config.template 1.10 2006/06/15 09:15:25 kls Exp $
|
||||||
|
|
||||||
### The C compiler and options:
|
### The C compiler and options:
|
||||||
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
CFLAGS = -g -O3 -Wall
|
CFLAGS = -g -O2 -Wall
|
||||||
|
|
||||||
CXX = g++
|
CXX = g++
|
||||||
CXXFLAGS = -g -O3 -Wall -Werror=overloaded-virtual -Wno-parentheses
|
CXXFLAGS = -g -O2 -Wall -Woverloaded-virtual
|
||||||
|
|
||||||
# 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
|
ifdef PLUGIN
|
||||||
CFLAGS += -fPIC
|
CFLAGS += -fPIC
|
||||||
CXXFLAGS += -fPIC
|
CXXFLAGS += -fPIC
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
### The directory environment:
|
||||||
|
|
||||||
|
#DVBDIR = /usr/src/v4l-dvb/linux
|
||||||
|
MANDIR = /usr/local/man
|
||||||
|
BINDIR = /usr/local/bin
|
||||||
|
|
||||||
|
PLUGINDIR= ./PLUGINS
|
||||||
|
PLUGINLIBDIR= $(PLUGINDIR)/lib
|
||||||
|
VIDEODIR = /video
|
||||||
|
|
||||||
|
### The remote control:
|
||||||
|
|
||||||
|
LIRC_DEVICE = /dev/lircd
|
||||||
|
RCU_DEVICE = /dev/ttyS1
|
||||||
|
|
||||||
|
## Define if you want vdr to not run as root
|
||||||
|
#VDR_USER = vdr
|
||||||
|
|
||||||
|
### You don't need to touch the following:
|
||||||
|
|
||||||
|
ifdef DVBDIR
|
||||||
|
INCLUDES += -I$(DVBDIR)/include
|
||||||
|
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.
|
|
385
Makefile
385
Makefile
@ -4,103 +4,61 @@
|
|||||||
# 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.95 2006/08/20 10:44:22 kls Exp $
|
||||||
|
|
||||||
.DELETE_ON_ERROR:
|
.DELETE_ON_ERROR:
|
||||||
|
|
||||||
# Compiler flags:
|
|
||||||
|
|
||||||
PKG_CONFIG ?= pkg-config
|
|
||||||
|
|
||||||
CC ?= gcc
|
CC ?= gcc
|
||||||
CFLAGS ?= -g -O3 -Wall
|
CFLAGS ?= -g -O2 -Wall
|
||||||
|
|
||||||
CXX ?= g++
|
CXX ?= g++
|
||||||
CXXFLAGS ?= -g -O3 -Wall -Werror=overloaded-virtual -Wno-parentheses
|
CXXFLAGS ?= -g -O2 -Wall -Woverloaded-virtual
|
||||||
CXXFLAGS += $(CPPFLAGS)
|
|
||||||
|
|
||||||
CDEFINES = -D_GNU_SOURCE
|
LSIDIR = ./libsi
|
||||||
CDEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
|
MANDIR = /usr/local/man
|
||||||
|
BINDIR = /usr/local/bin
|
||||||
|
LIBS = -ljpeg -lpthread -ldl -lcap
|
||||||
|
INCLUDES =
|
||||||
|
|
||||||
LIBS = -ljpeg -lpthread -ldl -lcap -lrt $(shell $(PKG_CONFIG) --libs freetype2 fontconfig)
|
PLUGINDIR= ./PLUGINS
|
||||||
INCLUDES ?= $(shell $(PKG_CONFIG) --cflags freetype2 fontconfig)
|
PLUGINLIBDIR= $(PLUGINDIR)/lib
|
||||||
|
|
||||||
# Directories:
|
VIDEODIR = /video
|
||||||
|
|
||||||
CWD ?= $(shell pwd)
|
DOXYGEN = /usr/bin/doxygen
|
||||||
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
|
|
||||||
|
|
||||||
DESTDIR ?=
|
|
||||||
VIDEODIR ?= /srv/vdr/video
|
|
||||||
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
|
DOXYFILE = Doxyfile
|
||||||
|
|
||||||
# User configuration
|
|
||||||
|
|
||||||
-include Make.config
|
-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
|
|
||||||
|
|
||||||
# Object files
|
|
||||||
|
|
||||||
SILIB = $(LSIDIR)/libsi.a
|
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\
|
OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbosd.o\
|
||||||
dvbplayer.o dvbspu.o dvbsubtitle.o eit.o eitscan.o epg.o filter.o font.o i18n.o interface.o keys.o\
|
dvbplayer.o dvbspu.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\
|
lirc.o menu.o menuitems.o nit.o osdbase.o osd.o pat.o player.o plugin.o rcu.o\
|
||||||
receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o shutdown.o\
|
receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o\
|
||||||
skinclassic.o skinlcars.o skins.o skinsttng.o sourceparams.o sources.o spu.o status.o svdrp.o themes.o thread.o\
|
skinclassic.o skins.o skinsttng.o sources.o spu.o status.o svdrp.o themes.o thread.o\
|
||||||
timers.o tools.o transfer.o vdr.o videodir.o
|
timers.o tools.o transfer.o vdr.o videodir.o
|
||||||
|
|
||||||
DEFINES += $(CDEFINES)
|
FIXFONT_ISO8859_1 = -adobe-courier-bold-r-normal--25-*-100-100-m-*-iso8859-1
|
||||||
INCLUDES += $(CINCLUDES)
|
OSDFONT_ISO8859_1 = -adobe-helvetica-medium-r-normal--23-*-100-100-p-*-iso8859-1
|
||||||
|
SMLFONT_ISO8859_1 = -adobe-helvetica-medium-r-normal--18-*-100-100-p-*-iso8859-1
|
||||||
|
|
||||||
|
FIXFONT_ISO8859_2 = -adobe-courier-bold-r-normal--25-*-100-100-m-*-iso8859-2
|
||||||
|
OSDFONT_ISO8859_2 = -adobe-helvetica-medium-r-normal--24-*-75-75-p-*-iso8859-2
|
||||||
|
SMLFONT_ISO8859_2 = -adobe-helvetica-medium-r-normal--18-*-75-75-p-*-iso8859-2
|
||||||
|
|
||||||
|
FIXFONT_ISO8859_5 = -rfx-courier-bold-r-normal--24-*-75-75-m-*-iso8859-5
|
||||||
|
OSDFONT_ISO8859_5 = -rfx-helvetica-medium-r-normal--24-*-75-75-p-*-iso8859-5
|
||||||
|
SMLFONT_ISO8859_5 = -rfx-helvetica-medium-r-normal--18-*-75-75-p-*-iso8859-5
|
||||||
|
|
||||||
|
FIXFONT_ISO8859_7 = --user-medium-r-normal--26-171-110-110-m-140-iso8859-7
|
||||||
|
OSDFONT_ISO8859_7 = --user-medium-r-normal--23-179-85-85-m-120-iso8859-7
|
||||||
|
SMLFONT_ISO8859_7 = --user-medium-r-normal--19-160-72-72-m-110-iso8859-7
|
||||||
|
|
||||||
|
FIXFONT_ISO8859_15 = -adobe-courier-bold-r-normal--25-*-100-100-m-*-iso8859-15
|
||||||
|
OSDFONT_ISO8859_15 = -adobe-helvetica-medium-r-normal--23-*-100-100-p-*-iso8859-15
|
||||||
|
SMLFONT_ISO8859_15 = -adobe-helvetica-medium-r-normal--18-*-100-100-p-*-iso8859-15
|
||||||
|
|
||||||
ifdef HDRDIR
|
|
||||||
HDRDIR := -I$(HDRDIR)
|
|
||||||
endif
|
|
||||||
ifndef NO_KBD
|
ifndef NO_KBD
|
||||||
DEFINES += -DREMOTE_KBD
|
DEFINES += -DREMOTE_KBD
|
||||||
endif
|
endif
|
||||||
@ -110,40 +68,40 @@ endif
|
|||||||
ifdef VDR_USER
|
ifdef VDR_USER
|
||||||
DEFINES += -DVDR_USER=\"$(VDR_USER)\"
|
DEFINES += -DVDR_USER=\"$(VDR_USER)\"
|
||||||
endif
|
endif
|
||||||
ifdef BIDI
|
|
||||||
INCLUDES += $(shell $(PKG_CONFIG) --cflags fribidi)
|
|
||||||
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
|
|
||||||
|
|
||||||
LIRC_DEVICE ?= /var/run/lirc/lircd
|
LIRC_DEVICE ?= /dev/lircd
|
||||||
|
RCU_DEVICE ?= /dev/ttyS1
|
||||||
|
|
||||||
|
DEFINES += -DLIRC_DEVICE=\"$(LIRC_DEVICE)\" -DRCU_DEVICE=\"$(RCU_DEVICE)\"
|
||||||
|
|
||||||
|
DEFINES += -D_GNU_SOURCE
|
||||||
|
|
||||||
DEFINES += -DLIRC_DEVICE=\"$(LIRC_DEVICE)\"
|
|
||||||
DEFINES += -DVIDEODIR=\"$(VIDEODIR)\"
|
DEFINES += -DVIDEODIR=\"$(VIDEODIR)\"
|
||||||
DEFINES += -DCONFDIR=\"$(CONFDIR)\"
|
DEFINES += -DPLUGINDIR=\"$(PLUGINLIBDIR)\"
|
||||||
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"):
|
# 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)
|
VDRVERSION = $(shell sed -ne '/define VDRVERSION/s/^.*"\(.*\)".*$$/\1/p' config.h)
|
||||||
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' config.h)
|
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' config.h)
|
||||||
|
|
||||||
all: vdr i18n plugins
|
ifdef VFAT
|
||||||
|
# for people who want their video directory on a VFAT partition
|
||||||
|
DEFINES += -DVFAT
|
||||||
|
endif
|
||||||
|
|
||||||
|
all: vdr
|
||||||
|
font: genfontfile\
|
||||||
|
fontfix-iso8859-1.c fontosd-iso8859-1.c fontsml-iso8859-1.c\
|
||||||
|
fontfix-iso8859-2.c fontosd-iso8859-2.c fontsml-iso8859-2.c\
|
||||||
|
fontfix-iso8859-5.c fontosd-iso8859-5.c fontsml-iso8859-5.c\
|
||||||
|
fontfix-iso8859-7.c fontosd-iso8859-7.c fontsml-iso8859-7.c\
|
||||||
|
fontfix-iso8859-15.c fontosd-iso8859-15.c fontsml-iso8859-15.c
|
||||||
|
@echo "font files created."
|
||||||
|
|
||||||
# Implicit rules:
|
# Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
@echo CC $@
|
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
|
||||||
|
|
||||||
# Dependencies:
|
# Dependencies:
|
||||||
|
|
||||||
@ -157,73 +115,54 @@ $(DEPFILE): Makefile
|
|||||||
# The main program:
|
# The main program:
|
||||||
|
|
||||||
vdr: $(OBJS) $(SILIB)
|
vdr: $(OBJS) $(SILIB)
|
||||||
@echo LD $@
|
$(CXX) $(CXXFLAGS) -rdynamic $(OBJS) $(NCURSESLIB) $(LIBS) $(LIBDIRS) $(SILIB) -o vdr
|
||||||
$(Q)$(CXX) $(CXXFLAGS) -rdynamic $(LDFLAGS) $(OBJS) $(LIBS) $(SILIB) -o vdr
|
|
||||||
|
# The font files:
|
||||||
|
|
||||||
|
fontfix-iso8859-1.c:
|
||||||
|
./genfontfile "cFont::tPixelData FontFix_iso8859_1" "$(FIXFONT_ISO8859_1)" > $@
|
||||||
|
fontosd-iso8859-1.c:
|
||||||
|
./genfontfile "cFont::tPixelData FontOsd_iso8859_1" "$(OSDFONT_ISO8859_1)" > $@
|
||||||
|
fontsml-iso8859-1.c:
|
||||||
|
./genfontfile "cFont::tPixelData FontSml_iso8859_1" "$(SMLFONT_ISO8859_1)" > $@
|
||||||
|
|
||||||
|
fontfix-iso8859-2.c:
|
||||||
|
./genfontfile "cFont::tPixelData FontFix_iso8859_2" "$(FIXFONT_ISO8859_2)" > $@
|
||||||
|
fontosd-iso8859-2.c:
|
||||||
|
./genfontfile "cFont::tPixelData FontOsd_iso8859_2" "$(OSDFONT_ISO8859_2)" > $@
|
||||||
|
fontsml-iso8859-2.c:
|
||||||
|
./genfontfile "cFont::tPixelData FontSml_iso8859_2" "$(SMLFONT_ISO8859_2)" > $@
|
||||||
|
|
||||||
|
fontfix-iso8859-5.c:
|
||||||
|
./genfontfile "cFont::tPixelData FontFix_iso8859_5" "$(FIXFONT_ISO8859_5)" > $@
|
||||||
|
fontosd-iso8859-5.c:
|
||||||
|
./genfontfile "cFont::tPixelData FontOsd_iso8859_5" "$(OSDFONT_ISO8859_5)" > $@
|
||||||
|
fontsml-iso8859-5.c:
|
||||||
|
./genfontfile "cFont::tPixelData FontSml_iso8859_5" "$(SMLFONT_ISO8859_5)" > $@
|
||||||
|
|
||||||
|
fontfix-iso8859-7.c:
|
||||||
|
./genfontfile "cFont::tPixelData FontFix_iso8859_7" "$(FIXFONT_ISO8859_7)" > $@
|
||||||
|
fontosd-iso8859-7.c:
|
||||||
|
./genfontfile "cFont::tPixelData FontOsd_iso8859_7" "$(OSDFONT_ISO8859_7)" > $@
|
||||||
|
fontsml-iso8859-7.c:
|
||||||
|
./genfontfile "cFont::tPixelData FontSml_iso8859_7" "$(SMLFONT_ISO8859_7)" > $@
|
||||||
|
|
||||||
|
fontfix-iso8859-15.c:
|
||||||
|
./genfontfile "cFont::tPixelData FontFix_iso8859_15" "$(FIXFONT_ISO8859_15)" > $@
|
||||||
|
fontosd-iso8859-15.c:
|
||||||
|
./genfontfile "cFont::tPixelData FontOsd_iso8859_15" "$(OSDFONT_ISO8859_15)" > $@
|
||||||
|
fontsml-iso8859-15.c:
|
||||||
|
./genfontfile "cFont::tPixelData FontSml_iso8859_15" "$(SMLFONT_ISO8859_15)" > $@
|
||||||
|
|
||||||
|
# The font file generator:
|
||||||
|
|
||||||
|
genfontfile: genfontfile.c
|
||||||
|
$(CC) $(CFLAGS) -o $@ -L/usr/X11R6/lib $< -lX11
|
||||||
|
|
||||||
# The libsi library:
|
# The libsi library:
|
||||||
|
|
||||||
$(SILIB): make-libsi
|
$(SILIB):
|
||||||
@$(MAKE) --no-print-directory -C $(LSIDIR) CXXFLAGS="$(CXXFLAGS)" DEFINES="$(CDEFINES)" all
|
$(MAKE) -C $(LSIDIR) all
|
||||||
make-libsi: # empty rule makes sure the sub-make for libsi is always called
|
|
||||||
|
|
||||||
# pkg-config file:
|
|
||||||
|
|
||||||
.PHONY: vdr.pc
|
|
||||||
vdr.pc:
|
|
||||||
@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):
|
|
||||||
|
|
||||||
PODIR = po
|
|
||||||
LOCALEDIR = locale
|
|
||||||
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):
|
# The 'include' directory (for plugins):
|
||||||
|
|
||||||
@ -235,133 +174,73 @@ include-dir:
|
|||||||
|
|
||||||
# Plugins:
|
# Plugins:
|
||||||
|
|
||||||
plugins: include-dir vdr.pc
|
plugins: include-dir
|
||||||
@failed="";\
|
@failed="";\
|
||||||
noapiv="";\
|
noapiv="";\
|
||||||
oldmakefile="";\
|
|
||||||
for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do\
|
for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do\
|
||||||
echo; echo "*** Plugin $$i:";\
|
echo "Plugin $$i:";\
|
||||||
# No APIVERSION: Skip\
|
|
||||||
if ! grep -q "\$$(LIBDIR)/.*\$$(APIVERSION)" "$(PLUGINDIR)/src/$$i/Makefile" ; then\
|
if ! grep -q "\$$(LIBDIR)/.*\$$(APIVERSION)" "$(PLUGINDIR)/src/$$i/Makefile" ; then\
|
||||||
echo "ERROR: plugin $$i doesn't honor APIVERSION - not compiled!";\
|
echo "ERROR: plugin $$i doesn't honor APIVERSION - not compiled!";\
|
||||||
noapiv="$$noapiv $$i";\
|
noapiv="$$noapiv $$i";\
|
||||||
continue;\
|
continue;\
|
||||||
fi;\
|
fi;\
|
||||||
# Old Makefile\
|
$(MAKE) -C "$(PLUGINDIR)/src/$$i" all || failed="$$failed $$i";\
|
||||||
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;\
|
done;\
|
||||||
fi;\
|
|
||||||
fi;\
|
|
||||||
done;\
|
|
||||||
# Conclusion\
|
|
||||||
if [ -n "$$noapiv" ] ; then echo; echo "*** plugins without APIVERSION:$$noapiv"; echo; fi;\
|
if [ -n "$$noapiv" ] ; then echo; echo "*** plugins without APIVERSION:$$noapiv"; echo; fi;\
|
||||||
if [ -n "$$oldmakefile" ] ; then\
|
if [ -n "$$failed" ] ; then echo; echo "*** failed plugins:$$failed"; echo; fi
|
||||||
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
|
clean-plugins:
|
||||||
@for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do $(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR="$(CWD)" clean; done
|
@for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do $(MAKE) -C "$(PLUGINDIR)/src/$$i" clean; done
|
||||||
@-rm -f $(PLUGINDIR)/lib/lib*-*.so.$(APIVERSION)
|
@-rm -f $(PLUGINDIR)/lib/lib*-*.so.$(APIVERSION)
|
||||||
|
|
||||||
# Install the files (note that 'install-pc' must be first!):
|
# Install the files:
|
||||||
|
|
||||||
install: install-pc install-bin install-conf install-doc install-plugins install-i18n install-includes
|
install: install-bin install-conf install-doc install-plugins
|
||||||
|
|
||||||
# VDR binary:
|
# VDR binary:
|
||||||
|
|
||||||
install-bin: vdr
|
install-bin: vdr
|
||||||
@mkdir -p $(DESTDIR)$(BINDIR)
|
@mkdir -p $(BINDIR)
|
||||||
@cp --remove-destination vdr svdrpsend $(DESTDIR)$(BINDIR)
|
@cp --remove-destination vdr runvdr $(BINDIR)
|
||||||
|
|
||||||
# Configuration files:
|
# Configuration files:
|
||||||
|
|
||||||
install-dirs:
|
install-conf:
|
||||||
@mkdir -p $(DESTDIR)$(VIDEODIR)
|
@if [ ! -d $(VIDEODIR) ]; then\
|
||||||
@mkdir -p $(DESTDIR)$(CONFDIR)
|
mkdir -p $(VIDEODIR);\
|
||||||
@mkdir -p $(DESTDIR)$(ARGSDIR)
|
cp *.conf $(VIDEODIR);\
|
||||||
@mkdir -p $(DESTDIR)$(CACHEDIR)
|
fi
|
||||||
@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:
|
# Documentation:
|
||||||
|
|
||||||
install-doc:
|
install-doc:
|
||||||
@mkdir -p $(DESTDIR)$(MANDIR)/man1
|
@mkdir -p $(MANDIR)/man1
|
||||||
@mkdir -p $(DESTDIR)$(MANDIR)/man5
|
@mkdir -p $(MANDIR)/man5
|
||||||
@gzip -c vdr.1 > $(DESTDIR)$(MANDIR)/man1/vdr.1.gz
|
@gzip -c vdr.1 > $(MANDIR)/man1/vdr.1.gz
|
||||||
@gzip -c vdr.5 > $(DESTDIR)$(MANDIR)/man5/vdr.5.gz
|
@gzip -c vdr.5 > $(MANDIR)/man5/vdr.5.gz
|
||||||
@gzip -c svdrpsend.1 > $(DESTDIR)$(MANDIR)/man1/svdrpsend.1.gz
|
|
||||||
|
|
||||||
# Plugins:
|
# Plugins:
|
||||||
|
|
||||||
install-plugins: plugins
|
install-plugins: plugins
|
||||||
@-for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do\
|
@mkdir -p $(PLUGINLIBDIR)
|
||||||
echo; echo "*** Plugin $$i:";\
|
@cp --remove-destination $(PLUGINDIR)/lib/lib*-*.so.$(APIVERSION) $(PLUGINLIBDIR)
|
||||||
$(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:
|
# Source documentation:
|
||||||
|
|
||||||
srcdoc:
|
srcdoc:
|
||||||
@cat $(DOXYFILE) > $(DOXYFILE).tmp
|
@cp $(DOXYFILE) $(DOXYFILE).tmp
|
||||||
@echo PROJECT_NUMBER = $(VDRVERSION) >> $(DOXYFILE).tmp
|
@echo PROJECT_NUMBER = $(VDRVERSION) >> $(DOXYFILE).tmp
|
||||||
@chmod +x $(DOXYFILE).filter
|
|
||||||
$(DOXYGEN) $(DOXYFILE).tmp
|
$(DOXYGEN) $(DOXYFILE).tmp
|
||||||
@rm $(DOXYFILE).tmp
|
@rm $(DOXYFILE).tmp
|
||||||
|
|
||||||
# Housekeeping:
|
# Housekeeping:
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@$(MAKE) --no-print-directory -C $(LSIDIR) clean
|
$(MAKE) -C $(LSIDIR) 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
|
-rm -rf include
|
||||||
@-rm -rf include
|
-rm -rf srcdoc
|
||||||
@-rm -rf srcdoc
|
fontclean:
|
||||||
CLEAN: clean
|
-rm -f fontfix*.c fontosd*.c fontsml*.c
|
||||||
distclean: clean-plugins clean
|
CLEAN: clean fontclean
|
||||||
|
|
||||||
|
959
PLUGINS.html
959
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!
|
|
@ -49,57 +49,3 @@ VDR Plugin 'hello' Revision History
|
|||||||
2006-04-22: Version 0.1.1
|
2006-04-22: Version 0.1.1
|
||||||
|
|
||||||
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
|
- 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,121 +1,75 @@
|
|||||||
#
|
#
|
||||||
# Makefile for a Video Disk Recorder plugin
|
# Makefile for a Video Disk Recorder plugin
|
||||||
#
|
#
|
||||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
# $Id: Makefile 1.14 2006/04/24 17:20:58 kls Exp $
|
||||||
|
|
||||||
# The official name of this plugin.
|
# The official name of this plugin.
|
||||||
# This name will be used in the '-P...' option of VDR to load the 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.
|
# By default the main source file also carries this name.
|
||||||
|
#
|
||||||
PLUGIN = hello
|
PLUGIN = hello
|
||||||
|
|
||||||
### The version number of this plugin (taken from the main source file):
|
### 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')
|
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||||
|
|
||||||
|
### The C++ compiler and options:
|
||||||
|
|
||||||
|
CXX ?= g++
|
||||||
|
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual
|
||||||
|
|
||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
VDRDIR = ../../..
|
||||||
PKG_CONFIG ?= pkg-config
|
LIBDIR = ../../lib
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
TMPDIR = /tmp
|
||||||
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:
|
### Allow user defined options to overwrite defaults:
|
||||||
|
|
||||||
-include $(PLGCFG)
|
-include $(VDRDIR)/Make.config
|
||||||
|
|
||||||
|
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||||
|
|
||||||
|
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||||
|
|
||||||
### The name of the distribution archive:
|
### The name of the distribution archive:
|
||||||
|
|
||||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||||
PACKAGE = vdr-$(ARCHIVE)
|
PACKAGE = vdr-$(ARCHIVE)
|
||||||
|
|
||||||
### The name of the shared object file:
|
|
||||||
|
|
||||||
SOFILE = libvdr-$(PLUGIN).so
|
|
||||||
|
|
||||||
### Includes and Defines (add further entries here):
|
### Includes and Defines (add further entries here):
|
||||||
|
|
||||||
INCLUDES +=
|
INCLUDES += -I$(VDRDIR)/include
|
||||||
|
|
||||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||||
|
|
||||||
### The object files (add further files here):
|
### The object files (add further files here):
|
||||||
|
|
||||||
OBJS = $(PLUGIN).o
|
OBJS = $(PLUGIN).o i18n.o
|
||||||
|
|
||||||
### The main target:
|
|
||||||
|
|
||||||
all: $(SOFILE) i18n
|
|
||||||
|
|
||||||
### Implicit rules:
|
### Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
@echo CC $@
|
$(CXX) $(CXXFLAGS) -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) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
-include $(DEPFILE)
|
-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:
|
### Targets:
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
all: libvdr-$(PLUGIN).so
|
||||||
@echo LD $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
libvdr-$(PLUGIN).so: $(OBJS)
|
||||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||||
|
@cp $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||||
|
|
||||||
install: install-lib install-i18n
|
dist: clean
|
||||||
|
|
||||||
dist: $(I18Npo) clean
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
@mkdir $(TMPDIR)/$(ARCHIVE)
|
||||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
||||||
@ -124,5 +78,4 @@ dist: $(I18Npo) clean
|
|||||||
@echo Distribution package created as $(PACKAGE).tgz
|
@echo Distribution package created as $(PACKAGE).tgz
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@-rm -f $(PODIR)/*.mo $(PODIR)/*.pot
|
|
||||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
||||||
|
@ -1,15 +1,11 @@
|
|||||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||||
|
|
||||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
Written by: Klaus Schmidinger <kls@cadsoft.de>
|
||||||
|
|
||||||
Project's homepage: https://www.tvdr.de
|
Project's homepage: www.cadsoft.de/people/kls/vdr
|
||||||
|
|
||||||
Latest version available at: https://www.tvdr.de
|
Latest version available at: www.cadsoft.de/people/kls/vdr/software.htm
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
See the file COPYING for license information.
|
||||||
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.
|
Description: This is a small demo of the VDR plugin interface.
|
||||||
|
@ -3,18 +3,18 @@
|
|||||||
*
|
*
|
||||||
* See the README file for copyright information and how to reach the author.
|
* 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 $
|
* $Id: hello.c 1.12 2006/04/22 09:31:52 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <vdr/i18n.h>
|
|
||||||
#include <vdr/interface.h>
|
#include <vdr/interface.h>
|
||||||
#include <vdr/plugin.h>
|
#include <vdr/plugin.h>
|
||||||
|
#include "i18n.h"
|
||||||
|
|
||||||
static const char *VERSION = "2.4.0";
|
static const char *VERSION = "0.1.1";
|
||||||
static const char *DESCRIPTION = trNOOP("A friendly greeting");
|
static const char *DESCRIPTION = "A friendly greeting";
|
||||||
static const char *MAINMENUENTRY = trNOOP("Hello");
|
static const char *MAINMENUENTRY = "Hello";
|
||||||
|
|
||||||
class cPluginHello : public cPlugin {
|
class cPluginHello : public cPlugin {
|
||||||
private:
|
private:
|
||||||
@ -96,7 +96,7 @@ bool cPluginHello::ProcessArgs(int argc, char *argv[])
|
|||||||
static struct option long_options[] = {
|
static struct option long_options[] = {
|
||||||
{ "aaa", required_argument, NULL, 'a' },
|
{ "aaa", required_argument, NULL, 'a' },
|
||||||
{ "bbb", no_argument, NULL, 'b' },
|
{ "bbb", no_argument, NULL, 'b' },
|
||||||
{ NULL, no_argument, NULL, 0 }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
int c;
|
int c;
|
||||||
@ -115,6 +115,7 @@ bool cPluginHello::ProcessArgs(int argc, char *argv[])
|
|||||||
bool cPluginHello::Start(void)
|
bool cPluginHello::Start(void)
|
||||||
{
|
{
|
||||||
// Start any background activities the plugin shall perform.
|
// Start any background activities the plugin shall perform.
|
||||||
|
RegisterI18n(Phrases);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
145
PLUGINS/src/hello/i18n.c
Normal file
145
PLUGINS/src/hello/i18n.c
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
/*
|
||||||
|
* i18n.c: Internationalization
|
||||||
|
*
|
||||||
|
* See the README file for copyright information and how to reach the author.
|
||||||
|
*
|
||||||
|
* $Id: i18n.c 1.6 2006/04/22 09:30:57 kls Exp $
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "i18n.h"
|
||||||
|
|
||||||
|
const tI18nPhrase Phrases[] = {
|
||||||
|
{ "Hello",
|
||||||
|
"Hallo",
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"Hei",
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"¿àØÒÕâ!",
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"Ahoj",
|
||||||
|
},
|
||||||
|
{ "Hello world!",
|
||||||
|
"Hallo Welt!",
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"Hei maailma!",
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"·ÔàÐÒáâÒãÙ ÜØà!",
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"Ahoj svìte!",
|
||||||
|
},
|
||||||
|
{ "Howdy folks!",
|
||||||
|
"Tach zusammen!",
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"Mitä kuuluu?",
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"ºÐÚ ßÞÖØÒÐÕâÕ?",
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"Nazdar vespolek!",
|
||||||
|
},
|
||||||
|
{ "A friendly greeting",
|
||||||
|
"Ein freundlicher Gruß",
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"Ystävällisin terveisin",
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"´àãÖÕáÚÞÕ ßàØÒÕâáâÒØÕ",
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"Pøátelský pozdrav",
|
||||||
|
},
|
||||||
|
{ "Greeting time (s)",
|
||||||
|
"Dauer des Grußes (s)",
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"Tervehdysaika (s)",
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"¿àÞÔÞÛÖØâÕÛìÝÞáâì ßàØÒÕâáâÒØï",
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"Èas pozdravu (s)",
|
||||||
|
},
|
||||||
|
{ "Use alternate greeting",
|
||||||
|
"Alternativen Gruß verwenden",
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"Käytä vaihtoehtoista tervehdystä",
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"°ÛìâÕàÝÐâØÒÝÞÕ ßàØÒÕâáâÒØÕ",
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"Pou¾ít alternativní pozdrav",
|
||||||
|
},
|
||||||
|
{ NULL }
|
||||||
|
};
|
16
PLUGINS/src/hello/i18n.h
Normal file
16
PLUGINS/src/hello/i18n.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* i18n.h: Internationalization
|
||||||
|
*
|
||||||
|
* See the README file for copyright information and how to reach the author.
|
||||||
|
*
|
||||||
|
* $Id: i18n.h 1.2 2002/05/11 14:48:16 kls Exp $
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _I18N__H
|
||||||
|
#define _I18N__H
|
||||||
|
|
||||||
|
#include <vdr/i18n.h>
|
||||||
|
|
||||||
|
extern const tI18nPhrase Phrases[];
|
||||||
|
|
||||||
|
#endif //_I18N__H
|
@ -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 "世界您好!"
|
|
@ -12,82 +12,3 @@ VDR Plugin 'osddemo' Revision History
|
|||||||
2004-04-30: Version 0.1.1
|
2004-04-30: Version 0.1.1
|
||||||
|
|
||||||
- New OSD handling.
|
- 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,89 +1,73 @@
|
|||||||
#
|
#
|
||||||
# Makefile for a Video Disk Recorder plugin
|
# Makefile for a Video Disk Recorder plugin
|
||||||
#
|
#
|
||||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
# $Id: Makefile 1.8 2006/04/24 17:21:00 kls Exp $
|
||||||
|
|
||||||
# The official name of this plugin.
|
# The official name of this plugin.
|
||||||
# This name will be used in the '-P...' option of VDR to load the 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.
|
# By default the main source file also carries this name.
|
||||||
|
#
|
||||||
PLUGIN = osddemo
|
PLUGIN = osddemo
|
||||||
|
|
||||||
### The version number of this plugin (taken from the main source file):
|
### 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')
|
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||||
|
|
||||||
|
### The C++ compiler and options:
|
||||||
|
|
||||||
|
CXX ?= g++
|
||||||
|
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual
|
||||||
|
|
||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
VDRDIR = ../../..
|
||||||
PKG_CONFIG ?= pkg-config
|
LIBDIR = ../../lib
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
TMPDIR = /tmp
|
||||||
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:
|
### Allow user defined options to overwrite defaults:
|
||||||
|
|
||||||
-include $(PLGCFG)
|
-include $(VDRDIR)/Make.config
|
||||||
|
|
||||||
|
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||||
|
|
||||||
|
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||||
|
|
||||||
### The name of the distribution archive:
|
### The name of the distribution archive:
|
||||||
|
|
||||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||||
PACKAGE = vdr-$(ARCHIVE)
|
PACKAGE = vdr-$(ARCHIVE)
|
||||||
|
|
||||||
### The name of the shared object file:
|
|
||||||
|
|
||||||
SOFILE = libvdr-$(PLUGIN).so
|
|
||||||
|
|
||||||
### Includes and Defines (add further entries here):
|
### Includes and Defines (add further entries here):
|
||||||
|
|
||||||
INCLUDES +=
|
INCLUDES += -I$(VDRDIR)/include
|
||||||
|
|
||||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||||
|
|
||||||
### The object files (add further files here):
|
### The object files (add further files here):
|
||||||
|
|
||||||
OBJS = $(PLUGIN).o
|
OBJS = $(PLUGIN).o
|
||||||
|
|
||||||
### The main target:
|
|
||||||
|
|
||||||
all: $(SOFILE)
|
|
||||||
|
|
||||||
### Implicit rules:
|
### Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
@echo CC $@
|
$(CXX) $(CXXFLAGS) -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) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
-include $(DEPFILE)
|
-include $(DEPFILE)
|
||||||
|
|
||||||
### Targets:
|
### Targets:
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
all: libvdr-$(PLUGIN).so
|
||||||
@echo LD $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
libvdr-$(PLUGIN).so: $(OBJS)
|
||||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||||
|
@cp $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||||
install: install-lib
|
|
||||||
|
|
||||||
dist: clean
|
dist: clean
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||||
|
@ -1,16 +1,12 @@
|
|||||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||||
|
|
||||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
Written by: Klaus Schmidinger <kls@cadsoft.de>
|
||||||
|
|
||||||
Project's homepage: https://www.tvdr.de
|
Project's homepage: http://www.cadsoft.de/vdr
|
||||||
|
|
||||||
Latest version available at: https://www.tvdr.de
|
Latest version available at: http://www.cadsoft.de/vdr
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
See the file COPYING for license information.
|
||||||
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:
|
Description:
|
||||||
|
|
||||||
@ -19,16 +15,4 @@ 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
|
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.
|
user can draw lines with the Up, Down, Left and Right buttons.
|
||||||
The color buttons are used to switch color.
|
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.
|
Press Ok to close the window.
|
||||||
|
@ -3,224 +3,15 @@
|
|||||||
*
|
*
|
||||||
* See the README file for copyright information and how to reach the author.
|
* 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 $
|
* $Id: osddemo.c 1.3 2004/05/16 09:28:51 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <vdr/osd.h>
|
|
||||||
#include <vdr/plugin.h>
|
#include <vdr/plugin.h>
|
||||||
|
|
||||||
static const char *VERSION = "2.4.1";
|
static const char *VERSION = "0.1.1";
|
||||||
static const char *DESCRIPTION = "Demo of arbitrary OSD setup";
|
static const char *DESCRIPTION = "Demo of arbitrary OSD setup";
|
||||||
static const char *MAINMENUENTRY = "Osd Demo";
|
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 -------------------------------------------------------------
|
// --- cLineGame -------------------------------------------------------------
|
||||||
|
|
||||||
class cLineGame : public cOsdObject {
|
class cLineGame : public cOsdObject {
|
||||||
@ -231,7 +22,7 @@ private:
|
|||||||
tColor color;
|
tColor color;
|
||||||
public:
|
public:
|
||||||
cLineGame(void);
|
cLineGame(void);
|
||||||
virtual ~cLineGame();
|
~cLineGame();
|
||||||
virtual void Show(void);
|
virtual void Show(void);
|
||||||
virtual eOSState ProcessKey(eKeys Key);
|
virtual eOSState ProcessKey(eKeys Key);
|
||||||
};
|
};
|
||||||
@ -239,7 +30,7 @@ public:
|
|||||||
cLineGame::cLineGame(void)
|
cLineGame::cLineGame(void)
|
||||||
{
|
{
|
||||||
osd = NULL;
|
osd = NULL;
|
||||||
x = y = 0;
|
x = y = 50;
|
||||||
color = clrRed;
|
color = clrRed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -250,23 +41,12 @@ cLineGame::~cLineGame()
|
|||||||
|
|
||||||
void cLineGame::Show(void)
|
void cLineGame::Show(void)
|
||||||
{
|
{
|
||||||
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop());
|
osd = cOsdProvider::NewOsd(100, 50);
|
||||||
if (osd) {
|
if (osd) {
|
||||||
int x1 = cOsd::OsdWidth() - 1;
|
tArea Area = { 0, 0, 99, 199, 4 };
|
||||||
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->SetAreas(&Area, 1);
|
||||||
osd->DrawRectangle(0, 0, osd->Width() - 1, osd->Height() - 1, clrGray50);
|
osd->DrawRectangle(0, 0, 99, 199, clrGray50);
|
||||||
osd->Flush();
|
osd->Flush();
|
||||||
x = osd->Width() / 2;
|
|
||||||
y = osd->Height() / 2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
x1 = x1 * 9 / 10;
|
|
||||||
y1 = y1 * 9 / 10;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -274,420 +54,25 @@ eOSState cLineGame::ProcessKey(eKeys Key)
|
|||||||
{
|
{
|
||||||
eOSState state = cOsdObject::ProcessKey(Key);
|
eOSState state = cOsdObject::ProcessKey(Key);
|
||||||
if (state == osUnknown) {
|
if (state == osUnknown) {
|
||||||
const int d = 4;
|
|
||||||
switch (Key & ~k_Repeat) {
|
switch (Key & ~k_Repeat) {
|
||||||
case kUp: y = max(0, y - d); break;
|
case kUp: if (y > 0) y--; break;
|
||||||
case kDown: y = min(osd->Height() - d, y + d); break;
|
case kDown: if (y < 196) y++; break;
|
||||||
case kLeft: x = max(0, x - d); break;
|
case kLeft: if (x > 0) x--; break;
|
||||||
case kRight: x = min(osd->Width() - d, x + d); break;
|
case kRight: if (x < 96) x++; break;
|
||||||
case kRed: color = clrRed; break;
|
case kRed: color = clrRed; break;
|
||||||
case kGreen: color = clrGreen; break;
|
case kGreen: color = clrGreen; break;
|
||||||
case kYellow: color = clrYellow; break;
|
case kYellow: color = clrYellow; break;
|
||||||
case kBlue: color = clrBlue; break;
|
case kBlue: color = clrBlue; break;
|
||||||
case k1: DrawEllipses(osd);
|
|
||||||
return osContinue;
|
|
||||||
case k2: DrawSlopes(osd);
|
|
||||||
return osContinue;
|
|
||||||
case kBack:
|
|
||||||
case kOk: return osEnd;
|
case kOk: return osEnd;
|
||||||
default: return state;
|
default: return state;
|
||||||
}
|
}
|
||||||
osd->DrawRectangle(x, y, x + d - 1, y + d - 1, color);
|
osd->DrawRectangle(x, y, x + 3, y + 3, color);
|
||||||
osd->Flush();
|
osd->Flush();
|
||||||
state = osContinue;
|
state = osContinue;
|
||||||
}
|
}
|
||||||
return state;
|
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 --------------------------------------------------------
|
// --- cPluginOsddemo --------------------------------------------------------
|
||||||
|
|
||||||
class cPluginOsddemo : public cPlugin {
|
class cPluginOsddemo : public cPlugin {
|
||||||
@ -746,8 +131,6 @@ void cPluginOsddemo::Housekeeping(void)
|
|||||||
cOsdObject *cPluginOsddemo::MainMenuAction(void)
|
cOsdObject *cPluginOsddemo::MainMenuAction(void)
|
||||||
{
|
{
|
||||||
// Perform the action when selected from the main VDR menu.
|
// Perform the action when selected from the main VDR menu.
|
||||||
if (cOsdProvider::SupportsTrueColor())
|
|
||||||
return new cTrueColorDemo;
|
|
||||||
return new cLineGame;
|
return new cLineGame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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!"
|
|
@ -4,36 +4,3 @@ VDR Plugin 'servicedemo' Revision History
|
|||||||
2005-08-21: Version 0.1.1
|
2005-08-21: Version 0.1.1
|
||||||
|
|
||||||
- Initial revision.
|
- 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,12 +1,13 @@
|
|||||||
#
|
#
|
||||||
# Makefile for a Video Disk Recorder plugin
|
# Makefile for a Video Disk Recorder plugin
|
||||||
#
|
#
|
||||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
# $Id: Makefile 1.7 2006/06/24 09:09:54 kls Exp $
|
||||||
|
|
||||||
# The official name of this plugin.
|
# The official name of this plugin.
|
||||||
# This name will be used in the '-P...' option of VDR to load the 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.
|
# By default the main source file also carries this name.
|
||||||
|
#
|
||||||
|
PLUGIN = servicedemo # dummy name for Make.config
|
||||||
PLUGIN1 = svccli
|
PLUGIN1 = svccli
|
||||||
PLUGIN2 = svcsvr
|
PLUGIN2 = svcsvr
|
||||||
|
|
||||||
@ -14,28 +15,24 @@ PLUGIN2 = svcsvr
|
|||||||
|
|
||||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN1).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN1).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||||
|
|
||||||
|
### The C++ compiler and options:
|
||||||
|
|
||||||
|
CXX ?= g++
|
||||||
|
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual
|
||||||
|
|
||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
VDRDIR = ../../..
|
||||||
PKG_CONFIG ?= pkg-config
|
LIBDIR = ../../lib
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
TMPDIR = /tmp
|
||||||
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:
|
### Allow user defined options to overwrite defaults:
|
||||||
|
|
||||||
-include $(PLGCFG)
|
-include $(VDRDIR)/Make.config
|
||||||
|
|
||||||
|
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||||
|
|
||||||
|
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||||
|
|
||||||
### The name of the distribution archive:
|
### The name of the distribution archive:
|
||||||
|
|
||||||
@ -44,48 +41,39 @@ PACKAGE = vdr-$(ARCHIVE)
|
|||||||
|
|
||||||
### Includes and Defines (add further entries here):
|
### Includes and Defines (add further entries here):
|
||||||
|
|
||||||
INCLUDES +=
|
INCLUDES += -I$(VDRDIR)/include
|
||||||
|
|
||||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||||
|
|
||||||
### The object files (add further files here):
|
### The object files (add further files here):
|
||||||
|
|
||||||
OBJS = $(PLUGIN1).o $(PLUGIN2).o
|
OBJS = $(PLUGIN1).o $(PLUGIN2).o
|
||||||
|
|
||||||
### The main target:
|
|
||||||
|
|
||||||
all: libvdr-$(PLUGIN1).so libvdr-$(PLUGIN2).so
|
|
||||||
|
|
||||||
### Implicit rules:
|
### Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
@echo CC $@
|
$(CXX) $(CXXFLAGS) -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) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
-include $(DEPFILE)
|
-include $(DEPFILE)
|
||||||
|
|
||||||
### Targets:
|
### Targets:
|
||||||
|
|
||||||
|
all: libvdr-$(PLUGIN1).so libvdr-$(PLUGIN2).so
|
||||||
|
|
||||||
libvdr-$(PLUGIN1).so: $(PLUGIN1).o
|
libvdr-$(PLUGIN1).so: $(PLUGIN1).o
|
||||||
@echo LD $@
|
$(CXX) $(CXXFLAGS) -shared $(PLUGIN1).o -o $@
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN1).o -o $@
|
@cp $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||||
|
|
||||||
libvdr-$(PLUGIN2).so: $(PLUGIN2).o
|
libvdr-$(PLUGIN2).so: $(PLUGIN2).o
|
||||||
@echo LD $@
|
$(CXX) $(CXXFLAGS) -shared $(PLUGIN2).o -o $@
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN2).o -o $@
|
@cp $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||||
|
|
||||||
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
|
dist: clean
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||||
|
@ -2,15 +2,11 @@ This is a "plugin" for the Video Disk Recorder (VDR).
|
|||||||
|
|
||||||
Written by: Udo Richter <udo_richter@gmx.de>
|
Written by: Udo Richter <udo_richter@gmx.de>
|
||||||
|
|
||||||
Project's homepage: https://www.tvdr.de
|
Project's homepage: www.cadsoft.de/vdr
|
||||||
|
|
||||||
Latest version available at: https://www.tvdr.de
|
Latest version available at: www.cadsoft.de/vdr
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
See the file COPYING for license information.
|
||||||
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:
|
Description:
|
||||||
|
|
||||||
|
@ -3,14 +3,14 @@
|
|||||||
*
|
*
|
||||||
* See the README file for copyright information and how to reach the author.
|
* 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 $
|
* $Id: svccli.c 1.1 2005/08/21 10:44:29 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <vdr/interface.h>
|
#include <vdr/interface.h>
|
||||||
#include <vdr/plugin.h>
|
#include <vdr/plugin.h>
|
||||||
|
|
||||||
static const char *VERSION = "2.4.0";
|
static const char *VERSION = "0.1.1";
|
||||||
static const char *DESCRIPTION = "Service demo client";
|
static const char *DESCRIPTION = "Service demo client";
|
||||||
static const char *MAINMENUENTRY = "Service demo";
|
static const char *MAINMENUENTRY = "Service demo";
|
||||||
|
|
||||||
@ -32,7 +32,7 @@ struct AddService_v1_0 {
|
|||||||
int sum;
|
int sum;
|
||||||
};
|
};
|
||||||
|
|
||||||
// --- cPluginSvcCli ---------------------------------------------------------
|
// --- cPluginSvcCli ----------------------------------------------------------
|
||||||
|
|
||||||
cOsdObject *cPluginSvcCli::MainMenuAction(void)
|
cOsdObject *cPluginSvcCli::MainMenuAction(void)
|
||||||
{
|
{
|
||||||
|
@ -3,14 +3,14 @@
|
|||||||
*
|
*
|
||||||
* See the README file for copyright information and how to reach the author.
|
* 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 $
|
* $Id: svcsvr.c 1.1 2005/08/21 10:44:24 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <vdr/interface.h>
|
#include <vdr/interface.h>
|
||||||
#include <vdr/plugin.h>
|
#include <vdr/plugin.h>
|
||||||
|
|
||||||
static const char *VERSION = "2.4.0";
|
static const char *VERSION = "0.1.1";
|
||||||
static const char *DESCRIPTION = "Service demo server";
|
static const char *DESCRIPTION = "Service demo server";
|
||||||
|
|
||||||
class cPluginSvcSvr : public cPlugin {
|
class cPluginSvcSvr : public cPlugin {
|
||||||
@ -29,7 +29,7 @@ struct AddService_v1_0 {
|
|||||||
int sum;
|
int sum;
|
||||||
};
|
};
|
||||||
|
|
||||||
// --- cPluginSvcSvr ---------------------------------------------------------
|
// --- cPluginSvcSvr ----------------------------------------------------------
|
||||||
|
|
||||||
bool cPluginSvcSvr::Service(const char *Id, void *Data)
|
bool cPluginSvcSvr::Service(const char *Id, void *Data)
|
||||||
{
|
{
|
||||||
|
@ -35,129 +35,3 @@ VDR Plugin 'skincurses' Revision History
|
|||||||
- Fixed handling tabbed item display.
|
- Fixed handling tabbed item display.
|
||||||
- When the 'skincurses' plugin is loaded, it automatically sets the 'curses'
|
- When the 'skincurses' plugin is loaded, it automatically sets the 'curses'
|
||||||
skin as the current one.
|
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,121 +1,75 @@
|
|||||||
#
|
#
|
||||||
# Makefile for a Video Disk Recorder plugin
|
# Makefile for a Video Disk Recorder plugin
|
||||||
#
|
#
|
||||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
# $Id: Makefile 1.6 2006/04/24 17:21:02 kls Exp $
|
||||||
|
|
||||||
# The official name of this plugin.
|
# The official name of this plugin.
|
||||||
# This name will be used in the '-P...' option of VDR to load the 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.
|
# By default the main source file also carries this name.
|
||||||
|
#
|
||||||
PLUGIN = skincurses
|
PLUGIN = skincurses
|
||||||
|
|
||||||
### The version number of this plugin (taken from the main source file):
|
### 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')
|
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||||
|
|
||||||
|
### The C++ compiler and options:
|
||||||
|
|
||||||
|
CXX ?= g++
|
||||||
|
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual
|
||||||
|
|
||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
VDRDIR = ../../..
|
||||||
PKG_CONFIG ?= pkg-config
|
LIBDIR = ../../lib
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
TMPDIR = /tmp
|
||||||
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:
|
### Allow user defined options to overwrite defaults:
|
||||||
|
|
||||||
-include $(PLGCFG)
|
-include $(VDRDIR)/Make.config
|
||||||
|
|
||||||
|
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||||
|
|
||||||
|
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||||
|
|
||||||
### The name of the distribution archive:
|
### The name of the distribution archive:
|
||||||
|
|
||||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||||
PACKAGE = vdr-$(ARCHIVE)
|
PACKAGE = vdr-$(ARCHIVE)
|
||||||
|
|
||||||
### The name of the shared object file:
|
|
||||||
|
|
||||||
SOFILE = libvdr-$(PLUGIN).so
|
|
||||||
|
|
||||||
### Includes and Defines (add further entries here):
|
### Includes and Defines (add further entries here):
|
||||||
|
|
||||||
INCLUDES +=
|
INCLUDES += -I$(VDRDIR)/include
|
||||||
|
|
||||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||||
|
|
||||||
### The object files (add further files here):
|
### The object files (add further files here):
|
||||||
|
|
||||||
OBJS = $(PLUGIN).o
|
OBJS = $(PLUGIN).o
|
||||||
|
|
||||||
### The main target:
|
|
||||||
|
|
||||||
all: $(SOFILE) i18n
|
|
||||||
|
|
||||||
### Implicit rules:
|
### Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
@echo CC $@
|
$(CXX) $(CXXFLAGS) -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) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
-include $(DEPFILE)
|
-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:
|
### Targets:
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
all: libvdr-$(PLUGIN).so
|
||||||
@echo LD $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -lncursesw -o $@
|
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
libvdr-$(PLUGIN).so: $(OBJS)
|
||||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
$(CXX) $(CXXFLAGS) -shared $(OBJS) -lncurses -o $@
|
||||||
|
@cp $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||||
|
|
||||||
install: install-lib install-i18n
|
dist: clean
|
||||||
|
|
||||||
dist: $(I18Npo) clean
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
@mkdir $(TMPDIR)/$(ARCHIVE)
|
||||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
||||||
@ -124,5 +78,4 @@ dist: $(I18Npo) clean
|
|||||||
@echo Distribution package created as $(PACKAGE).tgz
|
@echo Distribution package created as $(PACKAGE).tgz
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@-rm -f $(PODIR)/*.mo $(PODIR)/*.pot
|
|
||||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
||||||
|
@ -1,16 +1,12 @@
|
|||||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||||
|
|
||||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
Written by: Klaus Schmidinger <kls@cadsoft.de>
|
||||||
|
|
||||||
Project's homepage: https://www.tvdr.de
|
Project's homepage: www.cadsoft.de/vdr
|
||||||
|
|
||||||
Latest version available at: https://www.tvdr.de
|
Latest version available at: www.cadsoft.de/vdr
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
See the file COPYING for license information.
|
||||||
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:
|
Description:
|
||||||
|
|
||||||
|
@ -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"
|
|
@ -3,32 +3,31 @@
|
|||||||
*
|
*
|
||||||
* See the README file for copyright information and how to reach the author.
|
* 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 $
|
* $Id: skincurses.c 1.10 2006/06/03 14:20:39 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <ncurses.h>
|
#include <ncurses.h>
|
||||||
#include <vdr/osd.h>
|
#include <vdr/osd.h>
|
||||||
#include <vdr/plugin.h>
|
#include <vdr/plugin.h>
|
||||||
#include <vdr/skins.h>
|
#include <vdr/skins.h>
|
||||||
#include <vdr/videodir.h>
|
|
||||||
|
|
||||||
static const char *VERSION = "2.4.3";
|
static const char *VERSION = "0.0.7";
|
||||||
static const char *DESCRIPTION = trNOOP("A text only skin");
|
static const char *DESCRIPTION = "A text only skin";
|
||||||
static const char *MAINMENUENTRY = NULL;
|
static const char *MAINMENUENTRY = NULL;
|
||||||
|
|
||||||
// --- cCursesFont -----------------------------------------------------------
|
// --- cCursesFont -----------------------------------------------------------
|
||||||
|
|
||||||
class cCursesFont : public cFont {
|
class cCursesFont : public cFont {
|
||||||
public:
|
public:
|
||||||
virtual int Width(void) const { return 1; }
|
cCursesFont(void): cFont(NULL) {}
|
||||||
virtual int Width(uint c) const { return 1; }
|
virtual int Width(unsigned char c) const { return 1; }
|
||||||
virtual int Width(const char *s) const { return s ? Utf8StrLen(s) : 0; }
|
virtual int Width(const char *s) const { return s ? strlen(s) : 0; }
|
||||||
|
virtual int Height(unsigned char c) const { return 1; }
|
||||||
|
virtual int Height(const char *s) const { return 1; }
|
||||||
virtual int Height(void) const { return 1; }
|
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?
|
static const cCursesFont Font;
|
||||||
|
|
||||||
// --- cCursesOsd ------------------------------------------------------------
|
// --- cCursesOsd ------------------------------------------------------------
|
||||||
|
|
||||||
@ -54,13 +53,15 @@ static int clrMessage[] = {
|
|||||||
clrRed
|
clrRed
|
||||||
};
|
};
|
||||||
|
|
||||||
static int ScOsdWidth = 50;
|
#define OsdWidth 50//XXX
|
||||||
static int ScOsdHeight = 20;
|
#define OsdHeight 20//XXX
|
||||||
|
|
||||||
class cCursesOsd : public cOsd {
|
class cCursesOsd : public cOsd {
|
||||||
private:
|
private:
|
||||||
WINDOW *savedRegion;
|
WINDOW *savedRegion;
|
||||||
cVector<int> colorPairs;
|
WINDOW *window;
|
||||||
|
enum { MaxColorPairs = 16 };
|
||||||
|
int colorPairs[MaxColorPairs];
|
||||||
void SetColor(int colorFg, int colorBg = clrBackground);
|
void SetColor(int colorFg, int colorBg = clrBackground);
|
||||||
public:
|
public:
|
||||||
cCursesOsd(int Left, int Top);
|
cCursesOsd(int Left, int Top);
|
||||||
@ -73,38 +74,44 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
cCursesOsd::cCursesOsd(int Left, int Top)
|
cCursesOsd::cCursesOsd(int Left, int Top)
|
||||||
:cOsd(Left, Top, 0)
|
:cOsd(Left, Top)
|
||||||
{
|
{
|
||||||
savedRegion = NULL;
|
savedRegion = NULL;
|
||||||
|
|
||||||
|
memset(colorPairs, 0x00, sizeof(colorPairs));
|
||||||
start_color();
|
start_color();
|
||||||
leaveok(stdscr, true);
|
leaveok(stdscr, true);
|
||||||
refresh(); // to react on changes to screen size
|
|
||||||
|
|
||||||
int begy, begx;
|
window = subwin(stdscr, OsdHeight, OsdWidth, 0, 0);
|
||||||
int maxy, maxx;
|
syncok(window, true);
|
||||||
getmaxyx(stdscr, maxy, maxx);
|
|
||||||
getbegyx(stdscr, begy, begx);
|
|
||||||
ScOsdWidth = maxx - begx;
|
|
||||||
ScOsdHeight = maxy - begy;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cCursesOsd::~cCursesOsd()
|
cCursesOsd::~cCursesOsd()
|
||||||
{
|
{
|
||||||
erase();
|
if (window) {
|
||||||
|
werase(window);
|
||||||
Flush();
|
Flush();
|
||||||
|
delwin(window);
|
||||||
|
window = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cCursesOsd::SetColor(int colorFg, int colorBg)
|
void cCursesOsd::SetColor(int colorFg, int colorBg)
|
||||||
{
|
{
|
||||||
int color = (colorBg << 16) | colorFg | 0x80000000;
|
int color = (colorBg << 16) | colorFg | 0x80000000;
|
||||||
int i = colorPairs.IndexOf(color);
|
for (int i = 0; i < MaxColorPairs; i++) {
|
||||||
if (i < 0) {
|
if (!colorPairs[i]) {
|
||||||
colorPairs.Append(color);
|
colorPairs[i] = color;
|
||||||
i = colorPairs.Size() - 1;
|
|
||||||
init_pair(i + 1, colorFg, colorBg);
|
init_pair(i + 1, colorFg, colorBg);
|
||||||
|
//XXX??? attron(COLOR_PAIR(WHITE_ON_BLUE));
|
||||||
|
wattrset(window, COLOR_PAIR(i + 1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (color == colorPairs[i]) {
|
||||||
|
wattrset(window, COLOR_PAIR(i + 1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
attrset(COLOR_PAIR(i + 1));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cCursesOsd::SaveRegion(int x1, int y1, int x2, int y2)
|
void cCursesOsd::SaveRegion(int x1, int y1, int x2, int y2)
|
||||||
@ -114,14 +121,13 @@ void cCursesOsd::SaveRegion(int x1, int y1, int x2, int y2)
|
|||||||
savedRegion = NULL;
|
savedRegion = NULL;
|
||||||
}
|
}
|
||||||
savedRegion = newwin(y2 - y1 + 1, x2 - x1 + 1, y1, x1);
|
savedRegion = newwin(y2 - y1 + 1, x2 - x1 + 1, y1, x1);
|
||||||
if (savedRegion)
|
copywin(window, savedRegion, y1, x1, 0, 0, y2 - y1, x2 - x1, false);
|
||||||
copywin(stdscr, savedRegion, y1, x1, 0, 0, y2 - y1, x2 - x1, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cCursesOsd::RestoreRegion(void)
|
void cCursesOsd::RestoreRegion(void)
|
||||||
{
|
{
|
||||||
if (savedRegion) {
|
if (savedRegion) {
|
||||||
overwrite(savedRegion, stdscr);
|
copywin(savedRegion, window, 0, 0, savedRegion->_begy, savedRegion->_begx, savedRegion->_maxy - savedRegion->_begy, savedRegion->_maxx - savedRegion->_begx, false);
|
||||||
delwin(savedRegion);
|
delwin(savedRegion);
|
||||||
savedRegion = NULL;
|
savedRegion = NULL;
|
||||||
}
|
}
|
||||||
@ -161,22 +167,18 @@ void cCursesOsd::DrawText(int x, int y, const char *s, tColor ColorFg, tColor Co
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
SetColor(ColorFg, ColorBg);
|
SetColor(ColorFg, ColorBg);
|
||||||
mvaddnstr(y, x, s, Width ? Width : ScOsdWidth - x);
|
wmove(window, y, x); // ncurses wants 'y' before 'x'!
|
||||||
|
waddnstr(window, s, OsdWidth - x);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cCursesOsd::DrawRectangle(int x1, int y1, int x2, int y2, tColor Color)
|
void cCursesOsd::DrawRectangle(int x1, int y1, int x2, int y2, tColor Color)
|
||||||
{
|
{
|
||||||
SetColor(Color, Color);
|
SetColor(Color, Color);
|
||||||
int dx = x2 - x1;
|
for (int y = y1; y <= y2; y++) {
|
||||||
int dy = y2 - y1;
|
wmove(window, y, x1); // ncurses wants 'y' before 'x'!
|
||||||
if (dx >= dy) {
|
whline(window, ' ', x2 - x1 + 1);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
wsyncup(window); // shouldn't be necessary because of 'syncok()', but w/o it doesn't work
|
||||||
}
|
}
|
||||||
|
|
||||||
void cCursesOsd::Flush(void)
|
void cCursesOsd::Flush(void)
|
||||||
@ -204,9 +206,9 @@ cSkinCursesDisplayChannel::cSkinCursesDisplayChannel(bool WithInfo)
|
|||||||
{
|
{
|
||||||
int Lines = WithInfo ? 5 : 1;
|
int Lines = WithInfo ? 5 : 1;
|
||||||
message = false;
|
message = false;
|
||||||
osd = new cCursesOsd(0, Setup.ChannelInfoPos ? 0 : ScOsdHeight - Lines);
|
osd = new cCursesOsd(0, Setup.ChannelInfoPos ? 0 : OsdHeight - Lines);
|
||||||
timeWidth = strlen("00:00");
|
timeWidth = strlen("00:00");
|
||||||
osd->DrawRectangle(0, 0, ScOsdWidth - 1, Lines - 1, clrBackground);
|
osd->DrawRectangle(0, 0, OsdWidth - 1, Lines - 1, clrBackground);
|
||||||
}
|
}
|
||||||
|
|
||||||
cSkinCursesDisplayChannel::~cSkinCursesDisplayChannel()
|
cSkinCursesDisplayChannel::~cSkinCursesDisplayChannel()
|
||||||
@ -216,14 +218,14 @@ cSkinCursesDisplayChannel::~cSkinCursesDisplayChannel()
|
|||||||
|
|
||||||
void cSkinCursesDisplayChannel::SetChannel(const cChannel *Channel, int Number)
|
void cSkinCursesDisplayChannel::SetChannel(const cChannel *Channel, int Number)
|
||||||
{
|
{
|
||||||
osd->DrawRectangle(0, 0, ScOsdWidth - 1, 0, clrBackground);
|
osd->DrawRectangle(0, 0, OsdWidth - 1, 0, clrBackground);
|
||||||
osd->DrawText(0, 0, ChannelString(Channel, Number), clrWhite, clrBackground, &Font);
|
osd->DrawText(0, 0, ChannelString(Channel, Number), clrWhite, clrBackground, &Font);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cSkinCursesDisplayChannel::SetEvents(const cEvent *Present, const cEvent *Following)
|
void cSkinCursesDisplayChannel::SetEvents(const cEvent *Present, const cEvent *Following)
|
||||||
{
|
{
|
||||||
osd->DrawRectangle(0, 1, timeWidth - 1, 4, clrRed);
|
osd->DrawRectangle(0, 1, timeWidth - 1, 4, clrRed);
|
||||||
osd->DrawRectangle(timeWidth, 1, ScOsdWidth - 1, 4, clrBackground);
|
osd->DrawRectangle(timeWidth, 1, OsdWidth - 1, 4, clrBackground);
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++) {
|
||||||
const cEvent *e = !i ? Present : Following;
|
const cEvent *e = !i ? Present : Following;
|
||||||
if (e) {
|
if (e) {
|
||||||
@ -237,8 +239,8 @@ void cSkinCursesDisplayChannel::SetEvents(const cEvent *Present, const cEvent *F
|
|||||||
void cSkinCursesDisplayChannel::SetMessage(eMessageType Type, const char *Text)
|
void cSkinCursesDisplayChannel::SetMessage(eMessageType Type, const char *Text)
|
||||||
{
|
{
|
||||||
if (Text) {
|
if (Text) {
|
||||||
osd->SaveRegion(0, 0, ScOsdWidth - 1, 0);
|
osd->SaveRegion(0, 0, OsdWidth - 1, 0);
|
||||||
osd->DrawText(0, 0, Text, clrMessage[2 * Type], clrMessage[2 * Type + 1], &Font, ScOsdWidth, 0, taCenter);
|
osd->DrawText(0, 0, Text, clrMessage[2 * Type], clrMessage[2 * Type + 1], &Font, OsdWidth, 0, taCenter);
|
||||||
message = true;
|
message = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -251,7 +253,7 @@ void cSkinCursesDisplayChannel::Flush(void)
|
|||||||
{
|
{
|
||||||
if (!message) {
|
if (!message) {
|
||||||
cString date = DayDateTime();
|
cString date = DayDateTime();
|
||||||
osd->DrawText(ScOsdWidth - Utf8StrLen(date), 0, date, clrWhite, clrBackground, &Font);
|
osd->DrawText(OsdWidth - strlen(date), 0, date, clrWhite, clrBackground, &Font);
|
||||||
}
|
}
|
||||||
osd->Flush();
|
osd->Flush();
|
||||||
}
|
}
|
||||||
@ -261,11 +263,7 @@ void cSkinCursesDisplayChannel::Flush(void)
|
|||||||
class cSkinCursesDisplayMenu : public cSkinDisplayMenu {
|
class cSkinCursesDisplayMenu : public cSkinDisplayMenu {
|
||||||
private:
|
private:
|
||||||
cOsd *osd;
|
cOsd *osd;
|
||||||
cString title;
|
void SetScrollbar(void);
|
||||||
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:
|
public:
|
||||||
cSkinCursesDisplayMenu(void);
|
cSkinCursesDisplayMenu(void);
|
||||||
virtual ~cSkinCursesDisplayMenu();
|
virtual ~cSkinCursesDisplayMenu();
|
||||||
@ -276,7 +274,6 @@ public:
|
|||||||
virtual void SetButtons(const char *Red, const char *Green = NULL, const char *Yellow = NULL, const char *Blue = NULL);
|
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 SetMessage(eMessageType Type, const char *Text);
|
||||||
virtual void SetItem(const char *Text, int Index, bool Current, bool Selectable);
|
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 SetEvent(const cEvent *Event);
|
||||||
virtual void SetRecording(const cRecording *Recording);
|
virtual void SetRecording(const cRecording *Recording);
|
||||||
virtual void SetText(const char *Text, bool FixedFont);
|
virtual void SetText(const char *Text, bool FixedFont);
|
||||||
@ -287,8 +284,7 @@ public:
|
|||||||
cSkinCursesDisplayMenu::cSkinCursesDisplayMenu(void)
|
cSkinCursesDisplayMenu::cSkinCursesDisplayMenu(void)
|
||||||
{
|
{
|
||||||
osd = new cCursesOsd(0, 0);
|
osd = new cCursesOsd(0, 0);
|
||||||
lastDiskUsageState = -1;
|
osd->DrawRectangle(0, 0, OsdWidth - 1, OsdHeight - 1, clrBackground);
|
||||||
osd->DrawRectangle(0, 0, ScOsdWidth - 1, ScOsdHeight - 1, clrBackground);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cSkinCursesDisplayMenu::~cSkinCursesDisplayMenu()
|
cSkinCursesDisplayMenu::~cSkinCursesDisplayMenu()
|
||||||
@ -296,66 +292,52 @@ cSkinCursesDisplayMenu::~cSkinCursesDisplayMenu()
|
|||||||
delete osd;
|
delete osd;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::DrawScrollbar(int Total, int Offset, int Shown, int Top, int Height, bool CanScrollUp, bool CanScrollDown)
|
void cSkinCursesDisplayMenu::SetScrollbar(void)
|
||||||
{
|
{
|
||||||
if (Total > 0 && Total > Shown) {
|
if (textScroller.CanScroll()) {
|
||||||
int yt = Top;
|
int yt = textScroller.Top();
|
||||||
int yb = yt + Height;
|
int yb = yt + textScroller.Height() - 1;
|
||||||
int st = yt;
|
int st = yt;
|
||||||
int sb = yb;
|
int sb = yb;
|
||||||
int th = max(int((sb - st) * double(Shown) / Total + 0.5), 1);
|
int tt = st + (sb - st) * textScroller.Offset() / textScroller.Total();
|
||||||
int tt = min(int(st + (sb - st) * double(Offset) / Total + 0.5), sb - th);
|
int tb = tt + (sb - st) * textScroller.Shown() / textScroller.Total();
|
||||||
int tb = min(tt + th, sb);
|
int xl = OsdWidth - 1;
|
||||||
int xl = ScOsdWidth - 1;
|
osd->DrawRectangle(xl, st, xl, sb, clrCyan);
|
||||||
osd->DrawRectangle(xl, st, xl, sb - 1, clrWhite);
|
osd->DrawRectangle(xl, tt, xl, tb, 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)
|
void cSkinCursesDisplayMenu::Scroll(bool Up, bool Page)
|
||||||
{
|
{
|
||||||
cSkinDisplayMenu::Scroll(Up, Page);
|
cSkinDisplayMenu::Scroll(Up, Page);
|
||||||
SetTextScrollbar();
|
SetScrollbar();
|
||||||
}
|
}
|
||||||
|
|
||||||
int cSkinCursesDisplayMenu::MaxItems(void)
|
int cSkinCursesDisplayMenu::MaxItems(void)
|
||||||
{
|
{
|
||||||
return ScOsdHeight - 4;
|
return OsdHeight - 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::Clear(void)
|
void cSkinCursesDisplayMenu::Clear(void)
|
||||||
{
|
{
|
||||||
osd->DrawRectangle(0, 1, ScOsdWidth - 1, ScOsdHeight - 2, clrBackground);
|
osd->DrawRectangle(0, 1, OsdWidth - 1, OsdHeight - 2, clrBackground);
|
||||||
textScroller.Reset();
|
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)
|
void cSkinCursesDisplayMenu::SetTitle(const char *Title)
|
||||||
{
|
{
|
||||||
title = Title;
|
osd->DrawText(0, 0, Title, clrBlack, clrCyan, &Font, OsdWidth);
|
||||||
DrawTitle();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::SetButtons(const char *Red, const char *Green, const char *Yellow, const char *Blue)
|
void cSkinCursesDisplayMenu::SetButtons(const char *Red, const char *Green, const char *Yellow, const char *Blue)
|
||||||
{
|
{
|
||||||
int w = ScOsdWidth;
|
int w = OsdWidth;
|
||||||
int t0 = 0;
|
int t0 = 0;
|
||||||
int t1 = 0 + w / 4;
|
int t1 = 0 + w / 4;
|
||||||
int t2 = 0 + w / 2;
|
int t2 = 0 + w / 2;
|
||||||
int t3 = w - w / 4;
|
int t3 = w - w / 4;
|
||||||
int t4 = w;
|
int t4 = w;
|
||||||
int y = ScOsdHeight - 1;
|
int y = OsdHeight - 1;
|
||||||
osd->DrawText(t0, y, Red, clrWhite, Red ? clrRed : clrBackground, &Font, t1 - t0, 0, taCenter);
|
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(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(t2, y, Yellow, clrBlack, Yellow ? clrYellow : clrBackground, &Font, t3 - t2, 0, taCenter);
|
||||||
@ -365,9 +347,9 @@ void cSkinCursesDisplayMenu::SetButtons(const char *Red, const char *Green, cons
|
|||||||
void cSkinCursesDisplayMenu::SetMessage(eMessageType Type, const char *Text)
|
void cSkinCursesDisplayMenu::SetMessage(eMessageType Type, const char *Text)
|
||||||
{
|
{
|
||||||
if (Text)
|
if (Text)
|
||||||
osd->DrawText(0, ScOsdHeight - 2, Text, clrMessage[2 * Type], clrMessage[2 * Type + 1], &Font, ScOsdWidth, 0, taCenter);
|
osd->DrawText(0, OsdHeight - 2, Text, clrMessage[2 * Type], clrMessage[2 * Type + 1], &Font, OsdWidth, 0, taCenter);
|
||||||
else
|
else
|
||||||
osd->DrawRectangle(0, ScOsdHeight - 2, ScOsdWidth - 1, ScOsdHeight - 2, clrBackground);
|
osd->DrawRectangle(0, OsdHeight - 2, OsdWidth - 1, OsdHeight - 2, clrBackground);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::SetItem(const char *Text, int Index, bool Current, bool Selectable)
|
void cSkinCursesDisplayMenu::SetItem(const char *Text, int Index, bool Current, bool Selectable)
|
||||||
@ -385,18 +367,13 @@ void cSkinCursesDisplayMenu::SetItem(const char *Text, int Index, bool Current,
|
|||||||
for (int i = 0; i < MaxTabs; i++) {
|
for (int i = 0; i < MaxTabs; i++) {
|
||||||
const char *s = GetTabbedText(Text, i);
|
const char *s = GetTabbedText(Text, i);
|
||||||
if (s) {
|
if (s) {
|
||||||
int xt = Tab(i) / AvgCharWidth();// Tab() is in "pixel" - see also skins.c!!!
|
int xt = Tab(i) / 12;// Tab() is in "pixel" - see also skins.c!!!
|
||||||
osd->DrawText(xt, y, s, ColorFg, ColorBg, &Font, ScOsdWidth - 2 - xt);
|
osd->DrawText(xt, y, s, ColorFg, ColorBg, &Font, OsdWidth - xt);
|
||||||
}
|
}
|
||||||
if (!Tab(i + 1))
|
if (!Tab(i + 1))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
SetEditableWidth(ScOsdWidth - 2 - Tab(1) / AvgCharWidth()); // Tab() is in "pixel" - see also skins.c!!!
|
SetEditableWidth(OsdWidth - Tab(1) / 12); // 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)
|
void cSkinCursesDisplayMenu::SetEvent(const cEvent *Event)
|
||||||
@ -405,35 +382,27 @@ void cSkinCursesDisplayMenu::SetEvent(const cEvent *Event)
|
|||||||
return;
|
return;
|
||||||
int y = 2;
|
int y = 2;
|
||||||
cTextScroller ts;
|
cTextScroller ts;
|
||||||
cString t = cString::sprintf("%s %s - %s", *Event->GetDateString(), *Event->GetTimeString(), *Event->GetEndTimeString());
|
char t[32];
|
||||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
|
snprintf(t, sizeof(t), "%s %s - %s", *Event->GetDateString(), *Event->GetTimeString(), *Event->GetEndTimeString());
|
||||||
|
ts.Set(osd, 0, y, OsdWidth, OsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
|
||||||
if (Event->Vps() && Event->Vps() != Event->StartTime()) {
|
if (Event->Vps() && Event->Vps() != Event->StartTime()) {
|
||||||
cString buffer = cString::sprintf(" VPS: %s", *Event->GetVpsString());
|
char *buffer;
|
||||||
osd->DrawText(ScOsdWidth - Utf8StrLen(buffer), y, buffer, clrBlack, clrYellow, &Font);
|
asprintf(&buffer, " VPS: %s", *Event->GetVpsString());
|
||||||
|
osd->DrawText(OsdWidth - strlen(buffer), y, buffer, clrBlack, clrYellow, &Font);
|
||||||
|
free(buffer);
|
||||||
}
|
}
|
||||||
y += ts.Height();
|
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;
|
y += 1;
|
||||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Event->Title(), &Font, clrCyan, clrBackground);
|
ts.Set(osd, 0, y, OsdWidth, OsdHeight - y - 2, Event->Title(), &Font, clrCyan, clrBackground);
|
||||||
y += ts.Height();
|
y += ts.Height();
|
||||||
if (!isempty(Event->ShortText())) {
|
if (!isempty(Event->ShortText())) {
|
||||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Event->ShortText(), &Font, clrYellow, clrBackground);
|
ts.Set(osd, 0, y, OsdWidth, OsdHeight - y - 2, Event->ShortText(), &Font, clrYellow, clrBackground);
|
||||||
y += ts.Height();
|
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;
|
y += 1;
|
||||||
if (!isempty(Event->Description())) {
|
if (!isempty(Event->Description())) {
|
||||||
textScroller.Set(osd, 0, y, ScOsdWidth - 2, ScOsdHeight - y - 2, Event->Description(), &Font, clrCyan, clrBackground);
|
textScroller.Set(osd, 0, y, OsdWidth - 2, OsdHeight - y - 2, Event->Description(), &Font, clrCyan, clrBackground);
|
||||||
SetTextScrollbar();
|
SetScrollbar();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -444,58 +413,37 @@ void cSkinCursesDisplayMenu::SetRecording(const cRecording *Recording)
|
|||||||
const cRecordingInfo *Info = Recording->Info();
|
const cRecordingInfo *Info = Recording->Info();
|
||||||
int y = 2;
|
int y = 2;
|
||||||
cTextScroller ts;
|
cTextScroller ts;
|
||||||
cString t = cString::sprintf("%s %s %s", *DateString(Recording->Start()), *TimeString(Recording->Start()), Info->ChannelName() ? Info->ChannelName() : "");
|
char t[32];
|
||||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
|
snprintf(t, sizeof(t), "%s %s", *DateString(Recording->start), *TimeString(Recording->start));
|
||||||
|
ts.Set(osd, 0, y, OsdWidth, OsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
|
||||||
y += ts.Height();
|
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;
|
y += 1;
|
||||||
const char *Title = Info->Title();
|
const char *Title = Info->Title();
|
||||||
if (isempty(Title))
|
if (isempty(Title))
|
||||||
Title = Recording->Name();
|
Title = Recording->Name();
|
||||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Title, &Font, clrCyan, clrBackground);
|
ts.Set(osd, 0, y, OsdWidth, OsdHeight - y - 2, Title, &Font, clrCyan, clrBackground);
|
||||||
y += ts.Height();
|
y += ts.Height();
|
||||||
if (!isempty(Info->ShortText())) {
|
if (!isempty(Info->ShortText())) {
|
||||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Info->ShortText(), &Font, clrYellow, clrBackground);
|
ts.Set(osd, 0, y, OsdWidth, OsdHeight - y - 2, Info->ShortText(), &Font, clrYellow, clrBackground);
|
||||||
y += ts.Height();
|
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;
|
y += 1;
|
||||||
if (!isempty(Info->Description())) {
|
if (!isempty(Info->Description())) {
|
||||||
textScroller.Set(osd, 0, y, ScOsdWidth - 2, ScOsdHeight - y - 2, Info->Description(), &Font, clrCyan, clrBackground);
|
textScroller.Set(osd, 0, y, OsdWidth - 2, OsdHeight - y - 2, Info->Description(), &Font, clrCyan, clrBackground);
|
||||||
SetTextScrollbar();
|
SetScrollbar();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::SetText(const char *Text, bool FixedFont)
|
void cSkinCursesDisplayMenu::SetText(const char *Text, bool FixedFont)
|
||||||
{
|
{
|
||||||
textScroller.Set(osd, 0, 2, ScOsdWidth - 2, ScOsdHeight - 4, Text, &Font, clrWhite, clrBackground);
|
textScroller.Set(osd, 0, 2, OsdWidth - 2, OsdHeight - 4, Text, &Font, clrWhite, clrBackground);
|
||||||
SetTextScrollbar();
|
SetScrollbar();
|
||||||
}
|
}
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::Flush(void)
|
void cSkinCursesDisplayMenu::Flush(void)
|
||||||
{
|
{
|
||||||
if (cVideoDiskUsage::HasChanged(lastDiskUsageState))
|
|
||||||
DrawTitle();
|
|
||||||
cString date = DayDateTime();
|
cString date = DayDateTime();
|
||||||
osd->DrawText(ScOsdWidth - Utf8StrLen(date) - 2, 0, date, clrBlack, clrCyan, &Font);
|
osd->DrawText(OsdWidth - strlen(date) - 2, 0, date, clrBlack, clrCyan, &Font);
|
||||||
osd->Flush();
|
osd->Flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -521,8 +469,8 @@ public:
|
|||||||
cSkinCursesDisplayReplay::cSkinCursesDisplayReplay(bool ModeOnly)
|
cSkinCursesDisplayReplay::cSkinCursesDisplayReplay(bool ModeOnly)
|
||||||
{
|
{
|
||||||
message = false;
|
message = false;
|
||||||
osd = new cCursesOsd(0, ScOsdHeight - 3);
|
osd = new cCursesOsd(0, OsdHeight - 3);
|
||||||
osd->DrawRectangle(0, 0, ScOsdWidth - 1, 2, ModeOnly ? clrTransparent : clrBackground);
|
osd->DrawRectangle(0, 0, OsdWidth - 1, 2, ModeOnly ? clrTransparent : clrBackground);
|
||||||
}
|
}
|
||||||
|
|
||||||
cSkinCursesDisplayReplay::~cSkinCursesDisplayReplay()
|
cSkinCursesDisplayReplay::~cSkinCursesDisplayReplay()
|
||||||
@ -532,7 +480,7 @@ cSkinCursesDisplayReplay::~cSkinCursesDisplayReplay()
|
|||||||
|
|
||||||
void cSkinCursesDisplayReplay::SetTitle(const char *Title)
|
void cSkinCursesDisplayReplay::SetTitle(const char *Title)
|
||||||
{
|
{
|
||||||
osd->DrawText(0, 0, Title, clrWhite, clrBackground, &Font, ScOsdWidth);
|
osd->DrawText(0, 0, Title, clrWhite, clrBackground, &Font, OsdWidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cSkinCursesDisplayReplay::SetMode(bool Play, bool Forward, int Speed)
|
void cSkinCursesDisplayReplay::SetMode(bool Play, bool Forward, int Speed)
|
||||||
@ -553,31 +501,31 @@ void cSkinCursesDisplayReplay::SetMode(bool Play, bool Forward, int Speed)
|
|||||||
|
|
||||||
void cSkinCursesDisplayReplay::SetProgress(int Current, int Total)
|
void cSkinCursesDisplayReplay::SetProgress(int Current, int Total)
|
||||||
{
|
{
|
||||||
int p = Total > 0 ? ScOsdWidth * Current / Total : 0;
|
int p = Total > 0 ? OsdWidth * Current / Total : 0;
|
||||||
osd->DrawRectangle(0, 1, p, 1, clrGreen);
|
osd->DrawRectangle(0, 1, p, 1, clrGreen);
|
||||||
osd->DrawRectangle(p, 1, ScOsdWidth, 1, clrWhite);
|
osd->DrawRectangle(p, 1, OsdWidth, 1, clrWhite);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cSkinCursesDisplayReplay::SetCurrent(const char *Current)
|
void cSkinCursesDisplayReplay::SetCurrent(const char *Current)
|
||||||
{
|
{
|
||||||
osd->DrawText(0, 2, Current, clrWhite, clrBackground, &Font, Utf8StrLen(Current) + 3);
|
osd->DrawText(0, 2, Current, clrWhite, clrBackground, &Font, strlen(Current) + 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cSkinCursesDisplayReplay::SetTotal(const char *Total)
|
void cSkinCursesDisplayReplay::SetTotal(const char *Total)
|
||||||
{
|
{
|
||||||
osd->DrawText(ScOsdWidth - Utf8StrLen(Total), 2, Total, clrWhite, clrBackground, &Font);
|
osd->DrawText(OsdWidth - strlen(Total), 2, Total, clrWhite, clrBackground, &Font);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cSkinCursesDisplayReplay::SetJump(const char *Jump)
|
void cSkinCursesDisplayReplay::SetJump(const char *Jump)
|
||||||
{
|
{
|
||||||
osd->DrawText(ScOsdWidth / 4, 2, Jump, clrWhite, clrBackground, &Font, ScOsdWidth / 2, 0, taCenter);
|
osd->DrawText(OsdWidth / 4, 2, Jump, clrWhite, clrBackground, &Font, OsdWidth / 2, 0, taCenter);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cSkinCursesDisplayReplay::SetMessage(eMessageType Type, const char *Text)
|
void cSkinCursesDisplayReplay::SetMessage(eMessageType Type, const char *Text)
|
||||||
{
|
{
|
||||||
if (Text) {
|
if (Text) {
|
||||||
osd->SaveRegion(0, 2, ScOsdWidth - 1, 2);
|
osd->SaveRegion(0, 2, OsdWidth - 1, 2);
|
||||||
osd->DrawText(0, 2, Text, clrMessage[2 * Type], clrMessage[2 * Type + 1], &Font, ScOsdWidth, 0, taCenter);
|
osd->DrawText(0, 2, Text, clrMessage[2 * Type], clrMessage[2 * Type + 1], &Font, OsdWidth, 0, taCenter);
|
||||||
message = true;
|
message = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -605,7 +553,7 @@ public:
|
|||||||
|
|
||||||
cSkinCursesDisplayVolume::cSkinCursesDisplayVolume(void)
|
cSkinCursesDisplayVolume::cSkinCursesDisplayVolume(void)
|
||||||
{
|
{
|
||||||
osd = new cCursesOsd(0, ScOsdHeight - 1);
|
osd = new cCursesOsd(0, OsdHeight - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
cSkinCursesDisplayVolume::~cSkinCursesDisplayVolume()
|
cSkinCursesDisplayVolume::~cSkinCursesDisplayVolume()
|
||||||
@ -616,17 +564,16 @@ cSkinCursesDisplayVolume::~cSkinCursesDisplayVolume()
|
|||||||
void cSkinCursesDisplayVolume::SetVolume(int Current, int Total, bool Mute)
|
void cSkinCursesDisplayVolume::SetVolume(int Current, int Total, bool Mute)
|
||||||
{
|
{
|
||||||
if (Mute) {
|
if (Mute) {
|
||||||
osd->DrawRectangle(0, 0, ScOsdWidth - 1, 0, clrTransparent);
|
osd->DrawRectangle(0, 0, OsdWidth - 1, 0, clrTransparent);
|
||||||
osd->DrawText(0, 0, tr("Key$Mute"), clrGreen, clrBackground, &Font);
|
osd->DrawText(0, 0, tr("Key$Mute"), clrGreen, clrBackground, &Font);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// TRANSLATORS: note the trailing blank!
|
|
||||||
const char *Prompt = tr("Volume ");
|
const char *Prompt = tr("Volume ");
|
||||||
int l = Utf8StrLen(Prompt);
|
int l = strlen(Prompt);
|
||||||
int p = (ScOsdWidth - l) * Current / Total;
|
int p = (OsdWidth - l) * Current / Total;
|
||||||
osd->DrawText(0, 0, Prompt, clrGreen, clrBackground, &Font);
|
osd->DrawText(0, 0, Prompt, clrGreen, clrBackground, &Font);
|
||||||
osd->DrawRectangle(l, 0, l + p - 1, 0, clrGreen);
|
osd->DrawRectangle(l, 0, l + p - 1, 0, clrGreen);
|
||||||
osd->DrawRectangle(l + p, 0, ScOsdWidth - 1, 0, clrWhite);
|
osd->DrawRectangle(l + p, 0, OsdWidth - 1, 0, clrWhite);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -657,9 +604,9 @@ cSkinCursesDisplayTracks::cSkinCursesDisplayTracks(const char *Title, int NumTra
|
|||||||
itemsWidth = Font.Width(Title);
|
itemsWidth = Font.Width(Title);
|
||||||
for (int i = 0; i < NumTracks; i++)
|
for (int i = 0; i < NumTracks; i++)
|
||||||
itemsWidth = max(itemsWidth, Font.Width(Tracks[i]));
|
itemsWidth = max(itemsWidth, Font.Width(Tracks[i]));
|
||||||
itemsWidth = min(itemsWidth, ScOsdWidth);
|
itemsWidth = min(itemsWidth, OsdWidth);
|
||||||
osd = new cCursesOsd(0, 0);
|
osd = new cCursesOsd(0, 0);
|
||||||
osd->DrawRectangle(0, 0, ScOsdWidth - 1, ScOsdHeight - 1, clrBackground);
|
osd->DrawRectangle(0, 0, OsdWidth - 1, OsdHeight - 1, clrBackground);
|
||||||
osd->DrawText(0, 0, Title, clrBlack, clrCyan, &Font, itemsWidth);
|
osd->DrawText(0, 0, Title, clrBlack, clrCyan, &Font, itemsWidth);
|
||||||
for (int i = 0; i < NumTracks; i++)
|
for (int i = 0; i < NumTracks; i++)
|
||||||
SetItem(Tracks[i], i, false);
|
SetItem(Tracks[i], i, false);
|
||||||
@ -712,7 +659,7 @@ public:
|
|||||||
|
|
||||||
cSkinCursesDisplayMessage::cSkinCursesDisplayMessage(void)
|
cSkinCursesDisplayMessage::cSkinCursesDisplayMessage(void)
|
||||||
{
|
{
|
||||||
osd = new cCursesOsd(0, ScOsdHeight - 1);
|
osd = new cCursesOsd(0, OsdHeight - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
cSkinCursesDisplayMessage::~cSkinCursesDisplayMessage()
|
cSkinCursesDisplayMessage::~cSkinCursesDisplayMessage()
|
||||||
@ -722,7 +669,7 @@ cSkinCursesDisplayMessage::~cSkinCursesDisplayMessage()
|
|||||||
|
|
||||||
void cSkinCursesDisplayMessage::SetMessage(eMessageType Type, const char *Text)
|
void cSkinCursesDisplayMessage::SetMessage(eMessageType Type, const char *Text)
|
||||||
{
|
{
|
||||||
osd->DrawText(0, 0, Text, clrMessage[2 * Type], clrMessage[2 * Type + 1], &Font, ScOsdWidth, 0, taCenter);
|
osd->DrawText(0, 0, Text, clrMessage[2 * Type], clrMessage[2 * Type + 1], &Font, OsdWidth, 0, taCenter);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cSkinCursesDisplayMessage::Flush(void)
|
void cSkinCursesDisplayMessage::Flush(void)
|
||||||
@ -793,13 +740,13 @@ public:
|
|||||||
cPluginSkinCurses(void);
|
cPluginSkinCurses(void);
|
||||||
virtual ~cPluginSkinCurses();
|
virtual ~cPluginSkinCurses();
|
||||||
virtual const char *Version(void) { return VERSION; }
|
virtual const char *Version(void) { return VERSION; }
|
||||||
virtual const char *Description(void) { return tr(DESCRIPTION); }
|
virtual const char *Description(void) { return DESCRIPTION; }
|
||||||
virtual const char *CommandLineHelp(void);
|
virtual const char *CommandLineHelp(void);
|
||||||
virtual bool ProcessArgs(int argc, char *argv[]);
|
virtual bool ProcessArgs(int argc, char *argv[]);
|
||||||
virtual bool Initialize(void);
|
virtual bool Initialize(void);
|
||||||
virtual bool Start(void);
|
virtual bool Start(void);
|
||||||
virtual void Housekeeping(void);
|
virtual void Housekeeping(void);
|
||||||
virtual const char *MainMenuEntry(void) { return tr(MAINMENUENTRY); }
|
virtual const char *MainMenuEntry(void) { return MAINMENUENTRY; }
|
||||||
virtual cOsdObject *MainMenuAction(void);
|
virtual cOsdObject *MainMenuAction(void);
|
||||||
virtual cMenuSetupPage *SetupMenu(void);
|
virtual cMenuSetupPage *SetupMenu(void);
|
||||||
virtual bool SetupParse(const char *Name, const char *Value);
|
virtual bool SetupParse(const char *Name, const char *Value);
|
||||||
@ -833,9 +780,8 @@ bool cPluginSkinCurses::ProcessArgs(int argc, char *argv[])
|
|||||||
bool cPluginSkinCurses::Initialize(void)
|
bool cPluginSkinCurses::Initialize(void)
|
||||||
{
|
{
|
||||||
// Initialize any background activities the plugin shall perform.
|
// Initialize any background activities the plugin shall perform.
|
||||||
if (initscr())
|
initscr();
|
||||||
return true;
|
return true;
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cPluginSkinCurses::Start(void)
|
bool cPluginSkinCurses::Start(void)
|
||||||
|
47
PLUGINS/src/sky/HISTORY
Normal file
47
PLUGINS/src/sky/HISTORY
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
VDR Plugin 'sky' Revision History
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
2002-12-01: Version 0.0.1
|
||||||
|
|
||||||
|
- Initial revision.
|
||||||
|
|
||||||
|
2002-12-13: Version 0.1.0
|
||||||
|
|
||||||
|
- Changed setting of CXX and CXXFLAGS variables in Makefile.
|
||||||
|
|
||||||
|
2003-05-09: Version 0.1.1
|
||||||
|
|
||||||
|
- Changed Start() to Initialize().
|
||||||
|
|
||||||
|
2004-01-04: Version 0.2.0
|
||||||
|
|
||||||
|
- Implemented automatic PID switching and channel detection
|
||||||
|
|
||||||
|
2004-02-15: Version 0.3.0
|
||||||
|
|
||||||
|
- Now using the actual channel IDs a derived from the data stream.
|
||||||
|
- Switched EPG data retrieval to http://www.bleb.org.
|
||||||
|
- Added automatic DST detection to getskyepg.pl.
|
||||||
|
- Fixed handling receivers, so that a recording on the same channel
|
||||||
|
won't interrupt an ongoing Transfer mode.
|
||||||
|
|
||||||
|
2004-10-16: Version 0.3.1
|
||||||
|
|
||||||
|
- Improved buffer handling.
|
||||||
|
|
||||||
|
2004-12-12: Version 0.3.2
|
||||||
|
|
||||||
|
- Changed Apid access in cChannel.
|
||||||
|
|
||||||
|
2004-12-19: Version 0.3.3
|
||||||
|
|
||||||
|
- Made several functions threadsafe.
|
||||||
|
- Removed delay_ms(), using cCondWait::SleepMs() instead.
|
||||||
|
|
||||||
|
2005-09-17: Version 0.3.4
|
||||||
|
|
||||||
|
- Added a missing include statement.
|
||||||
|
|
||||||
|
2006-03-26: Version 0.3.5
|
||||||
|
|
||||||
|
- Fixed format string handling.
|
81
PLUGINS/src/sky/Makefile
Normal file
81
PLUGINS/src/sky/Makefile
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
#
|
||||||
|
# Makefile for a Video Disk Recorder plugin
|
||||||
|
#
|
||||||
|
# $Id: Makefile 1.8 2006/04/24 17:21:03 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 = sky
|
||||||
|
|
||||||
|
### 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 C++ compiler and options:
|
||||||
|
|
||||||
|
CXX ?= g++
|
||||||
|
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual
|
||||||
|
|
||||||
|
### The directory environment:
|
||||||
|
|
||||||
|
VDRDIR = ../../..
|
||||||
|
LIBDIR = ../../lib
|
||||||
|
TMPDIR = /tmp
|
||||||
|
|
||||||
|
### Allow user defined options to overwrite defaults:
|
||||||
|
|
||||||
|
-include $(VDRDIR)/Make.config
|
||||||
|
|
||||||
|
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||||
|
|
||||||
|
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||||
|
|
||||||
|
### The name of the distribution archive:
|
||||||
|
|
||||||
|
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||||
|
PACKAGE = vdr-$(ARCHIVE)
|
||||||
|
|
||||||
|
### Includes and Defines (add further entries here):
|
||||||
|
|
||||||
|
INCLUDES += -I$(VDRDIR)/include
|
||||||
|
|
||||||
|
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||||
|
|
||||||
|
### The object files (add further files here):
|
||||||
|
|
||||||
|
OBJS = $(PLUGIN).o
|
||||||
|
|
||||||
|
### Implicit rules:
|
||||||
|
|
||||||
|
%.o: %.c
|
||||||
|
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||||
|
|
||||||
|
# Dependencies:
|
||||||
|
|
||||||
|
MAKEDEP = g++ -MM -MG
|
||||||
|
DEPFILE = .dependencies
|
||||||
|
$(DEPFILE): Makefile
|
||||||
|
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
|
-include $(DEPFILE)
|
||||||
|
|
||||||
|
### Targets:
|
||||||
|
|
||||||
|
all: libvdr-$(PLUGIN).so
|
||||||
|
|
||||||
|
libvdr-$(PLUGIN).so: $(OBJS)
|
||||||
|
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||||
|
@cp $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||||
|
|
||||||
|
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* *~
|
45
PLUGINS/src/sky/README
Normal file
45
PLUGINS/src/sky/README
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||||
|
|
||||||
|
Written by: Klaus Schmidinger <kls@cadsoft.de>
|
||||||
|
|
||||||
|
Project's homepage: www.cadsoft.de/vdr
|
||||||
|
|
||||||
|
Latest version available at: www.cadsoft.de/vdr
|
||||||
|
|
||||||
|
See the file COPYING for license information.
|
||||||
|
|
||||||
|
Description:
|
||||||
|
|
||||||
|
The 'sky' plugin implements a new device for VDR, which is based on the
|
||||||
|
MPEG2 encoder card described at linuxtv.org/mpeg2/kfir.xml. It
|
||||||
|
allows you to connect the analog a/v output of your Sky Digibox to VDR,
|
||||||
|
so that you can enjoy the full recording flexibility of VDR with your
|
||||||
|
Sky subscription. Note that this is NOT something that does anything
|
||||||
|
illegal, like decrypting the Sky programme without a subscription. You
|
||||||
|
will need a Sky Digibox and a valid subscription in order to use this
|
||||||
|
plugin.
|
||||||
|
|
||||||
|
The 'kfir' module must be loaded with the option 'streamtype=4' to make it
|
||||||
|
produce a Transport Stream.
|
||||||
|
|
||||||
|
The Digibox is remotely controlled through VDR via LIRC (see lirc.org).
|
||||||
|
The file lircd.conf.sky contains the remote control codes necessary to
|
||||||
|
control the Digibox.
|
||||||
|
|
||||||
|
In order to access the Sky channels VDR needs to know the channel number
|
||||||
|
under which each channel is stored in the Sky Digibox. These numbers are
|
||||||
|
stored in the file 'channels.conf.sky', together with the channel IDs as
|
||||||
|
derived from the actual channel data and the names under which the EPG
|
||||||
|
data for each channel can be found (see below). Copy this file to your
|
||||||
|
plugins config directory, in a subdirectory named 'sky', as in
|
||||||
|
|
||||||
|
/video/plugins/sky/channels.conf.sky
|
||||||
|
|
||||||
|
The Sky EPG is available on the Internet at http://www.bleb.org.
|
||||||
|
The Perl script getskyepg.pl extracts the EPG data from these pages
|
||||||
|
and sends it to VDR via an SVDRP connection. The channel names as
|
||||||
|
used on the bleb.org pages are defined in the channels.conf.sky file.
|
||||||
|
You can keep your EPG data up-to-date by entering a call to getskyepg.pl
|
||||||
|
into your /etc/crontab. Call 'getskyepg.pl -h' for a list of options.
|
||||||
|
The getskyepg.pl script requires the programs /usr/bin/wget and /usr/bin/logger
|
||||||
|
to be installed on your system.
|
34
PLUGINS/src/sky/channels.conf.sky
Normal file
34
PLUGINS/src/sky/channels.conf.sky
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# Sky channel definitions
|
||||||
|
#
|
||||||
|
# Syntax:
|
||||||
|
#
|
||||||
|
# ChannelID:ChannelNumber:EPGname
|
||||||
|
#
|
||||||
|
# where
|
||||||
|
#
|
||||||
|
# ChannelID is the channel ID as derived from the actual channel
|
||||||
|
# data as broadcast in the data stream (see man vdr(5)).
|
||||||
|
#
|
||||||
|
# ChannelNumber is the number of this channel as you have to
|
||||||
|
# enter it on the DigiBox remote control.
|
||||||
|
#
|
||||||
|
# EPGname is the name of the page at www.bleb.org that has EPG
|
||||||
|
# data for this channel (without the '.xml'). If no such
|
||||||
|
# page exists, 'x' is entered.
|
||||||
|
#
|
||||||
|
S28.2E-2-2027-4705:106:sky_one
|
||||||
|
S28.2E-2-2027-5104:107:sky_two
|
||||||
|
S28.2E-2-2044-10070:118:itv2
|
||||||
|
S28.2E-2-2023-4905:130:scifi
|
||||||
|
S28.2E-2-2025-5904:127:paramount
|
||||||
|
S28.2E-2-2009-6201:551:discovery
|
||||||
|
S28.2E-2-2030-4809:310:sky_cinema
|
||||||
|
S28.2E-2-2007-4303:301:sky_movies1
|
||||||
|
S28.2E-2-2007-4302:302:sky_movies2
|
||||||
|
S28.2E-2-2007-4403:303:sky_movies3
|
||||||
|
S28.2E-2-2011-4402:304:sky_movies4
|
||||||
|
S28.2E-2-2011-4503:305:sky_movies5
|
||||||
|
S28.2E-2-2011-4502:306:sky_movies6
|
||||||
|
S28.2E-2-2030-4603:307:sky_movies7
|
||||||
|
S28.2E-2-2007-5502:308:sky_movies8
|
||||||
|
S28.2E-2-2030-4602:309:sky_movies9
|
240
PLUGINS/src/sky/getskyepg.pl
Executable file
240
PLUGINS/src/sky/getskyepg.pl
Executable file
@ -0,0 +1,240 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
# getskyepg.pl: Get EPG data for Sky channels from the Internet
|
||||||
|
#
|
||||||
|
# Connects to a running VDR instance via SVDRP, gets the channel data
|
||||||
|
# for the Sky channels and connects to Internet web pages to extract the
|
||||||
|
# EPG data for these channels. The result is sent to VDR via SVDRP.
|
||||||
|
#
|
||||||
|
# See the README file for copyright information and how to reach the author.
|
||||||
|
#
|
||||||
|
# $Id: getskyepg.pl 1.4 2006/01/08 10:21:32 kls Exp $
|
||||||
|
|
||||||
|
use Getopt::Std;
|
||||||
|
use Time::Local;
|
||||||
|
|
||||||
|
$Usage = qq{
|
||||||
|
Usage: $0 [options]
|
||||||
|
|
||||||
|
Options: -c filename channel config file name (default: channels.conf.sky)
|
||||||
|
-d hostname destination hostname (default: localhost)
|
||||||
|
-p port SVDRP port number (default: 2001)
|
||||||
|
-S source channel source (default: S28.2E)
|
||||||
|
-D days days to get EPG for (1..7, default: 2)
|
||||||
|
};
|
||||||
|
|
||||||
|
die $Usage if (!getopts("c:d:D:hp:S:") || $opt_h);
|
||||||
|
|
||||||
|
$Conf = $opt_c || "channels.conf.sky";
|
||||||
|
$Dest = $opt_d || "localhost";
|
||||||
|
$Port = $opt_p || 2001;
|
||||||
|
$Source = $opt_S || "S28.2E";
|
||||||
|
$Days = $opt_D || 2;
|
||||||
|
|
||||||
|
$SkyWebPage = "www.bleb.org/tv/data/listings";
|
||||||
|
$WGET = "/usr/bin/wget -q -O-";
|
||||||
|
$LOGGER = "/usr/bin/logger -t SKYEPG";
|
||||||
|
|
||||||
|
$DST = -3600; # Daylight Saving Time offset
|
||||||
|
$SecsInDay = 86400;
|
||||||
|
|
||||||
|
@Channels = ();
|
||||||
|
|
||||||
|
$idxSource = 0;
|
||||||
|
$idxNumber = 1;
|
||||||
|
$idxName = 2;
|
||||||
|
|
||||||
|
Error("days out of range: $Days") unless (1 <= $Days && $Days <= 7);
|
||||||
|
|
||||||
|
sub Log
|
||||||
|
{
|
||||||
|
system("$LOGGER '@_'");
|
||||||
|
}
|
||||||
|
|
||||||
|
sub Error
|
||||||
|
{
|
||||||
|
Log(@_);
|
||||||
|
die "$0: @_\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub GetChannels
|
||||||
|
{
|
||||||
|
open(CHANNELS, $Conf) || Error("$Conf: $!");
|
||||||
|
while (<CHANNELS>) {
|
||||||
|
chomp;
|
||||||
|
next if (/^#/);
|
||||||
|
my @a = split(":");
|
||||||
|
push(@Channels, [@a]) unless ($a[$idxName] eq "x");
|
||||||
|
}
|
||||||
|
close(CHANNELS);
|
||||||
|
}
|
||||||
|
|
||||||
|
GetChannels();
|
||||||
|
|
||||||
|
sub GetPage
|
||||||
|
{
|
||||||
|
my $channel = shift;
|
||||||
|
my $day = shift;
|
||||||
|
$day--;
|
||||||
|
my $url = "$SkyWebPage/$day/$channel.xml";
|
||||||
|
Log("reading $url");
|
||||||
|
my @page = split("\n", `$WGET '$url'`);
|
||||||
|
Log("received " . ($#page + 1) . " lines");
|
||||||
|
return @page;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub StripWhitespace
|
||||||
|
{
|
||||||
|
my $s = shift;
|
||||||
|
$s =~ s/\s*(.*)\s*/$1/;
|
||||||
|
$s =~ s/\s+/ /g;
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub Extract
|
||||||
|
{
|
||||||
|
my $s = shift;
|
||||||
|
my $t = shift;
|
||||||
|
$s =~ /<$t>([^<]*)<\/$t>/;
|
||||||
|
return StripWhitespace($1);
|
||||||
|
}
|
||||||
|
|
||||||
|
# In order to get the duration we need to buffer the last event:
|
||||||
|
$Id = "";
|
||||||
|
$Time = 0;
|
||||||
|
$Title = "";
|
||||||
|
$Subtitle = "";
|
||||||
|
$Desc = "";
|
||||||
|
|
||||||
|
sub GetEpgData
|
||||||
|
{
|
||||||
|
my ($channel, $channelID) = @_;
|
||||||
|
my $numEvents = 0;
|
||||||
|
SVDRPsend("C $channelID");
|
||||||
|
$Time = 0;
|
||||||
|
for $day (1 .. $Days) {
|
||||||
|
my $dt = 0;
|
||||||
|
my @page = GetPage($channel, $day);
|
||||||
|
my $data = "";
|
||||||
|
for $line (@page) {
|
||||||
|
chomp($line);
|
||||||
|
if ($line =~ /<programme>/) {
|
||||||
|
$data = "";
|
||||||
|
}
|
||||||
|
elsif ($line =~ /<\/programme>/) {
|
||||||
|
my $title = Extract($data, "title");
|
||||||
|
my $subtitle = Extract($data, "subtitle");
|
||||||
|
my $desc = Extract($data, "desc");
|
||||||
|
my $start = Extract($data, "start");
|
||||||
|
# 'end' is useless, because it is sometimes missing :-(
|
||||||
|
# my $end = Extract($data, "end");
|
||||||
|
if (!$subtitle) {
|
||||||
|
# They sometimes write all info into the description, as in
|
||||||
|
# Episode: some description.
|
||||||
|
# Why don't they just fill in the data correctly?
|
||||||
|
my ($s, $d) = ($desc =~ /([^:]*)[:](.*)/);
|
||||||
|
if ($s && $d) {
|
||||||
|
$subtitle = $s;
|
||||||
|
$desc = $d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# 'start' and 'end' as time of day isn't of much use here, since
|
||||||
|
# the page for one day contains data that actually belongs to the
|
||||||
|
# next day (after midnight). Oh well, lets reconstruct the missing
|
||||||
|
# information:
|
||||||
|
$start = "0" . $start if (length($start) < 4);
|
||||||
|
my ($h, $m) = ($start =~ /(..)(..)/);
|
||||||
|
$dt = $SecsInDay if ($h > 12);
|
||||||
|
# convert to time_t:
|
||||||
|
my @gmt = gmtime;
|
||||||
|
$gmt[0] = 0; # seconds
|
||||||
|
$gmt[1] = $m; # minutes
|
||||||
|
$gmt[2] = $h; # hours
|
||||||
|
$time = timegm(@gmt) + ($day - 1) * $SecsInDay + ($h < 12 ? $dt : 0);
|
||||||
|
# compensate for DST:
|
||||||
|
$time += $DST if (localtime($time))[8];
|
||||||
|
# create EPG data:
|
||||||
|
if ($Time) {
|
||||||
|
$duration = $time - $Time;
|
||||||
|
SVDRPsend("E $Id $Time $duration");
|
||||||
|
SVDRPsend("T $Title");
|
||||||
|
SVDRPsend("S $Subtitle");
|
||||||
|
SVDRPsend("D $Desc");
|
||||||
|
SVDRPsend("e");
|
||||||
|
$numEvents++;
|
||||||
|
}
|
||||||
|
# buffer the last event:
|
||||||
|
$Id = $time / 60 % 0xFFFF; # this gives us unique ids for every minute of over 6 weeks
|
||||||
|
$Time = $time;
|
||||||
|
$Title = $title;
|
||||||
|
$Subtitle = $subtitle;
|
||||||
|
$Desc = $desc;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$data .= $line;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SVDRPsend("c");
|
||||||
|
Log("generated $numEvents EPG events");
|
||||||
|
}
|
||||||
|
|
||||||
|
sub ProcessEpg
|
||||||
|
{
|
||||||
|
for (@Channels) {
|
||||||
|
my $channel = @$_[$idxName];
|
||||||
|
my $channelID = @$_[$idxSource];
|
||||||
|
Log("processing channel $channel - $channelID");
|
||||||
|
SVDRPsend("PUTE");
|
||||||
|
SVDRPreceive(354);
|
||||||
|
GetEpgData($channel, $channelID);
|
||||||
|
SVDRPsend(".");
|
||||||
|
SVDRPreceive(250);
|
||||||
|
}
|
||||||
|
Log("done");
|
||||||
|
}
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# TODO: make this a Perl module??? What about Error()???
|
||||||
|
|
||||||
|
use Socket;
|
||||||
|
|
||||||
|
$Timeout = 300; # max. seconds to wait for response
|
||||||
|
|
||||||
|
$SIG{ALRM} = sub { Error("timeout"); };
|
||||||
|
alarm($Timeout);
|
||||||
|
|
||||||
|
$iaddr = inet_aton($Dest) || Error("no host: $Dest");
|
||||||
|
$paddr = sockaddr_in($Port, $iaddr);
|
||||||
|
|
||||||
|
$proto = getprotobyname('tcp');
|
||||||
|
socket(SOCK, PF_INET, SOCK_STREAM, $proto) || Error("socket: $!");
|
||||||
|
connect(SOCK, $paddr) || Error("connect: $!");
|
||||||
|
select(SOCK); $| = 1;
|
||||||
|
SVDRPreceive(220);
|
||||||
|
ProcessEpg();
|
||||||
|
SVDRPsend("QUIT");
|
||||||
|
|
||||||
|
sub SVDRPsend
|
||||||
|
{
|
||||||
|
my $s = shift;
|
||||||
|
print SOCK "$s\r\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub SVDRPreceive
|
||||||
|
{
|
||||||
|
my $expect = shift | 0;
|
||||||
|
my @a = ();
|
||||||
|
while (<SOCK>) {
|
||||||
|
s/\s*$//; # 'chomp' wouldn't work with "\r\n"
|
||||||
|
push(@a, $_);
|
||||||
|
if (substr($_, 3, 1) ne "-") {
|
||||||
|
my $code = substr($_, 0, 3);
|
||||||
|
Error("expected SVDRP code $expect, but received $code") if ($code != $expect);
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return @a;
|
||||||
|
}
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
299
PLUGINS/src/sky/lircd.conf.sky
Normal file
299
PLUGINS/src/sky/lircd.conf.sky
Normal file
@ -0,0 +1,299 @@
|
|||||||
|
# Copyright (C) 1999 Christoph Bartelmus
|
||||||
|
#
|
||||||
|
# You may only use this file if you make it available to others,
|
||||||
|
# i.e. if you send it to <lirc@bartelmus.de>
|
||||||
|
#
|
||||||
|
# this config file was automatically generated
|
||||||
|
# using lirc-0.6.4-CVS(serial) on Mon Jul 9 08:14:04 2001
|
||||||
|
#
|
||||||
|
# contributed by Steve Davies <steve@daviesfam.org>
|
||||||
|
#
|
||||||
|
# brand: sky
|
||||||
|
# model no. of remote control:
|
||||||
|
# supported devices: 34000 20
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
begin remote
|
||||||
|
|
||||||
|
name SKY
|
||||||
|
flags CONST_LENGTH|RAW_CODES
|
||||||
|
eps 30
|
||||||
|
aeps 100
|
||||||
|
ptrail 0
|
||||||
|
repeat 0 0
|
||||||
|
gap 149692
|
||||||
|
frequency 36000
|
||||||
|
duty_cycle 50
|
||||||
|
|
||||||
|
begin raw_codes
|
||||||
|
|
||||||
|
name 0
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444
|
||||||
|
|
||||||
|
name 1
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
888
|
||||||
|
|
||||||
|
name 2
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 888 888
|
||||||
|
444
|
||||||
|
|
||||||
|
name 3
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 888 444
|
||||||
|
444
|
||||||
|
|
||||||
|
name 4
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 888 888 444 444
|
||||||
|
444
|
||||||
|
|
||||||
|
name 5
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 888 888 888
|
||||||
|
|
||||||
|
name 6
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 888 444 444 888
|
||||||
|
444
|
||||||
|
|
||||||
|
name 7
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 888 444 444 444
|
||||||
|
444
|
||||||
|
|
||||||
|
name 8
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 888 888 444 444 444 444
|
||||||
|
444
|
||||||
|
|
||||||
|
name 9
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 888 888 444 444 888
|
||||||
|
|
||||||
|
name RED
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 888 444 444 888 888 444 444 888 888
|
||||||
|
|
||||||
|
name GREEN
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 888 444 444 888 888 444 444 444 444 888 444
|
||||||
|
|
||||||
|
name YELLOW
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 888 444 444 888 888 444 444 444 444 444 444
|
||||||
|
|
||||||
|
name BLUE
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 888 444 444 444 444 888 444 444 444 444 444 444
|
||||||
|
444
|
||||||
|
|
||||||
|
name TEXT
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 888 444 444 444 444 444 444 888 444 444
|
||||||
|
444
|
||||||
|
|
||||||
|
name BACKUP
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 888 888 444 444 444 444 444 444 444 444 888 444 444
|
||||||
|
|
||||||
|
name HELP
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 888 888 444 444 444 444 444 444 444 444 444 444 888
|
||||||
|
|
||||||
|
name CURSOR-LEFT
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 888 888 888 444 444 888 888 888 444
|
||||||
|
|
||||||
|
name CURSOR-DOWN
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 888 888 888 444 444 888 444 444 888
|
||||||
|
|
||||||
|
name CURSOR-RIGHT
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 888 888 888 444 444 888 888 444 444
|
||||||
|
|
||||||
|
name CURSOR-UP
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 888 888 888 444 444 888 444 444 444 444 444
|
||||||
|
|
||||||
|
name SELECT
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 888 888 888 444 444 444 444 888 444 444 444
|
||||||
|
|
||||||
|
name CHANNEL-DOWN
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 888 888 444 444 444 444 444 444 888
|
||||||
|
|
||||||
|
name CHANNEL-UP
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 888 888 444 444 444 444 444 444 444 444
|
||||||
|
444
|
||||||
|
|
||||||
|
name I
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 888 444 444 888 444 444 888 888 888 444 444
|
||||||
|
|
||||||
|
name ONOFF
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 888 444 444 888 444 444
|
||||||
|
444
|
||||||
|
|
||||||
|
name SKY
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 888 888 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444
|
||||||
|
|
||||||
|
name TV
|
||||||
|
2830 724 583 333 553 339
|
||||||
|
548 791 543 795 977 357
|
||||||
|
527 364 524 367 524 368
|
||||||
|
522 369 521 370 520 371
|
||||||
|
519 372 519 372 519 372
|
||||||
|
518 372 518 374 963 818
|
||||||
|
516 376 510 381 509 382
|
||||||
|
954 828 508 407 481
|
||||||
|
|
||||||
|
name SKY
|
||||||
|
2829 726 580 336 551 340
|
||||||
|
547 791 540 798 977 366
|
||||||
|
519 364 523 367 521 370
|
||||||
|
521 370 520 371 520 371
|
||||||
|
520 371 519 372 518 373
|
||||||
|
517 374 517 374 957 825
|
||||||
|
512 379 512 380 513 377
|
||||||
|
511 381 506 410 477 413
|
||||||
|
483
|
||||||
|
|
||||||
|
name MUTE
|
||||||
|
2567 429 751 447 743 456
|
||||||
|
1335 464 734 466 1325 496
|
||||||
|
697 504 693 506 1284 513
|
||||||
|
681 518 681 517 679 520
|
||||||
|
678 26288 2533 462 734 489
|
||||||
|
705 470 1323 501 695 503
|
||||||
|
1287 511 683 516 683 518
|
||||||
|
1277 522 676 521 678 521
|
||||||
|
675 523 675 26286 2533 465
|
||||||
|
731 491 702 499 1293 504
|
||||||
|
692 507 1280 518 683 516
|
||||||
|
679 524 1272 522 675 529
|
||||||
|
670 523 682 517 675 26286
|
||||||
|
2532 465 729 493 702 473
|
||||||
|
1318 506 688 509 1282 517
|
||||||
|
680 519 677 524 1274 523
|
||||||
|
676
|
||||||
|
|
||||||
|
name VOLUME-UP
|
||||||
|
2568 430 766 433 1342 456
|
||||||
|
734 489 708 466 1326 497
|
||||||
|
699 505 686 508 1286 512
|
||||||
|
688 510 683 516 682 516
|
||||||
|
681 26284 2540 481 711 488
|
||||||
|
1301 498 703 495 695 504
|
||||||
|
1284 516 682 516 684 515
|
||||||
|
1276 522 675 523 675 524
|
||||||
|
674 524 675 26286 2532 490
|
||||||
|
709 489 1300 500 689 509
|
||||||
|
695 517 1270 516 683 520
|
||||||
|
675 519 1274 529 668 525
|
||||||
|
675 524 673 526 672 26288
|
||||||
|
2532 466 731 491 1300 499
|
||||||
|
695 503 692 509 1277 520
|
||||||
|
681 518 679 519 1278 520
|
||||||
|
675
|
||||||
|
|
||||||
|
name VOLUME-DOWN
|
||||||
|
2562 434 1348 451 1332 465
|
||||||
|
733 489 704 496 1296 504
|
||||||
|
690 507 694 511 1281 511
|
||||||
|
683 523 677 515 679 520
|
||||||
|
680 25687 2533 464 1330 491
|
||||||
|
1295 505 693 506 689 510
|
||||||
|
1293 505 684 516 678 520
|
||||||
|
1276 523 677 520 675 524
|
||||||
|
673 526 674 25686 2531 467
|
||||||
|
1324 498 1292 506 691 509
|
||||||
|
683 515 1280 518 678 521
|
||||||
|
675 523 1273 525 674 527
|
||||||
|
672 525 673 527 671 25685
|
||||||
|
2531 467 1320 501 1288 511
|
||||||
|
687 511 688 512 1282 516
|
||||||
|
678 521 675 524 1273
|
||||||
|
|
||||||
|
name TVGUIDE
|
||||||
|
2834 720 586 330 554 338
|
||||||
|
548 794 539 796 975 360
|
||||||
|
528 363 521 371 519 371
|
||||||
|
520 371 519 375 514 374
|
||||||
|
517 374 516 375 513 379
|
||||||
|
511 380 510 381 949 387
|
||||||
|
500 836 505 387 945 391
|
||||||
|
493 868 469 422 468
|
||||||
|
|
||||||
|
name BOXOFFICE
|
||||||
|
2833 745 564 329 555 338
|
||||||
|
548 790 545 793 982 352
|
||||||
|
529 362 526 365 522 370
|
||||||
|
519 371 519 372 519 372
|
||||||
|
518 373 517 374 513 378
|
||||||
|
515 376 507 384 506 385
|
||||||
|
945 390 496 396 498 392
|
||||||
|
496 419 468 847 936
|
||||||
|
|
||||||
|
name SERVICES
|
||||||
|
2829 725 585 330 555 338
|
||||||
|
548 798 537 794 979 356
|
||||||
|
528 368 522 363 523 369
|
||||||
|
521 370 521 370 520 370
|
||||||
|
520 371 520 371 520 371
|
||||||
|
519 372 519 372 518 373
|
||||||
|
964 371 517 375 513 377
|
||||||
|
511 404 489 402 485 828
|
||||||
|
514
|
||||||
|
|
||||||
|
name INTERACTIVE
|
||||||
|
2829 726 591 324 553 340
|
||||||
|
550 788 542 796 981 354
|
||||||
|
532 359 522 369 522 369
|
||||||
|
520 372 518 373 518 373
|
||||||
|
516 375 515 375 513 379
|
||||||
|
515 375 510 381 948 389
|
||||||
|
498 392 504 412 470 867
|
||||||
|
916 866 913
|
||||||
|
|
||||||
|
end raw_codes
|
||||||
|
|
||||||
|
end remote
|
303
PLUGINS/src/sky/sky.c
Normal file
303
PLUGINS/src/sky/sky.c
Normal file
@ -0,0 +1,303 @@
|
|||||||
|
/*
|
||||||
|
* sky.c: A plugin for the Video Disk Recorder
|
||||||
|
*
|
||||||
|
* See the README file for copyright information and how to reach the author.
|
||||||
|
*
|
||||||
|
* $Id: sky.c 1.13 2006/03/26 09:21:10 kls Exp $
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/un.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <vdr/device.h>
|
||||||
|
#include <vdr/plugin.h>
|
||||||
|
#include <vdr/sources.h>
|
||||||
|
|
||||||
|
static const char *VERSION = "0.3.5";
|
||||||
|
static const char *DESCRIPTION = "Sky Digibox interface";
|
||||||
|
|
||||||
|
// --- cDigiboxDevice --------------------------------------------------------
|
||||||
|
|
||||||
|
#define DUMMYAPID 80
|
||||||
|
#define DUMMYVPID 160
|
||||||
|
|
||||||
|
class cSkyChannel : public cListObject {
|
||||||
|
public:
|
||||||
|
tChannelID channelID;
|
||||||
|
int digiboxChannelNumber;
|
||||||
|
bool Parse(const char *s);
|
||||||
|
};
|
||||||
|
|
||||||
|
bool cSkyChannel::Parse(const char *s)
|
||||||
|
{
|
||||||
|
char *id = NULL;
|
||||||
|
if (2 == sscanf(s, "%a[^:]:%d", &id, &digiboxChannelNumber))
|
||||||
|
channelID = tChannelID::FromString(id);
|
||||||
|
free(id);
|
||||||
|
return digiboxChannelNumber && channelID.Valid();
|
||||||
|
}
|
||||||
|
|
||||||
|
class cSkyChannels : public cConfig<cSkyChannel> {
|
||||||
|
public:
|
||||||
|
cSkyChannel *GetSkyChannel(const cChannel *Channel);
|
||||||
|
};
|
||||||
|
|
||||||
|
cSkyChannel *cSkyChannels::GetSkyChannel(const cChannel *Channel)
|
||||||
|
{
|
||||||
|
tChannelID ChannelID = Channel->GetChannelID();
|
||||||
|
for (cSkyChannel *sc = First(); sc; sc = Next(sc)) {
|
||||||
|
if (ChannelID == sc->channelID)
|
||||||
|
return sc;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
cSkyChannels SkyChannels;
|
||||||
|
|
||||||
|
class cDigiboxDevice : public cDevice {
|
||||||
|
private:
|
||||||
|
int source;
|
||||||
|
int digiboxChannelNumber;
|
||||||
|
int fd_dvr;
|
||||||
|
int apid, vpid;
|
||||||
|
cTSBuffer *tsBuffer;
|
||||||
|
int fd_lirc;
|
||||||
|
void LircSend(const char *s);
|
||||||
|
void LircSend(int n);
|
||||||
|
protected:
|
||||||
|
virtual bool SetPid(cPidHandle *Handle, int Type, bool On);
|
||||||
|
virtual bool OpenDvr(void);
|
||||||
|
virtual void CloseDvr(void);
|
||||||
|
virtual bool GetTSPacket(uchar *&Data);
|
||||||
|
public:
|
||||||
|
cDigiboxDevice(void);
|
||||||
|
virtual ~cDigiboxDevice();
|
||||||
|
virtual bool ProvidesSource(int Source) const;
|
||||||
|
virtual bool ProvidesTransponder(const cChannel *Channel) const;
|
||||||
|
virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsSetChannel = NULL) const;
|
||||||
|
virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
|
||||||
|
};
|
||||||
|
|
||||||
|
cDigiboxDevice::cDigiboxDevice(void)
|
||||||
|
{
|
||||||
|
source = cSource::FromString("S28.2E");//XXX parameter???
|
||||||
|
digiboxChannelNumber = 0;
|
||||||
|
fd_dvr = -1;
|
||||||
|
apid = vpid = 0;
|
||||||
|
struct sockaddr_un addr;
|
||||||
|
addr.sun_family = AF_UNIX;
|
||||||
|
strn0cpy(addr.sun_path, "/dev/lircd", sizeof(addr.sun_path));//XXX parameter???
|
||||||
|
fd_lirc = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||||
|
if (fd_lirc >= 0) {
|
||||||
|
if (connect(fd_lirc, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
|
||||||
|
LOG_ERROR;
|
||||||
|
close(fd_lirc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
LOG_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
cDigiboxDevice::~cDigiboxDevice()
|
||||||
|
{
|
||||||
|
if (fd_lirc >= 0)
|
||||||
|
close(fd_lirc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cDigiboxDevice::LircSend(const char *s)
|
||||||
|
{
|
||||||
|
char buf[100];
|
||||||
|
snprintf(buf, sizeof(buf), "SEND_ONCE SKY %s\n", s);
|
||||||
|
dsyslog(buf);//XXX
|
||||||
|
if (write(fd_lirc, buf, strlen(buf)) < 0)
|
||||||
|
LOG_ERROR;//XXX _STR
|
||||||
|
cCondWait::SleepMs(200);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cDigiboxDevice::LircSend(int n)
|
||||||
|
{
|
||||||
|
char buf[10];
|
||||||
|
snprintf(buf, sizeof(buf), "%d", n);
|
||||||
|
char *p = buf;
|
||||||
|
while (*p) {
|
||||||
|
char q[10];
|
||||||
|
sprintf(q, "%c", *p);
|
||||||
|
LircSend(q);
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cDigiboxDevice::SetPid(cPidHandle *Handle, int Type, bool On)
|
||||||
|
{
|
||||||
|
//dsyslog("SetPid %d %d", Handle->pid, On);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cDigiboxDevice::OpenDvr(void)
|
||||||
|
{
|
||||||
|
CloseDvr();
|
||||||
|
fd_dvr = open("/dev/video2", O_RDONLY | O_NONBLOCK);//XXX parameter???
|
||||||
|
if (fd_dvr >= 0)
|
||||||
|
tsBuffer = new cTSBuffer(fd_dvr, MEGABYTE(2), CardIndex() + 1);
|
||||||
|
return fd_dvr >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cDigiboxDevice::CloseDvr(void)
|
||||||
|
{
|
||||||
|
if (fd_dvr >= 0) {
|
||||||
|
close(fd_dvr);
|
||||||
|
fd_dvr = -1;
|
||||||
|
delete tsBuffer;
|
||||||
|
tsBuffer = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cDigiboxDevice::GetTSPacket(uchar *&Data)
|
||||||
|
{
|
||||||
|
if (tsBuffer) {
|
||||||
|
Data = tsBuffer->Get();
|
||||||
|
if (Data) {
|
||||||
|
// insert the actual PIDs:
|
||||||
|
int Pid = (((uint16_t)Data[1] & PID_MASK_HI) << 8) | Data[2];
|
||||||
|
if (Pid == DUMMYAPID)
|
||||||
|
Pid = apid;
|
||||||
|
else if (Pid == DUMMYVPID)
|
||||||
|
Pid = vpid;
|
||||||
|
Data[1] = ((Pid >> 8) & 0xFF) | (Data[1] & ~PID_MASK_HI);
|
||||||
|
Data[2] = Pid & 0xFF;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cDigiboxDevice::ProvidesSource(int Source) const
|
||||||
|
{
|
||||||
|
return source == Source;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cDigiboxDevice::ProvidesTransponder(const cChannel *Channel) const
|
||||||
|
{
|
||||||
|
return false; // can't provide any actual transponder
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cDigiboxDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) const
|
||||||
|
{
|
||||||
|
bool result = false;
|
||||||
|
bool hasPriority = Priority < 0 || Priority > this->Priority();
|
||||||
|
bool needsDetachReceivers = true;
|
||||||
|
|
||||||
|
cSkyChannel *SkyChannel = SkyChannels.GetSkyChannel(Channel);
|
||||||
|
if (SkyChannel) {
|
||||||
|
if (Receiving(true)) {
|
||||||
|
if (digiboxChannelNumber == SkyChannel->digiboxChannelNumber) {
|
||||||
|
needsDetachReceivers = false;
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
result = hasPriority;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
result = hasPriority;
|
||||||
|
}
|
||||||
|
if (NeedsDetachReceivers)
|
||||||
|
*NeedsDetachReceivers = needsDetachReceivers;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cDigiboxDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
|
||||||
|
{
|
||||||
|
if (fd_lirc >= 0 && !Receiving(true)) { // if we are receiving the channel is already set!
|
||||||
|
cSkyChannel *SkyChannel = SkyChannels.GetSkyChannel(Channel);
|
||||||
|
if (SkyChannel) {
|
||||||
|
digiboxChannelNumber = SkyChannel->digiboxChannelNumber;
|
||||||
|
apid = Channel->Apid(0);
|
||||||
|
vpid = Channel->Vpid();
|
||||||
|
//XXX only when recording??? -> faster channel switching!
|
||||||
|
LircSend("SKY"); // makes sure the Digibox is "on"
|
||||||
|
//XXX lircprint(fd_lirc, "BACKUP");
|
||||||
|
//XXX lircprint(fd_lirc, "BACKUP");
|
||||||
|
//XXX lircprint(fd_lirc, "BACKUP");
|
||||||
|
LircSend(digiboxChannelNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- cPluginSky ------------------------------------------------------------
|
||||||
|
|
||||||
|
class cPluginSky : public cPlugin {
|
||||||
|
private:
|
||||||
|
// Add any member variables or functions you may need here.
|
||||||
|
public:
|
||||||
|
cPluginSky(void);
|
||||||
|
virtual ~cPluginSky();
|
||||||
|
virtual const char *Version(void) { return VERSION; }
|
||||||
|
virtual const char *Description(void) { return DESCRIPTION; }
|
||||||
|
virtual const char *CommandLineHelp(void);
|
||||||
|
virtual bool ProcessArgs(int argc, char *argv[]);
|
||||||
|
virtual bool Initialize(void);
|
||||||
|
virtual void Housekeeping(void);
|
||||||
|
virtual cMenuSetupPage *SetupMenu(void);
|
||||||
|
virtual bool SetupParse(const char *Name, const char *Value);
|
||||||
|
};
|
||||||
|
|
||||||
|
cPluginSky::cPluginSky(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!
|
||||||
|
}
|
||||||
|
|
||||||
|
cPluginSky::~cPluginSky()
|
||||||
|
{
|
||||||
|
// Clean up after yourself!
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *cPluginSky::CommandLineHelp(void)
|
||||||
|
{
|
||||||
|
// Return a string that describes all known command line options.
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cPluginSky::ProcessArgs(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
// Implement command line argument processing here if applicable.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cPluginSky::Initialize(void)
|
||||||
|
{
|
||||||
|
// Initialize any background activities the plugin shall perform.
|
||||||
|
const char *ConfigDir = ConfigDirectory(Name());
|
||||||
|
if (ConfigDir) {
|
||||||
|
if (SkyChannels.Load(AddDirectory(ConfigDir, "channels.conf.sky"), true)) {
|
||||||
|
new cDigiboxDevice;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
esyslog("ERROR: can't get config directory");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cPluginSky::Housekeeping(void)
|
||||||
|
{
|
||||||
|
// Perform any cleanup or other regular tasks.
|
||||||
|
}
|
||||||
|
|
||||||
|
cMenuSetupPage *cPluginSky::SetupMenu(void)
|
||||||
|
{
|
||||||
|
// Return a setup menu in case the plugin supports one.
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cPluginSky::SetupParse(const char *Name, const char *Value)
|
||||||
|
{
|
||||||
|
// Parse your own setup parameters and store their values.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
VDRPLUGINCREATOR(cPluginSky); // Don't touch this!
|
@ -35,51 +35,3 @@ VDR Plugin 'status' Revision History
|
|||||||
2005-12-31: Version 0.2.0
|
2005-12-31: Version 0.2.0
|
||||||
|
|
||||||
- API change in cStatus.
|
- 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,89 +1,73 @@
|
|||||||
#
|
#
|
||||||
# Makefile for a Video Disk Recorder plugin
|
# Makefile for a Video Disk Recorder plugin
|
||||||
#
|
#
|
||||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
# $Id: Makefile 1.12 2006/04/24 17:21:04 kls Exp $
|
||||||
|
|
||||||
# The official name of this plugin.
|
# The official name of this plugin.
|
||||||
# This name will be used in the '-P...' option of VDR to load the 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.
|
# By default the main source file also carries this name.
|
||||||
|
#
|
||||||
PLUGIN = status
|
PLUGIN = status
|
||||||
|
|
||||||
### The version number of this plugin (taken from the main source file):
|
### 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')
|
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||||
|
|
||||||
|
### The C++ compiler and options:
|
||||||
|
|
||||||
|
CXX ?= g++
|
||||||
|
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual
|
||||||
|
|
||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
VDRDIR = ../../..
|
||||||
PKG_CONFIG ?= pkg-config
|
LIBDIR = ../../lib
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
TMPDIR = /tmp
|
||||||
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:
|
### Allow user defined options to overwrite defaults:
|
||||||
|
|
||||||
-include $(PLGCFG)
|
-include $(VDRDIR)/Make.config
|
||||||
|
|
||||||
|
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||||
|
|
||||||
|
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||||
|
|
||||||
### The name of the distribution archive:
|
### The name of the distribution archive:
|
||||||
|
|
||||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||||
PACKAGE = vdr-$(ARCHIVE)
|
PACKAGE = vdr-$(ARCHIVE)
|
||||||
|
|
||||||
### The name of the shared object file:
|
|
||||||
|
|
||||||
SOFILE = libvdr-$(PLUGIN).so
|
|
||||||
|
|
||||||
### Includes and Defines (add further entries here):
|
### Includes and Defines (add further entries here):
|
||||||
|
|
||||||
INCLUDES +=
|
INCLUDES += -I$(VDRDIR)/include
|
||||||
|
|
||||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||||
|
|
||||||
### The object files (add further files here):
|
### The object files (add further files here):
|
||||||
|
|
||||||
OBJS = $(PLUGIN).o
|
OBJS = $(PLUGIN).o
|
||||||
|
|
||||||
### The main target:
|
|
||||||
|
|
||||||
all: $(SOFILE)
|
|
||||||
|
|
||||||
### Implicit rules:
|
### Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
@echo CC $@
|
$(CXX) $(CXXFLAGS) -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) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
-include $(DEPFILE)
|
-include $(DEPFILE)
|
||||||
|
|
||||||
### Targets:
|
### Targets:
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
all: libvdr-$(PLUGIN).so
|
||||||
@echo LD $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
libvdr-$(PLUGIN).so: $(OBJS)
|
||||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||||
|
@cp $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||||
install: install-lib
|
|
||||||
|
|
||||||
dist: clean
|
dist: clean
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||||
|
@ -1,15 +1,11 @@
|
|||||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||||
|
|
||||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
Written by: Klaus Schmidinger <kls@cadsoft.de>
|
||||||
|
|
||||||
Project's homepage: https://www.tvdr.de
|
Project's homepage: www.cadsoft.de/people/kls/vdr
|
||||||
|
|
||||||
Latest version available at: https://www.tvdr.de
|
Latest version available at: www.cadsoft.de/people/kls/vdr/software.htm
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
See the file COPYING for license information.
|
||||||
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.
|
Description: This is an example that shows the use of cStatus.
|
||||||
|
@ -3,13 +3,13 @@
|
|||||||
*
|
*
|
||||||
* See the README file for copyright information and how to reach the author.
|
* 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 $
|
* $Id: status.c 1.8 2005/12/31 15:19:45 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <vdr/plugin.h>
|
#include <vdr/plugin.h>
|
||||||
#include <vdr/status.h>
|
#include <vdr/status.h>
|
||||||
|
|
||||||
static const char *VERSION = "2.6.1";
|
static const char *VERSION = "0.2.0";
|
||||||
static const char *DESCRIPTION = "Status monitor test";
|
static const char *DESCRIPTION = "Status monitor test";
|
||||||
static const char *MAINMENUENTRY = NULL;
|
static const char *MAINMENUENTRY = NULL;
|
||||||
|
|
||||||
@ -17,33 +17,23 @@ static const char *MAINMENUENTRY = NULL;
|
|||||||
|
|
||||||
class cStatusTest : public cStatus {
|
class cStatusTest : public cStatus {
|
||||||
protected:
|
protected:
|
||||||
virtual void TimerChange(const cTimer *Timer, eTimerChange Change);
|
virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber);
|
||||||
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 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 Replaying(const cControl *Control, const char *Name, const char *FileName, bool On);
|
||||||
virtual void SetVolume(int Volume, bool Absolute);
|
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 OsdClear(void);
|
||||||
virtual void OsdTitle(const char *Title);
|
virtual void OsdTitle(const char *Title);
|
||||||
virtual void OsdStatusMessage2(eMessageType Type, const char *Message);
|
virtual void OsdStatusMessage(const char *Message);
|
||||||
virtual void OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue);
|
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 OsdCurrentItem(const char *Text);
|
||||||
virtual void OsdCurrentItem2(const char *Text, int Index);
|
|
||||||
virtual void OsdTextItem(const char *Text, bool Scroll);
|
virtual void OsdTextItem(const char *Text, bool Scroll);
|
||||||
virtual void OsdChannel(const char *Text);
|
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);
|
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)
|
void cStatusTest::ChannelSwitch(const cDevice *Device, int ChannelNumber)
|
||||||
{
|
{
|
||||||
dsyslog("status: cStatusTest::TimerChange %s %d", Timer ? *Timer->ToText(true) : "-", Change);
|
dsyslog("status: cStatusTest::ChannelSwitch %d %d", Device->CardIndex(), ChannelNumber);
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
void cStatusTest::Recording(const cDevice *Device, const char *Name, const char *FileName, bool On)
|
||||||
@ -61,21 +51,6 @@ void cStatusTest::SetVolume(int Volume, bool Absolute)
|
|||||||
dsyslog("status: cStatusTest::SetVolume %d %d", Volume, 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)
|
void cStatusTest::OsdClear(void)
|
||||||
{
|
{
|
||||||
dsyslog("status: cStatusTest::OsdClear");
|
dsyslog("status: cStatusTest::OsdClear");
|
||||||
@ -86,9 +61,9 @@ void cStatusTest::OsdTitle(const char *Title)
|
|||||||
dsyslog("status: cStatusTest::OsdTitle '%s'", Title);
|
dsyslog("status: cStatusTest::OsdTitle '%s'", Title);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cStatusTest::OsdStatusMessage2(eMessageType Type, const char *Message)
|
void cStatusTest::OsdStatusMessage(const char *Message)
|
||||||
{
|
{
|
||||||
dsyslog("status: cStatusTest::OsdStatusMessage2 %d '%s'", Type, Message);
|
dsyslog("status: cStatusTest::OsdStatusMessage '%s'", Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cStatusTest::OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue)
|
void cStatusTest::OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue)
|
||||||
@ -96,14 +71,9 @@ void cStatusTest::OsdHelpKeys(const char *Red, const char *Green, const char *Ye
|
|||||||
dsyslog("status: cStatusTest::OsdHelpKeys %s - %s - %s - %s", Red, Green, Yellow, Blue);
|
dsyslog("status: cStatusTest::OsdHelpKeys %s - %s - %s - %s", Red, Green, Yellow, Blue);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cStatusTest::OsdItem2(const char *Text, int Index, bool Selected)
|
void cStatusTest::OsdCurrentItem(const char *Text)
|
||||||
{
|
{
|
||||||
dsyslog("status: cStatusTest::OsdItem2 %s %d %d", Text, Index, Selected);
|
dsyslog("status: cStatusTest::OsdCurrentItem %s", Text);
|
||||||
}
|
|
||||||
|
|
||||||
void cStatusTest::OsdCurrentItem2(const char *Text, int Index)
|
|
||||||
{
|
|
||||||
dsyslog("status: cStatusTest::OsdCurrentItem %s %d", Text, Index);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cStatusTest::OsdTextItem(const char *Text, bool Scroll)
|
void cStatusTest::OsdTextItem(const char *Text, bool Scroll)
|
||||||
|
@ -8,36 +8,3 @@ VDR Plugin 'svdrpdemo' Revision History
|
|||||||
2005-08-28: Version 0.0.2
|
2005-08-28: Version 0.0.2
|
||||||
|
|
||||||
- Removed unused MAINMENUENTRY.
|
- 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.
|
|
||||||
|
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